summaryrefslogtreecommitdiff
path: root/sys/src/libfis
diff options
context:
space:
mode:
authorgoogle <google@daverabbitz.ath.cx>2012-09-09 17:22:12 +1200
committergoogle <google@daverabbitz.ath.cx>2012-09-09 17:22:12 +1200
commitdd1b8df8808df4fe295a90ab494da90162c5654f (patch)
treeeabbba5b00e6a1288001f4fb8ae5a5ee667cc234 /sys/src/libfis
parentaead11533ec4d17f4382b1e10f850042391bccb2 (diff)
Add alignment hints for e512 ATA drives.
Diffstat (limited to 'sys/src/libfis')
-rw-r--r--sys/src/libfis/fis.c12
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