static void __exit sx_exit (void)
 {
        int i; 
-       struct sx_board *board;
 
        func_enter();
 #ifdef CONFIG_EISA
        eisa_driver_unregister(&sx_eisadriver);
 #endif
        pci_unregister_driver(&sx_pcidriver);
-       for (i = 0; i < SX_NBOARDS; i++) {
-               board = &boards[i];
-               if (board->flags & SX_BOARD_INITIALIZED) {
-                       sx_dprintk (SX_DEBUG_CLEANUP, "Cleaning up board at %p\n", board->base);
-                       /* The board should stop messing with us.
-                          (actually I mean the interrupt) */
-                       sx_reset (board);
-                       if ((board->irq) && (board->flags & SX_IRQ_ALLOCATED))
-                               free_irq (board->irq, board);
 
-                       /* It is safe/allowed to del_timer a non-active timer */
-                       del_timer (& board->timer);
-                       iounmap(board->base);
-               }
-       }
+       for (i = 0; i < SX_NBOARDS; i++)
+               sx_remove_card(&boards[i]);
+
        if (misc_deregister(&sx_fw_device) < 0) {
                printk (KERN_INFO "sx: couldn't deregister firmware loader device\n");
        }