From 1976da20e6203b8871806d63f1c2242a805af7c4 Mon Sep 17 00:00:00 2001 From: nbd Date: Sun, 28 Nov 2010 18:28:12 +0000 Subject: mac80211: merge the new version of the throughput led trigger patch git-svn-id: svn://svn.openwrt.org/openwrt/trunk@24182 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../mac80211/patches/562-throughput_trigger.patch | 77 +++++++++++++--------- 1 file changed, 46 insertions(+), 31 deletions(-) (limited to 'package/mac80211/patches/562-throughput_trigger.patch') diff --git a/package/mac80211/patches/562-throughput_trigger.patch b/package/mac80211/patches/562-throughput_trigger.patch index 811054794..7f85c466a 100644 --- a/package/mac80211/patches/562-throughput_trigger.patch +++ b/package/mac80211/patches/562-throughput_trigger.patch @@ -14,20 +14,23 @@ device, best with blink hardware offload. Signed-off-by: Johannes Berg --- v2: turn off LED when turning off radio +v3: - use only data frames + - fix update frequency to 1 second + - use DIV_ROUND_UP - include/net/mac80211.h | 42 +++++++++++++++ - net/mac80211/ieee80211_i.h | 14 +++++ + include/net/mac80211.h | 38 ++++++++++++++ + net/mac80211/ieee80211_i.h | 13 ++++ net/mac80211/iface.c | 1 - net/mac80211/led.c | 120 +++++++++++++++++++++++++++++++++++++++++++++ + net/mac80211/led.c | 119 +++++++++++++++++++++++++++++++++++++++++++++ net/mac80211/led.h | 44 +++++++++++++--- - net/mac80211/rx.c | 1 - net/mac80211/tx.c | 1 + net/mac80211/rx.c | 3 + + net/mac80211/tx.c | 3 + net/mac80211/util.c | 2 - 8 files changed, 216 insertions(+), 9 deletions(-) + 8 files changed, 214 insertions(+), 9 deletions(-) --- a/include/net/mac80211.h +++ b/include/net/mac80211.h -@@ -1849,11 +1849,27 @@ struct ieee80211_hw *ieee80211_alloc_hw( +@@ -1849,11 +1849,26 @@ struct ieee80211_hw *ieee80211_alloc_hw( */ int ieee80211_register_hw(struct ieee80211_hw *hw); @@ -49,19 +52,17 @@ v2: turn off LED when turning off radio extern char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw); +extern char *__ieee80211_create_tpt_led_trigger( + struct ieee80211_hw *hw, -+ unsigned long update_timeout, + const struct ieee80211_tpt_blink *blink_table, + unsigned int blink_table_len); #endif /** * ieee80211_get_tx_led_name - get name of TX LED -@@ -1932,6 +1948,32 @@ static inline char *ieee80211_get_radio_ +@@ -1932,6 +1947,29 @@ static inline char *ieee80211_get_radio_ } /** + * ieee80211_create_tpt_led_trigger - create throughput LED trigger + * @hw: the hardware to create the trigger for -+ * @update_timeout: the update timeout (in jiffies) + * @blink_table: the blink table -- needs to be ordered by throughput + * @blink_table_len: size of the blink table + * @@ -71,13 +72,11 @@ v2: turn off LED when turning off radio + */ +static inline char * +ieee80211_create_tpt_led_trigger(struct ieee80211_hw *hw, -+ unsigned long update_timeout, + const struct ieee80211_tpt_blink *blink_table, + unsigned int blink_table_len) +{ +#ifdef CONFIG_MAC80211_LEDS -+ return __ieee80211_create_tpt_led_trigger(hw, update_timeout, -+ blink_table, ++ return __ieee80211_create_tpt_led_trigger(hw, blink_table, + blink_table_len); +#else + return NULL; @@ -98,7 +97,7 @@ v2: turn off LED when turning off radio #include #include #include -@@ -636,6 +637,18 @@ enum queue_stop_reason { +@@ -636,6 +637,17 @@ enum queue_stop_reason { IEEE80211_QUEUE_STOP_REASON_SKB_ADD, }; @@ -107,7 +106,6 @@ v2: turn off LED when turning off radio + char name[32]; + const struct ieee80211_tpt_blink *blink_table; + unsigned int blink_table_len; -+ unsigned long update_timeout; + struct timer_list timer; + bool running; + unsigned long prev_traffic; @@ -117,7 +115,7 @@ v2: turn off LED when turning off radio /** * mac80211 scan flags - currently active scan mode * -@@ -849,6 +862,7 @@ struct ieee80211_local { +@@ -849,6 +861,7 @@ struct ieee80211_local { #ifdef CONFIG_MAC80211_LEDS int tx_led_counter, rx_led_counter; struct led_trigger *tx_led, *rx_led, *assoc_led, *radio_led; @@ -153,7 +151,7 @@ v2: turn off LED when turning off radio } char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw) -@@ -156,3 +168,111 @@ char *__ieee80211_get_rx_led_name(struct +@@ -156,3 +168,110 @@ char *__ieee80211_get_rx_led_name(struct return local->rx_led_name; } EXPORT_SYMBOL(__ieee80211_get_rx_led_name); @@ -167,7 +165,7 @@ v2: turn off LED when turning off radio + + delta = traffic - tpt_trig->prev_traffic; + tpt_trig->prev_traffic = traffic; -+ return delta / (1024 / 8); ++ return DIV_ROUND_UP(delta, 1024 / 8); +} + +static void tpt_trig_timer(unsigned long data) @@ -181,7 +179,7 @@ v2: turn off LED when turning off radio + if (!tpt_trig->running) + return; + -+ mod_timer(&tpt_trig->timer, jiffies + tpt_trig->update_timeout); ++ mod_timer(&tpt_trig->timer, round_jiffies(jiffies + HZ)); + + tpt = tpt_trig_traffic(local, tpt_trig); + @@ -190,7 +188,7 @@ v2: turn off LED when turning off radio + off = 0; + + for (i = tpt_trig->blink_table_len - 1; i >= 0; i--) { -+ if (tpt >= tpt_trig->blink_table[i].throughput) { ++ if (tpt > tpt_trig->blink_table[i].throughput) { + off = tpt_trig->blink_table[i].blink_time / 2; + on = tpt_trig->blink_table[i].blink_time - off; + break; @@ -205,7 +203,6 @@ v2: turn off LED when turning off radio + +extern char *__ieee80211_create_tpt_led_trigger( + struct ieee80211_hw *hw, -+ unsigned long update_timeout, + const struct ieee80211_tpt_blink *blink_table, + unsigned int blink_table_len) +{ @@ -224,7 +221,6 @@ v2: turn off LED when turning off radio + + tpt_trig->trig.name = tpt_trig->name; + -+ tpt_trig->update_timeout = update_timeout; + tpt_trig->blink_table = blink_table; + tpt_trig->blink_table_len = blink_table_len; + @@ -246,7 +242,8 @@ v2: turn off LED when turning off radio + /* reset traffic */ + tpt_trig_traffic(local, tpt_trig); + tpt_trig->running = true; -+ mod_timer(&tpt_trig->timer, jiffies + tpt_trig->update_timeout); ++ ++ mod_timer(&tpt_trig->timer, round_jiffies(jiffies + HZ)); +} + +void ieee80211_stop_tpt_led_trig(struct ieee80211_local *local) @@ -307,19 +304,19 @@ v2: turn off LED when turning off radio +#endif + +static inline void -+ieee80211_tpt_led_trig_tx(struct ieee80211_local *local, int bytes) ++ieee80211_tpt_led_trig_tx(struct ieee80211_local *local, __le16 fc, int bytes) +{ +#ifdef CONFIG_MAC80211_LEDS -+ if (local->tpt_led_trigger) ++ if (local->tpt_led_trigger && ieee80211_is_data(fc)) + local->tpt_led_trigger->tx_bytes += bytes; #endif +} + +static inline void -+ieee80211_tpt_led_trig_rx(struct ieee80211_local *local, int bytes) ++ieee80211_tpt_led_trig_rx(struct ieee80211_local *local, __le16 fc, int bytes) +{ +#ifdef CONFIG_MAC80211_LEDS -+ if (local->tpt_led_trigger) ++ if (local->tpt_led_trigger && ieee80211_is_data(fc)) + local->tpt_led_trigger->rx_bytes += bytes; +#endif +} @@ -353,21 +350,39 @@ v2: turn off LED when turning off radio /* add interfaces */ --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c -@@ -2873,6 +2873,7 @@ void ieee80211_rx(struct ieee80211_hw *h +@@ -2873,6 +2873,9 @@ void ieee80211_rx(struct ieee80211_hw *h return; } -+ ieee80211_tpt_led_trig_rx(local, skb->len); ++ ieee80211_tpt_led_trig_rx(local, ++ ((struct ieee80211_hdr *)skb->data)->frame_control, ++ skb->len); __ieee80211_rx_handle_packet(hw, skb); rcu_read_unlock(); --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c -@@ -1344,6 +1344,7 @@ static int __ieee80211_tx(struct ieee802 +@@ -1292,6 +1292,7 @@ static int __ieee80211_tx(struct ieee802 + + while (skb) { + int q = skb_get_queue_mapping(skb); ++ __le16 fc; + + spin_lock_irqsave(&local->queue_stop_reason_lock, flags); + ret = IEEE80211_TX_OK; +@@ -1334,6 +1335,7 @@ static int __ieee80211_tx(struct ieee802 + else + info->control.sta = NULL; + ++ fc = ((struct ieee80211_hdr *)skb->data)->frame_control; + ret = drv_tx(local, skb); + if (WARN_ON(ret != NETDEV_TX_OK && skb->len != len)) { + dev_kfree_skb(skb); +@@ -1344,6 +1346,7 @@ static int __ieee80211_tx(struct ieee802 return IEEE80211_TX_AGAIN; } -+ ieee80211_tpt_led_trig_tx(local, len); ++ ieee80211_tpt_led_trig_tx(local, fc, len); *skbp = skb = next; ieee80211_led_tx(local, 1); fragm = true; -- cgit v1.2.3