svn commit: r192584 - head/sys/dev/cxgb

George V. Neville-Neil gnn at FreeBSD.org
Fri May 22 15:06:04 UTC 2009


Author: gnn
Date: Fri May 22 15:06:03 2009
New Revision: 192584
URL: http://svn.freebsd.org/changeset/base/192584

Log:
  Fix a possible panic cxgb_controller_attach() routine that would occur
  only if prepping the adapter failed.
  
  Slight adjustment to comments.
  
  Fix a bug whereby downing the interface didn't preven it from
  processing packets.
  
  Submitted by:	Navdeep Parhar
  MFC after:	1 week

Modified:
  head/sys/dev/cxgb/cxgb_main.c

Modified: head/sys/dev/cxgb/cxgb_main.c
==============================================================================
--- head/sys/dev/cxgb/cxgb_main.c	Fri May 22 15:05:05 2009	(r192583)
+++ head/sys/dev/cxgb/cxgb_main.c	Fri May 22 15:06:03 2009	(r192584)
@@ -404,8 +404,9 @@ upgrade_fw(adapter_t *sc)
  *  5. Allocate the BAR for doing MSI-X.
  *  6. Setup the line interrupt iff MSI-X is not supported.
  *  7. Create the driver's taskq.
- *  8. Start the task queue threads.
- *  9. Update the firmware if required.
+ *  8. Start one task queue service thread.
+ *  9. Check if the firmware and SRAM are up-to-date.  They will be
+ *     auto-updated later (before FULL_INIT_DONE), if required.
  * 10. Create a child device for each MAC (port)
  * 11. Initialize T3 private state.
  * 12. Trigger the LED
@@ -665,7 +666,7 @@ out:
 }
 
 /*
- * The cxgb_controlller_detach routine is called with the device is
+ * The cxgb_controller_detach routine is called with the device is
  * unloaded from the system.
  */
 
@@ -685,7 +686,7 @@ cxgb_controller_detach(device_t dev)
  * The cxgb_free() is called by the cxgb_controller_detach() routine
  * to tear down the structures that were built up in
  * cxgb_controller_attach(), and should be the final piece of work
- * done when fullly unloading the driver.
+ * done when fully unloading the driver.
  * 
  *
  *  1. Shutting down the threads started by the cxgb_controller_attach()
@@ -724,7 +725,8 @@ cxgb_free(struct adapter *sc)
 	bus_generic_detach(sc->dev);
 
 	for (i = 0; i < (sc)->params.nports; i++) {
-		if (device_delete_child(sc->dev, sc->portdev[i]) != 0)
+		if (sc->portdev[i] &&
+		    device_delete_child(sc->dev, sc->portdev[i]) != 0)
 			device_printf(sc->dev, "failed to delete child port\n");
 	}
 
@@ -1768,7 +1770,7 @@ out:
 
 
 /*
- * Release resources when all the ports and offloading have been stopped.
+ * Bring down the interface but do not free any resources.
  */
 static void
 cxgb_down_locked(struct adapter *sc)
@@ -1903,6 +1905,7 @@ cxgb_init_locked(struct port_info *p)
  	callout_reset(&sc->cxgb_tick_ch, CXGB_TICKS(sc), cxgb_tick, sc);
 	t3_sge_reset_adapter(sc);
 
+	sc->flags &= ~CXGB_SHUTDOWN;
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 }
@@ -1923,10 +1926,13 @@ static void
 cxgb_stop_locked(struct port_info *pi)
 {
 	struct ifnet *ifp;
+	adapter_t *sc = pi->adapter;
 
 	PORT_LOCK_ASSERT_OWNED(pi);
 	ADAPTER_LOCK_ASSERT_NOTOWNED(pi->adapter);
 	
+	sc->flags |= CXGB_SHUTDOWN;
+
 	ifp = pi->ifp;
 	t3_port_intr_disable(pi->adapter, pi->port_id);
 	ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);


More information about the svn-src-all mailing list