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 <rpok...@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];
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to