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

操作系统开发

开发平台:

C/C++

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