diff options
author | James Bottomley <James.Bottomley@steeleye.com> | 2005-06-12 23:21:29 -0400 |
---|---|---|
committer | James Bottomley <jejb@titanic.(none)> | 2005-08-28 12:34:07 -0400 |
commit | 820732b501a5bbdd3bde1263f391891e21b5ed8c (patch) | |
tree | caf927bfbc9bd83ae0812e02d59456117106c97c /drivers/scsi/sr.c | |
parent | ea73a9f23906c374b697cd5b0d64f6dceced63de (diff) |
[SCSI] convert sr to scsi_execute_req
This follows almost the identical model to sd, except that there's one
ioctl which returns raw sense data, so it had to use scsi_execute()
instead.
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/sr.c')
-rw-r--r-- | drivers/scsi/sr.c | 49 |
1 files changed, 10 insertions, 39 deletions
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 8cbe6e00418..39fc5b0fbc1 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
@@ -50,10 +50,10 @@ | |||
50 | #include <scsi/scsi_dbg.h> | 50 | #include <scsi/scsi_dbg.h> |
51 | #include <scsi/scsi_device.h> | 51 | #include <scsi/scsi_device.h> |
52 | #include <scsi/scsi_driver.h> | 52 | #include <scsi/scsi_driver.h> |
53 | #include <scsi/scsi_cmnd.h> | ||
53 | #include <scsi/scsi_eh.h> | 54 | #include <scsi/scsi_eh.h> |
54 | #include <scsi/scsi_host.h> | 55 | #include <scsi/scsi_host.h> |
55 | #include <scsi/scsi_ioctl.h> /* For the door lock/unlock commands */ | 56 | #include <scsi/scsi_ioctl.h> /* For the door lock/unlock commands */ |
56 | #include <scsi/scsi_request.h> | ||
57 | 57 | ||
58 | #include "scsi_logging.h" | 58 | #include "scsi_logging.h" |
59 | #include "sr.h" | 59 | #include "sr.h" |
@@ -658,39 +658,27 @@ static void get_sectorsize(struct scsi_cd *cd) | |||
658 | unsigned char *buffer; | 658 | unsigned char *buffer; |
659 | int the_result, retries = 3; | 659 | int the_result, retries = 3; |
660 | int sector_size; | 660 | int sector_size; |
661 | struct scsi_request *SRpnt = NULL; | ||
662 | request_queue_t *queue; | 661 | request_queue_t *queue; |
663 | 662 | ||
664 | buffer = kmalloc(512, GFP_KERNEL | GFP_DMA); | 663 | buffer = kmalloc(512, GFP_KERNEL | GFP_DMA); |
665 | if (!buffer) | 664 | if (!buffer) |
666 | goto Enomem; | 665 | goto Enomem; |
667 | SRpnt = scsi_allocate_request(cd->device, GFP_KERNEL); | ||
668 | if (!SRpnt) | ||
669 | goto Enomem; | ||
670 | 666 | ||
671 | do { | 667 | do { |
672 | cmd[0] = READ_CAPACITY; | 668 | cmd[0] = READ_CAPACITY; |
673 | memset((void *) &cmd[1], 0, 9); | 669 | memset((void *) &cmd[1], 0, 9); |
674 | /* Mark as really busy */ | ||
675 | SRpnt->sr_request->rq_status = RQ_SCSI_BUSY; | ||
676 | SRpnt->sr_cmd_len = 0; | ||
677 | |||
678 | memset(buffer, 0, 8); | 670 | memset(buffer, 0, 8); |
679 | 671 | ||
680 | /* Do the command and wait.. */ | 672 | /* Do the command and wait.. */ |
681 | SRpnt->sr_data_direction = DMA_FROM_DEVICE; | 673 | the_result = scsi_execute_req(cd->device, cmd, DMA_FROM_DEVICE, |
682 | scsi_wait_req(SRpnt, (void *) cmd, (void *) buffer, | 674 | buffer, 8, NULL, SR_TIMEOUT, |
683 | 8, SR_TIMEOUT, MAX_RETRIES); | 675 | MAX_RETRIES); |
684 | 676 | ||
685 | the_result = SRpnt->sr_result; | ||
686 | retries--; | 677 | retries--; |
687 | 678 | ||
688 | } while (the_result && retries); | 679 | } while (the_result && retries); |
689 | 680 | ||
690 | 681 | ||
691 | scsi_release_request(SRpnt); | ||
692 | SRpnt = NULL; | ||
693 | |||
694 | if (the_result) { | 682 | if (the_result) { |
695 | cd->capacity = 0x1fffff; | 683 | cd->capacity = 0x1fffff; |
696 | sector_size = 2048; /* A guess, just in case */ | 684 | sector_size = 2048; /* A guess, just in case */ |
@@ -750,8 +738,6 @@ Enomem: | |||
750 | cd->capacity = 0x1fffff; | 738 | cd->capacity = 0x1fffff; |
751 | sector_size = 2048; /* A guess, just in case */ | 739 | sector_size = 2048; /* A guess, just in case */ |
752 | cd->needs_sector_size = 1; | 740 | cd->needs_sector_size = 1; |
753 | if (SRpnt) | ||
754 | scsi_release_request(SRpnt); | ||
755 | goto out; | 741 | goto out; |
756 | } | 742 | } |
757 | 743 | ||
@@ -759,8 +745,8 @@ static void get_capabilities(struct scsi_cd *cd) | |||
759 | { | 745 | { |
760 | unsigned char *buffer; | 746 | unsigned char *buffer; |
761 | struct scsi_mode_data data; | 747 | struct scsi_mode_data data; |
762 | struct scsi_request *SRpnt; | ||
763 | unsigned char cmd[MAX_COMMAND_SIZE]; | 748 | unsigned char cmd[MAX_COMMAND_SIZE]; |
749 | struct scsi_sense_hdr sshdr; | ||
764 | unsigned int the_result; | 750 | unsigned int the_result; |
765 | int retries, rc, n; | 751 | int retries, rc, n; |
766 | 752 | ||
@@ -776,19 +762,11 @@ static void get_capabilities(struct scsi_cd *cd) | |||
776 | "" | 762 | "" |
777 | }; | 763 | }; |
778 | 764 | ||
779 | /* allocate a request for the TEST_UNIT_READY */ | ||
780 | SRpnt = scsi_allocate_request(cd->device, GFP_KERNEL); | ||
781 | if (!SRpnt) { | ||
782 | printk(KERN_WARNING "(get_capabilities:) Request allocation " | ||
783 | "failure.\n"); | ||
784 | return; | ||
785 | } | ||
786 | 765 | ||
787 | /* allocate transfer buffer */ | 766 | /* allocate transfer buffer */ |
788 | buffer = kmalloc(512, GFP_KERNEL | GFP_DMA); | 767 | buffer = kmalloc(512, GFP_KERNEL | GFP_DMA); |
789 | if (!buffer) { | 768 | if (!buffer) { |
790 | printk(KERN_ERR "sr: out of memory.\n"); | 769 | printk(KERN_ERR "sr: out of memory.\n"); |
791 | scsi_release_request(SRpnt); | ||
792 | return; | 770 | return; |
793 | } | 771 | } |
794 | 772 | ||
@@ -800,20 +778,15 @@ static void get_capabilities(struct scsi_cd *cd) | |||
800 | memset((void *)cmd, 0, MAX_COMMAND_SIZE); | 778 | memset((void *)cmd, 0, MAX_COMMAND_SIZE); |
801 | cmd[0] = TEST_UNIT_READY; | 779 | cmd[0] = TEST_UNIT_READY; |
802 | 780 | ||
803 | SRpnt->sr_cmd_len = 0; | 781 | the_result = scsi_execute_req (cd->device, cmd, DMA_NONE, NULL, |
804 | SRpnt->sr_sense_buffer[0] = 0; | 782 | 0, &sshdr, SR_TIMEOUT, |
805 | SRpnt->sr_sense_buffer[2] = 0; | 783 | MAX_RETRIES); |
806 | SRpnt->sr_data_direction = DMA_NONE; | ||
807 | |||
808 | scsi_wait_req (SRpnt, (void *) cmd, buffer, | ||
809 | 0, SR_TIMEOUT, MAX_RETRIES); | ||
810 | 784 | ||
811 | the_result = SRpnt->sr_result; | ||
812 | retries++; | 785 | retries++; |
813 | } while (retries < 5 && | 786 | } while (retries < 5 && |
814 | (!scsi_status_is_good(the_result) || | 787 | (!scsi_status_is_good(the_result) || |
815 | ((driver_byte(the_result) & DRIVER_SENSE) && | 788 | (scsi_sense_valid(&sshdr) && |
816 | SRpnt->sr_sense_buffer[2] == UNIT_ATTENTION))); | 789 | sshdr.sense_key == UNIT_ATTENTION))); |
817 | 790 | ||
818 | /* ask for mode page 0x2a */ | 791 | /* ask for mode page 0x2a */ |
819 | rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, 128, | 792 | rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, 128, |
@@ -825,7 +798,6 @@ static void get_capabilities(struct scsi_cd *cd) | |||
825 | cd->cdi.mask |= (CDC_CD_R | CDC_CD_RW | CDC_DVD_R | | 798 | cd->cdi.mask |= (CDC_CD_R | CDC_CD_RW | CDC_DVD_R | |
826 | CDC_DVD | CDC_DVD_RAM | | 799 | CDC_DVD | CDC_DVD_RAM | |
827 | CDC_SELECT_DISC | CDC_SELECT_SPEED); | 800 | CDC_SELECT_DISC | CDC_SELECT_SPEED); |
828 | scsi_release_request(SRpnt); | ||
829 | kfree(buffer); | 801 | kfree(buffer); |
830 | printk("%s: scsi-1 drive\n", cd->cdi.name); | 802 | printk("%s: scsi-1 drive\n", cd->cdi.name); |
831 | return; | 803 | return; |
@@ -885,7 +857,6 @@ static void get_capabilities(struct scsi_cd *cd) | |||
885 | cd->device->writeable = 1; | 857 | cd->device->writeable = 1; |
886 | } | 858 | } |
887 | 859 | ||
888 | scsi_release_request(SRpnt); | ||
889 | kfree(buffer); | 860 | kfree(buffer); |
890 | } | 861 | } |
891 | 862 | ||