1 1.47 garbled /* $NetBSD: if_sn.c,v 1.47 2007/10/17 19:55:13 garbled Exp $ */ 2 1.1 briggs 3 1.1 briggs /* 4 1.15 scottr * National Semiconductor DP8393X SONIC Driver 5 1.1 briggs * Copyright (c) 1991 Algorithmics Ltd (http://www.algor.co.uk) 6 1.1 briggs * You may use, copy, and modify this program so long as you retain the 7 1.1 briggs * copyright line. 8 1.1 briggs * 9 1.1 briggs * This driver has been substantially modified since Algorithmics donated 10 1.1 briggs * it. 11 1.3 briggs * 12 1.5 briggs * Denton Gentry <denny1 (at) home.com> 13 1.3 briggs * and also 14 1.6 briggs * Yanagisawa Takeshi <yanagisw (at) aa.ap.titech.ac.jp> 15 1.3 briggs * did the work to get this running on the Macintosh. 16 1.1 briggs */ 17 1.34 lukem 18 1.34 lukem #include <sys/cdefs.h> 19 1.47 garbled __KERNEL_RCSID(0, "$NetBSD: if_sn.c,v 1.47 2007/10/17 19:55:13 garbled Exp $"); 20 1.1 briggs 21 1.1 briggs #include <sys/param.h> 22 1.1 briggs #include <sys/systm.h> 23 1.33 thorpej 24 1.1 briggs #include <net/if.h> 25 1.2 is #include <net/if_ether.h> 26 1.1 briggs 27 1.46 tsutsui #include <machine/bus.h> 28 1.1 briggs 29 1.1 briggs #include <mac68k/dev/if_snvar.h> 30 1.1 briggs 31 1.46 tsutsui static const uint8_t bbr4[] = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15}; 32 1.46 tsutsui #define bbr(v) ((bbr4[(v) & 0xf] << 4) | bbr4[((v) >> 4) & 0xf]) 33 1.10 briggs 34 1.10 briggs void 35 1.36 chs sn_get_enaddr(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, 36 1.46 tsutsui uint8_t *dst) 37 1.10 briggs { 38 1.36 chs int i, do_bbr; 39 1.46 tsutsui uint8_t b; 40 1.10 briggs 41 1.10 briggs /* 42 1.10 briggs * For reasons known only to Apple, MAC addresses in the ethernet 43 1.10 briggs * PROM are stored in Token Ring (IEEE 802.5) format, that is 44 1.10 briggs * with all of the bits in each byte reversed (canonical bit format). 45 1.10 briggs * When the address is read out it must be reversed to ethernet format 46 1.10 briggs * before use. 47 1.10 briggs * 48 1.10 briggs * Apple has been assigned OUI's 08:00:07 and 00:a0:40. All onboard 49 1.10 briggs * ethernet addresses on 68K machines should be in one of these 50 1.10 briggs * two ranges. 51 1.10 briggs * 52 1.10 briggs * Here is where it gets complicated. 53 1.10 briggs * 54 1.10 briggs * The PMac 7200, 7500, 8500, and 9500 accidentally had the PROM 55 1.10 briggs * written in standard ethernet format. The MacOS accounted for this 56 1.10 briggs * in these systems, and did not reverse the bytes. Some other 57 1.10 briggs * networking utilities were not so forgiving, and got confused. 58 1.10 briggs * "Some" of Apple's Nubus ethernet cards also had their bits 59 1.10 briggs * burned in ethernet format. 60 1.10 briggs * 61 1.10 briggs * Apple petitioned the IEEE and was granted the 00:05:02 (bit reversal 62 1.10 briggs * of 00:a0:40) as well. As of OpenTransport 1.1.1, Apple removed 63 1.10 briggs * their workaround and now reverses the bits regardless of 64 1.10 briggs * what kind of machine it is. So PMac systems and the affected 65 1.10 briggs * Nubus cards now use 00:05:02, instead of the 00:a0:40 for which they 66 1.10 briggs * were intended. 67 1.10 briggs * 68 1.10 briggs * See Apple Techinfo article TECHINFO-0020552, "OpenTransport 1.1.1 69 1.10 briggs * and MacOS System 7.5.3 FAQ (10/96)" for more details. 70 1.10 briggs */ 71 1.10 briggs do_bbr = 0; 72 1.10 briggs b = bus_space_read_1(t, h, o); 73 1.10 briggs if (b == 0x10) 74 1.10 briggs do_bbr = 1; 75 1.10 briggs dst[0] = (do_bbr) ? bbr(b) : b; 76 1.10 briggs 77 1.10 briggs for (i = 1 ; i < ETHER_ADDR_LEN ; i++) { 78 1.46 tsutsui b = bus_space_read_1(t, h, o + i); 79 1.10 briggs dst[i] = (do_bbr) ? bbr(b) : b; 80 1.10 briggs } 81 1.1 briggs } 82