linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Eric A. Cottrell" <eac@shore.net>
To: Jeff Garzik <jgarzik@pobox.com>
Cc: Linux IDE <linux-ide@vger.kernel.org>
Subject: Re: [PATCH 2.6.12-rc2 2/2] libata: add basic atapi error reporting
Date: Sat, 16 Apr 2005 21:55:23 -0400	[thread overview]
Message-ID: <4261C20B.7010403@shore.net> (raw)

Hello Jeff,

Problem:
ATAPI errors are not fully reported to the SCSI subsystem.  A check condition was returned but the SCSI subsystem does not get the 
sense from the device.  This causes problems when unimplemented and bad SCSI commands are sent to an atapi device.

Solution:
In libata-scsi.c add a function that reads the error register and translates it to a basic sense block.  The error register on ATAPI 
devices contains the sense key, ILI, and EOM bits. These are the same as the third byte of a SCSI sense block.  Call the function 
when there is an ATAPI error.


Signed-off-by: Eric A. Cottrell  eac@shore.net



--- a/drivers/scsi/libata-scsi.c	2005-04-09 19:34:35.000000000 -0400
+++ b/drivers/scsi/libata-scsi.c	2005-04-16 19:40:14.000000000 -0400
@@ -613,6 +613,38 @@
  		sb[6] = tf->lbal;
  	}
  }
+/**
+ *	ata_gen_atapi_sense - generate a SCSI fixed sense block from ATAPI error
+ *	@qc: Command that we are erroring out
+ *
+ *
+ *	LOCKING:
+ *	inherited from caller
+ */
+void ata_gen_atapi_sense(struct ata_queued_cmd *qc)
+{
+	struct scsi_cmnd *cmd = qc->scsicmd;
+	struct ata_taskfile *tf = &qc->tf;
+	unsigned char *sb = cmd->sense_buffer;
+
+	memset(sb, 0, SCSI_SENSE_BUFFERSIZE);
+
+	cmd->result = SAM_STAT_CHECK_CONDITION;
+
+	/*
+	 * Read the controller registers.
+	 */
+	assert(NULL != qc->ap->ops->tf_read);
+	qc->ap->ops->tf_read(qc->ap, tf);
+
+	if (unlikely(tf->command & (ATA_BUSY | ATA_DF | ATA_ERR | ATA_DRQ))) {
+		sb[2] = (tf->feature >> 4) & 0x0f;  // Get sense key
+		sb[2] |= ((tf->feature & 0x3) << 5); // Get ILI and EOM
+	}
+
+	sb[0] = 0x70;
+	sb[7] = 0x00;  // No additional sense bytes
+}

  /**
   *	ata_scsi_slave_config - Set SCSI device attributes
@@ -1659,13 +1691,8 @@
  	struct scsi_cmnd *cmd = qc->scsicmd;

  	if (unlikely(drv_stat & (ATA_ERR | ATA_BUSY | ATA_DRQ))) {
-		DPRINTK("request check condition\n");
-
-		cmd->result = SAM_STAT_CHECK_CONDITION;
-
-		qc->scsidone(cmd);
-
-		return 1;
+		DPRINTK("generate atapi sense\n");
+		ata_gen_atapi_sense(qc);
  	} else {
  		u8 *scsicmd = cmd->cmnd;

             reply	other threads:[~2005-04-17  1:55 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-04-17  1:55 Eric A. Cottrell [this message]
2005-05-16  2:43 ` [PATCH 2.6.12-rc2 2/2] libata: add basic atapi error reporting Jeff Garzik
2005-05-16 13:24   ` Mark Lord
2005-05-17  3:02   ` Eric A. Cottrell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4261C20B.7010403@shore.net \
    --to=eac@shore.net \
    --cc=jgarzik@pobox.com \
    --cc=linux-ide@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).