On Wed, Feb 26, 2025 at 02:44:12PM -0500, Mark Pearson wrote: > Issue is seen on some Lenovo desktop workstations where there > is a false IRP event which triggers a link flap. > Condition is rare and only seen on networks where link speed > may differ along the path between nodes (e.g 10M/100M) > > Intel are not able to determine root cause but provided a > workaround that does fix the issue. Tested extensively at Lenovo. > > Adding a module option to enable this workaround for users > who are impacted by this issue.
Why is a module option needed? Does the workaround itself introduce issues? Please describe those issues? In general, module options are not liked. So please include in the commit message why a module option is the only option. > Signed-off-by: Mark Pearson <[email protected]> > --- > drivers/net/ethernet/intel/e1000e/netdev.c | 19 +++++++++++++++++++ > 1 file changed, 19 insertions(+) > > diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c > b/drivers/net/ethernet/intel/e1000e/netdev.c > index 286155efcedf..06774fb4b2dd 100644 > --- a/drivers/net/ethernet/intel/e1000e/netdev.c > +++ b/drivers/net/ethernet/intel/e1000e/netdev.c > @@ -37,6 +37,10 @@ static int debug = -1; > module_param(debug, int, 0); > MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)"); > > +static int false_irp_workaround; > +module_param(false_irp_workaround, int, 0); > +MODULE_PARM_DESC(false_irp_workaround, "Enable workaround for rare false IRP > event causing link flap"); > + > static const struct e1000_info *e1000_info_tbl[] = { > [board_82571] = &e1000_82571_info, > [board_82572] = &e1000_82572_info, > @@ -1757,6 +1761,21 @@ static irqreturn_t e1000_intr_msi(int __always_unused > irq, void *data) > /* read ICR disables interrupts using IAM */ > if (icr & E1000_ICR_LSC) { > hw->mac.get_link_status = true; > + > + /* > + * False IRP workaround > + * Issue seen on Lenovo P5 and P7 workstations where if there > + * are different link speeds in the network a false IRP event > + * is received, leading to a link flap. > + * Intel unable to determine root cause. This read prevents > + * the issue occurring > + */ > + if (false_irp_workaround) { > + u16 phy_data; > + > + e1e_rphy(hw, PHY_REG(772, 26), &phy_data); Please add some #define for these magic numbers, so we have some idea what PHY register you are actually reading. That in itself might help explain how the workaround actually works. Andrew --- pw-bot: cr
