int usba10_usb_pipe_ctrl_xfer_wait( usb_pipe_handle_t pipe_handle, usb_ctrl_setup_t *setup, mblk_t **data, usb_cr_t *completion_reason, usb_cb_flags_t *cb_flags, usb_flags_t flags) { return (usb_pipe_ctrl_xfer_wait( pipe_handle, setup, data, completion_reason, cb_flags, flags)); }
/* * download firmware or command by control pipe */ static int wusb_df_send_data(wusb_df_state_t *wusbp, unsigned int address, const unsigned char *buffer, unsigned int size) { int error = DDI_FAILURE; usb_ctrl_setup_t setup; usb_cb_flags_t cb_flags; usb_cr_t cr; mblk_t *data = NULL; /* data for USBA */ uint16_t data_len; /* # of bytes want to write */ uint_t cnt; /* # of xfered bytes */ setup.bmRequestType = USB_DEV_REQ_TYPE_VENDOR | USB_DEV_REQ_HOST_TO_DEV | USB_DEV_REQ_RCPT_DEV; setup.bRequest = 0xf0; setup.attrs = 0; for (cnt = 0; cnt < size; cnt += data_len) { data_len = min(size - cnt, 512); /* reuse previous mblk if possible */ if ((data = reallocb(data, data_len, 0)) == NULL) { return (USB_FAILURE); } bcopy(buffer + cnt, data->b_rptr, data_len); data->b_wptr += data_len; setup.wValue = (address + cnt) & 0xffff; setup.wIndex = ((address + cnt) >> 16) & 0xffff; setup.wLength = data_len; error = usb_pipe_ctrl_xfer_wait( wusbp->wusb_df_reg->dev_default_ph, &setup, &data, &cr, &cb_flags, 0); if (error != USB_SUCCESS) { USB_DPRINTF_L2(PRINT_MASK_ATTA, wusbp->wusb_df_log_hdl, "wusb_df_send_data: " "send failed rval=%d, cr=%d, cb=0x%x\n", error, cr, cb_flags); break; } } if (data) { freemsg(data); } return (error); }
/* * Download firmware or set register to the device by default ctrl pipe */ static int keyspan_write_memory(keyspan_pipe_t *pipe, uint16_t addr, uchar_t *buf, uint16_t len, uint8_t bRequest) { mblk_t *data; usb_ctrl_setup_t setup; usb_cb_flags_t cb_flags; usb_cr_t cr; uint8_t retry = 0; /* reuse previous mblk if possible */ if ((data = allocb(len, BPRI_HI)) == NULL) { return (USB_FAILURE); } bcopy(buf, data->b_rptr, len); setup.bmRequestType = USB_DEV_REQ_TYPE_VENDOR; /* This is a req defined by hardware vendor. */ setup.bRequest = bRequest; setup.wValue = addr; setup.wIndex = 0; setup.wLength = len; setup.attrs = 0; while (usb_pipe_ctrl_xfer_wait(pipe->pipe_handle, &setup, &data, &cr, &cb_flags, 0) != USB_SUCCESS) { /* KEYSPAN_RETRY */ if (++retry > 3) { if (data) { freemsg(data); } return (USB_FAILURE); } } if (data) { freemsg(data); } return (USB_SUCCESS); }