Hello,

Can you please submit the bxe patch attached? Patch was created using bxe 
sources from upstream head branch.

Fix for warning  " lock order reversal: (sleepable after non-sleepable)  seen 
with bxe driver module.

Name: Vaishali Kulkarni, email vkulka...@marvell.com
Thanks,
Vaishali
Only in latestbxe_head2: .svn
diff -uap latestbxe_head2/bxe.c latest_bxe_head_patch/bxe.c
--- latestbxe_head2/bxe.c       2019-06-12 15:25:49.287760000 -0700
+++ latest_bxe_head_patch/bxe.c 2019-06-18 15:10:14.453304000 -0700
@@ -704,6 +704,8 @@ static void    bxe_free_fw_stats_mem(str
 static int     bxe_interrupt_attach(struct bxe_softc *sc);
 static void    bxe_interrupt_detach(struct bxe_softc *sc);
 static void    bxe_set_rx_mode(struct bxe_softc *sc);
+static void bxe_set_rx_mode_sch(struct bxe_softc *sc);
+static void bxe_set_rx_mode_task(void *arg, int pending);
 static int     bxe_init_locked(struct bxe_softc *sc);
 static int     bxe_stop_locked(struct bxe_softc *sc);
 static void    bxe_sp_err_timeout_task(void *arg, int pending);
@@ -4507,6 +4509,22 @@ bxe_handle_chip_tq(void *context,
         break;
     }
 }
+static void
+bxe_set_rx_mode_task(void *context, int pending)
+{
+    struct bxe_softc *sc = (struct bxe_softc *)context;
+    BXE_CORE_LOCK(sc);
+    bxe_set_rx_mode(sc);
+    BXE_CORE_UNLOCK(sc);
+}
+static void
+bxe_set_rx_mode_sch(struct bxe_softc *sc)
+{
+    if (if_getdrvflags(sc->ifp) & IFF_DRV_RUNNING) {
+       taskqueue_enqueue(taskqueue_thread, &sc->set_rx_mode);
+    }
+}
+
 
 /*
  * Handles any IOCTL calls from the operating system.
@@ -4561,25 +4579,30 @@ bxe_ioctl(if_t ifp,
         /* toggle the interface state up or down */
         BLOGD(sc, DBG_IOCTL, "Received SIOCSIFFLAGS ioctl\n");
 
+        if ((if_getflags(ifp) & IFF_UP) &&
+            (if_getdrvflags(ifp) & IFF_DRV_RUNNING)) {
+                bxe_set_rx_mode_sch(sc);
+        }
+
+
        BXE_CORE_LOCK(sc);
         /* check if the interface is up */
         if (if_getflags(ifp) & IFF_UP) {
-            if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) {
-                /* set the receive mode flags */
-                bxe_set_rx_mode(sc);
-            } else if(sc->state != BXE_STATE_DISABLED) {
-               bxe_init_locked(sc);
+             if(((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0) &&
+                        (sc->state != BXE_STATE_DISABLED)) {
+                bxe_init_locked(sc);
             }
         } else {
             if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) {
-               bxe_periodic_stop(sc);
-               bxe_stop_locked(sc);
+                bxe_periodic_stop(sc);
+                bxe_stop_locked(sc);
             }
         }
-       BXE_CORE_UNLOCK(sc);
+        BXE_CORE_UNLOCK(sc);
 
         break;
 
+       
     case SIOCADDMULTI:
     case SIOCDELMULTI:
         /* add/delete multicast addresses */
@@ -4588,9 +4611,7 @@ bxe_ioctl(if_t ifp,
         /* check if the interface is up */
         if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) {
             /* set the receive mode flags */
-           BXE_CORE_LOCK(sc);
-            bxe_set_rx_mode(sc);
-           BXE_CORE_UNLOCK(sc); 
+            bxe_set_rx_mode_sch(sc);
         }
 
         break;
@@ -16357,6 +16378,8 @@ bxe_attach(device_t dev)
     TIMEOUT_TASK_INIT(taskqueue_thread,
         &sc->sp_err_timeout_task, 0, bxe_sp_err_timeout_task,  sc);
 
+    TASK_INIT(&sc->set_rx_mode, 0, bxe_set_rx_mode_task, sc);
+
 
     /* get device info and set params */
     if (bxe_get_device_info(sc) != 0) {
@@ -16535,6 +16558,7 @@ bxe_detach(device_t dev)
         sc->chip_tq = NULL;
         taskqueue_drain_timeout(taskqueue_thread,
             &sc->sp_err_timeout_task);
+       taskqueue_drain(taskqueue_thread,&sc->set_rx_mode);
     }
 
     /* stop and reset the controller if it was open */
diff -uap latestbxe_head2/bxe.h latest_bxe_head_patch/bxe.h
--- latestbxe_head2/bxe.h       2019-06-12 15:25:49.288681000 -0700
+++ latest_bxe_head_patch/bxe.h 2019-06-18 14:56:07.133420000 -0700
@@ -654,6 +654,7 @@ struct bxe_fastpath {
 
     struct task tx_task;
     struct timeout_task tx_timeout_task;
+    struct task            set_rx_mode;
 
     /* ethernet client ID (each fastpath set of RX/TX/CQE is a client) */
     uint8_t cl_id;
_______________________________________________
freebsd-net@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to