home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / mach / amiga / scsi9091.lzh / device.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-02-24  |  5.4 KB  |  179 lines

  1. #include "scsi.h"
  2.  
  3. /* Commodore */
  4. #define BOARD_MANUFACT    514
  5. #ifdef A2090
  6. #define BOARD_PROCUCT    1
  7. #endif
  8. #ifdef A2091
  9. #define BOARD_PROCUCT    3
  10. #endif
  11.  
  12. /* anyone for LUN's ??? not me.... :-)) */
  13. #define MAX_UNITS 8
  14. #ifdef DEBUG
  15. #define UNIT_STACKSIZE 10000
  16. #else
  17. /* probably too much, but better than any stack overflows:-) */
  18. #define UNIT_STACKSIZE 4096
  19. #endif
  20. #define UNIT_PRIORITY 5
  21. #ifdef A2090
  22. #define UNIT_NAME "scsi90.device"
  23. #endif
  24. #ifdef A2091
  25. #define UNIT_NAME "scsi91.device"
  26. #endif
  27. /*
  28.  * when changing the number of buffers, don't exceed a total buffer size
  29.  * of 64K, because the buffer HAS to be transmittable with one DMA job
  30.  * (you can drop this restriction on the 2091)
  31.  */
  32. #define UNIT_NUM_BUFS 1
  33. #define UNIT_SEC_SIZE 512
  34. /* if you set this to 1, every error on a direct-access medium gets
  35.  * you nice requestors.. (in addition to what the fs might do:-)) */
  36. #define UNIT_MAX_ERRORS 5
  37.  
  38. /* version 37 fits kick 2.0, I like it:-)) */
  39. #define SCSI_VERSION    37
  40. #define SCSI_REVISION    2
  41. #define SCSI_PRIORITY    5
  42. #ifdef A2090
  43. #define SCSI_NAME     "scsi90.device"
  44. #define SCSI_IDSTRING    "scsi90 37.2 (" ## __DATE__ ## ")\r\n"
  45. #endif
  46. #ifdef A2091
  47. #define SCSI_NAME     "scsi91.device"
  48. #define SCSI_IDSTRING    "scsi91 37.2 (" ## __DATE__ ## ")\r\n"
  49. #endif
  50. #define HANDLER_PRIORITY 6
  51. #ifdef DEBUG
  52. #define HANDLER_STACKSIZE 10000
  53. #else
  54. /* same applies as with UNIT_STACKSIZE */
  55. #define HANDLER_STACKSIZE 4096
  56. #endif
  57. #ifdef A2090
  58. #define HANDLER_NAME "Handler for 2090-scsi.device"
  59. #endif
  60. #ifdef A2091
  61. #define HANDLER_NAME "Handler for 2091-scsi.device"
  62. #endif
  63.  
  64. /*
  65.  * Define our cache management
  66.  */
  67. #include "cache.h"
  68.  
  69. struct scsi_unit;
  70.  
  71. struct scsi_dev {
  72.   struct Device sc_device;
  73.   ubyte  sc_flags;
  74.   ubyte  sc_pad1;
  75.   ulong  sc_seglist;
  76.   volatile ulong sc_base; /* *DON'T* forget volatile... the optimizer needs it ! */
  77.   struct SignalSemaphore sc_semaph; /* to block out Open during Init.. */
  78.   struct scsi_unit *sc_units[MAX_UNITS];
  79.   /* here comes the stuff for the handler task */
  80.   struct Task sc_htcb;
  81.   ubyte  sc_hstack[HANDLER_STACKSIZE];
  82.   /* interrupt data for scsi handler */
  83.   struct Task    *id_sig_task;
  84.   long           id_sig_mask;
  85.   long           id_signal;
  86.   volatile ubyte *id_board;
  87.   struct Interrupt sc_iv;
  88.   /* "normal" handler data */
  89.   struct MsgPort sc_msgport;    /* our msgport */
  90.   struct MsgPort *sc_hmsgport;    /* handler-msgport */
  91.   struct scsi_msg sc_hmessage;    /* a scsi_msg to send to handler */
  92. };
  93.  
  94.  
  95. struct scsi_unit {
  96.   struct Unit scu_unit;     /* its MsgPort is used to communicate with the handler */
  97.   struct MsgPort *scu_cmd_mp;     /* here arrive commands from BeginIO */
  98.   ubyte  scu_unitnum;         /* our number as specified in OpenDevice() */
  99.   ubyte  scu_errors;         /* #errors on this errorlevel (<UNIT_MAX_ERRORS) */
  100.   ubyte  scu_errorlevel;     /* #times, scu_errors was > UNIT_MAX_ERRORS */
  101.   ubyte  scu_cmd[13];         /* scsi-cmd string, only 12 byte are used */
  102.   struct scsi_dev *scu_device;     /* points back to device (not used so far..) */
  103.   ubyte  scu_stack[UNIT_STACKSIZE]; /* that's "me" .. */
  104.   struct Task scu_tcb;
  105.   ulong  scu_type;        /* type as got from INQUIRY, see later */
  106.   struct scsi_msg scu_hmessage;    /* handler msg */
  107.   struct MsgPort *scu_hmsgport;    /* handler's msgport */
  108.   struct SCSICmd scu_scsicmd;    /* handler scsi-cmd used by read/write... */
  109.   /* buffer part (for odd aligned data) */
  110.   short  word_pad; /* just to make sure, the buffer is word aligned */
  111.   ubyte  scu_buf[UNIT_NUM_BUFS * UNIT_SEC_SIZE];
  112.   /* cache part.. looks like for typical DOS operations this is useful */
  113.   struct cache_cb scu_ccb[CCB_PER_UNIT];
  114. };  
  115.  
  116. /* 
  117.  * if the medium is removable, its type is ored with the SCU_TYPE_RMB
  118.  * qualifier 
  119.  */
  120. #define SCU_TYPE_RMB        (1<<31)
  121.  
  122. /*
  123.  * the following device types correspond to the "peripheral device type"
  124.  * field in the scsi-answer to the INQUIRY command 
  125.  */
  126. #define SCU_TYPE_DIRECT        0
  127. #define SCU_TYPE_SEQUENTIAL    1
  128. #define SCU_TYPE_PRINTER    2
  129. #define SCU_TYPE_PROCESSOR    3
  130. #define SCU_TYPE_WORM        4
  131. #define SCU_TYPE_RO_DIRECT    5
  132.  
  133. /*
  134.  * C-support for macros, that are only in asm-include files;
  135.  * to use, declare a struct, then for each INIT used later declare the
  136.  * respective type, the argument should be different for each invocation,
  137.  * just increment some integer value
  138.  */
  139. #define DECLARE_BYTE(val) ushort foo ## val [2]; ubyte bar ## val [2]
  140. #define DECLARE_WORD(val) ushort foo ## val [3]
  141. #define DECLARE_LONG(val) ushort foo ## val [2]; ulong bar ## val
  142. #define INITBYTE(off,val) 0xe000,off,(ubyte)val,0
  143. #define INITWORD(off,val) 0xd000,off,(ushort)val
  144. #define INITLONG(off,val) 0xc000,off,(ulong)val
  145.  
  146. #ifdef DEBUG
  147. #define DPRINTF(args) dprintf args ;
  148. #define DECL_DPRINTF extern void dprintf(char *fmt, ...)
  149. #else
  150. #define DPRINTF(args)
  151. #define DECL_DPRINTF
  152. #endif
  153.  
  154. /*
  155.  * this garantees, that the sent out message has been replied to and can
  156.  * be reused 
  157.  */
  158. static inline void 
  159. PutGetMsg(struct MsgPort *to, struct MsgPort *from, struct Message *msg)
  160. {
  161.   struct Message *rm;
  162.   DECL_DPRINTF;
  163.  
  164.   PutMsg(to, msg);
  165.   while ((rm = GetMsg(from)) != msg)
  166.     if (!rm) WaitPort(from);
  167.     else
  168.       {
  169.         DPRINTF(("PANIC: got wild message, port $%x, message $%x",
  170.                 from, rm));
  171.         DPRINTF(("PANIC: these are the names of the ports:"));
  172.         DPRINTF(("PANIC: to: %10.10s, from: %10.10s",
  173.                 to->mp_Node.ln_Name ? to->mp_Node.ln_Name : "(no name)",
  174.                 from->mp_Node.ln_Name ? from->mp_Node.ln_Name : "(no name)"));
  175.         DPRINTF(("PANIC: message->replyport = $%x", rm->mn_ReplyPort));
  176.         Wait(1<<12); /* grin.. well, doesn't matter in this case anyway.. */
  177.       }
  178. }
  179.