/*--- 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; }
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; }
/* * 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); }