staging: dgap: use remove function

the remove callback will be called in two cases, 1) if the driver is
removed and 2) if the pci device is removed. as of now all the board
cleanups were being done in the module unload section so if the module
is unloaded everything works. But if the pci device is removed then the
loaded driver will be left in an inconsistent state.
So moved the cleanups in the remove callback and since there was no
reference of dgap_driver in remove_one(), so had to define the
pci_driver in the function.

Signed-off-by: Sudip Mukherjee <sudip@vectorindia.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Sudip Mukherjee 2015-05-07 16:42:21 +05:30 committed by Greg Kroah-Hartman
parent d1c9f3efc4
commit 1397e2fd06
1 changed files with 24 additions and 25 deletions

View File

@ -7019,7 +7019,30 @@ static void dgap_cleanup_board(struct board_t *brd)
static void dgap_remove_one(struct pci_dev *dev) static void dgap_remove_one(struct pci_dev *dev)
{ {
/* Do Nothing */ unsigned int i;
ulong lock_flags;
struct pci_driver *drv = to_pci_driver(dev->dev.driver);
spin_lock_irqsave(&dgap_poll_lock, lock_flags);
dgap_poll_stop = 1;
spin_unlock_irqrestore(&dgap_poll_lock, lock_flags);
/* Turn off poller right away. */
del_timer_sync(&dgap_poll_timer);
dgap_remove_driver_sysfiles(drv);
device_destroy(dgap_class, MKDEV(DIGI_DGAP_MAJOR, 0));
class_destroy(dgap_class);
unregister_chrdev(DIGI_DGAP_MAJOR, "dgap");
for (i = 0; i < dgap_numboards; ++i) {
dgap_remove_ports_sysfiles(dgap_board[i]);
dgap_cleanup_tty(dgap_board[i]);
dgap_cleanup_board(dgap_board[i]);
}
dgap_cleanup_nodes();
} }
static struct pci_driver dgap_driver = { static struct pci_driver dgap_driver = {
@ -7149,30 +7172,6 @@ err_stop:
*/ */
static void dgap_cleanup_module(void) static void dgap_cleanup_module(void)
{ {
unsigned int i;
ulong lock_flags;
spin_lock_irqsave(&dgap_poll_lock, lock_flags);
dgap_poll_stop = 1;
spin_unlock_irqrestore(&dgap_poll_lock, lock_flags);
/* Turn off poller right away. */
del_timer_sync(&dgap_poll_timer);
dgap_remove_driver_sysfiles(&dgap_driver);
device_destroy(dgap_class, MKDEV(DIGI_DGAP_MAJOR, 0));
class_destroy(dgap_class);
unregister_chrdev(DIGI_DGAP_MAJOR, "dgap");
for (i = 0; i < dgap_numboards; ++i) {
dgap_remove_ports_sysfiles(dgap_board[i]);
dgap_cleanup_tty(dgap_board[i]);
dgap_cleanup_board(dgap_board[i]);
}
dgap_cleanup_nodes();
if (dgap_numboards) if (dgap_numboards)
pci_unregister_driver(&dgap_driver); pci_unregister_driver(&dgap_driver);
} }