- Don't register the inet_addr notifier if the hardware is absent. It oopses when other interfaces are being upped. - Mark velocity_remove1() as __devexit_p in the pci_driver table. - c99ification. Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/via-velocity.c | 29 ++++++++++++++++++----------- 1 files changed, 18 insertions(+), 11 deletions(-) diff -puN drivers/net/via-velocity.c~via-velocity-oops-fix drivers/net/via-velocity.c --- 25/drivers/net/via-velocity.c~via-velocity-oops-fix 2004-06-02 23:14:37.933999272 -0700 +++ 25-akpm/drivers/net/via-velocity.c 2004-06-02 23:14:37.939998360 -0700 @@ -269,8 +269,9 @@ static int velocity_resume(struct pci_de static int velocity_netdev_event(struct notifier_block *nb, unsigned long notification, void *ptr); static struct notifier_block velocity_inetaddr_notifier = { - notifier_call:velocity_netdev_event, + .notifier_call = velocity_netdev_event, }; +static int velocity_notifier_registered; #endif /* CONFIG_PM */ @@ -776,6 +777,12 @@ static int __devinit velocity_found1(str pci_set_power_state(pdev, 3); out: +#ifdef CONFIG_PM + if (ret == 0 && !velocity_notifier_registered) { + velocity_notifier_registered = 1; + register_inetaddr_notifier(&velocity_inetaddr_notifier); + } +#endif return ret; err_iounmap: @@ -2123,13 +2130,13 @@ static int velocity_ioctl(struct net_dev */ static struct pci_driver velocity_driver = { - name:VELOCITY_NAME, - id_table:velocity_id_table, - probe:velocity_found1, - remove:velocity_remove1, + .name = VELOCITY_NAME, + .id_table = velocity_id_table, + .probe = velocity_found1, + .remove = __devexit_p(velocity_remove1), #ifdef CONFIG_PM - suspend:velocity_suspend, - resume:velocity_resume, + .suspend = velocity_suspend, + .resume = velocity_resume, #endif }; @@ -2147,9 +2154,6 @@ static int __init velocity_init_module(v int ret; ret = pci_module_init(&velocity_driver); -#ifdef CONFIG_PM - register_inetaddr_notifier(&velocity_inetaddr_notifier); -#endif return ret; } @@ -2165,7 +2169,10 @@ static int __init velocity_init_module(v static void __exit velocity_cleanup_module(void) { #ifdef CONFIG_PM - unregister_inetaddr_notifier(&velocity_inetaddr_notifier); + if (velocity_notifier_registered) { + unregister_inetaddr_notifier(&velocity_inetaddr_notifier); + velocity_notifier_registered = 0; + } #endif pci_unregister_driver(&velocity_driver); } _