| 1 | /* mbavar.h 4.15 81/04/08 */ |
| 2 | |
| 3 | /* |
| 4 | * This file contains definitions related to the kernel structures |
| 5 | * for dealing with the massbus adapters. |
| 6 | * |
| 7 | * Each mba has a mba_hd structure. |
| 8 | * Each massbus device has a mba_device structure. |
| 9 | * Each massbus slave has a mba_slave structure. |
| 10 | * |
| 11 | * At boot time we prowl the structures and fill in the pointers |
| 12 | * for devices which we find. |
| 13 | */ |
| 14 | |
| 15 | /* |
| 16 | * Per-mba structure. |
| 17 | * |
| 18 | * The initialization routine uses the information in the mbdinit table |
| 19 | * to initialize the what is attached to each massbus slot information. |
| 20 | * It counts the number of devices on each mba (to see if bothering to |
| 21 | * search/seek is appropriate). |
| 22 | * |
| 23 | * During normal operation, the devices attached to the mba which wish |
| 24 | * to transfer are queued on the mh_act? links. |
| 25 | */ |
| 26 | struct mba_hd { |
| 27 | short mh_active; /* set if mba is active */ |
| 28 | short mh_ndrive; /* number of devices, to avoid seeks */ |
| 29 | struct mba_regs *mh_mba; /* virt addr of mba */ |
| 30 | struct mba_regs *mh_physmba; /* phys addr of mba */ |
| 31 | struct mba_device *mh_mbip[8]; /* what is attached to each dev */ |
| 32 | struct mba_device *mh_actf; /* head of queue to transfer */ |
| 33 | struct mba_device *mh_actl; /* tail of queue to transfer */ |
| 34 | }; |
| 35 | |
| 36 | /* |
| 37 | * Per-device structure |
| 38 | * (one for each RM/RP disk, and one for each tape formatter). |
| 39 | * |
| 40 | * This structure is used by the device driver as its argument |
| 41 | * to the massbus driver, and by the massbus driver to locate |
| 42 | * the device driver for a particular massbus slot. |
| 43 | * |
| 44 | * The device drivers hang ready buffers on this structure, |
| 45 | * and the massbus driver will start i/o on the first such buffer |
| 46 | * when appropriate. |
| 47 | */ |
| 48 | struct mba_device { |
| 49 | struct mba_driver *mi_driver; |
| 50 | short mi_unit; /* unit number to the system */ |
| 51 | short mi_mbanum; /* the mba it is on */ |
| 52 | short mi_drive; /* controller on mba */ |
| 53 | short mi_dk; /* driver number for iostat */ |
| 54 | short mi_alive; /* device exists */ |
| 55 | short mi_type; /* driver specific unit type */ |
| 56 | struct buf mi_tab; /* head of queue for this device */ |
| 57 | struct mba_device *mi_forw; |
| 58 | /* we could compute these every time, but hereby save time */ |
| 59 | struct mba_regs *mi_mba; |
| 60 | struct mba_drv *mi_drv; |
| 61 | struct mba_hd *mi_hd; |
| 62 | }; |
| 63 | |
| 64 | /* |
| 65 | * Tape formatter slaves are specified by |
| 66 | * the following information which is used |
| 67 | * at boot time to initialize the tape driver |
| 68 | * internal tables. |
| 69 | */ |
| 70 | struct mba_slave { |
| 71 | struct mba_driver *ms_driver; |
| 72 | short ms_ctlr; /* which of several formatters */ |
| 73 | short ms_unit; /* which unit to system */ |
| 74 | short ms_slave; /* which slave to formatter */ |
| 75 | short ms_alive; |
| 76 | }; |
| 77 | |
| 78 | /* |
| 79 | * Per device-type structure. |
| 80 | * |
| 81 | * Each massbus driver defines entries for a set of routines used |
| 82 | * by the massbus driver, as well as an array of types which are |
| 83 | * acceptable to it. |
| 84 | */ |
| 85 | struct mba_driver { |
| 86 | int (*md_attach)(); /* attach a device */ |
| 87 | int (*md_slave)(); /* attach a slave */ |
| 88 | int (*md_ustart)(); /* unit start routine */ |
| 89 | int (*md_start)(); /* setup a data transfer */ |
| 90 | int (*md_dtint)(); /* data transfer complete */ |
| 91 | int (*md_ndint)(); /* non-data transfer interrupt */ |
| 92 | short *md_type; /* array of drive type codes */ |
| 93 | char *md_dname, *md_sname; /* device, slave names */ |
| 94 | struct mba_device **md_info; /* backpointers to mbinit structs */ |
| 95 | }; |
| 96 | |
| 97 | /* |
| 98 | * Possible return values from unit start routines. |
| 99 | */ |
| 100 | #define MBU_NEXT 0 /* skip to next operation */ |
| 101 | #define MBU_BUSY 1 /* dual port busy; wait for intr */ |
| 102 | #define MBU_STARTED 2 /* non-data transfer started */ |
| 103 | #define MBU_DODATA 3 /* data transfer ready; start mba */ |
| 104 | |
| 105 | /* |
| 106 | * Possible return values from data transfer interrupt handling routines |
| 107 | */ |
| 108 | #define MBD_DONE 0 /* data transfer complete */ |
| 109 | #define MBD_RETRY 1 /* error occurred, please retry */ |
| 110 | #define MBD_RESTARTED 2 /* driver restarted i/o itself */ |
| 111 | |
| 112 | /* |
| 113 | * Possible return values from non-data-transfer interrupt handling routines |
| 114 | */ |
| 115 | #define MBN_DONE 0 /* non-data transfer complete */ |
| 116 | #define MBN_RETRY 1 /* failed; retry the operation */ |
| 117 | #define MBN_SKIP 2 /* don't do anything */ |
| 118 | |
| 119 | /* |
| 120 | * Clear attention status for specified device. |
| 121 | */ |
| 122 | #define mbclrattn(mi) ((mi)->mi_mba->mba_drv[0].mbd_as = 1 << (mi)->mi_drive) |
| 123 | |
| 124 | /* |
| 125 | * Kernel definitions related to mba. |
| 126 | */ |
| 127 | #ifdef KERNEL |
| 128 | int nummba; |
| 129 | #if NMBA > 0 |
| 130 | struct mba_hd mba_hd[NMBA]; |
| 131 | extern Xmba0int(), Xmba1int(), Xmba2int(), Xmba3int(); |
| 132 | |
| 133 | extern struct mba_device mbdinit[]; |
| 134 | extern struct mba_slave mbsinit[]; |
| 135 | #endif |
| 136 | #endif |