Some patches from Bob Nestor <rnestor@metronet.com> to edge toward support
authorbriggs <briggs@openbsd.org>
Tue, 8 Apr 1997 04:14:45 +0000 (04:14 +0000)
committerbriggs <briggs@openbsd.org>
Tue, 8 Apr 1997 04:14:45 +0000 (04:14 +0000)
for an Apple SONIC-based ethernet card.  Includes a patch to the nubus
probing that we worked out together.  Some cards, like his, were being
missed and/or probed like video cards\!

sys/arch/mac68k/dev/if_ae_nubus.c
sys/arch/mac68k/dev/if_sn_nubus.c
sys/arch/mac68k/dev/nubus.c
sys/arch/mac68k/dev/nubus.h

index 856057d..a8a95ce 100644 (file)
@@ -1,5 +1,5 @@
 /*     $NetBSD: if_ae_nubus.c,v 1.11 1997/03/19 08:04:39 scottr Exp $  */
-/*     $OpenBSD: if_ae_nubus.c,v 1.4 1997/03/25 04:58:43 briggs Exp $  */
+/*     $OpenBSD: if_ae_nubus.c,v 1.5 1997/04/08 04:14:45 briggs Exp $  */
 
 /*
  * Copyright (C) 1997 Scott Reynolds
@@ -348,11 +348,20 @@ ae_nb_card_vendor(na)
        int vendor;
 
        switch (na->drsw) {
-       case NUBUS_DRSW_3COM:
        case NUBUS_DRSW_APPLE:
        case NUBUS_DRSW_TECHWORKS:
                vendor = AE_VENDOR_APPLE;
                break;
+       case NUBUS_DRSW_3COM:
+               switch (na->drhw) {
+               case NUBUS_DRHW_APPLE_SN:
+                       vendor = AE_VENDOR_UNKNOWN;
+                       break;
+               default:        /* Apple, others, supported by AE */
+                       vendor = AE_VENDOR_APPLE;
+                       break;
+               }
+               break;
        case NUBUS_DRSW_ASANTE:
                vendor = AE_VENDOR_ASANTE;
                break;
index 977d14c..5c2ab3f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if_sn_nubus.c,v 1.4 1997/03/29 23:26:49 briggs Exp $  */
+/*     $OpenBSD: if_sn_nubus.c,v 1.5 1997/04/08 04:14:46 briggs Exp $  */
 
 /*
  * Copyright (C) 1997 Allen Briggs
@@ -54,6 +54,8 @@
 static int     sn_nubus_match __P((struct device *, void *, void *));
 static void    sn_nubus_attach __P((struct device *, struct device *, void *));
 static int     sn_nb_card_vendor __P((struct nubus_attach_args *));
+static int     sn_nb_get_enaddr __P((struct nubus_attach_args *,
+                                       u_int8_t *, int));
 
 struct cfattach sn_nubus_ca = {
        sizeof(struct sn_softc), sn_nubus_match, sn_nubus_attach
@@ -78,14 +80,14 @@ sn_nubus_match(parent, vcf, aux)
        if (na->category == NUBUS_CATEGORY_NETWORK &&
            na->type == NUBUS_TYPE_ETHERNET) {
                switch (sn_nb_card_vendor(na)) {
-               default:
-                       rv = UNSUPP;
-                       break;
 
-               /* This is it for now... */
+               case AE_VENDOR_APPLE:
                case AE_VENDOR_DAYNA:
                        rv = 1;
                        break;
+
+               default:
+                       break;
                }
        }
 
@@ -155,6 +157,22 @@ sn_nubus_attach(parent, self, aux)
                success = 1;
                 break;
 
+       case AE_VENDOR_APPLE:
+                sc->snr_dcr = DCR_ASYNC | DCR_WAIT0 | DCR_DW32 |
+                       DCR_DMABLOCK | DCR_RFT16 | DCR_TFT16;
+               sc->snr_dcr2 = 0;
+
+               if (bus_space_subregion(bst, bsh, 0x00180000, SN_REGSIZE,
+                                       &sc->sc_regh)) {
+                       printf(": failed to map register space.\n");
+                       break;
+               }
+
+               sn_nb_get_enaddr(na, sc->sc_arpcom.ac_enaddr, na, 0x8);
+
+               success = 1;
+                break;
+
         default:
                 /*
                  * You can't actually get this default, the snmatch
@@ -165,6 +183,7 @@ sn_nubus_attach(parent, self, aux)
                 sc->snr_dcr = DCR_SYNC | DCR_WAIT0 | DCR_DW32 |
                        DCR_DMABLOCK | DCR_RFT16 | DCR_TFT16;
                sc->snr_dcr2 = 0;
+               printf(": attachment incomplete.\n");
                 return;
         }
 
@@ -198,6 +217,15 @@ sn_nb_card_vendor(na)
 
        switch (na->drsw) {
        case NUBUS_DRSW_3COM:
+               switch (na->drhw) {
+               case NUBUS_DRHW_APPLE_SN:
+                       vendor = AE_VENDOR_APPLE;
+                       break;
+               default:
+                       vendor = AE_VENDOR_UNKNOWN;
+                       break;
+               }
+               break;
        case NUBUS_DRSW_APPLE:
        case NUBUS_DRSW_TECHWORKS:
                vendor = AE_VENDOR_APPLE;
@@ -237,3 +265,24 @@ sn_nb_card_vendor(na)
        }
        return vendor;
 }
+
+static int
+sn_nb_get_enaddr(na, ep, rsrc1)
+       struct nubus_attach_args *na;
+       u_int8_t *ep;
+       int     rsrc1;
+{
+       nubus_dir dir;
+       nubus_dirent dirent;
+
+       nubus_get_main_dir(na->fmt, &dir);
+       if (nubus_find_rsrc(na->fmt, &dir, na->rsrcid, &dirent) <= 0)
+               return 1;
+       nubus_get_dir_from_rsrc(na->fmt, &dirent, &dir);
+       if (nubus_find_rsrc(na->fmt, &dir, rsrc1, &dirent) <= 0)
+               return 1;
+       if (nubus_get_ind_data(na->fmt, &dirent, ep, ETHER_ADDR_LEN) <= 0)
+               return 1;
+
+       return 0;
+}
index 5d11e09..174ec6d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: nubus.c,v 1.9 1997/03/12 13:15:58 briggs Exp $        */
+/*     $OpenBSD: nubus.c,v 1.10 1997/04/08 04:14:46 briggs Exp $       */
 /*     $NetBSD: nubus.c,v 1.32 1997/02/28 07:54:02 scottr Exp $        */
 
 /*
@@ -108,6 +108,7 @@ nubus_attach(parent, self, aux)
        nubus_dir dir;
        nubus_dirent dirent;
        nubus_type slottype;
+       u_long entry;
        int i, rsrcid;
 
        printf("\n");
@@ -116,13 +117,54 @@ nubus_attach(parent, self, aux)
                if (probe_slot(i, &fmtblock) <= 0)
                        continue;
 
-               if ((rsrcid = nubus_video_resource(i)) == (-1))
-                       rsrcid = 0x80;
+               rsrcid = 0x80;
 
                nubus_get_main_dir(&fmtblock, &dir);
 
-               if (nubus_find_rsrc(&fmtblock, &dir, rsrcid, &dirent) <= 0)
-                       continue;
+               /*
+                * Get the resource for the first function on the card.
+                * This is assumed to be at resource ID 0x80.  If we can
+                * not find this entry (as we can not on some video cards),
+                * check to see if we can get a different ID from the list
+                * of video resources given to us by the booter.  If that
+                * doesn't work either, take the first resource following
+                * the board resource.
+                */
+               if (nubus_find_rsrc(&fmtblock, &dir, rsrcid, &dirent) <= 0) {
+                       if ((rsrcid = nubus_video_resource(i)) == -1) {
+                               /*
+                                * Since nubus_find_rsrc failed, the directory
+                                * is back at its base.
+                                */
+                               entry = dir.curr_ent;
+
+                               /*
+                                * All nubus cards should have a board
+                                * resource, but be sure that's what it
+                                * is before we skip it.
+                                */
+                               rsrcid = GetByte(&fmtblock, entry);
+                               if (rsrcid == 0x1)
+                                       entry =
+                                           IncPtr(&fmtblock, dir.curr_ent, 4);
+
+                               rsrcid = GetByte(&fmtblock, entry);
+#ifdef DEBUG
+                               if (nubus_debug & NDB_FOLLOW)
+                                       printf("\tUsing rsrc 0x%x.\n", rsrcid);
+#endif
+                               if (rsrcid == 0xff)
+                                       continue;       /* end of chain */
+                       }
+                       /*
+                        * Try to find the resource passed by the booter
+                        * or the one we just tracked down.
+                        */
+                       if (nubus_find_rsrc(&fmtblock, &dir,
+                                           rsrcid, &dirent) <= 0) {
+                               continue;
+                       }
+               }
 
                nubus_get_dir_from_rsrc(&fmtblock, &dirent, &dir);
 
@@ -134,6 +176,35 @@ nubus_attach(parent, self, aux)
                    (caddr_t) &slottype, sizeof(nubus_type)) <= 0)
                        continue;
 
+               /*
+                * If this is a display card, try to pull out the correct
+                * display mode as passed by the booter.
+                */
+               if (slottype.category == NUBUS_CATEGORY_DISPLAY) {
+                       int     r;
+
+                       if ((r = nubus_video_resource(i)) != -1) {
+
+                               nubus_get_main_dir(&fmtblock, &dir);
+
+                               if (nubus_find_rsrc(&fmtblock, &dir,
+                                                   r, &dirent) <= 0)
+                                       continue;
+
+                               nubus_get_dir_from_rsrc(&fmtblock,
+                                                       &dirent, &dir);
+
+                               if (nubus_find_rsrc(&fmtblock, &dir,
+                                               NUBUS_RSRC_TYPE, &dirent) <= 0)
+                                       continue;
+
+                               if (nubus_get_ind_data(&fmtblock, &dirent,
+                                               (caddr_t) &slottype,
+                                               sizeof(nubus_type)) <= 0)
+                                       continue;
+                       }
+               }
+
                na_args.slot = i;
                na_args.rsrcid = rsrcid;
                na_args.category = slottype.category;
index 22bef0d..59e9f67 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: nubus.h,v 1.9 1997/04/01 13:52:34 briggs Exp $        */
+/*     $OpenBSD: nubus.h,v 1.10 1997/04/08 04:14:47 briggs Exp $       */
 /*     $NetBSD: nubus.h,v 1.17 1997/02/24 06:20:07 scottr Exp $        */
 
 /*
@@ -72,8 +72,9 @@
 #define   NUBUS_DRSW_FOCUS     0x011A
 #define    NUBUS_DRHW_INTERLAN 0x0100
 #define    NUBUS_DRHW_KINETICS 0x0106
-#define    NUBUS_DRHW_SONIC    0x0110
 #define    NUBUS_DRHW_CABLETRON        0x0109
+#define    NUBUS_DRHW_SONIC    0x0110
+#define    NUBUS_DRHW_APPLE_SN 0x0119
 
 #define NUBUS_CATEGORY_COMMUNICATIONS  0x0006
 #define  NUBUS_TYPE_RS232      0x0002