]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
USB: fix USB_STORAGE_CYPRESS_ATACB
authorBoaz Harrosh <bharrosh@panasas.com>
Thu, 26 Mar 2009 18:25:07 +0000 (18:25 +0000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sat, 2 May 2009 17:23:24 +0000 (10:23 -0700)
upstream commit: 1f4159c1620f74377e26d8a569d10ca5907ef475

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>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
drivers/usb/storage/cypress_atacb.c

index 898e67d30e563bfc4b8a11cf1715cee5a1edec56..9466a99baab635755d540acc754c057aef4fb4bd 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 */
 
                /* 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]
                 */
                /* 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);
                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 */
                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
 
                /* XXX we should generate sk, asc, ascq from status and error
                 * regs
-                * (see 11.1 Error translation ­ 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. */
                 */
 
                /* Sense data is current and format is descriptor. */