Esempio n. 1
0
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));
}
Esempio n. 2
0
/*
 * 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);
}
Esempio n. 3
0
/*
 * 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);
}