NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: kern/52818: The wm driver stops working after large traffic



The following reply was made to PR kern/52818; it has been noted by GNATS.

From: Hisashi T Fujinaka <htodd%twofifty.com@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: kern-bug-people%netbsd.org@localhost, gnats-admin%netbsd.org@localhost, netbsd-bugs%netbsd.org@localhost, 
    clare%csel.org@localhost
Subject: Re: kern/52818: The wm driver stops working after large traffic
Date: Mon, 18 Dec 2017 09:14:48 -0800 (PST)

 On Mon, 18 Dec 2017, clare%csel.org@localhost wrote:
 
 > The following reply was made to PR kern/52818; it has been noted by GNATS.
 >
 > From: clare%csel.org@localhost
 > To: gnats-bugs%NetBSD.org@localhost
 > Cc: kern-bug-people%netbsd.org@localhost, gnats-admin%netbsd.org@localhost,
 > netbsd-bugs%netbsd.org@localhost
 > Subject: Re: kern/52818: The wm driver stops working after large traffic
 > Date: Mon, 18 Dec 2017 23:58:48 +0900
 >
 > >  PCIe ASPM is disabled by the BIOS by the default
 > >  in the XCY mini PC.
 > >  Fixing ASPM flag in EEPROM does not effective.
 >
 > The buggy BIOS does not disable ASPM against any setup configuration.
 > the following patch workarounds the bug of the device, and
 > regains network stability of my device.
 >
 > Index: if_wm.c
 > ===================================================================
 > RCS file: /export/cvsroot/netbsd/src/sys/dev/pci/if_wm.c,v
 > retrieving revision 1.549
 > diff -u -r1.549 if_wm.c
 > --- if_wm.c     8 Dec 2017 05:22:23 -0000       1.549
 > +++ if_wm.c     18 Dec 2017 14:08:56 -0000
 > @@ -1851,6 +1851,35 @@
 >
 >         wm_adjust_qnum(sc, pci_msix_count(pa->pa_pc, pa->pa_tag));
 >
 > +       /*
 > +        * XXX this is quick hack, please cleanup before commit.
 > +        *
 > +        * The 82583 does not support PCIe ASPM.
 > +        * We should always disable PCIe ASPM on the device.
 > +        */
 > +       if (sc->sc_type == WM_T_82583) {
 > +               int ok;
 > +               int capoff;
 > +
 > +               ok = pci_get_capability(pc, pa->pa_tag,
 > +                   PCI_CAP_PCIEXPRESS, &capoff, NULL);
 > +               if (!ok) {
 > +                       printf("XXX: I'm not on PCIe bus.\n");
 > +                       goto skip_disable_aspm;
 > +               }
 > +               reg = pci_conf_read(pc, pa->pa_tag, capoff + PCIE_LCAP);
 > +               if ((reg & PCIE_LCAP_ASPM) == 0) {
 > +                       printf("XXX: ASPM was disabled.\n");
 > +                       goto skip_disable_aspm;
 > +               }
 > +               printf("XXX: disabling ASPM now.\n");
 > +               reg = pci_conf_read(pc, pa->pa_tag, capoff + PCIE_LCSR);
 > +               reg &= ~PCIE_LCSR_ASPM_L1;
 > +               reg &= ~PCIE_LCSR_ASPM_L0S;
 > +               pci_conf_write(pc, pa->pa_tag, capoff + PCIE_LCSR, reg);
 > +       skip_disable_aspm:;
 > +       }
 > +
 >         /* Allocation settings */
 >         max_type = PCI_INTR_TYPE_MSIX;
 >         /*
 > ===================================================================
 >
 > the i82583 specification update says ASPM L0s should be disabled
 > on some chipset.
 >
 > the FreeBSD kernel disables ASPM as following case:
 >
 >         switch (adapter->hw.mac.type) {
 >                 case e1000_82573:
 >                 case e1000_82574:
 >                 case e1000_82583:
 >                         break;
 >                 default:
 >                         return;
 >         }
 
 ASPM needs to be negotiated on the PCIe link and really should be turned
 off in the BIOS.
 
 For the workaround I would suggest that you don't differentiate between
 the 82583 and the 82574 (do the same thing for both).
 
 -- 
 Hisashi T Fujinaka - htodd%twofifty.com@localhost
 BSEE + BSChem + BAEnglish + MSCS + $2.50 = coffee
 


Home | Main Index | Thread Index | Old Index