Annotation of sys/arch/mac68k/dev/if_sn_nubus.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: if_sn_nubus.c,v 1.18 2006/03/23 04:10:13 brad Exp $ */
! 2: /* $NetBSD: if_sn_nubus.c,v 1.13 1997/05/11 19:11:34 scottr Exp $ */
! 3: /*
! 4: * Copyright (C) 1997 Allen Briggs
! 5: * All rights reserved.
! 6: *
! 7: * Redistribution and use in source and binary forms, with or without
! 8: * modification, are permitted provided that the following conditions
! 9: * are met:
! 10: * 1. Redistributions of source code must retain the above copyright
! 11: * notice, this list of conditions and the following disclaimer.
! 12: * 2. Redistributions in binary form must reproduce the above copyright
! 13: * notice, this list of conditions and the following disclaimer in the
! 14: * documentation and/or other materials provided with the distribution.
! 15: * 3. All advertising materials mentioning features or use of this software
! 16: * must display the following acknowledgement:
! 17: * This product includes software developed by Allen Briggs
! 18: * 4. The name of the author may not be used to endorse or promote products
! 19: * derived from this software without specific prior written permission.
! 20: *
! 21: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 22: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 23: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 24: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 25: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 26: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 27: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 28: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 29: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 30: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 31: */
! 32:
! 33: #include <sys/param.h>
! 34: #include <sys/device.h>
! 35: #include <sys/errno.h>
! 36: #include <sys/ioctl.h>
! 37: #include <sys/socket.h>
! 38: #include <sys/syslog.h>
! 39: #include <sys/systm.h>
! 40:
! 41: #include <net/if.h>
! 42:
! 43: #ifdef INET
! 44: #include <netinet/in.h>
! 45: #include <netinet/if_ether.h>
! 46: #endif
! 47:
! 48: #include <machine/bus.h>
! 49: #include <machine/viareg.h>
! 50:
! 51: #include <mac68k/dev/nubus.h>
! 52: #include <mac68k/dev/if_snreg.h>
! 53: #include <mac68k/dev/if_snvar.h>
! 54:
! 55: #define INTERFACE_NAME_LEN 32
! 56:
! 57: static int sn_nubus_match(struct device *, void *, void *);
! 58: static void sn_nubus_attach(struct device *, struct device *, void *);
! 59: static int sn_nb_card_vendor(bus_space_tag_t, bus_space_handle_t,
! 60: struct nubus_attach_args *);
! 61:
! 62: struct cfattach sn_nubus_ca = {
! 63: sizeof(struct sn_softc), sn_nubus_match, sn_nubus_attach
! 64: };
! 65:
! 66:
! 67: static int
! 68: sn_nubus_match(struct device *parent, void *cf, void *aux)
! 69: {
! 70: struct nubus_attach_args *na = (struct nubus_attach_args *) aux;
! 71: bus_space_handle_t bsh;
! 72: int rv;
! 73:
! 74: if (bus_space_map(na->na_tag,
! 75: NUBUS_SLOT2PA(na->slot), NBMEMSIZE, 0, &bsh))
! 76: return (0);
! 77:
! 78: rv = 0;
! 79:
! 80: if (na->category == NUBUS_CATEGORY_NETWORK &&
! 81: na->type == NUBUS_TYPE_ETHERNET) {
! 82: switch (sn_nb_card_vendor(na->na_tag, bsh, na)) {
! 83: default:
! 84: break;
! 85:
! 86: case SN_VENDOR_APPLE:
! 87: case SN_VENDOR_APPLE16:
! 88: case SN_VENDOR_ASANTELC:
! 89: case SN_VENDOR_DAYNA:
! 90: rv = 1;
! 91: break;
! 92: }
! 93: }
! 94:
! 95: bus_space_unmap(na->na_tag, bsh, NBMEMSIZE);
! 96:
! 97: return (rv);
! 98: }
! 99:
! 100: /*
! 101: * Install interface into kernel networking data structures
! 102: */
! 103: static void
! 104: sn_nubus_attach(struct device *parent, struct device *self, void *aux)
! 105: {
! 106: struct sn_softc *sc = (void *)self;
! 107: struct nubus_attach_args *na = (struct nubus_attach_args *)aux;
! 108: int i, success, offset;
! 109: bus_space_tag_t bst;
! 110: bus_space_handle_t bsh, tmp_bsh;
! 111: u_int8_t myaddr[ETHER_ADDR_LEN];
! 112: char cardtype[INTERFACE_NAME_LEN]; /* type string */
! 113:
! 114: (void)(&offset); /* Work around lame gcc initialization bug */
! 115:
! 116: bst = na->na_tag;
! 117: if (bus_space_map(bst, NUBUS_SLOT2PA(na->slot), NBMEMSIZE, 0, &bsh)) {
! 118: printf(": failed to map memory space.\n");
! 119: return;
! 120: }
! 121:
! 122: sc->sc_regt = bst;
! 123:
! 124: strncpy(cardtype, nubus_get_card_name(bst, bsh, na->fmt),
! 125: INTERFACE_NAME_LEN);
! 126:
! 127: success = 0;
! 128:
! 129: sc->slotno = na->slot;
! 130:
! 131: switch (sn_nb_card_vendor(bst, bsh, na)) {
! 132: case SN_VENDOR_DAYNA:
! 133: sc->snr_dcr = DCR_ASYNC | DCR_WAIT0 |
! 134: DCR_DMABLOCK | DCR_RFT16 | DCR_TFT16;
! 135: sc->snr_dcr2 = 0;
! 136: sc->bitmode = 1; /* 32 bit card */
! 137:
! 138: if (bus_space_subregion(bst, bsh,
! 139: 0x00180000, SN_REGSIZE, &sc->sc_regh)) {
! 140: printf(": failed to map register space.\n");
! 141: break;
! 142: }
! 143:
! 144: if (bus_space_subregion(bst, bsh,
! 145: 0x00ffe004, ETHER_ADDR_LEN, &tmp_bsh)) {
! 146: printf(": failed to map ROM space.\n");
! 147: break;
! 148: }
! 149:
! 150: sn_get_enaddr(bst, tmp_bsh, 0, myaddr);
! 151:
! 152: offset = 2;
! 153: success = 1;
! 154: break;
! 155:
! 156: case SN_VENDOR_APPLE:
! 157: sc->snr_dcr = DCR_ASYNC | DCR_WAIT0 |
! 158: DCR_DMABLOCK | DCR_RFT16 | DCR_TFT16;
! 159: sc->snr_dcr2 = 0;
! 160: sc->bitmode = 1; /* 32 bit card */
! 161:
! 162: if (bus_space_subregion(bst, bsh,
! 163: 0x0, SN_REGSIZE, &sc->sc_regh)) {
! 164: printf(": failed to map register space.\n");
! 165: break;
! 166: }
! 167:
! 168: if (bus_space_subregion(bst, bsh,
! 169: 0x40000, ETHER_ADDR_LEN, &tmp_bsh)) {
! 170: printf(": failed to map ROM space.\n");
! 171: break;
! 172: }
! 173:
! 174: sn_get_enaddr(bst, tmp_bsh, 0, myaddr);
! 175:
! 176: offset = 0;
! 177: success = 1;
! 178: break;
! 179:
! 180: case SN_VENDOR_APPLE16:
! 181: sc->snr_dcr = DCR_ASYNC | DCR_WAIT0 | DCR_EXBUS |
! 182: DCR_DMABLOCK | DCR_PO1 | DCR_RFT16 | DCR_TFT16;
! 183: sc->snr_dcr2 = 0;
! 184: sc->bitmode = 0; /* 16 bit card */
! 185:
! 186: if (bus_space_subregion(bst, bsh,
! 187: 0x0, SN_REGSIZE, &sc->sc_regh)) {
! 188: printf(": failed to map register space.\n");
! 189: break;
! 190: }
! 191:
! 192: if (bus_space_subregion(bst, bsh,
! 193: 0x40000, ETHER_ADDR_LEN, &tmp_bsh)) {
! 194: printf(": failed to map ROM space.\n");
! 195: break;
! 196: }
! 197:
! 198: sn_get_enaddr(bst, tmp_bsh, 0, myaddr);
! 199:
! 200: offset = 0;
! 201: success = 1;
! 202: break;
! 203:
! 204: case SN_VENDOR_ASANTELC: /* Macintosh LC Ethernet Adapter */
! 205: sc->snr_dcr = DCR_ASYNC | DCR_WAIT0 |
! 206: DCR_DMABLOCK | DCR_PO1 | DCR_RFT16 | DCR_TFT16;
! 207: sc->snr_dcr2 = 0;
! 208: sc->bitmode = 0; /* 16 bit card */
! 209:
! 210: if (bus_space_subregion(bst, bsh,
! 211: 0x0, SN_REGSIZE, &sc->sc_regh)) {
! 212: printf(": failed to map register space.\n");
! 213: break;
! 214: }
! 215:
! 216: if (bus_space_subregion(bst, bsh,
! 217: 0x400000, ETHER_ADDR_LEN, &tmp_bsh)) {
! 218: printf(": failed to map ROM space.\n");
! 219: break;
! 220: }
! 221:
! 222: sn_get_enaddr(bst, tmp_bsh, 0, myaddr);
! 223:
! 224: offset = 0;
! 225: success = 1;
! 226: break;
! 227:
! 228: default:
! 229: /*
! 230: * You can't actually get this default, the snmatch
! 231: * will fail for unknown hardware. If you're adding support
! 232: * for a new card, the following defaults are a
! 233: * good starting point.
! 234: */
! 235: sc->snr_dcr = DCR_SYNC | DCR_WAIT0 | DCR_DW32 |
! 236: DCR_DMABLOCK | DCR_RFT16 | DCR_TFT16;
! 237: sc->snr_dcr2 = 0;
! 238: success = 0;
! 239: printf(": unknown card: attachment incomplete.\n");
! 240: }
! 241:
! 242: if (!success) {
! 243: bus_space_unmap(bst, bsh, NBMEMSIZE);
! 244: return;
! 245: }
! 246:
! 247: /* Regs are addressed as words, big endian. */
! 248: for (i = 0; i < SN_NREGS; i++) {
! 249: sc->sc_reg_map[i] = (bus_size_t)((i * 4) + offset);
! 250: }
! 251:
! 252: printf(": %s, ", cardtype);
! 253:
! 254: /* snsetup returns 1 if something fails */
! 255: if (snsetup(sc, myaddr)) {
! 256: bus_space_unmap(bst, bsh, NBMEMSIZE);
! 257: return;
! 258: }
! 259:
! 260: add_nubus_intr(sc->slotno, snintr, sc, sc->sc_dev.dv_xname);
! 261: }
! 262:
! 263: static int
! 264: sn_nb_card_vendor(bus_space_tag_t bst, bus_space_handle_t bsh,
! 265: struct nubus_attach_args *na)
! 266: {
! 267: int vendor = SN_VENDOR_UNKNOWN;
! 268:
! 269: switch (na->drsw) {
! 270: case NUBUS_DRSW_3COM:
! 271: if (na->drhw == NUBUS_DRHW_APPLE_SNT)
! 272: vendor = SN_VENDOR_APPLE;
! 273: else if (na->drhw == NUBUS_DRHW_APPLE_SN)
! 274: vendor = SN_VENDOR_APPLE16;
! 275: break;
! 276: case NUBUS_DRSW_APPLE:
! 277: if (na->drhw == NUBUS_DRHW_ASANTE_LC)
! 278: vendor = SN_VENDOR_ASANTELC;
! 279: else
! 280: vendor = SN_VENDOR_APPLE;
! 281: break;
! 282: case NUBUS_DRSW_TECHWORKS:
! 283: vendor = SN_VENDOR_APPLE;
! 284: break;
! 285: case NUBUS_DRSW_GATOR:
! 286: if (na->drhw == NUBUS_DRHW_KINETICS &&
! 287: strncmp(nubus_get_card_name(bst, bsh, na->fmt),
! 288: "EtherPort", 9) != 0)
! 289: vendor = SN_VENDOR_DAYNA;
! 290: break;
! 291: case NUBUS_DRSW_DAYNA:
! 292: vendor = SN_VENDOR_DAYNA;
! 293: break;
! 294: }
! 295:
! 296: return (vendor);
! 297: }
CVSweb