svn commit: r228891 - head/sys/dev/ath

Adrian Chadd adrian at FreeBSD.org
Mon Dec 26 07:47:05 UTC 2011


Author: adrian
Date: Mon Dec 26 07:47:05 2011
New Revision: 228891
URL: http://svn.freebsd.org/changeset/base/228891

Log:
  Flesh out configurable hardware based LED blinking.
  
  The hardware (MAC) LED blinking involves a few things:
  
  * Selecting which GPIO pins map to the MAC "power" and "network" lines;
  * Configuring the MAC LED state (associated, scanning, idle);
  * Configuring the MAC LED blinking type and speed.
  
  The AR5416 HAL configures the normal blinking setup - ie, blink rate based
  on TX/RX throughput.  The default AR5212 HAL doesn't program in any
  specific blinking type, but the default of 0 is the same.
  
  This code introduces a few things:
  
  * The hardware led override is configured via sysctl 'hardled';
  * The MAC network and power LED GPIO lines can be set, or left at -1
    if needed.  This is intended to allow only one of the hardware MUX
    entries to be configured (eg for PCIe cards which only have one LED
    exposed.)
  
  TODO:
  
  * For AR2417, the software LED blinking involves software blinking the
    Network LED.  For the AR5416 and later, this can just be configured
    as a GPIO output line.  I'll chase that up with a subsequent commit.
  
  * Add another software LED blink for "Link", separate from "activity",
    which blinks based on the association state.  This would make my
    D-Link DWA-552 have consistent and useful LED behaviour (as they're
    marked "Link" and "Activity."
  
  * Don't expose the hardware LED override unless it's an AR5416 or later,
    as the previous generation hardware doesn't have this multiplexing
    setup.

Modified:
  head/sys/dev/ath/if_ath.c
  head/sys/dev/ath/if_ath_led.c
  head/sys/dev/ath/if_ath_sysctl.c
  head/sys/dev/ath/if_athvar.h

Modified: head/sys/dev/ath/if_ath.c
==============================================================================
--- head/sys/dev/ath/if_ath.c	Mon Dec 26 06:25:12 2011	(r228890)
+++ head/sys/dev/ath/if_ath.c	Mon Dec 26 07:47:05 2011	(r228891)
@@ -479,11 +479,27 @@ ath_attach(u_int16_t devid, struct ath_s
 	/* Start DFS processing tasklet */
 	TASK_INIT(&sc->sc_dfstask, 0, ath_dfs_tasklet, sc);
 
+	/* Configure LED state */
 	sc->sc_blinking = 0;
 	sc->sc_ledstate = 1;
 	sc->sc_ledon = 0;			/* low true */
 	sc->sc_ledidle = (2700*hz)/1000;	/* 2.7sec */
 	callout_init(&sc->sc_ledtimer, CALLOUT_MPSAFE);
+
+	/*
+	 * Don't setup hardware-based blinking.
+	 *
+	 * Although some NICs may have this configured in the
+	 * default reset register values, the user may wish
+	 * to alter which pins have which function.
+	 *
+	 * The reference driver attaches the MAC network LED to GPIO1 and
+	 * the MAC power LED to GPIO2.  However, the DWA-552 cardbus
+	 * NIC has these reversed.
+	 */
+	sc->sc_hardled = (1 == 0);
+	sc->sc_led_net_pin = -1;
+	sc->sc_led_pwr_pin = -1;
 	/*
 	 * Auto-enable soft led processing for IBM cards and for
 	 * 5211 minipci cards.  Users can also manually enable/disable

Modified: head/sys/dev/ath/if_ath_led.c
==============================================================================
--- head/sys/dev/ath/if_ath_led.c	Mon Dec 26 06:25:12 2011	(r228890)
+++ head/sys/dev/ath/if_ath_led.c	Mon Dec 26 07:47:05 2011	(r228891)
@@ -112,9 +112,12 @@ __FBSDID("$FreeBSD$");
 
 
 /*
- * Configure the hardware for software and/or LED blinking.
+ * Configure the hardware for software and LED blinking.
+ * The user may choose to configure part of each, depending upon the
+ * NIC being used.
  *
- * This requires the configuration to be set beforehand.
+ * This requires the configuration to be set before this function
+ * is called.
  */
 void
 ath_led_config(struct ath_softc *sc)
@@ -124,10 +127,23 @@ ath_led_config(struct ath_softc *sc)
 		ath_hal_gpioCfgOutput(sc->sc_ah, sc->sc_ledpin,
 		    HAL_GPIO_MUX_MAC_NETWORK_LED);
 		ath_hal_gpioset(sc->sc_ah, sc->sc_ledpin, !sc->sc_ledon);
-		return;
 	}
 
 	/* Hardware LED blinking - MAC controlled LED */
+	if (sc->sc_hardled) {
+		/*
+		 * Only enable each LED if required.
+		 *
+		 * Some NICs only have one LED connected; others may
+		 * have GPIO1/GPIO2 connected to other hardware.
+		 */
+		if (sc->sc_led_pwr_pin > 0)
+			ath_hal_gpioCfgOutput(sc->sc_ah, sc->sc_led_pwr_pin,
+			    HAL_GPIO_MUX_MAC_POWER_LED);
+		if (sc->sc_led_net_pin > 0)
+			ath_hal_gpioCfgOutput(sc->sc_ah, sc->sc_led_net_pin,
+			    HAL_GPIO_MUX_MAC_NETWORK_LED);
+	}
 }
 
 static void

Modified: head/sys/dev/ath/if_ath_sysctl.c
==============================================================================
--- head/sys/dev/ath/if_ath_sysctl.c	Mon Dec 26 06:25:12 2011	(r228890)
+++ head/sys/dev/ath/if_ath_sysctl.c	Mon Dec 26 07:47:05 2011	(r228891)
@@ -179,6 +179,27 @@ ath_sysctl_ledpin(SYSCTL_HANDLER_ARGS)
 }
 
 static int
+ath_sysctl_hardled(SYSCTL_HANDLER_ARGS)
+{
+	struct ath_softc *sc = arg1;
+	int hardled = sc->sc_hardled;
+	int error;
+
+	error = sysctl_handle_int(oidp, &hardled, 0, req);
+	if (error || !req->newptr)
+		return error;
+	hardled = (hardled != 0);
+	if (hardled != sc->sc_hardled) {
+		if (hardled) {
+			/* NB: handle any sc_ledpin change */
+			ath_led_config(sc);
+		}
+		sc->sc_hardled = hardled;
+	}
+	return 0;
+}
+
+static int
 ath_sysctl_txantenna(SYSCTL_HANDLER_ARGS)
 {
 	struct ath_softc *sc = arg1;
@@ -491,6 +512,7 @@ ath_sysctlattach(struct ath_softc *sc)
 	SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
 		"ctstimeout", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
 		ath_sysctl_ctstimeout, "I", "802.11 CTS timeout (us)");
+
 	SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
 		"softled", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
 		ath_sysctl_softled, "I", "enable/disable software LED support");
@@ -503,6 +525,18 @@ ath_sysctlattach(struct ath_softc *sc)
 	SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
 		"ledidle", CTLFLAG_RW, &sc->sc_ledidle, 0,
 		"idle time for inactivity LED (ticks)");
+
+	SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
+		"hardled", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
+		ath_sysctl_hardled, "I", "enable/disable hardware LED support");
+	/* XXX Laziness - configure pins, then flip hardled off/on */
+	SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
+		"led_net_pin", CTLFLAG_RW, &sc->sc_led_net_pin, 0,
+		"MAC Network LED pin, or -1 to disable");
+	SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
+		"led_pwr_pin", CTLFLAG_RW, &sc->sc_led_pwr_pin, 0,
+		"MAC Power LED pin, or -1 to disable");
+
 	SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
 		"txantenna", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
 		ath_sysctl_txantenna, "I", "antenna switch");

Modified: head/sys/dev/ath/if_athvar.h
==============================================================================
--- head/sys/dev/ath/if_athvar.h	Mon Dec 26 06:25:12 2011	(r228890)
+++ head/sys/dev/ath/if_athvar.h	Mon Dec 26 07:47:05 2011	(r228891)
@@ -371,6 +371,7 @@ struct ath_softc {
 	unsigned int		sc_invalid  : 1,/* disable hardware accesses */
 				sc_mrretry  : 1,/* multi-rate retry support */
 				sc_softled  : 1,/* enable LED gpio status */
+				sc_hardled  : 1,/* enable MAC LED status */
 				sc_splitmic : 1,/* split TKIP MIC keys */
 				sc_needmib  : 1,/* enable MIB stats intr */
 				sc_diversity: 1,/* enable rx diversity */
@@ -445,6 +446,9 @@ struct ath_softc {
 	u_int			sc_keymax;	/* size of key cache */
 	u_int8_t		sc_keymap[ATH_KEYBYTES];/* key use bit map */
 
+	/*
+	 * Software based LED blinking
+	 */
 	u_int			sc_ledpin;	/* GPIO pin for driving LED */
 	u_int			sc_ledon;	/* pin setting for LED on */
 	u_int			sc_ledidle;	/* idle polling interval */
@@ -453,6 +457,12 @@ struct ath_softc {
 	u_int16_t		sc_ledoff;	/* off time for current blink */
 	struct callout		sc_ledtimer;	/* led off timer */
 
+	/*
+	 * Hardware based LED blinking
+	 */
+	int			sc_led_pwr_pin;	/* MAC power LED GPIO pin */
+	int			sc_led_net_pin;	/* MAC network LED GPIO pin */
+
 	u_int			sc_rfsilentpin;	/* GPIO pin for rfkill int */
 	u_int			sc_rfsilentpol;	/* pin setting for rfkill on */
 


More information about the svn-src-head mailing list