sd.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. Devsize start;
  11. Devsize 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. uchar sense[18]; /* format follows SCSI spec */
  23. char name[NAMELEN];
  24. Rendez rendez;
  25. QLock ctl;
  26. Devsize sectors; /* not Off: even 32-bit fs can have big disks */
  27. ulong secsize;
  28. SDpart* part;
  29. int npart; /* of valid partitions */
  30. int changed;
  31. QLock raw;
  32. int state;
  33. ulong pid;
  34. SDreq* req;
  35. } SDunit;
  36. typedef struct SDev {
  37. SDifc* ifc; /* pnp/legacy */
  38. void *ctlr;
  39. int idno;
  40. int index; /* into unit space */
  41. int nunit;
  42. SDev* next;
  43. QLock; /* enable/disable */
  44. int enabled;
  45. } SDev;
  46. typedef struct SDifc {
  47. char* name;
  48. SDev* (*pnp)(void);
  49. SDev* (*legacy)(int, int);
  50. SDev* (*id)(SDev*);
  51. int (*enable)(SDev*);
  52. int (*disable)(SDev*);
  53. int (*verify)(SDunit*);
  54. int (*online)(SDunit*);
  55. int (*rio)(SDreq*);
  56. int (*rctl)(SDunit*, char*, int);
  57. int (*wctl)(SDunit*, void*);
  58. long (*bio)(SDunit*, int, int, void*, long, Off);
  59. } SDifc;
  60. typedef struct SDreq {
  61. SDunit* unit;
  62. int lun;
  63. int write;
  64. uchar cmd[16];
  65. int clen;
  66. void* data;
  67. int dlen;
  68. int flags;
  69. int status;
  70. long rlen;
  71. uchar sense[256];
  72. } SDreq;
  73. enum {
  74. SDnosense = 0x00000001,
  75. SDvalidsense = 0x00010000,
  76. };
  77. enum {
  78. SDretry = -5, /* internal to controllers */
  79. SDmalloc = -4,
  80. SDeio = -3,
  81. SDtimeout = -2,
  82. SDnostatus = -1,
  83. SDok = 0,
  84. SDcheck = 0x02, /* check condition */
  85. SDbusy = 0x08, /* busy */
  86. SDmaxio = 2048*1024,
  87. SDnpart = 16,
  88. };
  89. /* sdscsi.c */
  90. int scsiverify(SDunit*);
  91. int scsionline(SDunit*);
  92. long scsibio(SDunit*, int, int, void*, long, Off);
  93. SDev* scsiid(SDev*, SDifc*);
  94. /* devsd.c */
  95. int sdfakescsi(SDreq *r, void *info, int ilen);
  96. int sdmodesense(SDreq *r, uchar *cmd, void *info, int ilen);
  97. long sdbio(SDunit *unit, SDpart *pp, void *a, long len, Off off);
  98. void partition(SDunit*);
  99. void addpartconf(SDunit*);
  100. SDpart* sdfindpart(SDunit*, char*);
  101. void sdaddpart(SDunit*, char*, Devsize, Devsize);
  102. void* sdmalloc(void*, ulong);
  103. enum {
  104. IrqATA0 = 14,
  105. IrqATA1,
  106. };