diff options
author | Igor Kozhukhov <igork@argotech.io> | 2016-08-19 17:38:50 +0300 |
---|---|---|
committer | Robert Mustacchi <rm@joyent.com> | 2016-08-25 10:17:04 -0700 |
commit | fbc2697c538d75e4d5d938d24a995afa043c99d2 (patch) | |
tree | a2ba4d4ef9103afb4ee9b47cf8891ab5c80e7caa /usr/src | |
parent | 910f0d12b47aeda4ed059254cc4af0d8c272d0ba (diff) | |
download | illumos-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.c | 42 |
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; */ |