mac80211: fix a pointer handling error in the new tx queueing code

Signed-off-by: Felix Fietkau <nbd@openwrt.org>

SVN-Revision: 44738
This commit is contained in:
Felix Fietkau 2015-03-13 05:17:06 +00:00
parent 7fc700dcca
commit fce7d5cfc9

View file

@ -323,7 +323,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
if (!sta) if (!sta)
return NULL; return NULL;
@@ -321,11 +328,23 @@ struct sta_info *sta_info_alloc(struct i @@ -321,11 +328,25 @@ struct sta_info *sta_info_alloc(struct i
for (i = 0; i < ARRAY_SIZE(sta->chain_signal_avg); i++) for (i = 0; i < ARRAY_SIZE(sta->chain_signal_avg); i++)
ewma_init(&sta->chain_signal_avg[i], 1024, 8); ewma_init(&sta->chain_signal_avg[i], 1024, 8);
@ -331,15 +331,17 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
- kfree(sta); - kfree(sta);
- return NULL; - return NULL;
+ if (local->ops->wake_tx_queue) { + if (local->ops->wake_tx_queue) {
+ void *txq_data;
+ int size = sizeof(struct txq_info) + + int size = sizeof(struct txq_info) +
+ ALIGN(hw->txq_data_size, sizeof(void *)); + ALIGN(hw->txq_data_size, sizeof(void *));
+ +
+ sta->txq = kcalloc(IEEE80211_NUM_TIDS, size, gfp); + txq_data = kcalloc(IEEE80211_NUM_TIDS, size, gfp);
+ if (!sta->txq) + if (!txq_data)
+ goto free; + goto free;
+ +
+ sta->txq = txq_data;
+ for (i = 0; i < IEEE80211_NUM_TIDS; i++) { + for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
+ struct txq_info *txq = sta->txq + i * size; + struct txq_info *txq = txq_data + i * size;
+ ieee80211_init_tx_queue(sdata, sta, txq, i); + ieee80211_init_tx_queue(sdata, sta, txq, i);
+ } + }
} }
@ -350,7 +352,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
for (i = 0; i < IEEE80211_NUM_TIDS; i++) { for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
/* /*
* timer_to_tid must be initialized with identity mapping * timer_to_tid must be initialized with identity mapping
@@ -346,7 +365,7 @@ struct sta_info *sta_info_alloc(struct i @@ -346,7 +367,7 @@ struct sta_info *sta_info_alloc(struct i
if (sdata->vif.type == NL80211_IFTYPE_AP || if (sdata->vif.type == NL80211_IFTYPE_AP ||
sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
struct ieee80211_supported_band *sband = struct ieee80211_supported_band *sband =
@ -359,7 +361,7 @@ Signed-off-by: Felix Fietkau <nbd@openwrt.org>
u8 smps = (sband->ht_cap.cap & IEEE80211_HT_CAP_SM_PS) >> u8 smps = (sband->ht_cap.cap & IEEE80211_HT_CAP_SM_PS) >>
IEEE80211_HT_CAP_SM_PS_SHIFT; IEEE80211_HT_CAP_SM_PS_SHIFT;
/* /*
@@ -371,6 +390,12 @@ struct sta_info *sta_info_alloc(struct i @@ -371,6 +392,12 @@ struct sta_info *sta_info_alloc(struct i
sta_dbg(sdata, "Allocated STA %pM\n", sta->sta.addr); sta_dbg(sdata, "Allocated STA %pM\n", sta->sta.addr);
return sta; return sta;