int blink_time;
 };
 
+/**
+ * enum ieee80211_tpt_led_trigger_flags - throughput trigger flags
+ * @IEEE80211_TPT_LEDTRIG_FL_RADIO: enable blinking with radio
+ * @IEEE80211_TPT_LEDTRIG_FL_WORK: enable blinking when working
+ * @IEEE80211_TPT_LEDTRIG_FL_CONNECTED: enable blinking when at least one
+ *     interface is connected in some way, including being an AP
+ */
+enum ieee80211_tpt_led_trigger_flags {
+       IEEE80211_TPT_LEDTRIG_FL_RADIO          = BIT(0),
+       IEEE80211_TPT_LEDTRIG_FL_WORK           = BIT(1),
+       IEEE80211_TPT_LEDTRIG_FL_CONNECTED      = BIT(2),
+};
+
 #ifdef CONFIG_MAC80211_LEDS
 extern char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw);
 extern char *__ieee80211_get_rx_led_name(struct ieee80211_hw *hw);
 extern char *__ieee80211_get_assoc_led_name(struct ieee80211_hw *hw);
 extern char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw);
 extern char *__ieee80211_create_tpt_led_trigger(
-                               struct ieee80211_hw *hw,
+                               struct ieee80211_hw *hw, unsigned int flags,
                                const struct ieee80211_tpt_blink *blink_table,
                                unsigned int blink_table_len);
 #endif
 /**
  * ieee80211_create_tpt_led_trigger - create throughput LED trigger
  * @hw: the hardware to create the trigger for
+ * @flags: trigger flags, see &enum ieee80211_tpt_led_trigger_flags
  * @blink_table: the blink table -- needs to be ordered by throughput
  * @blink_table_len: size of the blink table
  *
  * This function must be called before ieee80211_register_hw().
  */
 static inline char *
-ieee80211_create_tpt_led_trigger(struct ieee80211_hw *hw,
+ieee80211_create_tpt_led_trigger(struct ieee80211_hw *hw, unsigned int flags,
                                 const struct ieee80211_tpt_blink *blink_table,
                                 unsigned int blink_table_len)
 {
 #ifdef CONFIG_MAC80211_LEDS
-       return __ieee80211_create_tpt_led_trigger(hw, blink_table,
+       return __ieee80211_create_tpt_led_trigger(hw, flags, blink_table,
                                                  blink_table_len);
 #else
        return NULL;
 
        const struct ieee80211_tpt_blink *blink_table;
        unsigned int blink_table_len;
        struct timer_list timer;
-       bool running;
        unsigned long prev_traffic;
        unsigned long tx_bytes, rx_bytes;
+       unsigned int active, want;
+       bool running;
 };
 
 /**
 
                /* we're brought up, everything changes */
                hw_reconf_flags = ~0;
                ieee80211_led_radio(local, true);
-               ieee80211_start_tpt_led_trig(local);
+               ieee80211_mod_tpt_led_trig(local,
+                                          IEEE80211_TPT_LEDTRIG_FL_RADIO, 0);
        }
 
        /*
        int count = 0;
        bool working = false, scanning = false;
        struct ieee80211_work *wk;
+       unsigned int led_trig_start = 0, led_trig_stop = 0;
 
 #ifdef CONFIG_PROVE_LOCKING
        WARN_ON(debug_locks && !lockdep_rtnl_is_held() &&
                ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IDLE);
        }
 
+       if (working || scanning)
+               led_trig_start |= IEEE80211_TPT_LEDTRIG_FL_WORK;
+       else
+               led_trig_stop |= IEEE80211_TPT_LEDTRIG_FL_WORK;
+
+       if (count)
+               led_trig_start |= IEEE80211_TPT_LEDTRIG_FL_CONNECTED;
+       else
+               led_trig_stop |= IEEE80211_TPT_LEDTRIG_FL_CONNECTED;
+
+       ieee80211_mod_tpt_led_trig(local, led_trig_start, led_trig_stop);
+
        if (working)
                return ieee80211_idle_off(local, "working");
        if (scanning)
 
 }
 
 extern char *__ieee80211_create_tpt_led_trigger(
-                               struct ieee80211_hw *hw,
+                               struct ieee80211_hw *hw, unsigned int flags,
                                const struct ieee80211_tpt_blink *blink_table,
                                unsigned int blink_table_len)
 {
 
        tpt_trig->blink_table = blink_table;
        tpt_trig->blink_table_len = blink_table_len;
+       tpt_trig->want = flags;
 
        setup_timer(&tpt_trig->timer, tpt_trig_timer, (unsigned long)local);
 
 }
 EXPORT_SYMBOL(__ieee80211_create_tpt_led_trigger);
 
-void ieee80211_start_tpt_led_trig(struct ieee80211_local *local)
+static void ieee80211_start_tpt_led_trig(struct ieee80211_local *local)
 {
        struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger;
 
-       if (!tpt_trig)
+       if (tpt_trig->running)
                return;
 
        /* reset traffic */
        mod_timer(&tpt_trig->timer, round_jiffies(jiffies + HZ));
 }
 
-void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local)
+static void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local)
 {
        struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger;
        struct led_classdev *led_cdev;
 
-       if (!tpt_trig)
+       if (!tpt_trig->running)
                return;
 
        tpt_trig->running = false;
                led_brightness_set(led_cdev, LED_OFF);
        read_unlock(&tpt_trig->trig.leddev_list_lock);
 }
+
+void ieee80211_mod_tpt_led_trig(struct ieee80211_local *local,
+                               unsigned int types_on, unsigned int types_off)
+{
+       struct tpt_led_trigger *tpt_trig = local->tpt_led_trigger;
+       bool allowed;
+
+       WARN_ON(types_on & types_off);
+
+       if (!tpt_trig)
+               return;
+
+       tpt_trig->active &= ~types_off;
+       tpt_trig->active |= types_on;
+
+       /*
+        * Regardless of wanted state, we shouldn't blink when
+        * the radio is disabled -- this can happen due to some
+        * code ordering issues with __ieee80211_recalc_idle()
+        * being called before the radio is started.
+        */
+       allowed = tpt_trig->active & IEEE80211_TPT_LEDTRIG_FL_RADIO;
+
+       if (!allowed || !(tpt_trig->active & tpt_trig->want))
+               ieee80211_stop_tpt_led_trig(local);
+       else
+               ieee80211_start_tpt_led_trig(local);
+}
 
 void ieee80211_led_names(struct ieee80211_local *local);
 void ieee80211_led_init(struct ieee80211_local *local);
 void ieee80211_led_exit(struct ieee80211_local *local);
-void ieee80211_start_tpt_led_trig(struct ieee80211_local *local);
-void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local);
+void ieee80211_mod_tpt_led_trig(struct ieee80211_local *local,
+                               unsigned int types_on, unsigned int types_off);
 #else
 static inline void ieee80211_led_rx(struct ieee80211_local *local)
 {
 static inline void ieee80211_led_exit(struct ieee80211_local *local)
 {
 }
-static inline void ieee80211_start_tpt_led_trig(struct ieee80211_local *local)
-{
-}
-static inline void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local)
+static inline void ieee80211_mod_tpt_led_trig(struct ieee80211_local *local,
+                                             unsigned int types_on,
+                                             unsigned int types_off)
 {
 }
 #endif
 
 void ieee80211_stop_device(struct ieee80211_local *local)
 {
        ieee80211_led_radio(local, false);
-       ieee80211_stop_tpt_led_trig(local);
+       ieee80211_mod_tpt_led_trig(local, 0, IEEE80211_TPT_LEDTRIG_FL_RADIO);
 
        cancel_work_sync(&local->reconfig_filter);
 
                }
 
                ieee80211_led_radio(local, true);
-               ieee80211_start_tpt_led_trig(local);
+               ieee80211_mod_tpt_led_trig(local,
+                                          IEEE80211_TPT_LEDTRIG_FL_RADIO, 0);
        }
 
        /* add interfaces */