diff options
author | google <google@daverabbitz.ath.cx> | 2012-09-09 17:22:12 +1200 |
---|---|---|
committer | google <google@daverabbitz.ath.cx> | 2012-09-09 17:22:12 +1200 |
commit | dd1b8df8808df4fe295a90ab494da90162c5654f (patch) | |
tree | eabbba5b00e6a1288001f4fb8ae5a5ee667cc234 /sys/src/libfis/fis.c | |
parent | aead11533ec4d17f4382b1e10f850042391bccb2 (diff) |
Add alignment hints for e512 ATA drives.
Diffstat (limited to 'sys/src/libfis/fis.c')
-rw-r--r-- | sys/src/libfis/fis.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/sys/src/libfis/fis.c b/sys/src/libfis/fis.c index cb6c73407..c04b327ad 100644 --- a/sys/src/libfis/fis.c +++ b/sys/src/libfis/fis.c @@ -307,20 +307,24 @@ idfeat(Sfis *f, ushort *id) int idss(Sfis *f, ushort *id) { - uint sw, i; + uint sw, i, pa; if(f->sig>>16 == 0xeb14) return 0; f->lsectsz = 512; f->physshift = 0; + f->physalign = 0; i = gbit16(id + 106); if(i >> 14 != 1) return f->lsectsz; - if((sw = gbit32(id + 117)) >= 256) + if((i & (1<<12)) && (sw = gbit32(id + 117)) >= 256) f->lsectsz = sw * 2; - if(i & 1<<13) + if(i & 1<<13){ f->physshift = i & 7; - return f->lsectsz * (1<<f->physshift); + if((pa = gbit16(id + 209)) & 0x4000) + f->physalign = pa & 0x3fff; + } + return f->lsectsz; } uvlong |