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 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_get_status( struct urb *transfer ) { MTS_INT_INIT(); mts_int_submit_urb(transfer, usb_rcvbulkpipe(context->instance->usb_dev, context->instance->ep_response), context->scsi_status, 1, mts_transfer_done ); }
static void mts_get_status( struct urb *transfer ) /* Interrupt context! */ { struct mts_transfer_context* context; MTS_INT_INIT(); context->state = mts_con_status; mts_int_submit_urb(transfer, usb_rcvbulkpipe(context->instance->usb_dev, context->instance->ep_response), &context->status, 1, mts_transfer_done ); 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; }
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); }