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
This commit is contained in:
George V. Neville-Neil 2009-05-22 15:06:03 +00:00
parent 6ffb637d4a
commit c2009a4c90

View File

@ -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);