aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/if_ndis
diff options
context:
space:
mode:
authorAndriy Voskoboinyk <avos@FreeBSD.org>2019-02-06 02:06:00 +0000
committerAndriy Voskoboinyk <avos@FreeBSD.org>2019-02-06 02:06:00 +0000
commit99bfc69855ccfaf9bb7c0fbb79f540e22e182205 (patch)
tree81c430955f25b684f6ffc4ad16e919322d24a2ac /sys/dev/if_ndis
parentd964b1c92f30088be0563cd629d3088e48ede6b7 (diff)
downloadsrc-99bfc69855ccfaf9bb7c0fbb79f540e22e182205.tar.gz
src-99bfc69855ccfaf9bb7c0fbb79f540e22e182205.zip
MFC r343574:
Fix compilation with 'option NDISAPI + device ndis' and without 'device pccard' in the kernel config file. PR: 171532 Reported by: Robert Bonomi <bonomi@host128.r-bonomi.com>
Notes
Notes: svn path=/stable/12/; revision=343819
Diffstat (limited to 'sys/dev/if_ndis')
-rw-r--r--sys/dev/if_ndis/if_ndis.c12
-rw-r--r--sys/dev/if_ndis/if_ndis_pccard.c137
2 files changed, 67 insertions, 82 deletions
diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c
index 7a545dbc8f8f..404ae4d92d53 100644
--- a/sys/dev/if_ndis/if_ndis.c
+++ b/sys/dev/if_ndis/if_ndis.c
@@ -568,15 +568,6 @@ ndis_attach(device_t dev)
callout_init(&sc->ndis_stat_callout, 1);
mbufq_init(&sc->ndis_rxqueue, INT_MAX); /* XXXGL: sane maximum */
- if (sc->ndis_iftype == PCMCIABus) {
- error = ndis_alloc_amem(sc);
- if (error) {
- device_printf(dev, "failed to allocate "
- "attribute memory\n");
- goto fail;
- }
- }
-
/* Create sysctl registry nodes */
ndis_create_sysctls(sc);
@@ -1098,9 +1089,6 @@ ndis_detach(device_t dev)
if (ifp != NULL)
if_free(ifp);
- if (sc->ndis_iftype == PCMCIABus)
- ndis_free_amem(sc);
-
if (sc->ndis_sc)
ndis_destroy_dma(sc);
diff --git a/sys/dev/if_ndis/if_ndis_pccard.c b/sys/dev/if_ndis/if_ndis_pccard.c
index 36d52986691d..ee4e174ae3ef 100644
--- a/sys/dev/if_ndis/if_ndis_pccard.c
+++ b/sys/dev/if_ndis/if_ndis_pccard.c
@@ -74,6 +74,7 @@ MODULE_DEPEND(ndis, pccard, 1, 1, 1);
static int ndis_probe_pccard (device_t);
static int ndis_attach_pccard (device_t);
+static int ndis_detach_pccard (device_t);
static struct resource_list *ndis_get_resource_list
(device_t, device_t);
static int ndis_devcompare (interface_type,
@@ -91,7 +92,7 @@ static device_method_t ndis_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, ndis_probe_pccard),
DEVMETHOD(device_attach, ndis_attach_pccard),
- DEVMETHOD(device_detach, ndis_detach),
+ DEVMETHOD(device_detach, ndis_detach_pccard),
DEVMETHOD(device_shutdown, ndis_shutdown),
DEVMETHOD(device_suspend, ndis_suspend),
DEVMETHOD(device_resume, ndis_resume),
@@ -175,6 +176,50 @@ ndis_probe_pccard(dev)
return(ENXIO);
}
+#define NDIS_AM_RID 3
+
+static int
+ndis_alloc_amem(struct ndis_softc *sc)
+{
+ int error, rid;
+
+ rid = NDIS_AM_RID;
+ sc->ndis_res_am = bus_alloc_resource_anywhere(sc->ndis_dev,
+ SYS_RES_MEMORY, &rid, 0x1000, RF_ACTIVE);
+
+ if (sc->ndis_res_am == NULL) {
+ device_printf(sc->ndis_dev,
+ "failed to allocate attribute memory\n");
+ return(ENXIO);
+ }
+ sc->ndis_rescnt++;
+ resource_list_add(&sc->ndis_rl, SYS_RES_MEMORY, rid,
+ rman_get_start(sc->ndis_res_am), rman_get_end(sc->ndis_res_am),
+ rman_get_size(sc->ndis_res_am));
+
+ error = CARD_SET_MEMORY_OFFSET(device_get_parent(sc->ndis_dev),
+ sc->ndis_dev, rid, 0, NULL);
+
+ if (error) {
+ device_printf(sc->ndis_dev,
+ "CARD_SET_MEMORY_OFFSET() returned 0x%x\n", error);
+ return(error);
+ }
+
+ error = CARD_SET_RES_FLAGS(device_get_parent(sc->ndis_dev),
+ sc->ndis_dev, SYS_RES_MEMORY, rid, PCCARD_A_MEM_ATTR);
+
+ if (error) {
+ device_printf(sc->ndis_dev,
+ "CARD_SET_RES_FLAGS() returned 0x%x\n", error);
+ return(error);
+ }
+
+ sc->ndis_am_rid = rid;
+
+ return(0);
+}
+
/*
* Attach the interface. Allocate softc structures, do ifmedia
* setup and ethernet/BPF attach.
@@ -251,88 +296,40 @@ ndis_attach_pccard(dev)
sc->ndis_devidx = devidx;
+ error = ndis_alloc_amem(sc);
+ if (error) {
+ device_printf(dev, "failed to allocate attribute memory\n");
+ goto fail;
+ }
+
error = ndis_attach(dev);
fail:
return(error);
}
-static struct resource_list *
-ndis_get_resource_list(dev, child)
- device_t dev;
- device_t child;
-{
- struct ndis_softc *sc;
-
- sc = device_get_softc(dev);
- return (&sc->ndis_rl);
-}
-
-#define NDIS_AM_RID 3
-
-int
-ndis_alloc_amem(arg)
- void *arg;
+static int
+ndis_detach_pccard(device_t dev)
{
- struct ndis_softc *sc;
- int error, rid;
-
- if (arg == NULL)
- return(EINVAL);
-
- sc = arg;
- rid = NDIS_AM_RID;
- sc->ndis_res_am = bus_alloc_resource_anywhere(sc->ndis_dev,
- SYS_RES_MEMORY, &rid, 0x1000, RF_ACTIVE);
-
- if (sc->ndis_res_am == NULL) {
- device_printf(sc->ndis_dev,
- "failed to allocate attribute memory\n");
- return(ENXIO);
- }
- sc->ndis_rescnt++;
- resource_list_add(&sc->ndis_rl, SYS_RES_MEMORY, rid,
- rman_get_start(sc->ndis_res_am), rman_get_end(sc->ndis_res_am),
- rman_get_size(sc->ndis_res_am));
-
- error = CARD_SET_MEMORY_OFFSET(device_get_parent(sc->ndis_dev),
- sc->ndis_dev, rid, 0, NULL);
-
- if (error) {
- device_printf(sc->ndis_dev,
- "CARD_SET_MEMORY_OFFSET() returned 0x%x\n", error);
- return(error);
- }
-
- error = CARD_SET_RES_FLAGS(device_get_parent(sc->ndis_dev),
- sc->ndis_dev, SYS_RES_MEMORY, rid, PCCARD_A_MEM_ATTR);
+ struct ndis_softc *sc = device_get_softc(dev);
- if (error) {
- device_printf(sc->ndis_dev,
- "CARD_SET_RES_FLAGS() returned 0x%x\n", error);
- return(error);
- }
+ (void) ndis_detach(dev);
- sc->ndis_am_rid = rid;
+ if (sc->ndis_res_am != NULL)
+ bus_release_resource(sc->ndis_dev, SYS_RES_MEMORY,
+ sc->ndis_am_rid, sc->ndis_res_am);
+ resource_list_free(&sc->ndis_rl);
- return(0);
+ return (0);
}
-void
-ndis_free_amem(arg)
- void *arg;
+static struct resource_list *
+ndis_get_resource_list(dev, child)
+ device_t dev;
+ device_t child;
{
struct ndis_softc *sc;
- if (arg == NULL)
- return;
-
- sc = arg;
-
- if (sc->ndis_res_am != NULL)
- bus_release_resource(sc->ndis_dev, SYS_RES_MEMORY,
- sc->ndis_am_rid, sc->ndis_res_am);
- resource_list_free(&sc->ndis_rl);
-
- return;
+ sc = device_get_softc(dev);
+ return (&sc->ndis_rl);
}