Ejemplo n.º 1
0
/*--- Dispatcher ---*/
int32 USBHost::dispatch(uint32 fncode)
{
	int32 ret;

	D(bug("USBHost: dispatch(%u)", fncode));
	ret = EINVFN;

	switch(fncode) {
		case GET_VERSION:
			D(bug("USBHost: getVersion"));
			ret = USBHOST_NFAPI_VERSION;
			break;

		case USBHOST_INTLEVEL:
			D(bug("USBHost: getINTlevel"));
			ret = INTLEVEL;
			break;

		case USBHOST_RH_PORT_STATUS:
			ret = rh_port_status(getParameter(0));
			break;

		case USBHOST_LOWLEVEL_INIT:
			ret = usb_lowlevel_init();
			break;

		case USBHOST_LOWLEVEL_STOP:
			ret = usb_lowlevel_stop();
			break;

		case USBHOST_SUBMIT_CONTROL_MSG:
			ret = submit_control_msg(getParameter(0), getParameter(1), getParameter(2),
						getParameter(3));
			break;

		case USBHOST_SUBMIT_INT_MSG:
			ret = submit_int_msg(getParameter(0), getParameter(1), getParameter(2),
						getParameter(3));
			break;

		case USBHOST_SUBMIT_BULK_MSG:
			ret = submit_bulk_msg(getParameter(0), getParameter(1), getParameter(2));
			break;
		default:
			D(bug("USBHost: unimplemented function #%d", fncode));
			break;
	}

	D(bug("USBHost: function returning with 0x%08x", ret));

	return ret;
}
Ejemplo n.º 2
0
int usb_stor_CBI_get_status (ccb * srb, struct us_data *us)
{
    int timeout;

    us->ip_wanted = 1;
    submit_int_msg (us->pusb_dev, us->irqpipe,
                    (void *) &us->ip_data, us->irqmaxp, us->irqinterval);
    timeout = 1000;
    while (timeout--) {
        if ((volatile int *) us->ip_wanted == 0)
            break;
        wait_ms (10);
    }
    if (us->ip_wanted) {
        printf ("	Did not get interrupt on CBI\n");
        us->ip_wanted = 0;
        return USB_STOR_TRANSPORT_ERROR;
    }
    USB_STOR_PRINTF
    ("Got interrupt data 0x%x, transfered %d status 0x%lX\n",
     us->ip_data, us->pusb_dev->irq_act_len,
     us->pusb_dev->irq_status);
    /* UFI gives us ASC and ASCQ, like a request sense */
    if (us->subclass == US_SC_UFI) {
        if (srb->cmd[0] == SCSI_REQ_SENSE ||
                srb->cmd[0] == SCSI_INQUIRY)
            return USB_STOR_TRANSPORT_GOOD; /* Good */
        else if (us->ip_data)
            return USB_STOR_TRANSPORT_FAILED;
        else
            return USB_STOR_TRANSPORT_GOOD;
    }
    /* otherwise, we interpret the data normally */
    switch (us->ip_data) {
    case 0x0001:
        return USB_STOR_TRANSPORT_GOOD;
    case 0x0002:
        return USB_STOR_TRANSPORT_FAILED;
    default:
        return USB_STOR_TRANSPORT_ERROR;
    }			/* switch */
    return USB_STOR_TRANSPORT_ERROR;
}
Ejemplo n.º 3
0
/*
 * submits an Interrupt Message
 */
int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
			void *buffer, int transfer_len, int interval)
{
	return submit_int_msg(dev, pipe, buffer, transfer_len, interval);
}