summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormux <mux@FreeBSD.org>2004-01-08 19:08:27 +0000
committermux <mux@FreeBSD.org>2004-01-08 19:08:27 +0000
commit4dc1839cca3b1b5992930e9b0f9e04394a878746 (patch)
treea85643cbec9af6f912ef1fc9f1fce29df415ea1e
parent491421126ec7822911bd729e856e18a32253d876 (diff)
downloadFreeBSD-src-4dc1839cca3b1b5992930e9b0f9e04394a878746.zip
FreeBSD-src-4dc1839cca3b1b5992930e9b0f9e04394a878746.tar.gz
Some integrated Davicom cards in sparc64 boxes have an all zeros
MAC address in the EEPROM, and we need to get it from OpenFirmware. This isn't very pretty but time is lacking to do this in a better way this near 5.2-RELEASE. This is a RELENG_5_2 candidate. Original version by: Marius Strobl <marius@alchemy.franken.de> Tested by: Pete Bentley <pete@sorted.org> Reviewed by: jake
-rw-r--r--sys/dev/dc/if_dc.c18
-rw-r--r--sys/pci/if_dc.c18
-rw-r--r--sys/sparc64/include/ofw_machdep.h1
-rw-r--r--sys/sparc64/sparc64/ofw_machdep.c17
4 files changed, 54 insertions, 0 deletions
diff --git a/sys/dev/dc/if_dc.c b/sys/dev/dc/if_dc.c
index 6068194..ac095cd 100644
--- a/sys/dev/dc/if_dc.c
+++ b/sys/dev/dc/if_dc.c
@@ -131,6 +131,11 @@ __FBSDID("$FreeBSD$");
#include <pci/if_dcreg.h>
+#ifdef __sparc64__
+#include <dev/ofw/openfirm.h>
+#include <machine/ofw_machdep.h>
+#endif
+
MODULE_DEPEND(dc, pci, 1, 1, 1);
MODULE_DEPEND(dc, ether, 1, 1, 1);
MODULE_DEPEND(dc, miibus, 1, 1, 1);
@@ -2106,6 +2111,19 @@ dc_attach(device_t dev)
dc_read_eeprom(sc, (caddr_t)&eaddr, 0, 3, 1);
break;
case DC_TYPE_DM9102:
+ dc_read_eeprom(sc, (caddr_t)&eaddr, DC_EE_NODEADDR, 3, 0);
+#ifdef __sparc64__
+ /*
+ * If this is an onboard dc(4) the station address read from
+ * the EEPROM is all zero and we have to get it from the fcode.
+ */
+ for (i = 0; i < ETHER_ADDR_LEN; i++)
+ if (eaddr[i] != 0x00)
+ break;
+ if (i >= ETHER_ADDR_LEN && OF_getetheraddr2(dev, eaddr) == -1)
+ OF_getetheraddr(dev, eaddr);
+#endif
+ break;
case DC_TYPE_21143:
case DC_TYPE_ASIX:
dc_read_eeprom(sc, (caddr_t)&eaddr, DC_EE_NODEADDR, 3, 0);
diff --git a/sys/pci/if_dc.c b/sys/pci/if_dc.c
index 6068194..ac095cd 100644
--- a/sys/pci/if_dc.c
+++ b/sys/pci/if_dc.c
@@ -131,6 +131,11 @@ __FBSDID("$FreeBSD$");
#include <pci/if_dcreg.h>
+#ifdef __sparc64__
+#include <dev/ofw/openfirm.h>
+#include <machine/ofw_machdep.h>
+#endif
+
MODULE_DEPEND(dc, pci, 1, 1, 1);
MODULE_DEPEND(dc, ether, 1, 1, 1);
MODULE_DEPEND(dc, miibus, 1, 1, 1);
@@ -2106,6 +2111,19 @@ dc_attach(device_t dev)
dc_read_eeprom(sc, (caddr_t)&eaddr, 0, 3, 1);
break;
case DC_TYPE_DM9102:
+ dc_read_eeprom(sc, (caddr_t)&eaddr, DC_EE_NODEADDR, 3, 0);
+#ifdef __sparc64__
+ /*
+ * If this is an onboard dc(4) the station address read from
+ * the EEPROM is all zero and we have to get it from the fcode.
+ */
+ for (i = 0; i < ETHER_ADDR_LEN; i++)
+ if (eaddr[i] != 0x00)
+ break;
+ if (i >= ETHER_ADDR_LEN && OF_getetheraddr2(dev, eaddr) == -1)
+ OF_getetheraddr(dev, eaddr);
+#endif
+ break;
case DC_TYPE_21143:
case DC_TYPE_ASIX:
dc_read_eeprom(sc, (caddr_t)&eaddr, DC_EE_NODEADDR, 3, 0);
diff --git a/sys/sparc64/include/ofw_machdep.h b/sys/sparc64/include/ofw_machdep.h
index f7062f7..c40a7bc 100644
--- a/sys/sparc64/include/ofw_machdep.h
+++ b/sys/sparc64/include/ofw_machdep.h
@@ -32,6 +32,7 @@
int OF_decode_addr(phandle_t, int *, bus_addr_t *);
void OF_getetheraddr(device_t, u_char *);
+int OF_getetheraddr2(device_t, u_char *);
void cpu_shutdown(void *);
void openfirmware_exit(void *);
diff --git a/sys/sparc64/sparc64/ofw_machdep.c b/sys/sparc64/sparc64/ofw_machdep.c
index b50b4df..c565a45 100644
--- a/sys/sparc64/sparc64/ofw_machdep.c
+++ b/sys/sparc64/sparc64/ofw_machdep.c
@@ -29,6 +29,8 @@
* Some OpenFirmware helper functions that are likely machine dependent.
*/
+#include "opt_ofw_pci.h"
+
#include <sys/param.h>
#include <sys/systm.h>
@@ -59,6 +61,21 @@ OF_getetheraddr(device_t dev, u_char *addr)
}
int
+OF_getetheraddr2(device_t dev, u_char *addr)
+{
+ phandle_t node;
+
+#ifdef OFW_NEWPCI
+ node = ofw_pci_get_node(dev);
+#else
+ node = ofw_pci_node(dev);
+#endif
+ if (node <= 0)
+ return (-1);
+ return (OF_getprop(node, "local-mac-address", addr, ETHER_ADDR_LEN));
+}
+
+int
OF_decode_addr(phandle_t node, int *space, bus_addr_t *addr)
{
char name[32];
OpenPOWER on IntegriCloud