60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * See the License for the specific language governing permissions
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * and limitations under the License.
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 * CDDL HEADER END
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Use is subject to license terms.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * keyspanport pipe routines (mostly device-neutral)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz#include <sys/usb/clients/usbser/usbser_keyspan/keyspan_var.h>
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz#include <sys/usb/clients/usbser/usbser_keyspan/keyspan_pipe.h>
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * initialize pipe structure with the given parameters
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzstatic void
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_init_one_pipe(keyspan_state_t *ksp, keyspan_port_t *kp,
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 /* init sync primitives */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz mutex_init(&pipe->pipe_mutex, NULL, MUTEX_DRIVER, (void *)NULL);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* init pipe policy */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* globle pipes should have device log handle */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* port pipes should have port log handle */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzstatic void
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_fini_one_pipe: pipe_stat %x", pipe->pipe_state);
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.
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China *datain[KEYSPAN_MAX_PORT_NUM],
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China *status = NULL, *ctrl = NULL, *tmp_ep;
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 * get DIR_IN EP descriptors, and then match with EP addresses.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Different keyspan devices may has different EP addresses.
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 "keyspan_init_pipes: can't find bulk in ep, i=%d,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L3(DPRINT_ATTACH, ksp->ks_lh, "keyspan_init_pipes: "
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* match the status EP */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* match the EPs of the ports */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz for (j = 0; j < port_cnt; j++) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: try to match bulk in data ep,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " j=%d", j);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: matched a bulk in"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " data ep");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* if have matched all the necessary endpoints, break out */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_ATTACH, ksp->ks_lh, "keyspan_init_pipes: "
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "try to match bulk in data ep, j=%d", j);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (j == port_cnt) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* this ep can't be matched by any addr */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: can't match bulk in ep,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* Some of the necessary IN endpoints are not matched */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: matched %d data in endpoints,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " not enough", k);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * get DIR_OUT EP descriptors, and then match with ep addrs.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * different keyspan devices may has different ep addresses.
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 "keyspan_init_pipes: can't find bulk out ep, i=%d,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* match the status ep */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* match the ep of the ports */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz for (j = 0; j < port_cnt; j++) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* if have matched all the necessary endpoints, break out */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (j == port_cnt) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* this ep can't be matched by any addr */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: can't match bulk out ep,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* Not all the necessary OUT endpoints are matched */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_init_pipes: matched %d data in endpoints,"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz " not enough", k);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Device globle pipes: a bulk in pipe for status and a bulk out
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe for controle cmd.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* for data in/out pipes of each port */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz for (i = 0; i < port_cnt; i++) {
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
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China *datain[KEYSPAN_MAX_PORT_NUM],
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China *status = NULL, *tmp_ep;
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 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);
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_init_pipes: can't find port1 data out ep");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* match the port0 data out EP */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * get bulk out EP descriptors as other port data out EPs, and then
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * match with EP addresses.
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);
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_init_pipes: can't find port[%d] "
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "data out ep",
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* match other port data out EPs */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * get intr in EP descriptor as status EP, and then match with EP addrs
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 "keyspan_init_pipes: can't find status in ep");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* match the status ep */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * get bulk in EP descriptors as data in EP, All the ports share one
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * data in EP.
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 "keyspan_init_pipes: can't find bulk in ep");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* match data in EPs */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* intr in pipe for status */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* for data in/out pipes of each port */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg for (i = 0; i < port_cnt; i++) {
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China datain[0]->ep_descr;
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China &ksp->ks_ports[i].kp_datain_pipe);
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China &ksp->ks_ports[i].kp_dataout_pipe);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* fini status pipe */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * fini control pipe
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * If USA_49WG, don't need fini control pipe
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_fini_pipes: the device's product id"
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "can't be recognized");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_open_one_pipe(keyspan_state_t *ksp, keyspan_pipe_t *pipe)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* don't open for the second time */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz &pipe->pipe_policy, USB_FLAGS_SLEEP, &pipe->pipe_handle);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Open shared datain pipe for USA_49WG
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_open_pipe_datain_usa49wg(keyspan_state_t *ksp, keyspan_pipe_t *pipe)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* don't open for the second time */
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 /* data in pipe has been opened by other port */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* Set datain pipe state */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * close one pipe if open
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzstatic void
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe may already be closed, e.g. if device has been physically
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * disconnected and the driver immediately detached
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz usb_pipe_close(pipe->pipe_ksp->ks_dip, pipe->pipe_handle,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China USB_FLAGS_SLEEP, NULL, NULL);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * close shared datain pipe if open for USA_49WG
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgstatic void
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * pipe may already be closed, e.g. if device has been physically
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * disconnected and the driver immediately detached
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China pipe->pipe_handle, USB_FLAGS_SLEEP,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China NULL, NULL);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * For USA19HS and USA49WLC:
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Open global pipes, a status pipe and a control pipe
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_open_dev_pipes_usa49");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz rval = keyspan_open_one_pipe(ksp, &ksp->ks_ctrlout_pipe);
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_open_dev_pipes_usa49: open ctrl pipe failed %d",
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_open_dev_pipes_usa49: open status pipe failed %d",
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* close the first opened pipe here */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* start receive device status */
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_open_dev_pipes_usa49: receive device status"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* close opened pipes here */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * For keyspan USA_49WG:
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Open global pipes, a status pipe
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Use default control pipe, don't need to open it.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* Open status pipe */
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_open_dev_pipes_usa49wg: "
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "open status pipe failed %d",
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* start device polling */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Open global pipes, status pipe and control pipe,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L4(DPRINT_OPEN, ksp->ks_lh, "keyspan_open_dev_pipes");
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");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Reopen all pipes if the port had them open
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_OPEN, ksp->ks_lh, "keyspan_reopen_pipes");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_reopen_pipes() reopen pipe #%d", i);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_CLOSE, kp->kp_lh, "keyspan_close_port_pipes");
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");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Close IN and OUT bulk pipes of all ports
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_CLOSE, ksp->ks_lh, "keyspan_close_open_pipes");
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China kp->kp_datain_pipe.pipe_handle,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China USB_FLAGS_SLEEP, NULL, NULL);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (port_num >= 0) {
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China kp->kp_datain_pipe.pipe_handle,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China USB_FLAGS_SLEEP, NULL, NULL);
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");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Close global pipes
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_CLOSE, ksp->ks_lh, "keyspan_close_dev_pipes");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * USA_49WG use default control pipe, don't need close it
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Stop polling before close status in pipe
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg usb_pipe_stop_intr_polling(ksp->ks_statin_pipe.pipe_handle,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China USB_FLAGS_SLEEP);
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");
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 USB_DPRINTF_L4(DPRINT_OPEN, kp->kp_lh, "keyspan_open_port_pipes");
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China &kp->kp_datain_pipe);
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");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_OPEN, ksp->ks_lh, "keyspan_close_pipes");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* close all ports' pipes first, and then device ctrl/status pipes. */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * bulk out common callback
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_bulkout_cb(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_port_t *kp = (keyspan_port_t *)req->bulk_client_private;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_bulkout_cb: len=%d cr=%d cb_flags=%x",
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz data_len, req->bulk_completion_reason, req->bulk_cb_flags);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Data wasn't transfered successfully.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Put data back on the queue.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* don't release mem in usb_free_bulk_req */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* if more data available, kick off another transmit */
688b07c52de0fc886cce2e0a28a42a43d2dad06agc * Attach a zero packet if data length is muliple of 64,
688b07c52de0fc886cce2e0a28a42a43d2dad06agc * due to the specification of keyspan_usa19hs.
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China KEYSPAN_USA19HS_PID) && (data_len == 64)) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* no more data, notify waiters */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* tx callback for this port */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * intr out common callback for USA_49WG port0 only
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*ARGSUSED*/
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_introut_cb_usa49wg(usb_pipe_handle_t pipe, usb_intr_req_t *req)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_port_t *kp = (keyspan_port_t *)req->intr_client_private;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_introut_cb_usa49wg: len=%d cr=%d cb_flags=%x",
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg data_len, req->intr_completion_reason, req->intr_cb_flags);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Data wasn't transfered successfully.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Put data back on the queue.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* don't release mem in usb_free_bulk_req */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* if more data available, kick off another transmit */
688b07c52de0fc886cce2e0a28a42a43d2dad06agc /* no more data, notify waiters */
688b07c52de0fc886cce2e0a28a42a43d2dad06agc /* tx callback for this port */
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz/* For incoming data only. Parse a status byte and return the err code */
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz * Parity and Framing errors only count if they
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz * occur exclusive of a break being received.
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz *err |= (*status & RXERROR_OVERRUN) ? DS_OVERRUN_ERR : 0;
c138f478d2bc94e73ab8f6a084e323bec25e62f5yz *err |= (*status & RXERROR_FRAMING) ? DS_FRAMING_ERR : 0;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/* Bulk in data process function, used by all models */
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 /* if 0x80 bit AND overrun bit are clear, just send up data */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* Get rid of the first status byte */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* If 0x80 bit is clear and overrun bit is set */
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_bulkin_cb_process: allocb failed");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (0);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* Add to the received list; Send up the err code. */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Don't send up the first byte because
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * it is a status byte.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else { /* 0x80 bit set, there are some errs in the data */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * Usually, there are at least two bytes,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * one status and one data.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int i = 0;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg int j = 1;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * In this case, there might be multi status
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * bytes. Parse each status byte and move the
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * data bytes together.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* move the data togeter */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg } else { /* There are only one byte in incoming buf */
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_bulkin_cb_process: allocb failed");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg return (0);
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 /* Add to the received list; Send up the err code. */
d29f5a711240f866521445b1656d114da090335ezhigang lu - Sun Microsystems - Beijing China data_len = MBLKL(data);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe callbacks
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * --------------
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * bulk in common callback for USA19HS and USA49WLC model
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_bulkin_cb_usa49(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_port_t *kp = (keyspan_port_t *)req->bulk_client_private;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_bulkin_cb_usa49: len=%d"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* put data on the read queue */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if ((data_len > 0) && (kp->kp_state != KEYSPAN_PORT_CLOSED) &&
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China status, data)) > 0) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * the data will not be freed and
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * will be sent up later.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* usb error happened, so don't send up data */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_bulkin_cb_usa49: port_state=%d"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe callbacks
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * --------------
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * bulk in common callback for USA_49WG model
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_bulkin_cb_usa49wg(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_port_t *kp = (keyspan_port_t *)req->bulk_client_private,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China port_data_len;
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China port_cnt = 0,
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China receive_flag = 1;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_bulkin_cb_usa49wg: len=%d"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* put data on the read queue */
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);
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_bulkin_cb_usa49wg, "
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "port isn't opened");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_bulkin_cb_usa49wg: status=0x%x, len=%d",
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China port_data_len, status, data)) > 0) {
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China kp_true->kp_lh, "keyspan_bulkin_cb_"
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "usa49wg: allocb failed");
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 } /* End of while loop */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* kick off another read */
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 /* setup rx callback for this port */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* cr != USB_CR_OK, usb error happened */
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 /* kick off another read */
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China kp->kp_read_len, kp);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe callbacks
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * --------------
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * bulk in common callback for USA19HS and USA49WLC
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_bulkin_cb(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_port_t *kp = (keyspan_port_t *)req->bulk_client_private;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_IN_PIPE, (&kp->kp_datain_pipe)->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_bulkin_cb");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* put data on the read queue */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* kick off another read unless indicated otherwise */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* setup rx callback for this port */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe callbacks
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * --------------
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * bulk in status callback for usa19hs model
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_status_cb_usa19hs(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_state_t *ksp = (keyspan_state_t *)req->bulk_client_private;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_status_cb_usa19hs: len=%d"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* put data on the read queue */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* if msr status changed, then invoke status callback */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_status_cb_usa19hs: get status failed, cr=%d"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe callbacks
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * --------------
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * bulk in status callback for usa49 model
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_status_cb_usa49(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_state_t *ksp = (keyspan_state_t *)req->bulk_client_private;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_status_cb_usa49: len=%d"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* put data on the read queue */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if (status_msg.portNumber >= ksp->ks_dev_spec.port_cnt) {
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* if msr status changed, then need invoke status callback */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_status_cb_usa49: get status failed, cr=%d"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * pipe callbacks
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * --------------
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * bulk in callback for status receiving
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz/*ARGSUSED*/
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_status_cb(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz keyspan_state_t *ksp = (keyspan_state_t *)req->bulk_client_private;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_IN_PIPE, (&ksp->ks_statin_pipe)->pipe_lh,
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_status_cb");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* put data on the read queue */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "the device's product id can't be recognized");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* kick off another read to receive status */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz if ((cr != USB_CR_FLUSHED) && (cr != USB_CR_DEV_NOT_RESP) &&
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_status_cb:"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "receive status can't be restarted.");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Submit data read request (asynchronous). If this function returns
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * USB_SUCCESS, pipe is acquired and request is sent, otherwise req is free.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_receive_data(keyspan_pipe_t *bulkin, int len, void *cb_arg)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L4(DPRINT_IN_PIPE, bulkin->pipe_lh, "keyspan_receive_data:"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br = usb_alloc_bulk_req(ksp->ks_dip, len, USB_FLAGS_SLEEP);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* No timeout, just wait for data */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_attributes = USB_ATTRS_SHORT_XFER_OK | USB_ATTRS_AUTOCLEARING;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "the device's product id can't be recognized");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * submit device status read request (asynchronous).
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_receive_status");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br = usb_alloc_bulk_req(ksp->ks_dip, 32, USB_FLAGS_SLEEP);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* No timeout, just wait for data */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br->bulk_attributes = USB_ATTRS_SHORT_XFER_OK | USB_ATTRS_AUTOCLEARING;
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * submit data for transfer (asynchronous)
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 * if this function returns USB_SUCCESS, pipe is acquired and request
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * is sent, otherwise pipe is free.
60b08185ce63023f22fd6b2ed0db8c0d119b2023yzkeyspan_send_data(keyspan_pipe_t *bulkout, mblk_t **mpp, void *cb_arg)
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz "keyspan_send_data");
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz br = usb_alloc_bulk_req(ksp->ks_dip, 0, USB_FLAGS_SLEEP);
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz USB_DPRINTF_L3(DPRINT_OUT_PIPE, bulkout->pipe_lh, "keyspan_send_data:"
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz /* data consumed. The mem will be released in bulkout_cb */
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * Don't free it in usb_free_bulk_req because it will
60b08185ce63023f22fd6b2ed0db8c0d119b2023yz * be linked in keyspan_put_head
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * submit data for transfer (asynchronous) for USA_49WG Port0 only
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 * if this function returns USB_SUCCESS, pipe is acquired and request
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * is sent, otherwise pipe is free.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_send_data_port0(keyspan_pipe_t *introut, mblk_t **mpp, void *cb_arg)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_send_data_port0");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br = usb_alloc_intr_req(ksp->ks_dip, 0, USB_FLAGS_SLEEP);
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_send_data_port0: intr_len = %d",
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China br->intr_len);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * data consumed. The mem will be released in
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * introut_cb_usa49wg
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * pipe callbacks
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * --------------
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * bulk in status callback for USA_49WG model
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*ARGSUSED*/
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_status_cb_usa49wg(usb_pipe_handle_t pipe, usb_intr_req_t *req)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_state_t *ksp = (keyspan_state_t *)req->intr_client_private;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_status_cb_usa49wg: len=%d"
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* put data on the read queue */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg if (status_msg.portNumber >= ksp->ks_dev_spec.port_cnt) {
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* if msr status changed, then need invoke status callback */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_status_cb_usa49wg: get status failed, cr=%d"
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * pipe callbacks
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * --------------
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * intr in callback for status receiving for USA_49WG model only
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*ARGSUSED*/
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_intr_cb_usa49wg(usb_pipe_handle_t pipe, usb_intr_req_t *req)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_state_t *ksp = (keyspan_state_t *)req->intr_client_private;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L4(DPRINT_IN_PIPE, (&ksp->ks_statin_pipe)->pipe_lh,
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg /* put data on the read queue */
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * pipe callbacks
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * --------------
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * intr in exception callback for status receiving for USA_49WG model only
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg/*ARGSUSED*/
02dd21081e66fa04b4c6f0962352e15edcabfbb0lgkeyspan_intr_ex_cb_usa49wg(usb_pipe_handle_t pipe, usb_intr_req_t *req)
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg keyspan_state_t *ksp = (keyspan_state_t *)req->intr_client_private;
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg USB_DPRINTF_L4(DPRINT_IN_PIPE, (&ksp->ks_statin_pipe)->pipe_lh,
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)) {
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 * start polling on the interrupt pipe for USA_49WG model only
77e515715b61e28fcf0c3f30936492888cecfd8bgongtian zhao - Sun Microsystems - Beijing China "keyspan_pipe_start_polling");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br = usb_alloc_intr_req(ksp->ks_dip, 0, USB_FLAGS_SLEEP);
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * If it is in interrupt context, usb_alloc_intr_req will return NULL if
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg * called with SLEEP flag.
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg "keyspan_pipe_start_polling: alloc req failed.");
02dd21081e66fa04b4c6f0962352e15edcabfbb0lg br->intr_attributes = USB_ATTRS_SHORT_XFER_OK | USB_ATTRS_AUTOCLEARING;