aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/storage
diff options
context:
space:
mode:
authorBoaz Harrosh <bharrosh@panasas.com>2009-02-11 02:54:31 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2009-03-24 19:20:31 -0400
commit1f4159c1620f74377e26d8a569d10ca5907ef475 (patch)
treeb92438c17fe3a48d07dcbcde2444aac899ec7e09 /drivers/usb/storage
parentbc29847e16cb6b571157220ec9b20a7d86e58046 (diff)
USB: fix USB_STORAGE_CYPRESS_ATACB
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>
Diffstat (limited to 'drivers/usb/storage')
-rw-r--r--drivers/usb/storage/cypress_atacb.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/drivers/usb/storage/cypress_atacb.c b/drivers/usb/storage/cypress_atacb.c
index 898e67d30e56..9466a99baab6 100644
--- a/drivers/usb/storage/cypress_atacb.c
+++ b/drivers/usb/storage/cypress_atacb.c
@@ -133,19 +133,18 @@ void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
133 133
134 /* build the command for 134 /* build the command for
135 * reading the ATA registers */ 135 * reading the ATA registers */
136 scsi_eh_prep_cmnd(srb, &ses, NULL, 0, 0); 136 scsi_eh_prep_cmnd(srb, &ses, NULL, 0, sizeof(regs));
137 srb->sdb.length = sizeof(regs); 137
138 sg_init_one(&ses.sense_sgl, regs, srb->sdb.length);
139 srb->sdb.table.sgl = &ses.sense_sgl;
140 srb->sc_data_direction = DMA_FROM_DEVICE;
141 srb->sdb.table.nents = 1;
142 /* we use the same command as before, but we set 138 /* we use the same command as before, but we set
143 * the read taskfile bit, for not executing atacb command, 139 * the read taskfile bit, for not executing atacb command,
144 * but reading register selected in srb->cmnd[4] 140 * but reading register selected in srb->cmnd[4]
145 */ 141 */
142 srb->cmd_len = 16;
143 srb->cmnd = ses.cmnd;
146 srb->cmnd[2] = 1; 144 srb->cmnd[2] = 1;
147 145
148 usb_stor_transparent_scsi_command(srb, us); 146 usb_stor_transparent_scsi_command(srb, us);
147 memcpy(regs, srb->sense_buffer, sizeof(regs));
149 tmp_result = srb->result; 148 tmp_result = srb->result;
150 scsi_eh_restore_cmnd(srb, &ses); 149 scsi_eh_restore_cmnd(srb, &ses);
151 /* we fail to get registers, report invalid command */ 150 /* we fail to get registers, report invalid command */
@@ -162,8 +161,8 @@ void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
162 161
163 /* XXX we should generate sk, asc, ascq from status and error 162 /* XXX we should generate sk, asc, ascq from status and error
164 * regs 163 * regs
165 * (see 11.1 Error translation ­ ATA device error to SCSI error map) 164 * (see 11.1 Error translation ATA device error to SCSI error
166 * and ata_to_sense_error from libata. 165 * map, and ata_to_sense_error from libata.)
167 */ 166 */
168 167
169 /* Sense data is current and format is descriptor. */ 168 /* Sense data is current and format is descriptor. */