Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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 );
}
Exemple #5
0
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;
}
Exemple #6
0
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;
}
Exemple #7
0
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);
}