mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
bc29847e16
commit
1f4159c162
|
@ -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 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. */
|
||||
|
|
Loading…
Reference in New Issue