aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/sk
diff options
context:
space:
mode:
authorBill Paul <wpaul@FreeBSD.org>1999-09-18 04:01:31 +0000
committerBill Paul <wpaul@FreeBSD.org>1999-09-18 04:01:31 +0000
commit2c0431ecf6c1a19a44752f239ebc899e3068633a (patch)
treecd985a059d7f3186598cd8e926f8f02872cb0563 /sys/dev/sk
parent22f0eae8c855c4b7650382ad7883b96ae32ad0b7 (diff)
downloadsrc-2c0431ecf6c1a19a44752f239ebc899e3068633a.tar.gz
src-2c0431ecf6c1a19a44752f239ebc899e3068633a.zip
Fix the mechanism used to choose the unit numbers for the IP interfaces
attached by the SysKonnect driver. Use ifunit() to scan for existing skN interfaces and pick the first unused one.
Notes
Notes: svn path=/head/; revision=51359
Diffstat (limited to 'sys/dev/sk')
-rw-r--r--sys/dev/sk/if_sk.c27
-rw-r--r--sys/dev/sk/if_skreg.h1
2 files changed, 21 insertions, 7 deletions
diff --git a/sys/dev/sk/if_sk.c b/sys/dev/sk/if_sk.c
index 7fa3d1c4b7cf..d80e4abb22ca 100644
--- a/sys/dev/sk/if_sk.c
+++ b/sys/dev/sk/if_sk.c
@@ -110,7 +110,6 @@ static struct sk_type sk_devs[] = {
{ 0, 0, NULL }
};
-static unsigned long sk_count = 0;
static int sk_probe __P((device_t));
static int sk_attach __P((device_t));
static int sk_detach __P((device_t));
@@ -182,7 +181,7 @@ static driver_t sk_driver = {
static devclass_t sk_devclass;
-DRIVER_MODULE(sk, pci, sk_driver, sk_devclass, 0, 0);
+DRIVER_MODULE(skc, pci, sk_driver, sk_devclass, 0, 0);
#define SK_SETBIT(sc, reg, x) \
CSR_WRITE_4(sc, reg, CSR_READ_4(sc, reg) | x)
@@ -1010,6 +1009,7 @@ static int sk_attach_xmac(sc, port)
struct sk_if_softc *sc_if;
struct ifnet *ifp;
int i;
+ char ifname[64];
if (sc == NULL)
return(EINVAL);
@@ -1019,14 +1019,25 @@ static int sk_attach_xmac(sc, port)
sc_if = malloc(sizeof(struct sk_if_softc), M_DEVBUF, M_NOWAIT);
if (sc_if == NULL) {
- printf("sk%d: no memory for interface softc!\n", sc->sk_unit);
+ printf("skc%d: no memory for interface softc!\n", sc->sk_unit);
return(ENOMEM);
}
bzero((char *)sc_if, sizeof(struct sk_if_softc));
- sc_if->sk_unit = sk_count;
+ for (i = 0; i < SK_MAXUNIT; i++) {
+ sprintf(ifname, "sk%d", i);
+ if (ifunit(ifname) == NULL)
+ break;
+ }
+
+ if (i == SK_MAXUNIT) {
+ printf("skc%d: too many sk units\n", sc->sk_unit);
+ free(sc_if, M_DEVBUF);
+ return(ENODEV);
+ }
+
+ sc_if->sk_unit = i;
sc_if->sk_port = port;
- sk_count++;
sc_if->sk_softc = sc;
sc->sk_if[port] = sc_if;
if (port == SK_PORT_A)
@@ -1340,15 +1351,17 @@ static int sk_detach(dev)
ifp0 = &sc_if0->arpcom.ac_if;
sk_stop(sc_if0);
if_detach(ifp0);
- free(sc_if0->sk_cdata.sk_jumbo_buf, M_DEVBUF);
+ contigfree(sc_if0->sk_cdata.sk_jumbo_buf, SK_JMEM, M_DEVBUF);
ifmedia_removeall(&sc_if0->ifmedia);
+ free(sc->sk_if[SK_PORT_A], M_DEVBUF);
if (sc->sk_if[SK_PORT_B] != NULL) {
sc_if1 = sc->sk_if[SK_PORT_B];
ifp1 = &sc_if1->arpcom.ac_if;
sk_stop(sc_if1);
if_detach(ifp1);
- free(sc_if1->sk_cdata.sk_jumbo_buf, M_DEVBUF);
+ contigfree(sc_if1->sk_cdata.sk_jumbo_buf, SK_JMEM, M_DEVBUF);
ifmedia_removeall(&sc_if1->ifmedia);
+ free(sc->sk_if[SK_PORT_B], M_DEVBUF);
}
bus_teardown_intr(dev, sc->sk_irq, sc->sk_intrhand);
diff --git a/sys/dev/sk/if_skreg.h b/sys/dev/sk/if_skreg.h
index b0eaa90fce6c..f30763665bf5 100644
--- a/sys/dev/sk/if_skreg.h
+++ b/sys/dev/sk/if_skreg.h
@@ -1162,6 +1162,7 @@ struct sk_if_softc {
SLIST_HEAD(__sk_jinusehead, sk_jpool_entry) sk_jinuse_listhead;
};
+#define SK_MAXUNIT 256
#define SK_TIMEOUT 1000
#define ETHER_ALIGN 2