rtl819x_TSProc.c revision f88ec6cbc1db3fbe5890250a37f5065506b5989c
194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger/******************************************************************************
294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger *
494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * This program is distributed in the hope that it will be useful, but WITHOUT
594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * more details.
894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger *
994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * You should have received a copy of the GNU General Public License along with
1094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * this program; if not, write to the Free Software Foundation, Inc.,
1194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
1294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger *
1394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * The full GNU General Public License is included in this distribution in the
1494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * file called LICENSE.
1594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger *
1694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * Contact Information:
1794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * wlanfae <wlanfae@realtek.com>
1894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger******************************************************************************/
1994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "rtllib.h"
2094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include <linux/etherdevice.h>
2194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "rtl819x_TS.h"
22cb76215448947ddcc133c4b1c2ff2d4a77e851e0Mike McCormack
2394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid TsSetupTimeOut(unsigned long data)
2494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
2594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
2694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
2794a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid TsInactTimeout(unsigned long data)
2894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
2994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
3094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
3194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid RxPktPendingTimeout(unsigned long data)
3294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
332c47ae282a4bbaebfdbba614fb6133db520212baLarry Finger	struct rx_ts_record *pRxTs = (struct rx_ts_record *)data;
34f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	struct rtllib_device *ieee = container_of(pRxTs, struct rtllib_device,
35f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger						  RxTsRecord[pRxTs->num]);
3694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
378cba1432cee4c88668160750f1892aa09a2ba56aLarry Finger	struct rx_reorder_entry *pReorderEntry = NULL;
3894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
3994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	unsigned long flags = 0;
4094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct rtllib_rxb *stats_IndicateArray[REORDER_WIN_SIZE];
4194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8 index = 0;
4294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	bool bPktInBuf = false;
4394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
4494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	spin_lock_irqsave(&(ieee->reorder_spinlock), flags);
45f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	if (pRxTs->RxTimeoutIndicateSeq != 0xffff) {
46f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		while (!list_empty(&pRxTs->RxPendingPktList)) {
47f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			pReorderEntry = (struct rx_reorder_entry *)
48f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					list_entry(pRxTs->RxPendingPktList.prev,
49f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					struct rx_reorder_entry, List);
5094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (index == 0)
5194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				pRxTs->RxIndicateSeq = pReorderEntry->SeqNum;
5294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
53f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			if (SN_LESS(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq) ||
54f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq)) {
5594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				list_del_init(&pReorderEntry->List);
5694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
57f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				if (SN_EQUAL(pReorderEntry->SeqNum,
58f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				    pRxTs->RxIndicateSeq))
59f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					pRxTs->RxIndicateSeq =
60f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					      (pRxTs->RxIndicateSeq + 1) % 4096;
6194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
62f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				RTLLIB_DEBUG(RTLLIB_DL_REORDER, "%s(): Indicate"
63f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					     " SeqNum: %d\n", __func__,
64f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					     pReorderEntry->SeqNum);
65f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				stats_IndicateArray[index] =
66f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger							 pReorderEntry->prxb;
6794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				index++;
6894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
69f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				list_add_tail(&pReorderEntry->List,
70f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					      &ieee->RxReorder_Unused_List);
71f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			} else {
7294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				bPktInBuf = true;
7394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
7494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
7594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
7694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
7794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
78f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	if (index > 0) {
7994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		pRxTs->RxTimeoutIndicateSeq = 0xffff;
8094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
81f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		if (index > REORDER_WIN_SIZE) {
82f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			RTLLIB_DEBUG(RTLLIB_DL_ERR, "RxReorderIndicatePacket():"
83f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				     " Rx Reorer struct buffer full!!\n");
84f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			spin_unlock_irqrestore(&(ieee->reorder_spinlock),
85f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					       flags);
8694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			return;
8794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
8894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtllib_indicate_packets(ieee, stats_IndicateArray, index);
8994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		bPktInBuf = false;
9094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
9194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
92f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	if (bPktInBuf && (pRxTs->RxTimeoutIndicateSeq == 0xffff)) {
9394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		pRxTs->RxTimeoutIndicateSeq = pRxTs->RxIndicateSeq;
94f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		mod_timer(&pRxTs->RxPktPendingTimer,  jiffies +
95f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			  MSECS(ieee->pHTInfo->RxReorderPendingTime));
9694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
9794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
9894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
9994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
10094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid TsAddBaProcess(unsigned long data)
10194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
10260554f2bdb1579ca54631e99642025797f860eb7Larry Finger	struct tx_ts_record *pTxTs = (struct tx_ts_record *)data;
10394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8 num = pTxTs->num;
104f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	struct rtllib_device *ieee = container_of(pTxTs, struct rtllib_device,
105f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				     TxTsRecord[num]);
10694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
10794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	TsInitAddBA(ieee, pTxTs, BA_POLICY_IMMEDIATE, false);
108f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	RTLLIB_DEBUG(RTLLIB_DL_BA, "TsAddBaProcess(): ADDBA Req is "
109f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		     "started!!\n");
11094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
11194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
11274724de1c40192d74a213e615b945df8de935ca2Larry Fingervoid ResetTsCommonInfo(struct ts_common_info *pTsCommonInfo)
11394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
11494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	memset(pTsCommonInfo->Addr, 0, 6);
115ed306e486d673a3ba4f9b0f2ab15afab0a6ba171Larry Finger	memset(&pTsCommonInfo->TSpec, 0, sizeof(union tspec_body));
116626f951d76279823711fd0f9b876fafee39c3decLarry Finger	memset(&pTsCommonInfo->TClass, 0, sizeof(union qos_tclas)*TCLAS_NUM);
11794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pTsCommonInfo->TClasProc = 0;
11894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pTsCommonInfo->TClasNum = 0;
11994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
12094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
12160554f2bdb1579ca54631e99642025797f860eb7Larry Fingervoid ResetTxTsEntry(struct tx_ts_record *pTS)
12294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
12394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	ResetTsCommonInfo(&pTS->TsCommonInfo);
12494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pTS->TxCurSeq = 0;
12594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pTS->bAddBaReqInProgress = false;
12694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pTS->bAddBaReqDelayed = false;
12794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pTS->bUsingBa = false;
12894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pTS->bDisable_AddBa = false;
12994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	ResetBaEntry(&pTS->TxAdmittedBARecord);
13094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	ResetBaEntry(&pTS->TxPendingBARecord);
13194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
13294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
1332c47ae282a4bbaebfdbba614fb6133db520212baLarry Fingervoid ResetRxTsEntry(struct rx_ts_record *pTS)
13494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
13594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	ResetTsCommonInfo(&pTS->TsCommonInfo);
13694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pTS->RxIndicateSeq = 0xffff;
13794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pTS->RxTimeoutIndicateSeq = 0xffff;
13894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	ResetBaEntry(&pTS->RxAdmittedBARecord);
13994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
14094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
14194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid TSInitialize(struct rtllib_device *ieee)
14294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
14360554f2bdb1579ca54631e99642025797f860eb7Larry Finger	struct tx_ts_record *pTxTS  = ieee->TxTsRecord;
1442c47ae282a4bbaebfdbba614fb6133db520212baLarry Finger	struct rx_ts_record *pRxTS  = ieee->RxTsRecord;
1458cba1432cee4c88668160750f1892aa09a2ba56aLarry Finger	struct rx_reorder_entry *pRxReorderEntry = ieee->RxReorderEntry;
14694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8				count = 0;
14794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RTLLIB_DEBUG(RTLLIB_DL_TS, "==========>%s()\n", __func__);
14894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	INIT_LIST_HEAD(&ieee->Tx_TS_Admit_List);
14994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	INIT_LIST_HEAD(&ieee->Tx_TS_Pending_List);
15094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	INIT_LIST_HEAD(&ieee->Tx_TS_Unused_List);
15194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
152f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	for (count = 0; count < TOTAL_TS_NUM; count++) {
15394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		pTxTS->num = count;
15494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		_setup_timer(&pTxTS->TsCommonInfo.SetupTimer,
15594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    TsSetupTimeOut,
15694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    (unsigned long) pTxTS);
15794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
15894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		_setup_timer(&pTxTS->TsCommonInfo.InactTimer,
15994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    TsInactTimeout,
16094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    (unsigned long) pTxTS);
16194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
16294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		_setup_timer(&pTxTS->TsAddBaTimer,
16394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    TsAddBaProcess,
16494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    (unsigned long) pTxTS);
16594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
16694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		_setup_timer(&pTxTS->TxPendingBARecord.Timer,
16794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    BaSetupTimeOut,
16894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    (unsigned long) pTxTS);
16994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		_setup_timer(&pTxTS->TxAdmittedBARecord.Timer,
17094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    TxBaInactTimeout,
17194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    (unsigned long) pTxTS);
17294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
17394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		ResetTxTsEntry(pTxTS);
17494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		list_add_tail(&pTxTS->TsCommonInfo.List,
17594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				&ieee->Tx_TS_Unused_List);
17694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		pTxTS++;
17794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
17894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
17994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	INIT_LIST_HEAD(&ieee->Rx_TS_Admit_List);
18094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	INIT_LIST_HEAD(&ieee->Rx_TS_Pending_List);
18194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	INIT_LIST_HEAD(&ieee->Rx_TS_Unused_List);
182f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	for (count = 0; count < TOTAL_TS_NUM; count++) {
18394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		pRxTS->num = count;
18494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		INIT_LIST_HEAD(&pRxTS->RxPendingPktList);
18594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
18694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		_setup_timer(&pRxTS->TsCommonInfo.SetupTimer,
18794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    TsSetupTimeOut,
18894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    (unsigned long) pRxTS);
18994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
19094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		_setup_timer(&pRxTS->TsCommonInfo.InactTimer,
19194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    TsInactTimeout,
19294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    (unsigned long) pRxTS);
19394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
19494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		_setup_timer(&pRxTS->RxAdmittedBARecord.Timer,
19594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    RxBaInactTimeout,
19694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    (unsigned long) pRxTS);
19794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
19894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		_setup_timer(&pRxTS->RxPktPendingTimer,
19994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    RxPktPendingTimeout,
20094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			    (unsigned long) pRxTS);
20194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
20294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		ResetRxTsEntry(pRxTS);
203f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		list_add_tail(&pRxTS->TsCommonInfo.List,
204f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			      &ieee->Rx_TS_Unused_List);
20594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		pRxTS++;
20694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
20794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	INIT_LIST_HEAD(&ieee->RxReorder_Unused_List);
208f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	for (count = 0; count < REORDER_ENTRY_NUM; count++) {
209f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		list_add_tail(&pRxReorderEntry->List,
210f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			      &ieee->RxReorder_Unused_List);
21194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (count == (REORDER_ENTRY_NUM-1))
21294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
21394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		pRxReorderEntry = &ieee->RxReorderEntry[count+1];
21494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
21594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
21694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
21794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
218f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Fingervoid AdmitTS(struct rtllib_device *ieee, struct ts_common_info *pTsCommonInfo,
219f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	     u32 InactTime)
22094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
22194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	del_timer_sync(&pTsCommonInfo->SetupTimer);
22294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	del_timer_sync(&pTsCommonInfo->InactTimer);
22394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
224f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	if (InactTime != 0)
225f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		mod_timer(&pTsCommonInfo->InactTimer, jiffies +
226f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			  MSECS(InactTime));
22794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
22894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
229f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Fingerstruct ts_common_info *SearchAdmitTRStream(struct rtllib_device *ieee, u8 *Addr,
230f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					   u8 TID, enum tr_select TxRxSelect)
23194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
23294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8	dir;
233f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	bool	search_dir[4] = {0, 0, 0, 0};
234f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	struct list_head *psearch_list;
23574724de1c40192d74a213e615b945df8de935ca2Larry Finger	struct ts_common_info *pRet = NULL;
236f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	if (ieee->iw_mode == IW_MODE_MASTER) {
237f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		if (TxRxSelect == TX_DIR) {
23894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			search_dir[DIR_DOWN] = true;
239f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			search_dir[DIR_BI_DIR] = true;
240f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		} else {
241f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			search_dir[DIR_UP] = true;
242f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			search_dir[DIR_BI_DIR] = true;
24394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
244f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	} else if (ieee->iw_mode == IW_MODE_ADHOC) {
24594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (TxRxSelect == TX_DIR)
246f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			search_dir[DIR_UP] = true;
24794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else
24894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			search_dir[DIR_DOWN] = true;
249f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	} else {
250f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		if (TxRxSelect == TX_DIR) {
251f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			search_dir[DIR_UP] = true;
252f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			search_dir[DIR_BI_DIR] = true;
253f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			search_dir[DIR_DIRECT] = true;
254f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		} else {
25594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			search_dir[DIR_DOWN] = true;
256f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			search_dir[DIR_BI_DIR] = true;
257f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			search_dir[DIR_DIRECT] = true;
25894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
25994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
26094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
26194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (TxRxSelect == TX_DIR)
26294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		psearch_list = &ieee->Tx_TS_Admit_List;
26394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else
26494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		psearch_list = &ieee->Rx_TS_Admit_List;
26594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
266f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	for (dir = 0; dir <= DIR_BI_DIR; dir++) {
267f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		if (search_dir[dir] == false)
26894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			continue;
269f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		list_for_each_entry(pRet, psearch_list, List) {
27094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (memcmp(pRet->Addr, Addr, 6) == 0)
27194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if (pRet->TSpec.f.TSInfo.field.ucTSID == TID)
27294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					if (pRet->TSpec.f.TSInfo.field.ucDirection == dir)
27394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						break;
27494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
27594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
27694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (&pRet->List  != psearch_list)
27794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
27894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
27994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
280f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	if (&pRet->List  != psearch_list)
28194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return pRet ;
28294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else
28394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return NULL;
28494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
28594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
286f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Fingervoid MakeTSEntry(struct ts_common_info *pTsCommonInfo, u8 *Addr,
287f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		 union tspec_body *pTSPEC, union qos_tclas *pTCLAS,
288f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		 u8 TCLAS_Num, u8 TCLAS_Proc)
28994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
29094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8	count;
29194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
29294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (pTsCommonInfo == NULL)
29394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return;
29494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
29594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	memcpy(pTsCommonInfo->Addr, Addr, 6);
29694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
29794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (pTSPEC != NULL)
298f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		memcpy((u8 *)(&(pTsCommonInfo->TSpec)), (u8 *)pTSPEC,
299f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			sizeof(union tspec_body));
30094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
30194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	for (count = 0; count < TCLAS_Num; count++)
302f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		memcpy((u8 *)(&(pTsCommonInfo->TClass[count])),
303f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		       (u8 *)pTCLAS, sizeof(union qos_tclas));
30494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
30594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pTsCommonInfo->TClasProc = TCLAS_Proc;
30694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pTsCommonInfo->TClasNum = TCLAS_Num;
30794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
30894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
309f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Fingerbool GetTs(struct rtllib_device *ieee, struct ts_common_info **ppTS,
310f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	   u8 *Addr, u8 TID, enum tr_select TxRxSelect, bool bAddNewTs)
31194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
31294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8	UP = 0;
313f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	if (is_broadcast_ether_addr(Addr) || is_multicast_ether_addr(Addr)) {
314f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR! get TS for Broadcast or "
315f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			     "Multicast\n");
31694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return false;
31794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
31894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (ieee->current_network.qos_data.supported == 0) {
31994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		UP = 0;
32094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	} else {
32194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (!IsACValid(TID)) {
322f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR! in %s(), TID(%d) is "
323f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				     "not valid\n", __func__, TID);
32494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			return false;
32594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
32694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
32794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		switch (TID) {
32894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case 0:
32994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case 3:
33094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			UP = 0;
33194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
33294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case 1:
33394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case 2:
33494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			UP = 2;
33594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
33694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case 4:
33794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case 5:
33894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			UP = 5;
33994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
34094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case 6:
34194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case 7:
34294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			UP = 7;
34394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
34494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
34594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
34694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
347f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	*ppTS = SearchAdmitTRStream(ieee, Addr, UP, TxRxSelect);
348f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	if (*ppTS != NULL) {
34994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return true;
350f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	} else {
351f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		if (bAddNewTs == false) {
352f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			RTLLIB_DEBUG(RTLLIB_DL_TS, "add new TS failed"
353f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				     "(tid:%d)\n", UP);
35494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			return false;
355f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		} else {
356ed306e486d673a3ba4f9b0f2ab15afab0a6ba171Larry Finger			union tspec_body TSpec;
35742c53e7aaec108cf12431d6aca9ddac90b39d573Larry Finger			union qos_tsinfo *pTSInfo = &TSpec.f.TSInfo;
358f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			struct list_head *pUnusedList =
359f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				(TxRxSelect == TX_DIR) ?
360f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				(&ieee->Tx_TS_Unused_List) :
361f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				(&ieee->Rx_TS_Unused_List);
362f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger
363f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			struct list_head *pAddmitList =
364f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				(TxRxSelect == TX_DIR) ?
365f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				(&ieee->Tx_TS_Admit_List) :
366f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				(&ieee->Rx_TS_Admit_List);
367f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger
368f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			enum direction_value Dir =
369f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				 (ieee->iw_mode == IW_MODE_MASTER) ?
370f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				 ((TxRxSelect == TX_DIR) ? DIR_DOWN : DIR_UP) :
371f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				 ((TxRxSelect == TX_DIR) ? DIR_UP : DIR_DOWN);
37294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RTLLIB_DEBUG(RTLLIB_DL_TS, "to add Ts\n");
373f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			if (!list_empty(pUnusedList)) {
374f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				(*ppTS) = list_entry(pUnusedList->next,
375f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					  struct ts_common_info, List);
37694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				list_del_init(&(*ppTS)->List);
377f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				if (TxRxSelect == TX_DIR) {
378f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					struct tx_ts_record *tmp =
379f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger						container_of(*ppTS,
380f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger						struct tx_ts_record,
381f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger						TsCommonInfo);
38294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					ResetTxTsEntry(tmp);
383f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				} else {
384f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					struct rx_ts_record *tmp =
385f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger						 container_of(*ppTS,
386f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger						 struct rx_ts_record,
387f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger						 TsCommonInfo);
38894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					ResetRxTsEntry(tmp);
38994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
39094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
391f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				RTLLIB_DEBUG(RTLLIB_DL_TS, "to init current TS"
392f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					     ", UP:%d, Dir:%d, addr:"MAC_FMT
393f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					     " ppTs=%p\n", UP, Dir,
394f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					      MAC_ARG(Addr), *ppTS);
39594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				pTSInfo->field.ucTrafficType = 0;
39694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				pTSInfo->field.ucTSID = UP;
39794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				pTSInfo->field.ucDirection = Dir;
39894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				pTSInfo->field.ucAccessPolicy = 1;
39994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				pTSInfo->field.ucAggregation = 0;
40094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				pTSInfo->field.ucPSB = 0;
40194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				pTSInfo->field.ucUP = UP;
40294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				pTSInfo->field.ucTSInfoAckPolicy = 0;
40394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				pTSInfo->field.ucSchedule = 0;
40494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
40594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				MakeTSEntry(*ppTS, Addr, &TSpec, NULL, 0, 0);
40694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				AdmitTS(ieee, *ppTS, 0);
40794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				list_add_tail(&((*ppTS)->List), pAddmitList);
40894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
40994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				return true;
410f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			} else {
411f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR!!in function "
412f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					     "%s() There is not enough dir=%d"
413f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					     "(0=up down=1) TS record to be "
414f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					     "used!!", __func__, Dir);
41594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				return false;
41694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
41794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
41894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
41994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
42094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
421f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Fingervoid RemoveTsEntry(struct rtllib_device *ieee, struct ts_common_info *pTs,
422f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		   enum tr_select TxRxSelect)
42394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
42494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	del_timer_sync(&pTs->SetupTimer);
42594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	del_timer_sync(&pTs->InactTimer);
42694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	TsInitDelBA(ieee, pTs, TxRxSelect);
42794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
428f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	if (TxRxSelect == RX_DIR) {
4298cba1432cee4c88668160750f1892aa09a2ba56aLarry Finger		struct rx_reorder_entry *pRxReorderEntry;
4302c47ae282a4bbaebfdbba614fb6133db520212baLarry Finger		struct rx_ts_record *pRxTS = (struct rx_ts_record *)pTs;
43194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
43294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (timer_pending(&pRxTS->RxPktPendingTimer))
43394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			del_timer_sync(&pRxTS->RxPktPendingTimer);
43494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
435f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		while (!list_empty(&pRxTS->RxPendingPktList)) {
436f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			pRxReorderEntry = (struct rx_reorder_entry *)
437f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					list_entry(pRxTS->RxPendingPktList.prev,
438f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger					struct rx_reorder_entry, List);
439f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			RTLLIB_DEBUG(RTLLIB_DL_REORDER, "%s(): Delete SeqNum "
440f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				     "%d!\n", __func__,
441f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				     pRxReorderEntry->SeqNum);
44294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			list_del_init(&pRxReorderEntry->List);
44394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
44494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				int i = 0;
445f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				struct rtllib_rxb *prxb = pRxReorderEntry->prxb;
446f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				if (unlikely(!prxb))
44794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					return;
448f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				for (i = 0; i < prxb->nr_subframes; i++)
44994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					dev_kfree_skb(prxb->subframes[i]);
45094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				kfree(prxb);
45194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				prxb = NULL;
45294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
453f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			list_add_tail(&pRxReorderEntry->List,
454f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				      &ieee->RxReorder_Unused_List);
45594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
456f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	} else {
45760554f2bdb1579ca54631e99642025797f860eb7Larry Finger		struct tx_ts_record *pTxTS = (struct tx_ts_record *)pTs;
45894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		del_timer_sync(&pTxTS->TsAddBaTimer);
45994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
46094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
46194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
462f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Fingervoid RemovePeerTS(struct rtllib_device *ieee, u8 *Addr)
46394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
46474724de1c40192d74a213e615b945df8de935ca2Larry Finger	struct ts_common_info *pTS, *pTmpTS;
465f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	printk(KERN_INFO "===========>RemovePeerTS,"MAC_FMT"\n", MAC_ARG(Addr));
4664f6807e8d2e972393009830d305ecec2d80c0449Mike McCormack
467f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List) {
468f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		if (memcmp(pTS->Addr, Addr, 6) == 0) {
46994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RemoveTsEntry(ieee, pTS, TX_DIR);
47094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			list_del_init(&pTS->List);
47194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
47294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
47394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
47494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
475f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List) {
476f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		if (memcmp(pTS->Addr, Addr, 6) == 0) {
477f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			printk(KERN_INFO "====>remove Tx_TS_admin_list\n");
47894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RemoveTsEntry(ieee, pTS, TX_DIR);
47994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			list_del_init(&pTS->List);
48094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
48194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
48294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
48394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
484f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List) {
485f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		if (memcmp(pTS->Addr, Addr, 6) == 0) {
48694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RemoveTsEntry(ieee, pTS, RX_DIR);
48794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			list_del_init(&pTS->List);
48894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
48994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
49094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
49194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
492f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List) {
493f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		if (memcmp(pTS->Addr, Addr, 6) == 0) {
49494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RemoveTsEntry(ieee, pTS, RX_DIR);
49594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			list_del_init(&pTS->List);
49694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
49794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
49894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
49994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
50094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
501f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Fingervoid RemoveAllTS(struct rtllib_device *ieee)
50294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
50374724de1c40192d74a213e615b945df8de935ca2Larry Finger	struct ts_common_info *pTS, *pTmpTS;
5044f6807e8d2e972393009830d305ecec2d80c0449Mike McCormack
505f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List) {
50694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RemoveTsEntry(ieee, pTS, TX_DIR);
50794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		list_del_init(&pTS->List);
50894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
50994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
51094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
511f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List) {
51294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RemoveTsEntry(ieee, pTS, TX_DIR);
51394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		list_del_init(&pTS->List);
51494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
51594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
51694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
517f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List) {
51894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RemoveTsEntry(ieee, pTS, RX_DIR);
51994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		list_del_init(&pTS->List);
52094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
52194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
52294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
523f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List) {
52494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RemoveTsEntry(ieee, pTS, RX_DIR);
52594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		list_del_init(&pTS->List);
52694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
52794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
52894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
52994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
530f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Fingervoid TsStartAddBaProcess(struct rtllib_device *ieee, struct tx_ts_record *pTxTS)
53194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
532f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	if (pTxTS->bAddBaReqInProgress == false) {
53394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		pTxTS->bAddBaReqInProgress = true;
5344f6807e8d2e972393009830d305ecec2d80c0449Mike McCormack
535f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		if (pTxTS->bAddBaReqDelayed) {
536f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			RTLLIB_DEBUG(RTLLIB_DL_BA, "TsStartAddBaProcess(): "
537f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				     "Delayed Start ADDBA after 60 sec!!\n");
538f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			mod_timer(&pTxTS->TsAddBaTimer, jiffies +
539f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				  MSECS(TS_ADDBA_DELAY));
540f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		} else {
541f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			RTLLIB_DEBUG(RTLLIB_DL_BA, "TsStartAddBaProcess(): "
542f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger				     "Immediately Start ADDBA now!!\n");
54394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			mod_timer(&pTxTS->TsAddBaTimer, jiffies+10);
54494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
545f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger	} else
546f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger		RTLLIB_DEBUG(RTLLIB_DL_BA, "%s()==>BA timer is already added\n",
547f88ec6cbc1db3fbe5890250a37f5065506b5989cLarry Finger			     __func__);
54894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
549