PERFORCE change 127754 for review

Kevin Lo kevlo at FreeBSD.org
Fri Oct 19 02:18:35 PDT 2007


http://perforce.freebsd.org/chv.cgi?CH=127754

Change 127754 by kevlo at kevlo_rtsl on 2007/10/19 09:18:18

	Add LEDs support. Tested on my cardbus Asus WL-100G.
	Obtained from: DragonflyBSD

Affected files ...

.. //depot/projects/wifi/sys/dev/bwi/if_bwi.c#8 edit
.. //depot/projects/wifi/sys/dev/bwi/if_bwireg.h#3 edit
.. //depot/projects/wifi/sys/dev/bwi/if_bwivar.h#4 edit

Differences ...

==== //depot/projects/wifi/sys/dev/bwi/if_bwi.c#8 (text+ko) ====

@@ -193,6 +193,9 @@
 static void	bwi_regwin_info(struct bwi_softc *, uint16_t *, uint8_t *);
 static int	bwi_regwin_select(struct bwi_softc *, int);
 
+static void	bwi_led_attach(struct bwi_softc *);
+static void	bwi_led_newstate(struct bwi_softc *, enum ieee80211_state);
+
 static const struct {
 	uint16_t	did_min;
 	uint16_t	did_max;
@@ -317,7 +320,7 @@
 
 	bwi_get_card_flags(sc);
 
-	/* TODO: LED */
+	bwi_led_attach(sc);
 
 	for (i = 0; i < sc->sc_nmac; ++i) {
 		struct bwi_regwin *old;
@@ -1531,6 +1534,8 @@
 	callout_stop(&sc->sc_calib_ch);
 	callout_stop(&sc->sc_amrr_ch);
 
+	bwi_led_newstate(sc, nstate);
+
 	if (nstate == IEEE80211_S_INIT)
 		goto back;
 
@@ -3483,6 +3488,109 @@
 	bpf_mtap2(sc->sc_drvbpf, &sc->sc_rx_th, sc->sc_rx_th_len, m);
 }
 
+static void
+bwi_led_attach(struct bwi_softc *sc)
+{
+#define	PCI_VENDOR_COMPAQ 0x0e11
+	const static uint8_t led_default_act[BWI_LED_MAX] = {
+		BWI_LED_ACT_ACTIVE,
+		BWI_LED_ACT_2GHZ,
+		BWI_LED_ACT_5GHZ,
+		BWI_LED_ACT_OFF
+	};
+
+	uint16_t gpio, val[BWI_LED_MAX];
+	int i;
+
+	gpio = bwi_read_sprom(sc, BWI_SPROM_GPIO01);
+	val[0] = __SHIFTOUT(gpio, BWI_SPROM_GPIO_0);
+	val[1] = __SHIFTOUT(gpio, BWI_SPROM_GPIO_1);
+
+	gpio = bwi_read_sprom(sc, BWI_SPROM_GPIO23);
+	val[2] = __SHIFTOUT(gpio, BWI_SPROM_GPIO_2);
+	val[3] = __SHIFTOUT(gpio, BWI_SPROM_GPIO_3);
+
+	for (i = 0; i < BWI_LED_MAX; ++i) {
+		struct bwi_led *led = &sc->sc_leds[i];
+
+		if (val[i] == 0xff) {
+			led->l_act = led_default_act[i];
+			if (i == 0 && sc->sc_pci_subvid == PCI_VENDOR_COMPAQ)
+				led->l_act = BWI_LED_ACT_RFEN;
+		} else {
+			if (val[i] & BWI_LED_ACT_LOW)
+				led->l_flags |= BWI_LED_F_ACTLOW;
+			led->l_act = __SHIFTOUT(val[i], BWI_LED_ACT_MASK);
+		}
+
+		DPRINTF(sc, "%dth led, act %d, lowact %d\n",
+		    i, led->l_act, led->l_flags & BWI_LED_F_ACTLOW);
+	}
+#undef PCI_VENDOR_COMPAQ
+}
+
+static void
+bwi_led_newstate(struct bwi_softc *sc, enum ieee80211_state nstate)
+{
+	struct ieee80211com *ic = &sc->sc_ic;
+	uint16_t val;
+	int i;
+
+	if ((ic->ic_ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+		return;
+
+	val = CSR_READ_2(sc, BWI_MAC_GPIO_CTRL);
+	for (i = 0; i < BWI_LED_MAX; ++i) {
+		struct bwi_led *led = &sc->sc_leds[i];
+		int on;
+
+		if (led->l_act == BWI_LED_ACT_UNKN ||
+		    led->l_act == BWI_LED_ACT_NULL) {
+			/* Don't touch it */
+			continue;
+		}
+
+		switch (led->l_act) {
+		case BWI_LED_ACT_ON:	/* Always on */
+			on = 1;
+			break;
+		case BWI_LED_ACT_OFF:	/* Always off */
+		case BWI_LED_ACT_5GHZ:	/* TODO: 11A */
+		case BWI_LED_ACT_MID:	/* Blinking ones */
+		case BWI_LED_ACT_FAST:
+			on = 0;
+			break;
+		default:
+			on = 1;
+			switch (nstate) {
+			case IEEE80211_S_INIT:
+				on = 0;
+				break;
+			case IEEE80211_S_RUN:
+				if (led->l_act == BWI_LED_ACT_11G &&
+				    ic->ic_curmode != IEEE80211_MODE_11G)
+					on = 0;
+				break;
+			default:
+				if (led->l_act == BWI_LED_ACT_RUN ||
+				    led->l_act == BWI_LED_ACT_ACTIVE)
+					on = 0;
+				break;
+			}
+			break;
+		}
+
+		if (led->l_flags & BWI_LED_F_ACTLOW)
+			on = !on;
+
+		if (on)
+			val |= (1 << i);
+		else
+			val &= ~(1 << i);
+	}
+	CSR_WRITE_2(sc, BWI_MAC_GPIO_CTRL, val);
+}
+
 /*
  * Covert PLCP signal/rate field to net80211 rate (.5Mbits/s)
  */

==== //depot/projects/wifi/sys/dev/bwi/if_bwireg.h#3 (text+ko) ====

@@ -318,6 +318,7 @@
 #define BWI_ADDR_FILTER_BSSID		3
 #define BWI_ADDR_FILTER_DATA		0x422
 
+#define BWI_MAC_GPIO_CTRL		0x49c
 #define BWI_MAC_GPIO_MASK		0x49e
 #define BWI_MAC_PRE_TBTT		0x612
 #define BWI_MAC_SLOTTIME		0x684
@@ -376,6 +377,12 @@
 #define BWI_SPROM_CARD_INFO_LOCALE	__BITS(11, 8)
 #define BWI_SPROM_LOCALE_JAPAN		5
 #define BWI_SPROM_PA_PARAM_11BG		0x5e
+#define BWI_SPROM_GPIO01		0x64
+#define BWI_SPROM_GPIO_0		__BITS(7, 0)
+#define BWI_SPROM_GPIO_1		__BITS(15, 8)
+#define BWI_SPROM_GPIO23		0x66
+#define BWI_SPROM_GPIO_2		__BITS(7, 0)
+#define BWI_SPROM_GPIO_3		__BITS(15, 8)
 #define BWI_SPROM_MAX_TXPWR		0x68
 #define BWI_SPROM_MAX_TXPWR_MASK_11BG	__BITS(7, 0)	/* XXX */
 #define BWI_SPROM_MAX_TXPWR_MASK_11A	__BITS(15, 8)	/* XXX */
@@ -399,6 +406,24 @@
 #define BWI_CARD_F_ALT_IQ		__BIT(15)	/* alternate I/Q */
 
 /*
+ * SPROM GPIO
+ */
+#define BWI_LED_ACT_LOW			__BIT(7)
+#define BWI_LED_ACT_MASK		__BITS(6, 0)
+#define BWI_LED_ACT_OFF			0
+#define BWI_LED_ACT_ON			1
+#define BWI_LED_ACT_ACTIVE		2
+#define BWI_LED_ACT_RFEN		3
+#define BWI_LED_ACT_5GHZ		4
+#define BWI_LED_ACT_2GHZ		5
+#define BWI_LED_ACT_11G			6
+#define BWI_LED_ACT_MID			7
+#define BWI_LED_ACT_FAST		8
+#define BWI_LED_ACT_UNKN		9
+#define BWI_LED_ACT_RUN			10
+#define BWI_LED_ACT_NULL		11
+
+/*
  * BBP IDs
  */
 #define BWI_BBPID_BCM4301		0x4301

==== //depot/projects/wifi/sys/dev/bwi/if_bwivar.h#4 (text+ko) ====

@@ -281,6 +281,13 @@
 #define BWI_FW_IV_OFS_MASK	__BITS(14, 0)
 #define BWI_FW_IV_IS_32BIT	__BIT(15)
 
+struct bwi_led {
+	uint8_t			l_flags;	/* BWI_LED_F_ */
+	uint8_t			l_act;		/* BWI_LED_ACT_ */
+};
+
+#define BWI_LED_F_ACTLOW	0x1
+
 enum bwi_clock_mode {
 	BWI_CLOCK_MODE_SLOW,
 	BWI_CLOCK_MODE_FAST,
@@ -448,6 +455,7 @@
 } while (0)
 
 #define BWI_MAC_MAX		2
+#define	BWI_LED_MAX		4
 
 enum bwi_bus_space {
 	BWI_BUS_SPACE_30BIT = 1,
@@ -535,6 +543,8 @@
 	int			sc_nmac;
 	struct bwi_mac		sc_mac[BWI_MAC_MAX];
 
+	struct bwi_led		sc_leds[BWI_LED_MAX];
+
 	enum bwi_bus_space	sc_bus_space;
 	bus_dma_tag_t		sc_parent_dtag;
 


More information about the p4-projects mailing list