inline static void mts_int_submit_urb (struct urb* transfer, int pipe, void* data, unsigned length, mts_usb_urb_callback callback ) /* Interrupt context! */ /* Holding transfer->context->lock! */ { int res; MTS_INT_INIT(); FILL_BULK_URB(transfer, context->instance->usb_dev, pipe, data, length, callback, context ); transfer->status = 0; res = usb_submit_urb( transfer ); if ( res ) { MTS_INT_ERROR( "could not submit URB! Error was %d\n",(int)res ); context->srb->result = DID_ERROR << 16; mts_transfer_cleanup(transfer); } return; }
static void mts_command_done( struct urb *transfer ) /* Interrupt context! */ { MTS_INT_INIT(); if ( transfer->status ) { if (transfer->status == -ENOENT) { /* We are being killed */ MTS_DEBUG_GOT_HERE(); context->srb->result = DID_ABORT<<16; } else { /* A genuine error has occured */ MTS_DEBUG_GOT_HERE(); context->srb->result = DID_ERROR<<16; } mts_transfer_cleanup(transfer); return; } if ( context->data ) { mts_int_submit_urb(transfer, context->data_pipe, context->data, context->data_length, context->srb->use_sg ? mts_do_sg : mts_data_done); } else mts_get_status(transfer); return; }
static void mts_command_done( struct urb *transfer ) /* Interrupt context! */ { struct mts_transfer_context* context; MTS_INT_INIT(); if ( transfer->status ) { context->srb->result = DID_ERROR<<16; mts_transfer_cleanup(transfer); return; } if ( context->data ) { context->state = mts_con_data; mts_int_submit_urb(transfer, context->data_pipe, context->data, context->data_length, mts_data_done); } else mts_get_status(transfer); return; }
static inline void mts_int_submit_urb (struct urb* transfer, int pipe, void* data, unsigned length, usb_complete_t callback ) /* Interrupt context! */ /* Holding transfer->context->lock! */ { int res; MTS_INT_INIT(); usb_fill_bulk_urb(transfer, context->instance->usb_dev, pipe, data, length, callback, context ); transfer->status = 0; res = usb_submit_urb( transfer, GFP_ATOMIC ); if ( unlikely(res) ) { MTS_INT_ERROR( "could not submit URB! Error was %d\n",(int)res ); context->srb->result = DID_ERROR << 16; mts_transfer_cleanup(transfer); } return; }
static void mts_transfer_done( struct urb *transfer ) { MTS_INT_INIT(); context->srb->result &= MTS_SCSI_ERR_MASK; context->srb->result |= (unsigned)(*context->scsi_status)<<1; mts_transfer_cleanup(transfer); }
static void mts_transfer_done( struct urb *transfer ) { struct mts_transfer_context* context; MTS_INT_INIT(); context->srb->result &= MTS_SCSI_ERR_MASK; context->srb->result |= (unsigned)context->status<<1; mts_transfer_cleanup(transfer); return; }
static void mts_command_done( struct urb *transfer ) /* Interrupt context! */ { int status = transfer->status; MTS_INT_INIT(); if ( unlikely(status) ) { if (status == -ENOENT) { /* We are being killed */ MTS_DEBUG_GOT_HERE(); context->srb->result = DID_ABORT<<16; } else { /* A genuine error has occurred */ MTS_DEBUG_GOT_HERE(); context->srb->result = DID_ERROR<<16; } mts_transfer_cleanup(transfer); return; } if (context->srb->cmnd[0] == REQUEST_SENSE) { mts_int_submit_urb(transfer, context->data_pipe, context->srb->sense_buffer, context->data_length, mts_data_done); } else { if ( context->data ) { mts_int_submit_urb(transfer, context->data_pipe, context->data, context->data_length, scsi_sg_count(context->srb) > 1 ? mts_do_sg : mts_data_done); } else { mts_get_status(transfer); } } return; }
static void mts_do_sg (struct urb* transfer) { struct scatterlist * sg; MTS_INT_INIT(); MTS_DEBUG("Processing fragment %d of %d\n", context->fragment,context->srb->use_sg); if (transfer->status) { context->srb->result = (transfer->status == -ENOENT ? DID_ABORT : DID_ERROR)<<16; mts_transfer_cleanup(transfer); } sg = context->srb->buffer; context->fragment++; mts_int_submit_urb(transfer, context->data_pipe, sg[context->fragment].address, sg[context->fragment].length, context->fragment + 1 == context->srb->use_sg ? mts_data_done : mts_do_sg); return; }
inline static void mts_int_submit_urb (struct urb* transfer, int pipe, void* data, unsigned length, mts_usb_urb_callback callback ) /* Interrupt context! */ /* Holding transfer->context->lock! */ { int res; struct mts_transfer_context* context; MTS_INT_INIT(); FILL_BULK_URB(transfer, context->instance->usb_dev, pipe, data, length, callback, context ); /* transfer->transfer_flags = USB_DISABLE_SPD;*/ transfer->transfer_flags = USB_ASYNC_UNLINK; transfer->status = 0; transfer->timeout = 100; res = usb_submit_urb( transfer ); if ( res ) { MTS_INT_ERROR( "could not submit URB! Error was %d\n",(int)res ); context->srb->result = DID_ERROR << 16; context->state = mts_con_error; mts_transfer_cleanup(transfer); } return; }
static void mts_do_sg (struct urb* transfer) { struct scatterlist * sg; int status = transfer->status; MTS_INT_INIT(); MTS_DEBUG("Processing fragment %d of %d\n", context->fragment, scsi_sg_count(context->srb)); if (unlikely(status)) { context->srb->result = (status == -ENOENT ? DID_ABORT : DID_ERROR)<<16; mts_transfer_cleanup(transfer); } sg = scsi_sglist(context->srb); context->fragment++; mts_int_submit_urb(transfer, context->data_pipe, sg_virt(&sg[context->fragment]), sg[context->fragment].length, context->fragment + 1 == scsi_sg_count(context->srb) ? mts_data_done : mts_do_sg); }