COMPLETE.TXT
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:2565k
源码类别:

操作系统开发

开发平台:

C/C++

  1. 09704 #define COPROC_ERR_VECTOR   16  /* coprocessor error */
  2. 09705
  3. 09706 /* Descriptor structure offsets. */
  4. 09707 #define DESC_GRANULARITY     6  /* to granularity byte */
  5. 09708 #define DESC_BASE_HIGH       7  /* to base_high */
  6. 09709
  7. 09710 /* Base and limit sizes and shifts. */
  8. 09711 #define BASE_HIGH_SHIFT     24  /* shift for base --> base_high */
  9. 09712 #define BYTE_GRAN_MAX   0xFFFFFL   /* maximum size for byte granular segment */
  10. 09713 #define GRANULARITY_SHIFT   16  /* shift for limit --> granularity */
  11. 09714 #define OFFSET_HIGH_SHIFT   16  /* shift for (gate) offset --> offset_high */
  12. 09715 #define PAGE_GRAN_SHIFT     12  /* extra shift for page granular limits */
  13. 09716
  14. 09717 /* Type-byte bits. */
  15. 09718 #define DESC_386_BIT      0x08  /* 386 types are obtained by ORing with this */
  16. 09719                                 /* LDT's and TASK_GATE's don't need it */
  17. 09720
  18. 09721 /* Granularity byte. */
  19. 09722 #define GRANULAR          0x80  /* set for 4K granularilty */
  20. 09723 #define DEFAULT           0x40  /* set for 32-bit defaults (executable seg) */
  21. 09724 #define BIG               0x40  /* set for "BIG" (expand-down seg) */
  22. 09725 #define AVL               0x10  /* 0 for available */
  23. 09726 #define LIMIT_HIGH        0x0F  /* mask for high bits of limit */
  24. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  25. src/kernel/proto.h    
  26. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  27. 09800 /* Function prototypes. */
  28. 09801
  29. 09802 #ifndef PROTO_H
  30. 09803 #define PROTO_H
  31. 09804
  32. 09805 /* Struct declarations. */
  33. 09806 struct dpeth;
  34. 09807 struct proc;
  35. 09808 struct tty;
  36. 09809
  37. 09810 /* at_wini.c, bios_wini.c, esdi_wini.c, ps_wini.c, xt_wini.c, wini.c */
  38. 09811 _PROTOTYPE( void winchester_task, (void)                                );
  39. 09812 _PROTOTYPE( void at_winchester_task, (void)                             );
  40. 09813 _PROTOTYPE( void bios_winchester_task, (void)                           );
  41. 09814 _PROTOTYPE( void esdi_winchester_task, (void)                           );
  42. 09815 _PROTOTYPE( void ps_winchester_task, (void)                             );
  43. 09816 _PROTOTYPE( void xt_winchester_task, (void)                             );
  44. 09817
  45. 09818 /* aha_scsi.c */
  46. 09819 _PROTOTYPE( void aha_scsi_task, (void)                                  );
  47. 09820
  48. 09821 /* clock.c */
  49. 09822 _PROTOTYPE( void clock_task, (void)                                     );
  50. 09823 _PROTOTYPE( void clock_stop, (void)                                     );
  51. 09824 _PROTOTYPE( clock_t get_uptime, (void)                                  );
  52. 09825 _PROTOTYPE( void syn_alrm_task, (void)                                  );
  53. 09826
  54. 09827 /* dmp.c */
  55. 09828 _PROTOTYPE( void map_dmp, (void)                                        );
  56. 09829 _PROTOTYPE( void p_dmp, (void)                                          );
  57. 09830 _PROTOTYPE( void reg_dmp, (struct proc *rp)                             );
  58. 09831
  59. 09832 /* dp8390.c */
  60. 09833 _PROTOTYPE( void dp8390_task, (void)                                    );
  61. 09834 _PROTOTYPE( void dp_dump, (void)                                        );
  62. 09835 _PROTOTYPE( void dp8390_stop, (void)                                    );
  63. 09836
  64. 09837 /* floppy.c, stfloppy.c */
  65. 09838 _PROTOTYPE( void floppy_task, (void)                                    );
  66. 09839 _PROTOTYPE( void floppy_stop, (void)                                    );
  67. 09840
  68. 09841 /* main.c, stmain.c */
  69. 09842 _PROTOTYPE( void main, (void)                                           );
  70. 09843 _PROTOTYPE( void panic, (const char *s, int n)                          );
  71. 09844
  72. 09845 /* mcd.c */
  73. 09846 _PROTOTYPE( void mcd_task, (void)                                       );
  74. 09847
  75. 09848 /* memory.c */
  76. 09849 _PROTOTYPE( void mem_task, (void)                                       );
  77. 09850
  78. 09851 /* misc.c */
  79. 09852 _PROTOTYPE( int env_parse, (char *env, char *fmt, int field,
  80. 09853                         long *param, long min, long max)                );
  81. 09854
  82. 09855 /* printer.c, stprint.c */
  83. 09856 _PROTOTYPE( void printer_task, (void)                                   );
  84. 09857
  85. 09858 /* proc.c */
  86. 09859 _PROTOTYPE( void interrupt, (int task)                                  );
  87. 09860 _PROTOTYPE( int lock_mini_send, (struct proc *caller_ptr,
  88. 09861                 int dest, message *m_ptr)                               );
  89. 09862 _PROTOTYPE( void lock_pick_proc, (void)                                 );
  90. 09863 _PROTOTYPE( void lock_ready, (struct proc *rp)                          );
  91. 09864 _PROTOTYPE( void lock_sched, (void)                                     );
  92. 09865 _PROTOTYPE( void lock_unready, (struct proc *rp)                        );
  93. 09866 _PROTOTYPE( int sys_call, (int function, int src_dest, message *m_ptr)  );
  94. 09867 _PROTOTYPE( void unhold, (void)                                         );
  95. 09868
  96. 09869 /* rs232.c */
  97. 09870 _PROTOTYPE( void rs_init, (struct tty *tp)                              );
  98. 09871
  99. 09872 /* sb16_dsp.c */
  100. 09873 _PROTOTYPE( void dsp_task, (void)                                       );
  101. 09874
  102. 09875 /* sb16_mixer.c */
  103. 09876 _PROTOTYPE( void mixer_task, (void)                                     );
  104. 09877
  105. 09878 /* system.c */
  106. 09879 _PROTOTYPE( void cause_sig, (int proc_nr, int sig_nr)                   );
  107. 09880 _PROTOTYPE( void inform, (void)                                         );
  108. 09881 _PROTOTYPE( phys_bytes numap, (int proc_nr, vir_bytes vir_addr, 
  109. 09882                 vir_bytes bytes)                                        );
  110. 09883 _PROTOTYPE( void sys_task, (void)                                       );
  111. 09884 _PROTOTYPE( phys_bytes umap, (struct proc *rp, int seg, vir_bytes vir_addr,
  112. 09885                 vir_bytes bytes)                                        );
  113. 09886
  114. 09887 /* tty.c */
  115. 09888 _PROTOTYPE( void handle_events, (struct tty *tp)                        );
  116. 09889 _PROTOTYPE( void sigchar, (struct tty *tp, int sig)                     );
  117. 09890 _PROTOTYPE( void tty_task, (void)                                       );
  118. 09891 _PROTOTYPE( int in_process, (struct tty *tp, char *buf, int count)      );
  119. 09892 _PROTOTYPE( void out_process, (struct tty *tp, char *bstart, char *bpos,
  120. 09893                                 char *bend, int *icount, int *ocount)   );
  121. 09894 _PROTOTYPE( void tty_wakeup, (clock_t now)                              );
  122. 09895 _PROTOTYPE( void tty_reply, (int code, int replyee, int proc_nr,
  123. 09896                                                         int status)     );
  124. 09897 _PROTOTYPE( void tty_devnop, (struct tty *tp)                           );
  125. 09898
  126. 09899 /* library */
  127. 09900 _PROTOTYPE( void *memcpy, (void *_s1, const void *_s2, size_t _n)       );
  128. 09901
  129. 09902 #if (CHIP == INTEL)
  130. 09903
  131. 09904 /* clock.c */
  132. 09905 _PROTOTYPE( void milli_start, (struct milli_state *msp)                 );
  133. 09906 _PROTOTYPE( unsigned milli_elapsed, (struct milli_state *msp)           );
  134. 09907 _PROTOTYPE( void milli_delay, (unsigned millisec)                       );
  135. 09908
  136. 09909 /* console.c */
  137. 09910 _PROTOTYPE( void cons_stop, (void)                                      );
  138. 09911 _PROTOTYPE( void putk, (int c)                                          );
  139. 09912 _PROTOTYPE( void scr_init, (struct tty *tp)                             );
  140. 09913 _PROTOTYPE( void toggle_scroll, (void)                                  );
  141. 09914 _PROTOTYPE( int con_loadfont, (phys_bytes user_phys)                    );
  142. 09915 _PROTOTYPE( void select_console, (int cons_line)                        );
  143. 09916
  144. 09917 /* cstart.c */
  145. 09918 _PROTOTYPE( void cstart, (U16_t cs, U16_t ds, U16_t mcs, U16_t mds,
  146. 09919                                 U16_t parmoff, U16_t parmsize)          );
  147. 09920 _PROTOTYPE( char *k_getenv, (char *name)                                );
  148. 09921
  149. 09922 /* exception.c */
  150. 09923 _PROTOTYPE( void exception, (unsigned vec_nr)                           );
  151. 09924
  152. 09925 /* i8259.c */
  153. 09926 _PROTOTYPE( irq_handler_t get_irq_handler, (int irq)                    );
  154. 09927 _PROTOTYPE( void put_irq_handler, (int irq, irq_handler_t handler)      );
  155. 09928 _PROTOTYPE( void intr_init, (int mine)                                  );
  156. 09929
  157. 09930 /* keyboard.c */
  158. 09931 _PROTOTYPE( void kb_init, (struct tty *tp)                              );
  159. 09932 _PROTOTYPE( int kbd_loadmap, (phys_bytes user_phys)                     );
  160. 09933 _PROTOTYPE( void wreboot, (int how)                                     );
  161. 09934
  162. 09935 /* klib*.s */
  163. 09936 _PROTOTYPE( void bios13, (void)                                         );
  164. 09937 _PROTOTYPE( phys_bytes check_mem, (phys_bytes base, phys_bytes size)    );
  165. 09938 _PROTOTYPE( void cp_mess, (int src,phys_clicks src_clicks,vir_bytes src_offset,
  166. 09939                 phys_clicks dst_clicks, vir_bytes dst_offset)           );
  167. 09940 _PROTOTYPE( int in_byte, (port_t port)                                  );
  168. 09941 _PROTOTYPE( int in_word, (port_t port)                                  );
  169. 09942 _PROTOTYPE( void lock, (void)                                           );
  170. 09943 _PROTOTYPE( void unlock, (void)                                         );
  171. 09944 _PROTOTYPE( void enable_irq, (unsigned irq)                             );
  172. 09945 _PROTOTYPE( int disable_irq, (unsigned irq)                             );
  173. 09946 _PROTOTYPE( u16_t mem_rdw, (segm_t segm, vir_bytes offset)              );
  174. 09947 _PROTOTYPE( void out_byte, (port_t port, int value)                     );
  175. 09948 _PROTOTYPE( void out_word, (port_t port, int value)                     );
  176. 09949 _PROTOTYPE( void phys_copy, (phys_bytes source, phys_bytes dest,
  177. 09950                 phys_bytes count)                                       );
  178. 09951 _PROTOTYPE( void port_read, (unsigned port, phys_bytes destination,
  179. 09952                 unsigned bytcount)                                      );
  180. 09953 _PROTOTYPE( void port_read_byte, (unsigned port, phys_bytes destination,
  181. 09954                 unsigned bytcount)                                      );
  182. 09955 _PROTOTYPE( void port_write, (unsigned port, phys_bytes source,
  183. 09956                 unsigned bytcount)                                      );
  184. 09957 _PROTOTYPE( void port_write_byte, (unsigned port, phys_bytes source,
  185. 09958                 unsigned bytcount)                                      );
  186. 09959 _PROTOTYPE( void reset, (void)                                          );
  187. 09960 _PROTOTYPE( void vid_vid_copy, (unsigned src, unsigned dst, unsigned count));
  188. 09961 _PROTOTYPE( void mem_vid_copy, (u16_t *src, unsigned dst, unsigned count));
  189. 09962 _PROTOTYPE( void level0, (void (*func)(void))                           );
  190. 09963 _PROTOTYPE( void monitor, (void)                                        );
  191. 09964
  192. 09965 /* misc.c */
  193. 09966 _PROTOTYPE( void mem_init, (void)                                       );
  194. 09967
  195. 09968 /* mpx*.s */
  196. 09969 _PROTOTYPE( void idle_task, (void)                                      );
  197. 09970 _PROTOTYPE( void restart, (void)                                        );
  198. 09971
  199. 09972 /* The following are never called from C (pure asm procs). */
  200. 09973
  201. 09974 /* Exception handlers (real or protected mode), in numerical order. */
  202. 09975 void _PROTOTYPE( int00, (void) ), _PROTOTYPE( divide_error, (void) );
  203. 09976 void _PROTOTYPE( int01, (void) ), _PROTOTYPE( single_step_exception, (void) );
  204. 09977 void _PROTOTYPE( int02, (void) ), _PROTOTYPE( nmi, (void) );
  205. 09978 void _PROTOTYPE( int03, (void) ), _PROTOTYPE( breakpoint_exception, (void) );
  206. 09979 void _PROTOTYPE( int04, (void) ), _PROTOTYPE( overflow, (void) );
  207. 09980 void _PROTOTYPE( int05, (void) ), _PROTOTYPE( bounds_check, (void) );
  208. 09981 void _PROTOTYPE( int06, (void) ), _PROTOTYPE( inval_opcode, (void) );
  209. 09982 void _PROTOTYPE( int07, (void) ), _PROTOTYPE( copr_not_available, (void) );
  210. 09983 void                              _PROTOTYPE( double_fault, (void) );
  211. 09984 void                              _PROTOTYPE( copr_seg_overrun, (void) );
  212. 09985 void                              _PROTOTYPE( inval_tss, (void) );
  213. 09986 void                              _PROTOTYPE( segment_not_present, (void) );
  214. 09987 void                              _PROTOTYPE( stack_exception, (void) );
  215. 09988 void                              _PROTOTYPE( general_protection, (void) );
  216. 09989 void                              _PROTOTYPE( page_fault, (void) );
  217. 09990 void                              _PROTOTYPE( copr_error, (void) );
  218. 09991
  219. 09992 /* Hardware interrupt handlers. */
  220. 09993 _PROTOTYPE( void hwint00, (void) );
  221. 09994 _PROTOTYPE( void hwint01, (void) );
  222. 09995 _PROTOTYPE( void hwint02, (void) );
  223. 09996 _PROTOTYPE( void hwint03, (void) );
  224. 09997 _PROTOTYPE( void hwint04, (void) );
  225. 09998 _PROTOTYPE( void hwint05, (void) );
  226. 09999 _PROTOTYPE( void hwint06, (void) );
  227. 10000 _PROTOTYPE( void hwint07, (void) );
  228. 10001 _PROTOTYPE( void hwint08, (void) );
  229. 10002 _PROTOTYPE( void hwint09, (void) );
  230. 10003 _PROTOTYPE( void hwint10, (void) );
  231. 10004 _PROTOTYPE( void hwint11, (void) );
  232. 10005 _PROTOTYPE( void hwint12, (void) );
  233. 10006 _PROTOTYPE( void hwint13, (void) );
  234. 10007 _PROTOTYPE( void hwint14, (void) );
  235. 10008 _PROTOTYPE( void hwint15, (void) );
  236. 10009
  237. 10010 /* Software interrupt handlers, in numerical order. */
  238. 10011 _PROTOTYPE( void trp, (void) );
  239. 10012 _PROTOTYPE( void s_call, (void) ), _PROTOTYPE( p_s_call, (void) );
  240. 10013 _PROTOTYPE( void level0_call, (void) );
  241. 10014
  242. 10015 /* ne2000.c */
  243. 10016 _PROTOTYPE( int ne_probe, (struct dpeth *dep)                           );
  244. 10017
  245. 10018 /* printer.c */
  246. 10019 _PROTOTYPE( void pr_restart, (void)                                     );
  247. 10020
  248. 10021 /* protect.c */
  249. 10022 _PROTOTYPE( void prot_init, (void)                                      );
  250. 10023 _PROTOTYPE( void init_codeseg, (struct segdesc_s *segdp, phys_bytes base,
  251. 10024                 phys_bytes size, int privilege)                         );
  252. 10025 _PROTOTYPE( void init_dataseg, (struct segdesc_s *segdp, phys_bytes base,
  253. 10026                 phys_bytes size, int privilege)                         );
  254. 10027 _PROTOTYPE( phys_bytes seg2phys, (U16_t seg)                            );
  255. 10028 _PROTOTYPE( void enable_iop, (struct proc *pp)                          );
  256. 10029
  257. 10030 /* pty.c */
  258. 10031 _PROTOTYPE( void do_pty, (struct tty *tp, message *m_ptr)               );
  259. 10032 _PROTOTYPE( void pty_init, (struct tty *tp)                             );
  260. 10033
  261. 10034 /* system.c */
  262. 10035 _PROTOTYPE( void alloc_segments, (struct proc *rp)                      );
  263. 10036
  264. 10037 /* wdeth.c */
  265. 10038 _PROTOTYPE( int wdeth_probe, (struct dpeth *dep)                        );
  266. 10039
  267. 10040 #endif /* (CHIP == INTEL) */
  268. 10041
  269. 10042 #if (CHIP == M68000)
  270. 10043
  271. 10044 /* cstart.c */
  272. 10045 _PROTOTYPE( void cstart, (char *parmoff, size_t parmsize)               );
  273. 10046
  274. 10047 /* stfloppy.c */
  275. 10048 _PROTOTYPE( void fd_timer, (void)                                       );
  276. 10049
  277. 10050 /* stmain.c */
  278. 10051 _PROTOTYPE( void none, (void)                                           );
  279. 10052 _PROTOTYPE( void rupt, (void)                                           );
  280. 10053 _PROTOTYPE( void trap, (void)                                           );
  281. 10054 _PROTOTYPE( void checksp, (void)                                        );
  282. 10055 _PROTOTYPE( void aciaint, (void)                                        );
  283. 10056 _PROTOTYPE( void fake_int, (const char *s, int t)                       );
  284. 10057 _PROTOTYPE( void timint, (int t)                                        );
  285. 10058 _PROTOTYPE( void mdiint, (void)                                         );
  286. 10059 _PROTOTYPE( void iob, (int t)                                           );
  287. 10060 _PROTOTYPE( void idle_task, (void)                                      );
  288. 10061
  289. 10062 /* rs232.c */
  290. 10063 _PROTOTYPE( void siaint, (int type)                                     );
  291. 10064
  292. 10065 /* stcon.c */
  293. 10066 _PROTOTYPE( void func_key, (void)                                       );
  294. 10067 _PROTOTYPE( void dump, (void)                                           );
  295. 10068 _PROTOTYPE( void putk, (int c)                                          );
  296. 10069
  297. 10070 /* stdma.c */
  298. 10071 _PROTOTYPE( void dmagrab, (int p, dmaint_t func)                        );
  299. 10072 _PROTOTYPE( void dmafree, (int p)                                       );
  300. 10073 _PROTOTYPE( void dmaint, (void)                                         );
  301. 10074 _PROTOTYPE( void dmaaddr, (phys_bytes ad)                               );
  302. 10075 _PROTOTYPE( int dmardat, (int mode, int delay)                          );
  303. 10076 _PROTOTYPE( void dmawdat, (int mode, int data, int delay)               );
  304. 10077 _PROTOTYPE( void dmawcmd, (int data, unsigned mode)                     );
  305. 10078 _PROTOTYPE( void dmacomm, (int mode, int data, int delay)               );
  306. 10079 _PROTOTYPE( int dmastat, (int mode, int delay)                          );
  307. 10080
  308. 10081 /* stdskclk.c */
  309. 10082 _PROTOTYPE( int do_xbms, (phys_bytes address, int count, int rw, int minor) );
  310. 10083  
  311. 10084 /* stkbd.c */
  312. 10085 _PROTOTYPE( void kbdint, (void)                                         );
  313. 10086 _PROTOTYPE( void kb_timer, (void)                                       );
  314. 10087 _PROTOTYPE( int kb_read, (int minor, char **bufindirect)                );
  315. 10088 _PROTOTYPE( void kb_init, (int minor)                                   );
  316. 10089
  317. 10090 /* stshadow.c */
  318. 10091 _PROTOTYPE( void mkshadow, (struct proc *p, phys_clicks c2)             );
  319. 10092 _PROTOTYPE( void rmshadow, (struct proc *p, phys_clicks *basep,
  320. 10093                 phys_clicks *sizep)                                     );
  321. 10094 _PROTOTYPE( void unshadow, (struct proc *p)                             );
  322. 10095  
  323. 10096 /* stvdu.c */
  324. 10097 _PROTOTYPE( void flush, (struct tty *tp)                                );
  325. 10098 _PROTOTYPE( void console, (struct tty *tp)                              );
  326. 10099 _PROTOTYPE( void out_char, (struct tty *tp, int c)                      );
  327. 10100 _PROTOTYPE( void scr_init, (int minor)                                  );
  328. 10101 _PROTOTYPE( void vduswitch, (struct tty *tp)                            );
  329. 10102 _PROTOTYPE( void vdusetup, (unsigned int vres, char *vram,
  330. 10103                             unsigned short *vrgb)                       );
  331. 10104 _PROTOTYPE( void vbl, (void)                                            );
  332. 10105 _PROTOTYPE( int vdu_loadfont, (message *m_ptr)                          );
  333. 10106
  334. 10107 /* stwini.c */
  335. 10108 _PROTOTYPE( int wini_open, (message *mp)                                );
  336. 10109 _PROTOTYPE( int wini_rdwt, (message *mp)                                );
  337. 10110 _PROTOTYPE( int wini_hvrdwt, (message *mp)                              );
  338. 10111 _PROTOTYPE( int wini_transfer, (int rw, int pnr, int minor,
  339. 10112                 long pos, int count, vir_bytes vadr)                    );
  340. 10113 _PROTOTYPE( int wini_ioctl, (message *mp)                               );
  341. 10114 _PROTOTYPE( int wini_close, (message *mp)                               );
  342. 10115
  343. 10116 /* stacsi.c */
  344. 10117 _PROTOTYPE( int acsi_cmd, (int drive,  unsigned char *cmd, int cmdlen,
  345. 10118                 phys_bytes address, phys_bytes data_len,  int rw)       );
  346. 10119
  347. 10120 /* stscsi.c */
  348. 10121 _PROTOTYPE( void scsi_task, (void)                                      );
  349. 10122 _PROTOTYPE( void scsidmaint, (void)                                     );
  350. 10123 _PROTOTYPE( void scsiint, (void)                                        );
  351. 10124 _PROTOTYPE( int scsi_cmd, (int drive,  unsigned char *cmd, int cmdlen,
  352. 10125                 phys_bytes address, phys_bytes data_len,  int rw)       );
  353. 10126
  354. 10127 /* klib68k.s */
  355. 10128 _PROTOTYPE( void flipclicks, (phys_clicks c1, phys_clicks c2, phys_clicks n) );
  356. 10129 _PROTOTYPE( void copyclicks, (phys_clicks src, phys_clicks dest,
  357. 10130                 phys_clicks nclicks)                                    );
  358. 10131 _PROTOTYPE( void zeroclicks, (phys_clicks dest, phys_clicks nclicks)    );
  359. 10132 _PROTOTYPE( void phys_copy, (phys_bytes src, phys_bytes dest, phys_bytes n) );
  360. 10133
  361. 10134 /* stdskclks.s */
  362. 10135 _PROTOTYPE( int rd1byte, (void)                                         );
  363. 10136 _PROTOTYPE( int wr1byte, (int)                                          );
  364. 10137 _PROTOTYPE( long getsupra, (void)                                       );
  365. 10138 _PROTOTYPE( long geticd, (void)                                         );
  366. 10139
  367. 10140 /* mpx.s */
  368. 10141 _PROTOTYPE( int lock, (void)                                            );
  369. 10142 _PROTOTYPE( void unlock, (void)                                         );
  370. 10143 _PROTOTYPE( void restore, (int oldsr)                                   );
  371. 10144 _PROTOTYPE( void reboot, (void)                                         );
  372. 10145 _PROTOTYPE( int test_and_set, (char *flag)                              );
  373. 10146 _PROTOTYPE( unsigned long get_mem_size, (char *start_addr)              );
  374. 10147
  375. 10148 /* stprint.c */
  376. 10149 #ifdef DEBOUT
  377. 10150 _PROTOTYPE( void prtc, (int c)                                          );
  378. 10151 #endif
  379. 10152
  380. 10153 #ifdef FPP
  381. 10154 /* fpp.c */
  382. 10155 _PROTOTYPE( void fppinit, (void)                                        );
  383. 10156 _PROTOTYPE( void fpp_new_state, (struct proc *rp)                       );
  384. 10157 _PROTOTYPE( void fpp_save, (struct proc *rp, struct cpu_state *p)       );
  385. 10158 _PROTOTYPE( struct cpu_state  *fpp_restore, (struct proc *rp)           );
  386. 10159
  387. 10160 /* fpps.s */
  388. 10161 _PROTOTYPE( void _fppsave, (struct state_frame *p)                      );
  389. 10162 _PROTOTYPE( void _fppsavereg, (struct fpp_model *p)                     );
  390. 10163 _PROTOTYPE( void _fpprestore, (struct state_frame *p)                   );
  391. 10164 _PROTOTYPE( void _fpprestreg, (struct fpp_model *p)                     );
  392. 10165 #endif
  393. 10166
  394. 10167 #if (SHADOWING == 0)
  395. 10168 /* pmmu.c */
  396. 10169 _PROTOTYPE(void pmmuinit , (void)                                       );
  397. 10170 _PROTOTYPE(void pmmu_init_proc , (struct proc *rp )                     );
  398. 10171 _PROTOTYPE(void pmmu_restore , (struct proc *rp )                       );
  399. 10172 _PROTOTYPE(void pmmu_delete , (struct proc *rp )                        );
  400. 10173 _PROTOTYPE(void pmmu_flush , (struct proc *rp )                         );
  401. 10174 #endif
  402. 10175
  403. 10176 #endif /* (CHIP == M68000) */
  404. 10177
  405. 10178 #endif /* PROTO_H */
  406. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  407. src/kernel/sb16.h    
  408. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  409. 10200 #ifndef SB16_H
  410. 10201 #define SB16_H
  411. 10202
  412. 10203 #define SB_DEBUG                0       /* 1 = print debug info */
  413. 10204 #define SB_DEBUG_2              0       /* 1 = print more debug info */
  414. 10205
  415. 10206 #define SB_TIMEOUT              32000   /* timeout count */
  416. 10207
  417. 10208 /* IRQ, base address and DMA channels */
  418. 10209 #define SB_IRQ          5
  419. 10210 #define SB_BASE_ADDR    0x220           /* 0x210, 0x220, 0x230, 0x240,
  420. 10211                                          * 0x250, 0x260, 0x280        
  421. 10212                                          */
  422. 10213 #define SB_DMA_8        1               /* 0, 1, 3 */
  423. 10214 #define SB_DMA_16       5               /* 5, 6, 7 */
  424. 10215 #if _WORD_SIZE == 2
  425. 10216 #define DMA_SIZE        8192            /* Dma buffer MUST BE MULTIPLE OF 2 */
  426. 10217 #else
  427. 10218 #define DMA_SIZE        32768           /* Dma buffer MUST BE MULTIPLE OF 2 */
  428. 10219 #endif
  429. 10220
  430. 10221 /* Some defaults for the DSP */
  431. 10222 #define DEFAULT_SPEED           22050      /* Sample rate */
  432. 10223 #define DEFAULT_BITS            8          /* Nr. of bits */
  433. 10224 #define DEFAULT_SIGN            0          /* 0 = unsigned, 1 = signed */
  434. 10225 #define DEFAULT_STEREO          0          /* 0 = mono, 1 = stereo */
  435. 10226
  436. 10227 /* DMA port addresses */
  437. 10228 #define DMA8_ADDR       ((SB_DMA_8 & 3) << 1) + 0x00
  438. 10229 #define DMA8_COUNT      ((SB_DMA_8 & 3) << 1) + 0x01 
  439. 10230 #define DMA8_MASK       0x0A
  440. 10231 #define DMA8_MODE       0x0B
  441. 10232 #define DMA8_CLEAR      0x0C
  442. 10233
  443. 10234
  444. 10235 /* If after this preprocessing stuff DMA8_PAGE is not defined
  445. 10236  * the 8-bit DMA channel specified is not valid
  446. 10237  */
  447. 10238 #if SB_DMA_8 == 0
  448. 10239 #  define DMA8_PAGE     0x87    
  449. 10240 #else 
  450. 10241 #  if SB_DMA_8 == 1
  451. 10242 #    define DMA8_PAGE   0x83    
  452. 10243 #  else 
  453. 10244 #    if SB_DMA_8 == 3
  454. 10245 #      define DMA8_PAGE 0x82
  455. 10246 #    endif
  456. 10247 #  endif
  457. 10248 #endif
  458. 10249
  459. 10250         
  460. 10251 #define DMA16_ADDR      ((SB_DMA_16 & 3) << 2) + 0xC0
  461. 10252 #define DMA16_COUNT     ((SB_DMA_16 & 3) << 2) + 0xC2 
  462. 10253 #define DMA16_MASK      0xD4
  463. 10254 #define DMA16_MODE      0xD6
  464. 10255 #define DMA16_CLEAR     0xD8
  465. 10256
  466. 10257
  467. 10258 /* If after this preprocessing stuff DMA16_PAGE is not defined
  468. 10259  * the 16-bit DMA channel specified is not valid
  469. 10260  */
  470. 10261 #if SB_DMA_16 == 5
  471. 10262 #  define DMA16_PAGE      0x8B  
  472. 10263 #else 
  473. 10264 #  if SB_DMA_16 == 6
  474. 10265 #    define DMA16_PAGE    0x89  
  475. 10266 #  else 
  476. 10267 #    if SB_DMA_16 == 7
  477. 10268 #      define DMA16_PAGE  0x8A
  478. 10269 #    endif
  479. 10270 #  endif
  480. 10271 #endif
  481. 10272
  482. 10273
  483. 10274 /* DMA modes */
  484. 10275 #define DMA16_AUTO_PLAY         0x58 + (SB_DMA_16 & 3)
  485. 10276 #define DMA16_AUTO_REC          0x54 + (SB_DMA_16 & 3)
  486. 10277 #define DMA8_AUTO_PLAY          0x58 + SB_DMA_8
  487. 10278 #define DMA8_AUTO_REC           0x54 + SB_DMA_8
  488. 10279
  489. 10280
  490. 10281 /* IO ports for soundblaster */
  491. 10282 #define DSP_RESET       0x6 + SB_BASE_ADDR
  492. 10283 #define DSP_READ        0xA + SB_BASE_ADDR
  493. 10284 #define DSP_WRITE       0xC + SB_BASE_ADDR
  494. 10285 #define DSP_COMMAND     0xC + SB_BASE_ADDR
  495. 10286 #define DSP_STATUS      0xC + SB_BASE_ADDR
  496. 10287 #define DSP_DATA_AVL    0xE + SB_BASE_ADDR
  497. 10288 #define DSP_DATA16_AVL  0xF + SB_BASE_ADDR
  498. 10289 #define MIXER_REG       0x4 + SB_BASE_ADDR
  499. 10290 #define MIXER_DATA      0x5 + SB_BASE_ADDR
  500. 10291 #define OPL3_LEFT       0x0 + SB_BASE_ADDR
  501. 10292 #define OPL3_RIGHT      0x2 + SB_BASE_ADDR
  502. 10293 #define OPL3_BOTH       0x8 + SB_BASE_ADDR
  503. 10294
  504. 10295
  505. 10296 /* DSP Commands */
  506. 10297 #define DSP_INPUT_RATE          0x42  /* set input sample rate */
  507. 10298 #define DSP_OUTPUT_RATE         0x41  /* set output sample rate */
  508. 10299 #define DSP_CMD_SPKON           0xD1  /* set speaker on */
  509. 10300 #define DSP_CMD_SPKOFF          0xD3  /* set speaker off */
  510. 10301 #define DSP_CMD_DMA8HALT        0xD0  /* halt DMA 8-bit operation */  
  511. 10302 #define DSP_CMD_DMA8CONT        0xD4  /* continue DMA 8-bit operation */
  512. 10303 #define DSP_CMD_DMA16HALT       0xD5  /* halt DMA 16-bit operation */
  513. 10304 #define DSP_CMD_DMA16CONT       0xD6  /* continue DMA 16-bit operation */
  514. 10305 #define DSP_GET_VERSION         0xE1  /* get version number of DSP */
  515. 10306 #define DSP_CMD_8BITAUTO_IN     0xCE  /* 8 bit auto-initialized input */
  516. 10307 #define DSP_CMD_8BITAUTO_OUT    0xC6  /* 8 bit auto-initialized output */
  517. 10308 #define DSP_CMD_16BITAUTO_IN    0xBE  /* 16 bit auto-initialized input */
  518. 10309 #define DSP_CMD_16BITAUTO_OUT   0xB6  /* 16 bit auto-initialized output */
  519. 10310 #define DSP_CMD_IRQREQ8         0xF2  /* Interrupt request 8 bit        */
  520. 10311 #define DSP_CMD_IRQREQ16        0xF3  /* Interrupt request 16 bit        */
  521. 10312
  522. 10313
  523. 10314 /* DSP Modes */
  524. 10315 #define DSP_MODE_MONO_US        0x00  /* Mono unsigned */
  525. 10316 #define DSP_MODE_MONO_S         0x10  /* Mono signed */
  526. 10317 #define DSP_MODE_STEREO_US      0x20  /* Stereo unsigned */
  527. 10318 #define DSP_MODE_STEREO_S       0x30  /* Stereo signed */
  528. 10319
  529. 10320
  530. 10321 /* MIXER commands */
  531. 10322 #define MIXER_RESET             0x00  /* Reset */
  532. 10323 #define MIXER_DAC_LEVEL         0x04  /* Used for detection only */
  533. 10324 #define MIXER_MASTER_LEFT       0x30  /* Master volume left */
  534. 10325 #define MIXER_MASTER_RIGHT      0x31  /* Master volume right */
  535. 10326 #define MIXER_DAC_LEFT          0x32  /* Dac level left */
  536. 10327 #define MIXER_DAC_RIGHT         0x33  /* Dac level right */
  537. 10328 #define MIXER_FM_LEFT           0x34  /* Fm level left */
  538. 10329 #define MIXER_FM_RIGHT          0x35  /* Fm level right */
  539. 10330 #define MIXER_CD_LEFT           0x36  /* Cd audio level left */
  540. 10331 #define MIXER_CD_RIGHT          0x37  /* Cd audio level right */
  541. 10332 #define MIXER_LINE_LEFT         0x38  /* Line in level left */
  542. 10333 #define MIXER_LINE_RIGHT        0x39  /* Line in level right */
  543. 10334 #define MIXER_MIC_LEVEL         0x3A  /* Microphone level */
  544. 10335 #define MIXER_PC_LEVEL          0x3B  /* Pc speaker level */
  545. 10336 #define MIXER_OUTPUT_CTRL       0x3C  /* Output control */
  546. 10337 #define MIXER_IN_LEFT           0x3D  /* Input control left */
  547. 10338 #define MIXER_IN_RIGHT          0x3E  /* Input control right */
  548. 10339 #define MIXER_GAIN_IN_LEFT      0x3F  /* Input gain control left */
  549. 10340 #define MIXER_GAIN_IN_RIGHT     0x40  /* Input gain control right */
  550. 10341 #define MIXER_GAIN_OUT_LEFT     0x41  /* Output gain control left */
  551. 10342 #define MIXER_GAIN_OUT_RIGHT    0x42  /* Output gain control rigth */
  552. 10343 #define MIXER_AGC               0x43  /* Automatic gain control */
  553. 10344 #define MIXER_TREBLE_LEFT       0x44  /* Treble left */
  554. 10345 #define MIXER_TREBLE_RIGHT      0x45  /* Treble right */
  555. 10346 #define MIXER_BASS_LEFT         0x46  /* Bass left */
  556. 10347 #define MIXER_BASS_RIGHT        0x47  /* Bass right */
  557. 10348 #define MIXER_SET_IRQ           0x80  /* Set irq number */
  558. 10349 #define MIXER_SET_DMA           0x81  /* Set DMA channels */
  559. 10350 #define MIXER_IRQ_STATUS        0x82  /* Irq status */
  560. 10351
  561. 10352 /* Mixer constants */
  562. 10353 #define MIC                     0x01  /* Microphone */
  563. 10354 #define CD_RIGHT                0x02   
  564. 10355 #define CD_LEFT                 0x04
  565. 10356 #define LINE_RIGHT              0x08
  566. 10357 #define LINE_LEFT               0x10
  567. 10358 #define FM_RIGHT                0x20
  568. 10359 #define FM_LEFT                 0x40
  569. 10360
  570. 10361 /* DSP constants */
  571. 10362 #define DSP_MAX_SPEED           44100      /* Max sample speed in KHz */
  572. 10363 #define DSP_MIN_SPEED           4000       /* Min sample speed in KHz */
  573. 10364 #define DSP_MAX_FRAGMENT_SIZE   DMA_SIZE   /* Maximum fragment size */
  574. 10365 #define DSP_MIN_FRAGMENT_SIZE   1024       /* Minimum fragment size */
  575. 10366
  576. 10367
  577. 10368 /* Number of bytes you can DMA before hitting a 64K boundary: */
  578. 10369 #define dma_bytes_left(phys)    
  579. 10370    ((unsigned) (sizeof(int) == 2 ? 0 : 0x10000) - (unsigned) ((phys) & 0xFFFF))
  580. 10371
  581. 10372
  582. 10373 /* Function prototypes used by mixer and dsp */
  583. 10374 _PROTOTYPE(int mixer_set, (int reg, int data));
  584. 10375
  585. 10376 #endif /* SB16_H */
  586. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  587. src/kernel/sconst.h    
  588. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  589. 10400 ! Miscellaneous constants used in assembler code.
  590. 10401 W               =       _WORD_SIZE      ! Machine word size.
  591. 10402
  592. 10403 ! Offsets in struct proc. They MUST match proc.h.
  593. 10404 P_STACKBASE     =       0
  594. 10405 #if _WORD_SIZE == 2
  595. 10406 ESREG           =       P_STACKBASE
  596. 10407 #else
  597. 10408 GSREG           =       P_STACKBASE
  598. 10409 FSREG           =       GSREG + 2       ! 386 introduces FS and GS segments
  599. 10410 ESREG           =       FSREG + 2
  600. 10411 #endif
  601. 10412 DSREG           =       ESREG + 2
  602. 10413 DIREG           =       DSREG + 2
  603. 10414 SIREG           =       DIREG + W
  604. 10415 BPREG           =       SIREG + W
  605. 10416 STREG           =       BPREG + W       ! hole for another SP
  606. 10417 BXREG           =       STREG + W
  607. 10418 DXREG           =       BXREG + W
  608. 10419 CXREG           =       DXREG + W
  609. 10420 AXREG           =       CXREG + W
  610. 10421 RETADR          =       AXREG + W       ! return address for save() call
  611. 10422 PCREG           =       RETADR + W
  612. 10423 CSREG           =       PCREG + W
  613. 10424 PSWREG          =       CSREG + W
  614. 10425 SPREG           =       PSWREG + W
  615. 10426 SSREG           =       SPREG + W
  616. 10427 P_STACKTOP      =       SSREG + W
  617. 10428 P_LDT_SEL       =       P_STACKTOP
  618. 10429 P_LDT           =       P_LDT_SEL + W
  619. 10430
  620. 10431 #if _WORD_SIZE == 2
  621. 10432 Msize           =       12              ! size of a message in 16-bit words
  622. 10433 #else
  623. 10434 Msize           =       9               ! size of a message in 32-bit words
  624. 10435 #endif
  625. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  626. src/kernel/tty.h    
  627. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  628. 10500 /*      tty.h - Terminals       */
  629. 10501
  630. 10502 #define TTY_IN_BYTES     256    /* tty input queue size */
  631. 10503 #define TAB_SIZE           8    /* distance between tab stops */
  632. 10504 #define TAB_MASK           7    /* mask to compute a tab stop position */
  633. 10505
  634. 10506 #define ESC             '33'   /* escape */
  635. 10507
  636. 10508 #define O_NOCTTY       00400    /* from <fcntl.h>, or cc will choke */
  637. 10509 #define O_NONBLOCK     04000
  638. 10510
  639. 10511 typedef _PROTOTYPE( void (*devfun_t), (struct tty *tp) );
  640. 10512 typedef _PROTOTYPE( void (*devfunarg_t), (struct tty *tp, int c) );
  641. 10513
  642. 10514 typedef struct tty {
  643. 10515   int tty_events;               /* set when TTY should inspect this line */
  644. 10516
  645. 10517   /* Input queue.  Typed characters are stored here until read by a program. */
  646. 10518   u16_t *tty_inhead;            /* pointer to place where next char goes */
  647. 10519   u16_t *tty_intail;            /* pointer to next char to be given to prog */
  648. 10520   int tty_incount;              /* # chars in the input queue */
  649. 10521   int tty_eotct;                /* number of "line breaks" in input queue */
  650. 10522   devfun_t tty_devread;         /* routine to read from low level buffers */
  651. 10523   devfun_t tty_icancel;         /* cancel any device input */
  652. 10524   int tty_min;                  /* minimum requested #chars in input queue */
  653. 10525   clock_t tty_time;             /* time when the input is available */
  654. 10526   struct tty *tty_timenext;     /* for a list of ttys with active timers */
  655. 10527
  656. 10528   /* Output section. */
  657. 10529   devfun_t tty_devwrite;        /* routine to start actual device output */
  658. 10530   devfunarg_t tty_echo;         /* routine to echo characters input */
  659. 10531   devfun_t tty_ocancel;         /* cancel any ongoing device output */
  660. 10532   devfun_t tty_break;           /* let the device send a break */
  661. 10533
  662. 10534   /* Terminal parameters and status. */
  663. 10535   int tty_position;             /* current position on the screen for echoing */
  664. 10536   char tty_reprint;             /* 1 when echoed input messed up, else 0 */
  665. 10537   char tty_escaped;             /* 1 when LNEXT (^V) just seen, else 0 */
  666. 10538   char tty_inhibited;           /* 1 when STOP (^S) just seen (stops output) */
  667. 10539   char tty_pgrp;                /* slot number of controlling process */
  668. 10540   char tty_openct;              /* count of number of opens of this tty */
  669. 10541
  670. 10542   /* Information about incomplete I/O requests is stored here. */
  671. 10543   char tty_inrepcode;           /* reply code, TASK_REPLY or REVIVE */
  672. 10544   char tty_incaller;            /* process that made the call (usually FS) */
  673. 10545   char tty_inproc;              /* process that wants to read from tty */
  674. 10546   vir_bytes tty_in_vir;         /* virtual address where data is to go */
  675. 10547   int tty_inleft;               /* how many chars are still needed */
  676. 10548   int tty_incum;                /* # chars input so far */
  677. 10549   char tty_outrepcode;          /* reply code, TASK_REPLY or REVIVE */
  678. 10550   char tty_outcaller;           /* process that made the call (usually FS) */
  679. 10551   char tty_outproc;             /* process that wants to write to tty */
  680. 10552   vir_bytes tty_out_vir;        /* virtual address where data comes from */
  681. 10553   int tty_outleft;              /* # chars yet to be output */
  682. 10554   int tty_outcum;               /* # chars output so far */
  683. 10555   char tty_iocaller;            /* process that made the call (usually FS) */
  684. 10556   char tty_ioproc;              /* process that wants to do an ioctl */
  685. 10557   int tty_ioreq;                /* ioctl request code */
  686. 10558   vir_bytes tty_iovir;          /* virtual address of ioctl buffer */
  687. 10559
  688. 10560   /* Miscellaneous. */
  689. 10561   devfun_t tty_ioctl;           /* set line speed, etc. at the device level */
  690. 10562   devfun_t tty_close;           /* tell the device that the tty is closed */
  691. 10563   void *tty_priv;               /* pointer to per device private data */
  692. 10564   struct termios tty_termios;   /* terminal attributes */
  693. 10565   struct winsize tty_winsize;   /* window size (#lines and #columns) */
  694. 10566
  695. 10567   u16_t tty_inbuf[TTY_IN_BYTES];/* tty input buffer */
  696. 10568 } tty_t;
  697. 10569
  698. 10570 EXTERN tty_t tty_table[NR_CONS+NR_RS_LINES+NR_PTYS];
  699. 10571
  700. 10572 /* Values for the fields. */
  701. 10573 #define NOT_ESCAPED        0    /* previous character is not LNEXT (^V) */
  702. 10574 #define ESCAPED            1    /* previous character was LNEXT (^V) */
  703. 10575 #define RUNNING            0    /* no STOP (^S) has been typed to stop output */
  704. 10576 #define STOPPED            1    /* STOP (^S) has been typed to stop output */
  705. 10577
  706. 10578 /* Fields and flags on characters in the input queue. */
  707. 10579 #define IN_CHAR       0x00FF    /* low 8 bits are the character itself */
  708. 10580 #define IN_LEN        0x0F00    /* length of char if it has been echoed */
  709. 10581 #define IN_LSHIFT          8    /* length = (c & IN_LEN) >> IN_LSHIFT */
  710. 10582 #define IN_EOT        0x1000    /* char is a line break (^D, LF) */
  711. 10583 #define IN_EOF        0x2000    /* char is EOF (^D), do not return to user */
  712. 10584 #define IN_ESC        0x4000    /* escaped by LNEXT (^V), no interpretation */
  713. 10585
  714. 10586 /* Times and timeouts. */
  715. 10587 #define TIME_NEVER      ((clock_t) -1 < 0 ? (clock_t) LONG_MAX : (clock_t) -1)
  716. 10588 #define force_timeout() ((void) (tty_timeout = 0))
  717. 10589
  718. 10590 EXTERN tty_t *tty_timelist;     /* list of ttys with active timers */
  719. 10591
  720. 10592 /* Number of elements and limit of a buffer. */
  721. 10593 #define buflen(buf)     (sizeof(buf) / sizeof((buf)[0]))
  722. 10594 #define bufend(buf)     ((buf) + buflen(buf))
  723. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  724. src/kernel/type.h    
  725. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  726. 10600 #ifndef TYPE_H
  727. 10601 #define TYPE_H
  728. 10602
  729. 10603 typedef _PROTOTYPE( void task_t, (void) );
  730. 10604 typedef _PROTOTYPE( int (*rdwt_t), (message *m_ptr) );
  731. 10605 typedef _PROTOTYPE( void (*watchdog_t), (void) );
  732. 10606
  733. 10607 struct tasktab {
  734. 10608   task_t *initial_pc;
  735. 10609   int stksize;
  736. 10610   char name[8];
  737. 10611 };
  738. 10612
  739. 10613 struct memory {
  740. 10614   phys_clicks base;
  741. 10615   phys_clicks size;
  742. 10616 };
  743. 10617
  744. 10618 /* Administration for clock polling. */
  745. 10619 struct milli_state {
  746. 10620   unsigned long accum_count;    /* accumulated clock ticks */
  747. 10621   unsigned prev_count;          /* previous clock value */
  748. 10622 };
  749. 10623
  750. 10624 #if (CHIP == INTEL)
  751. 10625 typedef unsigned port_t;
  752. 10626 typedef unsigned segm_t;
  753. 10627 typedef unsigned reg_t;         /* machine register */
  754. 10628
  755. 10629 /* The stack frame layout is determined by the software, but for efficiency
  756. 10630  * it is laid out so the assembly code to use it is as simple as possible.
  757. 10631  * 80286 protected mode and all real modes use the same frame, built with
  758. 10632  * 16-bit registers.  Real mode lacks an automatic stack switch, so little
  759. 10633  * is lost by using the 286 frame for it.  The 386 frame differs only in
  760. 10634  * having 32-bit registers and more segment registers.  The same names are
  761. 10635  * used for the larger registers to avoid differences in the code.
  762. 10636  */
  763. 10637 struct stackframe_s {           /* proc_ptr points here */
  764. 10638 #if _WORD_SIZE == 4
  765. 10639   u16_t gs;                     /* last item pushed by save */
  766. 10640   u16_t fs;                     /*  ^ */
  767. 10641 #endif
  768. 10642   u16_t es;                     /*  | */
  769. 10643   u16_t ds;                     /*  | */
  770. 10644   reg_t di;                     /* di through cx are not accessed in C */
  771. 10645   reg_t si;                     /* order is to match pusha/popa */
  772. 10646   reg_t fp;                     /* bp */
  773. 10647   reg_t st;                     /* hole for another copy of sp */
  774. 10648   reg_t bx;                     /*  | */
  775. 10649   reg_t dx;                     /*  | */
  776. 10650   reg_t cx;                     /*  | */
  777. 10651   reg_t retreg;                 /* ax and above are all pushed by save */
  778. 10652   reg_t retadr;                 /* return address for assembly code save() */
  779. 10653   reg_t pc;                     /*  ^  last item pushed by interrupt */
  780. 10654   reg_t cs;                     /*  | */
  781. 10655   reg_t psw;                    /*  | */
  782. 10656   reg_t sp;                     /*  | */
  783. 10657   reg_t ss;                     /* these are pushed by CPU during interrupt */
  784. 10658 };
  785. 10659
  786. 10660 struct segdesc_s {              /* segment descriptor for protected mode */
  787. 10661   u16_t limit_low;
  788. 10662   u16_t base_low;
  789. 10663   u8_t base_middle;
  790. 10664   u8_t access;                  /* |P|DL|1|X|E|R|A| */
  791. 10665 #if _WORD_SIZE == 4
  792. 10666   u8_t granularity;             /* |G|X|0|A|LIMT| */
  793. 10667   u8_t base_high;
  794. 10668 #else
  795. 10669   u16_t reserved;
  796. 10670 #endif
  797. 10671 };
  798. 10672
  799. 10673 typedef _PROTOTYPE( int (*irq_handler_t), (int irq) );
  800. 10674
  801. 10675 #endif /* (CHIP == INTEL) */
  802. 10676
  803. 10677 #if (CHIP == M68000)
  804. 10678 typedef _PROTOTYPE( void (*dmaint_t), (void) );
  805. 10679
  806. 10680 typedef u32_t reg_t;            /* machine register */
  807. 10681
  808. 10682 /* The name and fields of this struct were chosen for PC compatibility. */
  809. 10683 struct stackframe_s {
  810. 10684   reg_t retreg;                 /* d0 */
  811. 10685   reg_t d1;
  812. 10686   reg_t d2;
  813. 10687   reg_t d3;
  814. 10688   reg_t d4;
  815. 10689   reg_t d5;
  816. 10690   reg_t d6;
  817. 10691   reg_t d7;
  818. 10692   reg_t a0;
  819. 10693   reg_t a1;
  820. 10694   reg_t a2;
  821. 10695   reg_t a3;
  822. 10696   reg_t a4;
  823. 10697   reg_t a5;
  824. 10698   reg_t fp;                     /* also known as a6 */
  825. 10699   reg_t sp;                     /* also known as a7 */
  826. 10700   reg_t pc;
  827. 10701   u16_t psw;
  828. 10702   u16_t dummy;                  /* make size multiple of reg_t for system.c */
  829. 10703 };
  830. 10704
  831. 10705 struct fsave {
  832. 10706   struct cpu_state {
  833. 10707         u16_t i_format;
  834. 10708         u32_t i_addr;
  835. 10709         u16_t i_state[4];
  836. 10710   } cpu_state;
  837. 10711   struct state_frame {
  838. 10712         u8_t frame_type;
  839. 10713         u8_t frame_size;
  840. 10714         u16_t reserved;
  841. 10715         u8_t frame[212];
  842. 10716   } state_frame;
  843. 10717   struct fpp_model {
  844. 10718         u32_t fpcr;
  845. 10719         u32_t fpsr;
  846. 10720         u32_t fpiar;
  847. 10721         struct fpN {
  848. 10722                 u32_t high;
  849. 10723                 u32_t low;
  850. 10724                 u32_t mid;
  851. 10725         } fpN[8];
  852. 10726   } fpp_model;
  853. 10727 };
  854. 10728 #endif /* (CHIP == M68000) */
  855. 10729
  856. 10730 #endif /* TYPE_H */
  857. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  858. src/kernel/wdeth.h    
  859. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  860. 10800 /*
  861. 10801 wdeth.h
  862. 10802
  863. 10803 Created:        before Dec 28, 1992 by Philip Homburg
  864. 10804 */
  865. 10805
  866. 10806 #ifndef WDETH_H
  867. 10807 #define WDETH_H
  868. 10808
  869. 10809 /* Western Digital Ethercard Plus, or WD8003E card. */
  870. 10810
  871. 10811 #define EPL_REG0         0x0            /* Control(write) and status(read) */
  872. 10812 #define EPL_REG1         0x1
  873. 10813 #define EPL_REG2         0x2
  874. 10814 #define EPL_REG3         0x3
  875. 10815 #define EPL_REG4         0x4
  876. 10816 #define EPL_REG5         0x5
  877. 10817 #define EPL_REG6         0x6
  878. 10818 #define EPL_REG7         0x7
  879. 10819 #define EPL_EA0          0x8            /* Most significant eaddr byte */
  880. 10820 #define EPL_EA1          0x9
  881. 10821 #define EPL_EA2          0xA
  882. 10822 #define EPL_EA3          0xB
  883. 10823 #define EPL_EA4          0xC
  884. 10824 #define EPL_EA5          0xD            /* Least significant eaddr byte */
  885. 10825 #define EPL_TLB          0xE
  886. 10826 #define EPL_CHKSUM       0xF            /* sum from epl_ea0 upto here is 0xFF */
  887. 10827 #define EPL_DP8390      0x10            /* NatSemi chip */
  888. 10828
  889. 10829 #define EPL_MSR         EPL_REG0        /* memory select register */
  890. 10830 #define EPL_ICR         EPL_REG1        /* interface configuration register */
  891. 10831 #define EPL_IRR         EPL_REG4        /* interrupt request register (IRR) */
  892. 10832 #define EPL_790_HWR     EPL_REG4        /* '790 hardware support register */
  893. 10833 #define EPL_LAAR        EPL_REG5        /* LA address register (write only) */
  894. 10834 #define EPL_790_ICR     EPL_REG6        /* '790 interrupt control register */
  895. 10835 #define EPL_GP2         EPL_REG7        /* general purpose register 2 */
  896. 10836 #define EPL_790_B       EPL_EA3         /* '790 memory register */
  897. 10837 #define EPL_790_GCR     EPL_EA5         /* '790 General Control Register */
  898. 10838
  899. 10839 /* Bits in EPL_MSR */
  900. 10840 #define E_MSR_MEMADDR   0x3F            /* Bits SA18-SA13, SA19 implicit 1 */
  901. 10841 #define E_MSR_MENABLE   0x40            /* Memory Enable */
  902. 10842 #define E_MSR_RESET     0x80            /* Software Reset */
  903. 10843
  904. 10844 /* Bits in EPL_ICR */
  905. 10845 #define E_ICR_16BIT     0x01            /* 16 bit bus */
  906. 10846 #define E_ICR_IR2       0x04            /* bit 2 of encoded IRQ */
  907. 10847 #define E_ICR_MEMBIT    0x08            /* 583 mem size mask */
  908. 10848
  909. 10849 /* Bits in EPL_IRR */
  910. 10850 #define E_IRR_IR0       0x20            /* bit 0 of encoded IRQ */
  911. 10851 #define E_IRR_IR1       0x40            /* bit 1 of encoded IRQ */
  912. 10852 #define E_IRR_IEN       0x80            /* enable interrupts */
  913. 10853
  914. 10854 /* Bits in EPL_LAAR */
  915. 10855 #define E_LAAR_A19      0x01            /* address lines for above 1M ram */
  916. 10856 #define E_LAAR_A20      0x02            /* address lines for above 1M ram */
  917. 10857 #define E_LAAR_A21      0x04            /* address lines for above 1M ram */
  918. 10858 #define E_LAAR_A22      0x08            /* address lines for above 1M ram */
  919. 10859 #define E_LAAR_A23      0x10            /* address lines for above 1M ram */
  920. 10860 #define E_LAAR_SOFTINT  0x20            /* enable software interrupt */
  921. 10861 #define E_LAAR_LAN16E   0x40            /* enables 16 bit RAM for LAN */
  922. 10862 #define E_LAAR_MEM16E   0x80            /* enables 16 bit RAM for host */
  923. 10863
  924. 10864 /* Bits and values in EPL_TLB */
  925. 10865 #define E_TLB_EB        0x05            /* WD8013EB */
  926. 10866 #define E_TLB_E         0x27            /* WD8013 Elite */
  927. 10867 #define E_TLB_SMCE      0x29            /* SMC Elite 16 */
  928. 10868 #define E_TLB_SMC8216C  0x2B            /* SMC 8216 C */
  929. 10869
  930. 10870 #define E_TLB_REV       0x1F            /* revision mask */
  931. 10871 #define E_TLB_SOFT      0x20            /* soft config */
  932. 10872 #define E_TLB_RAM       0x40            /* extra ram bit */
  933. 10873
  934. 10874 /* Bits in EPL_790_HWR */
  935. 10875 #define E_790_HWR_SWH   0x80            /* switch register set */
  936. 10876
  937. 10877 /* Bits in EPL_790_ICR */
  938. 10878 #define E_790_ICR_EIL   0x01            /* enable interrupts */
  939. 10879
  940. 10880 /* Bits in EPL_790_GCR when E_790_HWR_SWH is set in EPL_790_HWR */
  941. 10881 #define E_790_GCR_IR0   0x04            /* bit 0 of encoded IRQ */
  942. 10882 #define E_790_GCR_IR1   0x08            /* bit 1 of encoded IRQ */
  943. 10883 #define E_790_GCR_IR2   0x40            /* bit 2 of encoded IRQ */
  944. 10884
  945. 10885
  946. 10886 #define inb_we(dep, reg) (in_byte(dep->de_base_port+reg))
  947. 10887 #define outb_we(dep, reg, data) (out_byte(dep->de_base_port+reg, data))
  948. 10888
  949. 10889 #endif /* WDETH_H */
  950. 10890
  951. 10891 /*
  952. 10892  * $PchHeader: /mount/hd2/minix/sys/kernel/ibm/RCS/wdeth.h,v 1.3 1994/10/31 10:36:29 philip Exp $
  953. 10893  */
  954. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  955. src/kernel/aha_scsi.c    
  956. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  957. 10900 /*
  958. 10901  * This file contains the device dependent part of an experimental disk
  959. 10902  * and tape driver for the Adaptec 154x SCSI Host Adapter family, written
  960. 10903  * by James da Silva (jds@cs.umd.edu).
  961. 10904  *
  962. 10905  * I wrote this driver using the technical documentation for the AHA available
  963. 10906  * from the Adaptec BBS at 1-408-945-7727, and from the SCSI standard drafts
  964. 10907  * available on NCR's SCSI BBS at 1-316-636-8700.  I suggest you get both
  965. 10908  * these documents if you want to understand and hack this code.
  966. 10909  *
  967. 10910  * This code has been extensively modified by Kees J. Bot (kjb@cs.vu.nl) to
  968. 10911  * a point that James will barely recognize it as his.  It is completely
  969. 10912  * remodeled and doubled in both size and functionality.  It is no longer
  970. 10913  * considered experimental either.
  971. 10914  *
  972. 10915  * The supported device numbers are as follows:
  973. 10916  *   #  Name    Device
  974. 10917  *   0  sd0     disk 0, entire disk
  975. 10918  *   1  sd1     disk 0, partition 1
  976. 10919  *   2  sd2     disk 0, partition 2
  977. 10920  *   3  sd3     disk 0, partition 3
  978. 10921  *   4  sd4     disk 0, partition 4
  979. 10922  *   5  sd5     disk 1, entire disk
  980. 10923  *   6  sd6     disk 1, partition 1
  981. 10924  *  ..  ....    ....
  982. 10925  *  39  sd39    disk 7, partition 4
  983. 10926  *
  984. 10927  *  64  nrst0   tape 0, no rewind
  985. 10928  *  65  rst0    tape 0, rewind
  986. 10929  *  66  nrst1   tape 1, no rewind
  987. 10930  *  ..  ....    ....
  988. 10931  *  79  rst7    tape 7, rewind
  989. 10932  *
  990. 10933  * 128  sd1a    disk 0, partition 1, subpartition 1
  991. 10934  * 129  sd1b    disk 0, partition 1, subpartition 2
  992. 10935  * ...  ....    ....
  993. 10936  * 255  sd39d   disk 7, partition 4, subpartition 4
  994. 10937  *
  995. 10938  * The translation of device numbers to targets and logical units is very
  996. 10939  * simple:  The target is the same as the disk or tape number, the logical
  997. 10940  * unit is always zero.  Devices with logical unit numbers other then zero
  998. 10941  * are virtually extinct.  If you happen to have such a dinosaur device,
  999. 10942  * then you can reprogram (e.g.) sd35 and st7 to target 0, lun 1 from the
  1000. 10943  * Boot Monitor with 'sd35=0,1'.
  1001. 10944  *
  1002. 10945  *
  1003. 10946  * The file contains one entry point:
  1004. 10947  *
  1005. 10948  *   aha_scsi_task:     main entry when system is brought up
  1006. 10949  *
  1007. 10950  *
  1008. 10951  * Changes:
  1009. 10952  *       5 May 1992 by Kees J. Bot: device dependent/independent split.
  1010. 10953  *       7 Jul 1992 by Kees J. Bot: speedup & features.
  1011. 10954  *      28 Dec 1992 by Kees J. Bot: completely remodeled & virtual memory.
  1012. 10955  *      18 Sep 1994 by Kees J. Bot: removed "send 2 commands at once" junk.
  1013. 10956  */
  1014. 10957 #include "kernel.h"
  1015. 10958 #include "driver.h"
  1016. 10959 #include "drvlib.h"
  1017. 10960 #if ENABLE_ADAPTEC_SCSI
  1018. 10961 #include <fcntl.h>
  1019. 10962 #include <sys/ioctl.h>
  1020. 10963 #include <sys/mtio.h>
  1021. 10964 #include "assert.h"
  1022. 10965 INIT_ASSERT
  1023. 10966
  1024. 10967
  1025. 10968 #ifndef AHA_DEBUG
  1026. 10969 #define AHA_DEBUG       0       /* 1=print all SCSI errors | 2=dump ccb
  1027. 10970                                  * 4=show request | 8=dump scsi cmd
  1028. 10971                                  */
  1029. 10972 #endif
  1030. 10973
  1031. 10974 /* AHA-154x port addresses */
  1032. 10975 #define AHA_BASEREG     0x330   /* default base port address of AHA registers */
  1033. 10976 #define AHA_CNTLREG     aha_basereg+0   /* Control Register - write only */
  1034. 10977 #define AHA_STATREG     aha_basereg+0   /* Status Register - read only */
  1035. 10978 #define AHA_DATAREG     aha_basereg+1   /* Data Register - read/write */
  1036. 10979 #define AHA_INTRREG     aha_basereg+2   /* Interrupt Flags - read only */
  1037. 10980
  1038. 10981 /* control register bits */
  1039. 10982 #define AHA_HRST        0x80    /* bit 7 - Hard Reset */
  1040. 10983 #define AHA_SRST        0x40    /* bit 6 - Soft Reset */
  1041. 10984 #define AHA_IRST        0x20    /* bit 5 - Interrupt Reset */
  1042. 10985 #define AHA_SCRST       0x10    /* bit 4 - SCSI Bus Reset */
  1043. 10986 /*                      0x08     * bit 3 - Reserved (set to 0) */
  1044. 10987 /*                      0x04     * bit 2 - Reserved (set to 0) */
  1045. 10988 /*                      0x02     * bit 1 - Reserved (set to 0) */
  1046. 10989 /*                      0x01     * bit 0 - Reserved (set to 0) */
  1047. 10990
  1048. 10991 /* status register bits */
  1049. 10992 #define AHA_STST        0x80    /* bit 7 - Self Test in Progress */
  1050. 10993 #define AHA_DIAGF       0x40    /* bit 6 - Internal Diagnostic Failure */
  1051. 10994 #define AHA_INIT        0x20    /* bit 5 - Mailbox Initialization Required */
  1052. 10995 #define AHA_IDLE        0x10    /* bit 4 - SCSI Host Adapter Idle */
  1053. 10996 #define AHA_CDF         0x08    /* bit 3 - Command/Data Out Port Full */
  1054. 10997 #define AHA_DF          0x04    /* bit 2 - Data In Port Full */
  1055. 10998 /*                      0x02     * bit 1 - Reserved */
  1056. 10999 #define AHA_INVDCMD     0x01    /* bit 0 - Invalid Host Adapter Command */
  1057. 11000
  1058. 11001 /* interrupt flags register bits */
  1059. 11002 #define AHA_ANYINT      0x80    /* bit 7 - Any Interrupt */
  1060. 11003 /*                      0x40     * bit 6 - Reserved */
  1061. 11004 /*                      0x20     * bit 5 - Reserved */
  1062. 11005 /*                      0x10     * bit 4 - Reserved */
  1063. 11006 #define AHA_SCRD        0x08    /* bit 3 - SCSI Reset Detected */
  1064. 11007 #define AHA_HACC        0x04    /* bit 2 - Host Adapter Command Complete */
  1065. 11008 #define AHA_MBOE        0x02    /* bit 1 - Mailbox Out Empty */
  1066. 11009 #define AHA_MBIF        0x01    /* bit 0 - Mailbox In Full */
  1067. 11010
  1068. 11011 /* AHA board models */
  1069. 11012 #define AHA1540         0x30
  1070. 11013 #define AHA1540A        0x41
  1071. 11014 #define AHA1640         0x42
  1072. 11015 #define AHA1740         0x43
  1073. 11016 #define AHA1540C        0x44
  1074. 11017 #define AHA1540CF       0x45
  1075. 11018 #define BT545           0x20    /* BusLogic */
  1076. 11019
  1077. 11020 /* AHA Command Codes */
  1078. 11021 #define AHACOM_INITBOX          0x01    /* Mailbox Initialization */
  1079. 11022 #define AHACOM_STARTSCSI        0x02    /* Start SCSI Command */
  1080. 11023 #define AHACOM_HAINQUIRY        0x04    /* Host Adapter Inquiry */
  1081. 11024 #define AHACOM_SETIMEOUT        0x06    /* Set SCSI selection time out value */
  1082. 11025 #define AHACOM_BUSON            0x07    /* Set DMA bus on time */
  1083. 11026 #define AHACOM_BUSOFF           0x08    /* Set DMA bus off time */
  1084. 11027 #define AHACOM_SPEED            0x09    /* Set DMA transfer speed */
  1085. 11028 #define AHACOM_INSTALLED        0x0A    /* Return Installed Devices */
  1086. 11029 #define AHACOM_GETCONFIG        0x0B    /* Return Configuration Data */
  1087. 11030 #define AHACOM_GETSETUP         0x0D    /* Return Setup Data */
  1088. 11031 #define AHACOM_EXTBIOS          0x28    /* Return Extended BIOS Info */
  1089. 11032 #define AHACOM_MBOX_ENABLE      0x29    /* Enable Mailbox Interface */
  1090. 11033
  1091. 11034 /* AHA Mailbox Out Codes */
  1092. 11035 #define AHA_MBOXFREE    0x00    /* Mailbox is Free */
  1093. 11036 #define AHA_MBOXSTART   0x01    /* Start Command */
  1094. 11037 #define AHA_MBOXABORT   0x02    /* Abort Command */
  1095. 11038 /* AHA Mailbox In Codes */
  1096. 11039 #define AHA_MBOXOK      0x01    /* Command Completed Successfully */
  1097. 11040 #define AHA_MBOXERR     0x04    /* Command Completed with Error */
  1098. 11041
  1099. 11042
  1100. 11043 /* Basic types */
  1101. 11044 typedef unsigned char byte;
  1102. 11045 typedef byte big16[2];  /* 16 bit big-endian values */
  1103. 11046 typedef byte big24[3];  /* AHA uses 24 bit, big-endian values! */
  1104. 11047 typedef byte big32[4];  /* Group 1 SCSI commands use 32 bit big-endian values */
  1105. 11048
  1106. 11049 /* AHA Mailbox structure */
  1107. 11050 typedef struct {
  1108. 11051   byte status;          /* Command or Status byte */
  1109. 11052   big24 ccbptr;         /* pointer to Command Control Block */
  1110. 11053 } mailbox_t;
  1111. 11054
  1112. 11055 /* SCSI Group 0 Command Descriptor Block structure */
  1113. 11056 typedef union {
  1114. 11057     struct {    /* Disk i/o commands */
  1115. 11058         byte d_scsi_op;         /* SCSI Operation Code */
  1116. 11059 #           define SCSI_UNITRDY  0x00   /* Test Unit Ready */
  1117. 11060 #           define SCSI_REWIND   0x01   /* Rewind */
  1118. 11061 #           define SCSI_REQSENSE 0x03   /* Request sense */
  1119. 11062 #           define SCSI_RDLIMITS 0x05   /* Read Block Limits Opcode */
  1120. 11063 #           define SCSI_READ     0x08   /* Group 0 Read Opcode */
  1121. 11064 #           define SCSI_WRITE    0x0A   /* Group 0 Write Opcode */
  1122. 11065 #           define SCSI_WREOF    0x10   /* Write File Marks */
  1123. 11066 #           define SCSI_SPACE    0x11   /* Space over filemarks/blocks */
  1124. 11067 #           define SCSI_INQUIRY  0x12   /* Group 0 Inquiry Opcode */
  1125. 11068 #           define SCSI_MDSELECT 0x15   /* Group 0 Mode Select Opcode */
  1126. 11069 #           define SCSI_ERASE    0x19   /* Erase Tape */
  1127. 11070 #           define SCSI_MDSENSE  0x1A   /* Group 0 Mode Sense Opcode */
  1128. 11071 #           define SCSI_STRTSTP  0x1B   /* Start/Stop */
  1129. 11072 #           define SCSI_LOADUNLD 0x1B   /* Load/Unload */
  1130. 11073         big24 d_lba;            /* LUN and logical block address */
  1131. 11074         byte d_nblocks;         /* Transfer size in blocks */
  1132. 11075         byte d_control;         /* Reserved and link bit fields, set to 0 */
  1133. 11076     } d;
  1134. 11077     struct {    /* Tape i/o commands */
  1135. 11078         byte t_scsi_op;         /* SCSI Operation Code */
  1136. 11079         byte t_fixed;           /* Fixed length? */
  1137. 11080         big24 t_trlength;       /* Transfer length */
  1138. 11081         byte t_control;         /* reserved and link bit fields, set to 0 */
  1139. 11082     } t;
  1140. 11083 } cdb0_t;
  1141. 11084 #define scsi_op         d.d_scsi_op
  1142. 11085 #define lba             d.d_lba
  1143. 11086 #define nblocks         d.d_nblocks
  1144. 11087 #define fixed           t.t_fixed
  1145. 11088 #define trlength        t.t_trlength
  1146. 11089 #define control         d.d_control
  1147. 11090
  1148. 11091 /* SCSI Group 1 Command Descriptor Block structure */
  1149. 11092 typedef union {
  1150. 11093     struct {    /* Disk i/o commands */
  1151. 11094         byte d_scsi_op;         /* SCSI Operation Code */
  1152. 11095 #           define SCSI_CAPACITY 0x25   /* Read Capacity */
  1153. 11096 #           define SCSI_READ1    0x28   /* Group 1 Read Opcode */
  1154. 11097 #           define SCSI_WRITE1   0x2A   /* Group 1 Write Opcode */
  1155. 11098         byte d_lunra;           /* LUN etc. */
  1156. 11099         big32 d_lba;            /* Logical Block Address */
  1157. 11100         byte reserved;
  1158. 11101         big16 d_nblocks;        /* transfer size in blocks */
  1159. 11102         byte d_control;         /* reserved and link bit fields, set to 0 */
  1160. 11103     } d;
  1161. 11104 } cdb1_t;
  1162. 11105 #define lunra           d.d_lunra
  1163. 11106
  1164. 11107 /* SCSI Request Sense Information */
  1165. 11108 typedef struct {
  1166. 11109     byte errc;                  /* Error Code, Error Class, and Valid bit */
  1167. 11110     byte segnum;                /* Segment Number */
  1168. 11111     byte key;                   /* Sense Key */
  1169. 11112 #       define sense_key(key)   (key & 0x0F)    /* the key portion */
  1170. 11113 #       define sense_ili(key)   (key & 0x20)    /* illegal block size */
  1171. 11114 #       define sense_eom(key)   (key & 0x40)    /* end-of-media */
  1172. 11115 #       define sense_eof(key)   (key & 0x80)    /* filemark reached */
  1173. 11116     big32 info;                 /* sense info */
  1174. 11117     byte len;                   /* additional length */
  1175. 11118     big32 comspec;              /* command specific info */
  1176. 11119     byte add_code;              /* additional sense code */
  1177. 11120     byte add_qual;              /* additional sense code qualifier */
  1178. 11121 } sense_t;
  1179. 11122
  1180. 11123 /* Interesting SCSI sense key types. */
  1181. 11124 #define SENSE_NO_SENSE          0x00
  1182. 11125 #define SENSE_RECOVERED         0x01
  1183. 11126 #define SENSE_NOT_READY         0x02
  1184. 11127 #define SENSE_HARDWARE          0x04
  1185. 11128 #define SENSE_UNIT_ATT          0x06
  1186. 11129 #define SENSE_BLANK_CHECK       0x08
  1187. 11130 #define SENSE_VENDOR            0x09
  1188. 11131 #define SENSE_ABORTED_CMD       0x0B
  1189. 11132
  1190. 11133 /* SCSI Inquiry Information */
  1191. 11134 typedef struct {
  1192. 11135     byte devtype;               /* Peripheral Device Type */
  1193. 11136 #       define SCSI_DEVDISK     0       /* Direct-access */
  1194. 11137 #       define SCSI_DEVTAPE     1       /* Sequential-access */
  1195. 11138 #       define SCSI_DEVPRN      2       /* Printer */
  1196. 11139 #       define SCSI_DEVCPU      3       /* Processor */
  1197. 11140 #       define SCSI_DEVWORM     4       /* Write-Once Read-Multiple device */
  1198. 11141 #       define SCSI_DEVCDROM    5       /* Read-Only Direct-access */
  1199. 11142 #       define SCSI_DEVSCANNER  6       /* Scanner */
  1200. 11143 #       define SCSI_DEVOPTICAL  7       /* Optical Memory */
  1201. 11144 #       define SCSI_DEVJUKEBOX  8       /* Medium Changer device */
  1202. 11145 #       define SCSI_DEVCOMM     9       /* Communications device */
  1203. 11146 #       define SCSI_DEVMAX      9       /* Last device type we know about */
  1204. 11147 #       define SCSI_DEVUNKNOWN  10      /* If we do not know or care. */
  1205. 11148     byte devqual;               /* Device-Type Qualifier */
  1206. 11149 #       define scsi_rmb(d)      (((d) & 0x80) != 0)     /* Removable? */
  1207. 11150     byte stdver;                /* Version of standard compliance */
  1208. 11151 #       define scsi_isover(v)   (((v) & 0xC0) >> 6)     /* ISO version */
  1209. 11152 #       define scsi_ecmaver(v)  (((v) & 0x38) >> 3)     /* ECMA version */
  1210. 11153 #       define scsi_ansiver(v)  ((v) & 0x07)            /* ANSI version */
  1211. 11154     byte format;                /* Response data format */
  1212. 11155     byte len;                   /* length of remaining info */
  1213. 11156     byte reserved[2];
  1214. 11157     byte flags;
  1215. 11158 #       define scsi_sync(f)     (((f) & 0x10) != 0)     /* Sync SCSI? */
  1216. 11159     char vendor[8];             /* Vendor name */
  1217. 11160     char product[16];           /* Product name */
  1218. 11161     char revision[4];           /* Revision level */
  1219. 11162     char extra[20];             /* Vendor specific */
  1220. 11163 } inquiry_t;
  1221. 11164
  1222. 11165 /* AHA Command Control Block structure */
  1223. 11166 typedef struct {
  1224. 11167     byte opcode;                /* Operation Code */
  1225. 11168 #       define CCB_INIT         0x00            /* SCSI Initiator Command */
  1226. 11169 #       define CCB_TARGET       0x01            /* Target Mode Command */
  1227. 11170 #       define CCB_SCATTER      0x02         /* Initiator with scatter/gather */
  1228. 11171     byte addrcntl;              /* Address and Direction Control: */
  1229. 11172 #       define ccb_scid(id)     (((id)<<5)&0xE0) /* SCSI ID field */
  1230. 11173 #       define CCB_OUTCHECK     0x10             /* Outbound length check */
  1231. 11174 #       define CCB_INCHECK      0x08             /* Inbound length check */
  1232. 11175 #       define CCB_NOCHECK      0x00             /* No length check */
  1233. 11176 #       define ccb_lun(lun)     ((lun)&0x07)     /* SCSI LUN field */
  1234. 11177     byte cmdlen;                /* SCSI Command Length (6 for Group 0) */
  1235. 11178     byte senselen;              /* Request/Disable Sense, Allocation Length */
  1236. 11179 #       define CCB_SENSEREQ     0x0E            /* Request Sense, 14 bytes */
  1237. 11180 #       define CCB_SENSEOFF     0x01            /* Disable Request Sense */
  1238. 11181     big24 datalen;              /* Data Length:  3 bytes, big endian */
  1239. 11182     big24 dataptr;              /* Data Pointer: 3 bytes, big endian */
  1240. 11183     big24 linkptr;              /* Link Pointer: 3 bytes, big endian */
  1241. 11184     byte linkid;                /* Command Linking Identifier */
  1242. 11185     byte hastat;                /* Host Adapter Status */
  1243. 11186 #       define HST_TIMEOUT      0x11            /* SCSI selection timeout */
  1244. 11187     byte tarstat;               /* Target Device Status */
  1245. 11188 #       define TST_CHECK        0x02            /* Check status in sense[] */
  1246. 11189 #       define TST_LUNBUSY      0x08            /* Unit is very busy */
  1247. 11190     byte reserved[2];           /* reserved, set to 0 */
  1248. 11191     byte cmd[sizeof(cdb1_t)];   /* SCSI Command Descriptor Block */
  1249. 11192     byte sense[sizeof(sense_t)];/* SCSI Request Sense Information */
  1250. 11193 } ccb_t;
  1251. 11194
  1252. 11195
  1253. 11196         /* End of one chunk must be as "odd" as the start of the next. */
  1254. 11197 #define DMA_CHECK(end, start)   ((((int) (end) ^ (int) (start)) & 1) == 0)
  1255. 11198
  1256. 11199 /* Scatter/Gather DMA list */
  1257. 11200 typedef struct {
  1258. 11201     big24 datalen;              /* length of a memory segment */
  1259. 11202     big24 dataptr;              /* address of a memory segment */
  1260. 11203 } dma_t;
  1261. 11204
  1262. 11205
  1263. 11206 /* Miscellaneous parameters */
  1264. 11207 #define SCSI_TIMEOUT     250    /* SCSI selection timeout (ms), 0 = none */
  1265. 11208 #define AHA_TIMEOUT      500    /* max msec wait for controller reset */
  1266. 11209
  1267. 11210 #define MAX_DEVICES        8    /* 8 devices for the 8 SCSI targets */
  1268. 11211 #define NR_DISKDEVS      (MAX_DEVICES * DEV_PER_DRIVE)
  1269. 11212 #define NR_TAPEDEVS      (MAX_DEVICES * 2)
  1270. 11213 #define NR_GENDEVS       (MAX_DEVICES)
  1271. 11214 #define SUB_PER_DRIVE    (NR_PARTITIONS * NR_PARTITIONS)
  1272. 11215 #define NR_SUBDEVS       (MAX_DEVICES * SUB_PER_DRIVE)
  1273. 11216 #define MINOR_st0         64
  1274. 11217
  1275. 11218 #define TYPE_SD            0    /* disk device number */
  1276. 11219 #define TYPE_NRST          1    /* non rewind-on-close tape device */
  1277. 11220 #define TYPE_RST           2    /* rewind-on-close tape device */
  1278. 11221
  1279. 11222
  1280. 11223 /* Variables */
  1281. 11224 PRIVATE struct scsi {   /* Per-device table */
  1282. 11225     char targ;                  /* SCSI Target ID */
  1283. 11226     char lun;                   /* SCSI Logical Unit Number */
  1284. 11227     char state;                 /* online? */
  1285. 11228 #       define S_PRESENT        0x01    /* Device exists */
  1286. 11229 #       define S_READY          0x02    /* Device is ready */
  1287. 11230 #       define S_RDONLY         0x04    /* Device is read-only */
  1288. 11231     char devtype;               /* SCSI_DEVDISK, SCSI_DEVTAPE, ... */
  1289. 11232     unsigned block_size;        /* device or media block size */
  1290. 11233     unsigned count_max;         /* maximum single read or write */
  1291. 11234     unsigned open_ct;           /* number of processes using the device */
  1292. 11235     union {
  1293. 11236         struct {                /* Tape data */
  1294. 11237             char open_mode;     /* open for reading or writing? */
  1295. 11238             char at_eof;        /* got EOF mark */
  1296. 11239             char need_eof;      /* need to write an eof mark */
  1297. 11240             char tfixed;        /* tape in fixed mode */
  1298. 11241             struct mtget tstat; /* tape status info */
  1299. 11242             struct device dummypart;  /* something for s_prepare to return */
  1300. 11243         } tape;
  1301. 11244         struct {                /* Disk data */
  1302. 11245             struct device part[DEV_PER_DRIVE];    /* primaries: sd[0-4] */
  1303. 11246             struct device subpart[SUB_PER_DRIVE]; /* subparts: sd[1-4][a-d] */
  1304. 11247         } disk;
  1305. 11248     } u;
  1306. 11249 } scsi[MAX_DEVICES];
  1307. 11250
  1308. 11251 #define open_mode       u.tape.open_mode
  1309. 11252 #define at_eof          u.tape.at_eof
  1310. 11253 #define need_eof        u.tape.need_eof
  1311. 11254 #define tfixed          u.tape.tfixed
  1312. 11255 #define tstat           u.tape.tstat
  1313. 11256 #define dummypart       u.tape.dummypart
  1314. 11257 #define part            u.disk.part
  1315. 11258 #define subpart         u.disk.subpart
  1316. 11259
  1317. 11260 /* Tape device status (tstat.mt_dsreg). */
  1318. 11261 #define DS_OK           0       /* Device OK */
  1319. 11262 #define DS_ERR          1       /* Error state */
  1320. 11263 #define DS_EOF          2       /* Last read or space hit EOF */
  1321. 11264
  1322. 11265 /* SCSI device types */
  1323. 11266 PRIVATE char *scsi_devstr[SCSI_DEVMAX+1] = {
  1324. 11267   "DISK", "TAPE", "PRINTER", "CPU", "WORM", "CDROM", "SCANNER", "OPTICAL",
  1325. 11268   "JUKEBOX", "COMM"
  1326. 11269 };
  1327. 11270
  1328. 11271 /* SCSI sense key types */
  1329. 11272 PRIVATE char *str_scsi_sense[] = {
  1330. 11273   "NO SENSE INFO", "RECOVERED ERROR", "NOT READY", "MEDIUM ERROR",
  1331. 11274   "HARDWARE ERROR", "ILLEGAL REQUEST", "UNIT ATTENTION", "DATA PROTECT",
  1332. 11275   "BLANK CHECK", "VENDOR UNIQUE ERROR", "COPY ABORTED", "ABORTED COMMAND",
  1333. 11276   "EQUAL", "VOLUME OVERFLOW", "MISCOMPARE", "SENSE RESERVED"
  1334. 11277 };
  1335. 11278
  1336. 11279 /* Some of the above errors must be printed on the console. */
  1337. 11280 #if AHA_DEBUG & 1
  1338. 11281 #define sense_serious(key)      ((key) != 0)
  1339. 11282 #else
  1340. 11283 #define sense_serious(key)      ((0xFE1C & (1 << (key))) != 0)
  1341. 11284 #endif
  1342. 11285
  1343. 11286 /* Administration for one SCSI request. */
  1344. 11287 typedef struct request {
  1345. 11288   unsigned count;               /* number of bytes to transfer */
  1346. 11289   unsigned retry;               /* number of tries allowed if retryable */
  1347. 11290   unsigned long pos;            /* first byte on the device to transfer */
  1348. 11291   ccb_t ccb;                    /* Command Control Block */
  1349. 11292   dma_t dmalist[NR_IOREQS];     /* scatter/gather dma list */
  1350. 11293   dma_t *dmaptr;                /* to add scatter/gather entries */
  1351. 11294   dma_t *dmalimit;              /* adapter model dependent limit to list */
  1352. 11295   struct iorequest_s *iov[NR_IOREQS];   /* affected I/O requests */
  1353. 11296 } request_t;
  1354. 11297
  1355. 11298 PRIVATE request_t request;
  1356. 11299 #define rq (&request)           /* current request (there is only one) */
  1357. 11300
  1358. 11301 #define ccb_cmd0(rq)    (* (cdb0_t *) (rq)->ccb.cmd)
  1359. 11302 #define ccb_cmd1(rq)    (* (cdb1_t *) (rq)->ccb.cmd)
  1360. 11303 #define ccb_sense(rq)   (* (sense_t *) ((rq)->ccb.cmd + (rq)->ccb.cmdlen))
  1361. 11304
  1362. 11305 PRIVATE int aha_basereg;        /* base I/O register */
  1363. 11306 PRIVATE int aha_model;          /* board model */
  1364. 11307 PRIVATE struct scsi *s_sp;      /* active SCSI device struct */
  1365. 11308 PRIVATE struct device *s_dv;    /* active partition */
  1366. 11309 PRIVATE int s_type;             /* sd, rst, nrst? */
  1367. 11310 PRIVATE unsigned long s_nextpos;/* next byte on the device to transfer */
  1368. 11311 PRIVATE unsigned long s_buf_blk;/* disk block currently in tmp_buf */
  1369. 11312 PRIVATE int s_opcode;           /* DEV_READ or DEV_WRITE */
  1370. 11313 PRIVATE int s_must;             /* must finish the current request? */
  1371. 11314 PRIVATE int aha_irq;            /* configured IRQ */
  1372. 11315 PRIVATE mailbox_t mailbox[2];   /* out and in mailboxes */
  1373. 11316 PRIVATE inquiry_t inqdata;      /* results of Inquiry command */
  1374. 11317
  1375. 11318
  1376. 11319 /* Functions */
  1377. 11320
  1378. 11321 FORWARD _PROTOTYPE( struct device *s_prepare, (int device) );
  1379. 11322 FORWARD _PROTOTYPE( char *s_name, (void) );
  1380. 11323 FORWARD _PROTOTYPE( int s_do_open, (struct driver *dp, message *m_ptr) );
  1381. 11324 FORWARD _PROTOTYPE( int scsi_probe, (void) );
  1382. 11325 FORWARD _PROTOTYPE( int scsi_sense, (void) );
  1383. 11326 FORWARD _PROTOTYPE( int scsi_inquiry, (void) );
  1384. 11327 FORWARD _PROTOTYPE( int scsi_ndisk, (void) );
  1385. 11328 FORWARD _PROTOTYPE( int scsi_ntape, (void) );
  1386. 11329 FORWARD _PROTOTYPE( int s_schedule, (int proc_nr, struct iorequest_s *iop) );
  1387. 11330 FORWARD _PROTOTYPE( int s_finish, (void) );
  1388. 11331 FORWARD _PROTOTYPE( int s_rdcdrom, (int proc_nr, struct iorequest_s *iop,
  1389. 11332                 unsigned long pos, unsigned nbytes, phys_bytes user_phys) );
  1390. 11333 FORWARD _PROTOTYPE( int s_do_close, (struct driver *dp, message *m_ptr) );
  1391. 11334 FORWARD _PROTOTYPE( int s_do_ioctl, (struct driver *dp, message *m_ptr) );
  1392. 11335 FORWARD _PROTOTYPE( int scsi_simple, (int opcode, int count) );
  1393. 11336 FORWARD _PROTOTYPE( void group0, (void) );
  1394. 11337 FORWARD _PROTOTYPE( void group1, (void) );
  1395. 11338 FORWARD _PROTOTYPE( int scsi_command, (phys_bytes data, vir_bytes len) );
  1396. 11339 FORWARD _PROTOTYPE( void aha_command, (int outlen, byte *outptr,
  1397. 11340                                                 int inlen, byte *inptr) );
  1398. 11341 FORWARD _PROTOTYPE( int aha_reset, (void) );
  1399. 11342 FORWARD _PROTOTYPE( int s_handler, (int irq) );
  1400. 11343
  1401. 11344 FORWARD _PROTOTYPE( void h2b16, (big16 b, U16_t l) );
  1402. 11345 FORWARD _PROTOTYPE( void h2b24, (big24 b, u32_t l) );
  1403. 11346 FORWARD _PROTOTYPE( void h2b32, (big32 b, u32_t l) );
  1404. 11347 FORWARD _PROTOTYPE( u16_t b2h16, (big16 b) );
  1405. 11348 FORWARD _PROTOTYPE( u32_t b2h24, (big24 b) );
  1406. 11349 FORWARD _PROTOTYPE( u32_t b2h32, (big32 b) );
  1407. 11350
  1408. 11351
  1409. 11352 #if AHA_DEBUG & 2
  1410. 11353 FORWARD _PROTOTYPE( void errordump, (void) );
  1411. 11354 #else
  1412. 11355 #define errordump()
  1413. 11356 #endif
  1414. 11357
  1415. 11358 #if AHA_DEBUG & 4
  1416. 11359 FORWARD _PROTOTYPE( void show_req, (void) );
  1417. 11360 #else
  1418. 11361 #define show_req()
  1419. 11362 #endif
  1420. 11363
  1421. 11364 #if AHA_DEBUG & 8
  1422. 11365 FORWARD _PROTOTYPE( void dump_scsi_cmd, (void) );
  1423. 11366 #else
  1424. 11367 #define dump_scsi_cmd()
  1425. 11368 #endif
  1426. 11369
  1427. 11370 FORWARD _PROTOTYPE( void s_geometry, (struct partition *entry));
  1428. 11371
  1429. 11372
  1430. 11373 /* Entry points to this driver. */
  1431. 11374 PRIVATE struct driver s_dtab = {
  1432. 11375   s_name,       /* current device's name */
  1433. 11376   s_do_open,    /* open or mount request, initialize device */
  1434. 11377   s_do_close,   /* release device */
  1435. 11378   s_do_ioctl,   /* tape and partition ioctls */
  1436. 11379   s_prepare,    /* prepare for I/O on a given minor device */
  1437. 11380   s_schedule,   /* precompute SCSI transfer parameters, etc. */
  1438. 11381   s_finish,     /* do the I/O */
  1439. 11382   nop_cleanup,  /* no cleanup needed */
  1440. 11383   s_geometry    /* tell the geometry of the disk */
  1441. 11384 };
  1442. 11385
  1443. 11386
  1444. 11387 /*===========================================================================*
  1445. 11388  *                              aha_scsi_task                                *
  1446. 11389  *===========================================================================*/
  1447. 11390 PUBLIC void aha_scsi_task()
  1448. 11391 {
  1449. 11392 /* Set target and logical unit numbers, then call the generic main loop. */
  1450. 11393   int i;
  1451. 11394   struct scsi *sp;
  1452. 11395   long v;
  1453. 11396   char *name;
  1454. 11397   static char fmt[] = "d,d";
  1455. 11398
  1456. 11399   for (i = 0; i < MAX_DEVICES; i++) {
  1457. 11400         (void) s_prepare(i * DEV_PER_DRIVE);
  1458. 11401         sp = s_sp;
  1459. 11402
  1460. 11403         /* Look into the environment for special parameters. */
  1461. 11404         name = s_name();
  1462. 11405
  1463. 11406         v = i;
  1464. 11407         (void) env_parse(name, fmt, 0, &v, 0L, 7L);
  1465. 11408         sp->targ = v;
  1466. 11409
  1467. 11410         v = 0;
  1468. 11411         (void) env_parse(name, fmt, 1, &v, 0L, 7L);
  1469. 11412         sp->lun = v;
  1470. 11413   }
  1471. 11414   driver_task(&s_dtab);
  1472. 11415 }
  1473. 11418 /*===========================================================================*
  1474. 11419  *                              s_prepare                                    *
  1475. 11420  *===========================================================================*/
  1476. 11421 PRIVATE struct device *s_prepare(device)
  1477. 11422 int device;
  1478. 11423 {
  1479. 11424 /* Prepare for I/O on a device. */
  1480. 11425
  1481. 11426   rq->count = 0;        /* no requests as yet */
  1482. 11427   s_must = TRUE;        /* the first transfers must be done */
  1483. 11428   s_buf_blk = -1;       /* invalidate s_buf_blk */
  1484. 11429
  1485. 11430   if (device < NR_DISKDEVS) {                   /* sd0, sd1, ... */
  1486. 11431         s_type = TYPE_SD;
  1487. 11432         s_sp = &scsi[device / DEV_PER_DRIVE];
  1488. 11433         s_dv = &s_sp->part[device % DEV_PER_DRIVE];
  1489. 11434   } else
  1490. 11435   if ((unsigned) (device - MINOR_hd1a) < NR_SUBDEVS) {  /* sd1a, sd1b, ... */
  1491. 11436         device -= MINOR_hd1a;
  1492. 11437         s_type = TYPE_SD;
  1493. 11438         s_sp = &scsi[device / SUB_PER_DRIVE];
  1494. 11439         s_dv = &s_sp->subpart[device % SUB_PER_DRIVE];
  1495. 11440   } else
  1496. 11441   if ((unsigned) (device - MINOR_st0) < NR_TAPEDEVS) {  /* nrst0, rst0, ... */
  1497. 11442         device -= MINOR_st0;
  1498. 11443         s_type = device & 1 ? TYPE_RST : TYPE_NRST;
  1499. 11444         s_sp = &scsi[device >> 1];
  1500. 11445         s_dv = &s_sp->dummypart;
  1501. 11446   } else {
  1502. 11447         return(NIL_DEV);
  1503. 11448   }
  1504. 11449
  1505. 11450   return(s_dv);
  1506. 11451 }
  1507. 11454 /*===========================================================================*
  1508. 11455  *                              s_name                                       *
  1509. 11456  *===========================================================================*/
  1510. 11457 PRIVATE char *s_name()
  1511. 11458 {
  1512. 11459 /* Return a name for the current device. */
  1513. 11460   static char name[] = "sd35";
  1514. 11461   int n = (s_sp - scsi);
  1515. 11462
  1516. 11463   switch (s_type) {
  1517. 11464   case TYPE_SD:                 /* Disk device: sd* */
  1518. 11465         name[1] = 'd';
  1519. 11466         n *= DEV_PER_DRIVE;
  1520. 11467         break;
  1521. 11468   case TYPE_RST:                /* Tape device: st* */
  1522. 11469   case TYPE_NRST:
  1523. 11470         name[1] = 't';
  1524. 11471         break;
  1525. 11472   }
  1526. 11473   if (n < 10) {
  1527. 11474         name[2] = '0' + n;
  1528. 11475         name[3] = 0;
  1529. 11476   } else {
  1530. 11477         name[2] = '0' + n / 10;
  1531. 11478         name[3] = '0' + n % 10;
  1532. 11479   }
  1533. 11480   return name;
  1534. 11481 }
  1535. 11484 /*===========================================================================*
  1536. 11485  *                              s_do_open                                    *
  1537. 11486  *===========================================================================*/
  1538. 11487 PRIVATE int s_do_open(dp, m_ptr)
  1539. 11488 struct driver *dp;
  1540. 11489 message *m_ptr;
  1541. 11490 {
  1542. 11491   struct scsi *sp;
  1543. 11492   int r;
  1544. 11493
  1545. 11494   if (aha_irq == 0 && !aha_reset()) return(EIO); /* no controller, forget it */
  1546. 11495
  1547. 11496   if (s_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO);
  1548. 11497   sp = s_sp;
  1549. 11498
  1550. 11499   if ((r = scsi_probe()) != OK) return(r);
  1551. 11500
  1552. 11501   if (sp->state & S_RDONLY && m_ptr->COUNT & W_BIT) return(EACCES);
  1553. 11502
  1554. 11503   switch (sp->devtype) {
  1555. 11504   case SCSI_DEVDISK:
  1556. 11505   case SCSI_DEVWORM:
  1557. 11506   case SCSI_DEVCDROM:
  1558. 11507   case SCSI_DEVOPTICAL:
  1559. 11508         /* Read partition tables on first open. */
  1560. 11509         if (sp->open_ct == 0) {
  1561. 11510                 partition(&s_dtab, (int) (sp-scsi) * DEV_PER_DRIVE, P_PRIMARY);
  1562. 11511         }
  1563. 11512         break;
  1564. 11513   case SCSI_DEVTAPE:
  1565. 11514         /* Make sure tape is not already open. */
  1566. 11515         if (sp->open_ct > 0) return(EBUSY);
  1567. 11516
  1568. 11517         sp->open_mode = m_ptr->COUNT;
  1569. 11518         /* If open(..., O_WRONLY) then write a filemark on close even if no
  1570. 11519          * write is done.
  1571. 11520          */
  1572. 11521         sp->need_eof = ((sp->open_mode & (R_BIT|W_BIT)) == W_BIT);
  1573. 11522         break;
  1574. 11523   }
  1575. 11524   sp->open_ct++;
  1576. 11525   return(OK);
  1577. 11526 }
  1578. 11529 /*===========================================================================*
  1579. 11530  *                              scsi_probe                                   *
  1580. 11531  *===========================================================================*/
  1581. 11532 PRIVATE int scsi_probe()
  1582. 11533 {
  1583. 11534 /* See if a device exists and if it is ready. */
  1584. 11535   struct scsi *sp = s_sp;
  1585. 11536   sense_t *sense;
  1586. 11537   int r, key;
  1587. 11538
  1588. 11539   /* Something out there? */
  1589. 11540   if ((r = scsi_sense()) != OK) {
  1590. 11541         if (sp->state & S_PRESENT) {
  1591. 11542                 printf("%s: offlinen", s_name());
  1592. 11543                 sp->state = 0;
  1593. 11544         }
  1594. 11545         return(r);
  1595. 11546   }
  1596. 11547
  1597. 11548   if (!(sp->state & S_PRESENT)) {
  1598. 11549         /* First contact with a new device, what type is it? */
  1599. 11550
  1600. 11551         if ((r = scsi_inquiry()) != OK) return(r);
  1601. 11552
  1602. 11553         sp->devtype = inqdata.devtype;
  1603. 11554   }
  1604. 11555
  1605. 11556   if (!(sp->state & S_READY)) {
  1606. 11557         /* If it's a disk: start it, if it's a tape: load it. */
  1607. 11558         (void) scsi_simple(SCSI_STRTSTP, 1);
  1608. 11559   }
  1609. 11560
  1610. 11561   /* See if the unit is ready for I/O.  A disk may be spinning up, a
  1611. 11562    * floppy or tape drive may be empty.
  1612. 11563    */
  1613. 11564   while ((key = scsi_simple(SCSI_UNITRDY, 0)) != SENSE_NO_SENSE) {
  1614. 11565         /* Not ready, why? */
  1615. 11566
  1616. 11567         sp->state &= ~S_READY;
  1617. 11568
  1618. 11569         switch (key) {
  1619. 11570         case SENSE_UNIT_ATT:
  1620. 11571                 /* A media change or something, try again. */
  1621. 11572                 break;
  1622. 11573         case SENSE_NOT_READY:
  1623. 11574                 /* Look at the additional sense data to see why it isn't
  1624. 11575                  * ready.
  1625. 11576                  */
  1626. 11577                 sense = &ccb_sense(rq);
  1627. 11578                 switch ((sense->add_code << 8) | sense->add_qual) {
  1628. 11579                 case 0x0401:
  1629. 11580                         /* "It is becoming ready."  Fine, we wait. */
  1630. 11581                         milli_delay(1000);
  1631. 11582                         break;
  1632. 11583                 case 0x0402:
  1633. 11584                         /* "Initialization command required."  So we tell it
  1634. 11585                          * to spin up.
  1635. 11586                          */
  1636. 11587                         if (scsi_simple(SCSI_STRTSTP, 1) != SENSE_NO_SENSE)
  1637. 11588                                 return(EIO);
  1638. 11589                         break;
  1639. 11590                 case 0x0403:
  1640. 11591                         /* "Manual intervention required." */
  1641. 11592                 case 0x3A00:
  1642. 11593                         /* "No media present." */
  1643. 11594                         printf("%s: no media loadedn", s_name());
  1644. 11595                         return(EIO);
  1645. 11596                 default:
  1646. 11597                         /* For some reason it is not usable. */
  1647. 11598                         printf("%s: not readyn", s_name());
  1648. 11599                         return(EIO);
  1649. 11600                 }
  1650. 11601                 break;
  1651. 11602         default:
  1652. 11603                 /* The device is in some odd state.  */
  1653. 11604                 if (key != SENSE_NOT_READY) {
  1654. 11605                         printf("%s: hardware errorn", s_name());
  1655. 11606                         return(EIO);
  1656. 11607                 }
  1657. 11608         }
  1658. 11609   }
  1659. 11610
  1660. 11611   if (!(sp->state & S_PRESENT)) {
  1661. 11612         /* Do the inquiry again, the message may have changed. */
  1662. 11613         if (scsi_inquiry() != OK) return(EIO);
  1663. 11614
  1664. 11615         /* Tell what kind of device it is we have found. */
  1665. 11616
  1666. 11617         printf("%s: %-7s %.48sn",
  1667. 11618                 s_name(),
  1668. 11619                 inqdata.devtype > SCSI_DEVMAX ? "UNKNOWN"
  1669. 11620                                 : scsi_devstr[inqdata.devtype],
  1670. 11621                 inqdata.vendor /* + product + revision + extra */);
  1671. 11622   }
  1672. 11623
  1673. 11624   if (!(sp->state & S_READY)) {
  1674. 11625         /* Get the geometry, limits, etc. */
  1675. 11626
  1676. 11627         switch (sp->devtype) {
  1677. 11628         case SCSI_DEVDISK:
  1678. 11629         case SCSI_DEVWORM:
  1679. 11630         case SCSI_DEVCDROM:
  1680. 11631         case SCSI_DEVOPTICAL:
  1681. 11632                 if (scsi_ndisk() != OK) return(EIO);
  1682. 11633                 break;
  1683. 11634         case SCSI_DEVTAPE:
  1684. 11635                 if (scsi_ntape() != OK) return(EIO);
  1685. 11636                 break;
  1686. 11637         default:
  1687. 11638                 printf("%s: unsupportedn", s_name());
  1688. 11639                 return(EIO);
  1689. 11640         }
  1690. 11641   }
  1691. 11642   return(OK);
  1692. 11643 }
  1693. 11646 /*===========================================================================*
  1694. 11647  *                              scsi_sense                                   *
  1695. 11648  *===========================================================================*/
  1696. 11649 PRIVATE int scsi_sense()
  1697. 11650 {
  1698. 11651   int key;
  1699. 11652   sense_t *sense = (sense_t *) tmp_buf;
  1700. 11653
  1701. 11654   /* Do a request sense to find out if a target exists or to check out
  1702. 11655    * a unit attention condition.
  1703. 11656    */
  1704. 11657   key = scsi_simple(SCSI_REQSENSE, sizeof(sense_t));
  1705. 11658
  1706. 11659   if (rq->ccb.hastat == HST_TIMEOUT) return(ENXIO);     /* nothing there */
  1707. 11660   if (rq->ccb.hastat != 0) return(EIO);         /* something very bad */
  1708. 11661
  1709. 11662   /* There is something out there for sure. */
  1710. 11663   if (key == SENSE_UNIT_ATT || sense_key(sense->key) == SENSE_UNIT_ATT) {
  1711. 11664         /* Device is in a "look at me" state, probably changed media. */
  1712. 11665         s_sp->state &= ~S_READY;
  1713. 11666   }
  1714. 11667   return(OK);
  1715. 11668 }
  1716. 11671 /*===========================================================================*
  1717. 11672  *                              scsi_inquiry                                 *
  1718. 11673  *===========================================================================*/
  1719. 11674 PRIVATE int scsi_inquiry()
  1720. 11675 {
  1721. 11676   /* Prefill with nulls. */
  1722. 11677   memset(tmp_buf, '', sizeof(inquiry_t));
  1723. 11678
  1724. 11679   /* Do a SCSI inquiry. */
  1725. 11680   if (scsi_simple(SCSI_INQUIRY, sizeof(inquiry_t)) != SENSE_NO_SENSE)
  1726. 11681         return(EIO);
  1727. 11682   inqdata = * (inquiry_t *) tmp_buf;
  1728. 11683
  1729. 11684   if (inqdata.len == 0) {
  1730. 11685         /* The device doesn't return meaningful text fields. */
  1731. 11686         strcpy(inqdata.vendor, "(unknown)");
  1732. 11687   }
  1733. 11688
  1734. 11689   /* The top three bits of devtype must be zero for the lun to exist. */
  1735. 11690   if ((inqdata.devtype & 0xE0) != 0) return(ENXIO);
  1736. 11691
  1737. 11692   return(OK);
  1738. 11693 }
  1739. 11696 /*===========================================================================*
  1740. 11697  *                              scsi_ndisk                                   *
  1741. 11698  *===========================================================================*/
  1742. 11699 PRIVATE int scsi_ndisk()
  1743. 11700 {
  1744. 11701 /* Gather disk data, capacity and block size. */
  1745. 11702
  1746. 11703   struct scsi *sp = s_sp;
  1747. 11704   unsigned long capacity = -1, block_size = SECTOR_SIZE;
  1748. 11705   byte *buf = tmp_buf;
  1749. 11706
  1750. 11707   /* Minor device type must be for a disk. */
  1751. 11708   if (s_type != TYPE_SD) return(EIO);
  1752. 11709
  1753. 11710   if (sp->devtype == SCSI_DEVCDROM) {
  1754. 11711         /* Read-only by definition. */
  1755. 11712         sp->state |= S_RDONLY;
  1756. 11713   } else {
  1757. 11714         /* SCSI modesense to find out if the disk is write protected. */
  1758. 11715         if (scsi_simple(SCSI_MDSENSE, 255) != SENSE_NO_SENSE) return(EIO);
  1759. 11716
  1760. 11717         /* Write protected? */
  1761. 11718         sp->state &= ~S_RDONLY;
  1762. 11719         if (buf[2] & 0x80) sp->state |= S_RDONLY;
  1763. 11720
  1764. 11721         /* Don't write a worm disk, not wise at the moment. */
  1765. 11722         if (sp->devtype == SCSI_DEVWORM) sp->state |= S_RDONLY;
  1766. 11723   }
  1767. 11724
  1768. 11725   /* Get drive capacity and block size. */
  1769. 11726   group1();
  1770. 11727   rq->ccb.opcode = CCB_INIT;
  1771. 11728   ccb_cmd1(rq).scsi_op = SCSI_CAPACITY;
  1772. 11729
  1773. 11730   if (scsi_command(tmp_phys, 8) == SENSE_NO_SENSE) {
  1774. 11731         capacity = b2h32(buf + 0) + 1;
  1775. 11732         block_size = b2h32(buf + 4);
  1776. 11733         printf("%s: capacity %lu x %lu bytesn",
  1777. 11734                                         s_name(), capacity, block_size);
  1778. 11735   } else {
  1779. 11736         printf("%s: unknown capacityn", s_name());
  1780. 11737   }
  1781. 11738
  1782. 11739   /* We do not believe block sizes over 4 kb. */
  1783. 11740   if (block_size > 4096) {
  1784. 11741         printf("%s: can't handle %lu byte blocksn", s_name(), block_size);
  1785. 11742         return(EIO);
  1786. 11743   }
  1787. 11744
  1788. 11745   sp->block_size = block_size;
  1789. 11746 #if _WORD_SIZE > 2
  1790. 11747   /* Keep it within reach of a group 0 command. */
  1791. 11748   sp->count_max = 0x100 * block_size;
  1792. 11749 #else
  1793. 11750   sp->count_max = block_size > UINT_MAX/0x100 ? UINT_MAX : 0x100 * block_size;
  1794. 11751 #endif
  1795. 11752
  1796. 11753   /* The fun ends at 4GB. */
  1797. 11754   if (capacity > ((unsigned long) -1) / block_size)
  1798. 11755         sp->part[0].dv_size = -1;
  1799. 11756   else
  1800. 11757         sp->part[0].dv_size = capacity * block_size;
  1801. 11758
  1802. 11759   /* Finally we recognize its existence. */
  1803. 11760   sp->state |= S_PRESENT|S_READY;
  1804. 11761
  1805. 11762   return(OK);
  1806. 11763 }
  1807. 11766 /*===========================================================================*
  1808. 11767  *                              scsi_ntape                                   *
  1809. 11768  *===========================================================================*/
  1810. 11769 PRIVATE int scsi_ntape()
  1811. 11770 {
  1812. 11771 /* Gather tape data, block limits, fixed block size or not. */
  1813. 11772   struct scsi *sp = s_sp;
  1814. 11773   unsigned minblk;
  1815. 11774   unsigned long maxblk;
  1816. 11775   byte *buf = tmp_buf;
  1817. 11776
  1818. 11777   /* Minor device type must be for a tape. */
  1819. 11778   if (s_type != TYPE_RST && s_type != TYPE_NRST) return(EIO);
  1820. 11779
  1821. 11780   /* Read limits. */
  1822. 11781   if (scsi_simple(SCSI_RDLIMITS, 6) != SENSE_NO_SENSE) return(EIO);
  1823. 11782   minblk = b2h16(buf + 4);
  1824. 11783   maxblk = b2h24(buf + 1);
  1825. 11784
  1826. 11785   printf("%s: limits: min block len %u, max block len %lun",
  1827. 11786         s_name(), minblk, maxblk);
  1828. 11787
  1829. 11788   if (sp->state & S_PRESENT) {
  1830. 11789         /* Keep the current block size. */
  1831. 11790         if (sp->tfixed) minblk= maxblk= sp->block_size;
  1832. 11791   }
  1833. 11792
  1834. 11793   sp->tstat.mt_dsreg = DS_OK;
  1835. 11794   sp->tstat.mt_erreg = 0;
  1836. 11795   sp->tstat.mt_fileno = 0;
  1837. 11796   sp->tstat.mt_blkno = 0;
  1838. 11797   sp->tstat.mt_resid = 0;
  1839. 11798
  1840. 11799   if (minblk == maxblk) {
  1841. 11800         /* Fixed block length. */
  1842. 11801         sp->tfixed = TRUE;
  1843. 11802         sp->block_size = minblk;
  1844. 11803         sp->tstat.mt_blksize = minblk;
  1845. 11804         sp->count_max = UINT_MAX;
  1846. 11805   } else {
  1847. 11806         /* Variable block length. */
  1848. 11807         sp->tfixed = FALSE;
  1849. 11808         sp->block_size = 1;
  1850. 11809         sp->tstat.mt_blksize = 0;
  1851. 11810         sp->count_max = maxblk == 0 ? UINT_MAX : maxblk;
  1852. 11811   }
  1853. 11812
  1854. 11813   /* SCSI modesense. */
  1855. 11814   if (scsi_simple(SCSI_MDSENSE, 255) != SENSE_NO_SENSE) return(EIO);
  1856. 11815
  1857. 11816   /* Write protected? */
  1858. 11817   sp->state &= ~S_RDONLY;
  1859. 11818   if (buf[2] & 0x80) sp->state |= S_RDONLY;
  1860. 11819
  1861. 11820   /* Density and block size. */
  1862. 11821   if (buf[3] >= 8) {
  1863. 11822         printf("%s: density 0x%02x, nblocks %lu, block len ",
  1864. 11823                 s_name(),
  1865. 11824                 buf[4],
  1866. 11825                 b2h24(buf + 4 + 1));
  1867. 11826         printf(sp->tfixed ? "%lun" : "variablen", b2h24(buf + 4 + 5));
  1868. 11827   }
  1869. 11828
  1870. 11829   sp->state |= S_PRESENT|S_READY;
  1871. 11830   return(OK);
  1872. 11831 }
  1873. 11834 /*===========================================================================*
  1874. 11835  *                              s_schedule                                   *
  1875. 11836  *===========================================================================*/
  1876. 11837 PRIVATE int s_schedule(proc_nr, iop)
  1877. 11838 int proc_nr;                    /* process doing the request */
  1878. 11839 struct iorequest_s *iop;        /* pointer to read or write request */
  1879. 11840 {
  1880. 11841 /* Gather I/O requests on consecutive blocks so they may be read/written
  1881. 11842  * in one SCSI command using scatter/gather DMA.
  1882. 11843  */
  1883. 11844   struct scsi *sp = s_sp;
  1884. 11845   int r, opcode, spanning;
  1885. 11846   unsigned nbytes, count;
  1886. 11847   unsigned long pos;
  1887. 11848   phys_bytes user_phys, dma_phys;
  1888. 11849   static unsigned dma_count;
  1889. 11850   static struct iorequest_s **iopp;     /* to add I/O request pointers */
  1890. 11851   static phys_bytes dma_last;   /* address of end of the last added entry */
  1891. 11852
  1892. 11853   /* This many bytes to read/write */
  1893. 11854   nbytes = iop->io_nbytes;
  1894. 11855
  1895. 11856   /* From/to this position on the device */
  1896. 11857   pos = iop->io_position;
  1897. 11858
  1898. 11859   /* To/from this user address */
  1899. 11860   user_phys = numap(proc_nr, (vir_bytes) iop->io_buf, nbytes);
  1900. 11861   if (user_phys == 0) return(iop->io_nbytes = EINVAL);
  1901. 11862
  1902. 11863   /* Read or write? */
  1903. 11864   opcode = iop->io_request & ~OPTIONAL_IO;
  1904. 11865
  1905. 11866   switch (sp->devtype) {
  1906. 11867   case SCSI_DEVCDROM:
  1907. 11868   case SCSI_DEVWORM:
  1908. 11869   case SCSI_DEVDISK:
  1909. 11870   case SCSI_DEVOPTICAL:
  1910. 11871         /* Which block on disk and how close to EOF? */
  1911. 11872         if (pos >= s_dv->dv_size) return(OK);           /* At EOF */
  1912. 11873         if (pos + nbytes > s_dv->dv_size) nbytes = s_dv->dv_size - pos;
  1913. 11874         pos += s_dv->dv_base;
  1914. 11875
  1915. 11876         if ((nbytes % sp->block_size) != 0 || (pos % sp->block_size) != 0) {
  1916. 11877                 /* Not on a device block boundary.  CD-ROM? */
  1917. 11878                 return(s_rdcdrom(proc_nr, iop, pos, nbytes, user_phys));
  1918. 11879         }
  1919. 11880         break;
  1920. 11881
  1921. 11882   case SCSI_DEVTAPE:
  1922. 11883         if ((nbytes % sp->block_size) != 0)
  1923. 11884                 return(iop->io_nbytes = EINVAL);
  1924. 11885
  1925. 11886         /* Old error condition? */
  1926. 11887         if (sp->tstat.mt_dsreg == DS_ERR) return(iop->io_nbytes = EIO);
  1927. 11888
  1928. 11889         if (opcode == DEV_READ && sp->at_eof) return(OK);
  1929. 11890
  1930. 11891         s_nextpos = pos = 0;    /* pos is ignored */
  1931. 11892         break;
  1932. 11893
  1933. 11894   default:
  1934. 11895         return(iop->io_nbytes = EIO);
  1935. 11896   }
  1936. 11897
  1937. 11898   /* Probe a device that isn't ready. */
  1938. 11899   if (!(sp->state & S_READY) && scsi_probe() != OK) return(EIO);
  1939. 11900
  1940. 11901   if (rq->count > 0 && pos != s_nextpos) {
  1941. 11902         /* This new request can't be chained to the job being built. */
  1942. 11903         if ((r = s_finish()) != OK) return(r);
  1943. 11904   }
  1944. 11905
  1945. 11906   /* The next consecutive block starts at byte position... */
  1946. 11907   s_nextpos = pos + nbytes;
  1947. 11908
  1948. 11909   spanning = FALSE;     /* set if a request spans several DMA vectors */
  1949. 11910
  1950. 11911   /* While there are "unscheduled" bytes in the request: */
  1951. 11912   do {
  1952. 11913         dma_phys = user_phys;
  1953. 11914
  1954. 11915         if (rq->count > 0 && (
  1955. 11916                 rq->count == sp->count_max
  1956. 11917                 || rq->dmaptr == rq->dmalimit
  1957. 11918                 || !DMA_CHECK(dma_last, dma_phys)
  1958. 11919         )) {
  1959. 11920                 /* This request can not be added to the scatter/gather list. */
  1960. 11921                 if ((r = s_finish()) != OK) return(r);
  1961. 11922                 s_must = spanning;
  1962. 11923
  1963. 11924                 continue;       /* try again */
  1964. 11925         }
  1965. 11926
  1966. 11927         if (rq->count == 0) {
  1967. 11928                 /* The first request in a row, initialize. */
  1968. 11929                 rq->pos = pos;
  1969. 11930                 s_opcode = opcode;
  1970. 11931                 iopp = rq->iov;
  1971. 11932                 rq->dmaptr = rq->dmalist;
  1972. 11933                 rq->retry = 2;
  1973. 11934         }
  1974. 11935
  1975. 11936         count = nbytes;
  1976. 11937
  1977. 11938         /* Don't exceed the maximum transfer count. */
  1978. 11939         if (rq->count + count > sp->count_max)
  1979. 11940                 count = sp->count_max - rq->count;
  1980. 11941
  1981. 11942         /* New scatter/gather entry. */
  1982. 11943         h2b24(rq->dmaptr->dataptr, dma_phys);
  1983. 11944         h2b24(rq->dmaptr->datalen, (u32_t) (dma_count = count));
  1984. 11945         rq->dmaptr++;
  1985. 11946         dma_last = dma_phys + count;
  1986. 11947
  1987. 11948         /* Which I/O request? */
  1988. 11949         *iopp++ = iop;
  1989. 11950
  1990. 11951         /* Update counters. */
  1991. 11952         rq->count += count;
  1992. 11953         pos += count;
  1993. 11954         user_phys += count;
  1994. 11955         nbytes -= count;
  1995. 11956         if (!(iop->io_request & OPTIONAL_IO)) s_must = TRUE;
  1996. 11957
  1997. 11958         spanning = TRUE;        /* the rest of the request must be done */
  1998. 11959   } while (nbytes > 0);
  1999. 11960
  2000. 11961   return(OK);
  2001. 11962 }
  2002. 11965 /*===========================================================================*
  2003. 11966  *                              s_finish                                     *
  2004. 11967  *===========================================================================*/
  2005. 11968 PRIVATE int s_finish()
  2006. 11969 {
  2007. 11970 /* Send the I/O requests gathered in *rq to the host adapter. */
  2008. 11971
  2009. 11972   struct scsi *sp = s_sp;
  2010. 11973   unsigned long block;
  2011. 11974   struct iorequest_s **iopp, *iop;
  2012. 11975   int key;
  2013. 11976
  2014. 11977   if (rq->count == 0) return(OK);       /* spurious finish */
  2015. 11978
  2016. 11979   show_req();
  2017. 11980
  2018. 11981   /* If all the requests are optional then don't do just a few. */
  2019. 11982   if (!s_must && rq->count < 0x2000) {
  2020. 11983         rq->count = 0;
  2021. 11984         return(OK);
  2022. 11985   }
  2023. 11986
  2024. 11987   iopp = rq->iov;
  2025. 11988   iop = *iopp++;
  2026. 11989
  2027. 11990 retry:
  2028. 11991   switch (sp->devtype) {
  2029. 11992   case SCSI_DEVCDROM:
  2030. 11993   case SCSI_DEVWORM:
  2031. 11994   case SCSI_DEVDISK:
  2032. 11995   case SCSI_DEVOPTICAL:
  2033. 11996         /* A read or write SCSI command for a random access device. */
  2034. 11997         block = rq->pos / sp->block_size;
  2035. 11998
  2036. 11999         if (block < (1L << 21)) {
  2037. 12000                 /* We can use a group 0 command for small disks. */
  2038. 12001                 group0();
  2039. 12002                 rq->ccb.opcode = CCB_SCATTER;
  2040. 12003                 ccb_cmd0(rq).scsi_op =
  2041. 12004                         s_opcode == DEV_WRITE ? SCSI_WRITE : SCSI_READ;
  2042. 12005                 h2b24(ccb_cmd0(rq).lba, block);
  2043. 12006                 ccb_cmd0(rq).nblocks = rq->count / sp->block_size;
  2044. 12007         } else {
  2045. 12008                 /* Large disks require a group 1 command. */
  2046. 12009                 group1();
  2047. 12010                 rq->ccb.opcode = CCB_SCATTER;
  2048. 12011                 ccb_cmd1(rq).scsi_op =
  2049. 12012                         s_opcode == DEV_WRITE ? SCSI_WRITE1 : SCSI_READ1;
  2050. 12013                 h2b32(ccb_cmd1(rq).lba, block);
  2051. 12014                 h2b16(ccb_cmd1(rq).nblocks, rq->count / sp->block_size);
  2052. 12015         }
  2053. 12016
  2054. 12017         key = scsi_command(0L, 0);
  2055. 12018
  2056. 12019         if (key == SENSE_NO_SENSE) {
  2057. 12020                 /* fine */;
  2058. 12021         } else
  2059. 12022         if (key == SENSE_UNIT_ATT || key == SENSE_ABORTED_CMD) {
  2060. 12023                 /* Check condition?  Bus reset most likely. */
  2061. 12024                 /* Aborted command?  Maybe retrying will help. */
  2062. 12025                 if (--rq->retry > 0) goto retry;
  2063. 12026                 return(iop->io_nbytes = EIO);
  2064. 12027         } else
  2065. 12028         if (key == SENSE_RECOVERED) {
  2066. 12029                 /* Disk drive managed to recover from a read error. */
  2067. 12030                 printf("%s: soft read error at block %lu (recovered)n",
  2068. 12031                         s_name(), b2h32(ccb_sense(rq).info));
  2069. 12032                 key = SENSE_NO_SENSE;
  2070. 12033                 break;
  2071. 12034         } else {
  2072. 12035                 /* A fatal error occurred, bail out. */
  2073. 12036                 return(iop->io_nbytes = EIO);
  2074. 12037         }
  2075. 12038         break;
  2076. 12039
  2077. 12040   case SCSI_DEVTAPE:
  2078. 12041         /* A read or write SCSI command for a sequential access device. */
  2079. 12042         group0();
  2080. 12043         rq->ccb.opcode = CCB_SCATTER;
  2081. 12044         ccb_cmd0(rq).scsi_op = s_opcode == DEV_WRITE ? SCSI_WRITE : SCSI_READ;
  2082. 12045         ccb_cmd0(rq).fixed = sp->tfixed;
  2083. 12046         h2b24(ccb_cmd0(rq).trlength, rq->count / sp->block_size);
  2084. 12047
  2085. 12048         key = scsi_command(0L, 0);
  2086. 12049
  2087. 12050         if (key != SENSE_NO_SENSE) {
  2088. 12051                 /* Either at EOF or EOM, or an I/O error. */
  2089. 12052
  2090. 12053                 if (sense_eof(key) || sense_eom(key)) {
  2091. 12054                         /* Not an error, but EOF or EOM. */
  2092. 12055                         sp->at_eof = TRUE;
  2093. 12056                         sp->tstat.mt_dsreg = DS_EOF;
  2094. 12057
  2095. 12058                         /* The residual tells how much has not been read. */
  2096. 12059                         rq->count -= sp->tstat.mt_resid * sp->block_size;
  2097. 12060
  2098. 12061                         if (sense_eof(key)) {
  2099. 12062                                 /* Went over a filemark. */
  2100. 12063                                 sp->tstat.mt_blkno = !sp->tfixed ? -1 :
  2101. 12064                                         - (int) (rq->count / sp->block_size);
  2102. 12065                                 sp->tstat.mt_fileno++;
  2103. 12066                         }
  2104. 12067                 }
  2105. 12068                 if (sense_ili(key)) {
  2106. 12069                         /* Incorrect length on a variable block length tape. */
  2107. 12070
  2108. 12071                         if (sp->tstat.mt_resid <= 0) {
  2109. 12072                                 /* Large block could not be read. */
  2110. 12073                                 return(iop->io_nbytes = EIO);
  2111. 12074                         }
  2112. 12075                         /* Small block read, this is ok. */
  2113. 12076                         rq->count -= sp->tstat.mt_resid;
  2114. 12077                         sp->tstat.mt_dsreg = DS_OK;
  2115. 12078                 }
  2116. 12079                 if (key == SENSE_RECOVERED) {
  2117. 12080                         /* Tape drive managed to recover from an error. */
  2118. 12081                         printf("%s: soft %s error (recovered)n",
  2119. 12082                                 s_name(),
  2120. 12083                                 s_opcode == DEV_READ ? "read" : "write");
  2121. 12084                         key = SENSE_NO_SENSE;
  2122. 12085                         sp->tstat.mt_dsreg = DS_OK;
  2123. 12086                 }
  2124. 12087                 if (sp->tstat.mt_dsreg == DS_ERR) {
  2125. 12088                         /* Error was fatal. */
  2126. 12089                         return(iop->io_nbytes = EIO);
  2127. 12090                 }
  2128. 12091         } else {
  2129. 12092                 sp->tstat.mt_dsreg = DS_OK;
  2130. 12093         }
  2131. 12094         if (!sp->tfixed) {
  2132. 12095                 /* Variable block length tape reads record by record. */
  2133. 12096                 sp->tstat.mt_blkno++;
  2134. 12097         } else {
  2135. 12098                 /* Fixed length tape, multiple blocks transferred. */
  2136. 12099                 sp->tstat.mt_blkno += rq->count / sp->block_size;
  2137. 12100         }
  2138. 12101         sp->need_eof = (s_opcode == DEV_WRITE);
  2139. 12102         break;
  2140. 12103
  2141. 12104   default:
  2142. 12105         assert(0);
  2143. 12106   }
  2144. 12107
  2145. 12108   /* Remove bytes transferred from the I/O requests. */
  2146. 12109   for (;;) {
  2147. 12110         if (rq->count > iop->io_nbytes) {
  2148. 12111                 rq->count -= iop->io_nbytes;
  2149. 12112                 iop->io_nbytes = 0;
  2150. 12113         } else {
  2151. 12114                 iop->io_nbytes -= rq->count;
  2152. 12115                 rq->count = 0;
  2153. 12116                 break;
  2154. 12117         }
  2155. 12118         iop = *iopp++;
  2156. 12119   }
  2157. 12120   return(key == SENSE_NO_SENSE ? OK : EIO);     /* may return EIO for EOF */
  2158. 12121 }
  2159. 12124 /*===========================================================================*
  2160. 12125  *                              s_rdcdrom                                    *
  2161. 12126  *===========================================================================*/
  2162. 12127 PRIVATE int s_rdcdrom(proc_nr, iop, pos, nbytes, user_phys)
  2163. 12128 int proc_nr;                    /* process doing the request */
  2164. 12129 struct iorequest_s *iop;        /* pointer to read or write request */
  2165. 12130 unsigned long pos;              /* byte position */
  2166. 12131 unsigned nbytes;                /* number of bytes */
  2167. 12132 phys_bytes user_phys;           /* user address */
  2168. 12133 {
  2169. 12134 /* CD-ROM's have a basic block size of 2k.  We could try to set a smaller
  2170. 12135  * virtual block size, but many don't support it.  So we use this function.
  2171. 12136  */
  2172. 12137   struct scsi *sp = s_sp;
  2173. 12138   int r, key;
  2174. 12139   unsigned offset, count;
  2175. 12140   unsigned long block;
  2176. 12141
  2177. 12142   /* Only do reads. */
  2178. 12143   if ((iop->io_request & ~OPTIONAL_IO) != DEV_READ)
  2179. 12144         return(iop->io_nbytes = EINVAL);
  2180. 12145
  2181. 12146   /* Finish any outstanding I/O. */
  2182. 12147   if ((r = s_finish()) != OK) return(r);
  2183. 12148
  2184. 12149   do {
  2185. 12150         /* Probe a device that isn't ready. */
  2186. 12151         if (!(sp->state & S_READY) && scsi_probe() != OK) return(EIO);
  2187. 12152
  2188. 12153         block = pos / sp->block_size;
  2189. 12154         if (block == s_buf_blk) {
  2190. 12155                 /* Some of the requested bytes are in the buffer. */
  2191. 12156                 offset = pos % sp->block_size;
  2192. 12157                 count = sp->block_size - offset;
  2193. 12158                 if (count > nbytes) count = nbytes;
  2194. 12159                 phys_copy(tmp_phys + offset, user_phys, (phys_bytes) count);
  2195. 12160                 pos += count;
  2196. 12161                 user_phys += count;
  2197. 12162                 nbytes -= count;
  2198. 12163                 iop->io_nbytes -= count;
  2199. 12164         } else {
  2200. 12165                 /* Read a block that contains (some of) the bytes wanted. */
  2201. 12166                 rq->retry = 2;
  2202. 12167                 do {
  2203. 12168                         group1();
  2204. 12169                         rq->ccb.opcode = CCB_INIT;
  2205. 12170                         ccb_cmd1(rq).scsi_op = SCSI_READ1;
  2206. 12171                         h2b32(ccb_cmd1(rq).lba, block);
  2207. 12172                         h2b16(ccb_cmd1(rq).nblocks, 1);
  2208. 12173                         key = scsi_command(tmp_phys, sp->block_size);
  2209. 12174                 } while (key == SENSE_UNIT_ATT && --rq->retry > 0);
  2210. 12175
  2211. 12176                 if (key != SENSE_NO_SENSE) return(iop->io_nbytes = EIO);
  2212. 12177
  2213. 12178                 s_buf_blk = block;      /* remember block in buffer */
  2214. 12179         }
  2215. 12180   } while (nbytes > 0);
  2216. 12181   return(OK);
  2217. 12182 }
  2218. 12185 /*===========================================================================*
  2219. 12186  *                              s_do_close                                   *
  2220. 12187  *===========================================================================*/
  2221. 12188 PRIVATE int s_do_close(dp, m_ptr)
  2222. 12189 struct driver *dp;
  2223. 12190 message *m_ptr;
  2224. 12191 {
  2225. 12192   struct scsi *sp;
  2226. 12193
  2227. 12194   if (s_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO);
  2228. 12195   sp = s_sp;
  2229. 12196
  2230. 12197   sp->open_ct--;
  2231. 12198
  2232. 12199   /* Disks and such don't make trouble. */
  2233. 12200   if (sp->devtype != SCSI_DEVTAPE) return(OK);
  2234. 12201
  2235. 12202   sp->at_eof = FALSE;
  2236. 12203
  2237. 12204   /* Write filemark if writes have been done. */
  2238. 12205   if (sp->need_eof && sp->tstat.mt_dsreg != DS_ERR) {
  2239. 12206         if (scsi_simple(SCSI_WREOF, 1) != SENSE_NO_SENSE) {
  2240. 12207                 printf("%s: failed to add filemarkn", s_name());
  2241. 12208         } else {
  2242. 12209                 sp->tstat.mt_dsreg = DS_OK;
  2243. 12210                 sp->tstat.mt_blkno = 0;
  2244. 12211                 sp->tstat.mt_fileno++;
  2245. 12212         }
  2246. 12213   }
  2247. 12214
  2248. 12215   /* Rewind if rewind device. */
  2249. 12216   if (s_type == TYPE_RST) {
  2250. 12217         if (scsi_simple(SCSI_REWIND, 1) != SENSE_NO_SENSE) {
  2251. 12218                 printf("%s: failed to rewindn", s_name());
  2252. 12219         } else {
  2253. 12220                 sp->tstat.mt_dsreg = DS_OK;
  2254. 12221                 sp->tstat.mt_blkno = 0;
  2255. 12222                 sp->tstat.mt_fileno = 0;
  2256. 12223         }
  2257. 12224   }
  2258. 12225   return(OK);
  2259. 12226 }
  2260. 12229 /*===========================================================================*
  2261. 12230  *                              s_do_ioctl                                   *
  2262. 12231  *===========================================================================*/
  2263. 12232 PRIVATE int s_do_ioctl(dp, m_ptr)
  2264. 12233 struct driver *dp;
  2265. 12234 message *m_ptr;
  2266. 12235 {
  2267. 12236   struct scsi *sp;
  2268. 12237
  2269. 12238   if (s_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO);
  2270. 12239   sp = s_sp;
  2271. 12240
  2272. 12241   /* Ioctls are device specific. */
  2273. 12242   switch (sp->devtype) {
  2274. 12243   case SCSI_DEVDISK:
  2275. 12244   case SCSI_DEVWORM:
  2276. 12245   case SCSI_DEVCDROM:
  2277. 12246   case SCSI_DEVOPTICAL:
  2278. 12247         if (m_ptr->REQUEST == DIOCEJECT) {
  2279. 12248                 /* Eject disk. */
  2280. 12249                 if (sp->open_ct > 1) return(EBUSY);
  2281. 12250
  2282. 12251                 /* Send a start/stop command with code 2: stop and eject. */
  2283. 12252                 if (scsi_simple(SCSI_STRTSTP, 2) != SENSE_NO_SENSE)
  2284. 12253                         return(EIO);
  2285. 12254                 return(OK);
  2286. 12255         }
  2287. 12256         /* Call the common code for disks and disk like devices. */
  2288. 12257         return(do_diocntl(dp, m_ptr));
  2289. 12258
  2290. 12259   default:
  2291. 12260         return(ENOTTY);
  2292. 12261
  2293. 12262   case SCSI_DEVTAPE:
  2294. 12263         break;
  2295. 12264   }
  2296. 12265   /* Further ioctls are for tapes. */
  2297. 12266
  2298. 12267   if (m_ptr->REQUEST == MTIOCTOP) {
  2299. 12268         struct mtop op;
  2300. 12269         phys_bytes op_phys;
  2301. 12270         long delta;
  2302. 12271         int key;
  2303. 12272         byte *buf = tmp_buf;
  2304. 12273
  2305. 12274         /* Basic tape commands: rewind, space, write eof marks, ... */
  2306. 12275         op_phys = numap(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, sizeof(op));
  2307. 12276         if (op_phys == 0) return(EINVAL);
  2308. 12277         phys_copy(op_phys, vir2phys(&op), (phys_bytes) sizeof(op));
  2309. 12278
  2310. 12279         switch(op.mt_op) {
  2311. 12280         case MTREW:
  2312. 12281         case MTOFFL:
  2313. 12282         case MTRETEN:
  2314. 12283         case MTFSF:
  2315. 12284         case MTFSR:
  2316. 12285         case MTBSF:
  2317. 12286         case MTBSR:
  2318. 12287         case MTEOM:
  2319. 12288                 /* Write an EOF mark before spacing. */
  2320. 12289                 if (sp->need_eof && sp->tstat.mt_dsreg != DS_ERR) {
  2321. 12290                         if (scsi_simple(SCSI_WREOF, 1) != SENSE_NO_SENSE)
  2322. 12291                                 return(EIO);
  2323. 12292                         sp->tstat.mt_blkno = 0;
  2324. 12293                         sp->tstat.mt_fileno++;
  2325. 12294                         sp->need_eof = FALSE;
  2326. 12295                 }
  2327. 12296                 sp->at_eof = FALSE;
  2328. 12297         }
  2329. 12298
  2330. 12299         switch(op.mt_op) {
  2331. 12300         case MTREW:
  2332. 12301         case MTOFFL:
  2333. 12302         case MTRETEN:
  2334. 12303         case MTERASE:
  2335. 12304                 /* Rewind, Offline, Retension, Erase. */
  2336. 12305                 switch(op.mt_op) {
  2337. 12306                 case MTOFFL:
  2338. 12307                         if (scsi_simple(SCSI_LOADUNLD, 0) != SENSE_NO_SENSE)
  2339. 12308                                 return(EIO);
  2340. 12309                         sp->state &= ~S_READY;
  2341. 12310                         break;
  2342. 12311                 case MTRETEN:
  2343. 12312                         if (scsi_simple(SCSI_LOADUNLD, 3) != SENSE_NO_SENSE)
  2344. 12313                                 return(EIO);
  2345. 12314                         break;
  2346. 12315                 case MTERASE:
  2347. 12316                         if (scsi_simple(SCSI_REWIND, 0) != SENSE_NO_SENSE)
  2348. 12317                                 return(EIO);
  2349. 12318                         if (scsi_simple(SCSI_ERASE, 1) != SENSE_NO_SENSE)
  2350. 12319                                 return(EIO);
  2351. 12320                         /* Rewind once more. */
  2352. 12321                         /*FALL THROUGH*/
  2353. 12322                 case MTREW:
  2354. 12323                         if (scsi_simple(SCSI_REWIND, 0) != SENSE_NO_SENSE)
  2355. 12324                                 return(EIO);
  2356. 12325                 }
  2357. 12326                 sp->tstat.mt_dsreg = DS_OK;
  2358. 12327                 sp->tstat.mt_blkno = 0;
  2359. 12328                 sp->tstat.mt_fileno = 0;
  2360. 12329                 break;
  2361. 12330         case MTFSF:
  2362. 12331         case MTFSR:
  2363. 12332         case MTBSF:
  2364. 12333         case MTBSR:
  2365. 12334                 if (sp->tstat.mt_dsreg == DS_ERR) return(EIO);
  2366. 12335                 group0();
  2367. 12336                 rq->ccb.opcode = CCB_INIT;
  2368. 12337                 ccb_cmd0(rq).scsi_op = SCSI_SPACE;
  2369. 12338                 delta = op.mt_count;
  2370. 12339                 if (op.mt_op == MTBSR) delta = -delta;
  2371. 12340                 if (op.mt_op == MTBSF) delta = -delta - 1;
  2372. 12341                 h2b24(ccb_cmd0(rq).trlength, delta);
  2373. 12342                 ccb_cmd0(rq).fixed =
  2374. 12343                                 op.mt_op == MTFSR || op.mt_op == MTBSR ? 0 : 1;
  2375. 12344                 if ((key = scsi_command(0L, 0)) != SENSE_NO_SENSE) {
  2376. 12345                         if (sense_key(key) != SENSE_NO_SENSE) return(EIO);
  2377. 12346
  2378. 12347                         if (sense_eom(key)) {
  2379. 12348                                 /* Banging into end of tape. */
  2380. 12349                                 if (op.mt_op == MTBSF || op.mt_op == MTBSR) {
  2381. 12350                                         /* Backspacing to start of tape. */
  2382. 12351                                         sp->tstat.mt_dsreg = DS_EOF;
  2383. 12352                                         sp->tstat.mt_blkno = 0;
  2384. 12353                                         sp->tstat.mt_fileno = 0;
  2385. 12354                                 } else {
  2386. 12355                                         /* Not forwards please! */
  2387. 12356                                         return(EIO);
  2388. 12357                                 }
  2389. 12358                         }
  2390. 12359                         if (sense_eof(key)) {
  2391. 12360                                 /* Reaching a filemark. */
  2392. 12361                                 sp->tstat.mt_dsreg = DS_EOF;
  2393. 12362                                 sp->at_eof = TRUE;
  2394. 12363                                 if (op.mt_op == MTFSR) {
  2395. 12364                                         /* Forwards. */
  2396. 12365                                         sp->tstat.mt_blkno = 0;
  2397. 12366                                         sp->tstat.mt_fileno++;
  2398. 12367                                 } else {
  2399. 12368                                         /* Backwards (bad idea!) */
  2400. 12369                                         sp->tstat.mt_blkno = -1;
  2401. 12370                                         sp->tstat.mt_fileno--;
  2402. 12371                                 }
  2403. 12372                         }
  2404. 12373                 } else {
  2405. 12374                         if (op.mt_op == MTFSR || op.mt_op == MTBSR) {
  2406. 12375                                 sp->tstat.mt_blkno += delta;
  2407. 12376                         } else {
  2408. 12377                                 sp->tstat.mt_blkno = 0;
  2409. 12378                                 sp->tstat.mt_fileno += delta;
  2410. 12379                         }
  2411. 12380                         if (op.mt_op == MTBSF) {
  2412. 12381                                 /* n+1 backwards, and 1 forward. */
  2413. 12382                                 group0();
  2414. 12383                                 rq->ccb.opcode = CCB_INIT;
  2415. 12384                                 ccb_cmd0(rq).scsi_op = SCSI_SPACE;
  2416. 12385                                 h2b24(ccb_cmd0(rq).trlength, 1L);
  2417. 12386                                 ccb_cmd0(rq).fixed = 1;
  2418. 12387                                 if (scsi_command(0L, 0) != SENSE_NO_SENSE)
  2419. 12388                                         return(EIO);
  2420. 12389                                 sp->tstat.mt_fileno++;
  2421. 12390                         }
  2422. 12391                         sp->tstat.mt_dsreg = DS_OK;
  2423. 12392                 }
  2424. 12393                 break;
  2425. 12394         case MTWEOF:
  2426. 12395                 /* Write EOF marks. */
  2427. 12396                 if (sp->tstat.mt_dsreg == DS_ERR) return(EIO);
  2428. 12397                 if (op.mt_count < 0) return(EIO);
  2429. 12398                 if (op.mt_count == 0) return(OK);
  2430. 12399                 group0();
  2431. 12400                 rq->ccb.opcode = CCB_INIT;
  2432. 12401                 ccb_cmd0(rq).scsi_op = SCSI_WREOF;
  2433. 12402                 h2b24(ccb_cmd0(rq).trlength, op.mt_count);
  2434. 12403                 if (scsi_command(0L, 0) != SENSE_NO_SENSE) return(EIO);
  2435. 12404                 sp->tstat.mt_dsreg = DS_OK;
  2436. 12405                 sp->tstat.mt_blkno = 0;
  2437. 12406                 sp->tstat.mt_fileno += op.mt_count;
  2438. 12407                 sp->need_eof = FALSE;
  2439. 12408                 break;
  2440. 12409         case MTEOM:
  2441. 12410                 /* Forward space to end of media. */
  2442. 12411                 if (sp->tstat.mt_dsreg == DS_ERR) return(EIO);
  2443. 12412                 do {
  2444. 12413                         group0();
  2445. 12414                         rq->ccb.opcode = CCB_INIT;
  2446. 12415                         ccb_cmd0(rq).scsi_op = SCSI_SPACE;
  2447. 12416                         h2b24(ccb_cmd0(rq).trlength, 0x7FFFFF);
  2448. 12417                         ccb_cmd0(rq).fixed = 1;
  2449. 12418                         key = scsi_command(0L, 0);
  2450. 12419                         sp->tstat.mt_blkno = 0;
  2451. 12420                         sp->tstat.mt_fileno += 0x7FFFFF;
  2452. 12421                         if (key != SENSE_NO_SENSE) {
  2453. 12422                                 if (key != SENSE_BLANK_CHECK) return(EIO);
  2454. 12423                                 sp->tstat.mt_fileno -= sp->tstat.mt_resid;
  2455. 12424                         }
  2456. 12425                 } while (key == SENSE_NO_SENSE);
  2457. 12426                 sp->tstat.mt_dsreg = DS_OK;
  2458. 12427                 break;
  2459. 12428         case MTBLKZ:
  2460. 12429         case MTMODE:
  2461. 12430                 /* Select tape block size or tape density. */
  2462. 12431
  2463. 12432                 /* Rewind tape. */
  2464. 12433                 if (scsi_simple(SCSI_REWIND, 0) != SENSE_NO_SENSE)
  2465. 12434                         return(EIO);
  2466. 12435
  2467. 12436                 sp->tstat.mt_dsreg = DS_OK;
  2468. 12437                 sp->tstat.mt_blkno = 0;
  2469. 12438                 sp->tstat.mt_fileno = 0;
  2470. 12439
  2471. 12440                 if (op.mt_op == MTBLKZ && op.mt_count == 0) {
  2472. 12441                         /* Request for variable block size mode. */
  2473. 12442                         sp->tfixed = FALSE;
  2474. 12443                         sp->block_size = 1;
  2475. 12444                 } else {
  2476. 12445                         /* First a modesense to get the current values. */
  2477. 12446                         if (scsi_simple(SCSI_MDSENSE, 255) != SENSE_NO_SENSE)
  2478. 12447                                 return(EIO);
  2479. 12448
  2480. 12449                         /* Must at least have one block descriptor. */
  2481. 12450                         if (buf[3] < 8) return(EIO);
  2482. 12451                         buf[0] = 0;
  2483. 12452                         buf[1] = 0;
  2484. 12453                         /* buf[2]: buffered mode & speed */
  2485. 12454                         buf[3] = 8;
  2486. 12455                         if (op.mt_op == MTMODE)         /* New density */
  2487. 12456                                 buf[4 + 0] = op.mt_count;
  2488. 12457                         /* buf[4 + 1]: number of blocks */
  2489. 12458                         buf[4 + 4] = 0;
  2490. 12459                         if (op.mt_op == MTBLKZ)         /* New block size */
  2491. 12460                                 h2b24(buf + 4 + 5, (long) op.mt_count);
  2492. 12461
  2493. 12462                         /* Set the new density/blocksize. */
  2494. 12463                         if (scsi_simple(SCSI_MDSELECT, 4+8) != SENSE_NO_SENSE)
  2495. 12464                                 return(EIO);
  2496. 12465                         if (op.mt_op == MTBLKZ) {
  2497. 12466                                 sp->tfixed = TRUE;
  2498. 12467                                 sp->block_size= op.mt_count;
  2499. 12468                         }
  2500. 12469                 }
  2501. 12470                 sp->state &= ~S_READY;
  2502. 12471                 if (scsi_probe() != OK) return(EIO);
  2503. 12472                 break;
  2504. 12473         default:
  2505. 12474                 /* Not implemented. */
  2506. 12475                 return(ENOTTY);
  2507. 12476         }
  2508. 12477   } else
  2509. 12478   if (m_ptr->REQUEST == MTIOCGET) {
  2510. 12479         /* Request tape status. */
  2511. 12480         phys_bytes get_phys;
  2512. 12481
  2513. 12482         get_phys = numap(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS,
  2514. 12483                                                         sizeof(sp->tstat));
  2515. 12484         if (get_phys == 0) return(EINVAL);
  2516. 12485
  2517. 12486         if (sp->tstat.mt_dsreg == DS_OK) {
  2518. 12487                 /* Old error data is never cleared (until now). */
  2519. 12488                 sp->tstat.mt_erreg = 0;
  2520. 12489                 sp->tstat.mt_resid = 0;
  2521. 12490         }
  2522. 12491         phys_copy(vir2phys(&sp->tstat), get_phys,
  2523. 12492                                         (phys_bytes) sizeof(sp->tstat));
  2524. 12493   } else {
  2525. 12494         /* Not implemented. */
  2526. 12495         return(ENOTTY);
  2527. 12496   }
  2528. 12497   return(OK);
  2529. 12498 }
  2530. 12501 /*===========================================================================*
  2531. 12502  *                              scsi_simple                                  *
  2532. 12503  *===========================================================================*/
  2533. 12504 PRIVATE int scsi_simple(opcode, count)
  2534. 12505 int opcode;                             /* SCSI opcode */
  2535. 12506 int count;                              /* count or flag */
  2536. 12507 {
  2537. 12508 /* The average group 0 SCSI command with just a simple flag or count. */
  2538. 12509
  2539. 12510   vir_bytes len = 0;    /* Sometimes a buffer is used. */
  2540. 12511
  2541. 12512   group0();
  2542. 12513   rq->ccb.opcode = CCB_INIT;
  2543. 12514   ccb_cmd0(rq).scsi_op = opcode;
  2544. 12515
  2545. 12516   /* Fill in the count argument at the proper place. */
  2546. 12517   switch (opcode) {
  2547. 12518   case SCSI_REQSENSE:
  2548. 12519   case SCSI_INQUIRY:
  2549. 12520   case SCSI_MDSENSE:
  2550. 12521   case SCSI_MDSELECT:
  2551. 12522         ccb_cmd0(rq).nblocks = count;
  2552. 12523         len = count;
  2553. 12524         break;
  2554. 12525
  2555. 12526   case SCSI_STRTSTP:
  2556. 12527     /* SCSI_LOADUNLD: (synonym) */
  2557. 12528         ccb_cmd0(rq).nblocks = count;
  2558. 12529         break;
  2559. 12530
  2560. 12531   case SCSI_RDLIMITS:
  2561. 12532         len = count;
  2562. 12533         break;
  2563. 12534
  2564. 12535   case SCSI_WREOF:
  2565. 12536         h2b24(ccb_cmd0(rq).trlength, (long) count);
  2566. 12537         break;
  2567. 12538
  2568. 12539   case SCSI_REWIND:
  2569. 12540   case SCSI_ERASE:
  2570. 12541         ccb_cmd0(rq).fixed = count;
  2571. 12542         break;
  2572. 12543   }
  2573. 12544   return(scsi_command(tmp_phys, len));
  2574. 12545 }
  2575. 12548 /*===========================================================================*
  2576. 12549  *                              group0                                       *
  2577. 12550  *===========================================================================*/
  2578. 12551 PRIVATE void group0()
  2579. 12552 {
  2580. 12553   /* Prepare the ccb for a group 0 SCSI command. */
  2581. 12554
  2582. 12555   rq->ccb.cmdlen = sizeof(cdb0_t);
  2583. 12556
  2584. 12557   /* Clear cdb to zeros the ugly way. */
  2585. 12558   * (u32_t *) (rq->ccb.cmd + 0) = 0;
  2586. 12559   * (u16_t *) (rq->ccb.cmd + 4) = 0;
  2587. 12560 }
  2588. 12563 /*===========================================================================*
  2589. 12564  *                              group1                                       *
  2590. 12565  *===========================================================================*/
  2591. 12566 PRIVATE void group1()
  2592. 12567 {
  2593. 12568   rq->ccb.cmdlen = sizeof(cdb1_t);
  2594. 12569   * (u32_t *) (rq->ccb.cmd + 0) = 0;
  2595. 12570   * (u32_t *) (rq->ccb.cmd + 4) = 0;
  2596. 12571   * (u16_t *) (rq->ccb.cmd + 8) = 0;
  2597. 12572 }
  2598. 12575 /*===========================================================================*
  2599. 12576  *                              scsi_command                                 *
  2600. 12577  *===========================================================================*/
  2601. 12578 PRIVATE int scsi_command(data, len)
  2602. 12579 phys_bytes data;
  2603. 12580 vir_bytes len;
  2604. 12581 {
  2605. 12582 /* Execute a SCSI command and return the results.  Unlike most other routines,
  2606. 12583  * this routine returns the sense key of a SCSI command instead of OK or EIO.
  2607. 12584  */
  2608. 12585   struct scsi *sp = s_sp;
  2609. 12586   int key;
  2610. 12587   message intr_mess;
  2611. 12588
  2612. 12589   rq->ccb.addrcntl = ccb_scid(s_sp->targ) | ccb_lun(s_sp->lun);
  2613. 12590
  2614. 12591   if (rq->ccb.opcode == CCB_SCATTER) {
  2615. 12592         /* Device read/write; add checks and use scatter/gather vector. */
  2616. 12593         rq->ccb.addrcntl |= s_opcode == DEV_READ ? CCB_INCHECK : CCB_OUTCHECK;
  2617. 12594         data = vir2phys(rq->dmalist);
  2618. 12595         len = (byte *) rq->dmaptr - (byte *) rq->dmalist;
  2619. 12596         if (aha_model == AHA1540) {
  2620. 12597                 /* A plain 1540 can't do s/g. */
  2621. 12598                 rq->ccb.opcode = CCB_INIT;
  2622. 12599                 data = b2h24(rq->dmalist[0].dataptr);
  2623. 12600                 len = b2h24(rq->dmalist[0].datalen);
  2624. 12601         }
  2625. 12602   }
  2626. 12603   h2b24(rq->ccb.datalen, (u32_t) len);
  2627. 12604   h2b24(rq->ccb.dataptr, data);
  2628. 12605   dump_scsi_cmd();
  2629. 12606
  2630. 12607   mailbox[0].status = AHA_MBOXSTART;
  2631. 12608
  2632. 12609   out_byte(AHA_DATAREG, AHACOM_STARTSCSI);  /* hey, you've got mail! */
  2633. 12610
  2634. 12611   /* Wait for the SCSI command to complete. */
  2635. 12612   while (mailbox[1].status == AHA_MBOXFREE) {
  2636. 12613         /* No mail yet, wait for an interrupt. */
  2637. 12614         receive(HARDWARE, &intr_mess);
  2638. 12615   }
  2639. 12616   mailbox[1].status = AHA_MBOXFREE;     /* free up inbox */
  2640. 12617
  2641. 12618   /* Check the results of the operation. */
  2642. 12619   if (rq->ccb.hastat != 0) {
  2643. 12620         /* Weird host adapter status. */
  2644. 12621         printf("%s: host adapter error 0x%02x%sn", s_name(), rq->ccb.hastat,
  2645. 12622                 rq->ccb.hastat == HST_TIMEOUT ? " (Selection timeout)" : "");
  2646. 12623         errordump();
  2647. 12624         if (sp->devtype == SCSI_DEVTAPE) sp->tstat.mt_dsreg = DS_ERR;
  2648. 12625         memset((void *) &ccb_sense(rq), 0, sizeof(sense_t));
  2649. 12626         return(SENSE_HARDWARE);
  2650. 12627   }
  2651. 12628
  2652. 12629   if (rq->ccb.tarstat != 0) {
  2653. 12630         /* A SCSI error has occurred. */
  2654. 12631         sense_t *sense = &ccb_sense(rq);
  2655. 12632
  2656. 12633         if (sense->len < 2) {
  2657. 12634                 /* No additional code and qualifier, zero them. */
  2658. 12635                 sense->add_code = sense->add_qual = 0;
  2659. 12636         }
  2660. 12637
  2661. 12638         /* Check sense data, report error if interesting. */
  2662. 12639         if (rq->ccb.tarstat == TST_CHECK) {
  2663. 12640                 if ((sense->errc & 0x7E) == 0x70) {
  2664. 12641                         /* Standard SCSI error. */
  2665. 12642                         key = sense->key;
  2666. 12643                 } else {
  2667. 12644                         /* Blame the vendor for any other nonsense. */
  2668. 12645                         key = SENSE_VENDOR;
  2669. 12646                 }
  2670. 12647         } else {
  2671. 12648                 if (rq->ccb.tarstat == TST_LUNBUSY) {
  2672. 12649                         /* Logical unit is too busy to react... */
  2673. 12650                         key = SENSE_NOT_READY;
  2674. 12651                 } else {
  2675. 12652                         /* The adapter shoudn't do this... */
  2676. 12653                         key = SENSE_HARDWARE;
  2677. 12654                 }
  2678. 12655                 memset((void *) sense, 0, sizeof(sense_t));
  2679. 12656         }
  2680. 12657
  2681. 12658         if (sense_serious(sense_key(key))) {
  2682. 12659                 /* Something bad happened. */
  2683. 12660                 printf("%s: error on command 0x%02x, ", s_name(),
  2684. 12661                                                         rq->ccb.cmd[0]);
  2685. 12662                 if (rq->ccb.tarstat != TST_CHECK) {
  2686. 12663                         printf("target status 0x%02xn", rq->ccb.tarstat);
  2687. 12664                 } else {
  2688. 12665                         printf("sense key 0x%02x (%s), additional 0x%02x%02xn",
  2689. 12666                                 sense->key,
  2690. 12667                                 str_scsi_sense[sense_key(key)],
  2691. 12668                                 sense->add_code, sense->add_qual);
  2692. 12669                 }
  2693. 12670                 errordump();
  2694. 12671         }
  2695. 12672
  2696. 12673         if (sp->devtype == SCSI_DEVTAPE) {
  2697. 12674                 /* Store details of tape error. */
  2698. 12675                 sp->tstat.mt_dsreg = DS_ERR;
  2699. 12676                 sp->tstat.mt_erreg = key;
  2700. 12677                 sp->tstat.mt_resid = b2h32(sense->info);
  2701. 12678         }
  2702. 12679
  2703. 12680         /* Keep only the ILI, EOM and EOF bits of key 0. */
  2704. 12681         if (sense_key(key) != SENSE_NO_SENSE) key = sense_key(key);
  2705. 12682
  2706. 12683         return(key);
  2707. 12684   }
  2708. 12685   return(SENSE_NO_SENSE);
  2709. 12686 }
  2710. 12689 /*===========================================================================*
  2711. 12690  *                              aha_command                                  *
  2712. 12691  *===========================================================================*/
  2713. 12692 PRIVATE void aha_command(outlen, outptr, inlen, inptr)
  2714. 12693 int outlen, inlen;
  2715. 12694 byte *outptr, *inptr;
  2716. 12695 {
  2717. 12696   /* Send a low level command to the host adapter. */
  2718. 12697   int i;
  2719. 12698
  2720. 12699   /* Send command bytes. */
  2721. 12700   for (i = 0; i < outlen; i++) {
  2722. 12701         while (in_byte(AHA_STATREG) & AHA_CDF) {}       /* !! timeout */
  2723. 12702         out_byte(AHA_DATAREG, *outptr++);
  2724. 12703   }
  2725. 12704
  2726. 12705   /* Receive data bytes. */
  2727. 12706   for (i = 0; i < inlen; i++) {
  2728. 12707         while (!(in_byte(AHA_STATREG) & AHA_DF)
  2729. 12708                 && !(in_byte(AHA_INTRREG) & AHA_HACC)) {}  /* !! timeout */
  2730. 12709         *inptr++ = in_byte(AHA_DATAREG);
  2731. 12710   }
  2732. 12711
  2733. 12712   /* Wait for command completion. */
  2734. 12713   while (!(in_byte(AHA_INTRREG) & AHA_HACC)) {} /* !! timeout */
  2735. 12714   out_byte(AHA_CNTLREG, AHA_IRST);      /* clear interrupt */
  2736. 12715   if (aha_irq != 0) enable_irq(aha_irq);
  2737. 12716
  2738. 12717   /* !! should check status register here for invalid command */
  2739. 12718 }
  2740. 12721 /*===========================================================================*
  2741. 12722  *                              aha_reset                                    *
  2742. 12723  *===========================================================================*/
  2743. 12724 PRIVATE int aha_reset()
  2744. 12725 {
  2745. 12726   int stat;
  2746. 12727   int irq, bus_on, bus_off, tr_speed;
  2747. 12728   unsigned sg_max;
  2748. 12729   long v;
  2749. 12730   static char aha0_env[] = "AHA0", aha_fmt[] = "x:d:d:x";
  2750. 12731   byte cmd[5], haidata[4], getcdata[3], extbios[2];
  2751. 12732   struct milli_state ms;
  2752. 12733
  2753. 12734   /* Get the configuration info from the environment. */
  2754. 12735   v = AHA_BASEREG;
  2755. 12736   if (env_parse(aha0_env, aha_fmt, 0, &v, 0x000L, 0x3FFL) == EP_OFF) return 0;
  2756. 12737   aha_basereg = v;
  2757. 12738
  2758. 12739   v = 15;
  2759. 12740   (void) env_parse(aha0_env, aha_fmt, 1, &v, 2L, 15L);
  2760. 12741   bus_on = v;
  2761. 12742
  2762. 12743   v = 1;
  2763. 12744   (void) env_parse(aha0_env, aha_fmt, 2, &v, 1L, 64L);
  2764. 12745   bus_off = v;
  2765. 12746
  2766. 12747   v = 0x00;
  2767. 12748   (void) env_parse(aha0_env, aha_fmt, 3, &v, 0x00L, 0xFFL);
  2768. 12749   tr_speed = v;
  2769. 12750
  2770. 12751   /* Reset controller, wait for self test to complete. */
  2771. 12752   out_byte(AHA_CNTLREG, AHA_HRST);
  2772. 12753   milli_start(&ms);
  2773. 12754   while ((stat = in_byte(AHA_STATREG)) & AHA_STST) {
  2774. 12755         if (milli_elapsed(&ms) >= AHA_TIMEOUT) {
  2775. 12756                 printf("aha0: AHA154x controller not respondingn");
  2776. 12757                 return(0);
  2777. 12758         }
  2778. 12759   }
  2779. 12760
  2780. 12761   /* Check for self-test failure. */
  2781. 12762   if ((stat & (AHA_DIAGF | AHA_INIT | AHA_IDLE | AHA_CDF | AHA_DF))
  2782. 12763                                                 != (AHA_INIT | AHA_IDLE)) {
  2783. 12764         printf("aha0: AHA154x controller failed self-testn");
  2784. 12765         return(0);
  2785. 12766   }
  2786. 12767
  2787. 12768   /* !! maybe a santity check here: make sure IDLE and INIT are set? */
  2788. 12769
  2789. 12770   /* Get information about controller type and configuration. */
  2790. 12771   cmd[0] = AHACOM_HAINQUIRY;
  2791. 12772   aha_command(1, cmd, 4, haidata);
  2792. 12773
  2793. 12774   cmd[0] = AHACOM_GETCONFIG;
  2794. 12775   aha_command(1, cmd, 3, getcdata);
  2795. 12776
  2796. 12777   /* First inquiry byte tells what type of board. */
  2797. 12778   aha_model = haidata[0];
  2798. 12779
  2799. 12780   /* Unlock the 1540C or 1540CF's mailbox interface.  (This is to keep old
  2800. 12781    * drivers from using the adapter if extended features are enabled.)
  2801. 12782    */
  2802. 12783   if (aha_model >= AHA1540C) {
  2803. 12784         cmd[0] = AHACOM_EXTBIOS;        /* get extended BIOS information */
  2804. 12785         aha_command(1, cmd, 2, extbios);
  2805. 12786         if (extbios[1] != 0) {
  2806. 12787                 /* Mailbox interface is locked, so unlock it. */
  2807. 12788                 cmd[0] = AHACOM_MBOX_ENABLE;
  2808. 12789                 cmd[1] = 0;             /* bit 0 = 0 (enable mailbox) */
  2809. 12790                 cmd[2] = extbios[1];    /* lock code to unlock mailbox */
  2810. 12791                 aha_command(3, cmd, 0, 0);
  2811. 12792         }
  2812. 12793   }
  2813. 12794
  2814. 12795   /* The maximum scatter/gather DMA list length depends on the board model. */
  2815. 12796   sg_max = 16;
  2816. 12797   if (aha_model == AHA1540) sg_max = 1;         /* 1540 has no s/g */
  2817. 12798   if (aha_model >= AHA1540C) sg_max = 255;      /* 1540C has plenty */
  2818. 12799
  2819. 12800   /* Set up the DMA channel. */
  2820. 12801   switch (getcdata[0]) {
  2821. 12802   case 0x80:            /* channel 7 */
  2822. 12803         out_byte(0xD6, 0xC3);
  2823. 12804         out_byte(0xD4, 0x03);
  2824. 12805         break;
  2825. 12806   case 0x40:            /* channel 6 */
  2826. 12807         out_byte(0xD6, 0xC2);
  2827. 12808         out_byte(0xD4, 0x02);
  2828. 12809         break;
  2829. 12810   case 0x20:            /* channel 5 */
  2830. 12811         out_byte(0xD6, 0xC1);
  2831. 12812         out_byte(0xD4, 0x01);
  2832. 12813         break;
  2833. 12814   case 0x01:            /* channel 0 */
  2834. 12815         out_byte(0x0B, 0x0C);
  2835. 12816         out_byte(0x0A, 0x00);
  2836. 12817         break;