Important bge(4) diff to test!

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Important bge(4) diff to test!

Robert Nagy
Hello,

The following diff is really important because on some machines
bge(4) gets detached because of ASPM. The following diff is also
in the latest snapshots but you can also compile a kernel with it.
So if you have a bge(4) please update/compile a kernel and get
back to me if it works or fails in some way.

Thank you!

Index: if_bge.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_bge.c,v
retrieving revision 1.303
diff -u -r1.303 if_bge.c
--- if_bge.c 20 Sep 2010 07:40:38 -0000 1.303
+++ if_bge.c 15 Feb 2011 09:02:07 -0000
@@ -1794,7 +1794,7 @@
  struct pci_attach_args *pa = aux;
  pci_chipset_tag_t pc = pa->pa_pc;
  const struct bge_revision *br;
- pcireg_t pm_ctl, memtype, subid;
+ pcireg_t pm_ctl, memtype, subid, reg;
  pci_intr_handle_t ih;
  const char *intrstr = NULL;
  bus_size_t size;
@@ -1885,7 +1885,13 @@
  * PCI Express or PCI-X controller check.
  */
  if (pci_get_capability(pa->pa_pc, pa->pa_tag, PCI_CAP_PCIEXPRESS,
-    NULL, NULL) != 0) {
+    &sc->bge_aspm_off, NULL) != 0) {
+ /* Disable PCIe Active State Power Management (ASPM). */
+ reg = pci_conf_read(pa->pa_pc, pa->pa_tag,
+    sc->bge_aspm_off + PCI_PCIE_LCSR);
+ reg &= ~(PCI_PCIE_LCSR_ASPM_L0S | PCI_PCIE_LCSR_ASPM_L1);
+ pci_conf_write(pa->pa_pc, pa->pa_tag,
+    sc->bge_aspm_off + PCI_PCIE_LCSR, reg);
  sc->bge_flags |= BGE_PCIE;
  } else {
  if ((pci_conf_read(pa->pa_pc, pa->pa_tag, BGE_PCI_PCISTATE) &
Index: if_bgereg.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_bgereg.h,v
retrieving revision 1.103
diff -u -r1.103 if_bgereg.h
--- if_bgereg.h 20 Sep 2010 07:40:38 -0000 1.103
+++ if_bgereg.h 15 Feb 2011 09:02:07 -0000
@@ -2610,6 +2610,7 @@
 #define BGE_5714_FAMILY 0x01000000
 #define BGE_5700_FAMILY 0x02000000
 
+ int bge_aspm_off;
  bus_dma_tag_t bge_dmatag;
  u_int32_t bge_chipid;
  struct bge_ring_data *bge_rdata; /* rings */