handle 512e scsi drives as 4k sectors drives. handle 12gbps scsi minor cleanup Reference: /n/atom/patch/applied2013/sdfis512e Date: Thu Nov 14 23:19:57 CET 2013 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/port/sdatafis.c Thu Nov 14 23:19:03 2013 +++ /sys/src/nix/port/sdatafis.c Thu Nov 14 23:19:03 2013 @@ -53,7 +53,7 @@ } static int -setfeatures(SDunit *u, Sfis *f, uchar x, uint w) +setfeatures(SDunit *u, Sfis *f, uchar x, uint ms) { SDreq r; @@ -61,7 +61,7 @@ r.unit = u; r.clen = 16; r.ataproto = featfis(f, r.cmd, x); - r.timeout = totk(w); + r.timeout = totk(Ms2tk(ms)); return reqio(&r); } --- /sys/src/nix/port/sdscsifis.c Thu Nov 14 23:19:03 2013 +++ /sys/src/nix/port/sdscsifis.c Thu Nov 14 23:19:03 2013 @@ -422,8 +422,16 @@ static int chkcapacity16(uchar *p, uvlong *ns, uint *nss) { + uint l2p; + *ns = getbe(p, 8); *nss = getbe(p + 8, 4); + l2p = p[13]&7; + if(l2p != 0){ + /* 512e drive; use physical sector size */ + *ns >>= l2p; + *nss <<= l2p; + } return 0; } @@ -433,7 +441,8 @@ char *s; }; Spdtab spdtab[] = { -[1] Spd60, "6.0gbps", +[1] Spd120, "12gbps", + Spd60, "6.0gbps", Spd30, "3.0gbps", Spd15, "1.5gbps", }; --- /sys/src/9/port/sdatafis.c Thu Nov 14 23:19:03 2013 +++ /sys/src/9/port/sdatafis.c Thu Nov 14 23:19:03 2013 @@ -12,7 +12,7 @@ #include "../port/error.h" #include "../port/sd.h" #include -#include "sdfis.h" +#include "../port/sdfis.h" #define reqio(r) (r)->unit->dev->ifc->ataio(r) #define dprint(...) print(__VA_ARGS__) @@ -158,7 +158,7 @@ t = ""; if(f->drivechange) t = "[newdrive]"; - print("%s: %s %,lld sectors\n", dnam(u), s, f->sectors); + print("%s: %s %,lld %ld-byte sectors\n", dnam(u), s, f->sectors, f->secsize); print(" %s %s %s %s\n", f->model, f->firmware, f->serial, t); } --- /sys/src/9/port/sdscsifis.c Thu Nov 14 23:19:03 2013 +++ /sys/src/9/port/sdscsifis.c Thu Nov 14 23:19:03 2013 @@ -12,10 +12,10 @@ #include "../port/error.h" #include "../port/sd.h" #include -#include "sdfis.h" +#include "../port/sdfis.h" #define reqio(r) (r)->unit->dev->ifc->rio(r) -#define dprint(...) print(__VA_ARGS__) +#define dprint(...) do{if(0)print(__VA_ARGS__);}while(0); #define Ticks MACHP(0)->ticks #define generror(...) snprint(up->genbuf, sizeof up->genbuf, __VA_ARGS__) @@ -422,8 +422,16 @@ static int chkcapacity16(uchar *p, uvlong *ns, uint *nss) { + uint l2p; + *ns = getbe(p, 8); *nss = getbe(p + 8, 4); + l2p = p[13]&7; + if(l2p != 0){ + /* 512e drive; use physical sector size */ + *ns >>= l2p; + *nss <<= l2p; + } return 0; } @@ -433,7 +441,8 @@ char *s; }; Spdtab spdtab[] = { -[1] Spd60, "6.0gbps", +[1] Spd120, "12gbps", + Spd60, "6.0gbps", Spd30, "3.0gbps", Spd15, "1.5gbps", }; @@ -456,7 +465,7 @@ f->sasspd = i; return SDok; } - dprint("%s: key is %d / key=%.6ux\n", unam(u), key, key); + dprint("%s: key %.6ux\n", unam(u), key); if(key != SDrate || ++i == nelem(spdtab)) return r; }