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)
145 #define DRIVER_AUTHOR "John Fremlin <vii@penguinpowered.com>, Oliver Neukum <Oliver.Neukum@lrz.uni-
191 MTS_DEBUG("transfer = 0x%x context = 0x%x\n",(int)transfer,(int)context ); \
192 …MTS_DEBUG("status = 0x%x data-length = 0x%x sent = 0x%x\n",transfer->status,(int)context->data_len…
193 mts_debug_dump(context->instance);\
208 struct mts_transfer_context* context = (struct mts_transfer_context*)transfer->context; \
216 (int)desc->usb_dev->toggle[1],(int)desc->usb_dev->toggle[0] in mts_debug_dump()
219 usb_sndbulkpipe(desc->usb_dev,desc->ep_out), in mts_debug_dump()
220 usb_rcvbulkpipe(desc->usb_dev,desc->ep_response), in mts_debug_dump()
221 usb_rcvbulkpipe(desc->usb_dev,desc->ep_image) in mts_debug_dump()
230 switch (srb->cmnd[0]) { in mts_show_command()
300 MTS_DEBUG( "Command %s (%d bytes)\n", what, srb->cmd_len); in mts_show_command()
303 MTS_DEBUG( " %10ph\n", srb->cmnd); in mts_show_command()
322 usb_kill_urb( desc->urb ); in mts_urb_abort()
327 s->inquiry_len = 0x24; in mts_slave_alloc()
333 blk_queue_dma_alignment(s->request_queue, (512 - 1)); in mts_slave_configure()
339 struct mts_desc* desc = (struct mts_desc*)(srb->device->host->hostdata[0]); in mts_scsi_abort()
350 struct mts_desc* desc = (struct mts_desc*)(srb->device->host->hostdata[0]); in mts_scsi_host_reset()
356 result = usb_lock_device_for_reset(desc->usb_dev, desc->usb_intf); in mts_scsi_host_reset()
358 result = usb_reset_device(desc->usb_dev); in mts_scsi_host_reset()
359 usb_unlock_device(desc->usb_dev); in mts_scsi_host_reset()
367 static void mts_transfer_cleanup( struct urb *transfer );
368 static void mts_do_sg(struct urb * transfer);
371 void mts_int_submit_urb (struct urb* transfer, in mts_int_submit_urb() argument
373 void* data, in mts_int_submit_urb() argument
378 /* Holding transfer->context->lock! */ in mts_int_submit_urb()
384 usb_fill_bulk_urb(transfer, in mts_int_submit_urb()
385 context->instance->usb_dev, in mts_int_submit_urb()
387 data, in mts_int_submit_urb()
393 res = usb_submit_urb( transfer, GFP_ATOMIC ); in mts_int_submit_urb()
396 set_host_byte(context->srb, DID_ERROR); in mts_int_submit_urb()
397 mts_transfer_cleanup(transfer); in mts_int_submit_urb()
402 static void mts_transfer_cleanup( struct urb *transfer ) in mts_transfer_cleanup() argument
407 if ( likely(context->final_callback != NULL) ) in mts_transfer_cleanup()
408 context->final_callback(context->srb); in mts_transfer_cleanup()
411 static void mts_transfer_done( struct urb *transfer ) in mts_transfer_done() argument
415 context->srb->result &= MTS_SCSI_ERR_MASK; in mts_transfer_done()
416 context->srb->result |= (unsigned)(*context->scsi_status)<<1; in mts_transfer_done()
418 mts_transfer_cleanup(transfer); in mts_transfer_done()
422 static void mts_get_status( struct urb *transfer ) in mts_get_status() argument
427 mts_int_submit_urb(transfer, in mts_get_status()
428 usb_rcvbulkpipe(context->instance->usb_dev, in mts_get_status()
429 context->instance->ep_response), in mts_get_status()
430 context->scsi_status, in mts_get_status()
435 static void mts_data_done( struct urb* transfer ) in mts_data_done() argument
438 int status = transfer->status; in mts_data_done()
441 if ( context->data_length != transfer->actual_length ) { in mts_data_done()
442 scsi_set_resid(context->srb, context->data_length - in mts_data_done()
443 transfer->actual_length); in mts_data_done()
445 set_host_byte(context->srb, (status == -ENOENT ? DID_ABORT : DID_ERROR)); in mts_data_done()
448 mts_get_status(transfer); in mts_data_done()
452 static void mts_command_done( struct urb *transfer ) in mts_command_done() argument
455 int status = transfer->status; in mts_command_done()
459 if (status == -ENOENT) { in mts_command_done()
462 set_host_byte(context->srb, DID_ABORT); in mts_command_done()
467 set_host_byte(context->srb, DID_ERROR); in mts_command_done()
469 mts_transfer_cleanup(transfer); in mts_command_done()
474 if (context->srb->cmnd[0] == REQUEST_SENSE) { in mts_command_done()
475 mts_int_submit_urb(transfer, in mts_command_done()
476 context->data_pipe, in mts_command_done()
477 context->srb->sense_buffer, in mts_command_done()
478 context->data_length, in mts_command_done()
480 } else { if ( context->data ) { in mts_command_done()
481 mts_int_submit_urb(transfer, in mts_command_done()
482 context->data_pipe, in mts_command_done()
483 context->data, in mts_command_done()
484 context->data_length, in mts_command_done()
485 scsi_sg_count(context->srb) > 1 ? in mts_command_done()
488 mts_get_status(transfer); in mts_command_done()
493 static void mts_do_sg (struct urb* transfer) in mts_do_sg() argument
495 int status = transfer->status; in mts_do_sg()
498 MTS_DEBUG("Processing fragment %d of %d\n", context->fragment, in mts_do_sg()
499 scsi_sg_count(context->srb)); in mts_do_sg()
502 set_host_byte(context->srb, (status == -ENOENT ? DID_ABORT : DID_ERROR)); in mts_do_sg()
503 mts_transfer_cleanup(transfer); in mts_do_sg()
506 context->curr_sg = sg_next(context->curr_sg); in mts_do_sg()
507 mts_int_submit_urb(transfer, in mts_do_sg()
508 context->data_pipe, in mts_do_sg()
509 sg_virt(context->curr_sg), in mts_do_sg()
510 context->curr_sg->length, in mts_do_sg()
511 sg_is_last(context->curr_sg) ? in mts_do_sg()
534 desc->context.instance = desc; in mts_build_transfer_context()
535 desc->context.srb = srb; in mts_build_transfer_context()
538 desc->context.data = NULL; in mts_build_transfer_context()
539 desc->context.data_length = 0; in mts_build_transfer_context()
542 desc->context.curr_sg = scsi_sglist(srb); in mts_build_transfer_context()
543 desc->context.data = sg_virt(desc->context.curr_sg); in mts_build_transfer_context()
544 desc->context.data_length = desc->context.curr_sg->length; in mts_build_transfer_context()
548 /* can't rely on srb->sc_data_direction */ in mts_build_transfer_context()
550 /* Brutally ripped from usb-storage */ in mts_build_transfer_context()
552 if ( !memcmp( srb->cmnd, mts_read_image_sig, mts_read_image_sig_len ) in mts_build_transfer_context()
553 ) { pipe = usb_rcvbulkpipe(desc->usb_dev,desc->ep_image); in mts_build_transfer_context()
554 MTS_DEBUG( "transferring from desc->ep_image == %d\n", in mts_build_transfer_context()
555 (int)desc->ep_image ); in mts_build_transfer_context()
556 } else if ( MTS_DIRECTION_IS_IN(srb->cmnd[0]) ) { in mts_build_transfer_context()
557 pipe = usb_rcvbulkpipe(desc->usb_dev,desc->ep_response); in mts_build_transfer_context()
558 MTS_DEBUG( "transferring from desc->ep_response == %d\n", in mts_build_transfer_context()
559 (int)desc->ep_response); in mts_build_transfer_context()
561 MTS_DEBUG("transferring to desc->ep_out == %d\n", in mts_build_transfer_context()
562 (int)desc->ep_out); in mts_build_transfer_context()
563 pipe = usb_sndbulkpipe(desc->usb_dev,desc->ep_out); in mts_build_transfer_context()
565 desc->context.data_pipe = pipe; in mts_build_transfer_context()
571 struct mts_desc* desc = (struct mts_desc*)(srb->device->host->hostdata[0]); in mts_scsi_queuecommand_lck()
578 if ( srb->device->lun || srb->device->id || srb->device->channel ) { in mts_scsi_queuecommand_lck()
580 …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()
593 usb_fill_bulk_urb(desc->urb, in mts_scsi_queuecommand_lck()
594 desc->usb_dev, in mts_scsi_queuecommand_lck()
595 usb_sndbulkpipe(desc->usb_dev,desc->ep_out), in mts_scsi_queuecommand_lck()
596 srb->cmnd, in mts_scsi_queuecommand_lck()
597 srb->cmd_len, in mts_scsi_queuecommand_lck()
599 &desc->context in mts_scsi_queuecommand_lck()
604 desc->context.final_callback = callback; in mts_scsi_queuecommand_lck()
607 res=usb_submit_urb(desc->urb, GFP_ATOMIC); in mts_scsi_queuecommand_lck()
632 .this_id = -1,
639 /* The entries of microtek_table must correspond, line-by-line to
663 int ep_out = -1; in mts_usb_probe()
667 int err_retval = -ENOMEM; in mts_usb_probe()
676 MTS_DEBUG( "usb-device descriptor at %x\n", (int)dev ); in mts_usb_probe()
679 le16_to_cpu(dev->descriptor.idProduct), in mts_usb_probe()
680 le16_to_cpu(dev->descriptor.idVendor) ); in mts_usb_probe()
685 altsetting = intf->cur_altsetting; in mts_usb_probe()
690 if ( altsetting->desc.bNumEndpoints != MTS_EP_TOTAL ) { in mts_usb_probe()
692 (int)MTS_EP_TOTAL, (int)altsetting->desc.bNumEndpoints ); in mts_usb_probe()
693 return -ENODEV; in mts_usb_probe()
696 for( i = 0; i < altsetting->desc.bNumEndpoints; i++ ) { in mts_usb_probe()
697 if ((altsetting->endpoint[i].desc.bmAttributes & in mts_usb_probe()
701 (int)altsetting->endpoint[i].desc.bEndpointAddress ); in mts_usb_probe()
703 if (altsetting->endpoint[i].desc.bEndpointAddress & in mts_usb_probe()
706 = altsetting->endpoint[i].desc.bEndpointAddress & in mts_usb_probe()
709 if ( ep_out != -1 ) { in mts_usb_probe()
711 return -ENODEV; in mts_usb_probe()
714 ep_out = altsetting->endpoint[i].desc.bEndpointAddress & in mts_usb_probe()
723 return -ENODEV; in mts_usb_probe()
726 if ( ep_out == -1 ) { in mts_usb_probe()
728 return -ENODEV; in mts_usb_probe()
736 new_desc->urb = usb_alloc_urb(0, GFP_KERNEL); in mts_usb_probe()
737 if (!new_desc->urb) in mts_usb_probe()
740 new_desc->context.scsi_status = kmalloc(1, GFP_KERNEL); in mts_usb_probe()
741 if (!new_desc->context.scsi_status) in mts_usb_probe()
744 new_desc->usb_dev = dev; in mts_usb_probe()
745 new_desc->usb_intf = intf; in mts_usb_probe()
748 new_desc->ep_out = ep_out; in mts_usb_probe()
749 new_desc->ep_response = ep_in_set[0]; in mts_usb_probe()
750 new_desc->ep_image = ep_in_set[1]; in mts_usb_probe()
752 if ( new_desc->ep_out != MTS_EP_OUT ) in mts_usb_probe()
754 (int)new_desc->ep_out ); in mts_usb_probe()
756 if ( new_desc->ep_response != MTS_EP_RESPONSE ) in mts_usb_probe()
758 (int)new_desc->ep_response ); in mts_usb_probe()
760 if ( new_desc->ep_image != MTS_EP_IMAGE ) in mts_usb_probe()
761 MTS_WARNING( "will this work? Image data EP is not usually %d\n", in mts_usb_probe()
762 (int)new_desc->ep_image ); in mts_usb_probe()
764 new_desc->host = scsi_host_alloc(&mts_scsi_host_template, in mts_usb_probe()
766 if (!new_desc->host) in mts_usb_probe()
769 new_desc->host->hostdata[0] = (unsigned long)new_desc; in mts_usb_probe()
770 if (scsi_add_host(new_desc->host, &dev->dev)) { in mts_usb_probe()
771 err_retval = -EIO; in mts_usb_probe()
774 scsi_scan_host(new_desc->host); in mts_usb_probe()
780 scsi_host_put(new_desc->host); in mts_usb_probe()
782 kfree(new_desc->context.scsi_status); in mts_usb_probe()
784 usb_free_urb(new_desc->urb); in mts_usb_probe()
797 usb_kill_urb(desc->urb); in mts_usb_disconnect()
798 scsi_remove_host(desc->host); in mts_usb_disconnect()
800 scsi_host_put(desc->host); in mts_usb_disconnect()
801 usb_free_urb(desc->urb); in mts_usb_disconnect()
802 kfree(desc->context.scsi_status); in mts_usb_disconnect()