sd.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /*
  2. * Storage Device.
  3. */
  4. typedef struct SDev SDev;
  5. typedef struct SDifc SDifc;
  6. typedef struct SDpart SDpart;
  7. typedef struct SDreq SDreq;
  8. typedef struct SDunit SDunit;
  9. typedef struct SDpart {
  10. ulong start;
  11. ulong end;
  12. char name[NAMELEN];
  13. char user[NAMELEN];
  14. ulong perm;
  15. int valid;
  16. void *crud;
  17. } SDpart;
  18. typedef struct SDunit {
  19. SDev* dev;
  20. int subno;
  21. uchar inquiry[256]; /* format follows SCSI spec */
  22. char name[NAMELEN];
  23. // Rendez rendez;
  24. // QLock ctl;
  25. ulong sectors;
  26. ulong secsize;
  27. SDpart* part;
  28. int npart; /* of valid partitions */
  29. int changed;
  30. // QLock raw;
  31. int state;
  32. ulong pid;
  33. SDreq* req;
  34. } SDunit;
  35. typedef struct SDev {
  36. SDifc* ifc; /* pnp/legacy */
  37. void *ctlr;
  38. int idno;
  39. int index; /* into unit space */
  40. int nunit;
  41. SDev* next;
  42. // QLock; /* enable/disable */
  43. int enabled;
  44. } SDev;
  45. typedef struct SDifc {
  46. char* name;
  47. SDev* (*pnp)(void);
  48. SDev* (*legacy)(int, int);
  49. SDev* (*id)(SDev*);
  50. int (*enable)(SDev*);
  51. int (*disable)(SDev*);
  52. int (*verify)(SDunit*);
  53. int (*online)(SDunit*);
  54. int (*rio)(SDreq*);
  55. int (*rctl)(SDunit*, char*, int);
  56. int (*wctl)(SDunit*, void*);
  57. long (*bio)(SDunit*, int, int, void*, long, long);
  58. } SDifc;
  59. typedef struct SDreq {
  60. SDunit* unit;
  61. int lun;
  62. int write;
  63. uchar cmd[16];
  64. int clen;
  65. void* data;
  66. int dlen;
  67. int flags;
  68. int status;
  69. long rlen;
  70. uchar sense[256];
  71. } SDreq;
  72. enum {
  73. SDnosense = 0x00000001,
  74. SDvalidsense = 0x00010000,
  75. };
  76. enum {
  77. SDmalloc = -4,
  78. SDeio = -3,
  79. SDtimeout = -2,
  80. SDnostatus = -1,
  81. SDok = 0,
  82. SDcheck = 0x02, /* check condition */
  83. SDbusy = 0x08, /* busy */
  84. SDmaxio = 2048*1024,
  85. SDnpart = 16,
  86. };
  87. /* sdscsi.c */
  88. extern int scsiverify(SDunit*);
  89. extern int scsionline(SDunit*);
  90. extern long scsibio(SDunit*, int, int, void*, long, long);
  91. extern SDev* scsiid(SDev*, SDifc*);
  92. #define IrqATA0 14
  93. #define IrqATA1 15
  94. #define qlock(i) while(0)
  95. #define qunlock(i) while(0)
  96. #define putstrn consputs
  97. void sleep(void*, int(*)(void*), void*);
  98. void tsleep(void*, int(*)(void*), void*, int);
  99. #define wakeup(x) while(0)
  100. extern long sdbio(SDunit *unit, SDpart *pp, void *a, long len, vlong off);
  101. void partition(SDunit*);
  102. SDpart* sdfindpart(SDunit*, char*);
  103. void sdaddpart(SDunit*, char*, ulong, ulong);
  104. void* sdmalloc(void*, ulong);