summaryrefslogtreecommitdiff
path: root/os/port/sd.h
diff options
context:
space:
mode:
Diffstat (limited to 'os/port/sd.h')
-rw-r--r--os/port/sd.h132
1 files changed, 132 insertions, 0 deletions
diff --git a/os/port/sd.h b/os/port/sd.h
new file mode 100644
index 00000000..a469cff6
--- /dev/null
+++ b/os/port/sd.h
@@ -0,0 +1,132 @@
+/*
+ * Storage Device.
+ */
+typedef struct SDev SDev;
+typedef struct SDifc SDifc;
+typedef struct SDpart SDpart;
+typedef struct SDperm SDperm;
+typedef struct SDreq SDreq;
+typedef struct SDunit SDunit;
+
+struct SDperm {
+ char* name;
+ char* user;
+ ulong perm;
+};
+
+struct SDpart {
+ ulong start;
+ ulong end;
+ SDperm;
+ int valid;
+ ulong vers;
+};
+
+struct SDunit {
+ SDev* dev;
+ int subno;
+ uchar inquiry[256]; /* format follows SCSI spec */
+ SDperm;
+
+ QLock ctl;
+ ulong sectors;
+ ulong secsize;
+ SDpart* part; /* nil or array of size npart */
+ int npart;
+ ulong vers;
+ SDperm ctlperm;
+
+ QLock raw; /* raw read or write in progress */
+ ulong rawinuse; /* really just a test-and-set */
+ int state;
+ SDreq* req;
+ SDperm rawperm;
+};
+
+/*
+ * Each controller is represented by a SDev.
+ * Each controller is responsible for allocating its unit structures.
+ * Each controller has at least one unit.
+ */
+struct SDev {
+ Ref r; /* Number of callers using device */
+ SDifc* ifc; /* pnp/legacy */
+ void* ctlr;
+ int idno;
+ char* name;
+ SDev* next;
+
+ QLock; /* enable/disable */
+ int enabled;
+ int nunit; /* Number of units */
+ QLock unitlock; /* `Loading' of units */
+ int* unitflg; /* Unit flags */
+ SDunit**unit;
+};
+
+struct SDifc {
+ char* name;
+
+ SDev* (*pnp)(void);
+ SDev* (*legacy)(int, int);
+ SDev* (*id)(SDev*);
+ int (*enable)(SDev*);
+ int (*disable)(SDev*);
+
+ int (*verify)(SDunit*);
+ int (*online)(SDunit*);
+ int (*rio)(SDreq*);
+ int (*rctl)(SDunit*, char*, int);
+ int (*wctl)(SDunit*, Cmdbuf*);
+
+ long (*bio)(SDunit*, int, int, void*, long, long);
+ SDev* (*probe)(DevConf*);
+ void (*clear)(SDev*);
+ char* (*stat)(SDev*, char*, char*);
+};
+
+struct SDreq {
+ SDunit* unit;
+ int lun;
+ int write;
+ uchar cmd[16];
+ int clen;
+ void* data;
+ int dlen;
+
+ int flags;
+
+ int status;
+ long rlen;
+ uchar sense[256];
+};
+
+enum {
+ SDnosense = 0x00000001,
+ SDvalidsense = 0x00010000,
+};
+
+enum {
+ SDretry = -5, /* internal to controllers */
+ SDmalloc = -4,
+ SDeio = -3,
+ SDtimeout = -2,
+ SDnostatus = -1,
+
+ SDok = 0,
+
+ SDcheck = 0x02, /* check condition */
+ SDbusy = 0x08, /* busy */
+
+ SDmaxio = 2048*1024,
+ SDnpart = 16,
+};
+
+#define sdmalloc(n) malloc(n)
+#define sdfree(p) free(p)
+
+/* sdscsi.c */
+extern int scsiverify(SDunit*);
+extern int scsionline(SDunit*);
+extern long scsibio(SDunit*, int, int, void*, long, long);
+extern SDev* scsiid(SDev*, SDifc*);