Lines Matching +full:data +full:- +full:transfer

1 // SPDX-License-Identifier: GPL-2.0
5 * (C) Copyright 2000 Oliver Neukum <Oliver.Neukum@lrz.uni-muenchen.de>
7 * Parts shamelessly stolen from usb-storage and copyright by their
19 * commands and outgoing data are sent, and two input: 0x82 from which
20 * normal data is read from the scanner (in packets of maximum 32
36 * If there is data to receive:
38 * Read a lot of data from EP 0x83
40 * Read data from EP 0x82
42 * If there is data to transmit:
73 * 20000514 Fix reporting of non-existent devices to SCSI layer (john)
75 * 20000514 Changed "usb-microtek" to "microtek" for consistency (john)
78 * 20000515 Put transfer context and URB in mts_desc (john)
141 #define DRIVER_AUTHOR "John Fremlin <vii@penguinpowered.com>, Oliver Neukum <Oliver.Neukum@lrz.uni-
187 MTS_DEBUG("transfer = 0x%x context = 0x%x\n",(int)transfer,(int)context ); \
188 …MTS_DEBUG("status = 0x%x data-length = 0x%x sent = 0x%x\n",transfer->status,(int)context->data_len…
189 mts_debug_dump(context->instance);\
204 struct mts_transfer_context* context = (struct mts_transfer_context*)transfer->context; \
212 (int)desc->usb_dev->toggle[1],(int)desc->usb_dev->toggle[0] in mts_debug_dump()
215 usb_sndbulkpipe(desc->usb_dev,desc->ep_out), in mts_debug_dump()
216 usb_rcvbulkpipe(desc->usb_dev,desc->ep_response), in mts_debug_dump()
217 usb_rcvbulkpipe(desc->usb_dev,desc->ep_image) in mts_debug_dump()
226 switch (srb->cmnd[0]) { in mts_show_command()
296 MTS_DEBUG( "Command %s (%d bytes)\n", what, srb->cmd_len); in mts_show_command()
299 MTS_DEBUG( " %10ph\n", srb->cmnd); in mts_show_command()
318 usb_kill_urb( desc->urb ); in mts_urb_abort()
323 s->inquiry_len = 0x24; in mts_slave_alloc()
329 blk_queue_dma_alignment(s->request_queue, (512 - 1)); in mts_slave_configure()
335 struct mts_desc* desc = (struct mts_desc*)(srb->device->host->hostdata[0]); in mts_scsi_abort()
346 struct mts_desc* desc = (struct mts_desc*)(srb->device->host->hostdata[0]); in mts_scsi_host_reset()
352 result = usb_lock_device_for_reset(desc->usb_dev, desc->usb_intf); in mts_scsi_host_reset()
354 result = usb_reset_device(desc->usb_dev); in mts_scsi_host_reset()
355 usb_unlock_device(desc->usb_dev); in mts_scsi_host_reset()
363 static void mts_transfer_cleanup( struct urb *transfer );
364 static void mts_do_sg(struct urb * transfer);
367 void mts_int_submit_urb (struct urb* transfer, in mts_int_submit_urb() argument
369 void* data, in mts_int_submit_urb() argument
374 /* Holding transfer->context->lock! */ in mts_int_submit_urb()
380 usb_fill_bulk_urb(transfer, in mts_int_submit_urb()
381 context->instance->usb_dev, in mts_int_submit_urb()
383 data, in mts_int_submit_urb()
389 res = usb_submit_urb( transfer, GFP_ATOMIC ); in mts_int_submit_urb()
392 set_host_byte(context->srb, DID_ERROR); in mts_int_submit_urb()
393 mts_transfer_cleanup(transfer); in mts_int_submit_urb()
398 static void mts_transfer_cleanup( struct urb *transfer ) in mts_transfer_cleanup() argument
403 if ( likely(context->final_callback != NULL) ) in mts_transfer_cleanup()
404 context->final_callback(context->srb); in mts_transfer_cleanup()
407 static void mts_transfer_done( struct urb *transfer ) in mts_transfer_done() argument
411 context->srb->result &= MTS_SCSI_ERR_MASK; in mts_transfer_done()
412 context->srb->result |= (unsigned)(*context->scsi_status)<<1; in mts_transfer_done()
414 mts_transfer_cleanup(transfer); in mts_transfer_done()
418 static void mts_get_status( struct urb *transfer ) in mts_get_status() argument
423 mts_int_submit_urb(transfer, in mts_get_status()
424 usb_rcvbulkpipe(context->instance->usb_dev, in mts_get_status()
425 context->instance->ep_response), in mts_get_status()
426 context->scsi_status, in mts_get_status()
431 static void mts_data_done( struct urb* transfer ) in mts_data_done() argument
434 int status = transfer->status; in mts_data_done()
437 if ( context->data_length != transfer->actual_length ) { in mts_data_done()
438 scsi_set_resid(context->srb, context->data_length - in mts_data_done()
439 transfer->actual_length); in mts_data_done()
441 set_host_byte(context->srb, (status == -ENOENT ? DID_ABORT : DID_ERROR)); in mts_data_done()
444 mts_get_status(transfer); in mts_data_done()
448 static void mts_command_done( struct urb *transfer ) in mts_command_done() argument
451 int status = transfer->status; in mts_command_done()
455 if (status == -ENOENT) { in mts_command_done()
458 set_host_byte(context->srb, DID_ABORT); in mts_command_done()
463 set_host_byte(context->srb, DID_ERROR); in mts_command_done()
465 mts_transfer_cleanup(transfer); in mts_command_done()
470 if (context->srb->cmnd[0] == REQUEST_SENSE) { in mts_command_done()
471 mts_int_submit_urb(transfer, in mts_command_done()
472 context->data_pipe, in mts_command_done()
473 context->srb->sense_buffer, in mts_command_done()
474 context->data_length, in mts_command_done()
476 } else { if ( context->data ) { in mts_command_done()
477 mts_int_submit_urb(transfer, in mts_command_done()
478 context->data_pipe, in mts_command_done()
479 context->data, in mts_command_done()
480 context->data_length, in mts_command_done()
481 scsi_sg_count(context->srb) > 1 ? in mts_command_done()
484 mts_get_status(transfer); in mts_command_done()
489 static void mts_do_sg (struct urb* transfer) in mts_do_sg() argument
491 int status = transfer->status; in mts_do_sg()
494 MTS_DEBUG("Processing fragment %d of %d\n", context->fragment, in mts_do_sg()
495 scsi_sg_count(context->srb)); in mts_do_sg()
498 set_host_byte(context->srb, (status == -ENOENT ? DID_ABORT : DID_ERROR)); in mts_do_sg()
499 mts_transfer_cleanup(transfer); in mts_do_sg()
502 context->curr_sg = sg_next(context->curr_sg); in mts_do_sg()
503 mts_int_submit_urb(transfer, in mts_do_sg()
504 context->data_pipe, in mts_do_sg()
505 sg_virt(context->curr_sg), in mts_do_sg()
506 context->curr_sg->length, in mts_do_sg()
507 sg_is_last(context->curr_sg) ? in mts_do_sg()
530 desc->context.instance = desc; in mts_build_transfer_context()
531 desc->context.srb = srb; in mts_build_transfer_context()
534 desc->context.data = NULL; in mts_build_transfer_context()
535 desc->context.data_length = 0; in mts_build_transfer_context()
538 desc->context.curr_sg = scsi_sglist(srb); in mts_build_transfer_context()
539 desc->context.data = sg_virt(desc->context.curr_sg); in mts_build_transfer_context()
540 desc->context.data_length = desc->context.curr_sg->length; in mts_build_transfer_context()
544 /* can't rely on srb->sc_data_direction */ in mts_build_transfer_context()
546 /* Brutally ripped from usb-storage */ in mts_build_transfer_context()
548 if ( !memcmp( srb->cmnd, mts_read_image_sig, mts_read_image_sig_len ) in mts_build_transfer_context()
549 ) { pipe = usb_rcvbulkpipe(desc->usb_dev,desc->ep_image); in mts_build_transfer_context()
550 MTS_DEBUG( "transferring from desc->ep_image == %d\n", in mts_build_transfer_context()
551 (int)desc->ep_image ); in mts_build_transfer_context()
552 } else if ( MTS_DIRECTION_IS_IN(srb->cmnd[0]) ) { in mts_build_transfer_context()
553 pipe = usb_rcvbulkpipe(desc->usb_dev,desc->ep_response); in mts_build_transfer_context()
554 MTS_DEBUG( "transferring from desc->ep_response == %d\n", in mts_build_transfer_context()
555 (int)desc->ep_response); in mts_build_transfer_context()
557 MTS_DEBUG("transferring to desc->ep_out == %d\n", in mts_build_transfer_context()
558 (int)desc->ep_out); in mts_build_transfer_context()
559 pipe = usb_sndbulkpipe(desc->usb_dev,desc->ep_out); in mts_build_transfer_context()
561 desc->context.data_pipe = pipe; in mts_build_transfer_context()
568 struct mts_desc* desc = (struct mts_desc*)(srb->device->host->hostdata[0]); in mts_scsi_queuecommand_lck()
575 if ( srb->device->lun || srb->device->id || srb->device->channel ) { in mts_scsi_queuecommand_lck()
577 …UN=%d ID=%d CHANNEL=%d from SCSI layer\n",(int)srb->device->lun,(int)srb->device->id, (int)srb->de… in mts_scsi_queuecommand_lck()
590 usb_fill_bulk_urb(desc->urb, in mts_scsi_queuecommand_lck()
591 desc->usb_dev, in mts_scsi_queuecommand_lck()
592 usb_sndbulkpipe(desc->usb_dev,desc->ep_out), in mts_scsi_queuecommand_lck()
593 srb->cmnd, in mts_scsi_queuecommand_lck()
594 srb->cmd_len, in mts_scsi_queuecommand_lck()
596 &desc->context in mts_scsi_queuecommand_lck()
601 desc->context.final_callback = callback; in mts_scsi_queuecommand_lck()
604 res=usb_submit_urb(desc->urb, GFP_ATOMIC); in mts_scsi_queuecommand_lck()
629 .this_id = -1,
636 /* The entries of microtek_table must correspond, line-by-line to
660 int ep_out = -1; in mts_usb_probe()
664 int err_retval = -ENOMEM; in mts_usb_probe()
673 MTS_DEBUG( "usb-device descriptor at %x\n", (int)dev ); in mts_usb_probe()
676 le16_to_cpu(dev->descriptor.idProduct), in mts_usb_probe()
677 le16_to_cpu(dev->descriptor.idVendor) ); in mts_usb_probe()
682 altsetting = intf->cur_altsetting; in mts_usb_probe()
687 if ( altsetting->desc.bNumEndpoints != MTS_EP_TOTAL ) { in mts_usb_probe()
689 (int)MTS_EP_TOTAL, (int)altsetting->desc.bNumEndpoints ); in mts_usb_probe()
690 return -ENODEV; in mts_usb_probe()
693 for( i = 0; i < altsetting->desc.bNumEndpoints; i++ ) { in mts_usb_probe()
694 if ((altsetting->endpoint[i].desc.bmAttributes & in mts_usb_probe()
698 (int)altsetting->endpoint[i].desc.bEndpointAddress ); in mts_usb_probe()
700 if (altsetting->endpoint[i].desc.bEndpointAddress & in mts_usb_probe()
703 = altsetting->endpoint[i].desc.bEndpointAddress & in mts_usb_probe()
706 if ( ep_out != -1 ) { in mts_usb_probe()
708 return -ENODEV; in mts_usb_probe()
711 ep_out = altsetting->endpoint[i].desc.bEndpointAddress & in mts_usb_probe()
720 return -ENODEV; in mts_usb_probe()
723 if ( ep_out == -1 ) { in mts_usb_probe()
725 return -ENODEV; in mts_usb_probe()
733 new_desc->urb = usb_alloc_urb(0, GFP_KERNEL); in mts_usb_probe()
734 if (!new_desc->urb) in mts_usb_probe()
737 new_desc->context.scsi_status = kmalloc(1, GFP_KERNEL); in mts_usb_probe()
738 if (!new_desc->context.scsi_status) in mts_usb_probe()
741 new_desc->usb_dev = dev; in mts_usb_probe()
742 new_desc->usb_intf = intf; in mts_usb_probe()
745 new_desc->ep_out = ep_out; in mts_usb_probe()
746 new_desc->ep_response = ep_in_set[0]; in mts_usb_probe()
747 new_desc->ep_image = ep_in_set[1]; in mts_usb_probe()
749 if ( new_desc->ep_out != MTS_EP_OUT ) in mts_usb_probe()
751 (int)new_desc->ep_out ); in mts_usb_probe()
753 if ( new_desc->ep_response != MTS_EP_RESPONSE ) in mts_usb_probe()
755 (int)new_desc->ep_response ); in mts_usb_probe()
757 if ( new_desc->ep_image != MTS_EP_IMAGE ) in mts_usb_probe()
758 MTS_WARNING( "will this work? Image data EP is not usually %d\n", in mts_usb_probe()
759 (int)new_desc->ep_image ); in mts_usb_probe()
761 new_desc->host = scsi_host_alloc(&mts_scsi_host_template, in mts_usb_probe()
763 if (!new_desc->host) in mts_usb_probe()
766 new_desc->host->hostdata[0] = (unsigned long)new_desc; in mts_usb_probe()
767 if (scsi_add_host(new_desc->host, &dev->dev)) { in mts_usb_probe()
768 err_retval = -EIO; in mts_usb_probe()
771 scsi_scan_host(new_desc->host); in mts_usb_probe()
777 scsi_host_put(new_desc->host); in mts_usb_probe()
779 kfree(new_desc->context.scsi_status); in mts_usb_probe()
781 usb_free_urb(new_desc->urb); in mts_usb_probe()
794 usb_kill_urb(desc->urb); in mts_usb_disconnect()
795 scsi_remove_host(desc->host); in mts_usb_disconnect()
797 scsi_host_put(desc->host); in mts_usb_disconnect()
798 usb_free_urb(desc->urb); in mts_usb_disconnect()
799 kfree(desc->context.scsi_status); in mts_usb_disconnect()