svn commit: r300295 - head/sys/dev/vnic

Wojciech Macek wma at FreeBSD.org
Fri May 20 11:02:05 UTC 2016


Author: wma
Date: Fri May 20 11:02:04 2016
New Revision: 300295
URL: https://svnweb.freebsd.org/changeset/base/300295

Log:
  Fix VNIC module unloading
  
  Fix panics which were present when BGX and PF module were unloaded.
  
  Reviewed by:	zbb
  Obtained from:	Semihalf
  Sponsored by:	Cavium
  Differential Revision:	https://reviews.freebsd.org/D6346

Modified:
  head/sys/dev/vnic/nic_main.c
  head/sys/dev/vnic/thunder_bgx.c

Modified: head/sys/dev/vnic/nic_main.c
==============================================================================
--- head/sys/dev/vnic/nic_main.c	Fri May 20 11:00:06 2016	(r300294)
+++ head/sys/dev/vnic/nic_main.c	Fri May 20 11:02:04 2016	(r300295)
@@ -247,7 +247,9 @@ static int
 nicpf_detach(device_t dev)
 {
 	struct nicpf *nic;
+	int err;
 
+	err = 0;
 	nic = device_get_softc(dev);
 
 	callout_drain(&nic->check_link);
@@ -257,7 +259,12 @@ nicpf_detach(device_t dev)
 	nicpf_free_res(nic);
 	pci_disable_busmaster(dev);
 
-	return (0);
+#ifdef PCI_IOV
+	err = pci_iov_detach(dev);
+	if (err != 0)
+		device_printf(dev, "SR-IOV in use. Detach first.\n");
+#endif
+	return (err);
 }
 
 /*
@@ -1055,6 +1062,9 @@ nic_disable_msix(struct nicpf *nic)
 		nic->msix_enabled = 0;
 		nic->num_vec = 0;
 	}
+
+	bus_release_resource(nic->dev, SYS_RES_MEMORY,
+	    rman_get_rid(nic->msix_table_res), nic->msix_table_res);
 }
 
 static void
@@ -1071,7 +1081,7 @@ nic_free_all_interrupts(struct nicpf *ni
 			    nic->msix_entries[irq].handle);
 		}
 
-		bus_release_resource(nic->dev, SYS_RES_IRQ, irq,
+		bus_release_resource(nic->dev, SYS_RES_IRQ, irq + 1,
 		    nic->msix_entries[irq].irq_res);
 	}
 }

Modified: head/sys/dev/vnic/thunder_bgx.c
==============================================================================
--- head/sys/dev/vnic/thunder_bgx.c	Fri May 20 11:00:06 2016	(r300294)
+++ head/sys/dev/vnic/thunder_bgx.c	Fri May 20 11:02:04 2016	(r300295)
@@ -136,12 +136,16 @@ static int
 thunder_bgx_attach(device_t dev)
 {
 	struct bgx *bgx;
-	uint8_t lmac;
+	uint8_t lmacid;
 	int err;
 	int rid;
+	struct lmac *lmac;
 
 	bgx = malloc(sizeof(*bgx), M_BGX, (M_WAITOK | M_ZERO));
 	bgx->dev = dev;
+
+	lmac = device_get_softc(dev);
+	lmac->bgx = bgx;
 	/* Enable bus mastering */
 	pci_enable_busmaster(dev);
 	/* Allocate resources - configuration registers */
@@ -168,11 +172,11 @@ thunder_bgx_attach(device_t dev)
 	bgx_init_hw(bgx);
 
 	/* Enable all LMACs */
-	for (lmac = 0; lmac < bgx->lmac_count; lmac++) {
-		err = bgx_lmac_enable(bgx, lmac);
+	for (lmacid = 0; lmacid < bgx->lmac_count; lmacid++) {
+		err = bgx_lmac_enable(bgx, lmacid);
 		if (err) {
 			device_printf(dev, "BGX%d failed to enable lmac%d\n",
-				bgx->bgx_id, lmac);
+				bgx->bgx_id, lmacid);
 			goto err_free_res;
 		}
 	}
@@ -203,6 +207,12 @@ thunder_bgx_detach(device_t dev)
 	for (lmacid = 0; lmacid < bgx->lmac_count; lmacid++)
 		bgx_lmac_disable(bgx, lmacid);
 
+	bgx_vnic[bgx->bgx_id] = NULL;
+	bus_release_resource(dev, SYS_RES_MEMORY,
+	    rman_get_rid(bgx->reg_base), bgx->reg_base);
+	free(bgx, M_BGX);
+	pci_disable_busmaster(dev);
+
 	return (0);
 }
 


More information about the svn-src-head mailing list