Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d03902b8 authored by Francois Romieu's avatar Francois Romieu Committed by Francois Romieu
Browse files

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: default avatarFrancois Romieu <romieu@fr.zoreil.com>
parent 9cb427b6
Loading
Loading
Loading
Loading
+13 −4
Original line number Original line Diff line number Diff line
@@ -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