Module Name:    src
Committed By:   christos
Date:           Wed Apr 27 19:47:25 UTC 2016

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

Log Message:
Sync with OpenBSD (add rt2860). Handle 32/64 memory bars,
some power management, more device matches.


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/sys/dev/pci/if_ral_pci.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_ral_pci.c
diff -u src/sys/dev/pci/if_ral_pci.c:1.21 src/sys/dev/pci/if_ral_pci.c:1.22
--- src/sys/dev/pci/if_ral_pci.c:1.21	Sat Mar 29 15:28:25 2014
+++ src/sys/dev/pci/if_ral_pci.c	Wed Apr 27 15:47:25 2016
@@ -1,9 +1,8 @@
-/*	$NetBSD: if_ral_pci.c,v 1.21 2014/03/29 19:28:25 christos Exp $	*/
-/*	$OpenBSD: if_ral_pci.c,v 1.6 2006/01/09 20:03:43 damien Exp $  */
+/*	$NetBSD: if_ral_pci.c,v 1.22 2016/04/27 19:47:25 christos Exp $	*/
+/*	$OpenBSD: if_ral_pci.c,v 1.24 2015/11/24 17:11:39 mpi Exp $  */
 
 /*-
- * Copyright (c) 2005, 2006
- *	Damien Bergamini <damien.bergam...@free.fr>
+ * Copyright (c) 2005-2010 Damien Bergamini <damien.bergam...@free.fr>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -19,10 +18,10 @@
  */
 
 /*
- * PCI front-end for the Ralink RT2560/RT2561/RT2561S/RT2661 driver.
+ * PCI front-end for the Ralink RT2560/RT2561/RT2860/RT3090 driver.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ral_pci.c,v 1.21 2014/03/29 19:28:25 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ral_pci.c,v 1.22 2016/04/27 19:47:25 christos Exp $");
 
 
 #include <sys/param.h>
@@ -51,31 +50,56 @@ __KERNEL_RCSID(0, "$NetBSD: if_ral_pci.c
 
 #include <dev/ic/rt2560var.h>
 #include <dev/ic/rt2661var.h>
+#include <dev/ic/rt2860var.h>
 
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcidevs.h>
 
+#define RAL_POWER_MANAGEMENT 0	/* Disabled for now */
+
 static struct ral_opns {
 	int	(*attach)(void *, int);
 	int	(*detach)(void *);
+#if RAL_POWER_MANAGEMENT
+	void	(*suspend)(void *);
+	void	(*wakeup)(void *);
+#endif
 	int	(*intr)(void *);
 
 }  ral_rt2560_opns = {
 	rt2560_attach,
 	rt2560_detach,
+#if RAL_POWER_MANAGEMENT
+	rt2560_suspend,
+	rt2560_wakeup,
+#endif
 	rt2560_intr
 
 }, ral_rt2661_opns = {
 	rt2661_attach,
 	rt2661_detach,
+#if RAL_POWER_MANAGEMENT
+	rt2661_suspend,
+	rt2661_wakeup,
+#endif
 	rt2661_intr
+
+}, ral_rt2860_opns = {
+	rt2860_attach,
+	rt2860_detach,
+#if RAL_POWER_MANAGEMENT
+	rt2860_suspend,
+	rt2860_wakeup,
+#endif
+	rt2860_intr
 };
 
 struct ral_pci_softc {
 	union {
 		struct rt2560_softc	sc_rt2560;
 		struct rt2661_softc	sc_rt2661;
+		struct rt2860_softc	sc_rt2860;
 	} u;
 #define sc_sc	u.sc_rt2560
 
@@ -92,9 +116,45 @@ struct ral_pci_softc {
 int	ral_pci_match(device_t, cfdata_t, void *);
 void	ral_pci_attach(device_t, device_t, void *);
 int	ral_pci_detach(device_t, int);
+#if RAL_POWER_MANAGEMENT
+int	ral_pci_activate(struct device *, devact_t);
+void	ral_pci_wakeup(struct ral_pci_softc *);
+#else
+#define ral_pci_activate NULL
+#endif
 
 CFATTACH_DECL_NEW(ral_pci, sizeof (struct ral_pci_softc),
-	ral_pci_match, ral_pci_attach, ral_pci_detach, NULL);
+	ral_pci_match, ral_pci_attach, ral_pci_detach, ral_pci_activate);
+
+static const struct ral_pci_matchid {
+	pci_vendor_id_t         ral_vendor;
+	pci_product_id_t        ral_product;
+} ral_pci_devices[] = {
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2560 },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2561 },
+ 	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2561S },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2661 },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2860 },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2890 },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2760 },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT2790 },
+	{ PCI_VENDOR_AWT,    PCI_PRODUCT_AWT_RT2890 },
+	{ PCI_VENDOR_EDIMAX, PCI_PRODUCT_EDIMAX_RT2860_1 },
+	{ PCI_VENDOR_EDIMAX, PCI_PRODUCT_EDIMAX_RT2860_2 },
+	{ PCI_VENDOR_EDIMAX, PCI_PRODUCT_EDIMAX_RT2860_3 },
+	{ PCI_VENDOR_EDIMAX, PCI_PRODUCT_EDIMAX_RT2860_4 },
+	{ PCI_VENDOR_EDIMAX, PCI_PRODUCT_EDIMAX_RT2860_5 },
+	{ PCI_VENDOR_EDIMAX, PCI_PRODUCT_EDIMAX_RT2860_6 },
+	{ PCI_VENDOR_EDIMAX, PCI_PRODUCT_EDIMAX_RT2860_7 },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT3060 },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT3062 },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT3090 },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT3091 },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT3092 },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT3562 },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT3592 },
+	{ PCI_VENDOR_RALINK, PCI_PRODUCT_RALINK_RT3593 }
+};
 
 int
 ral_pci_match(device_t parent, cfdata_t cfdata,
@@ -102,16 +162,11 @@ ral_pci_match(device_t parent, cfdata_t 
 {
 	struct pci_attach_args *pa = aux;
 
-	if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_RALINK) {
-		switch (PCI_PRODUCT(pa->pa_id)) {
-			case PCI_PRODUCT_RALINK_RT2560:
-			case PCI_PRODUCT_RALINK_RT2561:
-			case PCI_PRODUCT_RALINK_RT2561S:
-			case PCI_PRODUCT_RALINK_RT2661:
-				return 1;
-			default:
-				return 0;
-		}
+	for (size_t i = 0; i < __arraycount(ral_pci_devices); i++) {
+		const struct ral_pci_matchid *ral = &ral_pci_devices[i];
+		if (PCI_VENDOR(pa->pa_id) == ral->ral_vendor &&
+		    PCI_PRODUCT(pa->pa_id) == ral->ral_product)
+			return 1;
 	}
 
 	return 0;
@@ -126,14 +181,30 @@ ral_pci_attach(device_t parent, device_t
 	const char *intrstr;
 	bus_addr_t base;
 	pci_intr_handle_t ih;
-	pcireg_t reg;
+	pcireg_t memtype, reg;
 	int error;
 	char intrbuf[PCI_INTRSTR_LEN];
 
 	pci_aprint_devinfo(pa, NULL);
 
-	psc->sc_opns = (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_RALINK_RT2560) ?
-	    &ral_rt2560_opns : &ral_rt2661_opns;
+	if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_RALINK) {
+		switch (PCI_PRODUCT(pa->pa_id)) {
+		case PCI_PRODUCT_RALINK_RT2560:
+			psc->sc_opns = &ral_rt2560_opns;
+			break;
+		case PCI_PRODUCT_RALINK_RT2561:
+		case PCI_PRODUCT_RALINK_RT2561S:
+		case PCI_PRODUCT_RALINK_RT2661:
+			psc->sc_opns = &ral_rt2661_opns;
+			break;
+		default:
+			psc->sc_opns = &ral_rt2860_opns;
+			break;
+		}
+	} else {
+		/* all other vendors are RT2860 only */
+		psc->sc_opns = &ral_rt2860_opns;
+	}
 
 	sc->sc_dev = self;
 	sc->sc_dmat = pa->pa_dmat;
@@ -145,9 +216,9 @@ ral_pci_attach(device_t parent, device_t
 	pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_COMMAND_STATUS_REG, reg);
 
 	/* map control/status registers */
-	error = pci_mapreg_map(pa, RAL_PCI_BAR0, PCI_MAPREG_TYPE_MEM |
-	    PCI_MAPREG_MEM_TYPE_32BIT, 0, &sc->sc_st, &sc->sc_sh, &base,
-	    &psc->sc_mapsize);
+	memtype = pci_mapreg_type(pa->pa_pc, pa->pa_tag, RAL_PCI_BAR0);
+	error = pci_mapreg_map(pa, RAL_PCI_BAR0, memtype, 0, &sc->sc_st,
+	    &sc->sc_sh, &base, &psc->sc_mapsize);
 
 	if (error != 0) {
 		aprint_error(": could not map memory space\n");
@@ -180,10 +251,48 @@ ral_pci_detach(device_t self, int flags)
 {
 	struct ral_pci_softc *psc = device_private(self);
 	struct rt2560_softc *sc = &psc->sc_sc;
+	int error;
+
+	if (psc->sc_ih != NULL) {
+		pci_intr_disestablish(psc->sc_pc, psc->sc_ih);
+
+		error = (*psc->sc_opns->detach)(sc);
+		if (error != 0)
+			return error;
+	}
+
+	if (psc->sc_mapsize > 0)
+		bus_space_unmap(sc->sc_st, sc->sc_sh, psc->sc_mapsize);
 
-	(*psc->sc_opns->detach)(sc);
-	pci_intr_disestablish(psc->sc_pc, psc->sc_ih);
+	return 0;
+}
+
+#if RAL_POWER_MANAGEMENT
+int
+ral_pci_activate(struct device *self, devact_t act)
+{
+	struct ral_pci_softc *psc = (struct ral_pci_softc *)self;
+	struct rt2560_softc *sc = &psc->sc_sc;
 
+	switch (act) {
+	case DVACT_SUSPEND:
+		(*psc->sc_opns->suspend)(sc);
+		break;
+	case DVACT_WAKEUP:
+		ral_pci_wakeup(psc);
+		break;
+	}
 	return 0;
 }
 
+void
+ral_pci_wakeup(struct ral_pci_softc *psc)
+{
+	struct rt2560_softc *sc = &psc->sc_sc;
+	int s;
+
+	s = splnet();
+	(*psc->sc_opns->wakeup)(sc);
+	splx(s);
+}
+#endif

Reply via email to