sd.h - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       sd.h (2656B)
       ---
            1 /*
            2  * Storage Device.
            3  */
            4 typedef struct SDev SDev;
            5 typedef struct SDifc SDifc;
            6 typedef struct SDpart SDpart;
            7 typedef struct SDperm SDperm;
            8 typedef struct SDreq SDreq;
            9 typedef struct SDunit SDunit;
           10 
           11 struct SDperm {
           12         char*        name;
           13         char*        user;
           14         ulong        perm;
           15 };
           16 
           17 struct SDpart {
           18         uvlong        start;
           19         uvlong        end;
           20         SDperm perm;
           21         int        valid;
           22         ulong        vers;
           23 };
           24 
           25 struct SDunit {
           26         SDev*        dev;
           27         int        subno;
           28         uchar        inquiry[255];                /* format follows SCSI spec */
           29         uchar        sense[18];                /* format follows SCSI spec */
           30         SDperm perm;
           31 
           32         QLock        ctl;
           33         uvlong        sectors;
           34         ulong        secsize;
           35         SDpart*        part;                        /* nil or array of size npart */
           36         int        npart;
           37         ulong        vers;
           38         SDperm        ctlperm;
           39 
           40         QLock        raw;                        /* raw read or write in progress */
           41         ulong        rawinuse;                /* really just a test-and-set */
           42         int        state;
           43         SDreq*        req;
           44         SDperm        rawperm;
           45 };
           46 
           47 /*
           48  * Each controller is represented by a SDev.
           49  */
           50 struct SDev {
           51         Ref        r;                        /* Number of callers using device */
           52         SDifc*        ifc;                        /* pnp/legacy */
           53         void*        ctlr;
           54         int        idno;
           55         char        name[8];
           56         SDev*        next;
           57 
           58         QLock lk;                                /* enable/disable */
           59         int        enabled;
           60         int        nunit;                        /* Number of units */
           61         QLock        unitlock;                /* `Loading' of units */
           62         int*        unitflg;                /* Unit flags */
           63         SDunit**unit;
           64 };
           65 
           66 struct SDifc {
           67         char*        name;
           68 
           69         SDev*        (*pnp)(void);
           70         SDev*        (*legacy)(int, int);
           71         int        (*enable)(SDev*);
           72         int        (*disable)(SDev*);
           73 
           74         int        (*verify)(SDunit*);
           75         int        (*online)(SDunit*);
           76         int        (*rio)(SDreq*);
           77         int        (*rctl)(SDunit*, char*, int);
           78         int        (*wctl)(SDunit*, Cmdbuf*);
           79 
           80         long        (*bio)(SDunit*, int, int, void*, long, uvlong);
           81         SDev*        (*probe)(DevConf*);
           82         void        (*clear)(SDev*);
           83         char*        (*rtopctl)(SDev*, char*, char*);
           84         int        (*wtopctl)(SDev*, Cmdbuf*);
           85 };
           86 
           87 struct SDreq {
           88         SDunit*        unit;
           89         int        lun;
           90         int        write;
           91         uchar        cmd[16];
           92         int        clen;
           93         void*        data;
           94         int        dlen;
           95 
           96         int        flags;
           97 
           98         int        status;
           99         long        rlen;
          100         uchar        sense[256];
          101 };
          102 
          103 enum {
          104         SDnosense        = 0x00000001,
          105         SDvalidsense        = 0x00010000,
          106 };
          107 
          108 enum {
          109         SDretry                = -5,                /* internal to controllers */
          110         SDmalloc        = -4,
          111         SDeio                = -3,
          112         SDtimeout        = -2,
          113         SDnostatus        = -1,
          114 
          115         SDok                = 0,
          116 
          117         SDcheck                = 0x02,                /* check condition */
          118         SDbusy                = 0x08,                /* busy */
          119 
          120         SDmaxio                = 2048*1024,
          121         SDnpart                = 16,
          122 };
          123 
          124 #define sdmalloc(n)        malloc(n)
          125 #define sdfree(p)        free(p)
          126 
          127 /* devsd.c */
          128 extern void sdadddevs(SDev*);
          129 extern int sdsetsense(SDreq*, int, int, int, int);
          130 extern int sdmodesense(SDreq*, uchar*, void*, int);
          131 extern int sdfakescsi(SDreq*, void*, int);
          132 extern void sdaddpart(SDunit*, char*, uvlong, uvlong);
          133 extern SDpart* sdfindpart(SDunit*, char*);
          134 
          135 /* sdscsi.c */
          136 extern int scsiverify(SDunit*);
          137 extern int scsionline(SDunit*);
          138 extern long scsibio(SDunit*, int, int, void*, long, uvlong);
          139 extern SDev* scsiid(SDev*, SDifc*);
          140 
          141 /* part.c */
          142 extern void partition(SDunit*);