Module Name:    src
Committed By:   pgoyette
Date:           Wed Jun  1 11:28:45 UTC 2016

Modified Files:
        src/sys/dev/pci: if_dge.c

Log Message:
Add support for Intel 82597EX_SR - from PR kern/47750


To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/sys/dev/pci/if_dge.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/if_dge.c
diff -u src/sys/dev/pci/if_dge.c:1.41 src/sys/dev/pci/if_dge.c:1.42
--- src/sys/dev/pci/if_dge.c:1.41	Tue Feb  9 08:32:11 2016
+++ src/sys/dev/pci/if_dge.c	Wed Jun  1 11:28:45 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_dge.c,v 1.41 2016/02/09 08:32:11 ozaki-r Exp $ */
+/*	$NetBSD: if_dge.c,v 1.42 2016/06/01 11:28:45 pgoyette Exp $ */
 
 /*
  * Copyright (c) 2004, SUNET, Swedish University Computer Network.
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_dge.c,v 1.41 2016/02/09 08:32:11 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_dge.c,v 1.42 2016/06/01 11:28:45 pgoyette Exp $");
 
 
 
@@ -256,6 +256,7 @@ struct dge_softc {
 	int sc_bus_speed;		/* PCI/PCIX bus speed */
 	int sc_pcix_offset;		/* PCIX capability register offset */
 
+	const struct dge_product *sc_dgep; /* Pointer to the dge_product entry */
 	pci_chipset_tag_t sc_pc;
 	pcitag_t sc_pt;
 	int sc_mmrbc;			/* Max PCIX memory read byte count */
@@ -643,13 +644,49 @@ CFATTACH_DECL_NEW(dge, sizeof(struct dge
 static char (*dge_txseg_evcnt_names)[DGE_NTXSEGS][8 /* "txseg00" + \0 */];
 #endif /* DGE_EVENT_COUNTERS */
 
+/*
+ * Devices supported by this driver.
+ */
+static const struct dge_product {
+  pci_vendor_id_t      dgep_vendor;
+  pci_product_id_t  dgep_product;
+  const char     *dgep_name;
+  int         dgep_flags;
+#define DGEP_F_10G_LR     0x01
+#define DGEP_F_10G_SR     0x02
+} dge_products[] = {
+  { PCI_VENDOR_INTEL,  PCI_PRODUCT_INTEL_82597EX,
+    "Intel i82597EX 10GbE-LR Ethernet",
+    DGEP_F_10G_LR },
+
+  { PCI_VENDOR_INTEL,  PCI_PRODUCT_INTEL_82597EX_SR,
+    "Intel i82597EX 10GbE-SR Ethernet",
+    DGEP_F_10G_SR },
+
+  { 0,        0,
+    NULL,
+    0 },
+};
+
+static const struct dge_product *
+dge_lookup(const struct pci_attach_args *pa)
+{
+	const struct dge_product *dgep;
+
+	for (dgep = dge_products; dgep->dgep_name != NULL; dgep++) {
+		if (PCI_VENDOR(pa->pa_id) == dgep->dgep_vendor &&
+		    PCI_PRODUCT(pa->pa_id) == dgep->dgep_product)
+			return dgep;
+		}
+	return NULL;
+}
+
 static int
 dge_match(device_t parent, cfdata_t cf, void *aux)
 {
 	struct pci_attach_args *pa = aux;
 
-	if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL &&
-	    PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_82597EX)
+	if (dga_lookup(pa) != NULL)
 		return (1);
 
 	return (0);
@@ -670,6 +707,13 @@ dge_attach(device_t parent, device_t sel
 	pcireg_t preg, memtype;
 	uint32_t reg;
 	char intrbuf[PCI_INTRSTR_LEN];
+	const struct dge_product *dgep;
+
+	sc->sc_dgep = dgep = dge_lookup(pa);
+	if (dgep == NULL) {
+		printf("\n");
+		panic("dge_attach: impossible");
+	}
 
 	sc->sc_dev = self;
 	sc->sc_dmat = pa->pa_dmat;
@@ -677,7 +721,7 @@ dge_attach(device_t parent, device_t sel
 	sc->sc_pt = pa->pa_tag;
 
 	pci_aprint_devinfo_fancy(pa, "Ethernet controller",
-		"Intel i82597EX 10GbE-LR Ethernet", 1);
+		dgep->dgep_name, 1);
 
 	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, DGE_PCI_BAR);
         if (pci_mapreg_map(pa, DGE_PCI_BAR, memtype, 0,
@@ -863,8 +907,13 @@ dge_attach(device_t parent, device_t sel
 	 */
         ifmedia_init(&sc->sc_media, IFM_IMASK, dge_xgmii_mediachange,
             dge_xgmii_mediastatus);
-        ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_10G_LR, 0, NULL);
-        ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_10G_LR);
+	if (dgep->dgep_flags & DGEP_F_10G_SR) {
+		ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_10G_SR, 0, NULL);
+		ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_10G_SR);
+	} else { /* XXX default is LR */
+		ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_10G_LR, 0, NULL);
+		ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_10G_LR);
+	}
 
 	ifp = &sc->sc_ethercom.ec_if;
 	strlcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
@@ -2358,7 +2407,11 @@ dge_xgmii_mediastatus(struct ifnet *ifp,
 	struct dge_softc *sc = ifp->if_softc;
 
 	ifmr->ifm_status = IFM_AVALID;
-	ifmr->ifm_active = IFM_ETHER|IFM_10G_LR;
+	if (sc->sc_dgep->dgep_flags & DGEP_F_10G_SR ) {
+		ifmr->ifm_active = IFM_ETHER|IFM_10G_SR;
+	} else {
+		ifmr->ifm_active = IFM_ETHER|IFM_10G_LR;
+	}
 
 	if (CSR_READ(sc, DGE_STATUS) & STATUS_LINKUP)
 		ifmr->ifm_status |= IFM_ACTIVE;

Reply via email to