The branch main has been updated by jhb:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=12b37f8f9c789a48ea0e8cd35f403aee0e020ad9

commit 12b37f8f9c789a48ea0e8cd35f403aee0e020ad9
Author:     John Baldwin <[email protected]>
AuthorDate: 2022-05-17 23:33:49 +0000
Commit:     John Baldwin <[email protected]>
CommitDate: 2022-05-17 23:33:49 +0000

    cxgbe: Deactivate upper layer drivers (like TOE) during detach.
    
    Reviewed by:    np
    Sponsored by:   Chelsio Communications
    Differential Revision:  https://reviews.freebsd.org/D35237
---
 sys/dev/cxgbe/t4_main.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c
index 94dd70f01132..a4c17cc11505 100644
--- a/sys/dev/cxgbe/t4_main.c
+++ b/sys/dev/cxgbe/t4_main.c
@@ -854,6 +854,7 @@ static int hold_clip_addr(struct adapter *, struct 
t4_clip_addr *);
 static int release_clip_addr(struct adapter *, struct t4_clip_addr *);
 #ifdef TCP_OFFLOAD
 static int toe_capability(struct vi_info *, bool);
+static int t4_deactivate_all_uld(struct adapter *);
 static void t4_async_event(struct adapter *);
 #endif
 #ifdef KERN_TLS
@@ -1686,6 +1687,15 @@ t4_detach_common(device_t dev)
 
        sc = device_get_softc(dev);
 
+#ifdef TCP_OFFLOAD
+       rc = t4_deactivate_all_uld(sc);
+       if (rc) {
+               device_printf(dev,
+                   "failed to detach upper layer drivers: %d\n", rc);
+               return (rc);
+       }
+#endif
+
        if (sc->cdev) {
                destroy_dev(sc->cdev);
                sc->cdev = NULL;
@@ -12591,6 +12601,34 @@ t4_deactivate_uld(struct adapter *sc, int id)
        return (rc);
 }
 
+static int
+t4_deactivate_all_uld(struct adapter *sc)
+{
+       int rc;
+       struct uld_info *ui;
+
+       rc = begin_synchronized_op(sc, NULL, SLEEP_OK, "t4detuld");
+       if (rc != 0)
+               return (ENXIO);
+
+       sx_slock(&t4_uld_list_lock);
+
+       SLIST_FOREACH(ui, &t4_uld_list, link) {
+               if (isset(&sc->active_ulds, ui->uld_id)) {
+                       rc = ui->deactivate(sc);
+                       if (rc != 0)
+                               break;
+                       clrbit(&sc->active_ulds, ui->uld_id);
+                       ui->refcount--;
+               }
+       }
+
+       sx_sunlock(&t4_uld_list_lock);
+       end_synchronized_op(sc, 0);
+
+       return (rc);
+}
+
 static void
 t4_async_event(struct adapter *sc)
 {

Reply via email to