|
@@ -225,6 +225,7 @@ MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
|
|
|
|
|
|
static int rx_copybreak = 200;
|
|
|
static int use_dac;
|
|
|
+static int ignore_parity_err;
|
|
|
static struct {
|
|
|
u32 msg_enable;
|
|
|
} debug = { -1 };
|
|
@@ -469,6 +470,8 @@ module_param(use_dac, int, 0);
|
|
|
MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
|
|
|
module_param_named(debug, debug.msg_enable, int, 0);
|
|
|
MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
|
|
|
+module_param_named(ignore_parity_err, ignore_parity_err, bool, 0);
|
|
|
+MODULE_PARM_DESC(ignore_parity_err, "Ignore PCI parity error as target. Default: false");
|
|
|
MODULE_LICENSE("GPL");
|
|
|
MODULE_VERSION(RTL8169_VERSION);
|
|
|
|
|
@@ -2380,12 +2383,17 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev)
|
|
|
/*
|
|
|
* The recovery sequence below admits a very elaborated explanation:
|
|
|
* - it seems to work;
|
|
|
- * - I did not see what else could be done.
|
|
|
+ * - I did not see what else could be done;
|
|
|
+ * - it makes iop3xx happy.
|
|
|
*
|
|
|
* Feel free to adjust to your needs.
|
|
|
*/
|
|
|
- pci_write_config_word(pdev, PCI_COMMAND,
|
|
|
- pci_cmd | PCI_COMMAND_SERR | PCI_COMMAND_PARITY);
|
|
|
+ if (ignore_parity_err)
|
|
|
+ pci_cmd &= ~PCI_COMMAND_PARITY;
|
|
|
+ else
|
|
|
+ pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY;
|
|
|
+
|
|
|
+ pci_write_config_word(pdev, PCI_COMMAND, pci_cmd);
|
|
|
|
|
|
pci_write_config_word(pdev, PCI_STATUS,
|
|
|
pci_status & (PCI_STATUS_DETECTED_PARITY |
|
|
@@ -2399,10 +2407,11 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev)
|
|
|
tp->cp_cmd &= ~PCIDAC;
|
|
|
RTL_W16(CPlusCmd, tp->cp_cmd);
|
|
|
dev->features &= ~NETIF_F_HIGHDMA;
|
|
|
- rtl8169_schedule_work(dev, rtl8169_reinit_task);
|
|
|
}
|
|
|
|
|
|
rtl8169_hw_reset(ioaddr);
|
|
|
+
|
|
|
+ rtl8169_schedule_work(dev, rtl8169_reinit_task);
|
|
|
}
|
|
|
|
|
|
static void
|