diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-07-10 14:14:23 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-07-10 14:14:23 +0200 |
commit | c2fc2fad133d51bc7dc86af015a20aed11a1817f (patch) | |
tree | 8366e17787c48975b1ce1401c731d80763c94629 /sys/include | |
parent | ae00ac74659e69a1aee9dc3e3ab20d5ec70b8126 (diff) |
merge sd changes from 9atom
Diffstat (limited to 'sys/include')
-rw-r--r-- | sys/include/fis.h | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/sys/include/fis.h b/sys/include/fis.h new file mode 100644 index 000000000..9ec0ba6aa --- /dev/null +++ b/sys/include/fis.h @@ -0,0 +1,163 @@ +#pragma lib "libfis.a" +#pragma src "/sys/src/libfis" + +/* ata errors */ +enum { + Emed = 1<<0, /* media error */ + Enm = 1<<1, /* no media */ + Eabrt = 1<<2, /* abort */ + Emcr = 1<<3, /* media change request */ + Eidnf = 1<<4, /* no user-accessible address */ + Emc = 1<<5, /* media change */ + Eunc = 1<<6, /* data error */ + Ewp = 1<<6, /* write protect */ + Eicrc = 1<<7, /* interface crc error */ + + Efatal = Eidnf|Eicrc, /* must sw reset */ +}; + +/* ata status */ +enum { + ASerr = 1<<0, /* error */ + ASdrq = 1<<3, /* request */ + ASdf = 1<<5, /* fault */ + ASdrdy = 1<<6, /* ready */ + ASbsy = 1<<7, /* busy */ + + ASobs = 1<<1|1<<2|1<<4, +}; + +enum { + /* fis types */ + H2dev = 0x27, + D2host = 0x34, + + /* fis flags bits */ + Fiscmd = 0x80, + + /* ata bits */ + Ataobs = 0xa0, + Atalba = 0x40, + + /* nominal fis size (fits any fis) */ + Fissize = 0x20, +}; + +/* sata device-to-host (0x27) fis layout */ +enum { + Ftype, + Fflags, + Fcmd, + Ffeat, + Flba0, + Flba8, + Flba16, + Fdev, + Flba24, + Flba32, + Flba40, + Ffeat8, + Fsc, + Fsc8, + Ficc, /* isochronous cmd completion */ + Fcontrol, +}; + +/* sata host-to-device fis (0x34) differences */ +enum{ + Fioport = 1, + Fstatus, + Frerror, +}; + +/* ata protcol type */ +enum{ + Pnd = 0<<0, /* data direction */ + Pin = 1<<0, + Pout = 2<<0, + Pdatam = 3<<0, + + Ppio = 1<<2, /* ata protocol */ + Pdma = 2<<2, + Pdmq = 3<<2, + Preset = 4<<2, + Pdiag = 5<<2, + Ppkt = 6<<2, + Pprotom = 7<<2, + + P48 = 0<<5, /* command “size” */ + P28 = 1<<5, + Pcmdszm = 1<<5, + + Pssn = 0<<6, /* sector size */ + P512 = 1<<6, + Pssm = 1<<6, +}; + +typedef struct Sfis Sfis; +struct Sfis { + ushort feat; + uchar udma; + uchar speeds; + uint sig; + uint lsectsz; + uint physshift; /* log2(log/phys) */ + uint c; /* disgusting, no? */ + uint h; + uint s; +}; + +enum { + Dlba = 1<<0, /* required for sata */ + Dllba = 1<<1, + Dsmart = 1<<2, + Dpower = 1<<3, + Dnop = 1<<4, + Datapi = 1<<5, + Datapi16= 1<<6, + Data8 = 1<<7, + Dsct = 1<<8, + Dnflag = 9, +}; + +enum { + Pspinup = 1<<0, + Pidready = 1<<1, +}; + +void setfissig(Sfis*, uint); +int txmodefis(Sfis*, uchar*, uchar); +int atapirwfis(Sfis*, uchar*, uchar*, int, int); +int featfis(Sfis*, uchar*, uchar); +int flushcachefis(Sfis*, uchar*); +int identifyfis(Sfis*, uchar*); +int nopfis(Sfis*, uchar*, int); +int rwfis(Sfis*, uchar*, int, int, uvlong); +void skelfis(uchar*); +void sigtofis(Sfis*, uchar*); +uvlong fisrw(Sfis*, uchar*, int*); + +void idmove(char*, ushort*, int); +vlong idfeat(Sfis*, ushort*); +uvlong idwwn(Sfis*, ushort*); +int idss(Sfis*, ushort*); +int idpuis(ushort*); +ushort id16(ushort*, int); +uint id32(ushort*, int); +uvlong id64(ushort*, int); +char *pflag(char*, char*, Sfis*); +uint fistosig(uchar*); + +/* scsi */ +typedef struct Cfis Cfis; +struct Cfis { + uchar phyid; + uchar encid[8]; + uchar tsasaddr[8]; + uchar ssasaddr[8]; + uchar ict[2]; +}; + +void smpskelframe(Cfis*, uchar*, int); +uint sashash(uvlong); +uchar *sasbhash(uchar*, uchar*); |