aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorWojciech Macek <wma@FreeBSD.org>2021-09-13 10:55:15 +0000
committerWojciech Macek <wma@FreeBSD.org>2021-09-13 10:55:15 +0000
commit6e93bdfff3cec34f72d98da70b0c6b2b00b2d564 (patch)
tree50cf0bab815f79791e9c84f1692fb3f597895958 /sys/dev
parent41b0190cc404e21cb8b430602eabfedc20107471 (diff)
downloadsrc-6e93bdfff3cec34f72d98da70b0c6b2b00b2d564.tar.gz
src-6e93bdfff3cec34f72d98da70b0c6b2b00b2d564.zip
Revert "if_mvneta: Build the driver as a kernel module"
This reverts commit 41b0190cc404e21cb8b430602eabfedc20107471.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/neta/if_mvneta.c73
1 files changed, 30 insertions, 43 deletions
diff --git a/sys/dev/neta/if_mvneta.c b/sys/dev/neta/if_mvneta.c
index 242e139b8cac..debb4a922cbc 100644
--- a/sys/dev/neta/if_mvneta.c
+++ b/sys/dev/neta/if_mvneta.c
@@ -222,11 +222,6 @@ static device_method_t mvneta_methods[] = {
DEVMETHOD_END
};
-static struct ofw_compat_data compat_data[] = {
- { "marvell,armada-3700-neta", true },
- { NULL, false }
-};
-
DEFINE_CLASS_0(mvneta, mvneta_driver, mvneta_methods, sizeof(struct mvneta_softc));
DRIVER_MODULE(miibus, mvneta, miibus_driver, miibus_devclass, 0, 0);
@@ -234,7 +229,7 @@ DRIVER_MODULE(mdio, mvneta, mdio_driver, mdio_devclass, 0, 0);
MODULE_DEPEND(mvneta, mdio, 1, 1, 1);
MODULE_DEPEND(mvneta, ether, 1, 1, 1);
MODULE_DEPEND(mvneta, miibus, 1, 1, 1);
-SIMPLEBUS_PNP_INFO(compat_data);
+MODULE_DEPEND(mvneta, mvxpbm, 1, 1, 1);
/*
* List of MIB register and names
@@ -614,16 +609,6 @@ mvneta_attach(device_t self)
}
#endif
- error = bus_setup_intr(self, sc->res[1],
- INTR_TYPE_NET | INTR_MPSAFE, NULL, mvneta_intrs[0].handler, sc,
- &sc->ih_cookie[0]);
- if (error) {
- device_printf(self, "could not setup %s\n",
- mvneta_intrs[0].description);
- mvneta_detach(self);
- return (error);
- }
-
/*
* MAC address
*/
@@ -719,6 +704,8 @@ mvneta_attach(device_t self)
}
}
+ ether_ifattach(ifp, sc->enaddr);
+
/*
* Enable DMA engines and Initialize Device Registers.
*/
@@ -848,11 +835,20 @@ mvneta_attach(device_t self)
mvneta_update_media(sc, ifm_target);
}
- ether_ifattach(ifp, sc->enaddr);
+ sysctl_mvneta_init(sc);
callout_reset(&sc->tick_ch, 0, mvneta_tick, sc);
- sysctl_mvneta_init(sc);
+ error = bus_setup_intr(self, sc->res[1],
+ INTR_TYPE_NET | INTR_MPSAFE, NULL, mvneta_intrs[0].handler, sc,
+ &sc->ih_cookie[0]);
+ if (error) {
+ device_printf(self, "could not setup %s\n",
+ mvneta_intrs[0].description);
+ ether_ifdetach(sc->ifp);
+ mvneta_detach(self);
+ return (error);
+ }
return (0);
}
@@ -861,28 +857,20 @@ STATIC int
mvneta_detach(device_t dev)
{
struct mvneta_softc *sc;
- struct ifnet *ifp;
int q;
sc = device_get_softc(dev);
- ifp = sc->ifp;
- if (device_is_attached(dev)) {
- mvneta_stop(sc);
- callout_drain(&sc->tick_ch);
- ether_ifdetach(sc->ifp);
- }
+ mvneta_stop(sc);
+ /* Detach network interface */
+ if (sc->ifp)
+ if_free(sc->ifp);
for (q = 0; q < MVNETA_RX_QNUM_MAX; q++)
mvneta_ring_dealloc_rx_queue(sc, q);
for (q = 0; q < MVNETA_TX_QNUM_MAX; q++)
mvneta_ring_dealloc_tx_queue(sc, q);
- device_delete_children(dev);
-
- if (sc->ih_cookie[0] != NULL)
- bus_teardown_intr(dev, sc->res[1], sc->ih_cookie[0]);
-
if (sc->tx_dtag != NULL)
bus_dma_tag_destroy(sc->tx_dtag);
if (sc->rx_dtag != NULL)
@@ -893,13 +881,6 @@ mvneta_detach(device_t dev)
bus_dma_tag_destroy(sc->rxbuf_dtag);
bus_release_resources(dev, res_spec, sc->res);
-
- if (sc->ifp)
- if_free(sc->ifp);
-
- if (mtx_initialized(&sc->mtx))
- mtx_destroy(&sc->mtx);
-
return (0);
}
@@ -1273,9 +1254,6 @@ mvneta_ring_alloc_rx_queue(struct mvneta_softc *sc, int q)
return (0);
fail:
- mvneta_rx_lockq(sc, q);
- mvneta_ring_flush_rx_queue(sc, q);
- mvneta_rx_unlockq(sc, q);
mvneta_ring_dealloc_rx_queue(sc, q);
device_printf(sc->dev, "DMA Ring buffer allocation failure.\n");
return (error);
@@ -1317,9 +1295,6 @@ mvneta_ring_alloc_tx_queue(struct mvneta_softc *sc, int q)
return (0);
fail:
- mvneta_tx_lockq(sc, q);
- mvneta_ring_flush_tx_queue(sc, q);
- mvneta_tx_unlockq(sc, q);
mvneta_ring_dealloc_tx_queue(sc, q);
device_printf(sc->dev, "DMA Ring buffer allocation failure.\n");
return (error);
@@ -1349,6 +1324,16 @@ mvneta_ring_dealloc_tx_queue(struct mvneta_softc *sc, int q)
#endif
if (sc->txmbuf_dtag != NULL) {
+ if (mtx_name(&tx->ring_mtx) != NULL) {
+ /*
+ * It is assumed that maps are being loaded after mutex
+ * is initialized. Therefore we can skip unloading maps
+ * when mutex is empty.
+ */
+ mvneta_tx_lockq(sc, q);
+ mvneta_ring_flush_tx_queue(sc, q);
+ mvneta_tx_unlockq(sc, q);
+ }
for (i = 0; i < MVNETA_TX_RING_CNT; i++) {
txbuf = &tx->txbuf[i];
if (txbuf->dmap != NULL) {
@@ -1387,6 +1372,8 @@ mvneta_ring_dealloc_rx_queue(struct mvneta_softc *sc, int q)
rx = MVNETA_RX_RING(sc, q);
+ mvneta_ring_flush_rx_queue(sc, q);
+
if (rx->desc_pa != 0)
bus_dmamap_unload(sc->rx_dtag, rx->desc_map);