]> git.lizzy.rs Git - plan9front.git/blob - sys/include/fis.h
snoopy(8): avoid extra spaces in dhcp filter output
[plan9front.git] / sys / include / fis.h
1 #pragma lib     "libfis.a"
2 #pragma src     "/sys/src/libfis"
3
4 /* ata errors */
5 enum {
6         Emed    = 1<<0,         /* media error */
7         Enm     = 1<<1,         /* no media */
8         Eabrt   = 1<<2,         /* abort */
9         Emcr    = 1<<3,         /* media change request */
10         Eidnf   = 1<<4,         /* no user-accessible address */
11         Emc     = 1<<5,         /* media change */
12         Eunc    = 1<<6,         /* data error */
13         Ewp     = 1<<6,         /* write protect */
14         Eicrc   = 1<<7,         /* interface crc error */
15
16         Efatal  = Eidnf|Eicrc,  /* must sw reset */
17 };
18
19 /* ata status */
20 enum {
21         ASerr   = 1<<0,         /* error */
22         ASdrq   = 1<<3,         /* request */
23         ASdf    = 1<<5,         /* fault */
24         ASdrdy  = 1<<6,         /* ready */
25         ASbsy   = 1<<7,         /* busy */
26
27         ASobs   = 1<<1|1<<2|1<<4,
28 };
29
30 enum {
31         /* fis types */
32         H2dev           = 0x27,
33         D2host          = 0x34,
34
35         /* fis flags bits */
36         Fiscmd          = 0x80,
37
38         /* ata bits */
39         Ataobs          = 0xa0,
40         Atalba          = 0x40,
41
42         /* nominal fis size (fits any fis) */
43         Fissize         = 0x20,
44 };
45
46 /* sata device-to-host (0x27) fis layout */
47 enum {
48         Ftype,
49         Fflags,
50         Fcmd,
51         Ffeat,
52         Flba0,
53         Flba8,
54         Flba16,
55         Fdev,
56         Flba24,
57         Flba32,
58         Flba40,
59         Ffeat8,
60         Fsc,
61         Fsc8,
62         Ficc,           /* isochronous cmd completion */
63         Fcontrol,
64 };
65
66 /* sata host-to-device fis (0x34) differences */
67 enum{
68         Fioport = 1,
69         Fstatus,
70         Frerror,
71 };
72
73 /* ata protcol type */
74 enum{
75         Pnd     = 0<<0, /* data direction */
76         Pin     = 1<<0,
77         Pout    = 2<<0,
78         Pdatam  = 3<<0,
79
80         Ppio    = 1<<2, /* ata protocol */
81         Pdma    = 2<<2,
82         Pdmq    = 3<<2,
83         Preset  = 4<<2,
84         Pdiag   = 5<<2,
85         Ppkt    = 6<<2,
86         Pprotom = 7<<2,
87
88         P48     = 0<<5, /* command “size” */
89         P28     = 1<<5,
90         Pcmdszm = 1<<5,
91
92         Pssn    = 0<<6, /* sector size */
93         P512    = 1<<6,
94         Pssm    = 1<<6,
95 };
96
97 typedef struct Sfis Sfis;
98 struct Sfis {
99         ushort  feat;
100         uchar   udma;
101         uchar   speeds;
102         uint    sig;
103         uint    lsectsz;
104         uint    physshift;      /* log2(log/phys) */
105         uint    physalign; /* location of lba0 within phys0 */
106         uint    c;              /* disgusting, no? */
107         uint    h;
108         uint    s;
109 };
110
111 enum {
112         Dlba    = 1<<0, /* required for sata */
113         Dllba   = 1<<1,
114         Dsmart  = 1<<2,
115         Dpower  = 1<<3,
116         Dnop    = 1<<4,
117         Datapi  = 1<<5,
118         Datapi16= 1<<6,
119         Data8   = 1<<7,
120         Dsct    = 1<<8,
121         Dnflag  = 9,
122 };
123
124 enum {
125         Pspinup = 1<<0,
126         Pidready        = 1<<1,
127 };
128
129 void    setfissig(Sfis*, uint);
130 int     txmodefis(Sfis*, uchar*, uchar);
131 int     atapirwfis(Sfis*, uchar*, uchar*, int, int);
132 int     featfis(Sfis*, uchar*, uchar);
133 int     flushcachefis(Sfis*, uchar*);
134 int     identifyfis(Sfis*, uchar*);
135 int     nopfis(Sfis*, uchar*, int);
136 int     rwfis(Sfis*, uchar*, int, int, uvlong);
137 void    skelfis(uchar*);
138 void    sigtofis(Sfis*, uchar*);
139 uvlong  fisrw(Sfis*, uchar*, int*);
140
141 void    idmove(char*, ushort*, int);
142 vlong   idfeat(Sfis*, ushort*);
143 uvlong  idwwn(Sfis*, ushort*);
144 int     idss(Sfis*, ushort*);
145 int     idpuis(ushort*);
146 ushort  id16(ushort*, int);
147 uint    id32(ushort*, int);
148 uvlong  id64(ushort*, int);
149 char    *pflag(char*, char*, Sfis*);
150 uint    fistosig(uchar*);
151
152 /* scsi */
153 typedef struct Cfis Cfis;
154 struct Cfis {
155         uchar   phyid;
156         uchar   encid[8];
157         uchar   tsasaddr[8];
158         uchar   ssasaddr[8];
159         uchar   ict[2];
160 };
161
162 void    smpskelframe(Cfis*, uchar*, int);
163 uint    sashash(uvlong);
164 uchar   *sasbhash(uchar*, uchar*);