Mercurial > illumos > illumos-gate
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 */