Module Name:    src
Committed By:   macallan
Date:           Thu Jan 21 17:40:09 UTC 2010

Modified Files:
        src/sys/dev/pci: if_gem_pci.c

Log Message:
get rid of architecture-specific firmware calls to determine the MAC address
on sparc(64) and macppc - use device properties instead
tested by myself on macppc and martin on sparc64


To generate a diff of this commit:
cvs rdiff -u -r1.40 -r1.41 src/sys/dev/pci/if_gem_pci.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/if_gem_pci.c
diff -u src/sys/dev/pci/if_gem_pci.c:1.40 src/sys/dev/pci/if_gem_pci.c:1.41
--- src/sys/dev/pci/if_gem_pci.c:1.40	Tue Jan 19 22:07:00 2010
+++ src/sys/dev/pci/if_gem_pci.c	Thu Jan 21 17:40:09 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_gem_pci.c,v 1.40 2010/01/19 22:07:00 pooka Exp $ */
+/*	$NetBSD: if_gem_pci.c,v 1.41 2010/01/21 17:40:09 macallan Exp $ */
 
 /*
  *
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_gem_pci.c,v 1.40 2010/01/19 22:07:00 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_gem_pci.c,v 1.41 2010/01/21 17:40:09 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -68,23 +68,7 @@
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcidevs.h>
-
-/* XXX Should use Properties when that's fleshed out. */
-#ifdef macppc
-#include <dev/ofw/openfirm.h>
-#endif /* macppc */
-#ifdef __sparc__
-#include <machine/promlib.h>
-#endif
-
-#ifndef GEM_USE_LOCAL_MAC_ADDRESS
-#if defined (macppc) || defined (__sparc__)
-#define GEM_USE_LOCAL_MAC_ADDRESS	0	/* use system-wide address */
-#else
-#define GEM_USE_LOCAL_MAC_ADDRESS	1
-#endif
-#endif
-
+#include <prop/proplib.h>
 
 struct gem_pci_softc {
 	struct	gem_softc	gsc_gem;	/* GEM device */
@@ -133,7 +117,6 @@
 	return (0);
 }
 
-#if GEM_USE_LOCAL_MAC_ADDRESS
 static inline int
 gempromvalid(u_int8_t* buf)
 {
@@ -153,7 +136,6 @@
 	    buf[6] == '-' && buf[7] == 'p' && buf[8] == 'i' &&
 	    buf[9] == 'n' && buf[10] == 's';
 }
-#endif
 
 static inline int
 isserdes(u_int8_t* buf)
@@ -169,15 +151,13 @@
 	struct gem_pci_softc *gsc = device_private(self);
 	struct gem_softc *sc = &gsc->gsc_gem;
 	char devinfo[256];
+	prop_data_t data;
 	uint8_t enaddr[ETHER_ADDR_LEN];
-#if GEM_USE_LOCAL_MAC_ADDRESS
 	u_int8_t		*enp;
 	bus_space_handle_t	romh;
 	u_int8_t		buf[0x0800];
 	int			dataoff, vpdoff, serdes;
-#if GEM_USE_LOCAL_MAC_ADDRESS || defined(GEM_DEBUG)
-	int i;
-#endif
+	int i, got_addr = 0;
 #ifdef GEM_DEBUG
 	int j;
 #endif
@@ -192,7 +172,6 @@
 	};
 #define PROMDATA_PTR_VPD	0x08
 #define PROMDATA_DATA2		0x0a
-#endif  /* GEM_USE_LOCAL_MAC_ADDRESS */
 
 	aprint_naive(": Ethernet controller\n");
 
@@ -251,141 +230,130 @@
 		return;
 	}
 
-#if GEM_USE_LOCAL_MAC_ADDRESS
-	/*
-	 * Dig out VPD (vital product data) and acquire Ethernet address.
-	 * The VPD of gem resides in the PCI PROM (PCI FCode).
-	 */
-	/*
-	 * ``Writing FCode 3.x Programs'' (newer ones, dated 1997 and later)
-	 * chapter 2 describes the data structure.
-	 */
-
-	enp = NULL;
-
-	if (sc->sc_variant == GEM_SUN_GEM &&
-	    (bus_space_subregion(sc->sc_bustag, sc->sc_h1,
-	    GEM_PCI_ROM_OFFSET, GEM_PCI_ROM_SIZE, &romh)) == 0) {
-
-		/* read PCI Expansion PROM Header */
-		bus_space_read_region_1(sc->sc_bustag,
-		    romh, 0, buf, sizeof buf);
-
-		/* Check for "shared-pins = serdes" in FCode. */
-		i = 0;
-		serdes = 0;
-		while (i < (sizeof buf) - sizeof "serdes") {
-			if (!serdes) {
-				if (isserdes(&buf[i]))
-					serdes = 1;
-			} else {
-				if (isshared_pins(&buf[i]))
-					serdes = 2;
-			}
-			if (serdes == 2) {
+	if ((data = prop_dictionary_get(device_properties(sc->sc_dev),
+	    "mac-address")) != NULL) {
+		memcpy(enaddr, prop_data_data_nocopy(data), ETHER_ADDR_LEN);
+		got_addr = 1;
+		if ((data = prop_dictionary_get(device_properties(sc->sc_dev),
+	    	    "shared-pins")) != NULL) {
+			memcpy(buf, prop_data_data_nocopy(data),
+			    prop_data_size(data));
+			if (isserdes(buf)) {
 				sc->sc_flags |= GEM_SERDES;
-				break;
 			}
-			i++;
 		}
-#ifdef GEM_DEBUG
-		/* PROM dump */
-		printf("%s: PROM dump (0x0000 to %04lx)\n", device_xname(sc->sc_dev),
-		    (sizeof buf) - 1);
-		i = 0;
-		j = 0;
-		printf("  %04x  ", i);
-		while (i < sizeof buf) {
-			printf("%02x ", buf[i]);
-			if (i && !(i % 8))
-				printf(" ");
-			if (i && !(i % 16)) {
-				printf(" ");
-				while (j < i) {
-					if (buf[j] > 31 && buf[j] < 128)
-						printf("%c", buf[j]);
-					else
-						printf(".");
-					j++;
+	} else {
+		/*
+		 * Dig out VPD (vital product data) and acquire Ethernet address.
+		 * The VPD of gem resides in the PCI PROM (PCI FCode).
+		 */
+		/*
+		 * ``Writing FCode 3.x Programs'' (newer ones, dated 1997 and later)
+		 * chapter 2 describes the data structure.
+		 */
+
+		enp = NULL;
+
+		if (sc->sc_variant == GEM_SUN_GEM &&
+		    (bus_space_subregion(sc->sc_bustag, sc->sc_h1,
+		    GEM_PCI_ROM_OFFSET, GEM_PCI_ROM_SIZE, &romh)) == 0) {
+
+			/* read PCI Expansion PROM Header */
+			bus_space_read_region_1(sc->sc_bustag,
+			    romh, 0, buf, sizeof buf);
+
+			/* Check for "shared-pins = serdes" in FCode. */
+			i = 0;
+			serdes = 0;
+			while (i < (sizeof buf) - sizeof "serdes") {
+				if (!serdes) {
+					if (isserdes(&buf[i]))
+						serdes = 1;
+				} else {
+					if (isshared_pins(&buf[i]))
+						serdes = 2;
 				}
-				j = i;
-				printf("\n  %04x  ", i);
+				if (serdes == 2) {
+					sc->sc_flags |= GEM_SERDES;
+					break;
 				}
-			i++;
-		}
-		printf("\n");
+				i++;
+			}
+#ifdef GEM_DEBUG
+			/* PROM dump */
+			printf("%s: PROM dump (0x0000 to %04lx)\n", device_xname(sc->sc_dev),
+			    (sizeof buf) - 1);
+			i = 0;
+			j = 0;
+			printf("  %04x  ", i);
+			while (i < sizeof buf) {
+				printf("%02x ", buf[i]);
+				if (i && !(i % 8))
+					printf(" ");
+				if (i && !(i % 16)) {
+					printf(" ");
+					while (j < i) {
+						if (buf[j] > 31 && buf[j] < 128)
+							printf("%c", buf[j]);
+						else
+							printf(".");
+						j++;
+					}
+					j = i;
+					printf("\n  %04x  ", i);
+				}
+				i++;
+			}
+			printf("\n");
 #endif
 
-		if (memcmp(buf, promhdr, sizeof promhdr) == 0 &&
-		    (dataoff = (buf[PROMHDR_PTR_DATA] |
-			(buf[PROMHDR_PTR_DATA + 1] << 8))) >= 0x1c) {
-
-			/* read PCI Expansion PROM Data */
-			bus_space_read_region_1(sc->sc_bustag, romh, dataoff,
-			    buf, 64);
-			if (memcmp(buf, promdat, sizeof promdat) == 0 &&
-			    gempromvalid(buf + PROMDATA_DATA2) &&
-			    (vpdoff = (buf[PROMDATA_PTR_VPD] |
-				(buf[PROMDATA_PTR_VPD + 1] << 8))) >= 0x1c) {
+			if (memcmp(buf, promhdr, sizeof promhdr) == 0 &&
+			    (dataoff = (buf[PROMHDR_PTR_DATA] |
+				(buf[PROMHDR_PTR_DATA + 1] << 8))) >= 0x1c) {
+
+				/* read PCI Expansion PROM Data */
+				bus_space_read_region_1(sc->sc_bustag, romh, dataoff,
+				    buf, 64);
+				if (memcmp(buf, promdat, sizeof promdat) == 0 &&
+				    gempromvalid(buf + PROMDATA_DATA2) &&
+				    (vpdoff = (buf[PROMDATA_PTR_VPD] |
+					(buf[PROMDATA_PTR_VPD + 1] << 8))) >= 0x1c) {
 	
-				/*
-				 * The VPD of gem is not in PCI 2.2 standard
-				 * format.  The length in the resource header
-				 * is in big endian, and resources are not
-				 * properly terminated (only one resource
-				 * and no end tag).
-				 */
-				/* read PCI VPD */
-				bus_space_read_region_1(sc->sc_bustag, romh,
-				    vpdoff, buf, 64);
-				vpd = (void *)(buf + 3);
-				if (PCI_VPDRES_ISLARGE(buf[0]) &&
-				    PCI_VPDRES_LARGE_NAME(buf[0])
-					== PCI_VPDRES_TYPE_VPD &&
-				    vpd->vpd_key0 == 0x4e /* N */ &&
-				    vpd->vpd_key1 == 0x41 /* A */ &&
-				    vpd->vpd_len == ETHER_ADDR_LEN) {
 					/*
-					 * Ethernet address found
+					 * The VPD of gem is not in PCI 2.2 standard
+					 * format.  The length in the resource header
+					 * is in big endian, and resources are not
+					 * properly terminated (only one resource
+					 * and no end tag).
 					 */
-					enp = buf + 6;
+					/* read PCI VPD */
+					bus_space_read_region_1(sc->sc_bustag, romh,
+					    vpdoff, buf, 64);
+					vpd = (void *)(buf + 3);
+					if (PCI_VPDRES_ISLARGE(buf[0]) &&
+					    PCI_VPDRES_LARGE_NAME(buf[0])
+						== PCI_VPDRES_TYPE_VPD &&
+					    vpd->vpd_key0 == 0x4e /* N */ &&
+					    vpd->vpd_key1 == 0x41 /* A */ &&
+					    vpd->vpd_len == ETHER_ADDR_LEN) {
+						/*
+						 * Ethernet address found
+						 */
+						enp = buf + 6;
+					}
 				}
 			}
 		}
-	}
 
-	if (enp)
-		memcpy(enaddr, enp, ETHER_ADDR_LEN);
-	else
-#endif  /* GEM_USE_LOCAL_MAC_ADDRESS */
-#ifdef __sparc__
-	{
-		if (strcmp(prom_getpropstring(PCITAG_NODE(pa->pa_tag),
-		    "shared-pins"), "serdes") == 0)
-			sc->sc_flags |= GEM_SERDES;
-		prom_getether(PCITAG_NODE(pa->pa_tag), enaddr);
-	}
-#else
-#ifdef macppc
-	{
-		int node;
-		char sp[6];	/* "serdes" */
-
-		node = pcidev_to_ofdev(pa->pa_pc, pa->pa_tag);
-		if (node == 0) {
-			aprint_error_dev(sc->sc_dev, "unable to locate OpenFirmware node\n");
-			return;
+		if (enp) {
+			memcpy(enaddr, enp, ETHER_ADDR_LEN);
+			got_addr = 1;
 		}
-
-		OF_getprop(node, "shared-pins", sp, sizeof(sp));
-		if (isserdes(sp))
-			sc->sc_flags |= GEM_SERDES;
-		OF_getprop(node, "local-mac-address", enaddr, sizeof(enaddr));
 	}
-#else
+	if (!got_addr) {
 		printf("%s: no Ethernet address found\n", device_xname(sc->sc_dev));
-#endif /* macppc */
-#endif /* __sparc__ */
+		/* should we bail here? */
+	}
 
 	if (pci_intr_map(pa, &gsc->gsc_handle) != 0) {
 		aprint_error_dev(sc->sc_dev, "unable to map interrupt\n");

Reply via email to