git: 518c01b31e96 - main - sym(4): Provide a DEVICE_DETACH(9) method
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 26 Jan 2026 15:57:44 UTC
The branch main has been updated by marius:
URL: https://cgit.FreeBSD.org/src/commit/?id=518c01b31e96bbe8353a551885a61e7da6aed5f6
commit 518c01b31e96bbe8353a551885a61e7da6aed5f6
Author: Marius Strobl <marius@FreeBSD.org>
AuthorDate: 2026-01-22 09:05:38 +0000
Commit: Marius Strobl <marius@FreeBSD.org>
CommitDate: 2026-01-26 15:54:48 +0000
sym(4): Provide a DEVICE_DETACH(9) method
This also fixes sym_cam_free() to tear things down correctly, i. e. in
opposite order of setup, as well as sym_cam_attach() to not free devq
and SIM twice in the failure case.
---
sys/dev/sym/sym_hipd.c | 34 +++++++++++++++++++---------------
1 file changed, 19 insertions(+), 15 deletions(-)
diff --git a/sys/dev/sym/sym_hipd.c b/sys/dev/sym/sym_hipd.c
index 6b7c0bd355ef..0e51607fb07a 100644
--- a/sys/dev/sym/sym_hipd.c
+++ b/sys/dev/sym/sym_hipd.c
@@ -2249,10 +2249,11 @@ static void sym_update_dflags(hcb_p np, u_char *flags,
struct ccb_trans_settings *cts);
static const struct sym_pci_chip *sym_find_pci_chip (device_t dev);
-static int sym_pci_probe (device_t dev);
-static int sym_pci_attach (device_t dev);
-static void sym_pci_free (hcb_p np);
+static device_probe_t sym_pci_probe;
+static device_attach_t sym_pci_attach;
+static device_detach_t sym_pci_detach;
+
static int sym_cam_attach (hcb_p np);
static void sym_cam_free (hcb_p np);
@@ -8237,6 +8238,7 @@ sym_update_dflags(hcb_p np, u_char *flags, struct ccb_trans_settings *cts)
static device_method_t sym_pci_methods[] = {
DEVMETHOD(device_probe, sym_pci_probe),
DEVMETHOD(device_attach, sym_pci_attach),
+ DEVMETHOD(device_detach, sym_pci_detach),
DEVMETHOD_END
};
@@ -8740,21 +8742,25 @@ sym_pci_attach(device_t dev)
*/
attach_failed:
if (np)
- sym_pci_free(np);
+ sym_pci_detach(dev);
return ENXIO;
}
/*
- * Free everything that have been allocated for this device.
+ * Detach a device by freeing everything that has been allocated for it.
*/
-static void sym_pci_free(hcb_p np)
+static int
+sym_pci_detach(device_t dev)
{
+ hcb_p np;
SYM_QUEHEAD *qp;
ccb_p cp;
tcb_p tp;
lcb_p lp;
int target, lun;
+ np = device_get_softc(dev);
+
/*
* First free CAM resources.
*/
@@ -8829,6 +8835,8 @@ static void sym_pci_free(hcb_p np)
SYM_LOCK_DESTROY();
device_set_softc(np->device, NULL);
sym_mfree_dma(np, sizeof(*np), "HCB");
+
+ return (0);
}
/*
@@ -8902,11 +8910,6 @@ static int sym_cam_attach(hcb_p np)
return 1;
fail:
- if (sim)
- cam_sim_free(sim, FALSE);
- if (devq)
- cam_simq_free(devq);
-
SYM_UNLOCK();
sym_cam_free(np);
@@ -8929,15 +8932,16 @@ static void sym_cam_free(hcb_p np)
SYM_LOCK();
+ if (np->path) {
+ xpt_async(AC_LOST_DEVICE, np->path, NULL);
+ xpt_free_path(np->path);
+ np->path = NULL;
+ }
if (np->sim) {
xpt_bus_deregister(cam_sim_path(np->sim));
cam_sim_free(np->sim, /*free_devq*/ TRUE);
np->sim = NULL;
}
- if (np->path) {
- xpt_free_path(np->path);
- np->path = NULL;
- }
SYM_UNLOCK();
}