The branch main has been updated by marius:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=518c01b31e96bbe8353a551885a61e7da6aed5f6

commit 518c01b31e96bbe8353a551885a61e7da6aed5f6
Author:     Marius Strobl <[email protected]>
AuthorDate: 2026-01-22 09:05:38 +0000
Commit:     Marius Strobl <[email protected]>
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();
 }

Reply via email to