Bläddra i källkod

libata: Clear tf before doing request sense (take 3)

patch 2/4:
  Clear tf before doing request sense.

This fixes the AOpen 56X/AKH timeout problem.
(http://bugzilla.kernel.org/show_bug.cgi?id=8244)

Signed-off-by: Albert Lee <albertcc@tw.ibm.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Albert Lee 18 år sedan
förälder
incheckning
56287768e3
1 ändrade filer med 11 tillägg och 11 borttagningar
  1. 11 11
      drivers/ata/libata-eh.c

+ 11 - 11
drivers/ata/libata-eh.c

@@ -982,26 +982,27 @@ static int ata_eh_read_log_10h(struct ata_device *dev,
  *	RETURNS:
  *	RETURNS:
  *	0 on success, AC_ERR_* mask on failure
  *	0 on success, AC_ERR_* mask on failure
  */
  */
-static unsigned int atapi_eh_request_sense(struct ata_device *dev,
-					   unsigned char *sense_buf)
+static unsigned int atapi_eh_request_sense(struct ata_queued_cmd *qc)
 {
 {
+	struct ata_device *dev = qc->dev;
+	unsigned char *sense_buf = qc->scsicmd->sense_buffer;
 	struct ata_port *ap = dev->ap;
 	struct ata_port *ap = dev->ap;
 	struct ata_taskfile tf;
 	struct ata_taskfile tf;
 	u8 cdb[ATAPI_CDB_LEN];
 	u8 cdb[ATAPI_CDB_LEN];
 
 
 	DPRINTK("ATAPI request sense\n");
 	DPRINTK("ATAPI request sense\n");
 
 
-	ata_tf_init(dev, &tf);
-
 	/* FIXME: is this needed? */
 	/* FIXME: is this needed? */
 	memset(sense_buf, 0, SCSI_SENSE_BUFFERSIZE);
 	memset(sense_buf, 0, SCSI_SENSE_BUFFERSIZE);
 
 
-	/* XXX: why tf_read here? */
-	ap->ops->tf_read(ap, &tf);
-
-	/* fill these in, for the case where they are -not- overwritten */
+	/* initialize sense_buf with the error register,
+	 * for the case where they are -not- overwritten
+	 */
 	sense_buf[0] = 0x70;
 	sense_buf[0] = 0x70;
-	sense_buf[2] = tf.feature >> 4;
+	sense_buf[2] = qc->result_tf.feature >> 4;
+
+	/* some devices time out if garbage left in tf */ 
+	ata_tf_init(dev, &tf);
 
 
 	memset(cdb, 0, ATAPI_CDB_LEN);
 	memset(cdb, 0, ATAPI_CDB_LEN);
 	cdb[0] = REQUEST_SENSE;
 	cdb[0] = REQUEST_SENSE;
@@ -1165,8 +1166,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc,
 
 
 	case ATA_DEV_ATAPI:
 	case ATA_DEV_ATAPI:
 		if (!(qc->ap->pflags & ATA_PFLAG_FROZEN)) {
 		if (!(qc->ap->pflags & ATA_PFLAG_FROZEN)) {
-			tmp = atapi_eh_request_sense(qc->dev,
-						     qc->scsicmd->sense_buffer);
+			tmp = atapi_eh_request_sense(qc);
 			if (!tmp) {
 			if (!tmp) {
 				/* ATA_QCFLAG_SENSE_VALID is used to
 				/* ATA_QCFLAG_SENSE_VALID is used to
 				 * tell atapi_qc_complete() that sense
 				 * tell atapi_qc_complete() that sense