sd.h 2.4 KB

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