summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorIgor Kozhukhov <igork@argotech.io>2016-08-19 17:38:50 +0300
committerRobert Mustacchi <rm@joyent.com>2016-08-25 10:17:04 -0700
commitfbc2697c538d75e4d5d938d24a995afa043c99d2 (patch)
treea2ba4d4ef9103afb4ee9b47cf8891ab5c80e7caa /usr/src
parent910f0d12b47aeda4ed059254cc4af0d8c272d0ba (diff)
downloadillumos-joyent-fbc2697c538d75e4d5d938d24a995afa043c99d2.tar.gz
7286 sata doesn't support 4knative disks
Reviewed by: Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org> Reviewed by: Garrett D'Amore <garrett@damore.org> Reviewed by: Andy Stormont <astormont@racktopsystems.com> Approved by: Robert Mustacchi <rm@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/io/sata/impl/sata.c42
1 files changed, 31 insertions, 11 deletions
diff --git a/usr/src/uts/common/io/sata/impl/sata.c b/usr/src/uts/common/io/sata/impl/sata.c
index 66c141bf83..c4013d0efd 100644
--- a/usr/src/uts/common/io/sata/impl/sata.c
+++ b/usr/src/uts/common/io/sata/impl/sata.c
@@ -24,6 +24,7 @@
*/
/*
* Copyright 2015 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2016 Argo Technologies SA
*/
/*
@@ -4516,6 +4517,7 @@ sata_txlt_read_capacity(sata_pkt_txlate_t *spx)
struct buf *bp = spx->txlt_sata_pkt->satapkt_cmd.satacmd_bp;
sata_drive_info_t *sdinfo;
uint64_t val;
+ uint32_t lbsize = DEV_BSIZE;
uchar_t *rbuf;
int rval, reason;
kmutex_t *cport_mutex = &(SATA_TXLT_CPORT_MUTEX(spx));
@@ -4554,17 +4556,28 @@ sata_txlt_read_capacity(sata_pkt_txlate_t *spx)
*/
val = MIN(sdinfo->satadrv_capacity - 1, UINT32_MAX);
+ if (sdinfo->satadrv_id.ai_phys_sect_sz & SATA_L2PS_CHECK_BIT) {
+ /* physical/logical sector size word is valid */
+
+ if (sdinfo->satadrv_id.ai_phys_sect_sz &
+ SATA_L2PS_BIG_SECTORS) {
+ /* if this set 117-118 words are valid */
+ lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
+ (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
+ lbsize <<= 1; /* convert from words to bytes */
+ }
+ }
rbuf = (uchar_t *)bp->b_un.b_addr;
/* Need to swap endians to match scsi format */
rbuf[0] = (val >> 24) & 0xff;
rbuf[1] = (val >> 16) & 0xff;
rbuf[2] = (val >> 8) & 0xff;
rbuf[3] = val & 0xff;
- /* block size - always 512 bytes, for now */
- rbuf[4] = 0;
- rbuf[5] = 0;
- rbuf[6] = 0x02;
- rbuf[7] = 0;
+ rbuf[4] = (lbsize >> 24) & 0xff;
+ rbuf[5] = (lbsize >> 16) & 0xff;
+ rbuf[6] = (lbsize >> 8) & 0xff;
+ rbuf[7] = lbsize & 0xff;
+
scsipkt->pkt_state |= STATE_XFERRED_DATA;
scsipkt->pkt_resid = 0;
@@ -4614,6 +4627,7 @@ sata_txlt_read_capacity16(sata_pkt_txlate_t *spx)
sata_drive_info_t *sdinfo;
uint64_t val;
uint16_t l2p_exp;
+ uint32_t lbsize = DEV_BSIZE;
uchar_t *rbuf;
int rval, reason;
#define TPE 0x80
@@ -4697,6 +4711,14 @@ sata_txlt_read_capacity16(sata_pkt_txlate_t *spx)
sdinfo->satadrv_id.ai_phys_sect_sz &
SATA_L2PS_EXP_MASK;
}
+
+ if (sdinfo->satadrv_id.ai_phys_sect_sz &
+ SATA_L2PS_BIG_SECTORS) {
+ /* if this set 117-118 words are valid */
+ lbsize = sdinfo->satadrv_id.ai_words_lsec[0] |
+ (sdinfo->satadrv_id.ai_words_lsec[1] << 16);
+ lbsize <<= 1; /* convert from words to bytes */
+ }
}
rbuf = (uchar_t *)bp->b_un.b_addr;
@@ -4711,12 +4733,10 @@ sata_txlt_read_capacity16(sata_pkt_txlate_t *spx)
rbuf[5] = (val >> 16) & 0xff;
rbuf[6] = (val >> 8) & 0xff;
rbuf[7] = val & 0xff;
-
- /* logical block length in bytes = 512 (for now) */
- /* rbuf[8] = 0; */
- /* rbuf[9] = 0; */
- rbuf[10] = 0x02;
- /* rbuf[11] = 0; */
+ rbuf[8] = (lbsize >> 24) & 0xff;
+ rbuf[9] = (lbsize >> 16) & 0xff;
+ rbuf[10] = (lbsize >> 8) & 0xff;
+ rbuf[11] = lbsize & 0xff;
/* p_type, prot_en, unspecified by SAT-2 */
/* rbuf[12] = 0; */