diff options
author | Jouni Malinen <jouni.malinen@atheros.com> | 2009-05-05 13:35:13 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-05-06 15:15:04 -0400 |
commit | 2d3babd11f91501f49c6af212e6795bd8954f4d4 (patch) | |
tree | d17066ce7cd347ce4feecf52019565a9431395e2 /net/mac80211/rx.c | |
parent | 358623c22c9fd837b3b1b444377037f72553dc9f (diff) |
mac80211: Use a shared function to release frames from RX reorder buf
No need to duplicate the same code in two places (and that would be
three after the followup patch).
Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r-- | net/mac80211/rx.c | 70 |
1 files changed, 31 insertions, 39 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 6a9d89b392e3..9f2a29d1890b 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -2284,6 +2284,34 @@ static inline u16 seq_sub(u16 sq1, u16 sq2) | |||
2284 | } | 2284 | } |
2285 | 2285 | ||
2286 | 2286 | ||
2287 | static void ieee80211_release_reorder_frame(struct ieee80211_hw *hw, | ||
2288 | struct tid_ampdu_rx *tid_agg_rx, | ||
2289 | int index) | ||
2290 | { | ||
2291 | struct ieee80211_supported_band *sband; | ||
2292 | struct ieee80211_rate *rate; | ||
2293 | struct ieee80211_rx_status status; | ||
2294 | |||
2295 | if (!tid_agg_rx->reorder_buf[index]) | ||
2296 | goto no_frame; | ||
2297 | |||
2298 | /* release the reordered frames to stack */ | ||
2299 | memcpy(&status, tid_agg_rx->reorder_buf[index]->cb, sizeof(status)); | ||
2300 | sband = hw->wiphy->bands[status.band]; | ||
2301 | if (status.flag & RX_FLAG_HT) | ||
2302 | rate = sband->bitrates; /* TODO: HT rates */ | ||
2303 | else | ||
2304 | rate = &sband->bitrates[status.rate_idx]; | ||
2305 | __ieee80211_rx_handle_packet(hw, tid_agg_rx->reorder_buf[index], | ||
2306 | &status, rate); | ||
2307 | tid_agg_rx->stored_mpdu_num--; | ||
2308 | tid_agg_rx->reorder_buf[index] = NULL; | ||
2309 | |||
2310 | no_frame: | ||
2311 | tid_agg_rx->head_seq_num = seq_inc(tid_agg_rx->head_seq_num); | ||
2312 | } | ||
2313 | |||
2314 | |||
2287 | /* | 2315 | /* |
2288 | * As it function blongs to Rx path it must be called with | 2316 | * As it function blongs to Rx path it must be called with |
2289 | * the proper rcu_read_lock protection for its flow. | 2317 | * the proper rcu_read_lock protection for its flow. |
@@ -2295,12 +2323,8 @@ static u8 ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw, | |||
2295 | u16 mpdu_seq_num, | 2323 | u16 mpdu_seq_num, |
2296 | int bar_req) | 2324 | int bar_req) |
2297 | { | 2325 | { |
2298 | struct ieee80211_local *local = hw_to_local(hw); | ||
2299 | struct ieee80211_rx_status status; | ||
2300 | u16 head_seq_num, buf_size; | 2326 | u16 head_seq_num, buf_size; |
2301 | int index; | 2327 | int index; |
2302 | struct ieee80211_supported_band *sband; | ||
2303 | struct ieee80211_rate *rate; | ||
2304 | 2328 | ||
2305 | buf_size = tid_agg_rx->buf_size; | 2329 | buf_size = tid_agg_rx->buf_size; |
2306 | head_seq_num = tid_agg_rx->head_seq_num; | 2330 | head_seq_num = tid_agg_rx->head_seq_num; |
@@ -2325,28 +2349,8 @@ static u8 ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw, | |||
2325 | index = seq_sub(tid_agg_rx->head_seq_num, | 2349 | index = seq_sub(tid_agg_rx->head_seq_num, |
2326 | tid_agg_rx->ssn) | 2350 | tid_agg_rx->ssn) |
2327 | % tid_agg_rx->buf_size; | 2351 | % tid_agg_rx->buf_size; |
2328 | 2352 | ieee80211_release_reorder_frame(hw, tid_agg_rx, | |
2329 | if (tid_agg_rx->reorder_buf[index]) { | 2353 | index); |
2330 | /* release the reordered frames to stack */ | ||
2331 | memcpy(&status, | ||
2332 | tid_agg_rx->reorder_buf[index]->cb, | ||
2333 | sizeof(status)); | ||
2334 | sband = local->hw.wiphy->bands[status.band]; | ||
2335 | if (status.flag & RX_FLAG_HT) { | ||
2336 | /* TODO: HT rates */ | ||
2337 | rate = sband->bitrates; | ||
2338 | } else { | ||
2339 | rate = &sband->bitrates | ||
2340 | [status.rate_idx]; | ||
2341 | } | ||
2342 | __ieee80211_rx_handle_packet(hw, | ||
2343 | tid_agg_rx->reorder_buf[index], | ||
2344 | &status, rate); | ||
2345 | tid_agg_rx->stored_mpdu_num--; | ||
2346 | tid_agg_rx->reorder_buf[index] = NULL; | ||
2347 | } | ||
2348 | tid_agg_rx->head_seq_num = | ||
2349 | seq_inc(tid_agg_rx->head_seq_num); | ||
2350 | } | 2354 | } |
2351 | if (bar_req) | 2355 | if (bar_req) |
2352 | return 1; | 2356 | return 1; |
@@ -2380,19 +2384,7 @@ static u8 ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw, | |||
2380 | index = seq_sub(tid_agg_rx->head_seq_num, tid_agg_rx->ssn) | 2384 | index = seq_sub(tid_agg_rx->head_seq_num, tid_agg_rx->ssn) |
2381 | % tid_agg_rx->buf_size; | 2385 | % tid_agg_rx->buf_size; |
2382 | while (tid_agg_rx->reorder_buf[index]) { | 2386 | while (tid_agg_rx->reorder_buf[index]) { |
2383 | /* release the reordered frame back to stack */ | 2387 | ieee80211_release_reorder_frame(hw, tid_agg_rx, index); |
2384 | memcpy(&status, tid_agg_rx->reorder_buf[index]->cb, | ||
2385 | sizeof(status)); | ||
2386 | sband = local->hw.wiphy->bands[status.band]; | ||
2387 | if (status.flag & RX_FLAG_HT) | ||
2388 | rate = sband->bitrates; /* TODO: HT rates */ | ||
2389 | else | ||
2390 | rate = &sband->bitrates[status.rate_idx]; | ||
2391 | __ieee80211_rx_handle_packet(hw, tid_agg_rx->reorder_buf[index], | ||
2392 | &status, rate); | ||
2393 | tid_agg_rx->stored_mpdu_num--; | ||
2394 | tid_agg_rx->reorder_buf[index] = NULL; | ||
2395 | tid_agg_rx->head_seq_num = seq_inc(tid_agg_rx->head_seq_num); | ||
2396 | index = seq_sub(tid_agg_rx->head_seq_num, | 2388 | index = seq_sub(tid_agg_rx->head_seq_num, |
2397 | tid_agg_rx->ssn) % tid_agg_rx->buf_size; | 2389 | tid_agg_rx->ssn) % tid_agg_rx->buf_size; |
2398 | } | 2390 | } |