Loading drivers/staging/rtl8192e/rtl819x_Qos.h +138 −107 Original line number Diff line number Diff line Loading @@ -73,8 +73,7 @@ union qos_tsinfo { union tspec_body { u8 charData[55]; struct { struct { union qos_tsinfo TSInfo; u16 NominalMSDUsize; u16 MaxMSDUsize; Loading Loading @@ -108,6 +107,7 @@ struct octet_string { u8 *Octet; u16 Length; }; #define MAX_WMMELE_LENGTH 64 #define QOS_MODE u32 Loading Loading @@ -143,28 +143,43 @@ enum ack_policy { }; #define SET_WMM_QOS_INFO_FIELD(_pStart, _val) WriteEF1Byte(_pStart, _val) #define SET_WMM_QOS_INFO_FIELD(_pStart, _val) \ WriteEF1Byte(_pStart, _val) #define GET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart) LE_BITS_TO_1BYTE(_pStart, 0, 4) #define SET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 0, 4, _val) #define GET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 0, 4) #define SET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 0, 4, _val) #define GET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart) LE_BITS_TO_1BYTE(_pStart, 7, 1) #define SET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 7, 1, _val) #define GET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 7, 1) #define SET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 7, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart) LE_BITS_TO_1BYTE(_pStart, 0, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 0, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 0, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 0, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart) LE_BITS_TO_1BYTE(_pStart, 1, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 1, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 1, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 1, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart) LE_BITS_TO_1BYTE(_pStart, 2, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 2, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 2, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 2, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart) LE_BITS_TO_1BYTE(_pStart, 3, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 3, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 3, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 3, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart) LE_BITS_TO_1BYTE(_pStart, 5, 2) #define SET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 5, 2, _val) #define GET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 5, 2) #define SET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 5, 2, _val) enum qos_ie_source { QOSIE_SRC_ADDTSREQ, Loading @@ -186,26 +201,40 @@ enum qos_ie_source { #define AC_PARAM_SIZE 4 #define GET_WMM_AC_PARAM_AIFSN(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 0, 4) ) #define SET_WMM_AC_PARAM_AIFSN(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 0, 4, _val) #define GET_WMM_AC_PARAM_AIFSN(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 0, 4)) #define SET_WMM_AC_PARAM_AIFSN(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 0, 4, _val) #define GET_WMM_AC_PARAM_ACM(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 4, 1) ) #define SET_WMM_AC_PARAM_ACM(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 4, 1, _val) #define GET_WMM_AC_PARAM_ACM(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 4, 1)) #define SET_WMM_AC_PARAM_ACM(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 4, 1, _val) #define GET_WMM_AC_PARAM_ACI(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 5, 2) ) #define SET_WMM_AC_PARAM_ACI(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 5, 2, _val) #define GET_WMM_AC_PARAM_ACI(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 5, 2)) #define SET_WMM_AC_PARAM_ACI(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 5, 2, _val) #define GET_WMM_AC_PARAM_ACI_AIFSN(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 0, 8) ) #define SET_WMM_AC_PARAM_ACI_AIFSN(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 0, 8, _val) #define GET_WMM_AC_PARAM_ACI_AIFSN(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 0, 8)) #define SET_WMM_AC_PARAM_ACI_AIFSN(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 0, 8, _val) #define GET_WMM_AC_PARAM_ECWMIN(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 8, 4) ) #define SET_WMM_AC_PARAM_ECWMIN(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 8, 4, _val) #define GET_WMM_AC_PARAM_ECWMIN(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 8, 4)) #define SET_WMM_AC_PARAM_ECWMIN(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 8, 4, _val) #define GET_WMM_AC_PARAM_ECWMAX(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 12, 4) ) #define SET_WMM_AC_PARAM_ECWMAX(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 12, 4, _val) #define GET_WMM_AC_PARAM_ECWMAX(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 12, 4)) #define SET_WMM_AC_PARAM_ECWMAX(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 12, 4, _val) #define GET_WMM_AC_PARAM_TXOP_LIMIT(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 16, 16) ) #define SET_WMM_AC_PARAM_TXOP_LIMIT(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 16, 16, _val) #define GET_WMM_AC_PARAM_TXOP_LIMIT(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 16, 16)) #define SET_WMM_AC_PARAM_TXOP_LIMIT(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 16, 16, _val) Loading Loading @@ -348,15 +377,20 @@ struct sta_qos { }; #define QBSS_LOAD_SIZE 5 #define GET_QBSS_LOAD_STA_COUNT(__pStart) ReadEF2Byte(__pStart) #define SET_QBSS_LOAD_STA_COUNT(__pStart, __Value) WriteEF2Byte(__pStart, __Value) #define GET_QBSS_LOAD_CHNL_UTILIZATION(__pStart) ReadEF1Byte((u8*)(__pStart) + 2) #define SET_QBSS_LOAD_CHNL_UTILIZATION(__pStart, __Value) WriteEF1Byte((u8*)(__pStart) + 2, __Value) #define GET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart) ReadEF2Byte((u8*)(__pStart) + 3) #define SET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart, __Value) WriteEF2Byte((u8*)(__pStart) + 3, __Value) #define GET_QBSS_LOAD_STA_COUNT(__pStart) \ ReadEF2Byte(__pStart) #define SET_QBSS_LOAD_STA_COUNT(__pStart, __Value) \ WriteEF2Byte(__pStart, __Value) #define GET_QBSS_LOAD_CHNL_UTILIZATION(__pStart) \ ReadEF1Byte((u8 *)(__pStart) + 2) #define SET_QBSS_LOAD_CHNL_UTILIZATION(__pStart, __Value) \ WriteEF1Byte((u8 *)(__pStart) + 2, __Value) #define GET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart) \ ReadEF2Byte((u8 *)(__pStart) + 3) #define SET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart, __Value) \ WriteEF2Byte((u8 *)(__pStart) + 3, __Value) struct bss_qos { QOS_MODE bdQoSMode; u8 bdWMMIEBuf[MAX_WMMELE_LENGTH]; struct octet_string bdWMMIE; Loading @@ -380,8 +414,7 @@ struct bss_qos { union aci_aifsn { u8 charData; struct { struct { u8 AIFSN:4; u8 acm:1; u8 ACI:2; Loading @@ -391,8 +424,7 @@ union aci_aifsn { union ecw { u8 charData; struct { struct { u8 ECWmin:4; u8 ECWmax:4; } f; Loading @@ -402,8 +434,7 @@ union ac_param { u32 longData; u8 charData[4]; struct { struct { union aci_aifsn AciAifsn; union ecw Ecw; u16 TXOPLimit; Loading drivers/staging/rtl8192e/rtl819x_TS.h +2 −0 Original line number Diff line number Diff line Loading @@ -67,5 +67,7 @@ struct rx_ts_record { u8 num; }; void _setup_timer(struct timer_list *, void *, unsigned long); #endif drivers/staging/rtl8192e/rtl819x_TSProc.c +172 −201 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ #include "rtllib.h" #include <linux/etherdevice.h> #include "rtl819x_TS.h" extern void _setup_timer( struct timer_list*, void*, unsigned long); void TsSetupTimeOut(unsigned long data) { Loading @@ -32,7 +31,8 @@ void TsInactTimeout(unsigned long data) void RxPktPendingTimeout(unsigned long data) { struct rx_ts_record *pRxTs = (struct rx_ts_record *)data; struct rtllib_device *ieee = container_of(pRxTs, struct rtllib_device, RxTsRecord[pRxTs->num]); struct rtllib_device *ieee = container_of(pRxTs, struct rtllib_device, RxTsRecord[pRxTs->num]); struct rx_reorder_entry *pReorderEntry = NULL; Loading @@ -42,30 +42,33 @@ void RxPktPendingTimeout(unsigned long data) bool bPktInBuf = false; spin_lock_irqsave(&(ieee->reorder_spinlock), flags); if (pRxTs->RxTimeoutIndicateSeq != 0xffff) { while(!list_empty(&pRxTs->RxPendingPktList)) { pReorderEntry = (struct rx_reorder_entry *)list_entry(pRxTs->RxPendingPktList.prev,struct rx_reorder_entry,List); if (pRxTs->RxTimeoutIndicateSeq != 0xffff) { while (!list_empty(&pRxTs->RxPendingPktList)) { pReorderEntry = (struct rx_reorder_entry *) list_entry(pRxTs->RxPendingPktList.prev, struct rx_reorder_entry, List); if (index == 0) pRxTs->RxIndicateSeq = pReorderEntry->SeqNum; if (SN_LESS(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq) || SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq) ) { SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq)) { list_del_init(&pReorderEntry->List); if (SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq)) pRxTs->RxIndicateSeq = (pRxTs->RxIndicateSeq + 1) % 4096; if (SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq)) pRxTs->RxIndicateSeq = (pRxTs->RxIndicateSeq + 1) % 4096; RTLLIB_DEBUG(RTLLIB_DL_REORDER,"%s(): Indicate SeqNum: %d\n",__func__, pReorderEntry->SeqNum); stats_IndicateArray[index] = pReorderEntry->prxb; RTLLIB_DEBUG(RTLLIB_DL_REORDER, "%s(): Indicate" " SeqNum: %d\n", __func__, pReorderEntry->SeqNum); stats_IndicateArray[index] = pReorderEntry->prxb; index++; list_add_tail(&pReorderEntry->List, &ieee->RxReorder_Unused_List); } else { list_add_tail(&pReorderEntry->List, &ieee->RxReorder_Unused_List); } else { bPktInBuf = true; break; } Loading @@ -76,8 +79,10 @@ void RxPktPendingTimeout(unsigned long data) pRxTs->RxTimeoutIndicateSeq = 0xffff; if (index > REORDER_WIN_SIZE) { RTLLIB_DEBUG(RTLLIB_DL_ERR, "RxReorderIndicatePacket(): Rx Reorer struct buffer full!! \n"); spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags); RTLLIB_DEBUG(RTLLIB_DL_ERR, "RxReorderIndicatePacket():" " Rx Reorer struct buffer full!!\n"); spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags); return; } rtllib_indicate_packets(ieee, stats_IndicateArray, index); Loading @@ -86,7 +91,8 @@ void RxPktPendingTimeout(unsigned long data) if (bPktInBuf && (pRxTs->RxTimeoutIndicateSeq == 0xffff)) { pRxTs->RxTimeoutIndicateSeq = pRxTs->RxIndicateSeq; mod_timer(&pRxTs->RxPktPendingTimer, jiffies + MSECS(ieee->pHTInfo->RxReorderPendingTime)); mod_timer(&pRxTs->RxPktPendingTimer, jiffies + MSECS(ieee->pHTInfo->RxReorderPendingTime)); } spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags); } Loading @@ -95,13 +101,14 @@ void TsAddBaProcess(unsigned long data) { struct tx_ts_record *pTxTs = (struct tx_ts_record *)data; u8 num = pTxTs->num; struct rtllib_device *ieee = container_of(pTxTs, struct rtllib_device, TxTsRecord[num]); struct rtllib_device *ieee = container_of(pTxTs, struct rtllib_device, TxTsRecord[num]); TsInitAddBA(ieee, pTxTs, BA_POLICY_IMMEDIATE, false); RTLLIB_DEBUG(RTLLIB_DL_BA, "TsAddBaProcess(): ADDBA Req is started!! \n"); RTLLIB_DEBUG(RTLLIB_DL_BA, "TsAddBaProcess(): ADDBA Req is " "started!!\n"); } void ResetTsCommonInfo(struct ts_common_info *pTsCommonInfo) { memset(pTsCommonInfo->Addr, 0, 6); Loading Loading @@ -142,8 +149,7 @@ void TSInitialize(struct rtllib_device *ieee) INIT_LIST_HEAD(&ieee->Tx_TS_Pending_List); INIT_LIST_HEAD(&ieee->Tx_TS_Unused_List); for (count = 0; count < TOTAL_TS_NUM; count++) { for (count = 0; count < TOTAL_TS_NUM; count++) { pTxTS->num = count; _setup_timer(&pTxTS->TsCommonInfo.SetupTimer, TsSetupTimeOut, Loading Loading @@ -173,8 +179,7 @@ void TSInitialize(struct rtllib_device *ieee) INIT_LIST_HEAD(&ieee->Rx_TS_Admit_List); INIT_LIST_HEAD(&ieee->Rx_TS_Pending_List); INIT_LIST_HEAD(&ieee->Rx_TS_Unused_List); for (count = 0; count < TOTAL_TS_NUM; count++) { for (count = 0; count < TOTAL_TS_NUM; count++) { pRxTS->num = count; INIT_LIST_HEAD(&pRxTS->RxPendingPktList); Loading @@ -195,13 +200,14 @@ void TSInitialize(struct rtllib_device *ieee) (unsigned long) pRxTS); ResetRxTsEntry(pRxTS); list_add_tail(&pRxTS->TsCommonInfo.List, &ieee->Rx_TS_Unused_List); list_add_tail(&pRxTS->TsCommonInfo.List, &ieee->Rx_TS_Unused_List); pRxTS++; } INIT_LIST_HEAD(&ieee->RxReorder_Unused_List); for (count = 0; count < REORDER_ENTRY_NUM; count++) { list_add_tail( &pRxReorderEntry->List,&ieee->RxReorder_Unused_List); for (count = 0; count < REORDER_ENTRY_NUM; count++) { list_add_tail(&pRxReorderEntry->List, &ieee->RxReorder_Unused_List); if (count == (REORDER_ENTRY_NUM-1)) break; pRxReorderEntry = &ieee->RxReorderEntry[count+1]; Loading @@ -209,52 +215,43 @@ void TSInitialize(struct rtllib_device *ieee) } void AdmitTS(struct rtllib_device *ieee, struct ts_common_info *pTsCommonInfo, u32 InactTime) void AdmitTS(struct rtllib_device *ieee, struct ts_common_info *pTsCommonInfo, u32 InactTime) { del_timer_sync(&pTsCommonInfo->SetupTimer); del_timer_sync(&pTsCommonInfo->InactTimer); if (InactTime != 0) mod_timer(&pTsCommonInfo->InactTimer, jiffies + MSECS(InactTime)); mod_timer(&pTsCommonInfo->InactTimer, jiffies + MSECS(InactTime)); } struct ts_common_info *SearchAdmitTRStream(struct rtllib_device *ieee, u8* Addr, u8 TID, enum tr_select TxRxSelect) struct ts_common_info *SearchAdmitTRStream(struct rtllib_device *ieee, u8 *Addr, u8 TID, enum tr_select TxRxSelect) { u8 dir; bool search_dir[4] = {0, 0, 0, 0}; struct list_head *psearch_list; struct ts_common_info *pRet = NULL; if (ieee->iw_mode == IW_MODE_MASTER) { if (TxRxSelect == TX_DIR) { if (ieee->iw_mode == IW_MODE_MASTER) { if (TxRxSelect == TX_DIR) { search_dir[DIR_DOWN] = true; search_dir[DIR_BI_DIR] = true; } else { } else { search_dir[DIR_UP] = true; search_dir[DIR_BI_DIR] = true; } } else if (ieee->iw_mode == IW_MODE_ADHOC) { } else if (ieee->iw_mode == IW_MODE_ADHOC) { if (TxRxSelect == TX_DIR) search_dir[DIR_UP] = true; else search_dir[DIR_DOWN] = true; } else { if (TxRxSelect == TX_DIR) { } else { if (TxRxSelect == TX_DIR) { search_dir[DIR_UP] = true; search_dir[DIR_BI_DIR] = true; search_dir[DIR_DIRECT] = true; } else { } else { search_dir[DIR_DOWN] = true; search_dir[DIR_BI_DIR] = true; search_dir[DIR_DIRECT] = true; Loading @@ -266,38 +263,29 @@ struct ts_common_info *SearchAdmitTRStream(struct rtllib_device *ieee, u8* Addr, else psearch_list = &ieee->Rx_TS_Admit_List; for (dir = 0; dir <= DIR_BI_DIR; dir++) { for (dir = 0; dir <= DIR_BI_DIR; dir++) { if (search_dir[dir] == false) continue; list_for_each_entry(pRet, psearch_list, List) { if (memcmp(pRet->Addr, Addr, 6) == 0) if (pRet->TSpec.f.TSInfo.field.ucTSID == TID) if (pRet->TSpec.f.TSInfo.field.ucDirection == dir) { break; } } if (&pRet->List != psearch_list) break; } if (&pRet->List != psearch_list){ if (&pRet->List != psearch_list) return pRet ; } else return NULL; } void MakeTSEntry( struct ts_common_info *pTsCommonInfo, u8* Addr, union tspec_body *pTSPEC, union qos_tclas *pTCLAS, u8 TCLAS_Num, u8 TCLAS_Proc ) void MakeTSEntry(struct ts_common_info *pTsCommonInfo, u8 *Addr, union tspec_body *pTSPEC, union qos_tclas *pTCLAS, u8 TCLAS_Num, u8 TCLAS_Proc) { u8 count; Loading @@ -307,34 +295,32 @@ void MakeTSEntry( memcpy(pTsCommonInfo->Addr, Addr, 6); if (pTSPEC != NULL) memcpy((u8*)(&(pTsCommonInfo->TSpec)), (u8*)pTSPEC, sizeof(union tspec_body)); memcpy((u8 *)(&(pTsCommonInfo->TSpec)), (u8 *)pTSPEC, sizeof(union tspec_body)); for (count = 0; count < TCLAS_Num; count++) memcpy((u8*)(&(pTsCommonInfo->TClass[count])), (u8*)pTCLAS, sizeof(union qos_tclas)); memcpy((u8 *)(&(pTsCommonInfo->TClass[count])), (u8 *)pTCLAS, sizeof(union qos_tclas)); pTsCommonInfo->TClasProc = TCLAS_Proc; pTsCommonInfo->TClasNum = TCLAS_Num; } bool GetTs( struct rtllib_device* ieee, struct ts_common_info **ppTS, u8* Addr, u8 TID, enum tr_select TxRxSelect, bool bAddNewTs) bool GetTs(struct rtllib_device *ieee, struct ts_common_info **ppTS, u8 *Addr, u8 TID, enum tr_select TxRxSelect, bool bAddNewTs) { u8 UP = 0; if (is_broadcast_ether_addr(Addr) || is_multicast_ether_addr(Addr)) { RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR! get TS for Broadcast or Multicast\n"); if (is_broadcast_ether_addr(Addr) || is_multicast_ether_addr(Addr)) { RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR! get TS for Broadcast or " "Multicast\n"); return false; } if (ieee->current_network.qos_data.supported == 0) { UP = 0; } else { if (!IsACValid(TID)) { RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR! in %s(), TID(%d) is not valid\n", __func__, TID); RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR! in %s(), TID(%d) is " "not valid\n", __func__, TID); return false; } Loading @@ -358,24 +344,15 @@ bool GetTs( } } *ppTS = SearchAdmitTRStream( ieee, Addr, UP, TxRxSelect); if (*ppTS != NULL) { *ppTS = SearchAdmitTRStream(ieee, Addr, UP, TxRxSelect); if (*ppTS != NULL) { return true; } else { if (bAddNewTs == false) { RTLLIB_DEBUG(RTLLIB_DL_TS, "add new TS failed(tid:%d)\n", UP); } else { if (bAddNewTs == false) { RTLLIB_DEBUG(RTLLIB_DL_TS, "add new TS failed" "(tid:%d)\n", UP); return false; } else { } else { union tspec_body TSpec; union qos_tsinfo *pTSInfo = &TSpec.f.TSInfo; struct list_head *pUnusedList = Loading @@ -388,25 +365,33 @@ bool GetTs( (&ieee->Tx_TS_Admit_List) : (&ieee->Rx_TS_Admit_List); enum direction_value Dir = (ieee->iw_mode == IW_MODE_MASTER)? enum direction_value Dir = (ieee->iw_mode == IW_MODE_MASTER) ? ((TxRxSelect == TX_DIR) ? DIR_DOWN : DIR_UP) : ((TxRxSelect == TX_DIR) ? DIR_UP : DIR_DOWN); RTLLIB_DEBUG(RTLLIB_DL_TS, "to add Ts\n"); if (!list_empty(pUnusedList)) { (*ppTS) = list_entry(pUnusedList->next, struct ts_common_info, List); if (!list_empty(pUnusedList)) { (*ppTS) = list_entry(pUnusedList->next, struct ts_common_info, List); list_del_init(&(*ppTS)->List); if (TxRxSelect==TX_DIR) { struct tx_ts_record *tmp = container_of(*ppTS, struct tx_ts_record, TsCommonInfo); if (TxRxSelect == TX_DIR) { struct tx_ts_record *tmp = container_of(*ppTS, struct tx_ts_record, TsCommonInfo); ResetTxTsEntry(tmp); } else{ struct rx_ts_record *tmp = container_of(*ppTS, struct rx_ts_record, TsCommonInfo); } else { struct rx_ts_record *tmp = container_of(*ppTS, struct rx_ts_record, TsCommonInfo); ResetRxTsEntry(tmp); } RTLLIB_DEBUG(RTLLIB_DL_TS, "to init current TS, UP:%d, Dir:%d, addr:"MAC_FMT" ppTs=%p\n", UP, Dir, MAC_ARG(Addr), *ppTS); RTLLIB_DEBUG(RTLLIB_DL_TS, "to init current TS" ", UP:%d, Dir:%d, addr:"MAC_FMT " ppTs=%p\n", UP, Dir, MAC_ARG(Addr), *ppTS); pTSInfo->field.ucTrafficType = 0; pTSInfo->field.ucTSID = UP; pTSInfo->field.ucDirection = Dir; Loading @@ -422,28 +407,25 @@ bool GetTs( list_add_tail(&((*ppTS)->List), pAddmitList); return true; } else { RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR!!in function %s() There is not enough dir=%d(0=up down=1) TS record to be used!!", __func__,Dir); } else { RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR!!in function " "%s() There is not enough dir=%d" "(0=up down=1) TS record to be " "used!!", __func__, Dir); return false; } } } } void RemoveTsEntry( struct rtllib_device* ieee, struct ts_common_info *pTs, enum tr_select TxRxSelect ) void RemoveTsEntry(struct rtllib_device *ieee, struct ts_common_info *pTs, enum tr_select TxRxSelect) { del_timer_sync(&pTs->SetupTimer); del_timer_sync(&pTs->InactTimer); TsInitDelBA(ieee, pTs, TxRxSelect); if (TxRxSelect == RX_DIR) { if (TxRxSelect == RX_DIR) { struct rx_reorder_entry *pRxReorderEntry; struct rx_ts_record *pRxTS = (struct rx_ts_record *)pTs; Loading @@ -451,25 +433,27 @@ void RemoveTsEntry( del_timer_sync(&pRxTS->RxPktPendingTimer); while (!list_empty(&pRxTS->RxPendingPktList)) { pRxReorderEntry = (struct rx_reorder_entry *)list_entry(pRxTS->RxPendingPktList.prev,struct rx_reorder_entry,List); RTLLIB_DEBUG(RTLLIB_DL_REORDER,"%s(): Delete SeqNum %d!\n",__func__, pRxReorderEntry->SeqNum); pRxReorderEntry = (struct rx_reorder_entry *) list_entry(pRxTS->RxPendingPktList.prev, struct rx_reorder_entry, List); RTLLIB_DEBUG(RTLLIB_DL_REORDER, "%s(): Delete SeqNum " "%d!\n", __func__, pRxReorderEntry->SeqNum); list_del_init(&pRxReorderEntry->List); { int i = 0; struct rtllib_rxb *prxb = pRxReorderEntry->prxb; if (unlikely(!prxb)){ if (unlikely(!prxb)) return; } for (i =0; i < prxb->nr_subframes; i++) { for (i = 0; i < prxb->nr_subframes; i++) dev_kfree_skb(prxb->subframes[i]); } kfree(prxb); prxb = NULL; } list_add_tail(&pRxReorderEntry->List,&ieee->RxReorder_Unused_List); list_add_tail(&pRxReorderEntry->List, &ieee->RxReorder_Unused_List); } } else{ } else { struct tx_ts_record *pTxTS = (struct tx_ts_record *)pTs; del_timer_sync(&pTxTS->TsAddBaTimer); } Loading @@ -478,43 +462,35 @@ void RemoveTsEntry( void RemovePeerTS(struct rtllib_device *ieee, u8 *Addr) { struct ts_common_info *pTS, *pTmpTS; printk("===========>RemovePeerTS,"MAC_FMT"\n", MAC_ARG(Addr)); printk(KERN_INFO "===========>RemovePeerTS,"MAC_FMT"\n", MAC_ARG(Addr)); list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { RemoveTsEntry(ieee, pTS, TX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List); } } list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { printk("====>remove Tx_TS_admin_list\n"); list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { printk(KERN_INFO "====>remove Tx_TS_admin_list\n"); RemoveTsEntry(ieee, pTS, TX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List); } } list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { RemoveTsEntry(ieee, pTS, RX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List); } } list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { RemoveTsEntry(ieee, pTS, RX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List); Loading @@ -526,29 +502,25 @@ void RemoveAllTS(struct rtllib_device* ieee) { struct ts_common_info *pTS, *pTmpTS; list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List) { RemoveTsEntry(ieee, pTS, TX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List); } list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List) { RemoveTsEntry(ieee, pTS, TX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List); } list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List) { RemoveTsEntry(ieee, pTS, RX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List); } list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List) { RemoveTsEntry(ieee, pTS, RX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List); Loading @@ -557,21 +529,20 @@ void RemoveAllTS(struct rtllib_device* ieee) void TsStartAddBaProcess(struct rtllib_device *ieee, struct tx_ts_record *pTxTS) { if (pTxTS->bAddBaReqInProgress == false) { if (pTxTS->bAddBaReqInProgress == false) { pTxTS->bAddBaReqInProgress = true; if (pTxTS->bAddBaReqDelayed) { RTLLIB_DEBUG(RTLLIB_DL_BA, "TsStartAddBaProcess(): Delayed Start ADDBA after 60 sec!!\n"); mod_timer(&pTxTS->TsAddBaTimer, jiffies + MSECS(TS_ADDBA_DELAY)); } else { RTLLIB_DEBUG(RTLLIB_DL_BA,"TsStartAddBaProcess(): Immediately Start ADDBA now!!\n"); if (pTxTS->bAddBaReqDelayed) { RTLLIB_DEBUG(RTLLIB_DL_BA, "TsStartAddBaProcess(): " "Delayed Start ADDBA after 60 sec!!\n"); mod_timer(&pTxTS->TsAddBaTimer, jiffies + MSECS(TS_ADDBA_DELAY)); } else { RTLLIB_DEBUG(RTLLIB_DL_BA, "TsStartAddBaProcess(): " "Immediately Start ADDBA now!!\n"); mod_timer(&pTxTS->TsAddBaTimer, jiffies+10); } } else RTLLIB_DEBUG(RTLLIB_DL_BA, "%s()==>BA timer is already added\n", __func__); } else RTLLIB_DEBUG(RTLLIB_DL_BA, "%s()==>BA timer is already added\n", __func__); } Loading
drivers/staging/rtl8192e/rtl819x_Qos.h +138 −107 Original line number Diff line number Diff line Loading @@ -73,8 +73,7 @@ union qos_tsinfo { union tspec_body { u8 charData[55]; struct { struct { union qos_tsinfo TSInfo; u16 NominalMSDUsize; u16 MaxMSDUsize; Loading Loading @@ -108,6 +107,7 @@ struct octet_string { u8 *Octet; u16 Length; }; #define MAX_WMMELE_LENGTH 64 #define QOS_MODE u32 Loading Loading @@ -143,28 +143,43 @@ enum ack_policy { }; #define SET_WMM_QOS_INFO_FIELD(_pStart, _val) WriteEF1Byte(_pStart, _val) #define SET_WMM_QOS_INFO_FIELD(_pStart, _val) \ WriteEF1Byte(_pStart, _val) #define GET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart) LE_BITS_TO_1BYTE(_pStart, 0, 4) #define SET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 0, 4, _val) #define GET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 0, 4) #define SET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 0, 4, _val) #define GET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart) LE_BITS_TO_1BYTE(_pStart, 7, 1) #define SET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 7, 1, _val) #define GET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 7, 1) #define SET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 7, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart) LE_BITS_TO_1BYTE(_pStart, 0, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 0, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 0, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 0, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart) LE_BITS_TO_1BYTE(_pStart, 1, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 1, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 1, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 1, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart) LE_BITS_TO_1BYTE(_pStart, 2, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 2, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 2, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 2, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart) LE_BITS_TO_1BYTE(_pStart, 3, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 3, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 3, 1) #define SET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 3, 1, _val) #define GET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart) LE_BITS_TO_1BYTE(_pStart, 5, 2) #define SET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart, _val) SET_BITS_TO_LE_1BYTE(_pStart, 5, 2, _val) #define GET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart) \ LE_BITS_TO_1BYTE(_pStart, 5, 2) #define SET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart, _val) \ SET_BITS_TO_LE_1BYTE(_pStart, 5, 2, _val) enum qos_ie_source { QOSIE_SRC_ADDTSREQ, Loading @@ -186,26 +201,40 @@ enum qos_ie_source { #define AC_PARAM_SIZE 4 #define GET_WMM_AC_PARAM_AIFSN(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 0, 4) ) #define SET_WMM_AC_PARAM_AIFSN(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 0, 4, _val) #define GET_WMM_AC_PARAM_AIFSN(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 0, 4)) #define SET_WMM_AC_PARAM_AIFSN(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 0, 4, _val) #define GET_WMM_AC_PARAM_ACM(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 4, 1) ) #define SET_WMM_AC_PARAM_ACM(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 4, 1, _val) #define GET_WMM_AC_PARAM_ACM(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 4, 1)) #define SET_WMM_AC_PARAM_ACM(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 4, 1, _val) #define GET_WMM_AC_PARAM_ACI(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 5, 2) ) #define SET_WMM_AC_PARAM_ACI(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 5, 2, _val) #define GET_WMM_AC_PARAM_ACI(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 5, 2)) #define SET_WMM_AC_PARAM_ACI(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 5, 2, _val) #define GET_WMM_AC_PARAM_ACI_AIFSN(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 0, 8) ) #define SET_WMM_AC_PARAM_ACI_AIFSN(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 0, 8, _val) #define GET_WMM_AC_PARAM_ACI_AIFSN(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 0, 8)) #define SET_WMM_AC_PARAM_ACI_AIFSN(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 0, 8, _val) #define GET_WMM_AC_PARAM_ECWMIN(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 8, 4) ) #define SET_WMM_AC_PARAM_ECWMIN(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 8, 4, _val) #define GET_WMM_AC_PARAM_ECWMIN(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 8, 4)) #define SET_WMM_AC_PARAM_ECWMIN(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 8, 4, _val) #define GET_WMM_AC_PARAM_ECWMAX(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 12, 4) ) #define SET_WMM_AC_PARAM_ECWMAX(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 12, 4, _val) #define GET_WMM_AC_PARAM_ECWMAX(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 12, 4)) #define SET_WMM_AC_PARAM_ECWMAX(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 12, 4, _val) #define GET_WMM_AC_PARAM_TXOP_LIMIT(_pStart) ( (u8)LE_BITS_TO_4BYTE(_pStart, 16, 16) ) #define SET_WMM_AC_PARAM_TXOP_LIMIT(_pStart, _val) SET_BITS_TO_LE_4BYTE(_pStart, 16, 16, _val) #define GET_WMM_AC_PARAM_TXOP_LIMIT(_pStart) \ ((u8)LE_BITS_TO_4BYTE(_pStart, 16, 16)) #define SET_WMM_AC_PARAM_TXOP_LIMIT(_pStart, _val) \ SET_BITS_TO_LE_4BYTE(_pStart, 16, 16, _val) Loading Loading @@ -348,15 +377,20 @@ struct sta_qos { }; #define QBSS_LOAD_SIZE 5 #define GET_QBSS_LOAD_STA_COUNT(__pStart) ReadEF2Byte(__pStart) #define SET_QBSS_LOAD_STA_COUNT(__pStart, __Value) WriteEF2Byte(__pStart, __Value) #define GET_QBSS_LOAD_CHNL_UTILIZATION(__pStart) ReadEF1Byte((u8*)(__pStart) + 2) #define SET_QBSS_LOAD_CHNL_UTILIZATION(__pStart, __Value) WriteEF1Byte((u8*)(__pStart) + 2, __Value) #define GET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart) ReadEF2Byte((u8*)(__pStart) + 3) #define SET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart, __Value) WriteEF2Byte((u8*)(__pStart) + 3, __Value) #define GET_QBSS_LOAD_STA_COUNT(__pStart) \ ReadEF2Byte(__pStart) #define SET_QBSS_LOAD_STA_COUNT(__pStart, __Value) \ WriteEF2Byte(__pStart, __Value) #define GET_QBSS_LOAD_CHNL_UTILIZATION(__pStart) \ ReadEF1Byte((u8 *)(__pStart) + 2) #define SET_QBSS_LOAD_CHNL_UTILIZATION(__pStart, __Value) \ WriteEF1Byte((u8 *)(__pStart) + 2, __Value) #define GET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart) \ ReadEF2Byte((u8 *)(__pStart) + 3) #define SET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart, __Value) \ WriteEF2Byte((u8 *)(__pStart) + 3, __Value) struct bss_qos { QOS_MODE bdQoSMode; u8 bdWMMIEBuf[MAX_WMMELE_LENGTH]; struct octet_string bdWMMIE; Loading @@ -380,8 +414,7 @@ struct bss_qos { union aci_aifsn { u8 charData; struct { struct { u8 AIFSN:4; u8 acm:1; u8 ACI:2; Loading @@ -391,8 +424,7 @@ union aci_aifsn { union ecw { u8 charData; struct { struct { u8 ECWmin:4; u8 ECWmax:4; } f; Loading @@ -402,8 +434,7 @@ union ac_param { u32 longData; u8 charData[4]; struct { struct { union aci_aifsn AciAifsn; union ecw Ecw; u16 TXOPLimit; Loading
drivers/staging/rtl8192e/rtl819x_TS.h +2 −0 Original line number Diff line number Diff line Loading @@ -67,5 +67,7 @@ struct rx_ts_record { u8 num; }; void _setup_timer(struct timer_list *, void *, unsigned long); #endif
drivers/staging/rtl8192e/rtl819x_TSProc.c +172 −201 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ #include "rtllib.h" #include <linux/etherdevice.h> #include "rtl819x_TS.h" extern void _setup_timer( struct timer_list*, void*, unsigned long); void TsSetupTimeOut(unsigned long data) { Loading @@ -32,7 +31,8 @@ void TsInactTimeout(unsigned long data) void RxPktPendingTimeout(unsigned long data) { struct rx_ts_record *pRxTs = (struct rx_ts_record *)data; struct rtllib_device *ieee = container_of(pRxTs, struct rtllib_device, RxTsRecord[pRxTs->num]); struct rtllib_device *ieee = container_of(pRxTs, struct rtllib_device, RxTsRecord[pRxTs->num]); struct rx_reorder_entry *pReorderEntry = NULL; Loading @@ -42,30 +42,33 @@ void RxPktPendingTimeout(unsigned long data) bool bPktInBuf = false; spin_lock_irqsave(&(ieee->reorder_spinlock), flags); if (pRxTs->RxTimeoutIndicateSeq != 0xffff) { while(!list_empty(&pRxTs->RxPendingPktList)) { pReorderEntry = (struct rx_reorder_entry *)list_entry(pRxTs->RxPendingPktList.prev,struct rx_reorder_entry,List); if (pRxTs->RxTimeoutIndicateSeq != 0xffff) { while (!list_empty(&pRxTs->RxPendingPktList)) { pReorderEntry = (struct rx_reorder_entry *) list_entry(pRxTs->RxPendingPktList.prev, struct rx_reorder_entry, List); if (index == 0) pRxTs->RxIndicateSeq = pReorderEntry->SeqNum; if (SN_LESS(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq) || SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq) ) { SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq)) { list_del_init(&pReorderEntry->List); if (SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq)) pRxTs->RxIndicateSeq = (pRxTs->RxIndicateSeq + 1) % 4096; if (SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq)) pRxTs->RxIndicateSeq = (pRxTs->RxIndicateSeq + 1) % 4096; RTLLIB_DEBUG(RTLLIB_DL_REORDER,"%s(): Indicate SeqNum: %d\n",__func__, pReorderEntry->SeqNum); stats_IndicateArray[index] = pReorderEntry->prxb; RTLLIB_DEBUG(RTLLIB_DL_REORDER, "%s(): Indicate" " SeqNum: %d\n", __func__, pReorderEntry->SeqNum); stats_IndicateArray[index] = pReorderEntry->prxb; index++; list_add_tail(&pReorderEntry->List, &ieee->RxReorder_Unused_List); } else { list_add_tail(&pReorderEntry->List, &ieee->RxReorder_Unused_List); } else { bPktInBuf = true; break; } Loading @@ -76,8 +79,10 @@ void RxPktPendingTimeout(unsigned long data) pRxTs->RxTimeoutIndicateSeq = 0xffff; if (index > REORDER_WIN_SIZE) { RTLLIB_DEBUG(RTLLIB_DL_ERR, "RxReorderIndicatePacket(): Rx Reorer struct buffer full!! \n"); spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags); RTLLIB_DEBUG(RTLLIB_DL_ERR, "RxReorderIndicatePacket():" " Rx Reorer struct buffer full!!\n"); spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags); return; } rtllib_indicate_packets(ieee, stats_IndicateArray, index); Loading @@ -86,7 +91,8 @@ void RxPktPendingTimeout(unsigned long data) if (bPktInBuf && (pRxTs->RxTimeoutIndicateSeq == 0xffff)) { pRxTs->RxTimeoutIndicateSeq = pRxTs->RxIndicateSeq; mod_timer(&pRxTs->RxPktPendingTimer, jiffies + MSECS(ieee->pHTInfo->RxReorderPendingTime)); mod_timer(&pRxTs->RxPktPendingTimer, jiffies + MSECS(ieee->pHTInfo->RxReorderPendingTime)); } spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags); } Loading @@ -95,13 +101,14 @@ void TsAddBaProcess(unsigned long data) { struct tx_ts_record *pTxTs = (struct tx_ts_record *)data; u8 num = pTxTs->num; struct rtllib_device *ieee = container_of(pTxTs, struct rtllib_device, TxTsRecord[num]); struct rtllib_device *ieee = container_of(pTxTs, struct rtllib_device, TxTsRecord[num]); TsInitAddBA(ieee, pTxTs, BA_POLICY_IMMEDIATE, false); RTLLIB_DEBUG(RTLLIB_DL_BA, "TsAddBaProcess(): ADDBA Req is started!! \n"); RTLLIB_DEBUG(RTLLIB_DL_BA, "TsAddBaProcess(): ADDBA Req is " "started!!\n"); } void ResetTsCommonInfo(struct ts_common_info *pTsCommonInfo) { memset(pTsCommonInfo->Addr, 0, 6); Loading Loading @@ -142,8 +149,7 @@ void TSInitialize(struct rtllib_device *ieee) INIT_LIST_HEAD(&ieee->Tx_TS_Pending_List); INIT_LIST_HEAD(&ieee->Tx_TS_Unused_List); for (count = 0; count < TOTAL_TS_NUM; count++) { for (count = 0; count < TOTAL_TS_NUM; count++) { pTxTS->num = count; _setup_timer(&pTxTS->TsCommonInfo.SetupTimer, TsSetupTimeOut, Loading Loading @@ -173,8 +179,7 @@ void TSInitialize(struct rtllib_device *ieee) INIT_LIST_HEAD(&ieee->Rx_TS_Admit_List); INIT_LIST_HEAD(&ieee->Rx_TS_Pending_List); INIT_LIST_HEAD(&ieee->Rx_TS_Unused_List); for (count = 0; count < TOTAL_TS_NUM; count++) { for (count = 0; count < TOTAL_TS_NUM; count++) { pRxTS->num = count; INIT_LIST_HEAD(&pRxTS->RxPendingPktList); Loading @@ -195,13 +200,14 @@ void TSInitialize(struct rtllib_device *ieee) (unsigned long) pRxTS); ResetRxTsEntry(pRxTS); list_add_tail(&pRxTS->TsCommonInfo.List, &ieee->Rx_TS_Unused_List); list_add_tail(&pRxTS->TsCommonInfo.List, &ieee->Rx_TS_Unused_List); pRxTS++; } INIT_LIST_HEAD(&ieee->RxReorder_Unused_List); for (count = 0; count < REORDER_ENTRY_NUM; count++) { list_add_tail( &pRxReorderEntry->List,&ieee->RxReorder_Unused_List); for (count = 0; count < REORDER_ENTRY_NUM; count++) { list_add_tail(&pRxReorderEntry->List, &ieee->RxReorder_Unused_List); if (count == (REORDER_ENTRY_NUM-1)) break; pRxReorderEntry = &ieee->RxReorderEntry[count+1]; Loading @@ -209,52 +215,43 @@ void TSInitialize(struct rtllib_device *ieee) } void AdmitTS(struct rtllib_device *ieee, struct ts_common_info *pTsCommonInfo, u32 InactTime) void AdmitTS(struct rtllib_device *ieee, struct ts_common_info *pTsCommonInfo, u32 InactTime) { del_timer_sync(&pTsCommonInfo->SetupTimer); del_timer_sync(&pTsCommonInfo->InactTimer); if (InactTime != 0) mod_timer(&pTsCommonInfo->InactTimer, jiffies + MSECS(InactTime)); mod_timer(&pTsCommonInfo->InactTimer, jiffies + MSECS(InactTime)); } struct ts_common_info *SearchAdmitTRStream(struct rtllib_device *ieee, u8* Addr, u8 TID, enum tr_select TxRxSelect) struct ts_common_info *SearchAdmitTRStream(struct rtllib_device *ieee, u8 *Addr, u8 TID, enum tr_select TxRxSelect) { u8 dir; bool search_dir[4] = {0, 0, 0, 0}; struct list_head *psearch_list; struct ts_common_info *pRet = NULL; if (ieee->iw_mode == IW_MODE_MASTER) { if (TxRxSelect == TX_DIR) { if (ieee->iw_mode == IW_MODE_MASTER) { if (TxRxSelect == TX_DIR) { search_dir[DIR_DOWN] = true; search_dir[DIR_BI_DIR] = true; } else { } else { search_dir[DIR_UP] = true; search_dir[DIR_BI_DIR] = true; } } else if (ieee->iw_mode == IW_MODE_ADHOC) { } else if (ieee->iw_mode == IW_MODE_ADHOC) { if (TxRxSelect == TX_DIR) search_dir[DIR_UP] = true; else search_dir[DIR_DOWN] = true; } else { if (TxRxSelect == TX_DIR) { } else { if (TxRxSelect == TX_DIR) { search_dir[DIR_UP] = true; search_dir[DIR_BI_DIR] = true; search_dir[DIR_DIRECT] = true; } else { } else { search_dir[DIR_DOWN] = true; search_dir[DIR_BI_DIR] = true; search_dir[DIR_DIRECT] = true; Loading @@ -266,38 +263,29 @@ struct ts_common_info *SearchAdmitTRStream(struct rtllib_device *ieee, u8* Addr, else psearch_list = &ieee->Rx_TS_Admit_List; for (dir = 0; dir <= DIR_BI_DIR; dir++) { for (dir = 0; dir <= DIR_BI_DIR; dir++) { if (search_dir[dir] == false) continue; list_for_each_entry(pRet, psearch_list, List) { if (memcmp(pRet->Addr, Addr, 6) == 0) if (pRet->TSpec.f.TSInfo.field.ucTSID == TID) if (pRet->TSpec.f.TSInfo.field.ucDirection == dir) { break; } } if (&pRet->List != psearch_list) break; } if (&pRet->List != psearch_list){ if (&pRet->List != psearch_list) return pRet ; } else return NULL; } void MakeTSEntry( struct ts_common_info *pTsCommonInfo, u8* Addr, union tspec_body *pTSPEC, union qos_tclas *pTCLAS, u8 TCLAS_Num, u8 TCLAS_Proc ) void MakeTSEntry(struct ts_common_info *pTsCommonInfo, u8 *Addr, union tspec_body *pTSPEC, union qos_tclas *pTCLAS, u8 TCLAS_Num, u8 TCLAS_Proc) { u8 count; Loading @@ -307,34 +295,32 @@ void MakeTSEntry( memcpy(pTsCommonInfo->Addr, Addr, 6); if (pTSPEC != NULL) memcpy((u8*)(&(pTsCommonInfo->TSpec)), (u8*)pTSPEC, sizeof(union tspec_body)); memcpy((u8 *)(&(pTsCommonInfo->TSpec)), (u8 *)pTSPEC, sizeof(union tspec_body)); for (count = 0; count < TCLAS_Num; count++) memcpy((u8*)(&(pTsCommonInfo->TClass[count])), (u8*)pTCLAS, sizeof(union qos_tclas)); memcpy((u8 *)(&(pTsCommonInfo->TClass[count])), (u8 *)pTCLAS, sizeof(union qos_tclas)); pTsCommonInfo->TClasProc = TCLAS_Proc; pTsCommonInfo->TClasNum = TCLAS_Num; } bool GetTs( struct rtllib_device* ieee, struct ts_common_info **ppTS, u8* Addr, u8 TID, enum tr_select TxRxSelect, bool bAddNewTs) bool GetTs(struct rtllib_device *ieee, struct ts_common_info **ppTS, u8 *Addr, u8 TID, enum tr_select TxRxSelect, bool bAddNewTs) { u8 UP = 0; if (is_broadcast_ether_addr(Addr) || is_multicast_ether_addr(Addr)) { RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR! get TS for Broadcast or Multicast\n"); if (is_broadcast_ether_addr(Addr) || is_multicast_ether_addr(Addr)) { RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR! get TS for Broadcast or " "Multicast\n"); return false; } if (ieee->current_network.qos_data.supported == 0) { UP = 0; } else { if (!IsACValid(TID)) { RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR! in %s(), TID(%d) is not valid\n", __func__, TID); RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR! in %s(), TID(%d) is " "not valid\n", __func__, TID); return false; } Loading @@ -358,24 +344,15 @@ bool GetTs( } } *ppTS = SearchAdmitTRStream( ieee, Addr, UP, TxRxSelect); if (*ppTS != NULL) { *ppTS = SearchAdmitTRStream(ieee, Addr, UP, TxRxSelect); if (*ppTS != NULL) { return true; } else { if (bAddNewTs == false) { RTLLIB_DEBUG(RTLLIB_DL_TS, "add new TS failed(tid:%d)\n", UP); } else { if (bAddNewTs == false) { RTLLIB_DEBUG(RTLLIB_DL_TS, "add new TS failed" "(tid:%d)\n", UP); return false; } else { } else { union tspec_body TSpec; union qos_tsinfo *pTSInfo = &TSpec.f.TSInfo; struct list_head *pUnusedList = Loading @@ -388,25 +365,33 @@ bool GetTs( (&ieee->Tx_TS_Admit_List) : (&ieee->Rx_TS_Admit_List); enum direction_value Dir = (ieee->iw_mode == IW_MODE_MASTER)? enum direction_value Dir = (ieee->iw_mode == IW_MODE_MASTER) ? ((TxRxSelect == TX_DIR) ? DIR_DOWN : DIR_UP) : ((TxRxSelect == TX_DIR) ? DIR_UP : DIR_DOWN); RTLLIB_DEBUG(RTLLIB_DL_TS, "to add Ts\n"); if (!list_empty(pUnusedList)) { (*ppTS) = list_entry(pUnusedList->next, struct ts_common_info, List); if (!list_empty(pUnusedList)) { (*ppTS) = list_entry(pUnusedList->next, struct ts_common_info, List); list_del_init(&(*ppTS)->List); if (TxRxSelect==TX_DIR) { struct tx_ts_record *tmp = container_of(*ppTS, struct tx_ts_record, TsCommonInfo); if (TxRxSelect == TX_DIR) { struct tx_ts_record *tmp = container_of(*ppTS, struct tx_ts_record, TsCommonInfo); ResetTxTsEntry(tmp); } else{ struct rx_ts_record *tmp = container_of(*ppTS, struct rx_ts_record, TsCommonInfo); } else { struct rx_ts_record *tmp = container_of(*ppTS, struct rx_ts_record, TsCommonInfo); ResetRxTsEntry(tmp); } RTLLIB_DEBUG(RTLLIB_DL_TS, "to init current TS, UP:%d, Dir:%d, addr:"MAC_FMT" ppTs=%p\n", UP, Dir, MAC_ARG(Addr), *ppTS); RTLLIB_DEBUG(RTLLIB_DL_TS, "to init current TS" ", UP:%d, Dir:%d, addr:"MAC_FMT " ppTs=%p\n", UP, Dir, MAC_ARG(Addr), *ppTS); pTSInfo->field.ucTrafficType = 0; pTSInfo->field.ucTSID = UP; pTSInfo->field.ucDirection = Dir; Loading @@ -422,28 +407,25 @@ bool GetTs( list_add_tail(&((*ppTS)->List), pAddmitList); return true; } else { RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR!!in function %s() There is not enough dir=%d(0=up down=1) TS record to be used!!", __func__,Dir); } else { RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR!!in function " "%s() There is not enough dir=%d" "(0=up down=1) TS record to be " "used!!", __func__, Dir); return false; } } } } void RemoveTsEntry( struct rtllib_device* ieee, struct ts_common_info *pTs, enum tr_select TxRxSelect ) void RemoveTsEntry(struct rtllib_device *ieee, struct ts_common_info *pTs, enum tr_select TxRxSelect) { del_timer_sync(&pTs->SetupTimer); del_timer_sync(&pTs->InactTimer); TsInitDelBA(ieee, pTs, TxRxSelect); if (TxRxSelect == RX_DIR) { if (TxRxSelect == RX_DIR) { struct rx_reorder_entry *pRxReorderEntry; struct rx_ts_record *pRxTS = (struct rx_ts_record *)pTs; Loading @@ -451,25 +433,27 @@ void RemoveTsEntry( del_timer_sync(&pRxTS->RxPktPendingTimer); while (!list_empty(&pRxTS->RxPendingPktList)) { pRxReorderEntry = (struct rx_reorder_entry *)list_entry(pRxTS->RxPendingPktList.prev,struct rx_reorder_entry,List); RTLLIB_DEBUG(RTLLIB_DL_REORDER,"%s(): Delete SeqNum %d!\n",__func__, pRxReorderEntry->SeqNum); pRxReorderEntry = (struct rx_reorder_entry *) list_entry(pRxTS->RxPendingPktList.prev, struct rx_reorder_entry, List); RTLLIB_DEBUG(RTLLIB_DL_REORDER, "%s(): Delete SeqNum " "%d!\n", __func__, pRxReorderEntry->SeqNum); list_del_init(&pRxReorderEntry->List); { int i = 0; struct rtllib_rxb *prxb = pRxReorderEntry->prxb; if (unlikely(!prxb)){ if (unlikely(!prxb)) return; } for (i =0; i < prxb->nr_subframes; i++) { for (i = 0; i < prxb->nr_subframes; i++) dev_kfree_skb(prxb->subframes[i]); } kfree(prxb); prxb = NULL; } list_add_tail(&pRxReorderEntry->List,&ieee->RxReorder_Unused_List); list_add_tail(&pRxReorderEntry->List, &ieee->RxReorder_Unused_List); } } else{ } else { struct tx_ts_record *pTxTS = (struct tx_ts_record *)pTs; del_timer_sync(&pTxTS->TsAddBaTimer); } Loading @@ -478,43 +462,35 @@ void RemoveTsEntry( void RemovePeerTS(struct rtllib_device *ieee, u8 *Addr) { struct ts_common_info *pTS, *pTmpTS; printk("===========>RemovePeerTS,"MAC_FMT"\n", MAC_ARG(Addr)); printk(KERN_INFO "===========>RemovePeerTS,"MAC_FMT"\n", MAC_ARG(Addr)); list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { RemoveTsEntry(ieee, pTS, TX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List); } } list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { printk("====>remove Tx_TS_admin_list\n"); list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { printk(KERN_INFO "====>remove Tx_TS_admin_list\n"); RemoveTsEntry(ieee, pTS, TX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List); } } list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { RemoveTsEntry(ieee, pTS, RX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List); } } list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List) { if (memcmp(pTS->Addr, Addr, 6) == 0) { RemoveTsEntry(ieee, pTS, RX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List); Loading @@ -526,29 +502,25 @@ void RemoveAllTS(struct rtllib_device* ieee) { struct ts_common_info *pTS, *pTmpTS; list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List) { RemoveTsEntry(ieee, pTS, TX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List); } list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List) { RemoveTsEntry(ieee, pTS, TX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List); } list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List) { RemoveTsEntry(ieee, pTS, RX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List); } list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List) { list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List) { RemoveTsEntry(ieee, pTS, RX_DIR); list_del_init(&pTS->List); list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List); Loading @@ -557,21 +529,20 @@ void RemoveAllTS(struct rtllib_device* ieee) void TsStartAddBaProcess(struct rtllib_device *ieee, struct tx_ts_record *pTxTS) { if (pTxTS->bAddBaReqInProgress == false) { if (pTxTS->bAddBaReqInProgress == false) { pTxTS->bAddBaReqInProgress = true; if (pTxTS->bAddBaReqDelayed) { RTLLIB_DEBUG(RTLLIB_DL_BA, "TsStartAddBaProcess(): Delayed Start ADDBA after 60 sec!!\n"); mod_timer(&pTxTS->TsAddBaTimer, jiffies + MSECS(TS_ADDBA_DELAY)); } else { RTLLIB_DEBUG(RTLLIB_DL_BA,"TsStartAddBaProcess(): Immediately Start ADDBA now!!\n"); if (pTxTS->bAddBaReqDelayed) { RTLLIB_DEBUG(RTLLIB_DL_BA, "TsStartAddBaProcess(): " "Delayed Start ADDBA after 60 sec!!\n"); mod_timer(&pTxTS->TsAddBaTimer, jiffies + MSECS(TS_ADDBA_DELAY)); } else { RTLLIB_DEBUG(RTLLIB_DL_BA, "TsStartAddBaProcess(): " "Immediately Start ADDBA now!!\n"); mod_timer(&pTxTS->TsAddBaTimer, jiffies+10); } } else RTLLIB_DEBUG(RTLLIB_DL_BA, "%s()==>BA timer is already added\n", __func__); } else RTLLIB_DEBUG(RTLLIB_DL_BA, "%s()==>BA timer is already added\n", __func__); }