• François Romieu's avatar
    8139cp: pci_get_drvdata(pdev) can not be NULL in suspend handler · 7668a494
    François Romieu authored
    1) pci_set_drvdata() is used in cp_{init/remove}_one to initialize/reset
       driver_data to the relevant value (resp. net_device * and NULL).
    
    2) each of the 3 relevant functions is issued under (device *)->sem:
       2.1) pci_unregister_driver
            -> driver_unregister
               -> bus_remove_driver
                  -> driver_detach (takes (device *)->sem)
                     -> __device_release_driver(dev)
                        -> dev->bus-remove(dev) (== pci_device_remove)
                           -> drv->remove(pdev) (== cp_remove_one)
                           [...]
                           pci_dev->driver = NULL;
    
       2.2) pci_register_driver
            -> __pci_register_driver
               -> driver_register
                  -> bus_add_driver
                     -> driver_attach
                        -> __driver_attach (takes (device *)->sem)
                           -> driver_probe_device(drv, dev)
                              -> dev->bus->probe(dev) (== pci_device_probe)
                                 -> _pci_device_probe(drv, pci_dev)
                                    -> pci_call_probe(drv, pci_dev, id)
                                       -> drv->probe(dev, id) (== cp_init_one)
                                    [...]
                                    pci_dev->driver = drv;
    
       2.3) suspend_device (takes (device *)->sem)
            -> dev->bus->suspend(dev) (== pci_device_suspend)
               checking for drv = pci_dev->driver != NULL
               [...]
               -> drv->suspend(pci_dev, state) (== cp_suspend)
    
    dev->sem and the state of pci_dev->driver provide the expected result.
    
    St Mary's day was a bit rainy here.
    Signed-off-by: default avatarFrancois Romieu <romieu@fr.zoreil.com>
    7668a494
8139cp.c 54.5 KB