struct pci_dev          *dev;
        unsigned int            nr;
        struct pci_serial_quirk *quirk;
+       const struct pciserial_board *board;
        int                     line[0];
 };
 
                }
        }
        priv->nr = i;
+       priv->board = board;
        return priv;
 
 err_deinit:
 }
 EXPORT_SYMBOL_GPL(pciserial_init_ports);
 
-void pciserial_remove_ports(struct serial_private *priv)
+void pciserial_detach_ports(struct serial_private *priv)
 {
        struct pci_serial_quirk *quirk;
        int i;
        quirk = find_quirk(priv->dev);
        if (quirk->exit)
                quirk->exit(priv->dev);
+}
 
+void pciserial_remove_ports(struct serial_private *priv)
+{
+       pciserial_detach_ports(priv);
        kfree(priv);
 }
 EXPORT_SYMBOL_GPL(pciserial_remove_ports);
                return PCI_ERS_RESULT_DISCONNECT;
 
        if (priv)
-               pciserial_suspend_ports(priv);
+               pciserial_detach_ports(priv);
 
        pci_disable_device(dev);
 
 static void serial8250_io_resume(struct pci_dev *dev)
 {
        struct serial_private *priv = pci_get_drvdata(dev);
+       const struct pciserial_board *board;
 
-       if (priv)
-               pciserial_resume_ports(priv);
+       if (!priv)
+               return;
+
+       board = priv->board;
+       kfree(priv);
+       priv = pciserial_init_ports(dev, board);
+
+       if (!IS_ERR(priv)) {
+               pci_set_drvdata(dev, priv);
+       }
 }
 
 static const struct pci_error_handlers serial8250_err_handler = {