Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Mar 2014 07:47:29 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r263156 - in stable/10/sys: cam/ata sys
Message-ID:  <201403140747.s2E7lT8t053721@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Fri Mar 14 07:47:28 2014
New Revision: 263156
URL: http://svnweb.freebsd.org/changeset/base/263156

Log:
  MFC r262886:
  Fix support for increased logical sector size (4K-native drives).
  
  - Logical sector size is measured in words, not bytes.
  - If physical sector is not bigger then logical sector, it does not mean
  it should be set equal to 512 bytes, but set to logical sector.
  
  PR:		misc/187269
  Submitted by:	Ravi Pokala <rpokala@panasas.com>

Modified:
  stable/10/sys/cam/ata/ata_all.c
  stable/10/sys/sys/ata.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/cam/ata/ata_all.c
==============================================================================
--- stable/10/sys/cam/ata/ata_all.c	Fri Mar 14 07:11:33 2014	(r263155)
+++ stable/10/sys/cam/ata/ata_all.c	Fri Mar 14 07:47:28 2014	(r263156)
@@ -338,10 +338,10 @@ semb_print_ident_short(struct sep_identi
 uint32_t
 ata_logical_sector_size(struct ata_params *ident_data)
 {
-	if ((ident_data->pss & 0xc000) == 0x4000 &&
+	if ((ident_data->pss & ATA_PSS_VALID_MASK) == ATA_PSS_VALID_VALUE &&
 	    (ident_data->pss & ATA_PSS_LSSABOVE512)) {
-		return ((u_int32_t)ident_data->lss_1 |
-		    ((u_int32_t)ident_data->lss_2 << 16));
+		return (((u_int32_t)ident_data->lss_1 |
+		    ((u_int32_t)ident_data->lss_2 << 16)) * 2);
 	}
 	return (512);
 }
@@ -349,10 +349,13 @@ ata_logical_sector_size(struct ata_param
 uint64_t
 ata_physical_sector_size(struct ata_params *ident_data)
 {
-	if ((ident_data->pss & 0xc000) == 0x4000 &&
-	    (ident_data->pss & ATA_PSS_MULTLS)) {
-		return ((uint64_t)ata_logical_sector_size(ident_data) *
-		    (1 << (ident_data->pss & ATA_PSS_LSPPS)));
+	if ((ident_data->pss & ATA_PSS_VALID_MASK) == ATA_PSS_VALID_VALUE) {
+		if (ident_data->pss & ATA_PSS_MULTLS) {
+			return ((uint64_t)ata_logical_sector_size(ident_data) *
+			    (1 << (ident_data->pss & ATA_PSS_LSPPS)));
+		} else {
+			return (uint64_t)ata_logical_sector_size(ident_data);
+		}
 	}
 	return (512);
 }

Modified: stable/10/sys/sys/ata.h
==============================================================================
--- stable/10/sys/sys/ata.h	Fri Mar 14 07:11:33 2014	(r263155)
+++ stable/10/sys/sys/ata.h	Fri Mar 14 07:47:28 2014	(r263156)
@@ -214,6 +214,8 @@ struct ata_params {
 #define ATA_PSS_LSPPS			0x000F
 #define ATA_PSS_LSSABOVE512		0x1000
 #define ATA_PSS_MULTLS			0x2000
+#define ATA_PSS_VALID_MASK		0xC000
+#define ATA_PSS_VALID_VALUE		0x4000
 /*107*/ u_int16_t       isd;
 /*108*/ u_int16_t       wwn[4];
 	u_int16_t       reserved112[5];



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201403140747.s2E7lT8t053721>