From 97fedd9e69f47c9f97768e1aa12784f35787ff1e Mon Sep 17 00:00:00 2001 From: Bill Joy Date: Mon, 9 Feb 1981 02:38:17 -0800 Subject: [PATCH] new mba.h, all nice and pretty SCCS-vsn: sys/vax/mba/mbareg.h 4.4 SCCS-vsn: sys/vax/mba/mbavar.h 4.4 --- usr/src/sys/vax/mba/mbareg.h | 221 +++++++++++++++++++++++++---------- usr/src/sys/vax/mba/mbavar.h | 221 +++++++++++++++++++++++++---------- 2 files changed, 318 insertions(+), 124 deletions(-) diff --git a/usr/src/sys/vax/mba/mbareg.h b/usr/src/sys/vax/mba/mbareg.h index 42010003a6..187783b421 100644 --- a/usr/src/sys/vax/mba/mbareg.h +++ b/usr/src/sys/vax/mba/mbareg.h @@ -1,29 +1,90 @@ -/* mbareg.h 4.3 %G% */ +/* mbareg.h 4.4 %G% */ -#if VAX==780 /* * VAX Massbus adapter registers */ -struct mba_drv +struct mba_regs { - int mbd_cs1; - int mbd_ds; - int mbd_er1; - int mbd_mr1; - int mbd_as; - int mbd_da; -#define mbd_fc mbd_da - int mbd_dt; - int mbd_la; -#define mbd_ck mbd_la - int mbd_sn; - int mbd_of; -#define mbd_tc mbd_of - int mbd_fill[22]; + int mba_csr; /* configuration register */ + int mba_cr; /* control register */ + int mba_sr; /* status register */ + int mba_var; /* virtual address register */ + int mba_bcr; /* byte count register */ + int mba_dr; + int mba_pad1[250]; + struct mba_drv { /* per drive registers */ + int mbd_cs1; /* control status */ + int mbd_ds; /* drive status */ + int mbd_er1; /* error register */ + int mbd_mr1; /* maintenance register */ + int mbd_as; /* attention status */ + int mbd_da; /* desired address (disks) */ +#define mbd_fc mbd_da /* frame count (tapes) */ + int mbd_dt; /* drive type */ + int mbd_la; /* look ahead (disks) */ +#define mbd_ck mbd_la /* ??? (tapes) */ + int mbd_sn; /* serial number */ + int mbd_of; /* ??? */ +#define mbd_tc mbd_of /* ??? */ + int mbd_fill[22]; + } mba_drv[8]; + struct pte mba_map[256]; /* io space virtual map */ + int mba_pad2[256*5]; /* to size of a nexus */ }; + +/* + * Bits in mba_cr + */ +#define MBAINIT 0x1 /* init mba */ +#define MBAIE 0x4 /* enable mba interrupts */ + /* - * Bits in mbd_dt. + * Bits in mba_sr + */ +#define MBS_DTBUSY 0x80000000 /* data transfer busy */ +#define MBS_NRCONF 0x40000000 /* no response confirmation */ +#define MBS_CRD 0x20000000 /* corrected read data */ +#define MBS_CBHUNG 0x00800000 /* control bus hung */ +#define MBS_PGE 0x00080000 /* programming error */ +#define MBS_NED 0x00040000 /* non-existant drive */ +#define MBS_MCPE 0x00020000 /* massbus control parity error */ +#define MBS_ATTN 0x00010000 /* attention from massbus */ +#define MBS_SPE 0x00004000 /* silo parity error */ +#define MBS_DTCMP 0x00002000 /* data transfer completed */ +#define MBS_DTABT 0x00001000 /* data transfer aborted */ +#define MBS_DLT 0x00000800 /* data late */ +#define MBS_WCKUP 0x00000400 /* write check upper */ +#define MBS_WCKLWR 0x00000200 /* write check lower */ +#define MBS_MXF 0x00000100 /* miss transfer error */ +#define MBS_MBEXC 0x00000080 /* massbus exception */ +#define MBS_MDPE 0x00000040 /* massbus data parity error */ +#define MBS_MAPPE 0x00000020 /* page frame map parity error */ +#define MBS_INVMAP 0x00000010 /* invalid map */ +#define MBS_ERRCONF 0x00000008 /* error confirmation */ +#define MBS_RDS 0x00000004 /* read data substitute */ +#define MBS_ISTIMO 0x00000002 /* interface sequence timeout */ +#define MBS_RDTIMO 0x00000001 /* read data timeout */ + +#define MBAEBITS (~(MBS_DTBUSY|MBS_CRD|MBS_ATTN|MBS_DTCMP)) + +/* + * Commands for mbd_cs1 + */ +#define MBD_WCOM 0x30 +#define MBD_RCOM 0x38 +#define MBD_GO 0x1 + +/* + * Bits in mbd_ds. + */ +#define MBD_DRY 0x80 /* drive ready */ +#define MBD_MOL 0x1000 /* medium on line */ +#define MBD_DPR 0x100 /* drive present */ +#define MBD_ERR 0x4000 /* error in drive */ + +/* + * Bits in mbd_dt */ #define MBDT_NSA 0x8000 /* not sector addressible */ #define MBDT_TAP 0x4000 /* is a tape */ @@ -35,6 +96,7 @@ struct mba_drv #define MBDT_TYPE 0x1ff #define MBDT_MASK (MBDT_NSA|MBDT_TAP|MBDT_TYPE) +/* type codes for disk drives */ #define MBDT_RP04 020 #define MBDT_RP05 021 #define MBDT_RP06 022 @@ -43,61 +105,96 @@ struct mba_drv #define MBDT_RM05 027 #define MBDT_RM80 026 +/* type codes for tape drives */ #define MBDT_TM03 050 #define MBDT_TE16 051 #define MBDT_TU45 052 #define MBDT_TU77 054 -#define MBDT_TU78 0140 +#define MBDT_TU78 0140 /* can't handle these (yet) */ /* - * Bits in mbd_ds. + * Each driver has an array of pointers to these structures, one for + * each device it is willing to handle. At bootstrap time, the + * driver tables are filled in; */ -#define MBD_DRY 0x80 -#define MBD_MOL 0x1000 -#define MBD_DPR 0x100 -#define MBD_ERR 0x4000 - -#define MBD_WCOM 0x30 -#define MBD_RCOM 0x38 -#define MBD_GO 0x1 - -struct mba_regs -{ - int mba_csr; - int mba_cr; - int mba_sr; - int mba_var; - int mba_bcr; - int mba_dr; - int mba_pad1[250]; - struct mba_drv mba_drv[8]; - struct pte mba_map[256]; - int mba_pad2[256*5]; +struct mba_info { + struct mba_driver *mi_driver; + short mi_name; /* two character generic name */ + short mi_unit; /* unit number to the system */ + short mi_mbanum; /* the mba it is on */ + short mi_drive; /* controller on mba */ + short mi_slave; /* slave to controller (TM03/TU16) */ + short mi_alive; /* device exists */ + short mi_type; /* driver specific unit type */ + short mi_dk; /* driver number for iostat */ + struct buf mi_tab; /* head of queue for this device */ + struct mba_info *mi_forw; +/* we could compute these every time, but hereby save time */ + struct mba_regs *mi_mba; + struct mba_drv *mi_drv; + struct mba_hd *mi_hd; }; -#define MBAINIT 0x1 -#define MBAIE 0x4 - -#define MBAEBITS 0xe0770 +/* + * The initialization routine uses the information in the mbinit table + * to initialize the drive type routines in the drivers and the + * mbahd array summarizing which devices are hooked to which massbus slots. + */ +struct mba_hd { + short mh_active; + short mh_flags; + struct mba_regs *mh_mba; /* virt addr of mba */ + struct mba_regs *mh_physmba; /* phys addr of mba */ + struct mba_info *mh_mbip[8]; /* what is attached */ + struct mba_info *mh_actf; /* head of queue to transfer */ + struct mba_info *mh_actl; /* tail of queue to transfer */ +} mba_hd[4]; +#ifdef KERNEL +extern struct mba_info mbinit[]; /* blanks for filling mba_info */ +#endif +/* + * Values for flags; normally MH_NOSEEK will be set when there is + * only a single drive on an massbus. + */ +#define MH_NOSEEK 1 +#define MH_NOSEARCH 2 -#define PHYSMBA0 ((struct mba_regs *)0x20010000) -#define PHYSMBA1 ((struct mba_regs *)0x20012000) +/* + * Each massbus driver defines entries for a set of routines + * as well as an array of types which are acceptable to it. + */ +struct mba_driver { + int (*md_dkinit)(); /* setup dk info (mspw) */ + int (*md_ustart)(); /* unit start routine */ + int (*md_start)(); /* setup a data transfer */ + int (*md_dtint)(); /* data transfer complete */ + int (*md_ndint)(); /* non-data transfer interrupt */ + short *md_type; /* array of drive type codes */ + struct mba_info **md_info; /* backpointers to mbinit structs */ +}; -#define mbadev(mba,unit) ((struct device *)&mba->mba_drv[unit]) +/* + * Possible return values from unit start routines. + */ +#define MBU_NEXT 0 /* skip to next operation */ +#define MBU_BUSY 1 /* dual port busy; wait for intr */ +#define MBU_STARTED 2 /* non-data transfer started */ +#define MBU_DODATA 3 /* data transfer ready; start mba */ -#ifdef KERNEL -struct mba_info -{ - struct mba_regs *mi_loc; /* virtual mba */ - struct mba_regs *mi_phys; /* physical mba */ - struct pte *mi_map; /* page table base for nexus */ -}; +/* + * Possible return values from data transfer interrupt handling routines + */ +#define MBD_DONE 0 /* data transfer complete */ +#define MBD_RETRY 1 /* error occurred, please retry */ +#define MBD_RESTARTED 2 /* driver restarted i/o itself */ -#define MBA0 ((struct mba_regs *)0x80064000) -#define MBA1 ((struct mba_regs *)0x80066000) +/* + * Possible return values from non-data-transfer interrupt handling routines + */ +#define MBN_DONE 0 /* non-data transfer complete */ +#define MBN_RETRY 1 /* failed; retry the operation */ -int mbanum[]; -struct mba_info mbainfo[]; -int mbaact; -#endif -#endif +/* + * Clear attention status for specified drive. + */ +#define mbclrattn(mi) ((mi)->mi_mba->mba_drv[0].mbd_as = 1 << (mi)->mi_drive) diff --git a/usr/src/sys/vax/mba/mbavar.h b/usr/src/sys/vax/mba/mbavar.h index 30e8ef5ef6..3c22f7c6cd 100644 --- a/usr/src/sys/vax/mba/mbavar.h +++ b/usr/src/sys/vax/mba/mbavar.h @@ -1,29 +1,90 @@ -/* mbavar.h 4.3 %G% */ +/* mbavar.h 4.4 %G% */ -#if VAX==780 /* * VAX Massbus adapter registers */ -struct mba_drv +struct mba_regs { - int mbd_cs1; - int mbd_ds; - int mbd_er1; - int mbd_mr1; - int mbd_as; - int mbd_da; -#define mbd_fc mbd_da - int mbd_dt; - int mbd_la; -#define mbd_ck mbd_la - int mbd_sn; - int mbd_of; -#define mbd_tc mbd_of - int mbd_fill[22]; + int mba_csr; /* configuration register */ + int mba_cr; /* control register */ + int mba_sr; /* status register */ + int mba_var; /* virtual address register */ + int mba_bcr; /* byte count register */ + int mba_dr; + int mba_pad1[250]; + struct mba_drv { /* per drive registers */ + int mbd_cs1; /* control status */ + int mbd_ds; /* drive status */ + int mbd_er1; /* error register */ + int mbd_mr1; /* maintenance register */ + int mbd_as; /* attention status */ + int mbd_da; /* desired address (disks) */ +#define mbd_fc mbd_da /* frame count (tapes) */ + int mbd_dt; /* drive type */ + int mbd_la; /* look ahead (disks) */ +#define mbd_ck mbd_la /* ??? (tapes) */ + int mbd_sn; /* serial number */ + int mbd_of; /* ??? */ +#define mbd_tc mbd_of /* ??? */ + int mbd_fill[22]; + } mba_drv[8]; + struct pte mba_map[256]; /* io space virtual map */ + int mba_pad2[256*5]; /* to size of a nexus */ }; + +/* + * Bits in mba_cr + */ +#define MBAINIT 0x1 /* init mba */ +#define MBAIE 0x4 /* enable mba interrupts */ + /* - * Bits in mbd_dt. + * Bits in mba_sr + */ +#define MBS_DTBUSY 0x80000000 /* data transfer busy */ +#define MBS_NRCONF 0x40000000 /* no response confirmation */ +#define MBS_CRD 0x20000000 /* corrected read data */ +#define MBS_CBHUNG 0x00800000 /* control bus hung */ +#define MBS_PGE 0x00080000 /* programming error */ +#define MBS_NED 0x00040000 /* non-existant drive */ +#define MBS_MCPE 0x00020000 /* massbus control parity error */ +#define MBS_ATTN 0x00010000 /* attention from massbus */ +#define MBS_SPE 0x00004000 /* silo parity error */ +#define MBS_DTCMP 0x00002000 /* data transfer completed */ +#define MBS_DTABT 0x00001000 /* data transfer aborted */ +#define MBS_DLT 0x00000800 /* data late */ +#define MBS_WCKUP 0x00000400 /* write check upper */ +#define MBS_WCKLWR 0x00000200 /* write check lower */ +#define MBS_MXF 0x00000100 /* miss transfer error */ +#define MBS_MBEXC 0x00000080 /* massbus exception */ +#define MBS_MDPE 0x00000040 /* massbus data parity error */ +#define MBS_MAPPE 0x00000020 /* page frame map parity error */ +#define MBS_INVMAP 0x00000010 /* invalid map */ +#define MBS_ERRCONF 0x00000008 /* error confirmation */ +#define MBS_RDS 0x00000004 /* read data substitute */ +#define MBS_ISTIMO 0x00000002 /* interface sequence timeout */ +#define MBS_RDTIMO 0x00000001 /* read data timeout */ + +#define MBAEBITS (~(MBS_DTBUSY|MBS_CRD|MBS_ATTN|MBS_DTCMP)) + +/* + * Commands for mbd_cs1 + */ +#define MBD_WCOM 0x30 +#define MBD_RCOM 0x38 +#define MBD_GO 0x1 + +/* + * Bits in mbd_ds. + */ +#define MBD_DRY 0x80 /* drive ready */ +#define MBD_MOL 0x1000 /* medium on line */ +#define MBD_DPR 0x100 /* drive present */ +#define MBD_ERR 0x4000 /* error in drive */ + +/* + * Bits in mbd_dt */ #define MBDT_NSA 0x8000 /* not sector addressible */ #define MBDT_TAP 0x4000 /* is a tape */ @@ -35,6 +96,7 @@ struct mba_drv #define MBDT_TYPE 0x1ff #define MBDT_MASK (MBDT_NSA|MBDT_TAP|MBDT_TYPE) +/* type codes for disk drives */ #define MBDT_RP04 020 #define MBDT_RP05 021 #define MBDT_RP06 022 @@ -43,61 +105,96 @@ struct mba_drv #define MBDT_RM05 027 #define MBDT_RM80 026 +/* type codes for tape drives */ #define MBDT_TM03 050 #define MBDT_TE16 051 #define MBDT_TU45 052 #define MBDT_TU77 054 -#define MBDT_TU78 0140 +#define MBDT_TU78 0140 /* can't handle these (yet) */ /* - * Bits in mbd_ds. + * Each driver has an array of pointers to these structures, one for + * each device it is willing to handle. At bootstrap time, the + * driver tables are filled in; */ -#define MBD_DRY 0x80 -#define MBD_MOL 0x1000 -#define MBD_DPR 0x100 -#define MBD_ERR 0x4000 - -#define MBD_WCOM 0x30 -#define MBD_RCOM 0x38 -#define MBD_GO 0x1 - -struct mba_regs -{ - int mba_csr; - int mba_cr; - int mba_sr; - int mba_var; - int mba_bcr; - int mba_dr; - int mba_pad1[250]; - struct mba_drv mba_drv[8]; - struct pte mba_map[256]; - int mba_pad2[256*5]; +struct mba_info { + struct mba_driver *mi_driver; + short mi_name; /* two character generic name */ + short mi_unit; /* unit number to the system */ + short mi_mbanum; /* the mba it is on */ + short mi_drive; /* controller on mba */ + short mi_slave; /* slave to controller (TM03/TU16) */ + short mi_alive; /* device exists */ + short mi_type; /* driver specific unit type */ + short mi_dk; /* driver number for iostat */ + struct buf mi_tab; /* head of queue for this device */ + struct mba_info *mi_forw; +/* we could compute these every time, but hereby save time */ + struct mba_regs *mi_mba; + struct mba_drv *mi_drv; + struct mba_hd *mi_hd; }; -#define MBAINIT 0x1 -#define MBAIE 0x4 - -#define MBAEBITS 0xe0770 +/* + * The initialization routine uses the information in the mbinit table + * to initialize the drive type routines in the drivers and the + * mbahd array summarizing which devices are hooked to which massbus slots. + */ +struct mba_hd { + short mh_active; + short mh_flags; + struct mba_regs *mh_mba; /* virt addr of mba */ + struct mba_regs *mh_physmba; /* phys addr of mba */ + struct mba_info *mh_mbip[8]; /* what is attached */ + struct mba_info *mh_actf; /* head of queue to transfer */ + struct mba_info *mh_actl; /* tail of queue to transfer */ +} mba_hd[4]; +#ifdef KERNEL +extern struct mba_info mbinit[]; /* blanks for filling mba_info */ +#endif +/* + * Values for flags; normally MH_NOSEEK will be set when there is + * only a single drive on an massbus. + */ +#define MH_NOSEEK 1 +#define MH_NOSEARCH 2 -#define PHYSMBA0 ((struct mba_regs *)0x20010000) -#define PHYSMBA1 ((struct mba_regs *)0x20012000) +/* + * Each massbus driver defines entries for a set of routines + * as well as an array of types which are acceptable to it. + */ +struct mba_driver { + int (*md_dkinit)(); /* setup dk info (mspw) */ + int (*md_ustart)(); /* unit start routine */ + int (*md_start)(); /* setup a data transfer */ + int (*md_dtint)(); /* data transfer complete */ + int (*md_ndint)(); /* non-data transfer interrupt */ + short *md_type; /* array of drive type codes */ + struct mba_info **md_info; /* backpointers to mbinit structs */ +}; -#define mbadev(mba,unit) ((struct device *)&mba->mba_drv[unit]) +/* + * Possible return values from unit start routines. + */ +#define MBU_NEXT 0 /* skip to next operation */ +#define MBU_BUSY 1 /* dual port busy; wait for intr */ +#define MBU_STARTED 2 /* non-data transfer started */ +#define MBU_DODATA 3 /* data transfer ready; start mba */ -#ifdef KERNEL -struct mba_info -{ - struct mba_regs *mi_loc; /* virtual mba */ - struct mba_regs *mi_phys; /* physical mba */ - struct pte *mi_map; /* page table base for nexus */ -}; +/* + * Possible return values from data transfer interrupt handling routines + */ +#define MBD_DONE 0 /* data transfer complete */ +#define MBD_RETRY 1 /* error occurred, please retry */ +#define MBD_RESTARTED 2 /* driver restarted i/o itself */ -#define MBA0 ((struct mba_regs *)0x80064000) -#define MBA1 ((struct mba_regs *)0x80066000) +/* + * Possible return values from non-data-transfer interrupt handling routines + */ +#define MBN_DONE 0 /* non-data transfer complete */ +#define MBN_RETRY 1 /* failed; retry the operation */ -int mbanum[]; -struct mba_info mbainfo[]; -int mbaact; -#endif -#endif +/* + * Clear attention status for specified drive. + */ +#define mbclrattn(mi) ((mi)->mi_mba->mba_drv[0].mbd_as = 1 << (mi)->mi_drive) -- 2.20.1