summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhosokawa <hosokawa@FreeBSD.org>2000-01-21 03:08:46 +0000
committerhosokawa <hosokawa@FreeBSD.org>2000-01-21 03:08:46 +0000
commit7ce7351da146d0eddcacf9714003c07a4369b00c (patch)
treee41abc40a42cdb05a522a6aeb9a55bf82c6c9101
parentc6da76a1a6b1b60435d8df410d11a7a497db504a (diff)
downloadFreeBSD-src-7ce7351da146d0eddcacf9714003c07a4369b00c.zip
FreeBSD-src-7ce7351da146d0eddcacf9714003c07a4369b00c.tar.gz
Propagate MAC address in CIS tupple to dev/ed/ driver.
Many ed-based Ethernet PC-cards can't get correct MAC address without this patch. Submitted by: Takanori Watanabe <takawata@shidahara1.planet.sci.kobe-u.ac.jp> Reviewed by: Warner Losh <imp@village.org>
-rw-r--r--sys/dev/ed/if_ed_pccard.c10
-rw-r--r--sys/dev/pccard/pccardvar.h13
-rw-r--r--sys/pccard/pccard_nbk.c17
3 files changed, 40 insertions, 0 deletions
diff --git a/sys/dev/ed/if_ed_pccard.c b/sys/dev/ed/if_ed_pccard.c
index a8c819a..af8cd9a 100644
--- a/sys/dev/ed/if_ed_pccard.c
+++ b/sys/dev/ed/if_ed_pccard.c
@@ -42,6 +42,7 @@
#include <net/if_mib.h>
#include <dev/ed/if_edvar.h>
+#include <dev/pccard/pccardvar.h>
/*
* PC-Card (PCMCIA) specific code.
@@ -132,6 +133,9 @@ ed_pccard_attach(device_t dev)
struct ed_softc *sc = device_get_softc(dev);
int flags = device_get_flags(dev);
int error;
+ int i;
+ u_char sum;
+ u_char ether_addr[ETHER_ADDR_LEN];
if (sc->port_used > 0)
ed_alloc_port(dev, sc->port_rid, sc->port_used);
@@ -147,6 +151,12 @@ ed_pccard_attach(device_t dev)
return (error);
}
+ pccard_get_ether(dev, ether_addr);
+ for (i = 0, sum = 0; i < ETHER_ADDR_LEN; i++)
+ sum |= ether_addr[i];
+ if (sum)
+ bcopy(ether_addr, sc->arpcom.ac_enaddr, ETHER_ADDR_LEN);
+
error = ed_attach(sc, device_get_unit(dev), flags);
return (error);
}
diff --git a/sys/dev/pccard/pccardvar.h b/sys/dev/pccard/pccardvar.h
index 3504f68..ed26e3f 100644
--- a/sys/dev/pccard/pccardvar.h
+++ b/sys/dev/pccard/pccardvar.h
@@ -269,3 +269,16 @@ void pccard_io_unmap(struct pccard_function *, int);
#define pccard_mem_unmap(pf, window) \
(pccard_chip_mem_unmap((pf)->sc->pct, (pf)->sc->pch, (window)))
+
+/* ivar interface */
+enum {
+ PCCARD_IVAR_ETHADDR, /* read ethernet address from CIS tupple */
+};
+
+/* read ethernet address from CIS tupple */
+__inline static int
+pccard_get_ether(device_t dev, u_char *enaddr)
+{
+ return BUS_READ_IVAR(device_get_parent(dev), dev,
+ PCCARD_IVAR_ETHADDR, (uintptr_t *)enaddr);
+}
diff --git a/sys/pccard/pccard_nbk.c b/sys/pccard/pccard_nbk.c
index ec374de..28da49f 100644
--- a/sys/pccard/pccard_nbk.c
+++ b/sys/pccard/pccard_nbk.c
@@ -70,6 +70,9 @@
#include <pccard/slot.h>
#include <pccard/pccard_nbk.h>
+#include <dev/pccard/pccardvar.h>
+#include <net/ethernet.h>
+
devclass_t pccard_devclass;
#define PCCARD_NPORT 2
@@ -252,6 +255,19 @@ pccard_release_resource(device_t bus, device_t child, int type, int rid,
return resource_list_release(rl, bus, child, type, rid, r);
}
+static int
+pccard_read_ivar(device_t bus, device_t child, int which, u_char *result)
+{
+ struct pccard_devinfo *devi = PCCARD_DEVINFO(child);
+
+ switch (which) {
+ case PCCARD_IVAR_ETHADDR:
+ bcopy(devi->misc, result, ETHER_ADDR_LEN);
+ return 0;
+ }
+ return ENOENT;
+}
+
static device_method_t pccard_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, pccard_probe),
@@ -272,6 +288,7 @@ static device_method_t pccard_methods[] = {
DEVMETHOD(bus_set_resource, pccard_set_resource),
DEVMETHOD(bus_get_resource, pccard_get_resource),
DEVMETHOD(bus_delete_resource, pccard_delete_resource),
+ DEVMETHOD(bus_read_ivar, pccard_read_ivar),
{ 0, 0 }
};
OpenPOWER on IntegriCloud