USB: fix USB_STORAGE_CYPRESS_ATACB
authorBoaz Harrosh <bharrosh@panasas.com>
Wed, 11 Feb 2009 07:54:31 +0000 (09:54 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 24 Mar 2009 23:20:31 +0000 (16:20 -0700)
commit 64a87b24: [SCSI] Let scsi_cmnd->cmnd use request->cmd buffer
changed the scsi_eh_prep_cmnd logic by making it clear
the ->cmnd buffer. But the sat to cypress atacb translation supposed
the ->cmnd buffer wasn't modified.

This patch makes it set the ->cmnd buffer after scsi_eh_prep_cmnd call.
The problem and a fix was reported by Matthieu CASTET <castet.matthieu@free.fr>

It also removes all the hackery fiddling of scsi_cmnd and scsi_eh_save by
requesting from scsi_eh_prep_cmnd to prepare a read into ->sense_buffer,
which is much more suitable a buffer for HW transfers, then after the command
execution the regs read is copied into regs buffer before actual preparation
of sense_buffer.

Also fix an alien comment character to my utf-8 editor.

Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: Matthieu CASTET <castet.matthieu@free.fr>
Cc: stable <stable@kernel.org>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: Matthew Dharm <mdharm-kernel@one-eyed-alien.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/storage/cypress_atacb.c

index 898e67d..9466a99 100644 (file)
@@ -133,19 +133,18 @@ void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
 
                /* build the command for
                 * reading the ATA registers */
-               scsi_eh_prep_cmnd(srb, &ses, NULL, 0, 0);
-               srb->sdb.length = sizeof(regs);
-               sg_init_one(&ses.sense_sgl, regs, srb->sdb.length);
-               srb->sdb.table.sgl = &ses.sense_sgl;
-               srb->sc_data_direction = DMA_FROM_DEVICE;
-               srb->sdb.table.nents = 1;
+               scsi_eh_prep_cmnd(srb, &ses, NULL, 0, sizeof(regs));
+
                /* we use the same command as before, but we set
                 * the read taskfile bit, for not executing atacb command,
                 * but reading register selected in srb->cmnd[4]
                 */
+               srb->cmd_len = 16;
+               srb->cmnd = ses.cmnd;
                srb->cmnd[2] = 1;
 
                usb_stor_transparent_scsi_command(srb, us);
+               memcpy(regs, srb->sense_buffer, sizeof(regs));
                tmp_result = srb->result;
                scsi_eh_restore_cmnd(srb, &ses);
                /* we fail to get registers, report invalid command */
@@ -162,8 +161,8 @@ void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
 
                /* XXX we should generate sk, asc, ascq from status and error
                 * regs
-                * (see 11.1 Error translation \ad ATA device error to SCSI error map)
-                * and ata_to_sense_error from libata.
+                * (see 11.1 Error translation ATA device error to SCSI error
+                *  map, and ata_to_sense_error from libata.)
                 */
 
                /* Sense data is current and format is descriptor. */