mirror of
https://git.FreeBSD.org/ports.git
synced 2024-12-20 04:02:27 +00:00
net/realtek-re-kmod: fix locking bugs.
PR: 256757 Submitted by: Niels Bakker <niels=freebsd@bakker.net>
This commit is contained in:
parent
31642e81e3
commit
c83bb257d1
@ -2,7 +2,7 @@
|
||||
|
||||
PORTNAME= re
|
||||
DISTVERSION= v196.04
|
||||
PORTREVISION= 2
|
||||
PORTREVISION= 3
|
||||
CATEGORIES= net
|
||||
MASTER_SITES= LOCAL/ale
|
||||
PKGNAMEPREFIX= realtek-
|
||||
|
@ -76,7 +76,35 @@
|
||||
|
||||
#define RE_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP)
|
||||
|
||||
@@ -3428,16 +3442,6 @@ is_valid_ether_addr(const u_int8_t * addr)
|
||||
@@ -930,6 +944,7 @@ static int re_alloc_buf(struct re_softc *sc)
|
||||
int error =0;
|
||||
int i,size;
|
||||
|
||||
+ RE_UNLOCK(sc);
|
||||
error = bus_dma_tag_create(sc->re_parent_tag, 1, 0,
|
||||
BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL,
|
||||
NULL, MCLBYTES* RE_NTXSEGS, RE_NTXSEGS, 4096, 0,
|
||||
@@ -938,6 +953,7 @@ static int re_alloc_buf(struct re_softc *sc)
|
||||
if (error) {
|
||||
//device_printf(dev,"re_tx_mtag fail\n");
|
||||
//goto fail;
|
||||
+ RE_LOCK(sc);
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -955,9 +971,11 @@ static int re_alloc_buf(struct re_softc *sc)
|
||||
if (error) {
|
||||
//device_printf(dev,"re_rx_mtag fail\n");
|
||||
//goto fail;
|
||||
+ RE_LOCK(sc);
|
||||
return error;
|
||||
}
|
||||
|
||||
+ RE_LOCK(sc);
|
||||
if (sc->re_rx_mbuf_sz <= MCLBYTES)
|
||||
size = MCLBYTES;
|
||||
else if (sc->re_rx_mbuf_sz <= MJUMPAGESIZE)
|
||||
@@ -3428,16 +3446,6 @@ is_valid_ether_addr(const u_int8_t * addr)
|
||||
return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr);
|
||||
}
|
||||
|
||||
@ -93,7 +121,7 @@
|
||||
static void re_disable_now_is_oob(struct re_softc *sc)
|
||||
{
|
||||
if (sc->re_hw_supp_now_is_oob_ver == 1)
|
||||
@@ -3889,7 +3893,7 @@ static void re_get_hw_mac_address(struct re_softc *sc,
|
||||
@@ -3889,7 +3897,7 @@ static void re_get_hw_mac_address(struct re_softc *sc,
|
||||
|
||||
if (!is_valid_ether_addr(eaddr)) {
|
||||
device_printf(dev,"Invalid ether addr: %6D\n", eaddr, ":");
|
||||
@ -102,7 +130,7 @@
|
||||
device_printf(dev,"Random ether addr: %6D\n", eaddr, ":");
|
||||
}
|
||||
|
||||
@@ -4291,9 +4295,9 @@ static void re_init_software_variable(struct re_softc
|
||||
@@ -4291,9 +4299,9 @@ static void re_init_software_variable(struct re_softc
|
||||
|
||||
sc->re_rx_mbuf_sz = sc->max_jumbo_frame_size + ETHER_VLAN_ENCAP_LEN + ETHER_HDR_LEN + ETHER_CRC_LEN + RE_ETHER_ALIGN + 1;
|
||||
|
||||
@ -115,7 +143,63 @@
|
||||
}
|
||||
|
||||
switch(sc->re_type) {
|
||||
@@ -8614,6 +8618,22 @@ struct re_softc *sc;
|
||||
@@ -7073,12 +7081,11 @@ static void re_init_unlock(void *xsc) /* Software &
|
||||
return;
|
||||
}
|
||||
|
||||
-static void re_init(void *xsc) /* Software & Hardware Initialize */
|
||||
+static void re_init_locked(void *xsc)
|
||||
{
|
||||
struct re_softc *sc = xsc;
|
||||
struct ifnet *ifp;
|
||||
|
||||
- RE_LOCK(sc);
|
||||
ifp = RE_GET_IFNET(sc);
|
||||
|
||||
if (re_link_ok(sc)) {
|
||||
@@ -7089,7 +7096,14 @@ static void re_init(void *xsc) /* Software & Hardwar
|
||||
|
||||
sc->re_link_chg_det = 1;
|
||||
re_start_timer(sc);
|
||||
+}
|
||||
|
||||
+static void re_init(void *xsc) /* Software & Hardware Initialize */
|
||||
+{
|
||||
+ struct re_softc *sc = xsc;
|
||||
+
|
||||
+ RE_LOCK(sc);
|
||||
+ re_init_locked(sc);
|
||||
RE_UNLOCK(sc);
|
||||
}
|
||||
|
||||
@@ -8438,7 +8452,7 @@ static void re_int_task(void *arg, int npending)
|
||||
if ((status & RE_ISR_FIFO_OFLOW) &&
|
||||
(!(status & (RE_ISR_RX_OK | RE_ISR_TX_OK | RE_ISR_RX_OVERRUN)))) {
|
||||
re_reset(sc);
|
||||
- re_init(sc);
|
||||
+ re_init_locked(sc);
|
||||
sc->rx_fifo_overflow = 0;
|
||||
CSR_WRITE_2(sc, RE_ISR, RE_ISR_FIFO_OFLOW);
|
||||
}
|
||||
@@ -8449,7 +8463,7 @@ static void re_int_task(void *arg, int npending)
|
||||
|
||||
if (status & RE_ISR_SYSTEM_ERR) {
|
||||
re_reset(sc);
|
||||
- re_init(sc);
|
||||
+ re_init_locked(sc);
|
||||
}
|
||||
|
||||
switch(sc->re_type) {
|
||||
@@ -8514,7 +8528,7 @@ static void re_int_task_8125(void *arg, int npending)
|
||||
|
||||
if (status & RE_ISR_SYSTEM_ERR) {
|
||||
re_reset(sc);
|
||||
- re_init(sc);
|
||||
+ re_init_locked(sc);
|
||||
}
|
||||
|
||||
RE_UNLOCK(sc);
|
||||
@@ -8614,6 +8628,22 @@ struct re_softc *sc;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -138,7 +222,7 @@
|
||||
/*
|
||||
* Program the 64-bit multicast hash filter.
|
||||
*/
|
||||
@@ -8623,7 +8643,9 @@ struct re_softc *sc;
|
||||
@@ -8623,7 +8653,9 @@ struct re_softc *sc;
|
||||
struct ifnet *ifp;
|
||||
int h = 0;
|
||||
u_int32_t hashes[2] = { 0, 0 };
|
||||
@ -148,13 +232,13 @@
|
||||
u_int32_t rxfilt;
|
||||
int mcnt = 0;
|
||||
|
||||
@@ -8640,7 +8662,12 @@ struct re_softc *sc;
|
||||
@@ -8640,7 +8672,12 @@ struct re_softc *sc;
|
||||
}
|
||||
|
||||
/* now program new ones */
|
||||
-#if OS_VER > VERSION(6,0)
|
||||
+#if OS_VER >= VERSION(13,0)
|
||||
+ if_foreach_llmaddr(ifp, re_hash_maddr, hashes);
|
||||
+ mcnt = if_foreach_llmaddr(ifp, re_hash_maddr, hashes);
|
||||
+#else
|
||||
+#if OS_VER >= VERSION(12,0)
|
||||
+ if_maddr_rlock(ifp);
|
||||
@ -162,7 +246,7 @@
|
||||
IF_ADDR_LOCK(ifp);
|
||||
#endif
|
||||
#if OS_VER < VERSION(4,9)
|
||||
@@ -8662,8 +8689,11 @@ struct re_softc *sc;
|
||||
@@ -8662,9 +8699,12 @@ struct re_softc *sc;
|
||||
hashes[1] |= (1 << (h - 32));
|
||||
mcnt++;
|
||||
}
|
||||
@ -171,7 +255,26 @@
|
||||
+ if_maddr_runlock(ifp);
|
||||
+#elif OS_VER > VERSION(6,0)
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
+#endif
|
||||
#endif
|
||||
+#endif
|
||||
|
||||
if (mcnt) {
|
||||
if ((sc->re_if_flags & RL_FLAG_PCIE) != 0) {
|
||||
@@ -8720,7 +8760,7 @@ caddr_t data;
|
||||
error =re_alloc_buf(sc);
|
||||
|
||||
if (error == 0) {
|
||||
- re_init(sc);
|
||||
+ re_init_locked(sc);
|
||||
}
|
||||
RE_UNLOCK(sc);
|
||||
|
||||
@@ -8743,7 +8783,7 @@ caddr_t data;
|
||||
case SIOCSIFFLAGS:
|
||||
RE_LOCK(sc);
|
||||
if (ifp->if_flags & IFF_UP) {
|
||||
- re_init(sc);
|
||||
+ re_init_locked(sc);
|
||||
} else if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
|
||||
re_stop(sc);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user