svn commit: r263157 - in stable/9/sys: cam/ata sys
Alexander Motin
mav at FreeBSD.org
Fri Mar 14 07:48:36 UTC 2014
Author: mav
Date: Fri Mar 14 07:48:35 2014
New Revision: 263157
URL: http://svnweb.freebsd.org/changeset/base/263157
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 at panasas.com>
Modified:
stable/9/sys/cam/ata/ata_all.c
stable/9/sys/sys/ata.h
Directory Properties:
stable/9/ (props changed)
stable/9/sys/ (props changed)
stable/9/sys/sys/ (props changed)
Modified: stable/9/sys/cam/ata/ata_all.c
==============================================================================
--- stable/9/sys/cam/ata/ata_all.c Fri Mar 14 07:47:28 2014 (r263156)
+++ stable/9/sys/cam/ata/ata_all.c Fri Mar 14 07:48:35 2014 (r263157)
@@ -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/9/sys/sys/ata.h
==============================================================================
--- stable/9/sys/sys/ata.h Fri Mar 14 07:47:28 2014 (r263156)
+++ stable/9/sys/sys/ata.h Fri Mar 14 07:48:35 2014 (r263157)
@@ -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];
More information about the svn-src-stable-9
mailing list