mirror of
https://github.com/adulau/aha.git
synced 2024-12-30 12:46:17 +00:00
r8169: tweak the PCI data parity error recovery
The 8110SB based n2100 board signals a lot of what ought to be PCI data parity errors durint operation of the 8169 as target. Experiment proved that the driver can ignore the error and process the packet as if nothing had happened. Let's add an ad-hoc knob to enable users to fix their system while avoiding the risks of a wholesale change. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
This commit is contained in:
parent
9cb427b6ff
commit
d03902b886
1 changed files with 13 additions and 4 deletions
|
@ -225,6 +225,7 @@ MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl);
|
||||||
|
|
||||||
static int rx_copybreak = 200;
|
static int rx_copybreak = 200;
|
||||||
static int use_dac;
|
static int use_dac;
|
||||||
|
static int ignore_parity_err;
|
||||||
static struct {
|
static struct {
|
||||||
u32 msg_enable;
|
u32 msg_enable;
|
||||||
} debug = { -1 };
|
} 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_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot.");
|
||||||
module_param_named(debug, debug.msg_enable, int, 0);
|
module_param_named(debug, debug.msg_enable, int, 0);
|
||||||
MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
|
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_LICENSE("GPL");
|
||||||
MODULE_VERSION(RTL8169_VERSION);
|
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:
|
* The recovery sequence below admits a very elaborated explanation:
|
||||||
* - it seems to work;
|
* - 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.
|
* Feel free to adjust to your needs.
|
||||||
*/
|
*/
|
||||||
pci_write_config_word(pdev, PCI_COMMAND,
|
if (ignore_parity_err)
|
||||||
pci_cmd | PCI_COMMAND_SERR | PCI_COMMAND_PARITY);
|
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_write_config_word(pdev, PCI_STATUS,
|
||||||
pci_status & (PCI_STATUS_DETECTED_PARITY |
|
pci_status & (PCI_STATUS_DETECTED_PARITY |
|
||||||
|
@ -2399,10 +2407,11 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev)
|
||||||
tp->cp_cmd &= ~PCIDAC;
|
tp->cp_cmd &= ~PCIDAC;
|
||||||
RTL_W16(CPlusCmd, tp->cp_cmd);
|
RTL_W16(CPlusCmd, tp->cp_cmd);
|
||||||
dev->features &= ~NETIF_F_HIGHDMA;
|
dev->features &= ~NETIF_F_HIGHDMA;
|
||||||
rtl8169_schedule_work(dev, rtl8169_reinit_task);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rtl8169_hw_reset(ioaddr);
|
rtl8169_hw_reset(ioaddr);
|
||||||
|
|
||||||
|
rtl8169_schedule_work(dev, rtl8169_reinit_task);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in a new issue