aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2013-07-29 17:07:43 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-07-31 15:16:17 -0400
commitcb236d2d713cff83d024a82b836757d9e2b50715 (patch)
tree9a244fb38c558b9d6a8b0dd15aa5e12ff14696a5 /net/mac80211
parentb56e4b857c5210e848bfb80e074e5756a36cd523 (diff)
mac80211: don't wait for TX status forever
TX status notification can get lost, or the frames could get stuck on the queue, so don't wait for the callback from the driver forever and instead time out after half a second. Cc: stable@vger.kernel.org Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/mlme.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index e3e7d2be9e41..e5c3cf405060 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -31,10 +31,12 @@
31#include "led.h" 31#include "led.h"
32 32
33#define IEEE80211_AUTH_TIMEOUT (HZ / 5) 33#define IEEE80211_AUTH_TIMEOUT (HZ / 5)
34#define IEEE80211_AUTH_TIMEOUT_LONG (HZ / 2)
34#define IEEE80211_AUTH_TIMEOUT_SHORT (HZ / 10) 35#define IEEE80211_AUTH_TIMEOUT_SHORT (HZ / 10)
35#define IEEE80211_AUTH_MAX_TRIES 3 36#define IEEE80211_AUTH_MAX_TRIES 3
36#define IEEE80211_AUTH_WAIT_ASSOC (HZ * 5) 37#define IEEE80211_AUTH_WAIT_ASSOC (HZ * 5)
37#define IEEE80211_ASSOC_TIMEOUT (HZ / 5) 38#define IEEE80211_ASSOC_TIMEOUT (HZ / 5)
39#define IEEE80211_ASSOC_TIMEOUT_LONG (HZ / 2)
38#define IEEE80211_ASSOC_TIMEOUT_SHORT (HZ / 10) 40#define IEEE80211_ASSOC_TIMEOUT_SHORT (HZ / 10)
39#define IEEE80211_ASSOC_MAX_TRIES 3 41#define IEEE80211_ASSOC_MAX_TRIES 3
40 42
@@ -3394,10 +3396,13 @@ static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)
3394 3396
3395 if (tx_flags == 0) { 3397 if (tx_flags == 0) {
3396 auth_data->timeout = jiffies + IEEE80211_AUTH_TIMEOUT; 3398 auth_data->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
3397 ifmgd->auth_data->timeout_started = true; 3399 auth_data->timeout_started = true;
3398 run_again(sdata, auth_data->timeout); 3400 run_again(sdata, auth_data->timeout);
3399 } else { 3401 } else {
3400 auth_data->timeout_started = false; 3402 auth_data->timeout =
3403 round_jiffies_up(jiffies + IEEE80211_AUTH_TIMEOUT_LONG);
3404 auth_data->timeout_started = true;
3405 run_again(sdata, auth_data->timeout);
3401 } 3406 }
3402 3407
3403 return 0; 3408 return 0;
@@ -3434,7 +3439,11 @@ static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata)
3434 assoc_data->timeout_started = true; 3439 assoc_data->timeout_started = true;
3435 run_again(sdata, assoc_data->timeout); 3440 run_again(sdata, assoc_data->timeout);
3436 } else { 3441 } else {
3437 assoc_data->timeout_started = false; 3442 assoc_data->timeout =
3443 round_jiffies_up(jiffies +
3444 IEEE80211_ASSOC_TIMEOUT_LONG);
3445 assoc_data->timeout_started = true;
3446 run_again(sdata, assoc_data->timeout);
3438 } 3447 }
3439 3448
3440 return 0; 3449 return 0;