summaryrefslogtreecommitdiff
path: root/sys/dev/pci/if_bge.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/pci/if_bge.c')
-rw-r--r--sys/dev/pci/if_bge.c45
1 files changed, 29 insertions, 16 deletions
diff --git a/sys/dev/pci/if_bge.c b/sys/dev/pci/if_bge.c
index acc0aba03a7..f0c579d546c 100644
--- a/sys/dev/pci/if_bge.c
+++ b/sys/dev/pci/if_bge.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_bge.c,v 1.178 2006/09/17 17:20:42 brad Exp $ */
+/* $OpenBSD: if_bge.c,v 1.179 2006/09/17 22:19:37 brad Exp $ */
/*
* Copyright (c) 2001 Wind River Systems
@@ -1647,7 +1647,7 @@ bge_attach(struct device *parent, struct device *self, void *aux)
struct pci_attach_args *pa = aux;
pci_chipset_tag_t pc = pa->pa_pc;
const struct bge_revision *br;
- pcireg_t pm_ctl, memtype;
+ pcireg_t pm_ctl, memtype, subid;
pci_intr_handle_t ih;
const char *intrstr = NULL;
bus_size_t size;
@@ -1663,6 +1663,8 @@ bge_attach(struct device *parent, struct device *self, void *aux)
sc->bge_pa = *pa;
+ subid = pci_conf_read(pc, pa->pa_tag, PCI_SUBSYS_ID_REG);
+
/*
* Map control/status registers.
*/
@@ -1747,6 +1749,28 @@ bge_attach(struct device *parent, struct device *self, void *aux)
}
#endif
+ /*
+ * When using the BCM5701 in PCI-X mode, data corruption has
+ * been observed in the first few bytes of some received packets.
+ * Aligning the packet buffer in memory eliminates the corruption.
+ * Unfortunately, this misaligns the packet payloads. On platforms
+ * which do not support unaligned accesses, we will realign the
+ * payloads by copying the received packets.
+ */
+ sc->bge_rx_alignment_bug = 0;
+ if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5701 && sc->bge_pcix)
+ sc->bge_rx_alignment_bug = 1;
+
+ sc->bge_jumbo_cap = 0;
+ if (BGE_IS_JUMBO_CAPABLE(sc))
+ sc->bge_jumbo_cap = 1;
+
+ sc->bge_no_3_led = 0;
+ if ((BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5700 ||
+ BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5701) &&
+ PCI_VENDOR(subid) == DELL_VENDORID)
+ sc->bge_no_3_led = 1;
+
/* Try to reset the chip. */
DPRINTFN(5, ("bge_reset\n"));
bge_reset(sc);
@@ -1895,13 +1919,13 @@ bge_attach(struct device *parent, struct device *self, void *aux)
}
hwcfg = ntohl(hwcfg);
}
-
+
+ sc->bge_tbi = 0;
if ((hwcfg & BGE_HWCFG_MEDIA) == BGE_MEDIA_FIBER)
sc->bge_tbi = 1;
/* The SysKonnect SK-9D41 is a 1000baseSX card. */
- if ((pci_conf_read(pc, pa->pa_tag, BGE_PCI_SUBSYS) >> 16) ==
- SK_SUBSYSID_9D41)
+ if (PCI_PRODUCT(subid) == SK_SUBSYSID_9D41)
sc->bge_tbi = 1;
/* Hookup IRQ last. */
@@ -1952,17 +1976,6 @@ bge_attach(struct device *parent, struct device *self, void *aux)
}
/*
- * When using the BCM5701 in PCI-X mode, data corruption has
- * been observed in the first few bytes of some received packets.
- * Aligning the packet buffer in memory eliminates the corruption.
- * Unfortunately, this misaligns the packet payloads. On platforms
- * which do not support unaligned accesses, we will realign the
- * payloads by copying the received packets.
- */
- if (BGE_ASICREV(sc->bge_chipid) == BGE_ASICREV_BCM5701 && sc->bge_pcix)
- sc->bge_rx_alignment_bug = 1;
-
- /*
* Call MI attach routine.
*/
if_attach(ifp);