summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/sd8797/mlan/mlan_11n_rxreorder.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/sd8797/mlan/mlan_11n_rxreorder.c')
-rw-r--r--drivers/net/wireless/sd8797/mlan/mlan_11n_rxreorder.c1760
1 files changed, 929 insertions, 831 deletions
diff --git a/drivers/net/wireless/sd8797/mlan/mlan_11n_rxreorder.c b/drivers/net/wireless/sd8797/mlan/mlan_11n_rxreorder.c
index 0db9b99a4d12..b65733671857 100644
--- a/drivers/net/wireless/sd8797/mlan/mlan_11n_rxreorder.c
+++ b/drivers/net/wireless/sd8797/mlan/mlan_11n_rxreorder.c
@@ -2,20 +2,20 @@
*
* @brief This file contains the handling of RxReordering in wlan
* driver.
- *
- * Copyright (C) 2008-2011, Marvell International Ltd.
- *
- * This software file (the "File") is distributed by Marvell International
- * Ltd. under the terms of the GNU General Public License Version 2, June 1991
- * (the "License"). You may use, redistribute and/or modify this File in
- * accordance with the terms and conditions of the License, a copy of which
+ *
+ * Copyright (C) 2008-2011, Marvell International Ltd.
+ *
+ * This software file (the "File") is distributed by Marvell International
+ * Ltd. under the terms of the GNU General Public License Version 2, June 1991
+ * (the "License"). You may use, redistribute and/or modify this File in
+ * accordance with the terms and conditions of the License, a copy of which
* is available by writing to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
* worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
- * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
- * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
+ * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
+ * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
* this warranty disclaimer.
*/
@@ -45,9 +45,9 @@ Change log:
Local Functions
********************************************************/
/**
- * @brief This function will dispatch amsdu packet and
+ * @brief This function will dispatch amsdu packet and
* forward it to kernel/upper layer
- *
+ *
* @param priv A pointer to mlan_private
* @param pmbuf A pointer to the received buffer
*
@@ -56,25 +56,25 @@ Change log:
static mlan_status
wlan_11n_dispatch_amsdu_pkt(mlan_private * priv, pmlan_buffer pmbuf)
{
- RxPD *prx_pd;
- prx_pd = (RxPD *) (pmbuf->pbuf + pmbuf->data_offset);
-
- ENTER();
- if (prx_pd->rx_pkt_type == PKT_TYPE_AMSDU) {
- pmbuf->data_len = prx_pd->rx_pkt_length;
- pmbuf->data_offset += prx_pd->rx_pkt_offset;
- wlan_11n_deaggregate_pkt(priv, pmbuf);
- LEAVE();
- return MLAN_STATUS_SUCCESS;
- }
- LEAVE();
- return MLAN_STATUS_FAILURE;
+ RxPD *prx_pd;
+ prx_pd = (RxPD *) (pmbuf->pbuf + pmbuf->data_offset);
+
+ ENTER();
+ if (prx_pd->rx_pkt_type == PKT_TYPE_AMSDU) {
+ pmbuf->data_len = prx_pd->rx_pkt_length;
+ pmbuf->data_offset += prx_pd->rx_pkt_offset;
+ wlan_11n_deaggregate_pkt(priv, pmbuf);
+ LEAVE();
+ return MLAN_STATUS_SUCCESS;
+ }
+ LEAVE();
+ return MLAN_STATUS_FAILURE;
}
/**
- * @brief This function will process the rx packet and
+ * @brief This function will process the rx packet and
* forward it to kernel/upper layer
- *
+ *
* @param priv A pointer to mlan_private
* @param payload A pointer to rx packet payload
*
@@ -83,45 +83,45 @@ wlan_11n_dispatch_amsdu_pkt(mlan_private * priv, pmlan_buffer pmbuf)
static mlan_status
wlan_11n_dispatch_pkt(t_void * priv, t_void * payload)
{
- mlan_status ret = MLAN_STATUS_SUCCESS;
+ mlan_status ret = MLAN_STATUS_SUCCESS;
#ifdef STA_SUPPORT
- pmlan_adapter pmadapter = ((pmlan_private) priv)->adapter;
+ pmlan_adapter pmadapter = ((pmlan_private) priv)->adapter;
#endif
- ENTER();
- if (payload == (t_void *) RX_PKT_DROPPED_IN_FW) {
- LEAVE();
- return ret;
- }
+ ENTER();
+ if (payload == (t_void *) RX_PKT_DROPPED_IN_FW) {
+ LEAVE();
+ return ret;
+ }
#ifdef UAP_SUPPORT
- if (GET_BSS_ROLE((mlan_private *) priv) == MLAN_BSS_ROLE_UAP) {
- if (MLAN_STATUS_SUCCESS ==
- wlan_11n_dispatch_amsdu_pkt((mlan_private *) priv,
- (pmlan_buffer) payload)) {
- LEAVE();
- return ret;
- }
- ret = wlan_process_uap_rx_packet(priv, (pmlan_buffer) payload);
- LEAVE();
- return ret;
- }
+ if (GET_BSS_ROLE((mlan_private *) priv) == MLAN_BSS_ROLE_UAP) {
+ if (MLAN_STATUS_SUCCESS ==
+ wlan_11n_dispatch_amsdu_pkt((mlan_private *) priv,
+ (pmlan_buffer) payload)) {
+ LEAVE();
+ return ret;
+ }
+ ret = wlan_process_uap_rx_packet(priv, (pmlan_buffer) payload);
+ LEAVE();
+ return ret;
+ }
#endif /* UAP_SUPPORT */
#ifdef STA_SUPPORT
- if (MLAN_STATUS_SUCCESS ==
- wlan_11n_dispatch_amsdu_pkt((mlan_private *) priv,
- (pmlan_buffer) payload)) {
- LEAVE();
- return ret;
- }
- ret = wlan_process_rx_packet(pmadapter, (pmlan_buffer) payload);
+ if (MLAN_STATUS_SUCCESS ==
+ wlan_11n_dispatch_amsdu_pkt((mlan_private *) priv,
+ (pmlan_buffer) payload)) {
+ LEAVE();
+ return ret;
+ }
+ ret = wlan_process_rx_packet(pmadapter, (pmlan_buffer) payload);
#endif /* STA_SUPPORT */
- LEAVE();
- return ret;
+ LEAVE();
+ return ret;
}
/**
* @brief This function restarts the reordering timeout timer
- *
+ *
* @param pmadapter A pointer to mlan_adapter
* @param rx_reor_tbl_ptr A pointer to structure RxReorderTbl
*
@@ -129,28 +129,28 @@ wlan_11n_dispatch_pkt(t_void * priv, t_void * payload)
*/
static void
mlan_11n_rxreorder_timer_restart(pmlan_adapter pmadapter,
- RxReorderTbl * rx_reor_tbl_ptr)
+ RxReorderTbl * rx_reor_tbl_ptr)
{
- ENTER();
- if (rx_reor_tbl_ptr->timer_context.timer_is_set)
- pmadapter->callbacks.moal_stop_timer(pmadapter->pmoal_handle,
- rx_reor_tbl_ptr->timer_context.
- timer);
-
- pmadapter->callbacks.moal_start_timer(pmadapter->pmoal_handle,
- rx_reor_tbl_ptr->timer_context.timer,
- MFALSE,
- (rx_reor_tbl_ptr->win_size
- * MIN_FLUSH_TIMER_MS));
-
- rx_reor_tbl_ptr->timer_context.timer_is_set = MTRUE;
- LEAVE();
+ ENTER();
+ if (rx_reor_tbl_ptr->timer_context.timer_is_set)
+ pmadapter->callbacks.moal_stop_timer(pmadapter->pmoal_handle,
+ rx_reor_tbl_ptr->
+ timer_context.timer);
+
+ pmadapter->callbacks.moal_start_timer(pmadapter->pmoal_handle,
+ rx_reor_tbl_ptr->timer_context.
+ timer, MFALSE,
+ (rx_reor_tbl_ptr->win_size *
+ MIN_FLUSH_TIMER_MS));
+
+ rx_reor_tbl_ptr->timer_context.timer_is_set = MTRUE;
+ LEAVE();
}
/**
* @brief This function dispatches all the packets in the buffer.
* There could be holes in the buffer.
- *
+ *
* @param priv A pointer to mlan_private
* @param rx_reor_tbl_ptr A pointer to structure RxReorderTbl
* @param start_win Start window
@@ -159,59 +159,62 @@ mlan_11n_rxreorder_timer_restart(pmlan_adapter pmadapter,
*/
static mlan_status
wlan_11n_dispatch_pkt_until_start_win(t_void * priv,
- RxReorderTbl * rx_reor_tbl_ptr,
- int start_win)
+ RxReorderTbl * rx_reor_tbl_ptr,
+ int start_win)
{
- int no_pkt_to_send, i, xchg;
- mlan_status ret = MLAN_STATUS_SUCCESS;
- void *rx_tmp_ptr = MNULL;
- mlan_private *pmpriv = (mlan_private *) priv;
-
- ENTER();
-
- no_pkt_to_send = (start_win > rx_reor_tbl_ptr->start_win) ?
- MIN((start_win - rx_reor_tbl_ptr->start_win),
- rx_reor_tbl_ptr->win_size) : rx_reor_tbl_ptr->win_size;
-
- for (i = 0; i < no_pkt_to_send; ++i) {
- pmpriv->adapter->callbacks.moal_spin_lock(pmpriv->adapter->pmoal_handle,
- pmpriv->rx_pkt_lock);
- rx_tmp_ptr = MNULL;
- if (rx_reor_tbl_ptr->rx_reorder_ptr[i]) {
- rx_tmp_ptr = rx_reor_tbl_ptr->rx_reorder_ptr[i];
- rx_reor_tbl_ptr->rx_reorder_ptr[i] = MNULL;
- }
- pmpriv->adapter->callbacks.moal_spin_unlock(pmpriv->adapter->
- pmoal_handle,
- pmpriv->rx_pkt_lock);
- if (rx_tmp_ptr)
- wlan_11n_dispatch_pkt(priv, rx_tmp_ptr);
- }
-
- pmpriv->adapter->callbacks.moal_spin_lock(pmpriv->adapter->pmoal_handle,
- pmpriv->rx_pkt_lock);
- /*
- * We don't have a circular buffer, hence use rotation to simulate
- * circular buffer
- */
- xchg = rx_reor_tbl_ptr->win_size - no_pkt_to_send;
- for (i = 0; i < xchg; ++i) {
- rx_reor_tbl_ptr->rx_reorder_ptr[i] =
- rx_reor_tbl_ptr->rx_reorder_ptr[no_pkt_to_send + i];
- rx_reor_tbl_ptr->rx_reorder_ptr[no_pkt_to_send + i] = MNULL;
- }
-
- rx_reor_tbl_ptr->start_win = start_win;
- pmpriv->adapter->callbacks.moal_spin_unlock(pmpriv->adapter->pmoal_handle,
- pmpriv->rx_pkt_lock);
-
- LEAVE();
- return ret;
+ int no_pkt_to_send, i, xchg;
+ mlan_status ret = MLAN_STATUS_SUCCESS;
+ void *rx_tmp_ptr = MNULL;
+ mlan_private *pmpriv = (mlan_private *) priv;
+
+ ENTER();
+
+ no_pkt_to_send = (start_win > rx_reor_tbl_ptr->start_win) ?
+ MIN((start_win - rx_reor_tbl_ptr->start_win),
+ rx_reor_tbl_ptr->win_size) : rx_reor_tbl_ptr->win_size;
+
+ for (i = 0; i < no_pkt_to_send; ++i) {
+ pmpriv->adapter->callbacks.moal_spin_lock(pmpriv->adapter->
+ pmoal_handle,
+ pmpriv->rx_pkt_lock);
+ rx_tmp_ptr = MNULL;
+ if (rx_reor_tbl_ptr->rx_reorder_ptr[i]) {
+ rx_tmp_ptr = rx_reor_tbl_ptr->rx_reorder_ptr[i];
+ rx_reor_tbl_ptr->rx_reorder_ptr[i] = MNULL;
+ }
+ pmpriv->adapter->callbacks.moal_spin_unlock(pmpriv->adapter->
+ pmoal_handle,
+ pmpriv->
+ rx_pkt_lock);
+ if (rx_tmp_ptr)
+ wlan_11n_dispatch_pkt(priv, rx_tmp_ptr);
+ }
+
+ pmpriv->adapter->callbacks.moal_spin_lock(pmpriv->adapter->pmoal_handle,
+ pmpriv->rx_pkt_lock);
+ /*
+ * We don't have a circular buffer, hence use rotation to simulate
+ * circular buffer
+ */
+ xchg = rx_reor_tbl_ptr->win_size - no_pkt_to_send;
+ for (i = 0; i < xchg; ++i) {
+ rx_reor_tbl_ptr->rx_reorder_ptr[i] =
+ rx_reor_tbl_ptr->rx_reorder_ptr[no_pkt_to_send + i];
+ rx_reor_tbl_ptr->rx_reorder_ptr[no_pkt_to_send + i] = MNULL;
+ }
+
+ rx_reor_tbl_ptr->start_win = start_win;
+ pmpriv->adapter->callbacks.moal_spin_unlock(pmpriv->adapter->
+ pmoal_handle,
+ pmpriv->rx_pkt_lock);
+
+ LEAVE();
+ return ret;
}
/**
* @brief This function will display the rxReorder table
- *
+ *
* @param pmadapter A pointer to mlan_adapter structure
* @param rx_reor_tbl_ptr A pointer to structure RxReorderTbl
*
@@ -219,19 +222,19 @@ wlan_11n_dispatch_pkt_until_start_win(t_void * priv,
*/
static t_void
wlan_11n_display_tbl_ptr(pmlan_adapter pmadapter,
- RxReorderTbl * rx_reor_tbl_ptr)
+ RxReorderTbl * rx_reor_tbl_ptr)
{
- ENTER();
+ ENTER();
- DBG_HEXDUMP(MDAT_D, "Reorder ptr", rx_reor_tbl_ptr->rx_reorder_ptr,
- sizeof(t_void *) * rx_reor_tbl_ptr->win_size);
+ DBG_HEXDUMP(MDAT_D, "Reorder ptr", rx_reor_tbl_ptr->rx_reorder_ptr,
+ sizeof(t_void *) * rx_reor_tbl_ptr->win_size);
- LEAVE();
+ LEAVE();
}
/**
- * @brief This function will dispatch all packets sequentially
- * from start_win until a hole is found and adjust the
+ * @brief This function will dispatch all packets sequentially
+ * from start_win until a hole is found and adjust the
* start_win appropriately
*
* @param priv A pointer to mlan_private
@@ -242,56 +245,61 @@ wlan_11n_display_tbl_ptr(pmlan_adapter pmadapter,
static mlan_status
wlan_11n_scan_and_dispatch(t_void * priv, RxReorderTbl * rx_reor_tbl_ptr)
{
- int i, j, xchg;
- mlan_status ret = MLAN_STATUS_SUCCESS;
- void *rx_tmp_ptr = MNULL;
- mlan_private *pmpriv = (mlan_private *) priv;
-
- ENTER();
-
- for (i = 0; i < rx_reor_tbl_ptr->win_size; ++i) {
- pmpriv->adapter->callbacks.moal_spin_lock(pmpriv->adapter->pmoal_handle,
- pmpriv->rx_pkt_lock);
- if (!rx_reor_tbl_ptr->rx_reorder_ptr[i]) {
- pmpriv->adapter->callbacks.moal_spin_unlock(pmpriv->adapter->
- pmoal_handle,
- pmpriv->rx_pkt_lock);
- break;
- }
- rx_tmp_ptr = rx_reor_tbl_ptr->rx_reorder_ptr[i];
- rx_reor_tbl_ptr->rx_reorder_ptr[i] = MNULL;
- pmpriv->adapter->callbacks.moal_spin_unlock(pmpriv->adapter->
- pmoal_handle,
- pmpriv->rx_pkt_lock);
- wlan_11n_dispatch_pkt(priv, rx_tmp_ptr);
- }
-
- pmpriv->adapter->callbacks.moal_spin_lock(pmpriv->adapter->pmoal_handle,
- pmpriv->rx_pkt_lock);
- /*
- * We don't have a circular buffer, hence use rotation to simulate
- * circular buffer
- */
- if (i > 0) {
- xchg = rx_reor_tbl_ptr->win_size - i;
- for (j = 0; j < xchg; ++j) {
- rx_reor_tbl_ptr->rx_reorder_ptr[j] =
- rx_reor_tbl_ptr->rx_reorder_ptr[i + j];
- rx_reor_tbl_ptr->rx_reorder_ptr[i + j] = MNULL;
- }
- }
-
- rx_reor_tbl_ptr->start_win = (rx_reor_tbl_ptr->start_win + i)
- & (MAX_TID_VALUE - 1);
-
- pmpriv->adapter->callbacks.moal_spin_unlock(pmpriv->adapter->pmoal_handle,
- pmpriv->rx_pkt_lock);
- LEAVE();
- return ret;
+ int i, j, xchg;
+ mlan_status ret = MLAN_STATUS_SUCCESS;
+ void *rx_tmp_ptr = MNULL;
+ mlan_private *pmpriv = (mlan_private *) priv;
+
+ ENTER();
+
+ for (i = 0; i < rx_reor_tbl_ptr->win_size; ++i) {
+ pmpriv->adapter->callbacks.moal_spin_lock(pmpriv->adapter->
+ pmoal_handle,
+ pmpriv->rx_pkt_lock);
+ if (!rx_reor_tbl_ptr->rx_reorder_ptr[i]) {
+ pmpriv->adapter->callbacks.moal_spin_unlock(pmpriv->
+ adapter->
+ pmoal_handle,
+ pmpriv->
+ rx_pkt_lock);
+ break;
+ }
+ rx_tmp_ptr = rx_reor_tbl_ptr->rx_reorder_ptr[i];
+ rx_reor_tbl_ptr->rx_reorder_ptr[i] = MNULL;
+ pmpriv->adapter->callbacks.moal_spin_unlock(pmpriv->adapter->
+ pmoal_handle,
+ pmpriv->
+ rx_pkt_lock);
+ wlan_11n_dispatch_pkt(priv, rx_tmp_ptr);
+ }
+
+ pmpriv->adapter->callbacks.moal_spin_lock(pmpriv->adapter->pmoal_handle,
+ pmpriv->rx_pkt_lock);
+ /*
+ * We don't have a circular buffer, hence use rotation to simulate
+ * circular buffer
+ */
+ if (i > 0) {
+ xchg = rx_reor_tbl_ptr->win_size - i;
+ for (j = 0; j < xchg; ++j) {
+ rx_reor_tbl_ptr->rx_reorder_ptr[j] =
+ rx_reor_tbl_ptr->rx_reorder_ptr[i + j];
+ rx_reor_tbl_ptr->rx_reorder_ptr[i + j] = MNULL;
+ }
+ }
+
+ rx_reor_tbl_ptr->start_win = (rx_reor_tbl_ptr->start_win + i)
+ & (MAX_TID_VALUE - 1);
+
+ pmpriv->adapter->callbacks.moal_spin_unlock(pmpriv->adapter->
+ pmoal_handle,
+ pmpriv->rx_pkt_lock);
+ LEAVE();
+ return ret;
}
/**
- * @brief This function delete rxreorder table's entry
+ * @brief This function delete rxreorder table's entry
* and free the memory
*
* @param priv A pointer to mlan_private
@@ -301,49 +309,52 @@ wlan_11n_scan_and_dispatch(t_void * priv, RxReorderTbl * rx_reor_tbl_ptr)
*/
static t_void
wlan_11n_delete_rxreorder_tbl_entry(mlan_private * priv,
- RxReorderTbl * rx_reor_tbl_ptr)
+ RxReorderTbl * rx_reor_tbl_ptr)
{
- pmlan_adapter pmadapter = priv->adapter;
-
- ENTER();
-
- if (!rx_reor_tbl_ptr) {
- LEAVE();
- return;
- }
-
- wlan_11n_dispatch_pkt_until_start_win(priv, rx_reor_tbl_ptr,
- (rx_reor_tbl_ptr->start_win +
- rx_reor_tbl_ptr->win_size)
- & (MAX_TID_VALUE - 1));
-
- if (rx_reor_tbl_ptr->timer_context.timer) {
- if (rx_reor_tbl_ptr->timer_context.timer_is_set)
- priv->adapter->callbacks.moal_stop_timer(pmadapter->pmoal_handle,
- rx_reor_tbl_ptr->timer_context.
- timer);
- priv->adapter->callbacks.moal_free_timer(pmadapter->pmoal_handle,
- rx_reor_tbl_ptr->timer_context.
- timer);
- }
-
- PRINTM(MDAT_D, "Delete rx_reor_tbl_ptr: %p\n", rx_reor_tbl_ptr);
- util_unlink_list(pmadapter->pmoal_handle,
- &priv->rx_reorder_tbl_ptr,
- (pmlan_linked_list) rx_reor_tbl_ptr,
- pmadapter->callbacks.moal_spin_lock,
- pmadapter->callbacks.moal_spin_unlock);
-
- pmadapter->callbacks.moal_mfree(pmadapter->pmoal_handle,
- (t_u8 *) rx_reor_tbl_ptr->rx_reorder_ptr);
- pmadapter->callbacks.moal_mfree(pmadapter->pmoal_handle,
- (t_u8 *) rx_reor_tbl_ptr);
-
- LEAVE();
+ pmlan_adapter pmadapter = priv->adapter;
+
+ ENTER();
+
+ if (!rx_reor_tbl_ptr) {
+ LEAVE();
+ return;
+ }
+
+ wlan_11n_dispatch_pkt_until_start_win(priv, rx_reor_tbl_ptr,
+ (rx_reor_tbl_ptr->start_win +
+ rx_reor_tbl_ptr->win_size)
+ & (MAX_TID_VALUE - 1));
+
+ if (rx_reor_tbl_ptr->timer_context.timer) {
+ if (rx_reor_tbl_ptr->timer_context.timer_is_set)
+ priv->adapter->callbacks.moal_stop_timer(pmadapter->
+ pmoal_handle,
+ rx_reor_tbl_ptr->timer_context.
+ timer);
+ priv->adapter->callbacks.moal_free_timer(pmadapter->
+ pmoal_handle,
+ rx_reor_tbl_ptr->timer_context.
+ timer);
+ }
+
+ PRINTM(MDAT_D, "Delete rx_reor_tbl_ptr: %p\n", rx_reor_tbl_ptr);
+ util_unlink_list(pmadapter->pmoal_handle,
+ &priv->rx_reorder_tbl_ptr,
+ (pmlan_linked_list) rx_reor_tbl_ptr,
+ pmadapter->callbacks.moal_spin_lock,
+ pmadapter->callbacks.moal_spin_unlock);
+
+ pmadapter->callbacks.moal_mfree(pmadapter->pmoal_handle,
+ (t_u8 *) rx_reor_tbl_ptr->
+ rx_reorder_ptr);
+ pmadapter->callbacks.moal_mfree(pmadapter->pmoal_handle,
+ (t_u8 *) rx_reor_tbl_ptr);
+
+ LEAVE();
}
/**
- * @brief This function returns the last used sequence number
+ * @brief This function returns the last used sequence number
*
* @param rx_reorder_tbl_ptr A pointer to structure RxReorderTbl
*
@@ -352,17 +363,17 @@ wlan_11n_delete_rxreorder_tbl_entry(mlan_private * priv,
static int
wlan_11n_find_last_seqnum(RxReorderTbl * rx_reorder_tbl_ptr)
{
- int i;
-
- ENTER();
- for (i = (rx_reorder_tbl_ptr->win_size - 1); i >= 0; --i) {
- if (rx_reorder_tbl_ptr->rx_reorder_ptr[i]) {
- LEAVE();
- return i;
- }
- }
- LEAVE();
- return -1;
+ int i;
+
+ ENTER();
+ for (i = (rx_reorder_tbl_ptr->win_size - 1); i >= 0; --i) {
+ if (rx_reorder_tbl_ptr->rx_reorder_ptr[i]) {
+ LEAVE();
+ return i;
+ }
+ }
+ LEAVE();
+ return -1;
}
/**
@@ -375,30 +386,33 @@ wlan_11n_find_last_seqnum(RxReorderTbl * rx_reorder_tbl_ptr)
static t_void
wlan_flush_data(t_void * context)
{
- reorder_tmr_cnxt_t *reorder_cnxt = (reorder_tmr_cnxt_t *) context;
- int startWin;
-
- ENTER();
- reorder_cnxt->timer_is_set = MFALSE;
- wlan_11n_display_tbl_ptr(reorder_cnxt->priv->adapter, reorder_cnxt->ptr);
-
- if ((startWin = wlan_11n_find_last_seqnum(reorder_cnxt->ptr)) >= 0) {
- PRINTM(MINFO, "Flush data %d\n", startWin);
- wlan_11n_dispatch_pkt_until_start_win(reorder_cnxt->priv,
- reorder_cnxt->ptr,
- ((reorder_cnxt->ptr->start_win +
- startWin + 1) & (MAX_TID_VALUE -
- 1)));
- }
-
- wlan_11n_display_tbl_ptr(reorder_cnxt->priv->adapter, reorder_cnxt->ptr);
- LEAVE();
+ reorder_tmr_cnxt_t *reorder_cnxt = (reorder_tmr_cnxt_t *) context;
+ int startWin;
+
+ ENTER();
+ reorder_cnxt->timer_is_set = MFALSE;
+ wlan_11n_display_tbl_ptr(reorder_cnxt->priv->adapter,
+ reorder_cnxt->ptr);
+
+ if ((startWin = wlan_11n_find_last_seqnum(reorder_cnxt->ptr)) >= 0) {
+ PRINTM(MINFO, "Flush data %d\n", startWin);
+ wlan_11n_dispatch_pkt_until_start_win(reorder_cnxt->priv,
+ reorder_cnxt->ptr,
+ ((reorder_cnxt->ptr->
+ start_win + startWin +
+ 1) & (MAX_TID_VALUE -
+ 1)));
+ }
+
+ wlan_11n_display_tbl_ptr(reorder_cnxt->priv->adapter,
+ reorder_cnxt->ptr);
+ LEAVE();
}
/**
- * @brief This function will create a entry in rx reordering table for the
+ * @brief This function will create a entry in rx reordering table for the
* given ta/tid and will initialize it with seq_num, win_size
- *
+ *
* @param priv A pointer to mlan_private
* @param ta ta to find in reordering table
* @param tid tid to find in reordering table
@@ -409,87 +423,93 @@ wlan_flush_data(t_void * context)
*/
static t_void
wlan_11n_create_rxreorder_tbl(mlan_private * priv, t_u8 * ta, int tid,
- int win_size, int seq_num)
+ int win_size, int seq_num)
{
- int i;
- pmlan_adapter pmadapter = priv->adapter;
- RxReorderTbl *rx_reor_tbl_ptr, *new_node;
- sta_node *sta_ptr = MNULL;
- t_u16 last_seq = 0;
-
- ENTER();
-
- /*
- * If we get a TID, ta pair which is already present dispatch all the
- * the packets and move the window size until the ssn
- */
- if ((rx_reor_tbl_ptr = wlan_11n_get_rxreorder_tbl(priv, tid, ta))) {
- wlan_11n_dispatch_pkt_until_start_win(priv, rx_reor_tbl_ptr, seq_num);
- } else {
- PRINTM(MDAT_D, "%s: seq_num %d, tid %d, ta " MACSTR
- ", win_size %d\n", __FUNCTION__,
- seq_num, tid, MAC2STR(ta), win_size);
- if (pmadapter->callbacks.
- moal_malloc(pmadapter->pmoal_handle, sizeof(RxReorderTbl),
- MLAN_MEM_DEF, (t_u8 **) & new_node)) {
- PRINTM(MERROR, "Rx reorder memory allocation failed\n");
- LEAVE();
- return;
- }
-
- util_init_list((pmlan_linked_list) new_node);
- new_node->tid = tid;
- memcpy(pmadapter, new_node->ta, ta, MLAN_MAC_ADDR_LENGTH);
- new_node->start_win = seq_num;
- if (queuing_ra_based(priv)) {
- // TODO for adhoc
- if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) {
- if ((sta_ptr = wlan_get_station_entry(priv, ta)))
- last_seq = sta_ptr->rx_seq[tid];
- }
- PRINTM(MINFO, "UAP/ADHOC:last_seq=%d start_win=%d\n", last_seq,
- new_node->start_win);
- } else {
- last_seq = priv->rx_seq[tid];
- }
- new_node->last_seq = last_seq;
- new_node->win_size = win_size;
- new_node->force_no_drop = MFALSE;
- new_node->check_start_win = MTRUE;
-
- if (pmadapter->callbacks.
- moal_malloc(pmadapter->pmoal_handle, sizeof(t_void *) * win_size,
- MLAN_MEM_DEF, (t_u8 **) & new_node->rx_reorder_ptr)) {
- PRINTM(MERROR, "Rx reorder table memory allocation" "failed\n");
- pmadapter->callbacks.moal_mfree(pmadapter->pmoal_handle,
- (t_u8 *) new_node);
- LEAVE();
- return;
- }
-
- PRINTM(MDAT_D, "Create ReorderPtr: %p start_win=%d last_seq=%d\n",
- new_node, new_node->start_win, last_seq);
- new_node->timer_context.ptr = new_node;
- new_node->timer_context.priv = priv;
- new_node->timer_context.timer_is_set = MFALSE;
- new_node->ba_status = BA_STREAM_SETUP_INPROGRESS;
-
- pmadapter->callbacks.moal_init_timer(pmadapter->pmoal_handle,
- &new_node->timer_context.timer,
- wlan_flush_data,
- &new_node->timer_context);
-
- for (i = 0; i < win_size; ++i)
- new_node->rx_reorder_ptr[i] = MNULL;
-
- util_enqueue_list_tail(pmadapter->pmoal_handle,
- &priv->rx_reorder_tbl_ptr,
- (pmlan_linked_list) new_node,
- pmadapter->callbacks.moal_spin_lock,
- pmadapter->callbacks.moal_spin_unlock);
- }
-
- LEAVE();
+ int i;
+ pmlan_adapter pmadapter = priv->adapter;
+ RxReorderTbl *rx_reor_tbl_ptr, *new_node;
+ sta_node *sta_ptr = MNULL;
+ t_u16 last_seq = 0;
+
+ ENTER();
+
+ /*
+ * If we get a TID, ta pair which is already present dispatch all the
+ * the packets and move the window size until the ssn
+ */
+ if ((rx_reor_tbl_ptr = wlan_11n_get_rxreorder_tbl(priv, tid, ta))) {
+ wlan_11n_dispatch_pkt_until_start_win(priv,
+ rx_reor_tbl_ptr, seq_num);
+ } else {
+ PRINTM(MDAT_D, "%s: seq_num %d, tid %d, ta " MACSTR
+ ", win_size %d\n", __FUNCTION__,
+ seq_num, tid, MAC2STR(ta), win_size);
+ if (pmadapter->callbacks.
+ moal_malloc(pmadapter->pmoal_handle, sizeof(RxReorderTbl),
+ MLAN_MEM_DEF, (t_u8 **) & new_node)) {
+ PRINTM(MERROR, "Rx reorder memory allocation failed\n");
+ LEAVE();
+ return;
+ }
+
+ util_init_list((pmlan_linked_list) new_node);
+ new_node->tid = tid;
+ memcpy(pmadapter, new_node->ta, ta, MLAN_MAC_ADDR_LENGTH);
+ new_node->start_win = seq_num;
+ if (queuing_ra_based(priv)) {
+ // TODO for adhoc
+ if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) {
+ if ((sta_ptr =
+ wlan_get_station_entry(priv, ta)))
+ last_seq = sta_ptr->rx_seq[tid];
+ }
+ PRINTM(MINFO, "UAP/ADHOC:last_seq=%d start_win=%d\n",
+ last_seq, new_node->start_win);
+ } else {
+ last_seq = priv->rx_seq[tid];
+ }
+ new_node->last_seq = last_seq;
+ new_node->win_size = win_size;
+ new_node->force_no_drop = MFALSE;
+ new_node->check_start_win = MTRUE;
+
+ if (pmadapter->callbacks.
+ moal_malloc(pmadapter->pmoal_handle,
+ sizeof(t_void *) * win_size, MLAN_MEM_DEF,
+ (t_u8 **) & new_node->rx_reorder_ptr)) {
+ PRINTM(MERROR,
+ "Rx reorder table memory allocation" "failed\n");
+ pmadapter->callbacks.moal_mfree(pmadapter->pmoal_handle,
+ (t_u8 *) new_node);
+ LEAVE();
+ return;
+ }
+
+ PRINTM(MDAT_D,
+ "Create ReorderPtr: %p start_win=%d last_seq=%d\n",
+ new_node, new_node->start_win, last_seq);
+ new_node->timer_context.ptr = new_node;
+ new_node->timer_context.priv = priv;
+ new_node->timer_context.timer_is_set = MFALSE;
+ new_node->ba_status = BA_STREAM_SETUP_INPROGRESS;
+
+ pmadapter->callbacks.moal_init_timer(pmadapter->pmoal_handle,
+ &new_node->
+ timer_context.timer,
+ wlan_flush_data,
+ &new_node->timer_context);
+
+ for (i = 0; i < win_size; ++i)
+ new_node->rx_reorder_ptr[i] = MNULL;
+
+ util_enqueue_list_tail(pmadapter->pmoal_handle,
+ &priv->rx_reorder_tbl_ptr,
+ (pmlan_linked_list) new_node,
+ pmadapter->callbacks.moal_spin_lock,
+ pmadapter->callbacks.moal_spin_unlock);
+ }
+
+ LEAVE();
}
/********************************************************
@@ -497,9 +517,9 @@ wlan_11n_create_rxreorder_tbl(mlan_private * priv, t_u8 * ta, int tid,
********************************************************/
/**
- * @brief This function will return the pointer to a entry in rx reordering
+ * @brief This function will return the pointer to a entry in rx reordering
* table which matches the give TA/TID pair
- *
+ *
* @param priv A pointer to mlan_private
* @param ta ta to find in reordering table
* @param tid tid to find in reordering table
@@ -509,41 +529,41 @@ wlan_11n_create_rxreorder_tbl(mlan_private * priv, t_u8 * ta, int tid,
RxReorderTbl *
wlan_11n_get_rxreorder_tbl(mlan_private * priv, int tid, t_u8 * ta)
{
- RxReorderTbl *rx_reor_tbl_ptr;
-
- ENTER();
-
- if (!
- (rx_reor_tbl_ptr =
- (RxReorderTbl *) util_peek_list(priv->adapter->pmoal_handle,
- &priv->rx_reorder_tbl_ptr,
- priv->adapter->callbacks.
- moal_spin_lock,
- priv->adapter->callbacks.
- moal_spin_unlock))) {
- LEAVE();
- return MNULL;
- }
-
- while (rx_reor_tbl_ptr != (RxReorderTbl *) & priv->rx_reorder_tbl_ptr) {
- if ((!memcmp
- (priv->adapter, rx_reor_tbl_ptr->ta, ta, MLAN_MAC_ADDR_LENGTH)) &&
- (rx_reor_tbl_ptr->tid == tid)) {
- LEAVE();
- return rx_reor_tbl_ptr;
- }
-
- rx_reor_tbl_ptr = rx_reor_tbl_ptr->pnext;
- }
-
- LEAVE();
- return MNULL;
+ RxReorderTbl *rx_reor_tbl_ptr;
+
+ ENTER();
+
+ if (!
+ (rx_reor_tbl_ptr =
+ (RxReorderTbl *) util_peek_list(priv->adapter->pmoal_handle,
+ &priv->rx_reorder_tbl_ptr,
+ priv->adapter->callbacks.
+ moal_spin_lock,
+ priv->adapter->callbacks.
+ moal_spin_unlock))) {
+ LEAVE();
+ return MNULL;
+ }
+
+ while (rx_reor_tbl_ptr != (RxReorderTbl *) & priv->rx_reorder_tbl_ptr) {
+ if ((!memcmp
+ (priv->adapter, rx_reor_tbl_ptr->ta, ta,
+ MLAN_MAC_ADDR_LENGTH)) && (rx_reor_tbl_ptr->tid == tid)) {
+ LEAVE();
+ return rx_reor_tbl_ptr;
+ }
+
+ rx_reor_tbl_ptr = rx_reor_tbl_ptr->pnext;
+ }
+
+ LEAVE();
+ return MNULL;
}
-/**
+/**
* @brief This function prepares command for adding a block ack
* request.
- *
+ *
* @param priv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param pdata_buf A pointer to data buffer
@@ -552,31 +572,33 @@ wlan_11n_get_rxreorder_tbl(mlan_private * priv, int tid, t_u8 * ta)
*/
mlan_status
wlan_cmd_11n_addba_req(mlan_private * priv,
- HostCmd_DS_COMMAND * cmd, t_void * pdata_buf)
+ HostCmd_DS_COMMAND * cmd, t_void * pdata_buf)
{
- HostCmd_DS_11N_ADDBA_REQ *padd_ba_req = (HostCmd_DS_11N_ADDBA_REQ *)
- & cmd->params.add_ba_req;
- ENTER();
-
- cmd->command = wlan_cpu_to_le16(HostCmd_CMD_11N_ADDBA_REQ);
- cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_11N_ADDBA_REQ) + S_DS_GEN);
-
- memcpy(priv->adapter, padd_ba_req, pdata_buf,
- sizeof(HostCmd_DS_11N_ADDBA_REQ));
- padd_ba_req->block_ack_param_set =
- wlan_cpu_to_le16(padd_ba_req->block_ack_param_set);
- padd_ba_req->block_ack_tmo = wlan_cpu_to_le16(padd_ba_req->block_ack_tmo);
- padd_ba_req->ssn = wlan_cpu_to_le16(padd_ba_req->ssn);
- padd_ba_req->add_req_result = 0;
-
- LEAVE();
- return MLAN_STATUS_SUCCESS;
+ HostCmd_DS_11N_ADDBA_REQ *padd_ba_req = (HostCmd_DS_11N_ADDBA_REQ *)
+ & cmd->params.add_ba_req;
+ ENTER();
+
+ cmd->command = wlan_cpu_to_le16(HostCmd_CMD_11N_ADDBA_REQ);
+ cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_11N_ADDBA_REQ) +
+ S_DS_GEN);
+
+ memcpy(priv->adapter, padd_ba_req, pdata_buf,
+ sizeof(HostCmd_DS_11N_ADDBA_REQ));
+ padd_ba_req->block_ack_param_set =
+ wlan_cpu_to_le16(padd_ba_req->block_ack_param_set);
+ padd_ba_req->block_ack_tmo =
+ wlan_cpu_to_le16(padd_ba_req->block_ack_tmo);
+ padd_ba_req->ssn = wlan_cpu_to_le16(padd_ba_req->ssn);
+ padd_ba_req->add_req_result = 0;
+
+ LEAVE();
+ return MLAN_STATUS_SUCCESS;
}
-/**
+/**
* @brief This function prepares command for adding a block ack
* response.
- *
+ *
* @param priv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param pdata_buf A pointer to data buffer
@@ -585,78 +607,87 @@ wlan_cmd_11n_addba_req(mlan_private * priv,
*/
mlan_status
wlan_cmd_11n_addba_rspgen(mlan_private * priv,
- HostCmd_DS_COMMAND * cmd, void *pdata_buf)
+ HostCmd_DS_COMMAND * cmd, void *pdata_buf)
{
- HostCmd_DS_11N_ADDBA_RSP *padd_ba_rsp = (HostCmd_DS_11N_ADDBA_RSP *)
- & cmd->params.add_ba_rsp;
- HostCmd_DS_11N_ADDBA_REQ *pevt_addba_req =
- (HostCmd_DS_11N_ADDBA_REQ *) pdata_buf;
- t_u8 tid = 0;
- int win_size = 0;
-
- ENTER();
-
- pevt_addba_req->block_ack_param_set =
- wlan_le16_to_cpu(pevt_addba_req->block_ack_param_set);
- pevt_addba_req->block_ack_tmo =
- wlan_le16_to_cpu(pevt_addba_req->block_ack_tmo);
- pevt_addba_req->ssn = wlan_le16_to_cpu(pevt_addba_req->ssn);
-
- cmd->command = wlan_cpu_to_le16(HostCmd_CMD_11N_ADDBA_RSP);
- cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_11N_ADDBA_RSP) + S_DS_GEN);
-
- memcpy(priv->adapter, padd_ba_rsp->peer_mac_addr,
- pevt_addba_req->peer_mac_addr, MLAN_MAC_ADDR_LENGTH);
- padd_ba_rsp->dialog_token = pevt_addba_req->dialog_token;
- padd_ba_rsp->block_ack_tmo =
- wlan_cpu_to_le16(pevt_addba_req->block_ack_tmo);
- padd_ba_rsp->ssn = wlan_cpu_to_le16(pevt_addba_req->ssn);
- padd_ba_rsp->add_rsp_result = 0;
-
- padd_ba_rsp->block_ack_param_set = pevt_addba_req->block_ack_param_set;
- tid = (padd_ba_rsp->block_ack_param_set & BLOCKACKPARAM_TID_MASK)
- >> BLOCKACKPARAM_TID_POS;
- if (priv->addba_reject[tid]
- || (priv->port_ctrl_mode == MTRUE && priv->port_open == MFALSE)
+ HostCmd_DS_11N_ADDBA_RSP *padd_ba_rsp = (HostCmd_DS_11N_ADDBA_RSP *)
+ & cmd->params.add_ba_rsp;
+ HostCmd_DS_11N_ADDBA_REQ *pevt_addba_req =
+ (HostCmd_DS_11N_ADDBA_REQ *) pdata_buf;
+ t_u8 tid = 0;
+ int win_size = 0;
+
+ ENTER();
+
+ pevt_addba_req->block_ack_param_set =
+ wlan_le16_to_cpu(pevt_addba_req->block_ack_param_set);
+ pevt_addba_req->block_ack_tmo =
+ wlan_le16_to_cpu(pevt_addba_req->block_ack_tmo);
+ pevt_addba_req->ssn = wlan_le16_to_cpu(pevt_addba_req->ssn);
+
+ cmd->command = wlan_cpu_to_le16(HostCmd_CMD_11N_ADDBA_RSP);
+ cmd->size =
+ wlan_cpu_to_le16(sizeof(HostCmd_DS_11N_ADDBA_RSP) + S_DS_GEN);
+
+ memcpy(priv->adapter, padd_ba_rsp->peer_mac_addr,
+ pevt_addba_req->peer_mac_addr, MLAN_MAC_ADDR_LENGTH);
+ padd_ba_rsp->dialog_token = pevt_addba_req->dialog_token;
+ padd_ba_rsp->block_ack_tmo =
+ wlan_cpu_to_le16(pevt_addba_req->block_ack_tmo);
+ padd_ba_rsp->ssn = wlan_cpu_to_le16(pevt_addba_req->ssn);
+ padd_ba_rsp->add_rsp_result = 0;
+
+ padd_ba_rsp->block_ack_param_set = pevt_addba_req->block_ack_param_set;
+ tid = (padd_ba_rsp->block_ack_param_set & BLOCKACKPARAM_TID_MASK)
+ >> BLOCKACKPARAM_TID_POS;
+ if (priv->addba_reject[tid]
+ || (priv->port_ctrl_mode == MTRUE && priv->port_open == MFALSE)
#ifdef STA_SUPPORT
- || ((GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA)
- && priv->wps.session_enable)
+ || ((GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA)
+ && priv->wps.session_enable)
#endif
#ifdef UAP_SUPPORT
- || ((GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP)
- && (priv->adapter->pending_bridge_pkts > RX_LOW_THRESHOLD))
+ || ((GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP)
+ && (priv->adapter->pending_bridge_pkts > RX_LOW_THRESHOLD))
#endif
- )
- padd_ba_rsp->status_code = wlan_cpu_to_le16(ADDBA_RSP_STATUS_DECLINED);
- else
- padd_ba_rsp->status_code = wlan_cpu_to_le16(ADDBA_RSP_STATUS_ACCEPT);
- padd_ba_rsp->block_ack_param_set &= ~BLOCKACKPARAM_WINSIZE_MASK;
- if (!priv->add_ba_param.rx_amsdu ||
- (priv->aggr_prio_tbl[tid].amsdu == BA_STREAM_NOT_ALLOWED))
- /* We do not support AMSDU inside AMPDU, hence reset the bit */
- padd_ba_rsp->block_ack_param_set &= ~BLOCKACKPARAM_AMSDU_SUPP_MASK;
-
- padd_ba_rsp->block_ack_param_set |= (priv->add_ba_param.rx_win_size <<
- BLOCKACKPARAM_WINSIZE_POS);
- win_size = (padd_ba_rsp->block_ack_param_set & BLOCKACKPARAM_WINSIZE_MASK)
- >> BLOCKACKPARAM_WINSIZE_POS;
- if (win_size == 0)
- padd_ba_rsp->status_code = wlan_cpu_to_le16(ADDBA_RSP_STATUS_DECLINED);
-
- padd_ba_rsp->block_ack_param_set =
- wlan_cpu_to_le16(padd_ba_rsp->block_ack_param_set);
-
- if (padd_ba_rsp->status_code == wlan_cpu_to_le16(ADDBA_RSP_STATUS_ACCEPT))
- wlan_11n_create_rxreorder_tbl(priv, pevt_addba_req->peer_mac_addr, tid,
- win_size, pevt_addba_req->ssn);
- LEAVE();
- return MLAN_STATUS_SUCCESS;
+ )
+ padd_ba_rsp->status_code =
+ wlan_cpu_to_le16(ADDBA_RSP_STATUS_DECLINED);
+ else
+ padd_ba_rsp->status_code =
+ wlan_cpu_to_le16(ADDBA_RSP_STATUS_ACCEPT);
+ padd_ba_rsp->block_ack_param_set &= ~BLOCKACKPARAM_WINSIZE_MASK;
+ if (!priv->add_ba_param.rx_amsdu ||
+ (priv->aggr_prio_tbl[tid].amsdu == BA_STREAM_NOT_ALLOWED))
+ /* We do not support AMSDU inside AMPDU, hence reset the bit */
+ padd_ba_rsp->block_ack_param_set &=
+ ~BLOCKACKPARAM_AMSDU_SUPP_MASK;
+
+ padd_ba_rsp->block_ack_param_set |= (priv->add_ba_param.rx_win_size <<
+ BLOCKACKPARAM_WINSIZE_POS);
+ win_size =
+ (padd_ba_rsp->block_ack_param_set & BLOCKACKPARAM_WINSIZE_MASK)
+ >> BLOCKACKPARAM_WINSIZE_POS;
+ if (win_size == 0)
+ padd_ba_rsp->status_code =
+ wlan_cpu_to_le16(ADDBA_RSP_STATUS_DECLINED);
+
+ padd_ba_rsp->block_ack_param_set =
+ wlan_cpu_to_le16(padd_ba_rsp->block_ack_param_set);
+
+ if (padd_ba_rsp->status_code ==
+ wlan_cpu_to_le16(ADDBA_RSP_STATUS_ACCEPT))
+ wlan_11n_create_rxreorder_tbl(priv,
+ pevt_addba_req->peer_mac_addr,
+ tid, win_size,
+ pevt_addba_req->ssn);
+ LEAVE();
+ return MLAN_STATUS_SUCCESS;
}
-/**
+/**
* @brief This function prepares command for deleting a block ack
* request.
- *
+ *
* @param priv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param pdata_buf A pointer to data buffer
@@ -665,29 +696,29 @@ wlan_cmd_11n_addba_rspgen(mlan_private * priv,
*/
mlan_status
wlan_cmd_11n_delba(mlan_private * priv,
- HostCmd_DS_COMMAND * cmd, void *pdata_buf)
+ HostCmd_DS_COMMAND * cmd, void *pdata_buf)
{
- HostCmd_DS_11N_DELBA *pdel_ba = (HostCmd_DS_11N_DELBA *)
- & cmd->params.del_ba;
+ HostCmd_DS_11N_DELBA *pdel_ba = (HostCmd_DS_11N_DELBA *)
+ & cmd->params.del_ba;
- ENTER();
+ ENTER();
- cmd->command = wlan_cpu_to_le16(HostCmd_CMD_11N_DELBA);
- cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_11N_DELBA) + S_DS_GEN);
+ cmd->command = wlan_cpu_to_le16(HostCmd_CMD_11N_DELBA);
+ cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_11N_DELBA) + S_DS_GEN);
- memcpy(priv->adapter, pdel_ba, pdata_buf, sizeof(HostCmd_DS_11N_DELBA));
- pdel_ba->del_ba_param_set = wlan_cpu_to_le16(pdel_ba->del_ba_param_set);
- pdel_ba->reason_code = wlan_cpu_to_le16(pdel_ba->reason_code);
- pdel_ba->del_result = 0;
+ memcpy(priv->adapter, pdel_ba, pdata_buf, sizeof(HostCmd_DS_11N_DELBA));
+ pdel_ba->del_ba_param_set = wlan_cpu_to_le16(pdel_ba->del_ba_param_set);
+ pdel_ba->reason_code = wlan_cpu_to_le16(pdel_ba->reason_code);
+ pdel_ba->del_result = 0;
- LEAVE();
- return MLAN_STATUS_SUCCESS;
+ LEAVE();
+ return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function will identify if RxReodering is needed for the packet
* and will do the reordering if required before sending it to kernel
- *
+ *
* @param priv A pointer to mlan_private
* @param seq_num Seqence number of the current packet
* @param tid Tid of the current packet
@@ -699,224 +730,265 @@ wlan_cmd_11n_delba(mlan_private * priv,
*/
mlan_status
mlan_11n_rxreorder_pkt(void *priv, t_u16 seq_num, t_u16 tid,
- t_u8 * ta, t_u8 pkt_type, void *payload)
+ t_u8 * ta, t_u8 pkt_type, void *payload)
{
- RxReorderTbl *rx_reor_tbl_ptr;
- int prev_start_win, start_win, end_win, win_size;
- mlan_status ret = MLAN_STATUS_SUCCESS;
- pmlan_adapter pmadapter = ((mlan_private *) priv)->adapter;
-
- ENTER();
-
- if (!
- (rx_reor_tbl_ptr =
- wlan_11n_get_rxreorder_tbl((mlan_private *) priv, tid, ta))) {
- if (pkt_type != PKT_TYPE_BAR)
- wlan_11n_dispatch_pkt(priv, payload);
-
- LEAVE();
- return ret;
-
- } else {
- if ((pkt_type == PKT_TYPE_AMSDU) && !rx_reor_tbl_ptr->amsdu) {
- wlan_11n_dispatch_pkt(priv, payload);
- LEAVE();
- return ret;
- }
- if (pkt_type == PKT_TYPE_BAR)
- PRINTM(MDAT_D, "BAR ");
- if (pkt_type == PKT_TYPE_AMSDU)
- PRINTM(MDAT_D, "AMSDU ");
-
- if (rx_reor_tbl_ptr->check_start_win) {
- rx_reor_tbl_ptr->check_start_win = MFALSE;
- if ((seq_num != rx_reor_tbl_ptr->start_win) &&
- (rx_reor_tbl_ptr->last_seq != DEFAULT_SEQ_NUM)) {
- end_win =
- (rx_reor_tbl_ptr->start_win + rx_reor_tbl_ptr->win_size -
- 1) & (MAX_TID_VALUE - 1);
- if (((end_win > rx_reor_tbl_ptr->start_win)
- && (rx_reor_tbl_ptr->last_seq >=
- rx_reor_tbl_ptr->start_win)
- && (rx_reor_tbl_ptr->last_seq < end_win)) ||
- ((end_win < rx_reor_tbl_ptr->start_win) &&
- ((rx_reor_tbl_ptr->last_seq >= rx_reor_tbl_ptr->start_win)
- || (rx_reor_tbl_ptr->last_seq < end_win)))) {
- PRINTM(MDAT_D,
- "Update start_win: last_seq=%d, start_win=%d seq_num=%d\n",
- rx_reor_tbl_ptr->last_seq,
- rx_reor_tbl_ptr->start_win, seq_num);
- rx_reor_tbl_ptr->start_win = rx_reor_tbl_ptr->last_seq + 1;
- } else if ((seq_num < rx_reor_tbl_ptr->start_win) &&
- (seq_num > rx_reor_tbl_ptr->last_seq)) {
- PRINTM(MDAT_D,
- "Update start_win: last_seq=%d, start_win=%d seq_num=%d\n",
- rx_reor_tbl_ptr->last_seq,
- rx_reor_tbl_ptr->start_win, seq_num);
- rx_reor_tbl_ptr->start_win = rx_reor_tbl_ptr->last_seq + 1;
- }
- }
- }
-
- prev_start_win = start_win = rx_reor_tbl_ptr->start_win;
- win_size = rx_reor_tbl_ptr->win_size;
- end_win = ((start_win + win_size) - 1) & (MAX_TID_VALUE - 1);
-
- PRINTM(MDAT_D, "TID %d, TA " MACSTR "\n", tid, MAC2STR(ta));
- PRINTM(MDAT_D,
- "1:seq_num %d start_win %d win_size %d end_win %d\n",
- seq_num, start_win, win_size, end_win);
- /*
- * If seq_num is less then starting win then ignore and drop
- * the packet
- */
- if (rx_reor_tbl_ptr->force_no_drop) {
- PRINTM(MDAT_D, "Force no drop packet after HS_ACTIVED\n");
- rx_reor_tbl_ptr->force_no_drop = MFALSE;
- } else {
- if ((start_win + TWOPOW11) > (MAX_TID_VALUE - 1)) { /* Wrap */
- if (seq_num >= ((start_win + (TWOPOW11)) &
- (MAX_TID_VALUE - 1)) && (seq_num < start_win)) {
- ret = MLAN_STATUS_FAILURE;
- goto done;
- }
- } else if ((seq_num < start_win) ||
- (seq_num > (start_win + (TWOPOW11)))) {
- ret = MLAN_STATUS_FAILURE;
- goto done;
- }
- }
-
- /*
- * If this packet is a BAR we adjust seq_num as
- * WinStart = seq_num
- */
- if (pkt_type == PKT_TYPE_BAR)
- seq_num = ((seq_num + win_size) - 1) & (MAX_TID_VALUE - 1);
-
- PRINTM(MDAT_D,
- "2:seq_num %d start_win %d win_size %d end_win %d\n",
- seq_num, start_win, win_size, end_win);
-
- if (((end_win < start_win) &&
- (seq_num < start_win) && (seq_num > end_win))
- || ((end_win > start_win) &&
- ((seq_num > end_win) || (seq_num < start_win)))) {
-
- end_win = seq_num;
- if (((seq_num - win_size) + 1) >= 0)
- start_win = (end_win - win_size) + 1;
- else
- start_win = (MAX_TID_VALUE - (win_size - seq_num)) + 1;
-
- if ((ret = wlan_11n_dispatch_pkt_until_start_win(priv,
- rx_reor_tbl_ptr,
- start_win))) {
- goto done;
- }
- }
-
- PRINTM(MDAT_D, "3:seq_num %d start_win %d win_size %d"
- " end_win %d\n", seq_num, start_win, win_size, end_win);
- if (pkt_type != PKT_TYPE_BAR) {
- if (seq_num >= start_win) {
- if (rx_reor_tbl_ptr->rx_reorder_ptr[seq_num - start_win]) {
- PRINTM(MDAT_D, "Drop Duplicate Pkt\n");
- ret = MLAN_STATUS_FAILURE;
- goto done;
- }
- rx_reor_tbl_ptr->rx_reorder_ptr[seq_num - start_win] = payload;
- } else { /* Wrap condition */
- if (rx_reor_tbl_ptr->rx_reorder_ptr[(seq_num
- + (MAX_TID_VALUE)) -
- start_win]) {
- PRINTM(MDAT_D, "Drop Duplicate Pkt\n");
- ret = MLAN_STATUS_FAILURE;
- goto done;
- }
- rx_reor_tbl_ptr->rx_reorder_ptr[(seq_num
- + (MAX_TID_VALUE)) -
- start_win] = payload;
- }
- }
-
- wlan_11n_display_tbl_ptr(pmadapter, rx_reor_tbl_ptr);
-
- /*
- * Dispatch all packets sequentially from start_win until a
- * hole is found and adjust the start_win appropriately
- */
- ret = wlan_11n_scan_and_dispatch(priv, rx_reor_tbl_ptr);
-
- wlan_11n_display_tbl_ptr(pmadapter, rx_reor_tbl_ptr);
- }
-
- done:
- if (!rx_reor_tbl_ptr->timer_context.timer_is_set ||
- (prev_start_win != rx_reor_tbl_ptr->start_win)) {
-
- mlan_11n_rxreorder_timer_restart(pmadapter, rx_reor_tbl_ptr);
- }
-
- LEAVE();
- return ret;
+ RxReorderTbl *rx_reor_tbl_ptr;
+ int prev_start_win, start_win, end_win, win_size;
+ mlan_status ret = MLAN_STATUS_SUCCESS;
+ pmlan_adapter pmadapter = ((mlan_private *) priv)->adapter;
+
+ ENTER();
+
+ if (!
+ (rx_reor_tbl_ptr =
+ wlan_11n_get_rxreorder_tbl((mlan_private *) priv, tid, ta))) {
+ if (pkt_type != PKT_TYPE_BAR)
+ wlan_11n_dispatch_pkt(priv, payload);
+
+ LEAVE();
+ return ret;
+
+ } else {
+ if ((pkt_type == PKT_TYPE_AMSDU) && !rx_reor_tbl_ptr->amsdu) {
+ wlan_11n_dispatch_pkt(priv, payload);
+ LEAVE();
+ return ret;
+ }
+ if (pkt_type == PKT_TYPE_BAR)
+ PRINTM(MDAT_D, "BAR ");
+ if (pkt_type == PKT_TYPE_AMSDU)
+ PRINTM(MDAT_D, "AMSDU ");
+
+ if (rx_reor_tbl_ptr->check_start_win) {
+ rx_reor_tbl_ptr->check_start_win = MFALSE;
+ if ((seq_num != rx_reor_tbl_ptr->start_win) &&
+ (rx_reor_tbl_ptr->last_seq != DEFAULT_SEQ_NUM)) {
+ end_win =
+ (rx_reor_tbl_ptr->start_win +
+ rx_reor_tbl_ptr->win_size -
+ 1) & (MAX_TID_VALUE - 1);
+ if (((end_win > rx_reor_tbl_ptr->start_win)
+ && (rx_reor_tbl_ptr->last_seq >=
+ rx_reor_tbl_ptr->start_win)
+ && (rx_reor_tbl_ptr->last_seq < end_win))
+ || ((end_win < rx_reor_tbl_ptr->start_win)
+ &&
+ ((rx_reor_tbl_ptr->last_seq >=
+ rx_reor_tbl_ptr->start_win) ||
+ (rx_reor_tbl_ptr->last_seq <
+ end_win)))) {
+ PRINTM(MDAT_D,
+ "Update start_win: last_seq=%d, start_win=%d seq_num=%d\n",
+ rx_reor_tbl_ptr->last_seq,
+ rx_reor_tbl_ptr->start_win,
+ seq_num);
+ rx_reor_tbl_ptr->start_win =
+ rx_reor_tbl_ptr->last_seq + 1;
+ } else if ((seq_num <
+ rx_reor_tbl_ptr->start_win) &&
+ (seq_num >
+ rx_reor_tbl_ptr->last_seq)) {
+ PRINTM(MDAT_D,
+ "Update start_win: last_seq=%d, start_win=%d seq_num=%d\n",
+ rx_reor_tbl_ptr->last_seq,
+ rx_reor_tbl_ptr->start_win,
+ seq_num);
+ rx_reor_tbl_ptr->start_win =
+ rx_reor_tbl_ptr->last_seq + 1;
+ }
+ }
+ }
+ if (rx_reor_tbl_ptr->force_no_drop) {
+ wlan_11n_dispatch_pkt_until_start_win(priv,
+ rx_reor_tbl_ptr,
+ (rx_reor_tbl_ptr->
+ start_win +
+ rx_reor_tbl_ptr->
+ win_size)
+ & (MAX_TID_VALUE -
+ 1));
+ if (pkt_type != PKT_TYPE_BAR)
+ rx_reor_tbl_ptr->start_win = seq_num;
+ mlan_11n_rxreorder_timer_restart(pmadapter,
+ rx_reor_tbl_ptr);
+ }
+
+ prev_start_win = start_win = rx_reor_tbl_ptr->start_win;
+ win_size = rx_reor_tbl_ptr->win_size;
+ end_win = ((start_win + win_size) - 1) & (MAX_TID_VALUE - 1);
+
+ PRINTM(MDAT_D, "TID %d, TA " MACSTR "\n", tid, MAC2STR(ta));
+ PRINTM(MDAT_D,
+ "1:seq_num %d start_win %d win_size %d end_win %d\n",
+ seq_num, start_win, win_size, end_win);
+ /*
+ * If seq_num is less then starting win then ignore and drop
+ * the packet
+ */
+ if (rx_reor_tbl_ptr->force_no_drop || pkt_type == PKT_TYPE_BAR) {
+ PRINTM(MDAT_D, "No drop packet\n");
+ rx_reor_tbl_ptr->force_no_drop = MFALSE;
+ } else {
+ if ((start_win + TWOPOW11) > (MAX_TID_VALUE - 1)) { /* Wrap
+ */
+ if (seq_num >= ((start_win + (TWOPOW11)) &
+ (MAX_TID_VALUE - 1)) &&
+ (seq_num < start_win)) {
+ ret = MLAN_STATUS_FAILURE;
+ goto done;
+ }
+ } else if ((seq_num < start_win) ||
+ (seq_num > (start_win + (TWOPOW11)))) {
+ ret = MLAN_STATUS_FAILURE;
+ goto done;
+ }
+ }
+
+ /*
+ * If this packet is a BAR we adjust seq_num as
+ * WinStart = seq_num
+ */
+ if (pkt_type == PKT_TYPE_BAR)
+ seq_num =
+ ((seq_num + win_size) - 1) & (MAX_TID_VALUE -
+ 1);
+
+ PRINTM(MDAT_D,
+ "2:seq_num %d start_win %d win_size %d end_win %d\n",
+ seq_num, start_win, win_size, end_win);
+
+ if (((end_win < start_win) &&
+ (seq_num < start_win) && (seq_num > end_win))
+ || ((end_win > start_win) &&
+ ((seq_num > end_win) || (seq_num < start_win)))) {
+
+ end_win = seq_num;
+ if (((seq_num - win_size) + 1) >= 0)
+ start_win = (end_win - win_size) + 1;
+ else
+ start_win = (MAX_TID_VALUE -
+ (win_size - seq_num)) + 1;
+
+ if ((ret = wlan_11n_dispatch_pkt_until_start_win(priv,
+ rx_reor_tbl_ptr,
+ start_win)))
+ {
+ goto done;
+ }
+ }
+
+ PRINTM(MDAT_D, "3:seq_num %d start_win %d win_size %d"
+ " end_win %d\n", seq_num, start_win, win_size, end_win);
+ if (pkt_type != PKT_TYPE_BAR) {
+ if (seq_num >= start_win) {
+ if (rx_reor_tbl_ptr->rx_reorder_ptr[seq_num
+ -
+ start_win])
+ {
+ PRINTM(MDAT_D, "Drop Duplicate Pkt\n");
+ ret = MLAN_STATUS_FAILURE;
+ goto done;
+ }
+ rx_reor_tbl_ptr->rx_reorder_ptr[seq_num
+ - start_win] =
+ payload;
+ } else { /* Wrap condition */
+ if (rx_reor_tbl_ptr->rx_reorder_ptr[(seq_num
+ +
+ (MAX_TID_VALUE))
+ -
+ start_win])
+ {
+ PRINTM(MDAT_D, "Drop Duplicate Pkt\n");
+ ret = MLAN_STATUS_FAILURE;
+ goto done;
+ }
+ rx_reor_tbl_ptr->rx_reorder_ptr[(seq_num
+ +
+ (MAX_TID_VALUE))
+ - start_win] =
+ payload;
+ }
+ }
+
+ wlan_11n_display_tbl_ptr(pmadapter, rx_reor_tbl_ptr);
+
+ /*
+ * Dispatch all packets sequentially from start_win until a
+ * hole is found and adjust the start_win appropriately
+ */
+ ret = wlan_11n_scan_and_dispatch(priv, rx_reor_tbl_ptr);
+
+ wlan_11n_display_tbl_ptr(pmadapter, rx_reor_tbl_ptr);
+ }
+
+done:
+ if (!rx_reor_tbl_ptr->timer_context.timer_is_set ||
+ (prev_start_win != rx_reor_tbl_ptr->start_win)) {
+
+ mlan_11n_rxreorder_timer_restart(pmadapter, rx_reor_tbl_ptr);
+ }
+
+ LEAVE();
+ return ret;
}
/**
* @brief This function will delete an entry for a given tid/ta pair. tid/ta
* are taken from delba_event body
- *
+ *
* @param priv A pointer to mlan_private
* @param tid tid to send delba
* @param peer_mac MAC address to send delba
- * @param type TYPE_DELBA_SENT or TYPE_DELBA_RECEIVE
+ * @param type TYPE_DELBA_SENT or TYPE_DELBA_RECEIVE
* @param initiator MTRUE if we are initiator of ADDBA, MFALSE otherwise
*
* @return N/A
*/
void
mlan_11n_delete_bastream_tbl(mlan_private * priv, int tid,
- t_u8 * peer_mac, t_u8 type, int initiator)
+ t_u8 * peer_mac, t_u8 type, int initiator)
{
- RxReorderTbl *rx_reor_tbl_ptr;
- TxBAStreamTbl *ptxtbl;
- t_u8 cleanup_rx_reorder_tbl;
-
- ENTER();
-
- if (type == TYPE_DELBA_RECEIVE)
- cleanup_rx_reorder_tbl = (initiator) ? MTRUE : MFALSE;
- else
- cleanup_rx_reorder_tbl = (initiator) ? MFALSE : MTRUE;
-
- PRINTM(MEVENT, "DELBA: " MACSTR " tid=%d,"
- "initiator=%d\n", MAC2STR(peer_mac), tid, initiator);
-
- if (cleanup_rx_reorder_tbl) {
- if (!(rx_reor_tbl_ptr = wlan_11n_get_rxreorder_tbl(priv, tid,
- peer_mac))) {
- PRINTM(MWARN, "TID, TA not found in table!\n");
- LEAVE();
- return;
- }
- wlan_11n_delete_rxreorder_tbl_entry(priv, rx_reor_tbl_ptr);
- } else {
- if (!(ptxtbl = wlan_11n_get_txbastream_tbl(priv, tid, peer_mac))) {
- PRINTM(MWARN, "TID, RA not found in table!\n");
- LEAVE();
- return;
- }
-
- wlan_11n_delete_txbastream_tbl_entry(priv, ptxtbl);
- }
-
- LEAVE();
+ RxReorderTbl *rx_reor_tbl_ptr;
+ TxBAStreamTbl *ptxtbl;
+ t_u8 cleanup_rx_reorder_tbl;
+
+ ENTER();
+
+ if (type == TYPE_DELBA_RECEIVE)
+ cleanup_rx_reorder_tbl = (initiator) ? MTRUE : MFALSE;
+ else
+ cleanup_rx_reorder_tbl = (initiator) ? MFALSE : MTRUE;
+
+ PRINTM(MEVENT, "DELBA: " MACSTR " tid=%d,"
+ "initiator=%d\n", MAC2STR(peer_mac), tid, initiator);
+
+ if (cleanup_rx_reorder_tbl) {
+ if (!(rx_reor_tbl_ptr = wlan_11n_get_rxreorder_tbl(priv, tid,
+ peer_mac))) {
+ PRINTM(MWARN, "TID, TA not found in table!\n");
+ LEAVE();
+ return;
+ }
+ wlan_11n_delete_rxreorder_tbl_entry(priv, rx_reor_tbl_ptr);
+ } else {
+ if (!(ptxtbl = wlan_11n_get_txbastream_tbl(priv, tid,
+ peer_mac))) {
+ PRINTM(MWARN, "TID, RA not found in table!\n");
+ LEAVE();
+ return;
+ }
+
+ wlan_11n_delete_txbastream_tbl_entry(priv, ptxtbl);
+ }
+
+ LEAVE();
}
-/**
+/**
* @brief This function handles the command response of
* a block ack response
- *
+ *
* @param priv A pointer to mlan_private structure
* @param resp A pointer to HostCmd_DS_COMMAND
*
@@ -925,60 +997,69 @@ mlan_11n_delete_bastream_tbl(mlan_private * priv, int tid,
mlan_status
wlan_ret_11n_addba_resp(mlan_private * priv, HostCmd_DS_COMMAND * resp)
{
- HostCmd_DS_11N_ADDBA_RSP *padd_ba_rsp = (HostCmd_DS_11N_ADDBA_RSP *)
- & resp->params.add_ba_rsp;
- int tid;
- RxReorderTbl *rx_reor_tbl_ptr = MNULL;
-
- ENTER();
-
- padd_ba_rsp->status_code = wlan_le16_to_cpu(padd_ba_rsp->status_code);
- padd_ba_rsp->block_ack_param_set =
- wlan_le16_to_cpu(padd_ba_rsp->block_ack_param_set);
- padd_ba_rsp->block_ack_tmo = wlan_le16_to_cpu(padd_ba_rsp->block_ack_tmo);
- padd_ba_rsp->ssn = wlan_le16_to_cpu(padd_ba_rsp->ssn);
-
- tid = (padd_ba_rsp->block_ack_param_set & BLOCKACKPARAM_TID_MASK)
- >> BLOCKACKPARAM_TID_POS;
- /* Check if we had rejected the ADDBA, if yes then do not create the stream */
- if (padd_ba_rsp->status_code == BA_RESULT_SUCCESS) {
- PRINTM(MCMND,
- "ADDBA RSP: " MACSTR " tid=%d ssn=%d win_size=%d,amsdu=%d\n",
- MAC2STR(padd_ba_rsp->peer_mac_addr), tid, padd_ba_rsp->ssn,
- ((padd_ba_rsp->block_ack_param_set & BLOCKACKPARAM_WINSIZE_MASK)
- >> BLOCKACKPARAM_WINSIZE_POS),
- padd_ba_rsp->
- block_ack_param_set & BLOCKACKPARAM_AMSDU_SUPP_MASK);
-
- if ((rx_reor_tbl_ptr =
- wlan_11n_get_rxreorder_tbl(priv, tid,
- padd_ba_rsp->peer_mac_addr))) {
- rx_reor_tbl_ptr->ba_status = BA_STREAM_SETUP_COMPLETE;
- if ((padd_ba_rsp->
- block_ack_param_set & BLOCKACKPARAM_AMSDU_SUPP_MASK) &&
- priv->add_ba_param.rx_amsdu &&
- (priv->aggr_prio_tbl[tid].amsdu != BA_STREAM_NOT_ALLOWED))
- rx_reor_tbl_ptr->amsdu = MTRUE;
- else
- rx_reor_tbl_ptr->amsdu = MFALSE;
- }
- } else {
- PRINTM(MERROR, "ADDBA RSP: Failed(" MACSTR " tid=%d)\n",
- MAC2STR(padd_ba_rsp->peer_mac_addr), tid);
- if ((rx_reor_tbl_ptr = wlan_11n_get_rxreorder_tbl(priv, tid,
- padd_ba_rsp->
- peer_mac_addr))) {
- wlan_11n_delete_rxreorder_tbl_entry(priv, rx_reor_tbl_ptr);
- }
- }
-
- LEAVE();
- return MLAN_STATUS_SUCCESS;
+ HostCmd_DS_11N_ADDBA_RSP *padd_ba_rsp = (HostCmd_DS_11N_ADDBA_RSP *)
+ & resp->params.add_ba_rsp;
+ int tid;
+ RxReorderTbl *rx_reor_tbl_ptr = MNULL;
+
+ ENTER();
+
+ padd_ba_rsp->status_code = wlan_le16_to_cpu(padd_ba_rsp->status_code);
+ padd_ba_rsp->block_ack_param_set =
+ wlan_le16_to_cpu(padd_ba_rsp->block_ack_param_set);
+ padd_ba_rsp->block_ack_tmo =
+ wlan_le16_to_cpu(padd_ba_rsp->block_ack_tmo);
+ padd_ba_rsp->ssn = wlan_le16_to_cpu(padd_ba_rsp->ssn);
+
+ tid = (padd_ba_rsp->block_ack_param_set & BLOCKACKPARAM_TID_MASK)
+ >> BLOCKACKPARAM_TID_POS;
+ /* Check if we had rejected the ADDBA, if yes then do not create the
+ stream */
+ if (padd_ba_rsp->status_code == BA_RESULT_SUCCESS) {
+ PRINTM(MCMND,
+ "ADDBA RSP: " MACSTR
+ " tid=%d ssn=%d win_size=%d,amsdu=%d\n",
+ MAC2STR(padd_ba_rsp->peer_mac_addr), tid,
+ padd_ba_rsp->ssn,
+ ((padd_ba_rsp->
+ block_ack_param_set & BLOCKACKPARAM_WINSIZE_MASK)
+ >> BLOCKACKPARAM_WINSIZE_POS),
+ padd_ba_rsp->
+ block_ack_param_set & BLOCKACKPARAM_AMSDU_SUPP_MASK);
+
+ if ((rx_reor_tbl_ptr =
+ wlan_11n_get_rxreorder_tbl(priv, tid,
+ padd_ba_rsp->peer_mac_addr))) {
+ rx_reor_tbl_ptr->ba_status = BA_STREAM_SETUP_COMPLETE;
+ if ((padd_ba_rsp->
+ block_ack_param_set &
+ BLOCKACKPARAM_AMSDU_SUPP_MASK) &&
+ priv->add_ba_param.rx_amsdu &&
+ (priv->aggr_prio_tbl[tid].amsdu !=
+ BA_STREAM_NOT_ALLOWED))
+ rx_reor_tbl_ptr->amsdu = MTRUE;
+ else
+ rx_reor_tbl_ptr->amsdu = MFALSE;
+ }
+ } else {
+ PRINTM(MERROR, "ADDBA RSP: Failed(" MACSTR " tid=%d)\n",
+ MAC2STR(padd_ba_rsp->peer_mac_addr), tid);
+ if ((rx_reor_tbl_ptr = wlan_11n_get_rxreorder_tbl(priv, tid,
+ padd_ba_rsp->
+ peer_mac_addr)))
+ {
+ wlan_11n_delete_rxreorder_tbl_entry(priv,
+ rx_reor_tbl_ptr);
+ }
+ }
+
+ LEAVE();
+ return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function handles ba_stream_timeout event
- *
+ *
* @param priv A pointer to mlan_private
* @param event A pointer to structure HostCmd_DS_11N_BATIMEOUT
*
@@ -986,30 +1067,31 @@ wlan_ret_11n_addba_resp(mlan_private * priv, HostCmd_DS_COMMAND * resp)
*/
void
wlan_11n_ba_stream_timeout(mlan_private * priv,
- HostCmd_DS_11N_BATIMEOUT * event)
+ HostCmd_DS_11N_BATIMEOUT * event)
{
- HostCmd_DS_11N_DELBA delba;
+ HostCmd_DS_11N_DELBA delba;
- ENTER();
+ ENTER();
- DBG_HEXDUMP(MCMD_D, "Event:", (t_u8 *) event, 20);
+ DBG_HEXDUMP(MCMD_D, "Event:", (t_u8 *) event, 20);
- memset(priv->adapter, &delba, 0, sizeof(HostCmd_DS_11N_DELBA));
- memcpy(priv->adapter, delba.peer_mac_addr, event->peer_mac_addr,
- MLAN_MAC_ADDR_LENGTH);
+ memset(priv->adapter, &delba, 0, sizeof(HostCmd_DS_11N_DELBA));
+ memcpy(priv->adapter, delba.peer_mac_addr, event->peer_mac_addr,
+ MLAN_MAC_ADDR_LENGTH);
- delba.del_ba_param_set |= (t_u16) event->tid << DELBA_TID_POS;
- delba.del_ba_param_set |= (t_u16) event->origninator << DELBA_INITIATOR_POS;
- delba.reason_code = REASON_CODE_STA_TIMEOUT;
- wlan_prepare_cmd(priv, HostCmd_CMD_11N_DELBA, 0, 0, MNULL, &delba);
+ delba.del_ba_param_set |= (t_u16) event->tid << DELBA_TID_POS;
+ delba.del_ba_param_set |=
+ (t_u16) event->origninator << DELBA_INITIATOR_POS;
+ delba.reason_code = REASON_CODE_STA_TIMEOUT;
+ wlan_prepare_cmd(priv, HostCmd_CMD_11N_DELBA, 0, 0, MNULL, &delba);
- LEAVE();
- return;
+ LEAVE();
+ return;
}
/**
* @brief This function cleans up reorder tbl
- *
+ *
* @param priv A pointer to mlan_private
*
* @return N/A
@@ -1017,117 +1099,133 @@ wlan_11n_ba_stream_timeout(mlan_private * priv,
void
wlan_11n_cleanup_reorder_tbl(mlan_private * priv)
{
- RxReorderTbl *del_tbl_ptr;
+ RxReorderTbl *del_tbl_ptr;
- ENTER();
+ ENTER();
- while ((del_tbl_ptr = (RxReorderTbl *)
- util_peek_list(priv->adapter->pmoal_handle,
- &priv->rx_reorder_tbl_ptr,
- priv->adapter->callbacks.moal_spin_lock,
- priv->adapter->callbacks.moal_spin_unlock))) {
- wlan_11n_delete_rxreorder_tbl_entry(priv, del_tbl_ptr);
- }
+ while ((del_tbl_ptr = (RxReorderTbl *)
+ util_peek_list(priv->adapter->pmoal_handle,
+ &priv->rx_reorder_tbl_ptr,
+ priv->adapter->callbacks.moal_spin_lock,
+ priv->adapter->callbacks.moal_spin_unlock))) {
+ wlan_11n_delete_rxreorder_tbl_entry(priv, del_tbl_ptr);
+ }
- util_init_list((pmlan_linked_list) & priv->rx_reorder_tbl_ptr);
+ util_init_list((pmlan_linked_list) & priv->rx_reorder_tbl_ptr);
- memset(priv->adapter, priv->rx_seq, 0xff, sizeof(priv->rx_seq));
- LEAVE();
+ memset(priv->adapter, priv->rx_seq, 0xff, sizeof(priv->rx_seq));
+ LEAVE();
}
/**
- * @brief This function handle the rxba_sync event
- *
+ * @brief This function handle the rxba_sync event
+ *
* @param priv A pointer to mlan_private
- * @param event_buf A pointer to event buf
+ * @param event_buf A pointer to event buf
* @param len event_buf length
* @return N/A
*/
void
wlan_11n_rxba_sync_event(mlan_private * priv, t_u8 * event_buf, t_u16 len)
{
- MrvlIEtypes_RxBaSync_t *tlv_rxba = (MrvlIEtypes_RxBaSync_t *) event_buf;
- t_u16 tlv_type, tlv_len;
- RxReorderTbl *rx_reor_tbl_ptr = MNULL;
- t_u8 i, j;
- t_u16 seq_num = 0;
- int tlv_buf_left = len;
- ENTER();
- DBG_HEXDUMP(MEVT_D, "RXBA_SYNC_EVT", event_buf, len);
- while (tlv_buf_left >= sizeof(MrvlIEtypes_RxBaSync_t)) {
- tlv_type = wlan_le16_to_cpu(tlv_rxba->header.type);
- tlv_len = wlan_le16_to_cpu(tlv_rxba->header.len);
- if (tlv_type != TLV_TYPE_RXBA_SYNC) {
- PRINTM(MERROR, "Wrong TLV id=0x%x\n", tlv_type);
- goto done;
- }
- tlv_rxba->seq_num = wlan_le16_to_cpu(tlv_rxba->seq_num);
- tlv_rxba->bitmap_len = wlan_le16_to_cpu(tlv_rxba->bitmap_len);
- PRINTM(MEVENT, MACSTR " tid=%d seq_num=%d bitmap_len=%d\n",
- MAC2STR(tlv_rxba->mac), tlv_rxba->tid, tlv_rxba->seq_num,
- tlv_rxba->bitmap_len);
- rx_reor_tbl_ptr =
- wlan_11n_get_rxreorder_tbl(priv, tlv_rxba->tid, tlv_rxba->mac);
- if (!rx_reor_tbl_ptr) {
- PRINTM(MEVENT, "Can not find rx_reorder_tbl\n");
- goto done;
- }
- for (i = 0; i < tlv_rxba->bitmap_len; i++) {
- for (j = 0; j < 8; j++) {
- if (tlv_rxba->bitmap[i] & (1 << j)) {
- seq_num =
- (tlv_rxba->seq_num + i * 8 + j) & (MAX_TID_VALUE - 1);
- PRINTM(MEVENT,
- "Fw dropped packet, seq=%d start_win=%d, win_size=%d\n",
- seq_num, rx_reor_tbl_ptr->start_win,
- rx_reor_tbl_ptr->win_size);
- if (MLAN_STATUS_SUCCESS !=
- mlan_11n_rxreorder_pkt(priv, seq_num, tlv_rxba->tid,
- tlv_rxba->mac, 0,
- (t_void *) RX_PKT_DROPPED_IN_FW))
- {
- PRINTM(MERROR,
- "Fail to handle dropped packet, seq=%d\n",
- seq_num);
- }
- }
- }
- }
- tlv_buf_left -= (sizeof(MrvlIEtypesHeader_t) + tlv_len);
- tlv_rxba =
- (MrvlIEtypes_RxBaSync_t *) ((t_u8 *) tlv_rxba + tlv_len +
- sizeof(MrvlIEtypesHeader_t));
- }
- done:
- LEAVE();
- return;
+ MrvlIEtypes_RxBaSync_t *tlv_rxba = (MrvlIEtypes_RxBaSync_t *) event_buf;
+ t_u16 tlv_type, tlv_len;
+ RxReorderTbl *rx_reor_tbl_ptr = MNULL;
+ t_u8 i, j;
+ t_u16 seq_num = 0;
+ int tlv_buf_left = len;
+ ENTER();
+
+ DBG_HEXDUMP(MEVT_D, "RXBA_SYNC_EVT", event_buf, len);
+ while (tlv_buf_left >= sizeof(MrvlIEtypes_RxBaSync_t)) {
+ tlv_type = wlan_le16_to_cpu(tlv_rxba->header.type);
+ tlv_len = wlan_le16_to_cpu(tlv_rxba->header.len);
+ if (tlv_type != TLV_TYPE_RXBA_SYNC) {
+ PRINTM(MERROR, "Wrong TLV id=0x%x\n", tlv_type);
+ goto done;
+ }
+ tlv_rxba->seq_num = wlan_le16_to_cpu(tlv_rxba->seq_num);
+ tlv_rxba->bitmap_len = wlan_le16_to_cpu(tlv_rxba->bitmap_len);
+ PRINTM(MEVENT, MACSTR " tid=%d seq_num=%d bitmap_len=%d\n",
+ MAC2STR(tlv_rxba->mac), tlv_rxba->tid, tlv_rxba->seq_num,
+ tlv_rxba->bitmap_len);
+ rx_reor_tbl_ptr =
+ wlan_11n_get_rxreorder_tbl(priv, tlv_rxba->tid,
+ tlv_rxba->mac);
+ if (!rx_reor_tbl_ptr) {
+ PRINTM(MEVENT, "Can not find rx_reorder_tbl\n");
+ goto done;
+ }
+ if (rx_reor_tbl_ptr->force_no_drop) {
+ PRINTM(MEVENT, "Ignore RXBA_SYNC_EVT in resume\n");
+ goto done;
+ }
+ for (i = 0; i < tlv_rxba->bitmap_len; i++) {
+ for (j = 0; j < 8; j++) {
+ if (tlv_rxba->bitmap[i] & (1 << j)) {
+ seq_num =
+ (tlv_rxba->seq_num + i * 8 +
+ j) & (MAX_TID_VALUE - 1);
+ PRINTM(MEVENT,
+ "Fw dropped packet, seq=%d start_win=%d, win_size=%d\n",
+ seq_num,
+ rx_reor_tbl_ptr->start_win,
+ rx_reor_tbl_ptr->win_size);
+ if (MLAN_STATUS_SUCCESS !=
+ mlan_11n_rxreorder_pkt(priv,
+ seq_num,
+ tlv_rxba->
+ tid,
+ tlv_rxba->
+ mac, 0,
+ (t_void *)
+ RX_PKT_DROPPED_IN_FW))
+ {
+ PRINTM(MERROR,
+ "Fail to handle dropped packet, seq=%d\n",
+ seq_num);
+ }
+ }
+ }
+ }
+ tlv_buf_left -= (sizeof(MrvlIEtypesHeader_t) + tlv_len);
+ tlv_rxba =
+ (MrvlIEtypes_RxBaSync_t *) ((t_u8 *) tlv_rxba +
+ tlv_len +
+ sizeof
+ (MrvlIEtypesHeader_t));
+ }
+done:
+ LEAVE();
+ return;
}
/**
* @brief This function cleans up reorder tbl for specific station
- *
+ *
* @param priv A pointer to mlan_private
- * @param ta ta to find in reordering table
+ * @param ta ta to find in reordering table
* @return N/A
*/
void
wlan_cleanup_reorder_tbl(mlan_private * priv, t_u8 * ta)
{
- RxReorderTbl *rx_reor_tbl_ptr = MNULL;
- t_u8 i;
- ENTER();
- for (i = 0; i < MAX_NUM_TID; ++i) {
- if ((rx_reor_tbl_ptr = wlan_11n_get_rxreorder_tbl(priv, i, ta))) {
- wlan_11n_delete_rxreorder_tbl_entry(priv, rx_reor_tbl_ptr);
- }
- }
- LEAVE();
- return;
+ RxReorderTbl *rx_reor_tbl_ptr = MNULL;
+ t_u8 i;
+ ENTER();
+ for (i = 0; i < MAX_NUM_TID; ++i) {
+ if ((rx_reor_tbl_ptr = wlan_11n_get_rxreorder_tbl(priv, i, ta))) {
+ wlan_11n_delete_rxreorder_tbl_entry(priv,
+ rx_reor_tbl_ptr);
+ }
+ }
+ LEAVE();
+ return;
}
/**
- * @brief This function will set force_no_drop flag in rxreorder_tbl.
- *
+ * @brief This function will set force_no_drop flag in rxreorder_tbl.
+ *
* @param priv A pointer to mlan_private
* @param flag MTRUE/MFALSE
*
@@ -1136,34 +1234,34 @@ wlan_cleanup_reorder_tbl(mlan_private * priv, t_u8 * ta)
void
wlan_set_rxreorder_tbl_no_drop_flag(mlan_private * priv, t_u8 flag)
{
- RxReorderTbl *rx_reor_tbl_ptr;
-
- ENTER();
-
- if (!
- (rx_reor_tbl_ptr =
- (RxReorderTbl *) util_peek_list(priv->adapter->pmoal_handle,
- &priv->rx_reorder_tbl_ptr,
- priv->adapter->callbacks.
- moal_spin_lock,
- priv->adapter->callbacks.
- moal_spin_unlock))) {
- LEAVE();
- return;
- }
-
- while (rx_reor_tbl_ptr != (RxReorderTbl *) & priv->rx_reorder_tbl_ptr) {
- rx_reor_tbl_ptr->force_no_drop = flag;
- rx_reor_tbl_ptr = rx_reor_tbl_ptr->pnext;
- }
-
- LEAVE();
- return;
+ RxReorderTbl *rx_reor_tbl_ptr;
+
+ ENTER();
+
+ if (!
+ (rx_reor_tbl_ptr =
+ (RxReorderTbl *) util_peek_list(priv->adapter->pmoal_handle,
+ &priv->rx_reorder_tbl_ptr,
+ priv->adapter->callbacks.
+ moal_spin_lock,
+ priv->adapter->callbacks.
+ moal_spin_unlock))) {
+ LEAVE();
+ return;
+ }
+
+ while (rx_reor_tbl_ptr != (RxReorderTbl *) & priv->rx_reorder_tbl_ptr) {
+ rx_reor_tbl_ptr->force_no_drop = flag;
+ rx_reor_tbl_ptr = rx_reor_tbl_ptr->pnext;
+ }
+
+ LEAVE();
+ return;
}
/**
* @brief This function update all the rx_reorder_tbl's force_no_drop flag
- *
+ *
* @param pmadapter A pointer to mlan_adapter
* @param flag MTRUE/MFALSE
* @return N/A
@@ -1171,13 +1269,13 @@ wlan_set_rxreorder_tbl_no_drop_flag(mlan_private * priv, t_u8 flag)
void
wlan_update_rxreorder_tbl(pmlan_adapter pmadapter, t_u8 flag)
{
- t_u8 i;
- pmlan_private priv = MNULL;
- for (i = 0; i < pmadapter->priv_num; i++) {
- if (pmadapter->priv[i]) {
- priv = pmadapter->priv[i];
- wlan_set_rxreorder_tbl_no_drop_flag(priv, flag);
- }
- }
- return;
+ t_u8 i;
+ pmlan_private priv = MNULL;
+ for (i = 0; i < pmadapter->priv_num; i++) {
+ if (pmadapter->priv[i]) {
+ priv = pmadapter->priv[i];
+ wlan_set_rxreorder_tbl_no_drop_flag(priv, flag);
+ }
+ }
+ return;
}