diff options
Diffstat (limited to 'drivers/net/wireless/sd8897/mlan/mlan_wmm.c')
-rw-r--r-- | drivers/net/wireless/sd8897/mlan/mlan_wmm.c | 3763 |
1 files changed, 1978 insertions, 1785 deletions
diff --git a/drivers/net/wireless/sd8897/mlan/mlan_wmm.c b/drivers/net/wireless/sd8897/mlan/mlan_wmm.c index 355f6729cc1b..452181014bc1 100644 --- a/drivers/net/wireless/sd8897/mlan/mlan_wmm.c +++ b/drivers/net/wireless/sd8897/mlan/mlan_wmm.c @@ -2,7 +2,7 @@ * * @brief This file contains functions for WMM. * - * Copyright (C) 2008-2011, Marvell International Ltd. + * 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 @@ -43,10 +43,10 @@ Change log: /* * Upper and Lower threshold for packet queuing in the driver - + * - When the number of packets queued reaches the upper limit, * the driver will stop the net queue in the app/kernel space. - + * - When the number of packets drops beneath the lower limit after * having reached the upper limit, the driver will restart the net * queue. @@ -69,8 +69,8 @@ Change log: /** WMM information IE */ static const t_u8 wmm_info_ie[] = { WMM_IE, 0x07, - 0x00, 0x50, 0xf2, 0x02, - 0x00, 0x01, 0x00 + 0x00, 0x50, 0xf2, 0x02, + 0x00, 0x01, 0x00 }; /** @@ -79,43 +79,43 @@ static const t_u8 wmm_info_ie[] = { WMM_IE, 0x07, * mapping conversion for wmm AC to priority Queue Index */ static const t_u8 wmm_aci_to_qidx_map[] = { WMM_AC_BE, - WMM_AC_BK, - WMM_AC_VI, - WMM_AC_VO + WMM_AC_BK, + WMM_AC_VI, + WMM_AC_VO }; -/** +/** * This table will be used to store the tid values based on ACs. * It is initialized to default values per TID. */ t_u8 tos_to_tid[] = { - /* TID DSCP_P2 DSCP_P1 DSCP_P0 WMM_AC */ - 0x01, /* 0 1 0 AC_BK */ - 0x02, /* 0 0 0 AC_BK */ - 0x00, /* 0 0 1 AC_BE */ - 0x03, /* 0 1 1 AC_BE */ - 0x04, /* 1 0 0 AC_VI */ - 0x05, /* 1 0 1 AC_VI */ - 0x06, /* 1 1 0 AC_VO */ - 0x07 /* 1 1 1 AC_VO */ + /* TID DSCP_P2 DSCP_P1 DSCP_P0 WMM_AC */ + 0x01, /* 0 1 0 AC_BK */ + 0x02, /* 0 0 0 AC_BK */ + 0x00, /* 0 0 1 AC_BE */ + 0x03, /* 0 1 1 AC_BE */ + 0x04, /* 1 0 0 AC_VI */ + 0x05, /* 1 0 1 AC_VI */ + 0x06, /* 1 1 0 AC_VO */ + 0x07 /* 1 1 1 AC_VO */ }; -/** +/** * This table inverses the tos_to_tid operation to get a priority * which is in sequential order, and can be compared. * Use this to compare the priority of two different TIDs. */ -t_u8 tos_to_tid_inv[] = { 0x02, /* from tos_to_tid[2] = 0 */ - 0x00, /* from tos_to_tid[0] = 1 */ - 0x01, /* from tos_to_tid[1] = 2 */ - 0x03, - 0x04, - 0x05, - 0x06, - 0x07 +t_u8 tos_to_tid_inv[] = { 0x02, /* from tos_to_tid[2] = 0 */ + 0x00, /* from tos_to_tid[0] = 1 */ + 0x01, /* from tos_to_tid[1] = 2 */ + 0x03, + 0x04, + 0x05, + 0x06, + 0x07 }; -/** +/** * This table will provide the tid value for given ac. This table does not * change and will be used to copy back the default values to tos_to_tid in * case of disconnect. @@ -124,17 +124,17 @@ const t_u8 ac_to_tid[4][2] = { {1, 2}, {0, 3}, {4, 5}, {6, 7} }; /* Map of TOS UP values to WMM AC */ static const mlan_wmm_ac_e tos_to_ac[] = { WMM_AC_BE, - WMM_AC_BK, - WMM_AC_BK, - WMM_AC_BE, - WMM_AC_VI, - WMM_AC_VI, - WMM_AC_VO, - WMM_AC_VO + WMM_AC_BK, + WMM_AC_BK, + WMM_AC_BE, + WMM_AC_VI, + WMM_AC_VI, + WMM_AC_VO, + WMM_AC_VO }; raListTbl *wlan_wmm_get_ralist_node(pmlan_private priv, t_u8 tid, - t_u8 * ra_addr); + t_u8 * ra_addr); /******************************************************** Local Functions @@ -150,18 +150,19 @@ raListTbl *wlan_wmm_get_ralist_node(pmlan_private priv, t_u8 tid, static void wlan_wmm_ac_debug_print(const IEEEtypes_WmmAcParameters_t * pac_param) { - const char *ac_str[] = { "BK", "BE", "VI", "VO" }; + const char *ac_str[] = { "BK", "BE", "VI", "VO" }; - ENTER(); + ENTER(); - PRINTM(MINFO, "WMM AC_%s: ACI=%d, ACM=%d, Aifsn=%d, " - "EcwMin=%d, EcwMax=%d, TxopLimit=%d\n", - ac_str[wmm_aci_to_qidx_map[pac_param->aci_aifsn.aci]], - pac_param->aci_aifsn.aci, pac_param->aci_aifsn.acm, - pac_param->aci_aifsn.aifsn, pac_param->ecw.ecw_min, - pac_param->ecw.ecw_max, wlan_le16_to_cpu(pac_param->tx_op_limit)); + PRINTM(MINFO, "WMM AC_%s: ACI=%d, ACM=%d, Aifsn=%d, " + "EcwMin=%d, EcwMax=%d, TxopLimit=%d\n", + ac_str[wmm_aci_to_qidx_map[pac_param->aci_aifsn.aci]], + pac_param->aci_aifsn.aci, pac_param->aci_aifsn.acm, + pac_param->aci_aifsn.aifsn, pac_param->ecw.ecw_min, + pac_param->ecw.ecw_max, + wlan_le16_to_cpu(pac_param->tx_op_limit)); - LEAVE(); + LEAVE(); } /** Print the WMM AC for debug purpose */ @@ -182,33 +183,33 @@ wlan_wmm_ac_debug_print(const IEEEtypes_WmmAcParameters_t * pac_param) static raListTbl * wlan_wmm_allocate_ralist_node(pmlan_adapter pmadapter, t_u8 * ra) { - raListTbl *ra_list = MNULL; - - ENTER(); - - if (pmadapter->callbacks. - moal_malloc(pmadapter->pmoal_handle, sizeof(raListTbl), MLAN_MEM_DEF, - (t_u8 **) & ra_list)) { - PRINTM(MERROR, "Fail to allocate ra_list\n"); - goto done; - } - util_init_list((pmlan_linked_list) ra_list); - util_init_list_head((t_void *) pmadapter->pmoal_handle, - &ra_list->buf_head, MFALSE, - pmadapter->callbacks.moal_init_lock); - - memcpy(pmadapter, ra_list->ra, ra, MLAN_MAC_ADDR_LENGTH); - - ra_list->total_pkts = 0; - ra_list->tx_pause = 0; - PRINTM(MINFO, "RAList: Allocating buffers for TID %p\n", ra_list); - done: - LEAVE(); - return ra_list; + raListTbl *ra_list = MNULL; + + ENTER(); + + if (pmadapter->callbacks. + moal_malloc(pmadapter->pmoal_handle, sizeof(raListTbl), + MLAN_MEM_DEF, (t_u8 **) & ra_list)) { + PRINTM(MERROR, "Fail to allocate ra_list\n"); + goto done; + } + util_init_list((pmlan_linked_list) ra_list); + util_init_list_head((t_void *) pmadapter->pmoal_handle, + &ra_list->buf_head, MFALSE, + pmadapter->callbacks.moal_init_lock); + + memcpy(pmadapter, ra_list->ra, ra, MLAN_MAC_ADDR_LENGTH); + + ra_list->total_pkts = 0; + ra_list->tx_pause = 0; + PRINTM(MINFO, "RAList: Allocating buffers for TID %p\n", ra_list); +done: + LEAVE(); + return ra_list; } /** - * @brief Map ACs to TID + * @brief Map ACs to TID * * @param priv Pointer to the mlan_private driver data struct * @param queue_priority Queue_priority structure @@ -218,28 +219,28 @@ wlan_wmm_allocate_ralist_node(pmlan_adapter pmadapter, t_u8 * ra) static void wlan_wmm_queue_priorities_tid(pmlan_private priv, t_u8 queue_priority[]) { - int i; + int i; - ENTER(); + ENTER(); - for (i = 0; i < 4; ++i) { - tos_to_tid[7 - (i * 2)] = ac_to_tid[queue_priority[i]][1]; - tos_to_tid[6 - (i * 2)] = ac_to_tid[queue_priority[i]][0]; - } + for (i = 0; i < 4; ++i) { + tos_to_tid[7 - (i * 2)] = ac_to_tid[queue_priority[i]][1]; + tos_to_tid[6 - (i * 2)] = ac_to_tid[queue_priority[i]][0]; + } - for (i = 0; i < MAX_NUM_TID; i++) { - tos_to_tid_inv[tos_to_tid[i]] = (t_u8) i; - } + for (i = 0; i < MAX_NUM_TID; i++) { + tos_to_tid_inv[tos_to_tid[i]] = (t_u8) i; + } - /* in case priorities have changed, force highest priority so next packet - will check from top to re-establish the highest */ - util_scalar_write(priv->adapter->pmoal_handle, - &priv->wmm.highest_queued_prio, - HIGH_PRIO_TID, - priv->adapter->callbacks.moal_spin_lock, - priv->adapter->callbacks.moal_spin_unlock); + /* in case priorities have changed, force highest priority so next + packet will check from top to re-establish the highest */ + util_scalar_write(priv->adapter->pmoal_handle, + &priv->wmm.highest_queued_prio, + HIGH_PRIO_TID, + priv->adapter->callbacks.moal_spin_lock, + priv->adapter->callbacks.moal_spin_unlock); - LEAVE(); + LEAVE(); } /** @@ -253,40 +254,41 @@ wlan_wmm_queue_priorities_tid(pmlan_private priv, t_u8 queue_priority[]) static mlan_wmm_ac_e wlan_wmm_eval_downgrade_ac(pmlan_private priv, mlan_wmm_ac_e eval_ac) { - int down_ac; - mlan_wmm_ac_e ret_ac; - WmmAcStatus_t *pac_status; - - ENTER(); - - pac_status = &priv->wmm.ac_status[eval_ac]; - - if (pac_status->disabled == MFALSE) { - LEAVE(); - /* Okay to use this AC, its enabled */ - return eval_ac; - } - - /* Setup a default return value of the lowest priority */ - ret_ac = WMM_AC_BK; - - /* - * Find the highest AC that is enabled and does not require admission - * control. The spec disallows downgrading to an AC, which is enabled - * due to a completed admission control. Unadmitted traffic is not - * to be sent on an AC with admitted traffic. - */ - for (down_ac = WMM_AC_BK; down_ac < eval_ac; down_ac++) { - pac_status = &priv->wmm.ac_status[down_ac]; - - if ((pac_status->disabled == MFALSE) - && (pac_status->flow_required == MFALSE)) - /* AC is enabled and does not require admission control */ - ret_ac = (mlan_wmm_ac_e) down_ac; - } - - LEAVE(); - return ret_ac; + int down_ac; + mlan_wmm_ac_e ret_ac; + WmmAcStatus_t *pac_status; + + ENTER(); + + pac_status = &priv->wmm.ac_status[eval_ac]; + + if (pac_status->disabled == MFALSE) { + LEAVE(); + /* Okay to use this AC, its enabled */ + return eval_ac; + } + + /* Setup a default return value of the lowest priority */ + ret_ac = WMM_AC_BK; + + /* + * Find the highest AC that is enabled and does not require admission + * control. The spec disallows downgrading to an AC, which is enabled + * due to a completed admission control. Unadmitted traffic is not + * to be sent on an AC with admitted traffic. + */ + for (down_ac = WMM_AC_BK; down_ac < eval_ac; down_ac++) { + pac_status = &priv->wmm.ac_status[down_ac]; + + if ((pac_status->disabled == MFALSE) + && (pac_status->flow_required == MFALSE)) + /* AC is enabled and does not require admission control + */ + ret_ac = (mlan_wmm_ac_e) down_ac; + } + + LEAVE(); + return ret_ac; } /** @@ -300,15 +302,15 @@ wlan_wmm_eval_downgrade_ac(pmlan_private priv, mlan_wmm_ac_e eval_ac) static mlan_wmm_ac_e INLINE wlan_wmm_convert_tos_to_ac(pmlan_adapter pmadapter, t_u32 tos) { - ENTER(); + ENTER(); - if (tos >= NELEMENTS(tos_to_ac)) { - LEAVE(); - return WMM_AC_BE; - } + if (tos >= NELEMENTS(tos_to_ac)) { + LEAVE(); + return WMM_AC_BE; + } - LEAVE(); - return tos_to_ac[tos]; + LEAVE(); + return tos_to_ac[tos]; } /** @@ -326,25 +328,25 @@ wlan_wmm_convert_tos_to_ac(pmlan_adapter pmadapter, t_u32 tos) static t_u8 INLINE wlan_wmm_downgrade_tid(pmlan_private priv, t_u32 tid) { - mlan_wmm_ac_e ac_down; - pmlan_adapter pmadapter = priv->adapter; - - ENTER(); - - ac_down = - priv->wmm.ac_down_graded_vals[wlan_wmm_convert_tos_to_ac(pmadapter, - tid)]; - LEAVE(); - /* - * Send the index to tid array, picking from the array will be - * taken care by dequeuing function - */ - if (tid == 1 || tid == 2) - return ac_to_tid[ac_down][(tid + 1) % 2]; - else if (tid >= MAX_NUM_TID) - return ac_to_tid[ac_down][0]; - else - return ac_to_tid[ac_down][tid % 2]; + mlan_wmm_ac_e ac_down; + pmlan_adapter pmadapter = priv->adapter; + + ENTER(); + + ac_down = + priv->wmm. + ac_down_graded_vals[wlan_wmm_convert_tos_to_ac(pmadapter, tid)]; + LEAVE(); + /* + * Send the index to tid array, picking from the array will be + * taken care by dequeuing function + */ + if (tid == 1 || tid == 2) + return ac_to_tid[ac_down][(tid + 1) % 2]; + else if (tid >= MAX_NUM_TID) + return ac_to_tid[ac_down][0]; + else + return ac_to_tid[ac_down][tid % 2]; } /** @@ -358,21 +360,23 @@ wlan_wmm_downgrade_tid(pmlan_private priv, t_u32 tid) static INLINE void wlan_wmm_del_pkts_in_ralist_node(pmlan_private priv, raListTbl * ra_list) { - pmlan_buffer pmbuf; - pmlan_adapter pmadapter = priv->adapter; - - ENTER(); - while ((pmbuf = - (pmlan_buffer) util_peek_list(pmadapter->pmoal_handle, - &ra_list->buf_head, MNULL, MNULL))) { - util_unlink_list(pmadapter->pmoal_handle, &ra_list->buf_head, - (pmlan_linked_list) pmbuf, MNULL, MNULL); - wlan_write_data_complete(pmadapter, pmbuf, MLAN_STATUS_FAILURE); - } - util_free_list_head((t_void *) pmadapter->pmoal_handle, &ra_list->buf_head, - pmadapter->callbacks.moal_free_lock); - - LEAVE(); + pmlan_buffer pmbuf; + pmlan_adapter pmadapter = priv->adapter; + + ENTER(); + while ((pmbuf = + (pmlan_buffer) util_peek_list(pmadapter->pmoal_handle, + &ra_list->buf_head, MNULL, + MNULL))) { + util_unlink_list(pmadapter->pmoal_handle, &ra_list->buf_head, + (pmlan_linked_list) pmbuf, MNULL, MNULL); + wlan_write_data_complete(pmadapter, pmbuf, MLAN_STATUS_FAILURE); + } + util_free_list_head((t_void *) pmadapter->pmoal_handle, + &ra_list->buf_head, + pmadapter->callbacks.moal_free_lock); + + LEAVE(); } /** @@ -386,21 +390,21 @@ wlan_wmm_del_pkts_in_ralist_node(pmlan_private priv, raListTbl * ra_list) static INLINE void wlan_wmm_del_pkts_in_ralist(pmlan_private priv, mlan_list_head * ra_list_head) { - raListTbl *ra_list; + raListTbl *ra_list; - ENTER(); + ENTER(); - ra_list = - (raListTbl *) util_peek_list(priv->adapter->pmoal_handle, ra_list_head, - MNULL, MNULL); + ra_list = + (raListTbl *) util_peek_list(priv->adapter->pmoal_handle, + ra_list_head, MNULL, MNULL); - while (ra_list && ra_list != (raListTbl *) ra_list_head) { - wlan_wmm_del_pkts_in_ralist_node(priv, ra_list); + while (ra_list && ra_list != (raListTbl *) ra_list_head) { + wlan_wmm_del_pkts_in_ralist_node(priv, ra_list); - ra_list = ra_list->pnext; - } + ra_list = ra_list->pnext; + } - LEAVE(); + LEAVE(); } /** @@ -413,21 +417,22 @@ wlan_wmm_del_pkts_in_ralist(pmlan_private priv, mlan_list_head * ra_list_head) static void wlan_wmm_cleanup_queues(pmlan_private priv) { - int i; - - ENTER(); - - for (i = 0; i < MAX_NUM_TID; i++) { - wlan_wmm_del_pkts_in_ralist(priv, &priv->wmm.tid_tbl_ptr[i].ra_list); - priv->wmm.pkts_queued[i] = 0; - } - util_scalar_write(priv->adapter->pmoal_handle, &priv->wmm.tx_pkts_queued, 0, - MNULL, MNULL); - util_scalar_write(priv->adapter->pmoal_handle, - &priv->wmm.highest_queued_prio, HIGH_PRIO_TID, MNULL, - MNULL); - - LEAVE(); + int i; + + ENTER(); + + for (i = 0; i < MAX_NUM_TID; i++) { + wlan_wmm_del_pkts_in_ralist(priv, + &priv->wmm.tid_tbl_ptr[i].ra_list); + priv->wmm.pkts_queued[i] = 0; + } + util_scalar_write(priv->adapter->pmoal_handle, + &priv->wmm.tx_pkts_queued, 0, MNULL, MNULL); + util_scalar_write(priv->adapter->pmoal_handle, + &priv->wmm.highest_queued_prio, HIGH_PRIO_TID, MNULL, + MNULL); + + LEAVE(); } /** @@ -440,72 +445,74 @@ wlan_wmm_cleanup_queues(pmlan_private priv) static void wlan_wmm_delete_all_ralist(pmlan_private priv) { - raListTbl *ra_list; - int i; - pmlan_adapter pmadapter = priv->adapter; - - ENTER(); - - for (i = 0; i < MAX_NUM_TID; ++i) { - PRINTM(MINFO, "RAList: Freeing buffers for TID %d\n", i); - while ((ra_list = (raListTbl *) util_peek_list(pmadapter->pmoal_handle, - &priv->wmm. - tid_tbl_ptr[i].ra_list, - MNULL, MNULL))) { - util_unlink_list(pmadapter->pmoal_handle, - &priv->wmm.tid_tbl_ptr[i].ra_list, - (pmlan_linked_list) ra_list, MNULL, MNULL); - - pmadapter->callbacks.moal_mfree(pmadapter->pmoal_handle, - (t_u8 *) ra_list); - } - - util_init_list((pmlan_linked_list) - & priv->wmm.tid_tbl_ptr[i].ra_list); - priv->wmm.tid_tbl_ptr[i].ra_list_curr = MNULL; - } - - LEAVE(); + raListTbl *ra_list; + int i; + pmlan_adapter pmadapter = priv->adapter; + + ENTER(); + + for (i = 0; i < MAX_NUM_TID; ++i) { + PRINTM(MINFO, "RAList: Freeing buffers for TID %d\n", i); + while ((ra_list = + (raListTbl *) util_peek_list(pmadapter->pmoal_handle, + &priv->wmm.tid_tbl_ptr[i]. + ra_list, MNULL, MNULL))) { + util_unlink_list(pmadapter->pmoal_handle, + &priv->wmm.tid_tbl_ptr[i].ra_list, + (pmlan_linked_list) ra_list, MNULL, + MNULL); + + pmadapter->callbacks.moal_mfree(pmadapter->pmoal_handle, + (t_u8 *) ra_list); + } + + util_init_list((pmlan_linked_list) + & priv->wmm.tid_tbl_ptr[i].ra_list); + priv->wmm.tid_tbl_ptr[i].ra_list_curr = MNULL; + } + + LEAVE(); } /** * @brief Get queue RA pointer - * + * * @param priv Pointer to the mlan_private driver data struct * @param tid TID * @param ra_addr Pointer to the route address - * + * * @return ra_list */ static raListTbl * wlan_wmm_get_queue_raptr(pmlan_private priv, t_u8 tid, t_u8 * ra_addr) { - raListTbl *ra_list; + raListTbl *ra_list; #if defined(UAP_SUPPORT) - t_u8 bcast_addr[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + t_u8 bcast_addr[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; #endif - ENTER(); - ra_list = wlan_wmm_get_ralist_node(priv, tid, ra_addr); - if (ra_list) { - LEAVE(); - return ra_list; - } + ENTER(); + ra_list = wlan_wmm_get_ralist_node(priv, tid, ra_addr); + if (ra_list) { + LEAVE(); + return ra_list; + } #if defined(UAP_SUPPORT) - if ((GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) && - (0 != memcmp(priv->adapter, ra_addr, bcast_addr, sizeof(bcast_addr)))) { - if (MNULL == wlan_get_station_entry(priv, ra_addr)) { - PRINTM(MDATA, "Drop packets to unknown station\n"); - LEAVE(); - return MNULL; - } - } + if ((GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) && + (0 != + memcmp(priv->adapter, ra_addr, bcast_addr, sizeof(bcast_addr)))) { + if (MNULL == wlan_get_station_entry(priv, ra_addr)) { + PRINTM(MDATA, "Drop packets to unknown station\n"); + LEAVE(); + return MNULL; + } + } #endif - wlan_ralist_add(priv, ra_addr); + wlan_ralist_add(priv, ra_addr); - ra_list = wlan_wmm_get_ralist_node(priv, tid, ra_addr); - LEAVE(); - return ra_list; + ra_list = wlan_wmm_get_ralist_node(priv, tid, ra_addr); + LEAVE(); + return ra_list; } #ifdef STA_SUPPORT @@ -523,64 +530,64 @@ wlan_wmm_get_queue_raptr(pmlan_private priv, t_u8 tid, t_u8 * ra_addr) */ static void wlan_send_wmmac_host_event(pmlan_private priv, - char *typeStr, - t_u8 * srcAddr, t_u8 tid, t_u8 up, t_u8 status) + char *typeStr, + t_u8 * srcAddr, t_u8 tid, t_u8 up, t_u8 status) { - t_u8 event_buf[100]; - mlan_event *pevent; - t_u8 *pOutBuf; + t_u8 event_buf[100]; + mlan_event *pevent; + t_u8 *pOutBuf; - ENTER(); + ENTER(); - /* Format one of the following two output strings: ** - - TSPEC:ADDTS_RSP:[<status code>]:TID=X:UP=Y ** - TSPEC:DELTS_RX:[<reason - code>]:TID=X:UP=Y */ - pevent = (mlan_event *) event_buf; - pOutBuf = pevent->event_buf; + /* Format one of the following two output strings: ** - + TSPEC:ADDTS_RSP:[<status code>]:TID=X:UP=Y ** - + TSPEC:DELTS_RX:[<reason code>]:TID=X:UP=Y */ + pevent = (mlan_event *) event_buf; + pOutBuf = pevent->event_buf; - memcpy(priv->adapter, pOutBuf, (t_u8 *) "TSPEC:", 6); - pOutBuf += 6; + memcpy(priv->adapter, pOutBuf, (t_u8 *) "TSPEC:", 6); + pOutBuf += 6; - memcpy(priv->adapter, pOutBuf, (t_u8 *) typeStr, wlan_strlen(typeStr)); - pOutBuf += wlan_strlen(typeStr); + memcpy(priv->adapter, pOutBuf, (t_u8 *) typeStr, wlan_strlen(typeStr)); + pOutBuf += wlan_strlen(typeStr); - *pOutBuf++ = ':'; - *pOutBuf++ = '['; + *pOutBuf++ = ':'; + *pOutBuf++ = '['; - if (status >= 100) { - *pOutBuf++ = (status / 100) + '0'; - status = (status % 100); - } + if (status >= 100) { + *pOutBuf++ = (status / 100) + '0'; + status = (status % 100); + } - if (status >= 10) { - *pOutBuf++ = (status / 10) + '0'; - status = (status % 10); - } + if (status >= 10) { + *pOutBuf++ = (status / 10) + '0'; + status = (status % 10); + } - *pOutBuf++ = status + '0'; + *pOutBuf++ = status + '0'; - memcpy(priv->adapter, pOutBuf, (t_u8 *) "]:TID", 5); - pOutBuf += 5; - *pOutBuf++ = tid + '0'; + memcpy(priv->adapter, pOutBuf, (t_u8 *) "]:TID", 5); + pOutBuf += 5; + *pOutBuf++ = tid + '0'; - memcpy(priv->adapter, pOutBuf, (t_u8 *) ":UP", 3); - pOutBuf += 3; - *pOutBuf++ = up + '0'; + memcpy(priv->adapter, pOutBuf, (t_u8 *) ":UP", 3); + pOutBuf += 3; + *pOutBuf++ = up + '0'; - *pOutBuf = '\0'; + *pOutBuf = '\0'; - pevent->bss_index = priv->bss_index; - pevent->event_id = MLAN_EVENT_ID_DRV_REPORT_STRING; - pevent->event_len = wlan_strlen((const char *) (pevent->event_buf)); + pevent->bss_index = priv->bss_index; + pevent->event_id = MLAN_EVENT_ID_DRV_REPORT_STRING; + pevent->event_len = wlan_strlen((const char *)(pevent->event_buf)); - wlan_recv_event(priv, MLAN_EVENT_ID_DRV_REPORT_STRING, pevent); - LEAVE(); + wlan_recv_event(priv, MLAN_EVENT_ID_DRV_REPORT_STRING, pevent); + LEAVE(); } #endif /* STA_SUPPORT */ /** * @brief This function gets the highest priority list pointer - * + * * @param pmadapter A pointer to mlan_adapter * @param priv A pointer to mlan_private * @param tid A pointer to return tid @@ -589,130 +596,160 @@ wlan_send_wmmac_host_event(pmlan_private priv, */ static raListTbl * wlan_wmm_get_highest_priolist_ptr(pmlan_adapter pmadapter, - pmlan_private * priv, int *tid) + pmlan_private * priv, int *tid) { - pmlan_private priv_tmp; - raListTbl *ptr, *head; - mlan_bssprio_node *bssprio_node, *bssprio_head; - tid_tbl_t *tid_ptr; - int i, j; - int next_prio = 0; - int next_tid = 0; - ENTER(); - - PRINTM(MDAT_D, "POP\n"); - for (j = pmadapter->priv_num - 1; j >= 0; --j) { - if (!(util_peek_list(pmadapter->pmoal_handle, - &pmadapter->bssprio_tbl[j].bssprio_head, - pmadapter->callbacks.moal_spin_lock, - pmadapter->callbacks.moal_spin_unlock))) - continue; - - if (pmadapter->bssprio_tbl[j].bssprio_cur == (mlan_bssprio_node *) - & pmadapter->bssprio_tbl[j].bssprio_head) { - pmadapter->bssprio_tbl[j].bssprio_cur = - pmadapter->bssprio_tbl[j].bssprio_cur->pnext; - } - - bssprio_head = bssprio_node = pmadapter->bssprio_tbl[j].bssprio_cur; - - do { - priv_tmp = bssprio_node->priv; - - if ((priv_tmp->port_ctrl_mode == MTRUE) - && (priv_tmp->port_open == MFALSE)) { - PRINTM(MINFO, "get_highest_prio_ptr(): " - "PORT_CLOSED Ignore pkts from BSS%d\n", - priv_tmp->bss_index); - /* Ignore data pkts from a BSS if port is closed */ - goto next_intf; - } - - pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, - priv_tmp->wmm.ra_list_spinlock); - - for (i = util_scalar_read(pmadapter->pmoal_handle, - &priv_tmp->wmm.highest_queued_prio, - MNULL, MNULL); i >= LOW_PRIO_TID; --i) { - - tid_ptr = &(priv_tmp)->wmm.tid_tbl_ptr[tos_to_tid[i]]; - if (!util_peek_list - (pmadapter->pmoal_handle, &tid_ptr->ra_list, MNULL, MNULL)) - continue; - - /* - * Always choose the next ra we transmitted - * last time, this way we pick the ra's in - * round robin fashion. - */ - head = ptr = tid_ptr->ra_list_curr->pnext; - if (ptr == (raListTbl *) & tid_ptr->ra_list) - head = ptr = ptr->pnext; - - do { - if (!ptr->tx_pause && - util_peek_list(pmadapter->pmoal_handle, &ptr->buf_head, - MNULL, MNULL)) { - - /* Because WMM only support BK/BE/VI/VO, we have 8 tid - We should balance the traffic of the same AC */ - if (i % 2) - next_prio = i - 1; - else - next_prio = i + 1; - next_tid = tos_to_tid[next_prio]; - if (priv_tmp->wmm.pkts_queued[next_tid]) - util_scalar_write(pmadapter->pmoal_handle, - &priv_tmp->wmm. - highest_queued_prio, next_prio, - MNULL, MNULL); - else - /* if highest_queued_prio > i, set it to i */ - util_scalar_conditional_write(pmadapter-> - pmoal_handle, - &priv_tmp->wmm. - highest_queued_prio, - MLAN_SCALAR_COND_GREATER_THAN, - i, i, MNULL, MNULL); - *priv = priv_tmp; - *tid = tos_to_tid[i]; - /* hold priv->ra_list_spinlock to maintain ptr */ - PRINTM(MDAT_D, "get highest prio ptr %p, tid %d\n", - ptr, *tid); - LEAVE(); - return ptr; - } - - if ((ptr = ptr->pnext) == (raListTbl *) & tid_ptr->ra_list) - ptr = ptr->pnext; - } while (ptr != head); - } - - /* No packet at any TID for this priv. Mark as such to skip - checking TIDs for this priv (until pkt is added). */ - util_scalar_write(pmadapter->pmoal_handle, - &priv_tmp->wmm.highest_queued_prio, - NO_PKT_PRIO_TID, MNULL, MNULL); - - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv_tmp->wmm. - ra_list_spinlock); - - next_intf: - if ((bssprio_node = bssprio_node->pnext) == (mlan_bssprio_node *) - & pmadapter->bssprio_tbl[j].bssprio_head) - bssprio_node = bssprio_node->pnext; - pmadapter->bssprio_tbl[j].bssprio_cur = bssprio_node; - } while (bssprio_node != bssprio_head); - } - - LEAVE(); - return MNULL; + pmlan_private priv_tmp; + raListTbl *ptr, *head; + mlan_bssprio_node *bssprio_node, *bssprio_head; + tid_tbl_t *tid_ptr; + int i, j; + int next_prio = 0; + int next_tid = 0; + ENTER(); + + PRINTM(MDAT_D, "POP\n"); + for (j = pmadapter->priv_num - 1; j >= 0; --j) { + if (!(util_peek_list(pmadapter->pmoal_handle, + &pmadapter->bssprio_tbl[j].bssprio_head, + pmadapter->callbacks.moal_spin_lock, + pmadapter->callbacks.moal_spin_unlock))) + continue; + + if (pmadapter->bssprio_tbl[j].bssprio_cur == + (mlan_bssprio_node *) + & pmadapter->bssprio_tbl[j].bssprio_head) { + pmadapter->bssprio_tbl[j].bssprio_cur = + pmadapter->bssprio_tbl[j].bssprio_cur->pnext; + } + + bssprio_head + = bssprio_node = pmadapter->bssprio_tbl[j].bssprio_cur; + + do { + priv_tmp = bssprio_node->priv; + + if ((priv_tmp->port_ctrl_mode == MTRUE) + && (priv_tmp->port_open == MFALSE)) { + PRINTM(MINFO, "get_highest_prio_ptr(): " + "PORT_CLOSED Ignore pkts from BSS%d\n", + priv_tmp->bss_index); + /* Ignore data pkts from a BSS if port is + closed */ + goto next_intf; + } + + pmadapter->callbacks.moal_spin_lock(pmadapter-> + pmoal_handle, + priv_tmp->wmm. + ra_list_spinlock); + + for (i = util_scalar_read(pmadapter->pmoal_handle, + &priv_tmp->wmm. + highest_queued_prio, MNULL, + MNULL); i >= LOW_PRIO_TID; + --i) { + + tid_ptr = + &(priv_tmp)->wmm. + tid_tbl_ptr[tos_to_tid[i]]; + if (!util_peek_list + (pmadapter->pmoal_handle, &tid_ptr->ra_list, + MNULL, MNULL)) + continue; + + /* + * Always choose the next ra we transmitted + * last time, this way we pick the ra's in + * round robin fashion. + */ + head = ptr = tid_ptr->ra_list_curr->pnext; + if (ptr == (raListTbl *) & tid_ptr->ra_list) + head = ptr = ptr->pnext; + + do { + if (!ptr->tx_pause && + util_peek_list(pmadapter-> + pmoal_handle, + &ptr->buf_head, + MNULL, MNULL)) { + + /* Because WMM only support + BK/BE/VI/VO, we have 8 tid + We should balance the + traffic of the same AC */ + if (i % 2) + next_prio = i - 1; + else + next_prio = i + 1; + next_tid = + tos_to_tid[next_prio]; + if (priv_tmp->wmm. + pkts_queued[next_tid]) + util_scalar_write + (pmadapter-> + pmoal_handle, + &priv_tmp->wmm. + highest_queued_prio, + next_prio, + MNULL, MNULL); + else + /* if + highest_queued_prio + > i, set it to i */ + util_scalar_conditional_write + (pmadapter-> + pmoal_handle, + &priv_tmp->wmm. + highest_queued_prio, + MLAN_SCALAR_COND_GREATER_THAN, + i, i, MNULL, + MNULL); + *priv = priv_tmp; + *tid = tos_to_tid[i]; + /* hold priv->ra_list_spinlock + to maintain ptr */ + PRINTM(MDAT_D, + "get highest prio ptr %p, tid %d\n", + ptr, *tid); + LEAVE(); + return ptr; + } + + if ((ptr = + ptr->pnext) == + (raListTbl *) & tid_ptr->ra_list) + ptr = ptr->pnext; + } while (ptr != head); + } + + /* No packet at any TID for this priv. Mark as such to + skip checking TIDs for this priv (until pkt is + added). */ + util_scalar_write(pmadapter->pmoal_handle, + &priv_tmp->wmm.highest_queued_prio, + NO_PKT_PRIO_TID, MNULL, MNULL); + + pmadapter->callbacks.moal_spin_unlock(pmadapter-> + pmoal_handle, + priv_tmp->wmm. + ra_list_spinlock); + +next_intf: + if ((bssprio_node = bssprio_node->pnext) == + (mlan_bssprio_node *) + & pmadapter->bssprio_tbl[j].bssprio_head) + bssprio_node = bssprio_node->pnext; + pmadapter->bssprio_tbl[j].bssprio_cur = bssprio_node; + } while (bssprio_node != bssprio_head); + } + + LEAVE(); + return MNULL; } /** * @brief This function gets the number of packets in the Tx queue - * + * * @param priv A pointer to mlan_private * @param ptr A pointer to RA list table * @param maxBufSize Maximum buffer size @@ -722,28 +759,28 @@ wlan_wmm_get_highest_priolist_ptr(pmlan_adapter pmadapter, static int wlan_num_pkts_in_txq(mlan_private * priv, raListTbl * ptr, int maxBufSize) { - int count = 0, total_size = 0; - pmlan_buffer pmbuf; + int count = 0, total_size = 0; + pmlan_buffer pmbuf; - ENTER(); + ENTER(); - for (pmbuf = (pmlan_buffer) ptr->buf_head.pnext; - pmbuf != (pmlan_buffer) (&ptr->buf_head); pmbuf = pmbuf->pnext) { + for (pmbuf = (pmlan_buffer) ptr->buf_head.pnext; + pmbuf != (pmlan_buffer) (&ptr->buf_head); pmbuf = pmbuf->pnext) { - total_size += pmbuf->data_len; - if (total_size < maxBufSize) - ++count; - else - break; - } + total_size += pmbuf->data_len; + if (total_size < maxBufSize) + ++count; + else + break; + } - LEAVE(); - return count; + LEAVE(); + return count; } /** * @brief This function sends a single packet - * + * * @param priv A pointer to mlan_private * @param ptr A pointer to RA list table * @param ptrindex ptr's TID index @@ -753,80 +790,101 @@ wlan_num_pkts_in_txq(mlan_private * priv, raListTbl * ptr, int maxBufSize) static void INLINE wlan_send_single_packet(pmlan_private priv, raListTbl * ptr, int ptrindex) { - pmlan_buffer pmbuf; - pmlan_buffer pmbuf_next; - mlan_tx_param tx_param; - pmlan_adapter pmadapter = priv->adapter; - mlan_status status = MLAN_STATUS_SUCCESS; - - ENTER(); - - if ((pmbuf = (pmlan_buffer) util_dequeue_list(pmadapter->pmoal_handle, - &ptr->buf_head, - MNULL, MNULL))) { - PRINTM(MINFO, "Dequeuing the packet %p %p\n", ptr, pmbuf); - priv->wmm.pkts_queued[ptrindex]--; - util_scalar_decrement(pmadapter->pmoal_handle, - &priv->wmm.tx_pkts_queued, MNULL, MNULL); - ptr->total_pkts--; - pmbuf_next = (pmlan_buffer) util_peek_list(pmadapter->pmoal_handle, - &ptr->buf_head, - MNULL, MNULL); - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - - tx_param.next_pkt_len = ((pmbuf_next) - ? pmbuf_next->data_len + sizeof(TxPD) : 0); - status = wlan_process_tx(priv, pmbuf, &tx_param); - - if (status == MLAN_STATUS_RESOURCE) { - /** Queue the packet back at the head */ - PRINTM(MDAT_D, "Queuing pkt back to raList %p %p\n", ptr, pmbuf); - pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - - if (!wlan_is_ralist_valid(priv, ptr, ptrindex)) { - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm. - ra_list_spinlock); - wlan_write_data_complete(pmadapter, pmbuf, MLAN_STATUS_FAILURE); - LEAVE(); - return; - } - priv->wmm.pkts_queued[ptrindex]++; - util_scalar_increment(pmadapter->pmoal_handle, - &priv->wmm.tx_pkts_queued, MNULL, MNULL); - util_enqueue_list_head(pmadapter->pmoal_handle, &ptr->buf_head, - (pmlan_linked_list) pmbuf, MNULL, MNULL); - - ptr->total_pkts++; - pmbuf->flags |= MLAN_BUF_FLAG_REQUEUED_PKT; - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - } else { - pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - if (wlan_is_ralist_valid(priv, ptr, ptrindex)) { - priv->wmm.packets_out[ptrindex]++; - priv->wmm.tid_tbl_ptr[ptrindex].ra_list_curr = ptr; - } - pmadapter->bssprio_tbl[priv->bss_priority].bssprio_cur = - pmadapter->bssprio_tbl[priv->bss_priority].bssprio_cur->pnext; - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - } - } else { - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - PRINTM(MINFO, "Nothing to send\n"); - } - - LEAVE(); + pmlan_buffer pmbuf; + pmlan_buffer pmbuf_next; + mlan_tx_param tx_param; + pmlan_adapter pmadapter = priv->adapter; + mlan_status status = MLAN_STATUS_SUCCESS; + + ENTER(); + + if ((pmbuf = (pmlan_buffer) util_dequeue_list(pmadapter->pmoal_handle, + &ptr->buf_head, + MNULL, MNULL))) { + PRINTM(MINFO, "Dequeuing the packet %p %p\n", ptr, pmbuf); + priv->wmm.pkts_queued[ptrindex]--; + util_scalar_decrement(pmadapter->pmoal_handle, + &priv->wmm.tx_pkts_queued, MNULL, MNULL); + ptr->total_pkts--; + pmbuf_next = + (pmlan_buffer) util_peek_list(pmadapter->pmoal_handle, + &ptr->buf_head, MNULL, + MNULL); + pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, + priv->wmm. + ra_list_spinlock); + + tx_param.next_pkt_len = ((pmbuf_next) + ? pmbuf_next->data_len + + sizeof(TxPD) : 0); + status = wlan_process_tx(priv, pmbuf, &tx_param); + + if (status == MLAN_STATUS_RESOURCE) { + /** Queue the packet back at the head */ + PRINTM(MDAT_D, "Queuing pkt back to raList %p %p\n", + ptr, pmbuf); + pmadapter->callbacks.moal_spin_lock(pmadapter-> + pmoal_handle, + priv->wmm. + ra_list_spinlock); + + if (!wlan_is_ralist_valid(priv, ptr, ptrindex)) { + pmadapter->callbacks. + moal_spin_unlock(pmadapter-> + pmoal_handle, + priv->wmm. + ra_list_spinlock); + wlan_write_data_complete(pmadapter, pmbuf, + MLAN_STATUS_FAILURE); + LEAVE(); + return; + } + priv->wmm.pkts_queued[ptrindex]++; + util_scalar_increment(pmadapter->pmoal_handle, + &priv->wmm.tx_pkts_queued, MNULL, + MNULL); + util_enqueue_list_head(pmadapter->pmoal_handle, + &ptr->buf_head, + (pmlan_linked_list) pmbuf, MNULL, + MNULL); + + ptr->total_pkts++; + pmbuf->flags |= MLAN_BUF_FLAG_REQUEUED_PKT; + pmadapter->callbacks.moal_spin_unlock(pmadapter-> + pmoal_handle, + priv->wmm. + ra_list_spinlock); + } else { + pmadapter->callbacks.moal_spin_lock(pmadapter-> + pmoal_handle, + priv->wmm. + ra_list_spinlock); + if (wlan_is_ralist_valid(priv, ptr, ptrindex)) { + priv->wmm.packets_out[ptrindex]++; + priv->wmm.tid_tbl_ptr[ptrindex].ra_list_curr = + ptr; + } + pmadapter->bssprio_tbl[priv->bss_priority].bssprio_cur = + pmadapter->bssprio_tbl[priv->bss_priority]. + bssprio_cur->pnext; + pmadapter->callbacks.moal_spin_unlock(pmadapter-> + pmoal_handle, + priv->wmm. + ra_list_spinlock); + } + } else { + pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, + priv->wmm. + ra_list_spinlock); + PRINTM(MINFO, "Nothing to send\n"); + } + + LEAVE(); } /** * @brief This function checks if this mlan_buffer is already processed. - * + * * @param priv A pointer to mlan_private * @param ptr A pointer to RA list table * @@ -835,19 +893,20 @@ wlan_send_single_packet(pmlan_private priv, raListTbl * ptr, int ptrindex) static int INLINE wlan_is_ptr_processed(mlan_private * priv, raListTbl * ptr) { - pmlan_buffer pmbuf; + pmlan_buffer pmbuf; - if ((pmbuf = (pmlan_buffer) util_peek_list(priv->adapter->pmoal_handle, - &ptr->buf_head, MNULL, MNULL)) - && (pmbuf->flags & MLAN_BUF_FLAG_REQUEUED_PKT)) - return MTRUE; + if ((pmbuf = (pmlan_buffer) util_peek_list(priv->adapter->pmoal_handle, + &ptr->buf_head, + MNULL, MNULL)) + && (pmbuf->flags & MLAN_BUF_FLAG_REQUEUED_PKT)) + return MTRUE; - return MFALSE; + return MFALSE; } /** * @brief This function sends a single packet that has been processed - * + * * @param priv A pointer to mlan_private * @param ptr A pointer to RA list table * @param ptrindex ptr's TID index @@ -857,83 +916,110 @@ wlan_is_ptr_processed(mlan_private * priv, raListTbl * ptr) static void INLINE wlan_send_processed_packet(pmlan_private priv, raListTbl * ptr, int ptrindex) { - pmlan_buffer pmbuf_next = MNULL; - mlan_tx_param tx_param; - pmlan_buffer pmbuf; - pmlan_adapter pmadapter = priv->adapter; - mlan_status ret = MLAN_STATUS_FAILURE; - - if ((pmbuf = (pmlan_buffer) util_dequeue_list(pmadapter->pmoal_handle, - &ptr->buf_head, - MNULL, MNULL))) { - pmbuf_next = - (pmlan_buffer) util_peek_list(pmadapter->pmoal_handle, - &ptr->buf_head, MNULL, MNULL); - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - tx_param.next_pkt_len = - ((pmbuf_next) ? pmbuf_next->data_len + sizeof(TxPD) : 0); - ret = - wlan_sdio_host_to_card(pmadapter, MLAN_TYPE_DATA, pmbuf, &tx_param); - switch (ret) { - case MLAN_STATUS_RESOURCE: - PRINTM(MINFO, "MLAN_STATUS_RESOURCE is returned\n"); - pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - - if (!wlan_is_ralist_valid(priv, ptr, ptrindex)) { - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm. - ra_list_spinlock); - wlan_write_data_complete(pmadapter, pmbuf, MLAN_STATUS_FAILURE); - LEAVE(); - return; - } - util_enqueue_list_head(pmadapter->pmoal_handle, - &ptr->buf_head, - (pmlan_linked_list) pmbuf, MNULL, MNULL); - - pmbuf->flags |= MLAN_BUF_FLAG_REQUEUED_PKT; - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - break; - case MLAN_STATUS_FAILURE: - pmadapter->data_sent = MFALSE; - PRINTM(MERROR, "Error: Failed to write data\n"); - pmadapter->dbg.num_tx_host_to_card_failure++; - pmbuf->status_code = MLAN_ERROR_DATA_TX_FAIL; - wlan_write_data_complete(pmadapter, pmbuf, ret); - break; - case MLAN_STATUS_PENDING: - pmadapter->data_sent = MFALSE; - default: - break; - } - if (ret != MLAN_STATUS_RESOURCE) { - pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - if (wlan_is_ralist_valid(priv, ptr, ptrindex)) { - priv->wmm.packets_out[ptrindex]++; - priv->wmm.tid_tbl_ptr[ptrindex].ra_list_curr = ptr; - ptr->total_pkts--; - } - pmadapter->bssprio_tbl[priv->bss_priority].bssprio_cur = - pmadapter->bssprio_tbl[priv->bss_priority].bssprio_cur->pnext; - priv->wmm.pkts_queued[ptrindex]--; - util_scalar_decrement(pmadapter->pmoal_handle, - &priv->wmm.tx_pkts_queued, MNULL, MNULL); - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - } - } else { - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - } + pmlan_buffer pmbuf_next = MNULL; + mlan_tx_param tx_param; + pmlan_buffer pmbuf; + pmlan_adapter pmadapter = priv->adapter; + mlan_status ret = MLAN_STATUS_FAILURE; + + if ((pmbuf = (pmlan_buffer) util_dequeue_list(pmadapter->pmoal_handle, + &ptr->buf_head, + MNULL, MNULL))) { + pmbuf_next = + (pmlan_buffer) util_peek_list(pmadapter->pmoal_handle, + &ptr->buf_head, MNULL, + MNULL); + pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, + priv->wmm. + ra_list_spinlock); + tx_param.next_pkt_len = + ((pmbuf_next) ? pmbuf_next->data_len + + sizeof(TxPD) : 0); + ret = wlan_sdio_host_to_card(pmadapter, MLAN_TYPE_DATA, pmbuf, + &tx_param); + switch (ret) { + case MLAN_STATUS_RESOURCE: + PRINTM(MINFO, "MLAN_STATUS_RESOURCE is returned\n"); + pmadapter->callbacks.moal_spin_lock(pmadapter-> + pmoal_handle, + priv->wmm. + ra_list_spinlock); + + if (!wlan_is_ralist_valid(priv, ptr, ptrindex)) { + pmadapter->callbacks. + moal_spin_unlock(pmadapter-> + pmoal_handle, + priv->wmm. + ra_list_spinlock); + wlan_write_data_complete(pmadapter, pmbuf, + MLAN_STATUS_FAILURE); + LEAVE(); + return; + } + util_enqueue_list_head(pmadapter->pmoal_handle, + &ptr->buf_head, + (pmlan_linked_list) pmbuf, + MNULL, MNULL); + + pmbuf->flags |= MLAN_BUF_FLAG_REQUEUED_PKT; + pmadapter->callbacks.moal_spin_unlock(pmadapter-> + pmoal_handle, + priv->wmm. + ra_list_spinlock); + break; + case MLAN_STATUS_FAILURE: + pmadapter->data_sent = MFALSE; + PRINTM(MERROR, "Error: Failed to write data\n"); + pmadapter->dbg.num_tx_host_to_card_failure++; + pmbuf->status_code = MLAN_ERROR_DATA_TX_FAIL; + wlan_write_data_complete(pmadapter, pmbuf, ret); + break; + case MLAN_STATUS_PENDING: + pmadapter->data_sent = MFALSE; + break; + case MLAN_STATUS_SUCCESS: + DBG_HEXDUMP(MDAT_D, "Tx", + pmbuf->pbuf + pmbuf->data_offset, + MIN(pmbuf->data_len + sizeof(TxPD), + MAX_DATA_DUMP_LEN)); + wlan_write_data_complete(pmadapter, pmbuf, ret); + break; + default: + break; + } + if (ret != MLAN_STATUS_RESOURCE) { + pmadapter->callbacks.moal_spin_lock(pmadapter-> + pmoal_handle, + priv->wmm. + ra_list_spinlock); + if (wlan_is_ralist_valid(priv, ptr, ptrindex)) { + priv->wmm.packets_out[ptrindex]++; + priv->wmm.tid_tbl_ptr[ptrindex].ra_list_curr = + ptr; + ptr->total_pkts--; + } + pmadapter->bssprio_tbl[priv->bss_priority].bssprio_cur = + pmadapter->bssprio_tbl[priv->bss_priority]. + bssprio_cur->pnext; + priv->wmm.pkts_queued[ptrindex]--; + util_scalar_decrement(pmadapter->pmoal_handle, + &priv->wmm.tx_pkts_queued, + MNULL, MNULL); + pmadapter->callbacks.moal_spin_unlock(pmadapter-> + pmoal_handle, + priv->wmm. + ra_list_spinlock); + } + } else { + pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, + priv->wmm. + ra_list_spinlock); + } } /** * @brief This function dequeues a packet - * + * * @param pmadapter A pointer to mlan_adapter * * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE @@ -941,87 +1027,96 @@ wlan_send_processed_packet(pmlan_private priv, raListTbl * ptr, int ptrindex) static int wlan_dequeue_tx_packet(pmlan_adapter pmadapter) { - raListTbl *ptr; - pmlan_private priv = MNULL; - int ptrindex = 0; - t_u8 ra[MLAN_MAC_ADDR_LENGTH]; - int tid_del = 0; - int tid = 0; - - ENTER(); - - if (!(ptr = wlan_wmm_get_highest_priolist_ptr(pmadapter, &priv, &ptrindex))) { - LEAVE(); - return MLAN_STATUS_FAILURE; - } - - /* Note:- Spinlock is locked in wlan_wmm_get_highest_priolist_ptr when it - returns a pointer (for the priv it returns), and is unlocked in - wlan_send_processed_packet, wlan_send_single_packet or - wlan_11n_aggregate_pkt. The spinlock would be required for some parts - of both of function. But, the the bulk of these function will execute - w/o spinlock. Unlocking the spinlock inside these function will help - us avoid taking the spinlock again, check to see if the ptr is still - valid and then proceed. This is done purely to increase execution time. - */ - - /* Note:- Also, anybody adding code which does not get into - wlan_send_processed_packet, wlan_send_single_packet, or - wlan_11n_aggregate_pkt should make sure ra_list_spinlock is freed. - Otherwise there would be a lock up. */ - - tid = wlan_get_tid(priv->adapter, ptr); - if (tid >= MAX_NUM_TID) - tid = wlan_wmm_downgrade_tid(priv, tid); - - if (wlan_is_ptr_processed(priv, ptr)) { - wlan_send_processed_packet(priv, ptr, ptrindex); - LEAVE(); - return MLAN_STATUS_SUCCESS; - } - - if (!ptr->is_11n_enabled || wlan_is_bastream_setup(priv, ptr, tid) + raListTbl *ptr; + pmlan_private priv = MNULL; + int ptrindex = 0; + t_u8 ra[MLAN_MAC_ADDR_LENGTH]; + int tid_del = 0; + int tid = 0; + + ENTER(); + + if (!(ptr = wlan_wmm_get_highest_priolist_ptr(pmadapter, &priv, + &ptrindex))) { + LEAVE(); + return MLAN_STATUS_FAILURE; + } + + /* Note:- Spinlock is locked in wlan_wmm_get_highest_priolist_ptr when + it returns a pointer (for the priv it returns), and is unlocked in + wlan_send_processed_packet, wlan_send_single_packet or + wlan_11n_aggregate_pkt. The spinlock would be required for some + parts of both of function. But, the the bulk of these function + will execute w/o spinlock. Unlocking the spinlock inside these + function will help us avoid taking the spinlock again, check to see + if the ptr is still valid and then proceed. This is done purely to + increase execution time. */ + + /* Note:- Also, anybody adding code which does not get into + wlan_send_processed_packet, wlan_send_single_packet, or + wlan_11n_aggregate_pkt should make sure ra_list_spinlock is freed. + Otherwise there would be a lock up. */ + + tid = wlan_get_tid(priv->adapter, ptr); + if (tid >= MAX_NUM_TID) + tid = wlan_wmm_downgrade_tid(priv, tid); + + if (wlan_is_ptr_processed(priv, ptr)) { + wlan_send_processed_packet(priv, ptr, ptrindex); + LEAVE(); + return MLAN_STATUS_SUCCESS; + } + + if (!ptr->is_11n_enabled || wlan_is_bastream_setup(priv, ptr, tid) #ifdef STA_SUPPORT - || priv->wps.session_enable + || priv->wps.session_enable #endif /* STA_SUPPORT */ - ) { - if (ptr->is_11n_enabled && wlan_is_bastream_setup(priv, ptr, tid) - && wlan_is_amsdu_in_ampdu_allowed(priv, ptr, tid) - && wlan_is_amsdu_allowed(priv, ptr, tid) - && (wlan_num_pkts_in_txq(priv, ptr, pmadapter->tx_buf_size) >= - MIN_NUM_AMSDU)) { - wlan_11n_aggregate_pkt(priv, ptr, INTF_HEADER_LEN, ptrindex); - } else - wlan_send_single_packet(priv, ptr, ptrindex); - } else { - if (wlan_is_ampdu_allowed(priv, ptr, tid) && - (ptr->packet_count > ptr->ba_packet_threshold)) { - if (wlan_is_bastream_avail(priv)) { - PRINTM(MINFO, "BA setup threshold %d reached. tid=%d\n", - ptr->packet_count, tid); - wlan_11n_create_txbastream_tbl(priv, - ptr->ra, tid, - BA_STREAM_SETUP_INPROGRESS); - wlan_send_addba(priv, tid, ptr->ra); - } else if (wlan_find_stream_to_delete(priv, ptr, tid, &tid_del, ra)) { - PRINTM(MDAT_D, "tid_del=%d tid=%d\n", tid_del, tid); - wlan_11n_create_txbastream_tbl(priv, - ptr->ra, tid, - BA_STREAM_SETUP_INPROGRESS); - wlan_send_delba(priv, MNULL, tid_del, ra, 1); - } - } - if (wlan_is_amsdu_allowed(priv, ptr, tid) && - (wlan_num_pkts_in_txq(priv, ptr, - pmadapter->tx_buf_size) >= MIN_NUM_AMSDU)) { - wlan_11n_aggregate_pkt(priv, ptr, INTF_HEADER_LEN, ptrindex); - } else { - wlan_send_single_packet(priv, ptr, ptrindex); - } - } - - LEAVE(); - return MLAN_STATUS_SUCCESS; + ) { + if (ptr->is_11n_enabled && + wlan_is_bastream_setup(priv, ptr, tid) + && wlan_is_amsdu_in_ampdu_allowed(priv, ptr, tid) + && wlan_is_amsdu_allowed(priv, ptr, tid) + && (wlan_num_pkts_in_txq(priv, ptr, pmadapter->tx_buf_size) + >= MIN_NUM_AMSDU)) { + wlan_11n_aggregate_pkt(priv, ptr, INTF_HEADER_LEN, + ptrindex); + } else + wlan_send_single_packet(priv, ptr, ptrindex); + } else { + if (wlan_is_ampdu_allowed(priv, ptr, tid) && + (ptr->packet_count > ptr->ba_packet_threshold)) { + if (wlan_is_bastream_avail(priv)) { + PRINTM(MINFO, + "BA setup threshold %d reached. tid=%d\n", + ptr->packet_count, tid); + wlan_11n_create_txbastream_tbl(priv, ptr->ra, + tid, + BA_STREAM_SETUP_INPROGRESS); + wlan_send_addba(priv, tid, ptr->ra); + } else if (wlan_find_stream_to_delete(priv, ptr, + tid, &tid_del, + ra)) { + PRINTM(MDAT_D, "tid_del=%d tid=%d\n", tid_del, + tid); + wlan_11n_create_txbastream_tbl(priv, ptr->ra, + tid, + BA_STREAM_SETUP_INPROGRESS); + wlan_send_delba(priv, MNULL, tid_del, ra, 1); + } + } + if (wlan_is_amsdu_allowed(priv, ptr, tid) && + (wlan_num_pkts_in_txq(priv, ptr, + pmadapter->tx_buf_size) >= + MIN_NUM_AMSDU)) { + wlan_11n_aggregate_pkt(priv, ptr, INTF_HEADER_LEN, + ptrindex); + } else { + wlan_send_single_packet(priv, ptr, ptrindex); + } + } + + LEAVE(); + return MLAN_STATUS_SUCCESS; } /** @@ -1036,40 +1131,40 @@ wlan_dequeue_tx_packet(pmlan_adapter pmadapter) t_void wlan_update_ralist_tx_pause(pmlan_private priv, t_u8 * mac, t_u8 tx_pause) { - raListTbl *ra_list; - int i; - pmlan_adapter pmadapter = priv->adapter; - t_u32 pkt_cnt = 0; - t_u32 tx_pkts_queued = 0; - ENTER(); - - pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - for (i = 0; i < MAX_NUM_TID; ++i) { - ra_list = wlan_wmm_get_ralist_node(priv, i, mac); - if (ra_list) { - pkt_cnt += ra_list->total_pkts; - ra_list->tx_pause = tx_pause; - } - } - if (pkt_cnt) { - tx_pkts_queued = util_scalar_read(pmadapter->pmoal_handle, - &priv->wmm.tx_pkts_queued, MNULL, - MNULL); - if (tx_pause) - tx_pkts_queued -= pkt_cnt; - else - tx_pkts_queued += pkt_cnt; - util_scalar_write(priv->adapter->pmoal_handle, - &priv->wmm.tx_pkts_queued, tx_pkts_queued, MNULL, - MNULL); - util_scalar_write(priv->adapter->pmoal_handle, - &priv->wmm.highest_queued_prio, HIGH_PRIO_TID, MNULL, - MNULL); - } - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - LEAVE(); + raListTbl *ra_list; + int i; + pmlan_adapter pmadapter = priv->adapter; + t_u32 pkt_cnt = 0; + t_u32 tx_pkts_queued = 0; + ENTER(); + + pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, + priv->wmm.ra_list_spinlock); + for (i = 0; i < MAX_NUM_TID; ++i) { + ra_list = wlan_wmm_get_ralist_node(priv, i, mac); + if (ra_list) { + pkt_cnt += ra_list->total_pkts; + ra_list->tx_pause = tx_pause; + } + } + if (pkt_cnt) { + tx_pkts_queued = util_scalar_read(pmadapter->pmoal_handle, + &priv->wmm.tx_pkts_queued, + MNULL, MNULL); + if (tx_pause) + tx_pkts_queued -= pkt_cnt; + else + tx_pkts_queued += pkt_cnt; + util_scalar_write(priv->adapter->pmoal_handle, + &priv->wmm.tx_pkts_queued, tx_pkts_queued, + MNULL, MNULL); + util_scalar_write(priv->adapter->pmoal_handle, + &priv->wmm.highest_queued_prio, HIGH_PRIO_TID, + MNULL, MNULL); + } + pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, + priv->wmm.ra_list_spinlock); + LEAVE(); } #ifdef STA_SUPPORT @@ -1088,30 +1183,30 @@ wlan_update_ralist_tx_pause(pmlan_private priv, t_u8 * mac, t_u8 tx_pause) t_u8 wlan_get_random_ba_threshold(pmlan_adapter pmadapter) { - t_u32 sec, usec; - t_u8 ba_threshold = 0; + t_u32 sec, usec; + t_u8 ba_threshold = 0; - ENTER(); + ENTER(); - /* setup ba_packet_threshold here random number between - [BA_SETUP_PACKET_OFFSET, - BA_SETUP_PACKET_OFFSET+BA_SETUP_MAX_PACKET_THRESHOLD-1] */ + /* setup ba_packet_threshold here random number between + [BA_SETUP_PACKET_OFFSET, + BA_SETUP_PACKET_OFFSET+BA_SETUP_MAX_PACKET_THRESHOLD-1] */ #define BA_SETUP_MAX_PACKET_THRESHOLD 16 #define BA_SETUP_PACKET_OFFSET 16 - pmadapter->callbacks.moal_get_system_time(pmadapter->pmoal_handle, &sec, - &usec); - sec = (sec & 0xFFFF) + (sec >> 16); - usec = (usec & 0xFFFF) + (usec >> 16); + pmadapter->callbacks.moal_get_system_time(pmadapter->pmoal_handle, &sec, + &usec); + sec = (sec & 0xFFFF) + (sec >> 16); + usec = (usec & 0xFFFF) + (usec >> 16); - ba_threshold = - (((sec << 16) + usec) % BA_SETUP_MAX_PACKET_THRESHOLD) + - BA_SETUP_PACKET_OFFSET; - PRINTM(MINFO, "setup BA after %d packets\n", ba_threshold); + ba_threshold = + (((sec << 16) + usec) % BA_SETUP_MAX_PACKET_THRESHOLD) + + BA_SETUP_PACKET_OFFSET; + PRINTM(MINFO, "setup BA after %d packets\n", ba_threshold); - LEAVE(); - return ba_threshold; + LEAVE(); + return ba_threshold; } /** @@ -1124,20 +1219,20 @@ wlan_get_random_ba_threshold(pmlan_adapter pmadapter) t_void wlan_clean_txrx(pmlan_private priv) { - mlan_adapter *pmadapter = priv->adapter; - t_u8 i = 0; + mlan_adapter *pmadapter = priv->adapter; + t_u8 i = 0; - ENTER(); + ENTER(); - wlan_cleanup_bypass_txq(priv); + wlan_cleanup_bypass_txq(priv); - wlan_11n_cleanup_reorder_tbl(priv); + wlan_11n_cleanup_reorder_tbl(priv); - pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); + pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, + priv->wmm.ra_list_spinlock); - wlan_wmm_cleanup_queues(priv); - wlan_11n_deleteall_txbastream_tbl(priv); + wlan_wmm_cleanup_queues(priv); + wlan_11n_deleteall_txbastream_tbl(priv); #ifdef SDIO_MULTI_PORT_TX_AGGR /** * Before reset the TX aggregation buffer, check for any pre-copied data. @@ -1148,31 +1243,32 @@ wlan_clean_txrx(pmlan_private priv) * fw doesn't issue tx-done interrupt in this condition. */ - while (pmadapter->mpa_tx.pkt_cnt) { - /* Decrement current write port to the last used port */ - if (pmadapter->curr_wr_port == 0) - pmadapter->curr_wr_port = MAX_PORT; - pmadapter->curr_wr_port--; + while (pmadapter->mpa_tx.pkt_cnt) { + /* Decrement current write port to the last used port */ + if (pmadapter->curr_wr_port == 0) + pmadapter->curr_wr_port = MAX_PORT; + pmadapter->curr_wr_port--; - /* Mark the port as available in write bitmap */ - pmadapter->mp_wr_bitmap |= (t_u16) (1 << pmadapter->curr_wr_port); - pmadapter->mpa_tx.pkt_cnt--; - } + /* Mark the port as available in write bitmap */ + pmadapter->mp_wr_bitmap |= + (t_u16) (1 << pmadapter->curr_wr_port); + pmadapter->mpa_tx.pkt_cnt--; + } - MP_TX_AGGR_BUF_RESET(priv->adapter); + MP_TX_AGGR_BUF_RESET(priv->adapter); #endif - wlan_wmm_delete_all_ralist(priv); - memcpy(pmadapter, tos_to_tid, ac_to_tid, sizeof(tos_to_tid)); - for (i = 0; i < MAX_NUM_TID; i++) { - tos_to_tid_inv[tos_to_tid[i]] = (t_u8) i; - } + wlan_wmm_delete_all_ralist(priv); + memcpy(pmadapter, tos_to_tid, ac_to_tid, sizeof(tos_to_tid)); + for (i = 0; i < MAX_NUM_TID; i++) { + tos_to_tid_inv[tos_to_tid[i]] = (t_u8) i; + } #if defined(UAP_SUPPORT) - priv->num_drop_pkts = 0; + priv->num_drop_pkts = 0; #endif - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); + pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, + priv->wmm.ra_list_spinlock); - LEAVE(); + LEAVE(); } /** @@ -1185,15 +1281,15 @@ wlan_clean_txrx(pmlan_private priv) void wlan_wmm_default_queue_priorities(pmlan_private priv) { - ENTER(); + ENTER(); - /* Default queue priorities: VO->VI->BE->BK */ - priv->wmm.queue_priority[0] = WMM_AC_VO; - priv->wmm.queue_priority[1] = WMM_AC_VI; - priv->wmm.queue_priority[2] = WMM_AC_BE; - priv->wmm.queue_priority[3] = WMM_AC_BK; + /* Default queue priorities: VO->VI->BE->BK */ + priv->wmm.queue_priority[0] = WMM_AC_VO; + priv->wmm.queue_priority[1] = WMM_AC_VI; + priv->wmm.queue_priority[2] = WMM_AC_BE; + priv->wmm.queue_priority[3] = WMM_AC_BK; - LEAVE(); + LEAVE(); } /** @@ -1206,71 +1302,74 @@ wlan_wmm_default_queue_priorities(pmlan_private priv) */ void wlan_wmm_setup_queue_priorities(pmlan_private priv, - IEEEtypes_WmmParameter_t * pwmm_ie) + IEEEtypes_WmmParameter_t * pwmm_ie) { - t_u16 cw_min, avg_back_off, tmp[4]; - t_u32 i, j, num_ac; - t_u8 ac_idx; - - ENTER(); - - if (!pwmm_ie || priv->wmm_enabled == MFALSE) { - /* WMM is not enabled, just set the defaults and return */ - wlan_wmm_default_queue_priorities(priv); - LEAVE(); - return; - } - - HEXDUMP("WMM: setup_queue_priorities: param IE", - (t_u8 *) pwmm_ie, sizeof(IEEEtypes_WmmParameter_t)); - - PRINTM(MINFO, "WMM Parameter IE: version=%d, " - "qos_info Parameter Set Count=%d, Reserved=%#x\n", - pwmm_ie->vend_hdr.version, pwmm_ie->qos_info.para_set_count, - pwmm_ie->reserved); - - for (num_ac = 0; num_ac < NELEMENTS(pwmm_ie->ac_params); num_ac++) { - cw_min = (1 << pwmm_ie->ac_params[num_ac].ecw.ecw_min) - 1; - avg_back_off - = (cw_min >> 1) + pwmm_ie->ac_params[num_ac].aci_aifsn.aifsn; - - ac_idx = wmm_aci_to_qidx_map[pwmm_ie->ac_params[num_ac].aci_aifsn.aci]; - priv->wmm.queue_priority[ac_idx] = ac_idx; - tmp[ac_idx] = avg_back_off; - - PRINTM(MCMND, "WMM: CWmax=%d CWmin=%d Avg Back-off=%d\n", - (1 << pwmm_ie->ac_params[num_ac].ecw.ecw_max) - 1, - cw_min, avg_back_off); - PRINTM_AC(&pwmm_ie->ac_params[num_ac]); - } - - HEXDUMP("WMM: avg_back_off", (t_u8 *) tmp, sizeof(tmp)); - HEXDUMP("WMM: queue_priority", priv->wmm.queue_priority, - sizeof(priv->wmm.queue_priority)); - - /* Bubble sort */ - for (i = 0; i < num_ac; i++) { - for (j = 1; j < num_ac - i; j++) { - if (tmp[j - 1] > tmp[j]) { - SWAP_U16(tmp[j - 1], tmp[j]); - SWAP_U8(priv->wmm.queue_priority[j - 1], - priv->wmm.queue_priority[j]); - } else if (tmp[j - 1] == tmp[j]) { - if (priv->wmm.queue_priority[j - 1] - < priv->wmm.queue_priority[j]) { - SWAP_U8(priv->wmm.queue_priority[j - 1], - priv->wmm.queue_priority[j]); - } - } - } - } - - wlan_wmm_queue_priorities_tid(priv, priv->wmm.queue_priority); - - HEXDUMP("WMM: avg_back_off, sort", (t_u8 *) tmp, sizeof(tmp)); - DBG_HEXDUMP(MCMD_D, "WMM: queue_priority, sort", priv->wmm.queue_priority, - sizeof(priv->wmm.queue_priority)); - LEAVE(); + t_u16 cw_min, avg_back_off, tmp[4]; + t_u32 i, j, num_ac; + t_u8 ac_idx; + + ENTER(); + + if (!pwmm_ie || priv->wmm_enabled == MFALSE) { + /* WMM is not enabled, just set the defaults and return */ + wlan_wmm_default_queue_priorities(priv); + LEAVE(); + return; + } + + HEXDUMP("WMM: setup_queue_priorities: param IE", + (t_u8 *) pwmm_ie, sizeof(IEEEtypes_WmmParameter_t)); + + PRINTM(MINFO, "WMM Parameter IE: version=%d, " + "qos_info Parameter Set Count=%d, Reserved=%#x\n", + pwmm_ie->vend_hdr.version, pwmm_ie->qos_info.para_set_count, + pwmm_ie->reserved); + + for (num_ac = 0; num_ac < NELEMENTS(pwmm_ie->ac_params); num_ac++) { + cw_min = (1 << pwmm_ie->ac_params[num_ac].ecw.ecw_min) - 1; + avg_back_off + = + (cw_min >> 1) + + pwmm_ie->ac_params[num_ac].aci_aifsn.aifsn; + + ac_idx = wmm_aci_to_qidx_map[pwmm_ie->ac_params[num_ac]. + aci_aifsn.aci]; + priv->wmm.queue_priority[ac_idx] = ac_idx; + tmp[ac_idx] = avg_back_off; + + PRINTM(MCMND, "WMM: CWmax=%d CWmin=%d Avg Back-off=%d\n", + (1 << pwmm_ie->ac_params[num_ac].ecw.ecw_max) - 1, + cw_min, avg_back_off); + PRINTM_AC(&pwmm_ie->ac_params[num_ac]); + } + + HEXDUMP("WMM: avg_back_off", (t_u8 *) tmp, sizeof(tmp)); + HEXDUMP("WMM: queue_priority", priv->wmm.queue_priority, + sizeof(priv->wmm.queue_priority)); + + /* Bubble sort */ + for (i = 0; i < num_ac; i++) { + for (j = 1; j < num_ac - i; j++) { + if (tmp[j - 1] > tmp[j]) { + SWAP_U16(tmp[j - 1], tmp[j]); + SWAP_U8(priv->wmm.queue_priority[j - 1], + priv->wmm.queue_priority[j]); + } else if (tmp[j - 1] == tmp[j]) { + if (priv->wmm.queue_priority[j - 1] + < priv->wmm.queue_priority[j]) { + SWAP_U8(priv->wmm.queue_priority[j - 1], + priv->wmm.queue_priority[j]); + } + } + } + } + + wlan_wmm_queue_priorities_tid(priv, priv->wmm.queue_priority); + + HEXDUMP("WMM: avg_back_off, sort", (t_u8 *) tmp, sizeof(tmp)); + DBG_HEXDUMP(MCMD_D, "WMM: queue_priority, sort", + priv->wmm.queue_priority, sizeof(priv->wmm.queue_priority)); + LEAVE(); } /** @@ -1283,27 +1382,30 @@ wlan_wmm_setup_queue_priorities(pmlan_private priv, void wlan_wmm_setup_ac_downgrade(pmlan_private priv) { - int ac_val; - - ENTER(); - - PRINTM(MINFO, "WMM: AC Priorities: BK(0), BE(1), VI(2), VO(3)\n"); - - if (priv->wmm_enabled == MFALSE) { - /* WMM is not enabled, default priorities */ - for (ac_val = WMM_AC_BK; ac_val <= WMM_AC_VO; ac_val++) { - priv->wmm.ac_down_graded_vals[ac_val] = (mlan_wmm_ac_e) ac_val; - } - } else { - for (ac_val = WMM_AC_BK; ac_val <= WMM_AC_VO; ac_val++) { - priv->wmm.ac_down_graded_vals[ac_val] - = wlan_wmm_eval_downgrade_ac(priv, (mlan_wmm_ac_e) ac_val); - PRINTM(MINFO, "WMM: AC PRIO %d maps to %d\n", - ac_val, priv->wmm.ac_down_graded_vals[ac_val]); - } - } - - LEAVE(); + int ac_val; + + ENTER(); + + PRINTM(MINFO, "WMM: AC Priorities: BK(0), BE(1), VI(2), VO(3)\n"); + + if (priv->wmm_enabled == MFALSE) { + /* WMM is not enabled, default priorities */ + for (ac_val = WMM_AC_BK; ac_val <= WMM_AC_VO; ac_val++) { + priv->wmm.ac_down_graded_vals[ac_val] = + (mlan_wmm_ac_e) ac_val; + } + } else { + for (ac_val = WMM_AC_BK; ac_val <= WMM_AC_VO; ac_val++) { + priv->wmm.ac_down_graded_vals[ac_val] + = wlan_wmm_eval_downgrade_ac(priv, + (mlan_wmm_ac_e) + ac_val); + PRINTM(MINFO, "WMM: AC PRIO %d maps to %d\n", ac_val, + priv->wmm.ac_down_graded_vals[ac_val]); + } + } + + LEAVE(); } /** @@ -1317,48 +1419,50 @@ wlan_wmm_setup_ac_downgrade(pmlan_private priv) void wlan_ralist_add(mlan_private * priv, t_u8 * ra) { - int i; - raListTbl *ra_list; - pmlan_adapter pmadapter = priv->adapter; - - ENTER(); - - for (i = 0; i < MAX_NUM_TID; ++i) { - ra_list = wlan_wmm_allocate_ralist_node(pmadapter, ra); - PRINTM(MINFO, "Creating RA List %p for tid %d\n", ra_list, i); - if (!ra_list) - break; - ra_list->max_amsdu = 0; - if (queuing_ra_based(priv)) { - ra_list->is_11n_enabled = wlan_is_11n_enabled(priv, ra); - if (ra_list->is_11n_enabled) - ra_list->max_amsdu = get_station_max_amsdu_size(priv, ra); - ra_list->tx_pause = wlan_is_tx_pause(priv, ra); - } else { - ra_list->is_11n_enabled = IS_11N_ENABLED(priv); - if (ra_list->is_11n_enabled) - ra_list->max_amsdu = priv->max_amsdu; - } - - PRINTM_NETINTF(MDATA, priv); - PRINTM(MDATA, "ralist %p: is_11n_enabled=%d max_amsdu=%d\n", - ra_list, ra_list->is_11n_enabled, ra_list->max_amsdu); - - if (ra_list->is_11n_enabled) { - ra_list->packet_count = 0; - ra_list->ba_packet_threshold = - wlan_get_random_ba_threshold(pmadapter); - } - - util_enqueue_list_tail(pmadapter->pmoal_handle, - &priv->wmm.tid_tbl_ptr[i].ra_list, - (pmlan_linked_list) ra_list, MNULL, MNULL); - - if (!priv->wmm.tid_tbl_ptr[i].ra_list_curr) - priv->wmm.tid_tbl_ptr[i].ra_list_curr = ra_list; - } - - LEAVE(); + int i; + raListTbl *ra_list; + pmlan_adapter pmadapter = priv->adapter; + + ENTER(); + + for (i = 0; i < MAX_NUM_TID; ++i) { + ra_list = wlan_wmm_allocate_ralist_node(pmadapter, ra); + PRINTM(MINFO, "Creating RA List %p for tid %d\n", ra_list, i); + if (!ra_list) + break; + ra_list->max_amsdu = 0; + if (queuing_ra_based(priv)) { + ra_list->is_11n_enabled = wlan_is_11n_enabled(priv, ra); + if (ra_list->is_11n_enabled) + ra_list->max_amsdu = + get_station_max_amsdu_size(priv, ra); + ra_list->tx_pause = wlan_is_tx_pause(priv, ra); + } else { + ra_list->is_11n_enabled = IS_11N_ENABLED(priv); + if (ra_list->is_11n_enabled) + ra_list->max_amsdu = priv->max_amsdu; + } + + PRINTM_NETINTF(MDATA, priv); + PRINTM(MDATA, "ralist %p: is_11n_enabled=%d max_amsdu=%d\n", + ra_list, ra_list->is_11n_enabled, ra_list->max_amsdu); + + if (ra_list->is_11n_enabled) { + ra_list->packet_count = 0; + ra_list->ba_packet_threshold = + wlan_get_random_ba_threshold(pmadapter); + } + + util_enqueue_list_tail(pmadapter->pmoal_handle, + &priv->wmm.tid_tbl_ptr[i].ra_list, + (pmlan_linked_list) ra_list, MNULL, + MNULL); + + if (!priv->wmm.tid_tbl_ptr[i].ra_list_curr) + priv->wmm.tid_tbl_ptr[i].ra_list_curr = ra_list; + } + + LEAVE(); } /** @@ -1371,53 +1475,63 @@ wlan_ralist_add(mlan_private * priv, t_u8 * ra) t_void wlan_wmm_init(pmlan_adapter pmadapter) { - int i, j; - pmlan_private priv; - - ENTER(); - - for (j = 0; j < pmadapter->priv_num; ++j) { - if ((priv = pmadapter->priv[j])) { - for (i = 0; i < MAX_NUM_TID; ++i) { - priv->aggr_prio_tbl[i].amsdu = BA_STREAM_NOT_ALLOWED; - priv->aggr_prio_tbl[i].ampdu_ap = - priv->aggr_prio_tbl[i].ampdu_user = tos_to_tid_inv[i]; - priv->wmm.pkts_queued[i] = 0; - priv->wmm.tid_tbl_ptr[i].ra_list_curr = MNULL; - } - priv->wmm.drv_pkt_delay_max = WMM_DRV_DELAY_MAX; - - priv->aggr_prio_tbl[6].ampdu_ap - = priv->aggr_prio_tbl[6].ampdu_user = BA_STREAM_NOT_ALLOWED; - - priv->aggr_prio_tbl[7].ampdu_ap - = priv->aggr_prio_tbl[7].ampdu_user = BA_STREAM_NOT_ALLOWED; - - priv->add_ba_param.timeout = MLAN_DEFAULT_BLOCK_ACK_TIMEOUT; + int i, j; + pmlan_private priv; + + ENTER(); + + for (j = 0; j < pmadapter->priv_num; ++j) { + if ((priv = pmadapter->priv[j])) { + for (i = 0; i < MAX_NUM_TID; ++i) { + priv->aggr_prio_tbl[i].amsdu = + BA_STREAM_NOT_ALLOWED; + priv->aggr_prio_tbl[i].ampdu_ap = + priv->aggr_prio_tbl[i].ampdu_user = + tos_to_tid_inv[i]; + priv->wmm.pkts_queued[i] = 0; + priv->wmm.tid_tbl_ptr[i].ra_list_curr = MNULL; + } + priv->wmm.drv_pkt_delay_max = WMM_DRV_DELAY_MAX; + + priv->aggr_prio_tbl[6].ampdu_ap + = priv->aggr_prio_tbl[6].ampdu_user = + BA_STREAM_NOT_ALLOWED; + + priv->aggr_prio_tbl[7].ampdu_ap + = priv->aggr_prio_tbl[7].ampdu_user = + BA_STREAM_NOT_ALLOWED; + + priv->add_ba_param.timeout = + MLAN_DEFAULT_BLOCK_ACK_TIMEOUT; #ifdef STA_SUPPORT - if (priv->bss_type == MLAN_BSS_TYPE_STA) { - priv->add_ba_param.tx_win_size = MLAN_STA_AMPDU_DEF_TXWINSIZE; - priv->add_ba_param.rx_win_size = MLAN_STA_AMPDU_DEF_RXWINSIZE; - } + if (priv->bss_type == MLAN_BSS_TYPE_STA) { + priv->add_ba_param.tx_win_size = + MLAN_STA_AMPDU_DEF_TXWINSIZE; + priv->add_ba_param.rx_win_size = + MLAN_STA_AMPDU_DEF_RXWINSIZE; + } #endif #ifdef UAP_SUPPORT - if (priv->bss_type == MLAN_BSS_TYPE_UAP + if (priv->bss_type == MLAN_BSS_TYPE_UAP #ifdef WIFI_DIRECT_SUPPORT - || priv->bss_type == MLAN_BSS_TYPE_WIFIDIRECT + || priv->bss_type == MLAN_BSS_TYPE_WIFIDIRECT #endif - ) { - priv->add_ba_param.tx_win_size = MLAN_UAP_AMPDU_DEF_TXWINSIZE; - priv->add_ba_param.rx_win_size = MLAN_UAP_AMPDU_DEF_RXWINSIZE; - } + ) { + priv->add_ba_param.tx_win_size = + MLAN_UAP_AMPDU_DEF_TXWINSIZE; + priv->add_ba_param.rx_win_size = + MLAN_UAP_AMPDU_DEF_RXWINSIZE; + } #endif - priv->add_ba_param.tx_amsdu = MTRUE; - priv->add_ba_param.rx_amsdu = MTRUE; - memset(priv->adapter, priv->rx_seq, 0xff, sizeof(priv->rx_seq)); - wlan_wmm_default_queue_priorities(priv); - } - } - - LEAVE(); + priv->add_ba_param.tx_amsdu = MTRUE; + priv->add_ba_param.rx_amsdu = MTRUE; + memset(priv->adapter, priv->rx_seq, 0xff, + sizeof(priv->rx_seq)); + wlan_wmm_default_queue_priorities(priv); + } + } + + LEAVE(); } /** @@ -1432,10 +1546,10 @@ wlan_wmm_init(pmlan_adapter pmadapter) void wlan_wmm_setup_queues(pmlan_private priv) { - ENTER(); - wlan_wmm_setup_queue_priorities(priv, MNULL); - wlan_wmm_setup_ac_downgrade(priv); - LEAVE(); + ENTER(); + wlan_wmm_setup_queue_priorities(priv, MNULL); + wlan_wmm_setup_ac_downgrade(priv); + LEAVE(); } #ifdef STA_SUPPORT @@ -1449,13 +1563,14 @@ wlan_wmm_setup_queues(pmlan_private priv) mlan_status wlan_cmd_wmm_status_change(pmlan_private priv) { - mlan_status ret = MLAN_STATUS_SUCCESS; + mlan_status ret = MLAN_STATUS_SUCCESS; - ENTER(); + ENTER(); - ret = wlan_prepare_cmd(priv, HostCmd_CMD_WMM_GET_STATUS, 0, 0, 0, MNULL); - LEAVE(); - return ret; + ret = wlan_prepare_cmd(priv, HostCmd_CMD_WMM_GET_STATUS, 0, 0, 0, + MNULL); + LEAVE(); + return ret; } #endif @@ -1469,96 +1584,100 @@ wlan_cmd_wmm_status_change(pmlan_private priv) int wlan_wmm_lists_empty(pmlan_adapter pmadapter) { - int j; - pmlan_private priv; - - ENTER(); - - for (j = 0; j < pmadapter->priv_num; ++j) { - if ((priv = pmadapter->priv[j])) { - if ((priv->port_ctrl_mode == MTRUE) && (priv->port_open == MFALSE)) { - PRINTM(MINFO, - "wmm_lists_empty: PORT_CLOSED Ignore pkts from BSS%d\n", - j); - continue; - } - - if (util_scalar_read(pmadapter->pmoal_handle, - &priv->wmm.tx_pkts_queued, - pmadapter->callbacks.moal_spin_lock, - pmadapter->callbacks.moal_spin_unlock)) { - LEAVE(); - return MFALSE; - } - } - } - - LEAVE(); - return MTRUE; + int j; + pmlan_private priv; + + ENTER(); + + for (j = 0; j < pmadapter->priv_num; ++j) { + if ((priv = pmadapter->priv[j])) { + if ((priv->port_ctrl_mode == MTRUE) && + (priv->port_open == MFALSE)) { + PRINTM(MINFO, + "wmm_lists_empty: PORT_CLOSED Ignore pkts from BSS%d\n", + j); + continue; + } + + if (util_scalar_read(pmadapter->pmoal_handle, + &priv->wmm.tx_pkts_queued, + pmadapter->callbacks. + moal_spin_lock, + pmadapter->callbacks. + moal_spin_unlock)) { + LEAVE(); + return MFALSE; + } + } + } + + LEAVE(); + return MTRUE; } /** * @brief Get ralist node - * + * * @param priv Pointer to the mlan_private driver data struct * @param tid TID * @param ra_addr Pointer to the route address - * + * * @return ra_list or MNULL */ raListTbl * wlan_wmm_get_ralist_node(pmlan_private priv, t_u8 tid, t_u8 * ra_addr) { - raListTbl *ra_list; - ENTER(); - ra_list = - (raListTbl *) util_peek_list(priv->adapter->pmoal_handle, - &priv->wmm.tid_tbl_ptr[tid].ra_list, MNULL, - MNULL); - while (ra_list && (ra_list != (raListTbl *) - & priv->wmm.tid_tbl_ptr[tid].ra_list)) { - if (!memcmp(priv->adapter, ra_list->ra, ra_addr, MLAN_MAC_ADDR_LENGTH)) { - LEAVE(); - return ra_list; - } - ra_list = ra_list->pnext; - } - LEAVE(); - return MNULL; + raListTbl *ra_list; + ENTER(); + ra_list = + (raListTbl *) util_peek_list(priv->adapter->pmoal_handle, + &priv->wmm.tid_tbl_ptr[tid]. + ra_list, MNULL, MNULL); + while (ra_list && (ra_list != (raListTbl *) + & priv->wmm.tid_tbl_ptr[tid].ra_list)) { + if (!memcmp + (priv->adapter, ra_list->ra, ra_addr, + MLAN_MAC_ADDR_LENGTH)) { + LEAVE(); + return ra_list; + } + ra_list = ra_list->pnext; + } + LEAVE(); + return MNULL; } /** * @brief Check if RA list is valid or not - * + * * @param priv Pointer to the mlan_private driver data struct * @param ra_list Pointer to raListTbl * @param ptrindex TID pointer index - * - * @return MTRUE- valid. MFALSE- invalid. + * + * @return MTRUE- valid. MFALSE- invalid. */ int wlan_is_ralist_valid(mlan_private * priv, raListTbl * ra_list, int ptrindex) { - raListTbl *rlist; - - ENTER(); - - rlist = - (raListTbl *) util_peek_list(priv->adapter->pmoal_handle, - &priv->wmm.tid_tbl_ptr[ptrindex].ra_list, - MNULL, MNULL); - - while (rlist && (rlist != (raListTbl *) - & priv->wmm.tid_tbl_ptr[ptrindex].ra_list)) { - if (rlist == ra_list) { - LEAVE(); - return MTRUE; - } - - rlist = rlist->pnext; - } - LEAVE(); - return MFALSE; + raListTbl *rlist; + + ENTER(); + + rlist = (raListTbl *) util_peek_list(priv->adapter->pmoal_handle, + &priv->wmm.tid_tbl_ptr[ptrindex]. + ra_list, MNULL, MNULL); + + while (rlist && (rlist != (raListTbl *) + & priv->wmm.tid_tbl_ptr[ptrindex].ra_list)) { + if (rlist == ra_list) { + LEAVE(); + return MTRUE; + } + + rlist = rlist->pnext; + } + LEAVE(); + return MFALSE; } /** @@ -1573,38 +1692,41 @@ wlan_is_ralist_valid(mlan_private * priv, raListTbl * ra_list, int ptrindex) int wlan_ralist_update(mlan_private * priv, t_u8 * old_ra, t_u8 * new_ra) { - t_u8 tid; - int update_count; - raListTbl *ra_list; + t_u8 tid; + int update_count; + raListTbl *ra_list; - ENTER(); + ENTER(); - update_count = 0; + update_count = 0; - for (tid = 0; tid < MAX_NUM_TID; ++tid) { + for (tid = 0; tid < MAX_NUM_TID; ++tid) { - ra_list = wlan_wmm_get_ralist_node(priv, tid, old_ra); + ra_list = wlan_wmm_get_ralist_node(priv, tid, old_ra); - if (ra_list) { - update_count++; + if (ra_list) { + update_count++; - if (queuing_ra_based(priv)) - ra_list->is_11n_enabled = wlan_is_11n_enabled(priv, new_ra); - else - ra_list->is_11n_enabled = IS_11N_ENABLED(priv); - ra_list->packet_count = 0; - ra_list->ba_packet_threshold = - wlan_get_random_ba_threshold(priv->adapter); - PRINTM(MINFO, "ralist_update: %p, %d, " MACSTR "-->" MACSTR "\n", - ra_list, ra_list->is_11n_enabled, MAC2STR(ra_list->ra), - MAC2STR(new_ra)); + if (queuing_ra_based(priv)) + ra_list->is_11n_enabled = + wlan_is_11n_enabled(priv, new_ra); + else + ra_list->is_11n_enabled = IS_11N_ENABLED(priv); + ra_list->packet_count = 0; + ra_list->ba_packet_threshold = + wlan_get_random_ba_threshold(priv->adapter); + PRINTM(MINFO, + "ralist_update: %p, %d, " MACSTR "-->" MACSTR + "\n", ra_list, ra_list->is_11n_enabled, + MAC2STR(ra_list->ra), MAC2STR(new_ra)); - memcpy(priv->adapter, ra_list->ra, new_ra, MLAN_MAC_ADDR_LENGTH); - } - } + memcpy(priv->adapter, ra_list->ra, new_ra, + MLAN_MAC_ADDR_LENGTH); + } + } - LEAVE(); - return update_count; + LEAVE(); + return update_count; } /** @@ -1618,97 +1740,105 @@ wlan_ralist_update(mlan_private * priv, t_u8 * old_ra, t_u8 * new_ra) t_void wlan_wmm_add_buf_txqueue(pmlan_adapter pmadapter, pmlan_buffer pmbuf) { - pmlan_private priv = pmadapter->priv[pmbuf->bss_index]; - t_u32 tid; - raListTbl *ra_list; - t_u8 ra[MLAN_MAC_ADDR_LENGTH], tid_down; + pmlan_private priv = pmadapter->priv[pmbuf->bss_index]; + t_u32 tid; + raListTbl *ra_list; + t_u8 ra[MLAN_MAC_ADDR_LENGTH], tid_down; #if defined(UAP_SUPPORT) - sta_node *sta_ptr = MNULL; + sta_node *sta_ptr = MNULL; #endif - ENTER(); - - pmbuf->buf_type = MLAN_BUF_TYPE_DATA; - if (!priv->media_connected) { - PRINTM_NETINTF(MWARN, priv); - PRINTM(MWARN, "Drop packet %p in disconnect state\n", pmbuf); - wlan_write_data_complete(pmadapter, pmbuf, MLAN_STATUS_FAILURE); - LEAVE(); - return; - } - tid = pmbuf->priority; - pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - tid_down = wlan_wmm_downgrade_tid(priv, tid); - - /* In case of infra as we have already created the list during association - we just don't have to call get_queue_raptr, we will have only 1 raptr - for a tid in case of infra */ - if (!queuing_ra_based(priv)) { - ra_list = (raListTbl *) util_peek_list(pmadapter->pmoal_handle, - &priv->wmm.tid_tbl_ptr[tid_down]. - ra_list, MNULL, MNULL); - } else { - memcpy(pmadapter, ra, pmbuf->pbuf + pmbuf->data_offset, - MLAN_MAC_ADDR_LENGTH); - /** put multicast/broadcast packet in the same ralist */ - if (ra[0] & 0x01) - memset(pmadapter, ra, 0xff, sizeof(ra)); + ENTER(); + + pmbuf->buf_type = MLAN_BUF_TYPE_DATA; + if (!priv->media_connected) { + PRINTM_NETINTF(MWARN, priv); + PRINTM(MWARN, "Drop packet %p in disconnect state\n", pmbuf); + wlan_write_data_complete(pmadapter, pmbuf, MLAN_STATUS_FAILURE); + LEAVE(); + return; + } + tid = pmbuf->priority; + pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, + priv->wmm.ra_list_spinlock); + tid_down = wlan_wmm_downgrade_tid(priv, tid); + + /* In case of infra as we have already created the list during + association we just don't have to call get_queue_raptr, we will have + only 1 raptr for a tid in case of infra */ + if (!queuing_ra_based(priv)) { + ra_list = (raListTbl *) util_peek_list(pmadapter->pmoal_handle, + &priv->wmm. + tid_tbl_ptr[tid_down]. + ra_list, MNULL, MNULL); + } else { + memcpy(pmadapter, ra, pmbuf->pbuf + pmbuf->data_offset, + MLAN_MAC_ADDR_LENGTH); + /** put multicast/broadcast packet in the same ralist */ + if (ra[0] & 0x01) + memset(pmadapter, ra, 0xff, sizeof(ra)); #if defined(UAP_SUPPORT) - else if (priv->bss_type == MLAN_BSS_TYPE_UAP) { - if ((sta_ptr = wlan_get_station_entry(priv, ra))) { - if (!sta_ptr->is_wmm_enabled) { - tid_down = wlan_wmm_downgrade_tid(priv, 0xff); - } - } - } + else if (priv->bss_type == MLAN_BSS_TYPE_UAP) { + if ((sta_ptr = wlan_get_station_entry(priv, ra))) { + if (!sta_ptr->is_wmm_enabled) { + tid_down = + wlan_wmm_downgrade_tid(priv, + 0xff); + } + } + } #endif - ra_list = wlan_wmm_get_queue_raptr(priv, tid_down, ra); - } - - if (!ra_list) { - PRINTM_NETINTF(MWARN, priv); - PRINTM(MWARN, "Drop packet %p, ra_list=%p, media_connected=%d\n", - pmbuf, ra_list, priv->media_connected); - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - wlan_write_data_complete(pmadapter, pmbuf, MLAN_STATUS_FAILURE); - LEAVE(); - return; - } - - PRINTM_NETINTF(MDATA, priv); - PRINTM(MDATA, "Adding pkt %p (priority=%d, tid_down=%d) to ra_list %p\n", - pmbuf, pmbuf->priority, tid_down, ra_list); - util_enqueue_list_tail(pmadapter->pmoal_handle, &ra_list->buf_head, - (pmlan_linked_list) pmbuf, MNULL, MNULL); - - ra_list->total_pkts++; - ra_list->packet_count++; - - priv->wmm.pkts_queued[tid_down]++; - if (!ra_list->tx_pause) { - util_scalar_increment(pmadapter->pmoal_handle, - &priv->wmm.tx_pkts_queued, MNULL, MNULL); - /* if highest_queued_prio < prio(tid_down), set it to prio(tid_down) */ - util_scalar_conditional_write(pmadapter->pmoal_handle, - &priv->wmm.highest_queued_prio, - MLAN_SCALAR_COND_LESS_THAN, - tos_to_tid_inv[tid_down], - tos_to_tid_inv[tid_down], MNULL, MNULL); - } - /* Record the current time the packet was queued; used to determine the - amount of time the packet was queued in the driver before it was sent to - the firmware. The delay is then sent along with the packet to the - firmware for aggregate delay calculation for stats and MSDU lifetime - expiry. */ - pmadapter->callbacks.moal_get_system_time(pmadapter->pmoal_handle, - &pmbuf->in_ts_sec, - &pmbuf->in_ts_usec); - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - - LEAVE(); + ra_list = wlan_wmm_get_queue_raptr(priv, tid_down, ra); + } + + if (!ra_list) { + PRINTM_NETINTF(MWARN, priv); + PRINTM(MWARN, + "Drop packet %p, ra_list=%p, media_connected=%d\n", + pmbuf, ra_list, priv->media_connected); + pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, + priv->wmm. + ra_list_spinlock); + wlan_write_data_complete(pmadapter, pmbuf, MLAN_STATUS_FAILURE); + LEAVE(); + return; + } + + PRINTM_NETINTF(MDATA, priv); + PRINTM(MDATA, + "Adding pkt %p (priority=%d, tid_down=%d) to ra_list %p\n", + pmbuf, pmbuf->priority, tid_down, ra_list); + util_enqueue_list_tail(pmadapter->pmoal_handle, &ra_list->buf_head, + (pmlan_linked_list) pmbuf, MNULL, MNULL); + + ra_list->total_pkts++; + ra_list->packet_count++; + + priv->wmm.pkts_queued[tid_down]++; + if (!ra_list->tx_pause) { + util_scalar_increment(pmadapter->pmoal_handle, + &priv->wmm.tx_pkts_queued, MNULL, MNULL); + /* if highest_queued_prio < prio(tid_down), set it to + prio(tid_down) */ + util_scalar_conditional_write(pmadapter->pmoal_handle, + &priv->wmm.highest_queued_prio, + MLAN_SCALAR_COND_LESS_THAN, + tos_to_tid_inv[tid_down], + tos_to_tid_inv[tid_down], + MNULL, MNULL); + } + /* Record the current time the packet was queued; used to determine the + amount of time the packet was queued in the driver before it was + sent to the firmware. The delay is then sent along with the packet + to the firmware for aggregate delay calculation for stats and MSDU + lifetime expiry. */ + pmadapter->callbacks.moal_get_system_time(pmadapter->pmoal_handle, + &pmbuf->in_ts_sec, + &pmbuf->in_ts_usec); + pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, + priv->wmm.ra_list_spinlock); + + LEAVE(); } #ifdef STA_SUPPORT @@ -1732,123 +1862,153 @@ wlan_wmm_add_buf_txqueue(pmlan_adapter pmadapter, pmlan_buffer pmbuf) mlan_status wlan_ret_wmm_get_status(pmlan_private priv, t_u8 * ptlv, int resp_len) { - t_u8 *pcurrent = ptlv; - t_u32 tlv_len; - t_u8 sendWmmEvent; - MrvlIEtypes_Data_t *pTlvHdr; - MrvlIEtypes_WmmQueueStatus_t *pTlvWmmQStatus; - IEEEtypes_WmmParameter_t *pWmmParamIe = MNULL; - WmmAcStatus_t *pac_status; - - MrvlIETypes_ActionFrame_t *pTlvAction; - IEEEtypes_Action_WMM_AddTsRsp_t *pAddTsRsp; - IEEEtypes_Action_WMM_DelTs_t *pDelTs; - - ENTER(); - - sendWmmEvent = MFALSE; - - PRINTM(MINFO, "WMM: WMM_GET_STATUS cmdresp received: %d\n", resp_len); - HEXDUMP("CMD_RESP: WMM_GET_STATUS", pcurrent, resp_len); - - while (resp_len >= sizeof(pTlvHdr->header)) { - pTlvHdr = (MrvlIEtypes_Data_t *) pcurrent; - tlv_len = wlan_le16_to_cpu(pTlvHdr->header.len); - - switch (wlan_le16_to_cpu(pTlvHdr->header.type)) { - case TLV_TYPE_WMMQSTATUS: - pTlvWmmQStatus = (MrvlIEtypes_WmmQueueStatus_t *) pTlvHdr; - PRINTM(MEVENT, "WMM_STATUS: QSTATUS TLV: %d\n", - pTlvWmmQStatus->queue_index); - - PRINTM(MINFO, - "CMD_RESP: WMM_GET_STATUS: QSTATUS TLV: %d, %d, %d\n", - pTlvWmmQStatus->queue_index, - pTlvWmmQStatus->flow_required, pTlvWmmQStatus->disabled); - - pac_status = &priv->wmm.ac_status[pTlvWmmQStatus->queue_index]; - pac_status->disabled = pTlvWmmQStatus->disabled; - pac_status->flow_required = pTlvWmmQStatus->flow_required; - pac_status->flow_created = pTlvWmmQStatus->flow_created; - break; - - case WMM_IE: - /* - * Point the regular IEEE IE 2 bytes into the Marvell IE - * and setup the IEEE IE type and length byte fields - */ - - PRINTM(MEVENT, "WMM STATUS: WMM IE\n"); - - HEXDUMP("WMM: WMM TLV:", (t_u8 *) pTlvHdr, tlv_len + 4); - - pWmmParamIe = (IEEEtypes_WmmParameter_t *) (pcurrent + 2); - pWmmParamIe->vend_hdr.len = (t_u8) tlv_len; - pWmmParamIe->vend_hdr.element_id = WMM_IE; - - PRINTM(MINFO, "CMD_RESP: WMM_GET_STATUS: WMM Parameter Set: %d\n", - pWmmParamIe->qos_info.para_set_count); - - memcpy(priv->adapter, - (t_u8 *) & priv->curr_bss_params.bss_descriptor.wmm_ie, - pWmmParamIe, MIN(sizeof(IEEEtypes_WmmParameter_t), - (pWmmParamIe->vend_hdr.len + 2))); - sendWmmEvent = MTRUE; - break; - - case TLV_TYPE_IEEE_ACTION_FRAME: - PRINTM(MEVENT, "WMM_STATUS: IEEE Action Frame\n"); - pTlvAction = (MrvlIETypes_ActionFrame_t *) pcurrent; - - if (pTlvAction->actionFrame.wmmAc.tspecAct.category - == IEEE_MGMT_ACTION_CATEGORY_WMM_TSPEC) { - - switch (pTlvAction->actionFrame.wmmAc.tspecAct.action) { - case TSPEC_ACTION_CODE_ADDTS_RSP: - pAddTsRsp = &pTlvAction->actionFrame.wmmAc.addTsRsp; - wlan_send_wmmac_host_event(priv, "ADDTS_RSP", - pTlvAction->srcAddr, - pAddTsRsp->tspecIE.TspecBody. - TSInfo.TID, - pAddTsRsp->tspecIE.TspecBody. - TSInfo.UserPri, - pAddTsRsp->statusCode); - break; - - case TSPEC_ACTION_CODE_DELTS: - pDelTs = &pTlvAction->actionFrame.wmmAc.delTs; - wlan_send_wmmac_host_event(priv, "DELTS_RX", - pTlvAction->srcAddr, - pDelTs->tspecIE.TspecBody.TSInfo. - TID, - pDelTs->tspecIE.TspecBody.TSInfo. - UserPri, pDelTs->reasonCode); - break; - - case TSPEC_ACTION_CODE_ADDTS_REQ: - default: - break; - } - } - break; - - default: - break; - } - - pcurrent += (tlv_len + sizeof(pTlvHdr->header)); - resp_len -= (tlv_len + sizeof(pTlvHdr->header)); - } - - wlan_wmm_setup_queue_priorities(priv, pWmmParamIe); - wlan_wmm_setup_ac_downgrade(priv); - - if (sendWmmEvent) { - wlan_recv_event(priv, MLAN_EVENT_ID_FW_WMM_CONFIG_CHANGE, MNULL); - } - - LEAVE(); - return MLAN_STATUS_SUCCESS; + t_u8 *pcurrent = ptlv; + t_u32 tlv_len; + t_u8 sendWmmEvent; + MrvlIEtypes_Data_t *pTlvHdr; + MrvlIEtypes_WmmQueueStatus_t *pTlvWmmQStatus; + IEEEtypes_WmmParameter_t *pWmmParamIe = MNULL; + WmmAcStatus_t *pac_status; + + MrvlIETypes_ActionFrame_t *pTlvAction; + IEEEtypes_Action_WMM_AddTsRsp_t *pAddTsRsp; + IEEEtypes_Action_WMM_DelTs_t *pDelTs; + + ENTER(); + + sendWmmEvent = MFALSE; + + PRINTM(MINFO, "WMM: WMM_GET_STATUS cmdresp received: %d\n", resp_len); + HEXDUMP("CMD_RESP: WMM_GET_STATUS", pcurrent, resp_len); + + while (resp_len >= sizeof(pTlvHdr->header)) { + pTlvHdr = (MrvlIEtypes_Data_t *) pcurrent; + tlv_len = wlan_le16_to_cpu(pTlvHdr->header.len); + + switch (wlan_le16_to_cpu(pTlvHdr->header.type)) { + case TLV_TYPE_WMMQSTATUS: + pTlvWmmQStatus = + (MrvlIEtypes_WmmQueueStatus_t *) pTlvHdr; + PRINTM(MEVENT, "WMM_STATUS: QSTATUS TLV: %d\n", + pTlvWmmQStatus->queue_index); + + PRINTM(MINFO, + "CMD_RESP: WMM_GET_STATUS: QSTATUS TLV: %d, %d, %d\n", + pTlvWmmQStatus->queue_index, + pTlvWmmQStatus->flow_required, + pTlvWmmQStatus->disabled); + + pac_status = + &priv->wmm.ac_status[pTlvWmmQStatus-> + queue_index]; + pac_status->disabled = pTlvWmmQStatus->disabled; + pac_status->flow_required = + pTlvWmmQStatus->flow_required; + pac_status->flow_created = pTlvWmmQStatus->flow_created; + break; + + case WMM_IE: + /* + * Point the regular IEEE IE 2 bytes into the Marvell IE + * and setup the IEEE IE type and length byte fields + */ + + PRINTM(MEVENT, "WMM STATUS: WMM IE\n"); + + HEXDUMP("WMM: WMM TLV:", (t_u8 *) pTlvHdr, tlv_len + 4); + + pWmmParamIe = + (IEEEtypes_WmmParameter_t *) (pcurrent + 2); + pWmmParamIe->vend_hdr.len = (t_u8) tlv_len; + pWmmParamIe->vend_hdr.element_id = WMM_IE; + + PRINTM(MINFO, + "CMD_RESP: WMM_GET_STATUS: WMM Parameter Set: %d\n", + pWmmParamIe->qos_info.para_set_count); + + memcpy(priv->adapter, + (t_u8 *) & priv->curr_bss_params.bss_descriptor. + wmm_ie, pWmmParamIe, + MIN(sizeof(IEEEtypes_WmmParameter_t), + (pWmmParamIe->vend_hdr.len + 2))); + sendWmmEvent = MTRUE; + break; + + case TLV_TYPE_IEEE_ACTION_FRAME: + PRINTM(MEVENT, "WMM_STATUS: IEEE Action Frame\n"); + pTlvAction = (MrvlIETypes_ActionFrame_t *) pcurrent; + + if (pTlvAction->actionFrame.wmmAc.tspecAct.category + == IEEE_MGMT_ACTION_CATEGORY_WMM_TSPEC) { + + switch (pTlvAction->actionFrame.wmmAc.tspecAct. + action) { + case TSPEC_ACTION_CODE_ADDTS_RSP: + pAddTsRsp = + &pTlvAction->actionFrame.wmmAc. + addTsRsp; + wlan_send_wmmac_host_event(priv, + "ADDTS_RSP", + pTlvAction-> + srcAddr, + pAddTsRsp-> + tspecIE. + TspecBody. + TSInfo.TID, + pAddTsRsp-> + tspecIE. + TspecBody. + TSInfo. + UserPri, + pAddTsRsp-> + statusCode); + break; + + case TSPEC_ACTION_CODE_DELTS: + pDelTs = &pTlvAction->actionFrame.wmmAc. + delTs; + wlan_send_wmmac_host_event(priv, + "DELTS_RX", + pTlvAction-> + srcAddr, + pDelTs-> + tspecIE. + TspecBody. + TSInfo.TID, + pDelTs-> + tspecIE. + TspecBody. + TSInfo. + UserPri, + pDelTs-> + reasonCode); + break; + + case TSPEC_ACTION_CODE_ADDTS_REQ: + default: + break; + } + } + break; + + default: + break; + } + + pcurrent += (tlv_len + sizeof(pTlvHdr->header)); + resp_len -= (tlv_len + sizeof(pTlvHdr->header)); + } + + wlan_wmm_setup_queue_priorities(priv, pWmmParamIe); + wlan_wmm_setup_ac_downgrade(priv); + + if (sendWmmEvent) { + wlan_recv_event(priv, MLAN_EVENT_ID_FW_WMM_CONFIG_CHANGE, + MNULL); + } + + LEAVE(); + return MLAN_STATUS_SUCCESS; } /** @@ -1868,59 +2028,61 @@ wlan_ret_wmm_get_status(pmlan_private priv, t_u8 * ptlv, int resp_len) */ t_u32 wlan_wmm_process_association_req(pmlan_private priv, - t_u8 ** ppAssocBuf, - IEEEtypes_WmmParameter_t * pWmmIE, - IEEEtypes_HTCap_t * pHTCap) + t_u8 ** ppAssocBuf, + IEEEtypes_WmmParameter_t * pWmmIE, + IEEEtypes_HTCap_t * pHTCap) { - MrvlIEtypes_WmmParamSet_t *pwmm_tlv; - t_u32 ret_len = 0; - - ENTER(); - - /* Null checks */ - if (!ppAssocBuf) { - LEAVE(); - return 0; - } - if (!(*ppAssocBuf)) { - LEAVE(); - return 0; - } - - if (!pWmmIE) { - LEAVE(); - return 0; - } - - PRINTM(MINFO, "WMM: process assoc req: bss->wmmIe=0x%x\n", - pWmmIE->vend_hdr.element_id); - - if ((priv->wmm_required - || (pHTCap && (pHTCap->ieee_hdr.element_id == HT_CAPABILITY) - && (priv->config_bands & BAND_GN || priv->config_bands & BAND_AN)) - ) - && pWmmIE->vend_hdr.element_id == WMM_IE) { - pwmm_tlv = (MrvlIEtypes_WmmParamSet_t *) * ppAssocBuf; - pwmm_tlv->header.type = (t_u16) wmm_info_ie[0]; - pwmm_tlv->header.type = wlan_cpu_to_le16(pwmm_tlv->header.type); - pwmm_tlv->header.len = (t_u16) wmm_info_ie[1]; - memcpy(priv->adapter, pwmm_tlv->wmm_ie, &wmm_info_ie[2], - pwmm_tlv->header.len); - if (pWmmIE->qos_info.qos_uapsd) - memcpy(priv->adapter, - (t_u8 *) (pwmm_tlv->wmm_ie + pwmm_tlv->header.len - - sizeof(priv->wmm_qosinfo)), &priv->wmm_qosinfo, - sizeof(priv->wmm_qosinfo)); - - ret_len = sizeof(pwmm_tlv->header) + pwmm_tlv->header.len; - pwmm_tlv->header.len = wlan_cpu_to_le16(pwmm_tlv->header.len); - - HEXDUMP("ASSOC_CMD: WMM IE", (t_u8 *) pwmm_tlv, ret_len); - *ppAssocBuf += ret_len; - } - - LEAVE(); - return ret_len; + MrvlIEtypes_WmmParamSet_t *pwmm_tlv; + t_u32 ret_len = 0; + + ENTER(); + + /* Null checks */ + if (!ppAssocBuf) { + LEAVE(); + return 0; + } + if (!(*ppAssocBuf)) { + LEAVE(); + return 0; + } + + if (!pWmmIE) { + LEAVE(); + return 0; + } + + PRINTM(MINFO, "WMM: process assoc req: bss->wmmIe=0x%x\n", + pWmmIE->vend_hdr.element_id); + + if ((priv->wmm_required + || (pHTCap && (pHTCap->ieee_hdr.element_id == HT_CAPABILITY) + && (priv->config_bands & BAND_GN + || priv->config_bands & BAND_AN)) + ) + && pWmmIE->vend_hdr.element_id == WMM_IE) { + pwmm_tlv = (MrvlIEtypes_WmmParamSet_t *) * ppAssocBuf; + pwmm_tlv->header.type = (t_u16) wmm_info_ie[0]; + pwmm_tlv->header.type = wlan_cpu_to_le16(pwmm_tlv->header.type); + pwmm_tlv->header.len = (t_u16) wmm_info_ie[1]; + memcpy(priv->adapter, pwmm_tlv->wmm_ie, &wmm_info_ie[2], + pwmm_tlv->header.len); + if (pWmmIE->qos_info.qos_uapsd) + memcpy(priv->adapter, + (t_u8 *) (pwmm_tlv->wmm_ie + + pwmm_tlv->header.len - + sizeof(priv->wmm_qosinfo)), + &priv->wmm_qosinfo, sizeof(priv->wmm_qosinfo)); + + ret_len = sizeof(pwmm_tlv->header) + pwmm_tlv->header.len; + pwmm_tlv->header.len = wlan_cpu_to_le16(pwmm_tlv->header.len); + + HEXDUMP("ASSOC_CMD: WMM IE", (t_u8 *) pwmm_tlv, ret_len); + *ppAssocBuf += ret_len; + } + + LEAVE(); + return ret_len; } #endif /* STA_SUPPORT */ @@ -1939,33 +2101,34 @@ wlan_wmm_process_association_req(pmlan_private priv, */ t_u8 wlan_wmm_compute_driver_packet_delay(pmlan_private priv, - const pmlan_buffer pmbuf) + const pmlan_buffer pmbuf) { - t_u8 ret_val = 0; - t_u32 out_ts_sec, out_ts_usec; - t_s32 queue_delay; + t_u8 ret_val = 0; + t_u32 out_ts_sec, out_ts_usec; + t_s32 queue_delay; - ENTER(); + ENTER(); - priv->adapter->callbacks.moal_get_system_time(priv->adapter->pmoal_handle, - &out_ts_sec, &out_ts_usec); + priv->adapter->callbacks.moal_get_system_time(priv->adapter-> + pmoal_handle, &out_ts_sec, + &out_ts_usec); - queue_delay = (t_s32) (out_ts_sec - pmbuf->in_ts_sec) * 1000; - queue_delay += (t_s32) (out_ts_usec - pmbuf->in_ts_usec) / 1000; + queue_delay = (t_s32) (out_ts_sec - pmbuf->in_ts_sec) * 1000; + queue_delay += (t_s32) (out_ts_usec - pmbuf->in_ts_usec) / 1000; - /* - * Queue delay is passed as a uint8 in units of 2ms (ms shifted - * by 1). Min value (other than 0) is therefore 2ms, max is 510ms. - * - * Pass max value if queue_delay is beyond the uint8 range - */ - ret_val = (t_u8) (MIN(queue_delay, priv->wmm.drv_pkt_delay_max) >> 1); + /* + * Queue delay is passed as a uint8 in units of 2ms (ms shifted + * by 1). Min value (other than 0) is therefore 2ms, max is 510ms. + * + * Pass max value if queue_delay is beyond the uint8 range + */ + ret_val = (t_u8) (MIN(queue_delay, priv->wmm.drv_pkt_delay_max) >> 1); - PRINTM(MINFO, "WMM: Pkt Delay: %d ms, %d ms sent to FW\n", - queue_delay, ret_val); + PRINTM(MINFO, "WMM: Pkt Delay: %d ms, %d ms sent to FW\n", + queue_delay, ret_val); - LEAVE(); - return ret_val; + LEAVE(); + return ret_val; } /** @@ -1978,20 +2141,20 @@ wlan_wmm_compute_driver_packet_delay(pmlan_private priv, void wlan_wmm_process_tx(pmlan_adapter pmadapter) { - ENTER(); + ENTER(); - do { - if (wlan_dequeue_tx_packet(pmadapter)) - break; - /* Check if busy */ - } while (!pmadapter->data_sent && !pmadapter->tx_lock_flag - && !wlan_wmm_lists_empty(pmadapter)); + do { + if (wlan_dequeue_tx_packet(pmadapter)) + break; + /* Check if busy */ + } while (!pmadapter->data_sent && !pmadapter->tx_lock_flag + && !wlan_wmm_lists_empty(pmadapter)); - LEAVE(); - return; + LEAVE(); + return; } -/** +/** * @brief select wmm queue * * @param pmpriv A pointer to mlan_private structure @@ -2002,22 +2165,22 @@ wlan_wmm_process_tx(pmlan_adapter pmadapter) t_u8 wlan_wmm_select_queue(mlan_private * pmpriv, t_u8 tid) { - pmlan_adapter pmadapter = pmpriv->adapter; - t_u8 i; - mlan_wmm_ac_e ac_down = - pmpriv->wmm. - ac_down_graded_vals[wlan_wmm_convert_tos_to_ac(pmadapter, tid)]; - - ENTER(); - - for (i = 0; i < 4; i++) { - if (pmpriv->wmm.queue_priority[i] == ac_down) { - LEAVE(); - return i; - } - } - LEAVE(); - return 0; + pmlan_adapter pmadapter = pmpriv->adapter; + t_u8 i; + mlan_wmm_ac_e ac_down = + pmpriv->wmm. + ac_down_graded_vals[wlan_wmm_convert_tos_to_ac(pmadapter, tid)]; + + ENTER(); + + for (i = 0; i < 4; i++) { + if (pmpriv->wmm.queue_priority[i] == ac_down) { + LEAVE(); + return i; + } + } + LEAVE(); + return 0; } #if defined(UAP_SUPPORT) @@ -2032,44 +2195,52 @@ wlan_wmm_select_queue(mlan_private * pmpriv, t_u8 tid) */ static INLINE t_u8 wlan_del_tx_pkts_in_ralist(pmlan_private priv, - mlan_list_head * ra_list_head, int tid) + mlan_list_head * ra_list_head, int tid) { - raListTbl *ra_list = MNULL; - pmlan_adapter pmadapter = priv->adapter; - pmlan_buffer pmbuf = MNULL; - t_u8 ret = MFALSE; - ENTER(); - ra_list = - (raListTbl *) util_peek_list(priv->adapter->pmoal_handle, ra_list_head, - MNULL, MNULL); - while (ra_list && ra_list != (raListTbl *) ra_list_head) { - if (ra_list->total_pkts && (ra_list->tx_pause || - (ra_list->total_pkts > RX_LOW_THRESHOLD))) { - if ((pmbuf = - (pmlan_buffer) util_dequeue_list(pmadapter->pmoal_handle, - &ra_list->buf_head, MNULL, - MNULL))) { - PRINTM(MDATA, - "Drop pkts: tid=%d tx_pause=%d pkts=%d brd_pkts=%d " - MACSTR "\n", tid, ra_list->tx_pause, ra_list->total_pkts, - pmadapter->pending_bridge_pkts, MAC2STR(ra_list->ra)); - wlan_write_data_complete(pmadapter, pmbuf, MLAN_STATUS_FAILURE); - priv->wmm.pkts_queued[tid]--; - priv->num_drop_pkts++; - ra_list->total_pkts--; - if (!ra_list->tx_pause) - util_scalar_decrement(pmadapter->pmoal_handle, - &priv->wmm.tx_pkts_queued, MNULL, - MNULL); - ret = MTRUE; - break; - } - } - ra_list = ra_list->pnext; - } - - LEAVE(); - return ret; + raListTbl *ra_list = MNULL; + pmlan_adapter pmadapter = priv->adapter; + pmlan_buffer pmbuf = MNULL; + t_u8 ret = MFALSE; + ENTER(); + ra_list = + (raListTbl *) util_peek_list(priv->adapter->pmoal_handle, + ra_list_head, MNULL, MNULL); + while (ra_list && ra_list != (raListTbl *) ra_list_head) { + if (ra_list->total_pkts && (ra_list->tx_pause || + (ra_list->total_pkts > + RX_LOW_THRESHOLD))) { + if ((pmbuf = + (pmlan_buffer) util_dequeue_list(pmadapter-> + pmoal_handle, + &ra_list-> + buf_head, MNULL, + MNULL))) { + PRINTM(MDATA, + "Drop pkts: tid=%d tx_pause=%d pkts=%d brd_pkts=%d " + MACSTR "\n", tid, ra_list->tx_pause, + ra_list->total_pkts, + pmadapter->pending_bridge_pkts, + MAC2STR(ra_list->ra)); + wlan_write_data_complete(pmadapter, pmbuf, + MLAN_STATUS_FAILURE); + priv->wmm.pkts_queued[tid]--; + priv->num_drop_pkts++; + ra_list->total_pkts--; + if (!ra_list->tx_pause) + util_scalar_decrement(pmadapter-> + pmoal_handle, + &priv->wmm. + tx_pkts_queued, + MNULL, MNULL); + ret = MTRUE; + break; + } + } + ra_list = ra_list->pnext; + } + + LEAVE(); + return ret; } /** @@ -2082,23 +2253,23 @@ wlan_del_tx_pkts_in_ralist(pmlan_private priv, t_void wlan_drop_tx_pkts(pmlan_private priv) { - int j; - static int i = 0; - pmlan_adapter pmadapter = priv->adapter; - pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - for (j = 0; j < MAX_NUM_TID; j++, i++) { - if (i == MAX_NUM_TID) - i = 0; - if (wlan_del_tx_pkts_in_ralist - (priv, &priv->wmm.tid_tbl_ptr[i].ra_list, i)) { - i++; - break; - } - } - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - return; + int j; + static int i = 0; + pmlan_adapter pmadapter = priv->adapter; + pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, + priv->wmm.ra_list_spinlock); + for (j = 0; j < MAX_NUM_TID; j++, i++) { + if (i == MAX_NUM_TID) + i = 0; + if (wlan_del_tx_pkts_in_ralist + (priv, &priv->wmm.tid_tbl_ptr[i].ra_list, i)) { + i++; + break; + } + } + pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, + priv->wmm.ra_list_spinlock); + return; } /** @@ -2112,48 +2283,50 @@ wlan_drop_tx_pkts(pmlan_private priv) t_void wlan_wmm_delete_peer_ralist(pmlan_private priv, t_u8 * mac) { - raListTbl *ra_list; - int i; - pmlan_adapter pmadapter = priv->adapter; - t_u32 pkt_cnt = 0; - t_u32 tx_pkts_queued = 0; - - ENTER(); - pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - for (i = 0; i < MAX_NUM_TID; ++i) { - ra_list = wlan_wmm_get_ralist_node(priv, i, mac); - if (ra_list) { - PRINTM(MINFO, "delete sta ralist %p\n", ra_list); - if (!ra_list->tx_pause) - pkt_cnt += ra_list->total_pkts; - wlan_wmm_del_pkts_in_ralist_node(priv, ra_list); - - util_unlink_list(pmadapter->pmoal_handle, - &priv->wmm.tid_tbl_ptr[i].ra_list, - (pmlan_linked_list) ra_list, MNULL, MNULL); - pmadapter->callbacks.moal_mfree(pmadapter->pmoal_handle, - (t_u8 *) ra_list); - if (priv->wmm.tid_tbl_ptr[i].ra_list_curr == ra_list) - priv->wmm.tid_tbl_ptr[i].ra_list_curr = - (raListTbl *) & priv->wmm.tid_tbl_ptr[i].ra_list; - } - } - if (pkt_cnt) { - tx_pkts_queued = util_scalar_read(pmadapter->pmoal_handle, - &priv->wmm.tx_pkts_queued, MNULL, - MNULL); - tx_pkts_queued -= pkt_cnt; - util_scalar_write(priv->adapter->pmoal_handle, - &priv->wmm.tx_pkts_queued, tx_pkts_queued, MNULL, - MNULL); - util_scalar_write(priv->adapter->pmoal_handle, - &priv->wmm.highest_queued_prio, HIGH_PRIO_TID, MNULL, - MNULL); - } - pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, - priv->wmm.ra_list_spinlock); - LEAVE(); + raListTbl *ra_list; + int i; + pmlan_adapter pmadapter = priv->adapter; + t_u32 pkt_cnt = 0; + t_u32 tx_pkts_queued = 0; + + ENTER(); + pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle, + priv->wmm.ra_list_spinlock); + for (i = 0; i < MAX_NUM_TID; ++i) { + ra_list = wlan_wmm_get_ralist_node(priv, i, mac); + if (ra_list) { + PRINTM(MINFO, "delete sta ralist %p\n", ra_list); + if (!ra_list->tx_pause) + pkt_cnt += ra_list->total_pkts; + wlan_wmm_del_pkts_in_ralist_node(priv, ra_list); + + util_unlink_list(pmadapter->pmoal_handle, + &priv->wmm.tid_tbl_ptr[i].ra_list, + (pmlan_linked_list) ra_list, MNULL, + MNULL); + pmadapter->callbacks.moal_mfree(pmadapter->pmoal_handle, + (t_u8 *) ra_list); + if (priv->wmm.tid_tbl_ptr[i].ra_list_curr == ra_list) + priv->wmm.tid_tbl_ptr[i].ra_list_curr = + (raListTbl *) & priv->wmm. + tid_tbl_ptr[i].ra_list; + } + } + if (pkt_cnt) { + tx_pkts_queued = util_scalar_read(pmadapter->pmoal_handle, + &priv->wmm.tx_pkts_queued, + MNULL, MNULL); + tx_pkts_queued -= pkt_cnt; + util_scalar_write(priv->adapter->pmoal_handle, + &priv->wmm.tx_pkts_queued, tx_pkts_queued, + MNULL, MNULL); + util_scalar_write(priv->adapter->pmoal_handle, + &priv->wmm.highest_queued_prio, HIGH_PRIO_TID, + MNULL, MNULL); + } + pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle, + priv->wmm.ra_list_spinlock); + LEAVE(); } #endif @@ -2169,30 +2342,30 @@ wlan_wmm_delete_peer_ralist(pmlan_private priv, t_u8 * mac) */ mlan_status wlan_cmd_wmm_addts_req(IN pmlan_private pmpriv, - OUT HostCmd_DS_COMMAND * cmd, IN t_void * pdata_buf) + OUT HostCmd_DS_COMMAND * cmd, IN t_void * pdata_buf) { - mlan_ds_wmm_addts *paddts = (mlan_ds_wmm_addts *) pdata_buf; - HostCmd_DS_WMM_ADDTS_REQ *pcmd_addts = &cmd->params.add_ts; + mlan_ds_wmm_addts *paddts = (mlan_ds_wmm_addts *) pdata_buf; + HostCmd_DS_WMM_ADDTS_REQ *pcmd_addts = &cmd->params.add_ts; - ENTER(); + ENTER(); - cmd->command = wlan_cpu_to_le16(HostCmd_CMD_WMM_ADDTS_REQ); - cmd->size = wlan_cpu_to_le16(sizeof(pcmd_addts->dialog_token) - + sizeof(pcmd_addts->timeout_ms) - + sizeof(pcmd_addts->command_result) - + sizeof(pcmd_addts->ieee_status_code) - + paddts->ie_data_len + S_DS_GEN); - cmd->result = 0; + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_WMM_ADDTS_REQ); + cmd->size = wlan_cpu_to_le16(sizeof(pcmd_addts->dialog_token) + + sizeof(pcmd_addts->timeout_ms) + + sizeof(pcmd_addts->command_result) + + sizeof(pcmd_addts->ieee_status_code) + + paddts->ie_data_len + S_DS_GEN); + cmd->result = 0; - pcmd_addts->timeout_ms = wlan_cpu_to_le32(paddts->timeout); - pcmd_addts->dialog_token = paddts->dialog_tok; - memcpy(pmpriv->adapter, - pcmd_addts->tspec_data, - paddts->ie_data, MIN(WMM_TSPEC_SIZE, paddts->ie_data_len)); + pcmd_addts->timeout_ms = wlan_cpu_to_le32(paddts->timeout); + pcmd_addts->dialog_token = paddts->dialog_tok; + memcpy(pmpriv->adapter, + pcmd_addts->tspec_data, + paddts->ie_data, MIN(WMM_TSPEC_SIZE, paddts->ie_data_len)); - LEAVE(); + LEAVE(); - return MLAN_STATUS_SUCCESS; + return MLAN_STATUS_SUCCESS; } /** @@ -2206,48 +2379,54 @@ wlan_cmd_wmm_addts_req(IN pmlan_private pmpriv, */ mlan_status wlan_ret_wmm_addts_req(IN pmlan_private pmpriv, - const IN HostCmd_DS_COMMAND * resp, - OUT mlan_ioctl_req * pioctl_buf) + const IN HostCmd_DS_COMMAND * resp, + OUT mlan_ioctl_req * pioctl_buf) { - mlan_ds_wmm_cfg *pwmm = MNULL; - mlan_ds_wmm_addts *paddts = MNULL; - const HostCmd_DS_WMM_ADDTS_REQ *presp_addts = &resp->params.add_ts; - - ENTER(); - - if (pioctl_buf) { - pwmm = (mlan_ds_wmm_cfg *) pioctl_buf->pbuf; - paddts = (mlan_ds_wmm_addts *) & pwmm->param.addts; - paddts->result = presp_addts->command_result; - paddts->dialog_tok = presp_addts->dialog_token; - paddts->status_code = (t_u32) presp_addts->ieee_status_code; - - if (presp_addts->command_result == MLAN_CMD_RESULT_SUCCESS) { - /* The tspecData field is potentially variable in size due to extra - IEs that may have been in the ADDTS response action frame. - Calculate the data length from the firmware command response. */ - paddts->ie_data_len - = (t_u8) (resp->size - sizeof(presp_addts->command_result) - - sizeof(presp_addts->timeout_ms) - - sizeof(presp_addts->dialog_token) - - sizeof(presp_addts->ieee_status_code) - - S_DS_GEN); - - /* Copy the TSPEC data include any extra IEs after the TSPEC */ - memcpy(pmpriv->adapter, - paddts->ie_data, - presp_addts->tspec_data, paddts->ie_data_len); - } else { - paddts->ie_data_len = 0; - } - PRINTM(MINFO, "TSPEC: ADDTS ret = %d,%d sz=%d\n", - paddts->result, paddts->status_code, paddts->ie_data_len); - - HEXDUMP("TSPEC: ADDTS data", paddts->ie_data, paddts->ie_data_len); - } - - LEAVE(); - return MLAN_STATUS_SUCCESS; + mlan_ds_wmm_cfg *pwmm = MNULL; + mlan_ds_wmm_addts *paddts = MNULL; + const HostCmd_DS_WMM_ADDTS_REQ *presp_addts = &resp->params.add_ts; + + ENTER(); + + if (pioctl_buf) { + pwmm = (mlan_ds_wmm_cfg *) pioctl_buf->pbuf; + paddts = (mlan_ds_wmm_addts *) & pwmm->param.addts; + paddts->result = presp_addts->command_result; + paddts->dialog_tok = presp_addts->dialog_token; + paddts->status_code = (t_u32) presp_addts->ieee_status_code; + + if (presp_addts->command_result == MLAN_CMD_RESULT_SUCCESS) { + /* The tspecData field is potentially variable in size + due to extra IEs that may have been in the ADDTS + response action frame. Calculate the data length + from the firmware command response. */ + paddts->ie_data_len + = (t_u8) (resp->size + - sizeof(presp_addts->command_result) + - sizeof(presp_addts->timeout_ms) + - sizeof(presp_addts->dialog_token) + - + sizeof(presp_addts->ieee_status_code) + - S_DS_GEN); + + /* Copy the TSPEC data include any extra IEs after the + TSPEC */ + memcpy(pmpriv->adapter, + paddts->ie_data, + presp_addts->tspec_data, paddts->ie_data_len); + } else { + paddts->ie_data_len = 0; + } + PRINTM(MINFO, "TSPEC: ADDTS ret = %d,%d sz=%d\n", + paddts->result, paddts->status_code, + paddts->ie_data_len); + + HEXDUMP("TSPEC: ADDTS data", + paddts->ie_data, paddts->ie_data_len); + } + + LEAVE(); + return MLAN_STATUS_SUCCESS; } /** @@ -2260,27 +2439,27 @@ wlan_ret_wmm_addts_req(IN pmlan_private pmpriv, */ mlan_status wlan_cmd_wmm_delts_req(IN pmlan_private pmpriv, - OUT HostCmd_DS_COMMAND * cmd, IN t_void * pdata_buf) + OUT HostCmd_DS_COMMAND * cmd, IN t_void * pdata_buf) { - mlan_ds_wmm_delts *pdelts = (mlan_ds_wmm_delts *) pdata_buf; - HostCmd_DS_WMM_DELTS_REQ *pcmd_delts = &cmd->params.del_ts; + mlan_ds_wmm_delts *pdelts = (mlan_ds_wmm_delts *) pdata_buf; + HostCmd_DS_WMM_DELTS_REQ *pcmd_delts = &cmd->params.del_ts; - ENTER(); + ENTER(); - cmd->command = wlan_cpu_to_le16(HostCmd_CMD_WMM_DELTS_REQ); - cmd->size = wlan_cpu_to_le16(sizeof(pcmd_delts->dialog_token) - + sizeof(pcmd_delts->command_result) - + sizeof(pcmd_delts->ieee_reason_code) - + pdelts->ie_data_len + S_DS_GEN); - cmd->result = 0; - pcmd_delts->ieee_reason_code = (t_u8) pdelts->status_code; - memcpy(pmpriv->adapter, - pcmd_delts->tspec_data, - pdelts->ie_data, MIN(WMM_TSPEC_SIZE, pdelts->ie_data_len)); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_WMM_DELTS_REQ); + cmd->size = wlan_cpu_to_le16(sizeof(pcmd_delts->dialog_token) + + sizeof(pcmd_delts->command_result) + + sizeof(pcmd_delts->ieee_reason_code) + + pdelts->ie_data_len + S_DS_GEN); + cmd->result = 0; + pcmd_delts->ieee_reason_code = (t_u8) pdelts->status_code; + memcpy(pmpriv->adapter, + pcmd_delts->tspec_data, + pdelts->ie_data, MIN(WMM_TSPEC_SIZE, pdelts->ie_data_len)); - LEAVE(); + LEAVE(); - return MLAN_STATUS_SUCCESS; + return MLAN_STATUS_SUCCESS; } /** @@ -2294,36 +2473,39 @@ wlan_cmd_wmm_delts_req(IN pmlan_private pmpriv, */ mlan_status wlan_ret_wmm_delts_req(IN pmlan_private pmpriv, - const IN HostCmd_DS_COMMAND * resp, - OUT mlan_ioctl_req * pioctl_buf) + const IN HostCmd_DS_COMMAND * resp, + OUT mlan_ioctl_req * pioctl_buf) { - mlan_ds_wmm_cfg *pwmm; - IEEEtypes_WMM_TSPEC_t *pTspecIE; - const HostCmd_DS_WMM_DELTS_REQ *presp_delts = &resp->params.del_ts; - - ENTER(); - - if (pioctl_buf) { - pwmm = (mlan_ds_wmm_cfg *) pioctl_buf->pbuf; - pwmm->param.delts.result = presp_delts->command_result; - - PRINTM(MINFO, "TSPEC: DELTS result = %d\n", - presp_delts->command_result); - - if (presp_delts->command_result == 0) { - pTspecIE = (IEEEtypes_WMM_TSPEC_t *) presp_delts->tspec_data; - wlan_send_wmmac_host_event(pmpriv, - "DELTS_TX", - MNULL, - pTspecIE->TspecBody.TSInfo.TID, - pTspecIE->TspecBody.TSInfo.UserPri, - presp_delts->ieee_reason_code); - - } - } - - LEAVE(); - return MLAN_STATUS_SUCCESS; + mlan_ds_wmm_cfg *pwmm; + IEEEtypes_WMM_TSPEC_t *pTspecIE; + const HostCmd_DS_WMM_DELTS_REQ *presp_delts = &resp->params.del_ts; + + ENTER(); + + if (pioctl_buf) { + pwmm = (mlan_ds_wmm_cfg *) pioctl_buf->pbuf; + pwmm->param.delts.result = presp_delts->command_result; + + PRINTM(MINFO, "TSPEC: DELTS result = %d\n", + presp_delts->command_result); + + if (presp_delts->command_result == 0) { + pTspecIE = + (IEEEtypes_WMM_TSPEC_t *) presp_delts-> + tspec_data; + wlan_send_wmmac_host_event(pmpriv, "DELTS_TX", MNULL, + pTspecIE->TspecBody.TSInfo. + TID, + pTspecIE->TspecBody.TSInfo. + UserPri, + presp_delts-> + ieee_reason_code); + + } + } + + LEAVE(); + return MLAN_STATUS_SUCCESS; } /** @@ -2336,35 +2518,37 @@ wlan_ret_wmm_delts_req(IN pmlan_private pmpriv, */ mlan_status wlan_cmd_wmm_queue_stats(IN pmlan_private pmpriv, - OUT HostCmd_DS_COMMAND * cmd, IN t_void * pdata_buf) + OUT HostCmd_DS_COMMAND * cmd, IN t_void * pdata_buf) { - mlan_ds_wmm_queue_stats *pqstats = (mlan_ds_wmm_queue_stats *) pdata_buf; - HostCmd_DS_WMM_QUEUE_STATS *pcmd_qstats = &cmd->params.queue_stats; - t_u8 id; - - ENTER(); - - cmd->command = wlan_cpu_to_le16(HostCmd_CMD_WMM_QUEUE_STATS); - cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_WMM_QUEUE_STATS) - + S_DS_GEN); - cmd->result = 0; - - pcmd_qstats->action = pqstats->action; - pcmd_qstats->select_is_userpri = 1; - pcmd_qstats->select_bin = pqstats->user_priority; - pcmd_qstats->pkt_count = wlan_cpu_to_le16(pqstats->pkt_count); - pcmd_qstats->pkt_loss = wlan_cpu_to_le16(pqstats->pkt_loss); - pcmd_qstats->avg_queue_delay = wlan_cpu_to_le32(pqstats->avg_queue_delay); - pcmd_qstats->avg_tx_delay = wlan_cpu_to_le32(pqstats->avg_tx_delay); - pcmd_qstats->used_time = wlan_cpu_to_le16(pqstats->used_time); - pcmd_qstats->policed_time = wlan_cpu_to_le16(pqstats->policed_time); - for (id = 0; id < MLAN_WMM_STATS_PKTS_HIST_BINS; id++) { - pcmd_qstats->delay_histogram[id] = - wlan_cpu_to_le16(pqstats->delay_histogram[id]); - } - - LEAVE(); - return MLAN_STATUS_SUCCESS; + mlan_ds_wmm_queue_stats *pqstats = + (mlan_ds_wmm_queue_stats *) pdata_buf; + HostCmd_DS_WMM_QUEUE_STATS *pcmd_qstats = &cmd->params.queue_stats; + t_u8 id; + + ENTER(); + + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_WMM_QUEUE_STATS); + cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_WMM_QUEUE_STATS) + + S_DS_GEN); + cmd->result = 0; + + pcmd_qstats->action = pqstats->action; + pcmd_qstats->select_is_userpri = 1; + pcmd_qstats->select_bin = pqstats->user_priority; + pcmd_qstats->pkt_count = wlan_cpu_to_le16(pqstats->pkt_count); + pcmd_qstats->pkt_loss = wlan_cpu_to_le16(pqstats->pkt_loss); + pcmd_qstats->avg_queue_delay = + wlan_cpu_to_le32(pqstats->avg_queue_delay); + pcmd_qstats->avg_tx_delay = wlan_cpu_to_le32(pqstats->avg_tx_delay); + pcmd_qstats->used_time = wlan_cpu_to_le16(pqstats->used_time); + pcmd_qstats->policed_time = wlan_cpu_to_le16(pqstats->policed_time); + for (id = 0; id < MLAN_WMM_STATS_PKTS_HIST_BINS; id++) { + pcmd_qstats->delay_histogram[id] = + wlan_cpu_to_le16(pqstats->delay_histogram[id]); + } + + LEAVE(); + return MLAN_STATUS_SUCCESS; } /** @@ -2378,37 +2562,41 @@ wlan_cmd_wmm_queue_stats(IN pmlan_private pmpriv, */ mlan_status wlan_ret_wmm_queue_stats(IN pmlan_private pmpriv, - const IN HostCmd_DS_COMMAND * resp, - OUT mlan_ioctl_req * pioctl_buf) + const IN HostCmd_DS_COMMAND * resp, + OUT mlan_ioctl_req * pioctl_buf) { - mlan_ds_wmm_cfg *pwmm = MNULL; - mlan_ds_wmm_queue_stats *pqstats = MNULL; - const HostCmd_DS_WMM_QUEUE_STATS *presp_qstats = &resp->params.queue_stats; - t_u8 id; - - ENTER(); - - if (pioctl_buf) { - pwmm = (mlan_ds_wmm_cfg *) pioctl_buf->pbuf; - pqstats = (mlan_ds_wmm_queue_stats *) & pwmm->param.q_stats; - - pqstats->action = presp_qstats->action; - pqstats->user_priority = presp_qstats->select_bin; - pqstats->pkt_count = wlan_le16_to_cpu(presp_qstats->pkt_count); - pqstats->pkt_loss = wlan_le16_to_cpu(presp_qstats->pkt_loss); - pqstats->avg_queue_delay - = wlan_le32_to_cpu(presp_qstats->avg_queue_delay); - pqstats->avg_tx_delay = wlan_le32_to_cpu(presp_qstats->avg_tx_delay); - pqstats->used_time = wlan_le16_to_cpu(presp_qstats->used_time); - pqstats->policed_time = wlan_le16_to_cpu(presp_qstats->policed_time); - for (id = 0; id < MLAN_WMM_STATS_PKTS_HIST_BINS; id++) { - pqstats->delay_histogram[id] - = wlan_le16_to_cpu(presp_qstats->delay_histogram[id]); - } - } - - LEAVE(); - return MLAN_STATUS_SUCCESS; + mlan_ds_wmm_cfg *pwmm = MNULL; + mlan_ds_wmm_queue_stats *pqstats = MNULL; + const HostCmd_DS_WMM_QUEUE_STATS *presp_qstats = + &resp->params.queue_stats; + t_u8 id; + + ENTER(); + + if (pioctl_buf) { + pwmm = (mlan_ds_wmm_cfg *) pioctl_buf->pbuf; + pqstats = (mlan_ds_wmm_queue_stats *) & pwmm->param.q_stats; + + pqstats->action = presp_qstats->action; + pqstats->user_priority = presp_qstats->select_bin; + pqstats->pkt_count = wlan_le16_to_cpu(presp_qstats->pkt_count); + pqstats->pkt_loss = wlan_le16_to_cpu(presp_qstats->pkt_loss); + pqstats->avg_queue_delay + = wlan_le32_to_cpu(presp_qstats->avg_queue_delay); + pqstats->avg_tx_delay + = wlan_le32_to_cpu(presp_qstats->avg_tx_delay); + pqstats->used_time = wlan_le16_to_cpu(presp_qstats->used_time); + pqstats->policed_time + = wlan_le16_to_cpu(presp_qstats->policed_time); + for (id = 0; id < MLAN_WMM_STATS_PKTS_HIST_BINS; id++) { + pqstats->delay_histogram[id] + = wlan_le16_to_cpu(presp_qstats-> + delay_histogram[id]); + } + } + + LEAVE(); + return MLAN_STATUS_SUCCESS; } /** @@ -2421,23 +2609,23 @@ wlan_ret_wmm_queue_stats(IN pmlan_private pmpriv, */ mlan_status wlan_cmd_wmm_ts_status(IN pmlan_private pmpriv, - OUT HostCmd_DS_COMMAND * cmd, IN t_void * pdata_buf) + OUT HostCmd_DS_COMMAND * cmd, IN t_void * pdata_buf) { - mlan_ds_wmm_ts_status *pts_status = (mlan_ds_wmm_ts_status *) pdata_buf; - HostCmd_DS_WMM_TS_STATUS *pcmd_ts_status = &cmd->params.ts_status; + mlan_ds_wmm_ts_status *pts_status = (mlan_ds_wmm_ts_status *) pdata_buf; + HostCmd_DS_WMM_TS_STATUS *pcmd_ts_status = &cmd->params.ts_status; - ENTER(); + ENTER(); - cmd->command = wlan_cpu_to_le16(HostCmd_CMD_WMM_TS_STATUS); - cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_WMM_TS_STATUS) - + S_DS_GEN); - cmd->result = 0; + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_WMM_TS_STATUS); + cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_WMM_TS_STATUS) + + S_DS_GEN); + cmd->result = 0; - memcpy(pmpriv->adapter, (t_void *) pcmd_ts_status, (t_void *) pts_status, - sizeof(HostCmd_DS_WMM_TS_STATUS)); + memcpy(pmpriv->adapter, (t_void *) pcmd_ts_status, + (t_void *) pts_status, sizeof(HostCmd_DS_WMM_TS_STATUS)); - LEAVE(); - return MLAN_STATUS_SUCCESS; + LEAVE(); + return MLAN_STATUS_SUCCESS; } /** @@ -2451,28 +2639,29 @@ wlan_cmd_wmm_ts_status(IN pmlan_private pmpriv, */ mlan_status wlan_ret_wmm_ts_status(IN pmlan_private pmpriv, - IN HostCmd_DS_COMMAND * resp, - OUT mlan_ioctl_req * pioctl_buf) + IN HostCmd_DS_COMMAND * resp, + OUT mlan_ioctl_req * pioctl_buf) { - mlan_ds_wmm_cfg *pwmm = MNULL; - HostCmd_DS_WMM_TS_STATUS *presp_ts_status = &resp->params.ts_status; - - ENTER(); - - if (pioctl_buf) { - pwmm = (mlan_ds_wmm_cfg *) pioctl_buf->pbuf; - presp_ts_status->medium_time - = wlan_le16_to_cpu(presp_ts_status->medium_time); - memcpy(pmpriv->adapter, - (t_void *) & pwmm->param.ts_status, - (t_void *) presp_ts_status, sizeof(mlan_ds_wmm_ts_status)); - } - - LEAVE(); - return MLAN_STATUS_SUCCESS; + mlan_ds_wmm_cfg *pwmm = MNULL; + HostCmd_DS_WMM_TS_STATUS *presp_ts_status = &resp->params.ts_status; + + ENTER(); + + if (pioctl_buf) { + pwmm = (mlan_ds_wmm_cfg *) pioctl_buf->pbuf; + presp_ts_status->medium_time + = wlan_le16_to_cpu(presp_ts_status->medium_time); + memcpy(pmpriv->adapter, + (t_void *) & pwmm->param.ts_status, + (t_void *) presp_ts_status, + sizeof(mlan_ds_wmm_ts_status)); + } + + LEAVE(); + return MLAN_STATUS_SUCCESS; } -/** +/** * @brief Set/Get WMM status * * @param pmadapter A pointer to mlan_adapter structure @@ -2483,21 +2672,21 @@ wlan_ret_wmm_ts_status(IN pmlan_private pmpriv, static mlan_status wlan_wmm_ioctl_enable(IN pmlan_adapter pmadapter, IN pmlan_ioctl_req pioctl_req) { - mlan_status ret = MLAN_STATUS_SUCCESS; - mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; - mlan_ds_wmm_cfg *wmm = MNULL; - ENTER(); - wmm = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; - if (pioctl_req->action == MLAN_ACT_GET) - wmm->param.wmm_enable = (t_u32) pmpriv->wmm_required; - else - pmpriv->wmm_required = (t_u8) wmm->param.wmm_enable; - pioctl_req->data_read_written = sizeof(t_u32) + MLAN_SUB_COMMAND_SIZE; - LEAVE(); - return ret; + mlan_status ret = MLAN_STATUS_SUCCESS; + mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_wmm_cfg *wmm = MNULL; + ENTER(); + wmm = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; + if (pioctl_req->action == MLAN_ACT_GET) + wmm->param.wmm_enable = (t_u32) pmpriv->wmm_required; + else + pmpriv->wmm_required = (t_u8) wmm->param.wmm_enable; + pioctl_req->data_read_written = sizeof(t_u32) + MLAN_SUB_COMMAND_SIZE; + LEAVE(); + return ret; } -/** +/** * @brief Set/Get WMM QoS configuration * * @param pmadapter A pointer to mlan_adapter structure @@ -2508,24 +2697,24 @@ wlan_wmm_ioctl_enable(IN pmlan_adapter pmadapter, IN pmlan_ioctl_req pioctl_req) static mlan_status wlan_wmm_ioctl_qos(IN pmlan_adapter pmadapter, IN pmlan_ioctl_req pioctl_req) { - mlan_status ret = MLAN_STATUS_SUCCESS; - mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; - mlan_ds_wmm_cfg *wmm = MNULL; + mlan_status ret = MLAN_STATUS_SUCCESS; + mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_wmm_cfg *wmm = MNULL; - ENTER(); + ENTER(); - wmm = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; + wmm = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; - if (pioctl_req->action == MLAN_ACT_GET) - wmm->param.qos_cfg = pmpriv->wmm_qosinfo; - else { - pmpriv->wmm_qosinfo = wmm->param.qos_cfg; - } + if (pioctl_req->action == MLAN_ACT_GET) + wmm->param.qos_cfg = pmpriv->wmm_qosinfo; + else { + pmpriv->wmm_qosinfo = wmm->param.qos_cfg; + } - pioctl_req->data_read_written = sizeof(t_u8) + MLAN_SUB_COMMAND_SIZE; + pioctl_req->data_read_written = sizeof(t_u8) + MLAN_SUB_COMMAND_SIZE; - LEAVE(); - return ret; + LEAVE(); + return ret; } /** @@ -2538,25 +2727,25 @@ wlan_wmm_ioctl_qos(IN pmlan_adapter pmadapter, IN pmlan_ioctl_req pioctl_req) */ static mlan_status wlan_wmm_ioctl_addts_req(IN pmlan_adapter pmadapter, - IN pmlan_ioctl_req pioctl_req) + IN pmlan_ioctl_req pioctl_req) { - mlan_status ret = MLAN_STATUS_SUCCESS; - pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; - mlan_ds_wmm_cfg *cfg = MNULL; + mlan_status ret = MLAN_STATUS_SUCCESS; + pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_wmm_cfg *cfg = MNULL; - ENTER(); - cfg = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; + ENTER(); + cfg = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; - /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WMM_ADDTS_REQ, - 0, 0, (t_void *) pioctl_req, - (t_void *) & cfg->param.addts); + /* Send request to firmware */ + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WMM_ADDTS_REQ, + 0, 0, (t_void *) pioctl_req, + (t_void *) & cfg->param.addts); - if (ret == MLAN_STATUS_SUCCESS) - ret = MLAN_STATUS_PENDING; + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; - LEAVE(); - return ret; + LEAVE(); + return ret; } /** @@ -2569,25 +2758,25 @@ wlan_wmm_ioctl_addts_req(IN pmlan_adapter pmadapter, */ static mlan_status wlan_wmm_ioctl_delts_req(IN pmlan_adapter pmadapter, - IN pmlan_ioctl_req pioctl_req) + IN pmlan_ioctl_req pioctl_req) { - mlan_status ret = MLAN_STATUS_SUCCESS; - pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; - mlan_ds_wmm_cfg *cfg = MNULL; + mlan_status ret = MLAN_STATUS_SUCCESS; + pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_wmm_cfg *cfg = MNULL; - ENTER(); - cfg = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; + ENTER(); + cfg = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; - /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WMM_DELTS_REQ, - 0, 0, (t_void *) pioctl_req, - (t_void *) & cfg->param.delts); + /* Send request to firmware */ + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WMM_DELTS_REQ, + 0, 0, (t_void *) pioctl_req, + (t_void *) & cfg->param.delts); - if (ret == MLAN_STATUS_SUCCESS) - ret = MLAN_STATUS_PENDING; + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; - LEAVE(); - return ret; + LEAVE(); + return ret; } /** @@ -2600,25 +2789,25 @@ wlan_wmm_ioctl_delts_req(IN pmlan_adapter pmadapter, */ static mlan_status wlan_wmm_ioctl_queue_stats(IN pmlan_adapter pmadapter, - IN pmlan_ioctl_req pioctl_req) + IN pmlan_ioctl_req pioctl_req) { - mlan_status ret = MLAN_STATUS_SUCCESS; - pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; - mlan_ds_wmm_cfg *cfg = MNULL; + mlan_status ret = MLAN_STATUS_SUCCESS; + pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_wmm_cfg *cfg = MNULL; - ENTER(); - cfg = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; + ENTER(); + cfg = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; - /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WMM_QUEUE_STATS, - 0, 0, (t_void *) pioctl_req, - (t_void *) & cfg->param.q_stats); + /* Send request to firmware */ + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WMM_QUEUE_STATS, + 0, 0, (t_void *) pioctl_req, + (t_void *) & cfg->param.q_stats); - if (ret == MLAN_STATUS_SUCCESS) - ret = MLAN_STATUS_PENDING; + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; - LEAVE(); - return ret; + LEAVE(); + return ret; } /** @@ -2631,34 +2820,36 @@ wlan_wmm_ioctl_queue_stats(IN pmlan_adapter pmadapter, */ static mlan_status wlan_wmm_ioctl_queue_status(IN pmlan_adapter pmadapter, - IN pmlan_ioctl_req pioctl_req) + IN pmlan_ioctl_req pioctl_req) { - mlan_status ret = MLAN_STATUS_SUCCESS; - pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; - mlan_ds_wmm_cfg *cfg = MNULL; - mlan_ds_wmm_queue_status *pqstatus = MNULL; - WmmAcStatus_t *pac_status = MNULL; - mlan_wmm_ac_e ac_idx; - - ENTER(); - - cfg = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; - pqstatus = (mlan_ds_wmm_queue_status *) & cfg->param.q_status; - - for (ac_idx = WMM_AC_BK; ac_idx <= WMM_AC_VO; ac_idx++) { - pac_status = &pmpriv->wmm.ac_status[ac_idx]; - - /* Firmware status */ - pqstatus->ac_status[ac_idx].flow_required = pac_status->flow_required; - pqstatus->ac_status[ac_idx].flow_created = pac_status->flow_created; - pqstatus->ac_status[ac_idx].disabled = pac_status->disabled; - - /* ACM bit reflected in firmware status (redundant) */ - pqstatus->ac_status[ac_idx].wmm_acm = pac_status->flow_required; - } - - LEAVE(); - return ret; + mlan_status ret = MLAN_STATUS_SUCCESS; + pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_wmm_cfg *cfg = MNULL; + mlan_ds_wmm_queue_status *pqstatus = MNULL; + WmmAcStatus_t *pac_status = MNULL; + mlan_wmm_ac_e ac_idx; + + ENTER(); + + cfg = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; + pqstatus = (mlan_ds_wmm_queue_status *) & cfg->param.q_status; + + for (ac_idx = WMM_AC_BK; ac_idx <= WMM_AC_VO; ac_idx++) { + pac_status = &pmpriv->wmm.ac_status[ac_idx]; + + /* Firmware status */ + pqstatus->ac_status[ac_idx].flow_required = + pac_status->flow_required; + pqstatus->ac_status[ac_idx].flow_created = + pac_status->flow_created; + pqstatus->ac_status[ac_idx].disabled = pac_status->disabled; + + /* ACM bit reflected in firmware status (redundant) */ + pqstatus->ac_status[ac_idx].wmm_acm = pac_status->flow_required; + } + + LEAVE(); + return ret; } /** @@ -2671,26 +2862,26 @@ wlan_wmm_ioctl_queue_status(IN pmlan_adapter pmadapter, */ static mlan_status wlan_wmm_ioctl_ts_status(IN pmlan_adapter pmadapter, - IN pmlan_ioctl_req pioctl_req) + IN pmlan_ioctl_req pioctl_req) { - mlan_status ret = MLAN_STATUS_SUCCESS; - pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; - mlan_ds_wmm_cfg *cfg = MNULL; + mlan_status ret = MLAN_STATUS_SUCCESS; + pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_wmm_cfg *cfg = MNULL; - ENTER(); + ENTER(); - cfg = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; + cfg = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; - /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WMM_TS_STATUS, - 0, 0, (t_void *) pioctl_req, - (t_void *) & cfg->param.ts_status); + /* Send request to firmware */ + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WMM_TS_STATUS, + 0, 0, (t_void *) pioctl_req, + (t_void *) & cfg->param.ts_status); - if (ret == MLAN_STATUS_SUCCESS) - ret = MLAN_STATUS_PENDING; + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; - LEAVE(); - return ret; + LEAVE(); + return ret; } #endif /* STA_SUPPORT */ @@ -2704,27 +2895,28 @@ wlan_wmm_ioctl_ts_status(IN pmlan_adapter pmadapter, */ mlan_status wlan_cmd_wmm_queue_config(IN pmlan_private pmpriv, - OUT HostCmd_DS_COMMAND * cmd, IN t_void * pdata_buf) + OUT HostCmd_DS_COMMAND * cmd, IN t_void * pdata_buf) { - mlan_ds_wmm_queue_config *pqcfg = (mlan_ds_wmm_queue_config *) pdata_buf; - HostCmd_DS_WMM_QUEUE_CONFIG *pcmd_qcfg = &cmd->params.queue_config; - - ENTER(); - - cmd->command = wlan_cpu_to_le16(HostCmd_CMD_WMM_QUEUE_CONFIG); - cmd->size = wlan_cpu_to_le16(sizeof(pcmd_qcfg->action) - + sizeof(pcmd_qcfg->access_category) - + sizeof(pcmd_qcfg->msdu_lifetime_expiry) - + S_DS_GEN); - cmd->result = 0; - - pcmd_qcfg->action = pqcfg->action; - pcmd_qcfg->access_category = pqcfg->access_category; - pcmd_qcfg->msdu_lifetime_expiry = - wlan_cpu_to_le16(pqcfg->msdu_lifetime_expiry); - - LEAVE(); - return MLAN_STATUS_SUCCESS; + mlan_ds_wmm_queue_config *pqcfg = + (mlan_ds_wmm_queue_config *) pdata_buf; + HostCmd_DS_WMM_QUEUE_CONFIG *pcmd_qcfg = &cmd->params.queue_config; + + ENTER(); + + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_WMM_QUEUE_CONFIG); + cmd->size = wlan_cpu_to_le16(sizeof(pcmd_qcfg->action) + + sizeof(pcmd_qcfg->access_category) + + sizeof(pcmd_qcfg->msdu_lifetime_expiry) + + S_DS_GEN); + cmd->result = 0; + + pcmd_qcfg->action = pqcfg->action; + pcmd_qcfg->access_category = pqcfg->access_category; + pcmd_qcfg->msdu_lifetime_expiry = + wlan_cpu_to_le16(pqcfg->msdu_lifetime_expiry); + + LEAVE(); + return MLAN_STATUS_SUCCESS; } /** @@ -2738,24 +2930,25 @@ wlan_cmd_wmm_queue_config(IN pmlan_private pmpriv, */ mlan_status wlan_ret_wmm_queue_config(IN pmlan_private pmpriv, - const IN HostCmd_DS_COMMAND * resp, - OUT mlan_ioctl_req * pioctl_buf) + const IN HostCmd_DS_COMMAND * resp, + OUT mlan_ioctl_req * pioctl_buf) { - mlan_ds_wmm_cfg *pwmm = MNULL; - const HostCmd_DS_WMM_QUEUE_CONFIG *presp_qcfg = &resp->params.queue_config; - - ENTER(); - - if (pioctl_buf) { - pwmm = (mlan_ds_wmm_cfg *) pioctl_buf->pbuf; - pwmm->param.q_cfg.action = presp_qcfg->action; - pwmm->param.q_cfg.access_category = presp_qcfg->access_category; - pwmm->param.q_cfg.msdu_lifetime_expiry = - wlan_le16_to_cpu(presp_qcfg->msdu_lifetime_expiry); - } - - LEAVE(); - return MLAN_STATUS_SUCCESS; + mlan_ds_wmm_cfg *pwmm = MNULL; + const HostCmd_DS_WMM_QUEUE_CONFIG *presp_qcfg = + &resp->params.queue_config; + + ENTER(); + + if (pioctl_buf) { + pwmm = (mlan_ds_wmm_cfg *) pioctl_buf->pbuf; + pwmm->param.q_cfg.action = presp_qcfg->action; + pwmm->param.q_cfg.access_category = presp_qcfg->access_category; + pwmm->param.q_cfg.msdu_lifetime_expiry = + wlan_le16_to_cpu(presp_qcfg->msdu_lifetime_expiry); + } + + LEAVE(); + return MLAN_STATUS_SUCCESS; } /** @@ -2768,28 +2961,28 @@ wlan_ret_wmm_queue_config(IN pmlan_private pmpriv, */ static mlan_status wlan_wmm_ioctl_queue_config(IN pmlan_adapter pmadapter, - IN pmlan_ioctl_req pioctl_req) + IN pmlan_ioctl_req pioctl_req) { - mlan_status ret = MLAN_STATUS_SUCCESS; - pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; - mlan_ds_wmm_cfg *cfg = MNULL; + mlan_status ret = MLAN_STATUS_SUCCESS; + pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_wmm_cfg *cfg = MNULL; - ENTER(); - cfg = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; + ENTER(); + cfg = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; - /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WMM_QUEUE_CONFIG, - 0, 0, (t_void *) pioctl_req, - (t_void *) & cfg->param.q_cfg); + /* Send request to firmware */ + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WMM_QUEUE_CONFIG, + 0, 0, (t_void *) pioctl_req, + (t_void *) & cfg->param.q_cfg); - if (ret == MLAN_STATUS_SUCCESS) - ret = MLAN_STATUS_PENDING; + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; - LEAVE(); - return ret; + LEAVE(); + return ret; } -/** +/** * @brief WMM configuration handler * * @param pmadapter A pointer to mlan_adapter structure @@ -2800,52 +2993,52 @@ wlan_wmm_ioctl_queue_config(IN pmlan_adapter pmadapter, mlan_status wlan_wmm_cfg_ioctl(IN pmlan_adapter pmadapter, IN pmlan_ioctl_req pioctl_req) { - mlan_status status = MLAN_STATUS_SUCCESS; - mlan_ds_wmm_cfg *wmm = MNULL; - - ENTER(); - - if (pioctl_req->buf_len < sizeof(mlan_ds_wmm_cfg)) { - PRINTM(MWARN, "MLAN bss IOCTL length is too short.\n"); - pioctl_req->data_read_written = 0; - pioctl_req->buf_len_needed = sizeof(mlan_ds_wmm_cfg); - pioctl_req->status_code = MLAN_ERROR_INVALID_PARAMETER; - LEAVE(); - return MLAN_STATUS_RESOURCE; - } - wmm = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; - switch (wmm->sub_command) { + mlan_status status = MLAN_STATUS_SUCCESS; + mlan_ds_wmm_cfg *wmm = MNULL; + + ENTER(); + + if (pioctl_req->buf_len < sizeof(mlan_ds_wmm_cfg)) { + PRINTM(MWARN, "MLAN bss IOCTL length is too short.\n"); + pioctl_req->data_read_written = 0; + pioctl_req->buf_len_needed = sizeof(mlan_ds_wmm_cfg); + pioctl_req->status_code = MLAN_ERROR_INVALID_PARAMETER; + LEAVE(); + return MLAN_STATUS_RESOURCE; + } + wmm = (mlan_ds_wmm_cfg *) pioctl_req->pbuf; + switch (wmm->sub_command) { #ifdef STA_SUPPORT - case MLAN_OID_WMM_CFG_ENABLE: - status = wlan_wmm_ioctl_enable(pmadapter, pioctl_req); - break; - case MLAN_OID_WMM_CFG_QOS: - status = wlan_wmm_ioctl_qos(pmadapter, pioctl_req); - break; - case MLAN_OID_WMM_CFG_ADDTS: - status = wlan_wmm_ioctl_addts_req(pmadapter, pioctl_req); - break; - case MLAN_OID_WMM_CFG_DELTS: - status = wlan_wmm_ioctl_delts_req(pmadapter, pioctl_req); - break; - case MLAN_OID_WMM_CFG_QUEUE_STATS: - status = wlan_wmm_ioctl_queue_stats(pmadapter, pioctl_req); - break; - case MLAN_OID_WMM_CFG_QUEUE_STATUS: - status = wlan_wmm_ioctl_queue_status(pmadapter, pioctl_req); - break; - case MLAN_OID_WMM_CFG_TS_STATUS: - status = wlan_wmm_ioctl_ts_status(pmadapter, pioctl_req); - break; + case MLAN_OID_WMM_CFG_ENABLE: + status = wlan_wmm_ioctl_enable(pmadapter, pioctl_req); + break; + case MLAN_OID_WMM_CFG_QOS: + status = wlan_wmm_ioctl_qos(pmadapter, pioctl_req); + break; + case MLAN_OID_WMM_CFG_ADDTS: + status = wlan_wmm_ioctl_addts_req(pmadapter, pioctl_req); + break; + case MLAN_OID_WMM_CFG_DELTS: + status = wlan_wmm_ioctl_delts_req(pmadapter, pioctl_req); + break; + case MLAN_OID_WMM_CFG_QUEUE_STATS: + status = wlan_wmm_ioctl_queue_stats(pmadapter, pioctl_req); + break; + case MLAN_OID_WMM_CFG_QUEUE_STATUS: + status = wlan_wmm_ioctl_queue_status(pmadapter, pioctl_req); + break; + case MLAN_OID_WMM_CFG_TS_STATUS: + status = wlan_wmm_ioctl_ts_status(pmadapter, pioctl_req); + break; #endif - case MLAN_OID_WMM_CFG_QUEUE_CONFIG: - status = wlan_wmm_ioctl_queue_config(pmadapter, pioctl_req); - break; - default: - pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID; - status = MLAN_STATUS_FAILURE; - break; - } - LEAVE(); - return status; + case MLAN_OID_WMM_CFG_QUEUE_CONFIG: + status = wlan_wmm_ioctl_queue_config(pmadapter, pioctl_req); + break; + default: + pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID; + status = MLAN_STATUS_FAILURE; + break; + } + LEAVE(); + return status; } |