Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/pci get rid of architecture-specific firmware calls ...
details: https://anonhg.NetBSD.org/src/rev/63fca03cf07d
branches: trunk
changeset: 751014:63fca03cf07d
user: macallan <macallan%NetBSD.org@localhost>
date: Thu Jan 21 17:40:09 2010 +0000
description:
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
diffstat:
sys/dev/pci/if_gem_pci.c | 258 ++++++++++++++++++++--------------------------
1 files changed, 113 insertions(+), 145 deletions(-)
diffs (truncated from 335 to 300 lines):
diff -r 8a163e526bf7 -r 63fca03cf07d sys/dev/pci/if_gem_pci.c
--- a/sys/dev/pci/if_gem_pci.c Thu Jan 21 16:14:39 2010 +0000
+++ b/sys/dev/pci/if_gem_pci.c Thu Jan 21 17:40:09 2010 +0000
@@ -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 ((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;
}
- if (serdes == 2) {
- sc->sc_flags |= GEM_SERDES;
- break;
+ }
+ } 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;
+ }
+ if (serdes == 2) {
+ sc->sc_flags |= GEM_SERDES;
+ break;
+ }
+ i++;
}
- 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++;
+ /* 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);
}
- j = i;
- printf("\n %04x ", i);
- }
- i++;
- }
- printf("\n");
+ i++;
+ }
+ printf("\n");
#endif
- if (memcmp(buf, promhdr, sizeof promhdr) == 0 &&
- (dataoff = (buf[PROMHDR_PTR_DATA] |
- (buf[PROMHDR_PTR_DATA + 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) {
+ /* 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),
Home |
Main Index |
Thread Index |
Old Index