diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/net/r8169.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index c8fa9b1b2290..7438049ca6d8 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
| @@ -225,6 +225,7 @@ MODULE_DEVICE_TABLE(pci, rtl8169_pci_tbl); | |||
| 225 | 225 | ||
| 226 | static int rx_copybreak = 200; | 226 | static int rx_copybreak = 200; |
| 227 | static int use_dac; | 227 | static int use_dac; |
| 228 | static int ignore_parity_err; | ||
| 228 | static struct { | 229 | static struct { |
| 229 | u32 msg_enable; | 230 | u32 msg_enable; |
| 230 | } debug = { -1 }; | 231 | } debug = { -1 }; |
| @@ -469,6 +470,8 @@ module_param(use_dac, int, 0); | |||
| 469 | MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot."); | 470 | MODULE_PARM_DESC(use_dac, "Enable PCI DAC. Unsafe on 32 bit PCI slot."); |
| 470 | module_param_named(debug, debug.msg_enable, int, 0); | 471 | module_param_named(debug, debug.msg_enable, int, 0); |
| 471 | MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)"); | 472 | MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)"); |
| 473 | module_param_named(ignore_parity_err, ignore_parity_err, bool, 0); | ||
| 474 | MODULE_PARM_DESC(ignore_parity_err, "Ignore PCI parity error as target. Default: false"); | ||
| 472 | MODULE_LICENSE("GPL"); | 475 | MODULE_LICENSE("GPL"); |
| 473 | MODULE_VERSION(RTL8169_VERSION); | 476 | MODULE_VERSION(RTL8169_VERSION); |
| 474 | 477 | ||
| @@ -2380,12 +2383,17 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev) | |||
| 2380 | /* | 2383 | /* |
| 2381 | * The recovery sequence below admits a very elaborated explanation: | 2384 | * The recovery sequence below admits a very elaborated explanation: |
| 2382 | * - it seems to work; | 2385 | * - it seems to work; |
| 2383 | * - I did not see what else could be done. | 2386 | * - I did not see what else could be done; |
| 2387 | * - it makes iop3xx happy. | ||
| 2384 | * | 2388 | * |
| 2385 | * Feel free to adjust to your needs. | 2389 | * Feel free to adjust to your needs. |
| 2386 | */ | 2390 | */ |
| 2387 | pci_write_config_word(pdev, PCI_COMMAND, | 2391 | if (ignore_parity_err) |
| 2388 | pci_cmd | PCI_COMMAND_SERR | PCI_COMMAND_PARITY); | 2392 | pci_cmd &= ~PCI_COMMAND_PARITY; |
| 2393 | else | ||
| 2394 | pci_cmd |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY; | ||
| 2395 | |||
| 2396 | pci_write_config_word(pdev, PCI_COMMAND, pci_cmd); | ||
| 2389 | 2397 | ||
| 2390 | pci_write_config_word(pdev, PCI_STATUS, | 2398 | pci_write_config_word(pdev, PCI_STATUS, |
| 2391 | pci_status & (PCI_STATUS_DETECTED_PARITY | | 2399 | pci_status & (PCI_STATUS_DETECTED_PARITY | |
| @@ -2399,10 +2407,11 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev) | |||
| 2399 | tp->cp_cmd &= ~PCIDAC; | 2407 | tp->cp_cmd &= ~PCIDAC; |
| 2400 | RTL_W16(CPlusCmd, tp->cp_cmd); | 2408 | RTL_W16(CPlusCmd, tp->cp_cmd); |
| 2401 | dev->features &= ~NETIF_F_HIGHDMA; | 2409 | dev->features &= ~NETIF_F_HIGHDMA; |
| 2402 | rtl8169_schedule_work(dev, rtl8169_reinit_task); | ||
| 2403 | } | 2410 | } |
| 2404 | 2411 | ||
| 2405 | rtl8169_hw_reset(ioaddr); | 2412 | rtl8169_hw_reset(ioaddr); |
| 2413 | |||
| 2414 | rtl8169_schedule_work(dev, rtl8169_reinit_task); | ||
| 2406 | } | 2415 | } |
| 2407 | 2416 | ||
| 2408 | static void | 2417 | static void |
