mods from shannon to autoconfigure mba devices after boot
authorSam Leffler <sam@ucbvax.Berkeley.EDU>
Mon, 12 Apr 1982 10:37:52 +0000 (02:37 -0800)
committerSam Leffler <sam@ucbvax.Berkeley.EDU>
Mon, 12 Apr 1982 10:37:52 +0000 (02:37 -0800)
SCCS-vsn: sys/vax/mba/mba.c 4.26
SCCS-vsn: sys/vax/vax/autoconf.c 4.36

usr/src/sys/vax/mba/mba.c
usr/src/sys/vax/vax/autoconf.c

index e506c82..68c201e 100644 (file)
@@ -1,4 +1,4 @@
-/*     mba.c   4.25    82/03/31        */
+/*     mba.c   4.26    82/04/11        */
 
 #include "mba.h"
 #if NMBA > 0
 
 #include "mba.h"
 #if NMBA > 0
@@ -44,6 +44,20 @@ loop:
        bp = mi->mi_tab.b_actf;
        if (bp == NULL)
                return;
        bp = mi->mi_tab.b_actf;
        if (bp == NULL)
                return;
+       /*
+        * Make sure the drive is still there before starting it up.
+        */
+       if ((mi->mi_drv->mbd_dt & MBDT_TYPE) == 0) {
+               printf("%s%d: nonexistent\n", mi->mi_driver->md_dname,
+                   dkunit(bp));
+               mi->mi_alive = 0;
+               mi->mi_tab.b_actf = bp->av_forw;
+               mi->mi_tab.b_active = 0;
+               mi->mi_tab.b_errcnt = 0;
+               bp->b_flags |= B_ERROR;
+               iodone(bp);
+               goto loop;
+       }
        /*
         * Let the drivers unit start routine have at it
         * and then process the request further, per its instructions.
        /*
         * Let the drivers unit start routine have at it
         * and then process the request further, per its instructions.
@@ -138,10 +152,15 @@ loop:
         * ONLINE themselves and because TU78 registers are
         * different.
         */
         * ONLINE themselves and because TU78 registers are
         * different.
         */
-       if ((mi->mi_drv->mbd_dt & MBDT_TAP) == 0)
+       if (((com = mi->mi_drv->mbd_dt) & MBDT_TAP) == 0)
        if ((mi->mi_drv->mbd_ds & MBDS_DREADY) != MBDS_DREADY) {
        if ((mi->mi_drv->mbd_ds & MBDS_DREADY) != MBDS_DREADY) {
-               printf("%s%d: not ready\n", mi->mi_driver->md_dname,
-                   dkunit(bp));
+               if ((com & MBDT_TYPE) == 0) {
+                       mi->mi_alive = 0;
+                       printf("%s%d: nonexistent\n", mi->mi_driver->md_dname,
+                           dkunit(bp));
+               } else
+                       printf("%s%d: not ready\n", mi->mi_driver->md_dname,
+                           dkunit(bp));
                mi->mi_tab.b_actf = bp->av_forw;
                mi->mi_tab.b_errcnt = 0;
                mi->mi_tab.b_active = 0;
                mi->mi_tab.b_actf = bp->av_forw;
                mi->mi_tab.b_errcnt = 0;
                mi->mi_tab.b_active = 0;
@@ -192,6 +211,7 @@ mbintr(mbanum)
        register struct buf *bp;
        register int drive;
        int mbasr, as;
        register struct buf *bp;
        register int drive;
        int mbasr, as;
+       extern struct mba_device *mbaconfig();
        
        /*
         * Read out the massbus status register
        
        /*
         * Read out the massbus status register
@@ -268,17 +288,47 @@ mbintr(mbanum)
                drive--;                /* was 1 origin */
                as &= ~(1 << drive);
                mi = mhp->mh_mbip[drive];
                drive--;                /* was 1 origin */
                as &= ~(1 << drive);
                mi = mhp->mh_mbip[drive];
-               if (mi == NULL)
-                       continue;
+               if (mi == NULL || mi->mi_alive == 0) {
+                       struct mba_device fnd;
+                       struct mba_slave *ms;
+                       struct mba_drv *mbd = &mhp->mh_mba->mba_drv[drive];
+                       int dt = mbd->mbd_dt & 0xffff;
+
+                       if (dt == 0 || dt == MBDT_MOH)
+                               continue;
+                       fnd.mi_mba = mhp->mh_mba;
+                       fnd.mi_mbanum = mbanum;
+                       fnd.mi_drive = drive;
+                       if ((mi = mbaconfig(&fnd, dt)) == NULL)
+                               continue;
+                       if (dt & MBDT_TAP) {
+                               for (ms = mbsinit; ms->ms_driver; ms++)
+                               if (ms->ms_driver == mi->mi_driver &&
+                                   ms->ms_alive == 0 && 
+                                   (ms->ms_ctlr == mi->mi_unit ||
+                                    ms->ms_ctlr == '?')) {
+                                       if ((*ms->ms_driver->md_slave)(mi, ms)) {
+                                               printf("%s%d at %s%d slave %d\n",
+                                                   ms->ms_driver->md_sname,
+                                                   ms->ms_unit,
+                                                   mi->mi_driver->md_dname,
+                                                   mi->mi_unit,
+                                                   ms->ms_slave);
+                                               ms->ms_alive = 1;
+                                               ms->ms_ctlr = mi->mi_unit;
+                                       }
+                               }
+                       }
+               }
                /*
                 * If driver has a handler for non-data transfer
                 * interrupts, give it a chance to tell us what to do.
                 */
                if (mi->mi_driver->md_ndint) {
                /*
                 * If driver has a handler for non-data transfer
                 * interrupts, give it a chance to tell us what to do.
                 */
                if (mi->mi_driver->md_ndint) {
-                       mi->mi_tab.b_active = 0;
                        switch ((*mi->mi_driver->md_ndint)(mi)) {
 
                        case MBN_DONE:          /* operation completed */
                        switch ((*mi->mi_driver->md_ndint)(mi)) {
 
                        case MBN_DONE:          /* operation completed */
+                               mi->mi_tab.b_active = 0;
                                mi->mi_tab.b_errcnt = 0;
                                bp = mi->mi_tab.b_actf;
                                mi->mi_tab.b_actf = bp->av_forw;
                                mi->mi_tab.b_errcnt = 0;
                                bp = mi->mi_tab.b_actf;
                                mi->mi_tab.b_actf = bp->av_forw;
index db865dc..382d1f9 100644 (file)
@@ -1,4 +1,4 @@
-/*     autoconf.c      4.35    82/04/11        */
+/*     autoconf.c      4.36    82/04/11        */
 
 /*
  * Setup the system to run on the current machine.
 
 /*
  * Setup the system to run on the current machine.
@@ -283,10 +283,9 @@ found:
 #define        match(fld)      (ni->fld == mi->fld || mi->fld == '?')
                if (!match(mi_drive) || !match(mi_mbanum))
                        continue;
 #define        match(fld)      (ni->fld == mi->fld || mi->fld == '?')
                if (!match(mi_drive) || !match(mi_mbanum))
                        continue;
-               printf("%s%d at mba%d drive %d",
+               printf("%s%d at mba%d drive %d\n",
                    mi->mi_driver->md_dname, mi->mi_unit,
                    ni->mi_mbanum, ni->mi_drive);
                    mi->mi_driver->md_dname, mi->mi_unit,
                    ni->mi_mbanum, ni->mi_drive);
-               printf("\n");
                mi->mi_alive = 1;
                mh = &mba_hd[ni->mi_mbanum];
                mi->mi_hd = mh;
                mi->mi_alive = 1;
                mh = &mba_hd[ni->mi_mbanum];
                mi->mi_hd = mh;
@@ -294,13 +293,19 @@ found:
                mh->mh_ndrive++;
                mi->mi_mba = ni->mi_mba;
                mi->mi_drv = &mi->mi_mba->mba_drv[ni->mi_drive];
                mh->mh_ndrive++;
                mi->mi_mba = ni->mi_mba;
                mi->mi_drv = &mi->mi_mba->mba_drv[ni->mi_drive];
-               mi->mi_driver->md_info[mi->mi_unit] = mi;
                mi->mi_mbanum = ni->mi_mbanum;
                mi->mi_drive = ni->mi_drive;
                mi->mi_mbanum = ni->mi_mbanum;
                mi->mi_drive = ni->mi_drive;
-               if (mi->mi_dk && dkn < DK_NDRIVE)
-                       mi->mi_dk = dkn++;
-               else
-                       mi->mi_dk = -1;
+               /*
+                * If drive has never been seen before,
+                * give it a dkn for statistics.
+                */
+               if (mi->mi_driver->md_info[mi->mi_unit] == 0) {
+                       mi->mi_driver->md_info[mi->mi_unit] = mi;
+                       if (mi->mi_dk && dkn < DK_NDRIVE)
+                               mi->mi_dk = dkn++;
+                       else
+                               mi->mi_dk = -1;
+               }
                (*mi->mi_driver->md_attach)(mi);
                return (mi);
        }
                (*mi->mi_driver->md_attach)(mi);
                return (mi);
        }