git: 84fc080266e1 - stable/13 - cxgbe: Deactivate upper layer drivers (like TOE) during detach.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 25 Aug 2022 17:31:30 UTC
The branch stable/13 has been updated by jhb:
URL: https://cgit.FreeBSD.org/src/commit/?id=84fc080266e1b00134d23217e918b4a48b7963d2
commit 84fc080266e1b00134d23217e918b4a48b7963d2
Author: John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2022-05-17 23:33:49 +0000
Commit: John Baldwin <jhb@FreeBSD.org>
CommitDate: 2022-08-25 16:29:22 +0000
cxgbe: Deactivate upper layer drivers (like TOE) during detach.
Reviewed by: np
Sponsored by: Chelsio Communications
Differential Revision: https://reviews.freebsd.org/D35237
(cherry picked from commit 12b37f8f9c789a48ea0e8cd35f403aee0e020ad9)
---
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 40e2b1b9dbe4..6c1a8162b477 100644
--- a/sys/dev/cxgbe/t4_main.c
+++ b/sys/dev/cxgbe/t4_main.c
@@ -859,6 +859,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
@@ -1692,6 +1693,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;
@@ -12624,6 +12634,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)
{