60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * CDDL HEADER START
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * The contents of this file are subject to the terms of the
688b07c52de0fc886cce2e0a28a42a43d2dad06agc * Common Development and Distribution License (the "License").
688b07c52de0fc886cce2e0a28a42a43d2dad06agc * You may not use this file except in compliance with the License.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * or http://www.opensolaris.org/os/licensing.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * See the License for the specific language governing permissions
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * and limitations under the License.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * When distributing Covered Code, include this CDDL HEADER in each
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * If applicable, add the following below this CDDL HEADER, with the
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * fields enclosed by brackets "[]" replaced with your own identifying
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * information: Portions Copyright [yyyy] [name of copyright owner]
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * CDDL HEADER END
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Use is subject to license terms.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * keyspanport pipe routines (mostly device-neutral)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz#include <sys/types.h>
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz#include <sys/param.h>
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz#include <sys/conf.h>
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz#include <sys/stream.h>
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz#include <sys/strsun.h>
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz#include <sys/termio.h>
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz#include <sys/ddi.h>
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz#include <sys/sunddi.h>
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz#include <sys/usb/usba.h>
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz#include <sys/usb/clients/usbser/usbser_keyspan/keyspan_var.h>
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz#include <sys/usb/clients/usbser/usbser_keyspan/keyspan_pipe.h>
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * initialize pipe structure with the given parameters
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzstatic void
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_init_one_pipe(keyspan_state_t *ksp, keyspan_port_t *kp,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_pipe_t *pipe)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_pipe_policy_t *policy;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_OPEN, ksp->ks_lh, "keyspan_init_one_pipe: "
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "pipe = %p, pipe_stat %x", (void *)pipe, pipe->pipe_state);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* init sync primitives */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_init(&pipe->pipe_mutex, NULL, MUTEX_DRIVER, (void *)NULL);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* init pipe policy */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz policy = &pipe->pipe_policy;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz policy->pp_max_async_reqs = 2;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz pipe->pipe_ksp = ksp;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (kp == NULL) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* globle pipes should have device log handle */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz pipe->pipe_lh = ksp->ks_lh;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* port pipes should have port log handle */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz pipe->pipe_lh = kp->kp_lh;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz pipe->pipe_state = KEYSPAN_PIPE_CLOSED;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzstatic void
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_fini_one_pipe(keyspan_pipe_t *pipe)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_OPEN, pipe->pipe_ksp->ks_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_fini_one_pipe: pipe_stat %x", pipe->pipe_state);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (pipe->pipe_state != KEYSPAN_PIPE_NOT_INIT) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_destroy(&pipe->pipe_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz pipe->pipe_state = KEYSPAN_PIPE_NOT_INIT;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Lookup the endpoints defined in the spec;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Allocate resources, initialize pipe structures.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * All are bulk pipes, including data in/out, cmd/status pipes.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzint
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_init_pipes(keyspan_state_t *ksp)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_client_dev_data_t *dev_data = ksp->ks_dev_data;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int ifc, alt, i, j, k = 0;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz uint8_t port_cnt = ksp->ks_dev_spec.port_cnt;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz uint8_t ep_addr, ep_cnt;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_ep_data_t *dataout[KEYSPAN_MAX_PORT_NUM],
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China *datain[KEYSPAN_MAX_PORT_NUM],
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China *status = NULL, *ctrl = NULL, *tmp_ep;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_alt_if_data_t *alt_data;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_if_data_t *if_data;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ifc = dev_data->dev_curr_if;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz alt = 0;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if_data = &dev_data->dev_curr_cfg->cfg_if[ifc];
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz alt_data = &if_data->if_alt[alt];
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * The actual EP number (indicated by bNumEndpoints) is more than
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * those defined in spec. We have to match those we need according
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * to EP addresses. And we'll lookup In EPs and Out EPs separately.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ep_cnt = (alt_data->altif_descr.bNumEndpoints + 1) / 2;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * get DIR_IN EP descriptors, and then match with EP addresses.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Different keyspan devices may has different EP addresses.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz for (i = 0; i < ep_cnt; i++) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz tmp_ep = usb_lookup_ep_data(ksp->ks_dip, dev_data, ifc, alt, i,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China USB_EP_ATTR_BULK, USB_EP_DIR_IN);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (tmp_ep == NULL) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L3(DPRINT_ATTACH, ksp->ks_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: can't find bulk in ep, i=%d,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "ep_cnt=%d", i, ep_cnt);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz continue;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ep_addr = tmp_ep->ep_descr.bEndpointAddress;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L3(DPRINT_ATTACH, ksp->ks_lh, "keyspan_init_pipes: "
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "ep_addr =%x, stat_ep_addr=%x, i=%d", ep_addr,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ksp->ks_dev_spec.stat_ep_addr, i);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* match the status EP */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (ep_addr == ksp->ks_dev_spec.stat_ep_addr) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz status = tmp_ep;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz continue;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* match the EPs of the ports */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz for (j = 0; j < port_cnt; j++) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L3(DPRINT_ATTACH, ksp->ks_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: try to match bulk in data ep,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " j=%d", j);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (ep_addr == ksp->ks_dev_spec.datain_ep_addr[j]) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz datain[j] = tmp_ep;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz k++;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L3(DPRINT_ATTACH, ksp->ks_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: matched a bulk in"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " data ep");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz break;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* if have matched all the necessary endpoints, break out */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (k >= port_cnt && status != NULL) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz break;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_ATTACH, ksp->ks_lh, "keyspan_init_pipes: "
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "try to match bulk in data ep, j=%d", j);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (j == port_cnt) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* this ep can't be matched by any addr */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_ATTACH, ksp->ks_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: can't match bulk in ep,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " addr =%x,", ep_addr);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (k != port_cnt || status == NULL) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* Some of the necessary IN endpoints are not matched */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L2(DPRINT_ATTACH, ksp->ks_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: matched %d data in endpoints,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " not enough", k);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (USB_FAILURE);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz k = 0;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * get DIR_OUT EP descriptors, and then match with ep addrs.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * different keyspan devices may has different ep addresses.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz for (i = 0; i < ep_cnt; i++) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz tmp_ep = usb_lookup_ep_data(ksp->ks_dip, dev_data, ifc, alt, i,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China USB_EP_ATTR_BULK, USB_EP_DIR_OUT);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (tmp_ep == NULL) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L3(DPRINT_ATTACH, ksp->ks_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: can't find bulk out ep, i=%d,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "ep_cnt=%d", i, ep_cnt);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz continue;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ep_addr = tmp_ep->ep_descr.bEndpointAddress;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* match the status ep */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (ep_addr == ksp->ks_dev_spec.ctrl_ep_addr) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ctrl = tmp_ep;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz continue;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* match the ep of the ports */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz for (j = 0; j < port_cnt; j++) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (ep_addr == ksp->ks_dev_spec.dataout_ep_addr[j]) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz dataout[j] = tmp_ep;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz k++;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz break;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* if have matched all the necessary endpoints, break out */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (k >= port_cnt && ctrl != NULL) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz break;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (j == port_cnt) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* this ep can't be matched by any addr */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_ATTACH, ksp->ks_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: can't match bulk out ep,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " ep_addr =%x", ep_addr);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (k != port_cnt || ctrl == NULL) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* Not all the necessary OUT endpoints are matched */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L2(DPRINT_ATTACH, ksp->ks_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: matched %d data in endpoints,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " not enough", k);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (USB_FAILURE);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_enter(&ksp->ks_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Device globle pipes: a bulk in pipe for status and a bulk out
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe for controle cmd.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ksp->ks_statin_pipe.pipe_ep_descr = status->ep_descr;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_init_one_pipe(ksp, NULL, &ksp->ks_statin_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ksp->ks_ctrlout_pipe.pipe_ep_descr = ctrl->ep_descr;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_init_one_pipe(ksp, NULL, &ksp->ks_ctrlout_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* for data in/out pipes of each port */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz for (i = 0; i < port_cnt; i++) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ksp->ks_ports[i].kp_datain_pipe.pipe_ep_descr =
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz datain[i]->ep_descr;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_init_one_pipe(ksp, &ksp->ks_ports[i],
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz &ksp->ks_ports[i].kp_datain_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ksp->ks_ports[i].kp_dataout_pipe.pipe_ep_descr =
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz dataout[i]->ep_descr;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_init_one_pipe(ksp, &ksp->ks_ports[i],
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz &ksp->ks_ports[i].kp_dataout_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_exit(&ksp->ks_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (USB_SUCCESS);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * For USA_49WG only.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Lookup the endpoints defined in the spec.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Allocate resources, initialize pipe structures.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * There are 6 EPs, 3 bulk out Eps, 1 bulk in EP, 1 intr in EP, 1 intr out EP
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgint
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_init_pipes_usa49wg(keyspan_state_t *ksp)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_client_dev_data_t *dev_data = ksp->ks_dev_data;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int ifc, alt, i, j = 0;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg uint8_t port_cnt = ksp->ks_dev_spec.port_cnt;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg uint8_t ep_addr;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_ep_data_t *dataout[KEYSPAN_MAX_PORT_NUM],
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China *datain[KEYSPAN_MAX_PORT_NUM],
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China *status = NULL, *tmp_ep;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ifc = dev_data->dev_curr_if;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg alt = 0;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * get intr out EP descriptor as port0 data out EP, and then
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * match with EP address.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Different keyspan devices may has different EP addresses.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg tmp_ep = usb_lookup_ep_data(ksp->ks_dip, dev_data, ifc, alt, 0,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China USB_EP_ATTR_INTR, USB_EP_DIR_OUT);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (tmp_ep == NULL) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L3(DPRINT_ATTACH, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_init_pipes: can't find port1 data out ep");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (USB_FAILURE);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ep_addr = tmp_ep->ep_descr.bEndpointAddress;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* match the port0 data out EP */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (ep_addr == ksp->ks_dev_spec.dataout_ep_addr[0]) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg dataout[0] = tmp_ep;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * get bulk out EP descriptors as other port data out EPs, and then
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * match with EP addresses.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg for (j = 1; j < port_cnt; j++) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg tmp_ep = usb_lookup_ep_data(ksp->ks_dip, dev_data, ifc, alt,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China j-1, USB_EP_ATTR_BULK, USB_EP_DIR_OUT);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (tmp_ep == NULL) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L3(DPRINT_ATTACH, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_init_pipes: can't find port[%d] "
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "data out ep",
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China j);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (USB_FAILURE);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ep_addr = tmp_ep->ep_descr.bEndpointAddress;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* match other port data out EPs */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (ep_addr == ksp->ks_dev_spec.dataout_ep_addr[j]) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg dataout[j] = tmp_ep;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * get intr in EP descriptor as status EP, and then match with EP addrs
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg tmp_ep = usb_lookup_ep_data(ksp->ks_dip, dev_data, ifc, alt, 0,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China USB_EP_ATTR_INTR, USB_EP_DIR_IN);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (tmp_ep == NULL) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L3(DPRINT_ATTACH, ksp->ks_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_init_pipes: can't find status in ep");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (USB_FAILURE);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ep_addr = tmp_ep->ep_descr.bEndpointAddress;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* match the status ep */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (ep_addr == ksp->ks_dev_spec.stat_ep_addr) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg status = tmp_ep;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * get bulk in EP descriptors as data in EP, All the ports share one
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * data in EP.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg tmp_ep = usb_lookup_ep_data(ksp->ks_dip, dev_data, ifc, alt, 0,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China USB_EP_ATTR_BULK, USB_EP_DIR_IN);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (tmp_ep == NULL) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L3(DPRINT_ATTACH, ksp->ks_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_init_pipes: can't find bulk in ep");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (USB_FAILURE);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ep_addr = tmp_ep->ep_descr.bEndpointAddress;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* match data in EPs */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (ep_addr == ksp->ks_dev_spec.datain_ep_addr[0]) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg datain[0] = tmp_ep;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&ksp->ks_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* intr in pipe for status */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ksp->ks_statin_pipe.pipe_ep_descr = status->ep_descr;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_init_one_pipe(ksp, NULL, &ksp->ks_statin_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* for data in/out pipes of each port */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg for (i = 0; i < port_cnt; i++) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ksp->ks_ports[i].kp_datain_pipe.pipe_ep_descr =
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China datain[0]->ep_descr;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_init_one_pipe(ksp, &ksp->ks_ports[i],
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China &ksp->ks_ports[i].kp_datain_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ksp->ks_ports[i].kp_dataout_pipe.pipe_ep_descr =
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg dataout[i]->ep_descr;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_init_one_pipe(ksp, &ksp->ks_ports[i],
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China &ksp->ks_ports[i].kp_dataout_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&ksp->ks_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (USB_SUCCESS);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzvoid
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_fini_pipes(keyspan_state_t *ksp)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_port_t *kp;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int i;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz for (i = 0; i < ksp->ks_dev_spec.port_cnt; i++) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp = &ksp->ks_ports[i];
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_fini_one_pipe(&kp->kp_datain_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_fini_one_pipe(&kp->kp_dataout_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* fini status pipe */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_fini_one_pipe(&ksp->ks_statin_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * fini control pipe
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * If USA_49WG, don't need fini control pipe
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg switch (ksp->ks_dev_spec.id_product) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA19HS_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WLC_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_fini_one_pipe(&ksp->ks_ctrlout_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WG_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg default:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_CTLOP, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_fini_pipes: the device's product id"
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "can't be recognized");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzstatic int
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_open_one_pipe(keyspan_state_t *ksp, keyspan_pipe_t *pipe)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int rval;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* don't open for the second time */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_enter(&pipe->pipe_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ASSERT(pipe->pipe_state != KEYSPAN_PIPE_NOT_INIT);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (pipe->pipe_state != KEYSPAN_PIPE_CLOSED) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_exit(&pipe->pipe_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (USB_SUCCESS);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_exit(&pipe->pipe_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz rval = usb_pipe_open(ksp->ks_dip, &pipe->pipe_ep_descr,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz &pipe->pipe_policy, USB_FLAGS_SLEEP, &pipe->pipe_handle);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (rval == USB_SUCCESS) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_enter(&pipe->pipe_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz pipe->pipe_state = KEYSPAN_PIPE_OPEN;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_exit(&pipe->pipe_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Open shared datain pipe for USA_49WG
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgstatic int
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_open_pipe_datain_usa49wg(keyspan_state_t *ksp, keyspan_pipe_t *pipe)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int rval = USB_SUCCESS;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* don't open for the second time */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&pipe->pipe_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ASSERT(pipe->pipe_state != KEYSPAN_PIPE_NOT_INIT);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (pipe->pipe_state != KEYSPAN_PIPE_CLOSED) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&pipe->pipe_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (USB_SUCCESS);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&pipe->pipe_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&ksp->ks_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ksp->ks_datain_open_cnt++;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (ksp->ks_datain_open_cnt == 1) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&ksp->ks_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if ((rval = (usb_pipe_open(ksp->ks_dip, &pipe->pipe_ep_descr,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China &pipe->pipe_policy, USB_FLAGS_SLEEP,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China &pipe->pipe_handle))) == USB_SUCCESS) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&pipe->pipe_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg pipe->pipe_state = KEYSPAN_PIPE_OPEN;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&pipe->pipe_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&ksp->ks_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ksp->ks_datain_pipe_handle = pipe->pipe_handle;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&ksp->ks_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&ksp->ks_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ksp->ks_datain_open_cnt--;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&ksp->ks_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (rval);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* data in pipe has been opened by other port */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ASSERT(ksp->ks_datain_pipe_handle != NULL);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&pipe->pipe_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg pipe->pipe_handle = ksp->ks_datain_pipe_handle;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* Set datain pipe state */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg pipe->pipe_state = KEYSPAN_PIPE_OPEN;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&pipe->pipe_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&ksp->ks_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (USB_SUCCESS);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * close one pipe if open
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzstatic void
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_close_one_pipe(keyspan_pipe_t *pipe)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe may already be closed, e.g. if device has been physically
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * disconnected and the driver immediately detached
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (pipe->pipe_handle != NULL) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_pipe_close(pipe->pipe_ksp->ks_dip, pipe->pipe_handle,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China USB_FLAGS_SLEEP, NULL, NULL);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_enter(&pipe->pipe_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz pipe->pipe_handle = NULL;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz pipe->pipe_state = KEYSPAN_PIPE_CLOSED;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_exit(&pipe->pipe_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * close shared datain pipe if open for USA_49WG
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgstatic void
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_close_pipe_datain_usa49wg(keyspan_pipe_t *pipe)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_state_t *ksp = pipe->pipe_ksp;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * pipe may already be closed, e.g. if device has been physically
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * disconnected and the driver immediately detached
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (pipe->pipe_handle != NULL) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&ksp->ks_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ksp->ks_datain_open_cnt--;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (!ksp->ks_datain_open_cnt) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&ksp->ks_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_pipe_close(pipe->pipe_ksp->ks_dip,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China pipe->pipe_handle, USB_FLAGS_SLEEP,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China NULL, NULL);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&ksp->ks_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&pipe->pipe_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg pipe->pipe_handle = NULL;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg pipe->pipe_state = KEYSPAN_PIPE_CLOSED;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&pipe->pipe_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * For USA19HS and USA49WLC:
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Open global pipes, a status pipe and a control pipe
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzint
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_open_dev_pipes_usa49(keyspan_state_t *ksp)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int rval;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L4(DPRINT_OPEN, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_open_dev_pipes_usa49");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz rval = keyspan_open_one_pipe(ksp, &ksp->ks_ctrlout_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (rval != USB_SUCCESS) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L2(DPRINT_OPEN, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_open_dev_pipes_usa49: open ctrl pipe failed %d",
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz rval = keyspan_open_one_pipe(ksp, &ksp->ks_statin_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (rval != USB_SUCCESS) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L2(DPRINT_OPEN, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_open_dev_pipes_usa49: open status pipe failed %d",
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* close the first opened pipe here */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_close_one_pipe(&ksp->ks_ctrlout_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* start receive device status */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz rval = keyspan_receive_status(ksp);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (rval != USB_SUCCESS) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L2(DPRINT_OPEN, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_open_dev_pipes_usa49: receive device status"
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg " failed %d", rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* close opened pipes here */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_close_one_pipe(&ksp->ks_statin_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_close_one_pipe(&ksp->ks_ctrlout_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * For keyspan USA_49WG:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Open global pipes, a status pipe
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Use default control pipe, don't need to open it.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgint
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_open_dev_pipes_usa49wg(keyspan_state_t *ksp)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int rval;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* Open status pipe */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg rval = keyspan_open_one_pipe(ksp, &ksp->ks_statin_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (rval != USB_SUCCESS) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_OPEN, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_open_dev_pipes_usa49wg: "
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "open status pipe failed %d",
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China rval);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (rval);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* start device polling */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_pipe_start_polling(&ksp->ks_statin_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (rval);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Open global pipes, status pipe and control pipe,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgint
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_open_dev_pipes(keyspan_state_t *ksp)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int rval = USB_SUCCESS;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L4(DPRINT_OPEN, ksp->ks_lh, "keyspan_open_dev_pipes");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg switch (ksp->ks_dev_spec.id_product) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA19HS_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WLC_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg rval = keyspan_open_dev_pipes_usa49(ksp);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WG_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg rval = keyspan_open_dev_pipes_usa49wg(ksp);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg default:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_OPEN, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_open_dev_pipes: the device's product id can't"
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "be recognized");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (USB_FAILURE);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (rval);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Reopen all pipes if the port had them open
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzint
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_reopen_pipes(keyspan_state_t *ksp)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_port_t *kp;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int i;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_OPEN, ksp->ks_lh, "keyspan_reopen_pipes");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (keyspan_open_dev_pipes(ksp) != USB_SUCCESS) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (USB_FAILURE);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz for (i = 0; i < ksp->ks_dev_spec.port_cnt; i++) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp = &ksp->ks_ports[i];
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_enter(&kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (kp->kp_state == KEYSPAN_PORT_OPEN) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_OPEN, ksp->ks_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_reopen_pipes() reopen pipe #%d", i);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_exit(&kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (keyspan_open_port_pipes(kp) != USB_SUCCESS) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (USB_FAILURE);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_enter(&kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_no_more_reads = B_FALSE;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_exit(&kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (USB_SUCCESS);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzvoid
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_close_port_pipes(keyspan_port_t *kp)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_state_t *ksp = kp->kp_ksp;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_CLOSE, kp->kp_lh, "keyspan_close_port_pipes");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg switch (ksp->ks_dev_spec.id_product) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA19HS_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WLC_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_close_one_pipe(&kp->kp_datain_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WG_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_close_pipe_datain_usa49wg(&kp->kp_datain_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg default:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_CLOSE, kp->kp_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_close_port_pipes:"
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "the device's product id can't be recognized");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_close_one_pipe(&kp->kp_dataout_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Close IN and OUT bulk pipes of all ports
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzvoid
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_close_open_pipes(keyspan_state_t *ksp)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_port_t *kp;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int i;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int port_num = -1;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_CLOSE, ksp->ks_lh, "keyspan_close_open_pipes");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg switch (ksp->ks_dev_spec.id_product) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA19HS_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WLC_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg for (i = 0; i < ksp->ks_dev_spec.port_cnt; i++) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg kp = &ksp->ks_ports[i];
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (kp->kp_state == KEYSPAN_PORT_OPEN) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg kp->kp_no_more_reads = B_TRUE;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_pipe_reset(ksp->ks_dip,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China kp->kp_datain_pipe.pipe_handle,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China USB_FLAGS_SLEEP, NULL, NULL);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_close_port_pipes(kp);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WG_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg for (i = 0; i < ksp->ks_dev_spec.port_cnt; i++) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg kp = &ksp->ks_ports[i];
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (kp->kp_state == KEYSPAN_PORT_OPEN) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg kp->kp_no_more_reads = B_TRUE;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg port_num = i;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_exit(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (port_num >= 0) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg kp = &ksp->ks_ports[port_num];
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_pipe_reset(ksp->ks_dip,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China kp->kp_datain_pipe.pipe_handle,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China USB_FLAGS_SLEEP, NULL, NULL);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg for (i = 0; i < ksp->ks_dev_spec.port_cnt; i++) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg kp = &ksp->ks_ports[i];
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (kp->kp_state == KEYSPAN_PORT_OPEN) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_close_port_pipes(kp);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg default:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_CLOSE, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_close_open_pipes:"
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "the device's product id can't be recognized");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Close global pipes
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzvoid
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_close_dev_pipes(keyspan_state_t *ksp)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_CLOSE, ksp->ks_lh, "keyspan_close_dev_pipes");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg switch (ksp->ks_dev_spec.id_product) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA19HS_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WLC_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_close_one_pipe(&ksp->ks_statin_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_close_one_pipe(&ksp->ks_ctrlout_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WG_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * USA_49WG use default control pipe, don't need close it
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Stop polling before close status in pipe
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_pipe_stop_intr_polling(ksp->ks_statin_pipe.pipe_handle,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China USB_FLAGS_SLEEP);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_close_one_pipe(&ksp->ks_statin_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg default:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_CLOSE, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_close_dev_pipes:"
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "the device's product id can't be recognized");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Open bulk data IN and data OUT pipes for one port.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * The status and control pipes are opened in attach because they are global.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzint
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_open_port_pipes(keyspan_port_t *kp)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_state_t *ksp = kp->kp_ksp;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int rval;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_OPEN, kp->kp_lh, "keyspan_open_port_pipes");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg switch (ksp->ks_dev_spec.id_product) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA19HS_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WLC_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg rval = keyspan_open_one_pipe(ksp, &kp->kp_datain_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WG_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg rval = keyspan_open_pipe_datain_usa49wg(ksp,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China &kp->kp_datain_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg default:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_OPEN, kp->kp_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_open_port_pipes:"
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "the device's product id can't be recognized");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (rval != USB_SUCCESS) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz goto fail;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz rval = keyspan_open_one_pipe(ksp, &kp->kp_dataout_pipe);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (rval != USB_SUCCESS) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz goto fail;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzfail:
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L2(DPRINT_OPEN, kp->kp_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_open_port_pipes: failed %d", rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_close_port_pipes(kp);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzvoid
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_close_pipes(keyspan_state_t *ksp)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_OPEN, ksp->ks_lh, "keyspan_close_pipes");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* close all ports' pipes first, and then device ctrl/status pipes. */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_close_open_pipes(ksp);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_close_dev_pipes(ksp);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * bulk out common callback
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzvoid
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_bulkout_cb(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_port_t *kp = (keyspan_port_t *)req->bulk_client_private;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_pipe_t *bulkout = &kp->kp_dataout_pipe;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mblk_t *data = req->bulk_data;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int data_len;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz data_len = (data) ? MBLKL(data) : 0;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_OUT_PIPE, bulkout->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_bulkout_cb: len=%d cr=%d cb_flags=%x",
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz data_len, req->bulk_completion_reason, req->bulk_cb_flags);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
688b07c52de0fc886cce2e0a28a42a43d2dad06agc if (req->bulk_completion_reason && data) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Data wasn't transfered successfully.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Put data back on the queue.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_put_head(&kp->kp_tx_mp, data, kp);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* don't release mem in usb_free_bulk_req */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz req->bulk_data = NULL;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_free_bulk_req(req);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* if more data available, kick off another transmit */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_enter(&kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (kp->kp_tx_mp == NULL) {
688b07c52de0fc886cce2e0a28a42a43d2dad06agc /*
688b07c52de0fc886cce2e0a28a42a43d2dad06agc * Attach a zero packet if data length is muliple of 64,
688b07c52de0fc886cce2e0a28a42a43d2dad06agc * due to the specification of keyspan_usa19hs.
688b07c52de0fc886cce2e0a28a42a43d2dad06agc */
688b07c52de0fc886cce2e0a28a42a43d2dad06agc if ((kp->kp_ksp->ks_dev_spec.id_product ==
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China KEYSPAN_USA19HS_PID) && (data_len == 64)) {
688b07c52de0fc886cce2e0a28a42a43d2dad06agc kp->kp_tx_mp = allocb(0, BPRI_LO);
688b07c52de0fc886cce2e0a28a42a43d2dad06agc if (kp->kp_tx_mp) {
688b07c52de0fc886cce2e0a28a42a43d2dad06agc keyspan_tx_start(kp, NULL);
688b07c52de0fc886cce2e0a28a42a43d2dad06agc mutex_exit(&kp->kp_mutex);
688b07c52de0fc886cce2e0a28a42a43d2dad06agc
688b07c52de0fc886cce2e0a28a42a43d2dad06agc return;
688b07c52de0fc886cce2e0a28a42a43d2dad06agc }
688b07c52de0fc886cce2e0a28a42a43d2dad06agc }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* no more data, notify waiters */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg cv_broadcast(&kp->kp_tx_cv);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* tx callback for this port */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg kp->kp_cb.cb_tx(kp->kp_cb.cb_arg);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_tx_start(kp, NULL);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * intr out common callback for USA_49WG port0 only
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*ARGSUSED*/
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgvoid
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_introut_cb_usa49wg(usb_pipe_handle_t pipe, usb_intr_req_t *req)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_port_t *kp = (keyspan_port_t *)req->intr_client_private;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_pipe_t *introut = &kp->kp_dataout_pipe;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mblk_t *data = req->intr_data;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int data_len;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data_len = (data) ? MBLKL(data) : 0;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L4(DPRINT_OUT_PIPE, introut->pipe_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_introut_cb_usa49wg: len=%d cr=%d cb_flags=%x",
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data_len, req->intr_completion_reason, req->intr_cb_flags);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (req->intr_completion_reason && (data_len > 0)) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Data wasn't transfered successfully.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Put data back on the queue.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_put_head(&kp->kp_tx_mp, data, kp);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* don't release mem in usb_free_bulk_req */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg req->intr_data = NULL;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_free_intr_req(req);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* if more data available, kick off another transmit */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (kp->kp_tx_mp == NULL) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
688b07c52de0fc886cce2e0a28a42a43d2dad06agc /* no more data, notify waiters */
688b07c52de0fc886cce2e0a28a42a43d2dad06agc cv_broadcast(&kp->kp_tx_cv);
688b07c52de0fc886cce2e0a28a42a43d2dad06agc mutex_exit(&kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
688b07c52de0fc886cce2e0a28a42a43d2dad06agc /* tx callback for this port */
688b07c52de0fc886cce2e0a28a42a43d2dad06agc kp->kp_cb.cb_tx(kp->kp_cb.cb_arg);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_tx_start(kp, NULL);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_exit(&kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz/* For incoming data only. Parse a status byte and return the err code */
c138f478d2bc94e73ab8f6a084e323bec25e62f5yzvoid
c138f478d2bc94e73ab8f6a084e323bec25e62f5yzkeyspan_parse_status(uchar_t *status, uchar_t *err)
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz{
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz if (*status & RXERROR_BREAK) {
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz /*
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz * Parity and Framing errors only count if they
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz * occur exclusive of a break being received.
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz */
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz *status &= (uint8_t)(RXERROR_OVERRUN | RXERROR_BREAK);
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz }
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz *err |= (*status & RXERROR_OVERRUN) ? DS_OVERRUN_ERR : 0;
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz *err |= (*status & RXERROR_PARITY) ? DS_PARITY_ERR : 0;
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz *err |= (*status & RXERROR_FRAMING) ? DS_FRAMING_ERR : 0;
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz *err |= (*status & RXERROR_BREAK) ? DS_BREAK_ERR : 0;
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz}
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/* Bulk in data process function, used by all models */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgint
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_bulkin_cb_process(keyspan_port_t *kp,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg uint8_t data_len, uchar_t status, mblk_t *data)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg uchar_t err = 0;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mblk_t *mp;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * According to Keyspan spec, if 0x80 bit is clear, there is
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * only one status byte at the head of the data buf; if 0x80 bit
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * set, then data buf contains alternate status and data bytes;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * In the first case, only OVERRUN err can exist; In the second
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * case, there are four kinds of err bits may appear in status.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* if 0x80 bit AND overrun bit are clear, just send up data */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (!(status & 0x80) && !(status & RXERROR_OVERRUN)) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* Get rid of the first status byte */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data->b_rptr++;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data_len--;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else if (!(status & 0x80)) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* If 0x80 bit is clear and overrun bit is set */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_parse_status(&status, &err);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if ((mp = allocb(2, BPRI_HI)) == NULL) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_IN_PIPE, kp->kp_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_bulkin_cb_process: allocb failed");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (0);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg DB_TYPE(mp) = M_BREAK;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg *mp->b_wptr++ = err;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg *mp->b_wptr++ = status;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* Add to the received list; Send up the err code. */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_put_tail(&kp->kp_rx_mp, mp);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Don't send up the first byte because
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * it is a status byte.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data->b_rptr++;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data_len--;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else { /* 0x80 bit set, there are some errs in the data */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Usually, there are at least two bytes,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * one status and one data.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (data_len > 1) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int i = 0;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int j = 1;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * In this case, there might be multi status
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * bytes. Parse each status byte and move the
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * data bytes together.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg for (j = 1; j < data_len; j += 2) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg status = data->b_rptr[j-1];
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_parse_status(&status, &err);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* move the data togeter */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data->b_rptr[i] = data->b_rptr[j];
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg i++;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data->b_wptr = data->b_rptr + i;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else { /* There are only one byte in incoming buf */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_parse_status(&status, &err);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if ((mp = allocb(2, BPRI_HI)) == NULL) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_IN_PIPE, kp->kp_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_bulkin_cb_process: allocb failed");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (0);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg DB_TYPE(mp) = M_BREAK;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg *mp->b_wptr++ = err;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (data_len > 2) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * There are multiple status bytes in this case.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Use err as status character since err is got
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * by or in all status bytes.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg *mp->b_wptr++ = err;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg *mp->b_wptr++ = status;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* Add to the received list; Send up the err code. */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_put_tail(&kp->kp_rx_mp, mp);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (data_len > 1) {
d29f5a711240f866521445b1656d114da090335ezhigang lu - Sun Microsystems - Beijing China data_len = MBLKL(data);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (data_len);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe callbacks
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * --------------
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * bulk in common callback for USA19HS and USA49WLC model
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzint
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_bulkin_cb_usa49(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_port_t *kp = (keyspan_port_t *)req->bulk_client_private;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_pipe_t *bulkin = &kp->kp_datain_pipe;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mblk_t *data = req->bulk_data;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz uint_t cr = req->bulk_completion_reason;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int data_len;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ASSERT(mutex_owned(&kp->kp_mutex));
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz data_len = (data) ? MBLKL(data) : 0;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_IN_PIPE, bulkin->pipe_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_bulkin_cb_usa49: len=%d"
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg " cr=%d flags=%x", data_len, cr, req->bulk_cb_flags);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* put data on the read queue */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if ((data_len > 0) && (kp->kp_state != KEYSPAN_PORT_CLOSED) &&
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz (cr == USB_CR_OK)) {
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz uchar_t status = data->b_rptr[0];
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if ((data_len = keyspan_bulkin_cb_process(kp, data_len,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China status, data)) > 0) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_put_tail(&kp->kp_rx_mp, data);
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * the data will not be freed and
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * will be sent up later.
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg req->bulk_data = NULL;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* usb error happened, so don't send up data */
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz data_len = 0;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_IN_PIPE, bulkin->pipe_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_bulkin_cb_usa49: port_state=%d"
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg " b_rptr[0]=%c", kp->kp_state, data->b_rptr[0]);
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz }
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz if (kp->kp_state != KEYSPAN_PORT_OPEN) {
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz kp->kp_no_more_reads = B_TRUE;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (data_len);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe callbacks
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * --------------
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * bulk in common callback for USA_49WG model
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgvoid
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_bulkin_cb_usa49wg(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_port_t *kp = (keyspan_port_t *)req->bulk_client_private,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China *kp_true;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_state_t *ksp = (keyspan_state_t *)kp->kp_ksp;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mblk_t *data = req->bulk_data,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China *mp_data;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg uint_t cr = req->bulk_completion_reason,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China port_data_len;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int data_len, copy_len;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg uint8_t port_num,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China port_cnt = 0,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China port[4],
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China receive_flag = 1;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg uint16_t status;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg unsigned char *old_rptr;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz data_len = (data) ? MBLKL(data) : 0;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_IN_PIPE, ksp->ks_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_bulkin_cb_usa49wg: len=%d"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " cr=%d flags=%x", data_len, cr, req->bulk_cb_flags);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* put data on the read queue */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if ((data_len > 0) && (cr == USB_CR_OK)) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg old_rptr = data->b_rptr;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg while (data->b_rptr < data->b_wptr) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg port_num = data->b_rptr[0];
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg port_data_len = data->b_rptr[1];
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg status = data->b_rptr[2];
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data->b_rptr += 2;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (port_num > 3) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_IN_PIPE, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_bulkin_cb_usa49wg,port num is not"
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China " correct: port=%d, len=%d, status=%x",
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China port_num, port_data_len, status);
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg kp_true = &ksp->ks_ports[port_num];
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg port[++port_cnt] = port_num;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&kp_true->kp_mutex);
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (kp_true->kp_state != KEYSPAN_PORT_OPEN) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp_true->kp_mutex);
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_IN_PIPE, kp_true->kp_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_bulkin_cb_usa49wg, "
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "port isn't opened");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data->b_rptr += port_data_len;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg port_cnt--;
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg continue;
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_IN_PIPE, kp_true->kp_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_bulkin_cb_usa49wg: status=0x%x, len=%d",
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg status, port_data_len);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if ((copy_len = keyspan_bulkin_cb_process(kp_true,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China port_data_len, status, data)) > 0) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp_true->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if ((mp_data = allocb(copy_len, BPRI_HI))
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China == NULL) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_IN_PIPE,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China kp_true->kp_lh, "keyspan_bulkin_cb_"
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "usa49wg: allocb failed");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&kp_true->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg DB_TYPE(mp_data) = M_DATA;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg bcopy(data->b_rptr, mp_data->b_wptr, copy_len);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mp_data->b_wptr += copy_len;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (copy_len < port_data_len -1) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * data has multi status bytes, b_wptr
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * has changed by
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * keyspan_bulkin_process(), need to
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * be recovered to old one
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data->b_rptr += port_data_len;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data->b_wptr = old_rptr + data_len;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data->b_rptr += copy_len;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_put_tail(&kp_true->kp_rx_mp, mp_data);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp_true->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp_true->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } /* End of while loop */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg while (port_cnt) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg port_num = port[port_cnt--];
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg kp_true = &ksp->ks_ports[port_num];
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&kp_true->kp_mutex);
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (kp_true->kp_state != KEYSPAN_PORT_OPEN) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg kp_true->kp_no_more_reads = B_TRUE;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (receive_flag && (!kp_true->kp_no_more_reads)) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp_true->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* kick off another read */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg (void) keyspan_receive_data(
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China &kp_true->kp_datain_pipe,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China kp_true->kp_read_len, kp_true);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg receive_flag = 0;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp_true->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* setup rx callback for this port */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg kp_true->kp_cb.cb_rx(kp_true->kp_cb.cb_arg);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* cr != USB_CR_OK, usb error happened */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_IN_PIPE, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_bulkin_cb_usa49wg: port=%d, len=%d, status=%x",
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China data->b_rptr[0], data->b_rptr[1], data->b_rptr[2]);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (kp->kp_state != KEYSPAN_PORT_OPEN) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg kp->kp_no_more_reads = B_TRUE;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (!kp->kp_no_more_reads) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* kick off another read */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg (void) keyspan_receive_data(&kp->kp_datain_pipe,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China kp->kp_read_len, kp);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg freemsg(data);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg req->bulk_data = NULL;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_free_bulk_req(req);
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe callbacks
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * --------------
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * bulk in common callback for USA19HS and USA49WLC
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzvoid
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_bulkin_cb(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_port_t *kp = (keyspan_port_t *)req->bulk_client_private;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int data_len;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz boolean_t no_more_reads = B_FALSE;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_IN_PIPE, (&kp->kp_datain_pipe)->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_bulkin_cb");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_enter(&kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* put data on the read queue */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data_len = keyspan_bulkin_cb_usa49(pipe, req);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz no_more_reads = kp->kp_no_more_reads;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_exit(&kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_free_bulk_req(req);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* kick off another read unless indicated otherwise */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (!no_more_reads) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz (void) keyspan_receive_data(&kp->kp_datain_pipe,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_read_len, kp);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* setup rx callback for this port */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (data_len > 0) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_cb.cb_rx(kp->kp_cb.cb_arg);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe callbacks
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * --------------
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * bulk in status callback for usa19hs model
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzvoid
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_status_cb_usa19hs(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_state_t *ksp = (keyspan_state_t *)req->bulk_client_private;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_pipe_t *bulkin = &ksp->ks_statin_pipe;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mblk_t *data = req->bulk_data;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_cr_t cr = req->bulk_completion_reason;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int data_len;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz data_len = (data) ? MBLKL(data) : 0;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_IN_PIPE, bulkin->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_status_cb_usa19hs: len=%d"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " cr=%d flags=%x", data_len, cr, req->bulk_cb_flags);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* put data on the read queue */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if ((data_len == 14) && (cr == USB_CR_OK)) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_port_t *kp = &ksp->ks_ports[0];
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_usa19hs_port_status_msg_t *status_msg =
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz &(kp->kp_status_msg.usa19hs);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_enter(&kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz bcopy(data->b_rptr, status_msg, data_len);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (status_msg->controlResponse) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_status_flag |= KEYSPAN_PORT_CTRLRESP;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_status_flag &= ~KEYSPAN_PORT_CTRLRESP;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (status_msg->portState & PORTSTATE_ENABLED) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_status_flag |= KEYSPAN_PORT_ENABLE;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_status_flag &= ~KEYSPAN_PORT_ENABLE;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (status_msg->portState & PORTSTATE_TXBREAK) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_status_flag |= KEYSPAN_PORT_TXBREAK;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_status_flag &= ~KEYSPAN_PORT_TXBREAK;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (status_msg->rxBreak) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_status_flag |= KEYSPAN_PORT_RXBREAK;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_status_flag &= ~KEYSPAN_PORT_RXBREAK;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (status_msg->portState & PORTSTATE_LOOPBACK) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_status_flag |= KEYSPAN_PORT_LOOPBACK;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_status_flag &= ~KEYSPAN_PORT_LOOPBACK;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* if msr status changed, then invoke status callback */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (status_msg->msr & USA_MSR_dCTS ||
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz status_msg->msr & USA_MSR_dDSR ||
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz status_msg->msr & USA_MSR_dRI ||
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz status_msg->msr & USA_MSR_dDCD) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_exit(&kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp->kp_cb.cb_status(kp->kp_cb.cb_arg);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_exit(&kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L2(DPRINT_IN_PIPE, bulkin->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_status_cb_usa19hs: get status failed, cr=%d"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " data_len=%d", cr, data_len);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe callbacks
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * --------------
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * bulk in status callback for usa49 model
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzvoid
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_status_cb_usa49(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_state_t *ksp = (keyspan_state_t *)req->bulk_client_private;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_pipe_t *bulkin = &ksp->ks_statin_pipe;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mblk_t *data = req->bulk_data;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz uint_t cr = req->bulk_completion_reason;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int data_len;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz data_len = (data) ? MBLKL(data) : 0;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_IN_PIPE, bulkin->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_status_cb_usa49: len=%d"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " cr=%d flags=%x", data_len, cr, req->bulk_cb_flags);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* put data on the read queue */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if ((data_len == 11) && (cr == USB_CR_OK)) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_usa49_port_status_msg_t status_msg;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_port_t *cur_kp;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_usa49_port_status_msg_t *kp_status_msg;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz boolean_t need_cb = B_FALSE;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz bcopy(data->b_rptr, &status_msg, data_len);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (status_msg.portNumber >= ksp->ks_dev_spec.port_cnt) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz cur_kp = &ksp->ks_ports[status_msg.portNumber];
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz kp_status_msg = &(cur_kp->kp_status_msg.usa49);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_enter(&cur_kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* if msr status changed, then need invoke status callback */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (status_msg.cts != kp_status_msg->cts ||
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz status_msg.dsr != kp_status_msg->dsr ||
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz status_msg.ri != kp_status_msg->ri ||
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz status_msg.dcd != kp_status_msg->dcd) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz need_cb = B_TRUE;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz bcopy(&status_msg, kp_status_msg, data_len);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (kp_status_msg->controlResponse) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz cur_kp->kp_status_flag |= KEYSPAN_PORT_CTRLRESP;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz cur_kp->kp_status_flag &= ~KEYSPAN_PORT_CTRLRESP;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (!kp_status_msg->rxEnabled) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz cur_kp->kp_status_flag |= KEYSPAN_PORT_RXBREAK;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz cur_kp->kp_status_flag &= ~KEYSPAN_PORT_RXBREAK;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_exit(&cur_kp->kp_mutex);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (need_cb) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz cur_kp->kp_cb.cb_status(cur_kp->kp_cb.cb_arg);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L2(DPRINT_IN_PIPE, bulkin->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_status_cb_usa49: get status failed, cr=%d"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " data_len=%d", cr, data_len);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe callbacks
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * --------------
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * bulk in callback for status receiving
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzvoid
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_status_cb(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_state_t *ksp = (keyspan_state_t *)req->bulk_client_private;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_cr_t cr = req->bulk_completion_reason;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_IN_PIPE, (&ksp->ks_statin_pipe)->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_status_cb");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* put data on the read queue */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz switch (ksp->ks_dev_spec.id_product) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz case KEYSPAN_USA19HS_PID:
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_status_cb_usa19hs(pipe, req);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz break;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz case KEYSPAN_USA49WLC_PID:
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_status_cb_usa49(pipe, req);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz break;
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz default:
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L2(DPRINT_IN_PIPE,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz (&ksp->ks_statin_pipe)->pipe_lh, "keyspan_status_cb:"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "the device's product id can't be recognized");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_free_bulk_req(req);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* kick off another read to receive status */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if ((cr != USB_CR_FLUSHED) && (cr != USB_CR_DEV_NOT_RESP) &&
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_dev_is_online(ksp)) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (keyspan_receive_status(ksp) != USB_SUCCESS) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L2(DPRINT_IN_PIPE,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz (&ksp->ks_statin_pipe)->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_status_cb:"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "receive status can't be restarted.");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L2(DPRINT_IN_PIPE,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz (&ksp->ks_statin_pipe)->pipe_lh, "keyspan_status_cb:"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "get status failed: cr=%d", cr);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Submit data read request (asynchronous). If this function returns
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * USB_SUCCESS, pipe is acquired and request is sent, otherwise req is free.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzint
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_receive_data(keyspan_pipe_t *bulkin, int len, void *cb_arg)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_state_t *ksp = bulkin->pipe_ksp;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_bulk_req_t *br;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int rval = USB_SUCCESS;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_IN_PIPE, bulkin->pipe_lh, "keyspan_receive_data:"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "len=%d", len);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ASSERT(!mutex_owned(&bulkin->pipe_mutex));
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br = usb_alloc_bulk_req(ksp->ks_dip, len, USB_FLAGS_SLEEP);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_len = len;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* No timeout, just wait for data */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_timeout = 0;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_client_private = cb_arg;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_attributes = USB_ATTRS_SHORT_XFER_OK | USB_ATTRS_AUTOCLEARING;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg switch (ksp->ks_dev_spec.id_product) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA19HS_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WLC_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->bulk_cb = keyspan_bulkin_cb;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->bulk_exc_cb = keyspan_bulkin_cb;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg case KEYSPAN_USA49WG_PID:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->bulk_cb = keyspan_bulkin_cb_usa49wg;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->bulk_exc_cb = keyspan_bulkin_cb_usa49wg;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg break;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg default:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_free_bulk_req(br);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_IN_PIPE,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg (&ksp->ks_statin_pipe)->pipe_lh, "keyspan_receive_data:"
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "the device's product id can't be recognized");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (USB_FAILURE);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz rval = usb_pipe_bulk_xfer(bulkin->pipe_handle, br, 0);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (rval != USB_SUCCESS) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_free_bulk_req(br);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_IN_PIPE, bulkin->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_receive_data: rval = %d", rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * submit device status read request (asynchronous).
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzint
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_receive_status(keyspan_state_t *ksp)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_pipe_t *bulkin = &ksp->ks_statin_pipe;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_bulk_req_t *br;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int rval;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_IN_PIPE, bulkin->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_receive_status");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ASSERT(!mutex_owned(&bulkin->pipe_mutex));
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br = usb_alloc_bulk_req(ksp->ks_dip, 32, USB_FLAGS_SLEEP);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_len = KEYSPAN_STATIN_MAX_LEN;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* No timeout, just wait for data */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_timeout = 0;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_client_private = (void *)ksp;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_attributes = USB_ATTRS_SHORT_XFER_OK | USB_ATTRS_AUTOCLEARING;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_cb = keyspan_status_cb;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_exc_cb = keyspan_status_cb;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz rval = usb_pipe_bulk_xfer(bulkin->pipe_handle, br, 0);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (rval != USB_SUCCESS) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_free_bulk_req(br);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_IN_PIPE, bulkin->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_receive_status: rval = %d", rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * submit data for transfer (asynchronous)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * if data was sent successfully, 'mpp' will be nulled to indicate
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * that mblk is consumed by USBA and no longer belongs to the caller.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * if this function returns USB_SUCCESS, pipe is acquired and request
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * is sent, otherwise pipe is free.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzint
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_send_data(keyspan_pipe_t *bulkout, mblk_t **mpp, void *cb_arg)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz{
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_state_t *ksp = bulkout->pipe_ksp;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_bulk_req_t *br;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz int rval;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz ASSERT(!mutex_owned(&bulkout->pipe_mutex));
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_OUT_PIPE, bulkout->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_send_data");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br = usb_alloc_bulk_req(ksp->ks_dip, 0, USB_FLAGS_SLEEP);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_len = MBLKL(*mpp);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_data = *mpp;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_timeout = KEYSPAN_BULK_TIMEOUT;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_client_private = cb_arg;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_attributes = USB_ATTRS_AUTOCLEARING;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_cb = keyspan_bulkout_cb;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_exc_cb = keyspan_bulkout_cb;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L3(DPRINT_OUT_PIPE, bulkout->pipe_lh, "keyspan_send_data:"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "bulk_len = %d", br->bulk_len);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz rval = usb_pipe_bulk_xfer(bulkout->pipe_handle, br, 0);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (rval == USB_SUCCESS) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* data consumed. The mem will be released in bulkout_cb */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz *mpp = NULL;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz } else {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /*
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Don't free it in usb_free_bulk_req because it will
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * be linked in keyspan_put_head
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_data = NULL;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_free_bulk_req(br);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz }
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_OUT_PIPE, bulkout->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_send_data: rval = %d", rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz return (rval);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz}
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * submit data for transfer (asynchronous) for USA_49WG Port0 only
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg *
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * if data was sent successfully, 'mpp' will be nulled to indicate
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * that mblk is consumed by USBA and no longer belongs to the caller.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg *
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * if this function returns USB_SUCCESS, pipe is acquired and request
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * is sent, otherwise pipe is free.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgint
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_send_data_port0(keyspan_pipe_t *introut, mblk_t **mpp, void *cb_arg)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_state_t *ksp = introut->pipe_ksp;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_intr_req_t *br;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int rval;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg ASSERT(!mutex_owned(&introut->pipe_mutex));
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L4(DPRINT_OUT_PIPE, introut->pipe_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_send_data_port0");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br = usb_alloc_intr_req(ksp->ks_dip, 0, USB_FLAGS_SLEEP);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->intr_len = MBLKL(*mpp);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->intr_data = *mpp;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->intr_timeout = KEYSPAN_BULK_TIMEOUT;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->intr_client_private = cb_arg;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->intr_cb = keyspan_introut_cb_usa49wg;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->intr_exc_cb = keyspan_introut_cb_usa49wg;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L3(DPRINT_OUT_PIPE, introut->pipe_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_send_data_port0: intr_len = %d",
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China br->intr_len);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg rval = usb_pipe_intr_xfer(introut->pipe_handle, br, 0);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (rval == USB_SUCCESS) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * data consumed. The mem will be released in
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * introut_cb_usa49wg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg *mpp = NULL;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->intr_data = NULL;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_free_intr_req(br);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L4(DPRINT_OUT_PIPE, introut->pipe_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_send_data_port0: rval = %d", rval);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (rval);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * pipe callbacks
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * --------------
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg *
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * bulk in status callback for USA_49WG model
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*ARGSUSED*/
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgvoid
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_status_cb_usa49wg(usb_pipe_handle_t pipe, usb_intr_req_t *req)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_state_t *ksp = (keyspan_state_t *)req->intr_client_private;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_pipe_t *intr = &ksp->ks_statin_pipe;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mblk_t *data = req->intr_data;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg uint_t cr = req->intr_completion_reason;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int data_len;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data_len = (data) ? MBLKL(data) : 0;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L4(DPRINT_IN_PIPE, intr->pipe_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_status_cb_usa49wg: len=%d"
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg " cr=%d flags=%x", data_len, cr, req->intr_cb_flags);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* put data on the read queue */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if ((data_len == 11) && (cr == USB_CR_OK)) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_usa49_port_status_msg_t status_msg;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_port_t *cur_kp;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_usa49_port_status_msg_t *kp_status_msg;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg boolean_t need_cb = B_FALSE;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg bcopy(data->b_rptr, &status_msg, data_len);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (status_msg.portNumber >= ksp->ks_dev_spec.port_cnt) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg cur_kp = &ksp->ks_ports[status_msg.portNumber];
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg kp_status_msg = &(cur_kp->kp_status_msg.usa49);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&cur_kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* if msr status changed, then need invoke status callback */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (status_msg.cts != kp_status_msg->cts ||
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg status_msg.dsr != kp_status_msg->dsr ||
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg status_msg.ri != kp_status_msg->ri ||
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg status_msg.dcd != kp_status_msg->dcd) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg need_cb = B_TRUE;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg bcopy(&status_msg, kp_status_msg, data_len);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (kp_status_msg->controlResponse) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg cur_kp->kp_status_flag |= KEYSPAN_PORT_CTRLRESP;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg cur_kp->kp_status_flag &= ~KEYSPAN_PORT_CTRLRESP;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (!kp_status_msg->rxEnabled) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg cur_kp->kp_status_flag |= KEYSPAN_PORT_RXBREAK;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg cur_kp->kp_status_flag &= ~KEYSPAN_PORT_RXBREAK;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&cur_kp->kp_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (need_cb) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg cur_kp->kp_cb.cb_status(cur_kp->kp_cb.cb_arg);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_IN_PIPE, intr->pipe_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_status_cb_usa49wg: get status failed, cr=%d"
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg " data_len=%d", cr, data_len);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * pipe callbacks
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * --------------
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg *
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * intr in callback for status receiving for USA_49WG model only
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*ARGSUSED*/
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgvoid
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_intr_cb_usa49wg(usb_pipe_handle_t pipe, usb_intr_req_t *req)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_state_t *ksp = (keyspan_state_t *)req->intr_client_private;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_cr_t cr = req->intr_completion_reason;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L4(DPRINT_IN_PIPE, (&ksp->ks_statin_pipe)->pipe_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_intr_cb_usa49wg: cr=%d", cr);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* put data on the read queue */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg (void) keyspan_status_cb_usa49wg(pipe, req);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_free_intr_req(req);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * pipe callbacks
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * --------------
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg *
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * intr in exception callback for status receiving for USA_49WG model only
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*ARGSUSED*/
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgvoid
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_intr_ex_cb_usa49wg(usb_pipe_handle_t pipe, usb_intr_req_t *req)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_state_t *ksp = (keyspan_state_t *)req->intr_client_private;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_cr_t cr = req->intr_completion_reason;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L4(DPRINT_IN_PIPE, (&ksp->ks_statin_pipe)->pipe_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_intr_ex_cb_usa49wg: cr=%d", cr);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_free_intr_req(req);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if ((cr != USB_CR_PIPE_CLOSING) && (cr != USB_CR_STOPPED_POLLING) &&
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China (cr != USB_CR_FLUSHED) && (cr != USB_CR_DEV_NOT_RESP) &&
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China (cr != USB_CR_PIPE_RESET) && keyspan_dev_is_online(ksp)) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_pipe_start_polling(&ksp->ks_statin_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_IN_PIPE,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China (&ksp->ks_statin_pipe)->pipe_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_intr_ex_cb_usa49wg:"
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "get status failed: cr=%d", cr);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * start polling on the interrupt pipe for USA_49WG model only
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgvoid
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_pipe_start_polling(keyspan_pipe_t *intr)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg{
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_intr_req_t *br;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_state_t *ksp = intr->pipe_ksp;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int rval;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L4(DPRINT_IN_PIPE, ksp->ks_lh,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_pipe_start_polling");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br = usb_alloc_intr_req(ksp->ks_dip, 0, USB_FLAGS_SLEEP);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /*
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * If it is in interrupt context, usb_alloc_intr_req will return NULL if
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * called with SLEEP flag.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (!br) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L2(DPRINT_IN_PIPE, ksp->ks_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_pipe_start_polling: alloc req failed.");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->intr_attributes = USB_ATTRS_SHORT_XFER_OK | USB_ATTRS_AUTOCLEARING;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->intr_len = intr->pipe_ep_descr.wMaxPacketSize;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->intr_client_private = (void *)ksp;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->intr_cb = keyspan_intr_cb_usa49wg;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->intr_exc_cb = keyspan_intr_ex_cb_usa49wg;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg rval = usb_pipe_intr_xfer(intr->pipe_handle, br, USB_FLAGS_SLEEP);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_enter(&intr->pipe_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (rval != USB_SUCCESS) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_free_intr_req(br);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg intr->pipe_state = KEYSPAN_PIPE_CLOSED;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L3(DPRINT_IN_PIPE, ksp->ks_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_pipe_start_polling: failed (%d)", rval);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg intr->pipe_state = KEYSPAN_PIPE_OPEN;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg }
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg mutex_exit(&intr->pipe_mutex);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg}