1 /* 2 * Copyright (c) 1992, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc. 7 * 8 * %sccs.include.redist.c% 9 * 10 * from: $Hdr: hbvar.h,v 4.300 91/06/09 06:21:52 root Rel41 $ SONY 11 * 12 * @(#)hbvar.h 8.1 (Berkeley) 06/11/93 13 */ 14 15 /* 16 * Copyright (c) 1987,1988 by SONY Corporation. 17 */ 18 19 /* 20 * hbvar.h.c ver 0.1 21 * Form Fri Dec 11 16:07:41 JST 1987 22 * Modify Thu Feb 2 08:57:52 JST 1989 23 * 24 */ 25 26 #ifndef __HBVAR__ 27 #define __HBVAR__ 1 28 29 /* 30 * This file contains definitions related to the kernel structures 31 * for dealing with the HYPER-BUS interface. 32 * 33 * Each HYPER-BUS has a hb_hd structure. 34 * Each HYPER-BUS controller which is not a device has a hb_ctlr structure. 35 * Each HYPER-BUS device has a hb_device structure. 36 */ 37 38 #ifndef LOCORE 39 /* 40 * Per-HYPER-BUS structure. 41 * 42 * This structure holds the interrupt vector for the HYPER-BUS, 43 * and its address in physical and virtual space. At boot time 44 * we determine the devices attached to the HYPER-BUS and their 45 * interrupt vectors, filling in vh_vec. We free the map 46 * register resources of the HYPER-BUS into the structures 47 * defined here. 48 * 49 * During normal operation, resources are allocated and returned 50 * to the structures here. We watch the number of passive releases 51 * on each HYPER-BUS, and if the number is excessive may reset the HYPER-BUS. 52 * 53 * When HYPER-BUS resources are needed and not available, 54 * then device drivers may have to wait to get to the bus and are 55 * queued here. It is also possible for processes to block in 56 * the HYPER-BUS driver in resource wait (mrwant); these 57 * wait states are also recorded here. 58 */ 59 struct hb_hd { 60 caddr_t hh_phys; /* Not used and init now. */ 61 }; 62 63 /* 64 * Per-controller structure. 65 * 66 * If a controller has devices attached, then there are 67 * cross-referenced hb_drive structures. 68 * This structure is the one which is queued in HYPER-BUS resource wait, 69 * and saves the information about HYPER-BUS resources which are used. 70 * The queue of devices waiting to transfer is also attached here. 71 */ 72 struct hb_ctlr { 73 struct hb_driver *hm_driver; 74 short hm_ctlr; /* controller index in driver */ 75 short hm_alive; /* controller exists */ 76 caddr_t hm_addr; /* address of command area */ 77 int hm_intr; /* interrupt number */ 78 short hm_scnum ; /* the scsi it is on */ 79 struct hb_hd *hm_hd; 80 int hm_hbinfo; /* save map registers, etc */ 81 struct buf hm_tab; /* queue of devices for this controller */ 82 }; 83 84 /* 85 * Per ``device'' structure. 86 * 87 * If a controller has many drives attached, then there will 88 * be several hb_device structures associated with a single hb_ctlr 89 * structure. 90 */ 91 struct hb_device { 92 struct hb_driver *hi_driver; 93 short hi_unit; /* unit number on the system */ 94 short hi_ctlr; /* mass ctlr number; -1 if none */ 95 short hi_slave; /* slave on controller */ 96 caddr_t hi_addr; /* address of command area */ 97 int hi_intr; /* interrupt number */ 98 short hi_dk; /* if init 1 set to number for iostat */ 99 int hi_flags; /* parameter from system specification */ 100 short hi_alive; /* device exists */ 101 short hi_type; /* driver specific type information */ 102 /* caddr_t hi_physaddr; /* phys addr, for standalone (dump) code */ 103 /* this is the forward link in a list of devices on a controller */ 104 struct hb_device *hi_forw; 105 /* if the device is connected to a controller, this is the controller */ 106 struct hb_ctlr *hi_mi; 107 struct hb_hd *hi_hd; 108 }; 109 110 /* 111 * Per-driver structure. 112 * 113 * Each HYPER-BUS driver defines entries for a set of routines 114 * as well as an array of types which are acceptable to it. 115 * These are used at boot time by the configuration program. 116 */ 117 struct hb_driver { 118 int (*hd_probe)(); /* see if a driver is really there */ 119 int (*hd_slave)(); /* see if a slave is there */ 120 int (*hd_attach)(); /* setup driver for a slave */ 121 int (*hd_dgo)(); /* start transfer */ 122 int (*hd_intr)(); /* interrupt handler */ 123 char *hd_dname; /* name of a device */ 124 struct hb_device **hd_dinfo; /* backpointers to hdinit structs */ 125 char *hd_mname; /* name of a controller */ 126 struct hb_ctlr **hd_minfo; /* backpointers to hminit structs */ 127 short hd_xclu; /* want exclusive use */ 128 }; 129 130 #ifdef KERNEL 131 132 /* 133 * HYPER-BUS related kernel variables 134 */ 135 struct hb_hd hb_hd; 136 137 /* 138 * Hbinit and hdinit initialize the mass storage controller and 139 * device tables specifying possible devices. 140 */ 141 extern struct hb_ctlr hminit[]; 142 extern struct hb_device hdinit[]; 143 144 #endif /* KERNEL */ 145 146 #endif /* !LOCORE */ 147 148 #endif /* !__HBVAR__ */ 149