Thread: RE: [Ndiswrapper-general] Re: rmmod oops
Status: Beta
Brought to you by:
pgiri
From: Ow M. H. <ow....@wd...> - 2003-12-31 01:04:12
|
> -----Original Message----- > From: Olivier Bornet [mailto:Oli...@pu...] > Sent: Tuesday, December 30, 2003 9:28 PM > To: Tomas Szepe > Cc: ndi...@li... > Subject: [Ndiswrapper-general] Re: rmmod oops >=20 >=20 > Hello, >=20 > > I'm afraid I have to report that today's patch (attached) doesn't > > seem to fix the oops (below) for me. >=20 > I also have a oops with rmmod (not always, but many time). After that > the keyboard is no more working (lot of RETURN in the active=20 > term), and > I have to poweroff/poweron the PC. Same thing here as well.. I'm using the CVS version too..=20 Can I know how to get the oops detail? I don't see anything=20 in /var/log/messages |
From: Tomas S. <sz...@pi...> - 2003-12-31 18:49:07
|
On Dec-31 2003, Wed, 06:15 -0500 Giridhar Pemmasani <gi...@lm...> wrote: > I don't have the hardware to test this. If someone can track it down, > it will be great. I suspect it is due to bottom-half irq handler in > ndis.c. Right-o. Here's my new year's gift to the ndiswrapper team. ;) -- Tomas Szepe <sz...@pi...> diff -urN ndiswrapper.old/driver/ndis.c ndiswrapper/driver/ndis.c --- ndiswrapper.old/driver/ndis.c 2003-12-31 19:45:46.000000000 +0100 +++ ndiswrapper/driver/ndis.c 2003-12-31 19:43:04.000000000 +0100 @@ -922,22 +922,23 @@ * Top half of the irq handler * */ +int ndiswrp_being_unloaded = 0; irqreturn_t ndis_irq_th(int irq, void *data, struct pt_regs *pt_regs) { - int handeled = 0; + int handled = 0; int more_work = 0; struct ndis_irq *irqhandle = (struct ndis_irq *) data; struct ndis_handle *handle = irqhandle->handle; spin_lock(&irqhandle->spinlock); - handle->driver->miniport_char.isr(&handeled, &more_work, handle->adapter_ctx); + handle->driver->miniport_char.isr(&handled, &more_work, handle->adapter_ctx); spin_unlock(&irqhandle->spinlock); - if(more_work) + if(!ndiswrp_being_unloaded && more_work) schedule_work(&handle->irq_bh); - - if(handeled) + + if(handled) return IRQ_HANDLED; return IRQ_NONE; diff -urN ndiswrapper.old/driver/ndis.h ndiswrapper/driver/ndis.h --- ndiswrapper.old/driver/ndis.h 2003-12-31 19:45:46.000000000 +0100 +++ ndiswrapper/driver/ndis.h 2003-12-31 19:36:24.000000000 +0100 @@ -489,6 +489,8 @@ #define NDIS_STATUS_MEDIA_CONNECT 0x4001000b #define NDIS_STATUS_MEDIA_DISCONNECT 0x4001000c +extern int ndiswrp_being_unloaded; + void ndis_sendpacket_done(struct ndis_handle *handle, struct ndis_packet *packet); diff -urN ndiswrapper.old/driver/wrapper.c ndiswrapper/driver/wrapper.c --- ndiswrapper.old/driver/wrapper.c 2003-12-31 19:45:46.000000000 +0100 +++ ndiswrapper/driver/wrapper.c 2003-12-31 19:45:13.000000000 +0100 @@ -1767,15 +1767,19 @@ ndis_remove_proc(handle); #ifndef DEBUG_CRASH_ON_INIT - unregister_netdev(handle->net_dev); - if(handle->net_dev) + { + unregister_netdev(handle->net_dev); + pci_set_drvdata(pdev, NULL); free_netdev(handle->net_dev); + } + set_int(handle, NDIS_OID_DISASSOCIATE, 0); call_halt(handle); #endif - pci_disable_device(pdev); + pci_release_regions(pdev); + pci_disable_device(pdev); } @@ -1810,7 +1814,7 @@ driver->pci_driver.name = driver->name; driver->pci_driver.id_table = driver->pci_id; driver->pci_driver.probe = ndis_init_one; - driver->pci_driver.remove = ndis_remove_one; + driver->pci_driver.remove = __devexit_p(ndis_remove_one); #ifndef DEBUG_CRASH_ON_INIT res = pci_module_init(&driver->pci_driver); @@ -1995,8 +1999,13 @@ struct list_head *curr, *tmp2; DBGTRACE("%s\n", __FUNCTION__); - if(driver->pci_registered) + if(driver->pci_registered) { + ndiswrp_being_unloaded = 1; /* stop servicing bh interrupts */ pci_unregister_driver(&driver->pci_driver); + set_current_state(TASK_UNINTERRUPTIBLE); + schedule_timeout(HZ >> 2); + } + #ifdef DEBUG_CRASH_ON_INIT { struct pci_dev *pdev = 0; @@ -2115,7 +2124,6 @@ struct ndis_driver *driver = (struct ndis_driver*) driverlist.next; unload_driver(driver); } - misc_deregister(&wrapper_misc); } |
From: Giridhar P. <gi...@lm...> - 2003-12-31 19:07:16
|
Hi Timo, That is good news. In fact, I have a patch that did somewhat similar to what you have done. I intended to send it tonight for testing. But if this patch works (once people confirm), I will commit it. -- Giri |
From: Tomas S. <sz...@pi...> - 2004-01-01 13:14:56
|
On Dec-31 2003, Wed, 14:16 -0500 Giridhar Pemmasani <gi...@lm...> wrote: > Can someone try this patch and let me know if this helps issues with > rmmod? ... > #ifndef DEBUG_CRASH_ON_INIT > + set_int(handle, NDIS_OID_DISASSOCIATE, 0); > + call_halt(handle); > unregister_netdev(handle->net_dev); > > if(handle->net_dev) > free_netdev(handle->net_dev); > - set_int(handle, NDIS_OID_DISASSOCIATE, 0); > - call_halt(handle); > + > #endif > - pci_disable_device(pdev); > pci_release_regions(pdev); > + pci_disable_device(pdev); > + pci_set_drvdata(pdev, NULL); > } You shouldn't call_halt() before unregister_netdev(), because call_halt() results in an attempt to free the IRQ, and the netif queue is not yet stopped. This patch cannot (and doesn't :D) work. kernel: wrapper_exit: <- entered kernel: unload_driver: <- entered kernel: ndis_remove_one: <- entered kernel: ndis_remove_one: about to call call_halt() kernel: NdisMDeregisterInterrupt: freeing IRQ kernel: ndis_remove_one: returned from call_halt() -- this is where you're most likely to OOPS -- kernel: ndis_remove_one: about to call unregister_netdev() kernel: ndis_close: <- entered kernel: ndis_close: net queue stopped kernel: ndis_close: -> done kernel: ndis_remove_one: returned from unregister_netdev() kernel: ndis_remove_one: -> done kernel: unload_driver: pci driver unregistered kernel: unload_driver: freeing driver image kernel: unload_driver: -> done kernel: wrapper_exit: -> done I believe the real solution to this problem is to call a function in the ndis driver that will disable the interrupt on the device prior to calling free_irq(). Giri, please tell me how to do that and I'll cook the final patch. -- Tomas Szepe <sz...@pi...> |
From: Giridhar P. <gi...@lm...> - 2003-12-31 19:12:42
|
Actually, my patch is slightly different. I would like someone (Timo?) to try this. Instead of setting the flag that ndiswrapper is being unloaded, can we set a flag in DeregisterInterrupt? That makes more sense (and is less of a hack). I believe that should work. If you can test it and send me a patch with that idea, it would be great. Thanks, Giri |
From: Tomas S. <sz...@pi...> - 2004-01-01 13:21:38
|
On Dec-31 2003, Wed, 14:11 -0500 Giridhar Pemmasani <gi...@lm...> wrote: > Instead of setting the flag that ndiswrapper is being unloaded, can we > set a flag in DeregisterInterrupt? That makes more sense (and is less > of a hack). I believe that should work. If you can test it and send me > a patch with that idea, it would be great. I'd love to drop the flag altogether, but I can't figure out how to disable the interrupt on the device via a ndis call. -- Tomas Szepe <sz...@pi...> |
From: Timo <ti...@ti...> - 2003-12-31 20:30:17
|
=2D----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Am Mittwoch, 31. Dezember 2003 20:11 schrieb Giridhar Pemmasani: >=20 > Actually, my patch is slightly different. I would like someone (Timo?) > to try this.=20 Why me? Or am I not the only Timo on this list? I don't get any oops when unloading (I was not connected to a wlan since xm= as eve). Instead I get: =2D -----------------------------------------------------------------------= =2D--------------- timo01:~# rmmod ndiswrapper timo01:~# lsmod Module Size Used by ndiswrapper 65800 0 isofs 34488 0 zlib_inflate 22144 1 isofs ircomm_tty 27400 0 ircomm 15620 1 ircomm_tty irnet 26892 0 ppp_generic 30736 1 irnet slhc 7296 1 ppp_generic irlan 31504 0 8139too 23424 0 mii 5248 1 8139too irda 137020 4 ircomm_tty,ircomm,irnet,irlan usb_storage 103056 0 timo01:~# rmmod ndiswrapper Message from syslogd@timo01 at Wed Dec 31 21:21:18 2003 ... timo01 kernel: unregister_netdevice: waiting for wlan0 to become free. Usag= e count =3D 2 timo01:~# lsmod Module Size Used by isofs 34488 0 zlib_inflate 22144 1 isofs ircomm_tty 27400 0 ircomm 15620 1 ircomm_tty irnet 26892 0 ppp_generic 30736 1 irnet slhc 7296 1 ppp_generic irlan 31504 0 8139too 23424 0 mii 5248 1 8139too irda 137020 4 ircomm_tty,ircomm,irnet,irlan usb_storage 103056 0 timo01:~#=20 Message from syslogd@timo01 at Wed Dec 31 21:21:50 2003 ... timo01 kernel: unregister_netdevice: waiting for wlan0 to become free. Usag= e count =3D 2 =2D -----------------------------------------------------------------------= =2D--------------- is that normal? Timo =2D----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.3 (GNU/Linux) iQEVAwUBP/Mxx0n74FOC+06tAQIHFAf/TUl100hXDPgGk4WKjDqXPcqE290YCa9Y JFDnbVdoimpfxXH595vqi+iacTolql/WVV9t4vpyMDevaE8F/FKIsm4msJlgifcZ Aigttq2Hc0Coo6toCAwnLHGu8akgzaKUDa5C7m0gJnDZUXRbLgZjVn+rl6UmJRZW xbuDFDxbgMTTrmSXVcK+EkqMg0fP8q+6M0oTEUM/Cdz54j22vhQn+UY4GUNM/nv1 x2Wj/YtnD4PPrPuQF0LpKG2EmiI/fwlltOysgO9tCv5kJFO4baE5mlX9/ftBl9jM Lup4wdiCQaG/WYlaNMw0m8YLOgcmdTVQ+n30gM8YrXyZVRNhPJDfdg=3D=3D =3D1E8h =2D----END PGP SIGNATURE----- |
From: Giridhar P. <gi...@lm...> - 2003-12-31 20:37:39
|
Sorry, I mean to ask Tomas to test, since he is the one that sent the patch. -- Giri |