changeset 3821:2c5d11a65307

6498799 marvell88sx driver/hardware wedges when doing multiple concurrent tagged commands 6532076 scsi_if{get,set}cap("tagged-qing"/"untagged-qing") need to be fully supported
author ls24207
date Thu, 15 Mar 2007 08:48:31 -0700
parents 8adf9090a487
children 831cb9e53b03
files usr/src/uts/common/io/sata/impl/sata.c usr/src/uts/common/sys/sata/impl/sata.h usr/src/uts/common/sys/sata/sata_defs.h
diffstat 3 files changed, 68 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/sata/impl/sata.c	Thu Mar 15 06:16:24 2007 -0700
+++ b/usr/src/uts/common/io/sata/impl/sata.c	Thu Mar 15 08:48:31 2007 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -3123,7 +3123,7 @@
 		/* invalid address */
 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
 		    sata_device.satadev_addr.cport)));
-		return (0);
+		return (-1);
 	}
 
 	switch (scsi_hba_lookup_capstr(cap)) {
@@ -3144,26 +3144,19 @@
 	 * the way sd operates.  Because of this reason we do not
 	 * use it when available.
 	 */
-#if defined(_UNTAGGED_QING_SUPPORTED)
 	case SCSI_CAP_UNTAGGED_QING:
-		if (SATA_QDEPTH(sata_hba_inst) > 1)
-			rval = 1;	/* Untagged queuing supported */
+		if (sdinfo->satadrv_features_enabled &
+		    SATA_DEV_F_E_UNTAGGED_QING)
+			rval = 1;	/* Untagged queuing available */
 		else
-			rval = -1;	/* Untagged queuing not supported */
+			rval = -1;	/* Untagged queuing not available */
 		break;
-#endif
 
 	case SCSI_CAP_TAGGED_QING:
-		/* This can TCQ or NCQ */
-		if (sata_func_enable & SATA_ENABLE_QUEUING &&
-		    ((sdinfo->satadrv_features_support & SATA_DEV_F_TCQ &&
-		    SATA_FEATURES(sata_hba_inst) & SATA_CTLF_QCMD) ||
-		    (sata_func_enable & SATA_ENABLE_NCQ &&
-		    sdinfo->satadrv_features_support & SATA_DEV_F_NCQ &&
-		    SATA_FEATURES(sata_hba_inst) & SATA_CTLF_NCQ)))
-			rval = 1;	/* Tagged queuing supported */
+		if (sdinfo->satadrv_features_enabled & SATA_DEV_F_E_TAGGED_QING)
+			rval = 1;	/* Tagged queuing available */
 		else
-			rval = -1;	/* Tagged queuing not supported */
+			rval = -1;	/* Tagged queuing not available */
 		break;
 
 	case SCSI_CAP_DMA_MAX:
@@ -3188,19 +3181,14 @@
 
 /*
  * Implementation of scsi tran_setcap
- *
- * All supported capabilities are fixed/unchangeable.
- * Returns 0 for all supported capabilities and valid device, -1 otherwise.
  */
 static int
 sata_scsi_setcap(struct scsi_address *ap, char *cap, int value, int whom)
 {
-#ifndef __lock_lint
-	_NOTE(ARGUNUSED(value))
-#endif
 	sata_hba_inst_t	*sata_hba_inst =
 	    (sata_hba_inst_t *)(ap->a_hba_tran->tran_hba_private);
 	sata_device_t	sata_device;
+	sata_drive_info_t	*sdinfo;
 	int		rval;
 
 	SATADBG2(SATA_DBG_SCSI_IF, sata_hba_inst,
@@ -3221,11 +3209,12 @@
 	}
 	mutex_enter(&(SATA_CPORT_MUTEX(sata_hba_inst,
 	    sata_device.satadev_addr.cport)));
-	if (sata_get_device_info(sata_hba_inst, &sata_device) == NULL) {
+	if ((sdinfo = sata_get_device_info(sata_hba_inst, &sata_device))
+		== NULL) {
 		/* invalid address */
 		mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
 		    sata_device.satadev_addr.cport)));
-		return (0);
+		return (-1);
 	}
 	mutex_exit(&(SATA_CPORT_MUTEX(sata_hba_inst,
 	    sata_device.satadev_addr.cport)));
@@ -3233,15 +3222,48 @@
 	switch (scsi_hba_lookup_capstr(cap)) {
 	case SCSI_CAP_ARQ:
 	case SCSI_CAP_SECTOR_SIZE:
-	case SCSI_CAP_TAGGED_QING:
 	case SCSI_CAP_DMA_MAX:
 	case SCSI_CAP_INTERCONNECT_TYPE:
-#if defined(_UNTAGGED_QING_SUPPORTED)
+		rval = 0;
+		break;
 	case SCSI_CAP_UNTAGGED_QING:
-		rval = 0;		/* Capability cannot be changed */
+		if (SATA_QDEPTH(sata_hba_inst) > 1) {
+			rval = 1;
+			if (value == 1) {
+				sdinfo->satadrv_features_enabled |=
+					SATA_DEV_F_E_UNTAGGED_QING;
+			} else if (value == 0) {
+				sdinfo->satadrv_features_enabled &=
+					~SATA_DEV_F_E_UNTAGGED_QING;
+			} else {
+				rval = -1;
+			}
+		} else {
+			rval = 0;
+		}
 		break;
-#endif
-
+	case SCSI_CAP_TAGGED_QING:
+		/* This can TCQ or NCQ */
+		if (sata_func_enable & SATA_ENABLE_QUEUING &&
+		    ((sdinfo->satadrv_features_support & SATA_DEV_F_TCQ &&
+		    SATA_FEATURES(sata_hba_inst) & SATA_CTLF_QCMD) ||
+		    (sata_func_enable & SATA_ENABLE_NCQ &&
+		    sdinfo->satadrv_features_support & SATA_DEV_F_NCQ &&
+		    SATA_FEATURES(sata_hba_inst) & SATA_CTLF_NCQ))) {
+			rval = 1;
+			if (value == 1) {
+				sdinfo->satadrv_features_enabled |=
+					SATA_DEV_F_E_TAGGED_QING;
+			} else if (value == 0) {
+				sdinfo->satadrv_features_enabled &=
+					~SATA_DEV_F_E_TAGGED_QING;
+			} else {
+				rval = -1;
+			}
+		} else {
+			rval = 0;
+		}
+		break;
 	default:
 		rval = -1;
 		break;
--- a/usr/src/uts/common/sys/sata/impl/sata.h	Thu Mar 15 06:16:24 2007 -0700
+++ b/usr/src/uts/common/sys/sata/impl/sata.h	Thu Mar 15 08:48:31 2007 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -210,7 +210,7 @@
 	uint16_t	satadrv_features_support; /* drive features support */
 	uint16_t	satadrv_queue_depth;    /* drive queue depth */
 	uint16_t	satadrv_settings;	/* drive settings flags */
-	uint16_t	satadrv_pad2;		/* struct alignment pad */
+	uint16_t	satadrv_features_enabled; /* drive features enabled */
 	uint64_t	satadrv_capacity;	/* drive capacity */
 	sata_id_t	satadrv_id;		/* Device Identify Data */
 	struct sata_drive_stats satadrv_stats;	/* drive statistics */
@@ -327,6 +327,12 @@
 #define	SATA_DEV_F_TCQ			0x40	/* Non NCQ tagged queuing */
 
 /*
+ * Device features enabled (satadrv_features_enabled)
+ */
+#define	SATA_DEV_F_E_TAGGED_QING	0x01	/* Tagged queuing enabled */
+#define	SATA_DEV_F_E_UNTAGGED_QING	0x02	/* Untagged queuing enabled */
+
+/*
  * Drive settings flags (satdrv_settings)
  */
 #define	SATA_DEV_READ_AHEAD		0x0001	/* Read Ahead enabled */
--- a/usr/src/uts/common/sys/sata/sata_defs.h	Thu Mar 15 06:16:24 2007 -0700
+++ b/usr/src/uts/common/sys/sata/sata_defs.h	Thu Mar 15 08:48:31 2007 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -357,6 +357,14 @@
 /* SATA Features Enabled (word 79) - not used */
 
 /*
+ * Generic NCQ related defines
+ */
+
+#define	NQ			0x80	/* Not a queued cmd - tag not valid */
+#define	NCQ_TAG_MASK		0x1f	/* NCQ command tag mask */
+#define	FIS_TYPE_REG_H2D	0x27	/* Reg FIS - Host to Device */
+#define	FIS_CMD_UPDATE		0x80
+/*
  * Status bits from AT_STATUS register
  */
 #define	SATA_STATUS_BSY		0x80    /* controller busy */