| From 760053b6503cd73758f4994a8305d4bc6f97fcfc Mon Sep 17 00:00:00 2001 |
| From: Boaz Harrosh <bharrosh@panasas.com> |
| Date: Thu, 26 Mar 2009 18:25:07 +0000 |
| Subject: USB: fix USB_STORAGE_CYPRESS_ATACB |
| |
| From: Boaz Harrosh <bharrosh@panasas.com> |
| |
| 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 | 15 +++++++-------- |
| 1 file changed, 7 insertions(+), 8 deletions(-) |
| |
| --- a/drivers/usb/storage/cypress_atacb.c |
| +++ b/drivers/usb/storage/cypress_atacb.c |
| @@ -133,19 +133,18 @@ void cypress_atacb_passthrough(struct sc |
| |
| /* 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 sc |
| |
| /* 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. */ |