|
@@ -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. */
|