text: /*
   * Copyright (c) 1992, 1993
   *	The Regents of the University of California.  All rights reserved.
   *
   * This code is derived from software contributed to Berkeley by
   * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
   *
   * %sccs.include.redist.c%
   *
   * from: $Hdr: hbvar.h,v 4.300 91/06/09 06:21:52 root Rel41 $ SONY
   *
   *	@(#)hbvar.h	8.1 (Berkeley) 06/11/93
   */
  
  /*
   * Copyright (c) 1987,1988 by SONY Corporation.
   */
  
  /*
   *	hbvar.h.c	ver 0.1		
   *					Form	Fri Dec 11 16:07:41 JST 1987
   *					Modify	Thu Feb  2 08:57:52 JST 1989
   *
   */
  
  #ifndef __HBVAR__
  #define __HBVAR__ 1
  
  /*
   * This file contains definitions related to the kernel structures
   * for dealing with the HYPER-BUS interface.
   *
   * Each HYPER-BUS has a hb_hd structure.
   * Each HYPER-BUS controller which is not a device has a hb_ctlr structure.
   * Each HYPER-BUS device has a hb_device structure.
   */
  
  #ifndef LOCORE
  /*
   * Per-HYPER-BUS structure.
   *
   * This structure holds the interrupt vector for the HYPER-BUS,
   * and its address in physical and virtual space.  At boot time
   * we determine the devices attached to the HYPER-BUS and their
   * interrupt vectors, filling in vh_vec.  We free the map
   * register resources of the HYPER-BUS into the structures
   * defined here.
   *
   * During normal operation, resources are allocated and returned
   * to the structures here.  We watch the number of passive releases
   * on each HYPER-BUS, and if the number is excessive may reset the HYPER-BUS.
   * 
   * When HYPER-BUS resources are needed and not available,
   * then device drivers may have to wait to get to the bus and are
   * queued here.  It is also possible for processes to block in
   * the HYPER-BUS driver in resource wait (mrwant); these
   * wait states are also recorded here.
   */
  struct	hb_hd {
  	caddr_t hh_phys; /* Not used and init now. */
  };
  
  /*
   *	Per-controller structure.
   *
   * If a controller has devices attached, then there are
   * cross-referenced hb_drive structures.
   * This structure is the one which is queued in HYPER-BUS resource wait,
   * and saves the information about HYPER-BUS resources which are used.
   * The queue of devices waiting to transfer is also attached here.
   */
  struct hb_ctlr {
  	struct hb_driver *hm_driver;
  	short hm_ctlr;			/* controller index in driver */
  	short hm_alive;			/* controller exists */
  	caddr_t hm_addr;		/* address of command area */
  	int hm_intr;			/* interrupt number */
  	short hm_scnum ;		/* the scsi it is on */
  	struct hb_hd *hm_hd;
  	int hm_hbinfo;			/* save map registers, etc */
  	struct buf hm_tab;		/* queue of devices for this controller */
  };
  
  /*
   *	Per ``device'' structure.
   *
   * If a controller has many drives attached, then there will
   * be several hb_device structures associated with a single hb_ctlr
   * structure.
   */
  struct hb_device {
  	struct hb_driver *hi_driver;
  	short hi_unit;		/* unit number on the system */
  	short hi_ctlr;		/* mass ctlr number; -1 if none */
  	short hi_slave;		/* slave on controller */
  	caddr_t hi_addr;	/* address of command area */
  	int hi_intr;		/* interrupt number */
  	short hi_dk;		/* if init 1 set to number for iostat */
  	int hi_flags;		/* parameter from system specification */
  	short hi_alive;		/* device exists */
  	short hi_type;		/* driver specific type information */
  /*	caddr_t hi_physaddr;	/* phys addr, for standalone (dump) code */
  /* this is the forward link in a list of devices on a controller */
  	struct hb_device *hi_forw;
  /* if the device is connected to a controller, this is the controller */
  	struct hb_ctlr *hi_mi;
  	struct hb_hd *hi_hd;
  };
  
  /*
   *	Per-driver structure.
   *
   * Each HYPER-BUS driver defines entries for a set of routines
   * as well as an array of types which are acceptable to it.
   * These are used at boot time by the configuration program.
   */
  struct hb_driver {
  	int (*hd_probe)();		/* see if a driver is really there */
  	int (*hd_slave)();		/* see if a slave is there */
  	int (*hd_attach)();		/* setup driver for a slave */
  	int (*hd_dgo)();		/* start transfer */
  	int (*hd_intr)();		/* interrupt handler */
  	char *hd_dname;			/* name of a device */
  	struct hb_device **hd_dinfo;	/* backpointers to hdinit structs */
  	char *hd_mname;			/* name of a controller */
  	struct hb_ctlr **hd_minfo;	/* backpointers to hminit structs */
  	short hd_xclu;			/* want exclusive use */
  };
  
  #ifdef KERNEL
  
  /*
   * HYPER-BUS related kernel variables
   */
  struct	hb_hd hb_hd;
  
  /*
   * Hbinit and hdinit initialize the mass storage controller and
   * device tables specifying possible devices.
   */
  extern	struct	hb_ctlr hminit[];
  extern	struct	hb_device hdinit[];
  
  #endif /* KERNEL */
  
  #endif /* !LOCORE */
  
  #endif /* !__HBVAR__ */
  