2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 *************************************************************************
34 -------- ---------- ----------------------------------------------
35 Name Date Modification logs
36 Paul Lin 06-25-2004 created
40 #include "../rt_config.h"
41 // Match total 6 bulkout endpoint to corresponding queue.
42 UCHAR EpToQueue[6]={FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_EDCA, FIFO_MGMT};
44 //static BOOLEAN SingleBulkOut = FALSE;
46 void RTUSB_FILL_BULK_URB (struct urb *pUrb,
47 struct usb_device *pUsb_Dev,
48 unsigned int bulkpipe,
51 usb_complete_t Complete,
55 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
56 usb_fill_bulk_urb(pUrb, pUsb_Dev, bulkpipe, pTransferBuf, BufSize, (usb_complete_t)Complete, pContext);
58 FILL_BULK_URB(pUrb, pUsb_Dev, bulkpipe, pTransferBuf, BufSize, Complete, pContext);
65 IN PTX_CONTEXT pTxContext,
66 IN UCHAR BulkOutPipeId,
67 IN usb_complete_t Func)
71 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
73 pUrb = pTxContext->pUrb;
76 // Store BulkOut PipeId
77 pTxContext->BulkOutPipeId = BulkOutPipeId;
79 if (pTxContext->bAggregatible)
81 pSrc = &pTxContext->TransferBuffer->Aggregation[2];
85 pSrc = (PUCHAR) pTxContext->TransferBuffer->field.WirelessPacket;
89 //Initialize a tx bulk urb
90 RTUSB_FILL_BULK_URB(pUrb,
92 usb_sndbulkpipe(pObj->pUsb_Dev, pAd->BulkOutEpAddr[BulkOutPipeId]),
94 pTxContext->BulkOutSize,
98 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
99 if (pTxContext->bAggregatible)
100 pUrb->transfer_dma = (pTxContext->data_dma + TX_BUFFER_NORMSIZE + 2);
102 pUrb->transfer_dma = pTxContext->data_dma;
104 pUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
109 VOID RTUSBInitHTTxDesc(
110 IN PRTMP_ADAPTER pAd,
111 IN PHT_TX_CONTEXT pTxContext,
112 IN UCHAR BulkOutPipeId,
113 IN ULONG BulkOutSize,
114 IN usb_complete_t Func)
118 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
120 pUrb = pTxContext->pUrb;
123 // Store BulkOut PipeId
124 pTxContext->BulkOutPipeId = BulkOutPipeId;
126 pSrc = &pTxContext->TransferBuffer->field.WirelessPacket[pTxContext->NextBulkOutPosition];
129 //Initialize a tx bulk urb
130 RTUSB_FILL_BULK_URB(pUrb,
132 usb_sndbulkpipe(pObj->pUsb_Dev, pAd->BulkOutEpAddr[BulkOutPipeId]),
138 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
139 pUrb->transfer_dma = (pTxContext->data_dma + pTxContext->NextBulkOutPosition);
140 pUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
145 VOID RTUSBInitRxDesc(
146 IN PRTMP_ADAPTER pAd,
147 IN PRX_CONTEXT pRxContext)
150 POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
154 pUrb = pRxContext->pUrb;
157 if ( pAd->BulkInMaxPacketSize == 64)
160 RX_bulk_size = MAX_RXBULK_SIZE;
162 //Initialize a rx bulk urb
163 RTUSB_FILL_BULK_URB(pUrb,
165 usb_rcvbulkpipe(pObj->pUsb_Dev, pAd->BulkInEpAddr),
166 &(pRxContext->TransferBuffer[pAd->NextRxBulkInPosition]),
167 RX_bulk_size - (pAd->NextRxBulkInPosition),
168 (usb_complete_t)RTUSBBulkRxComplete,
171 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
172 pUrb->transfer_dma = pRxContext->data_dma + pAd->NextRxBulkInPosition;
173 pUrb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
180 ========================================================================
190 ========================================================================
193 #define BULK_OUT_LOCK(pLock, IrqFlags) \
194 if(1 /*!(in_interrupt() & 0xffff0000)*/) \
195 RTMP_IRQ_LOCK((pLock), IrqFlags);
197 #define BULK_OUT_UNLOCK(pLock, IrqFlags) \
198 if(1 /*!(in_interrupt() & 0xffff0000)*/) \
199 RTMP_IRQ_UNLOCK((pLock), IrqFlags);
202 VOID RTUSBBulkOutDataPacket(
203 IN PRTMP_ADAPTER pAd,
204 IN UCHAR BulkOutPipeId,
208 PHT_TX_CONTEXT pHTTXContext;
211 PTXINFO_STRUC pTxInfo, pLastTxInfo = NULL;
213 ULONG TmpBulkEndPos, ThisBulkSize;
214 unsigned long IrqFlags = 0, IrqFlags2 = 0;
215 PUCHAR pWirelessPkt, pAppendant;
216 BOOLEAN bTxQLastRound = FALSE;
217 UCHAR allzero[4]= {0x0,0x0,0x0,0x0};
219 BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
220 if ((pAd->BulkOutPending[BulkOutPipeId] == TRUE) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX))
222 BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
225 pAd->BulkOutPending[BulkOutPipeId] = TRUE;
227 if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED)
230 pAd->BulkOutPending[BulkOutPipeId] = FALSE;
231 BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
234 BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
237 pHTTXContext = &(pAd->TxContext[BulkOutPipeId]);
239 BULK_OUT_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2);
240 if ((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition)
241 || ((pHTTXContext->ENextBulkOutPosition-8) == pHTTXContext->CurWritePosition))
243 BULK_OUT_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2);
245 BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
246 pAd->BulkOutPending[BulkOutPipeId] = FALSE;
249 RTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId));
250 RTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));
252 BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
257 RTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId));
258 RTUSB_CLEAR_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));
260 //DBGPRINT(RT_DEBUG_TRACE,("BulkOut-B:I=0x%lx, CWPos=%ld, CWRPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n", in_interrupt(),
261 // pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos, pHTTXContext->NextBulkOutPosition,
262 // pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad));
263 pHTTXContext->NextBulkOutPosition = pHTTXContext->ENextBulkOutPosition;
265 TmpBulkEndPos = pHTTXContext->NextBulkOutPosition;
266 pWirelessPkt = &pHTTXContext->TransferBuffer->field.WirelessPacket[0];
268 if ((pHTTXContext->bCopySavePad == TRUE))
270 if (RTMPEqualMemory(pHTTXContext->SavedPad, allzero,4))
272 DBGPRINT_RAW(RT_DEBUG_ERROR,("e1, allzero : %x %x %x %x %x %x %x %x \n",
273 pHTTXContext->SavedPad[0], pHTTXContext->SavedPad[1], pHTTXContext->SavedPad[2],pHTTXContext->SavedPad[3]
274 ,pHTTXContext->SavedPad[4], pHTTXContext->SavedPad[5], pHTTXContext->SavedPad[6],pHTTXContext->SavedPad[7]));
276 NdisMoveMemory(&pWirelessPkt[TmpBulkEndPos], pHTTXContext->SavedPad, 8);
277 pHTTXContext->bCopySavePad = FALSE;
278 if (pAd->bForcePrintTX == TRUE)
279 DBGPRINT(RT_DEBUG_TRACE,("RTUSBBulkOutDataPacket --> COPY PAD. CurWrite = %ld, NextBulk = %ld. ENextBulk = %ld.\n", pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition));
284 pTxInfo = (PTXINFO_STRUC)&pWirelessPkt[TmpBulkEndPos];
285 pTxWI = (PTXWI_STRUC)&pWirelessPkt[TmpBulkEndPos + TXINFO_SIZE];
287 if (pAd->bForcePrintTX == TRUE)
288 DBGPRINT(RT_DEBUG_TRACE, ("RTUSBBulkOutDataPacket AMPDU = %d.\n", pTxWI->AMPDU));
290 // add by Iverson, limit BulkOut size to 4k to pass WMM b mode 2T1R test items
291 //if ((ThisBulkSize != 0) && (pTxWI->AMPDU == 0))
292 if ((ThisBulkSize != 0) && (pTxWI->PHYMODE == MODE_CCK))
295 /*Iverson Add for AMAZON USB (RT2070 && RT3070) to pass WMM A2-T4 ~ A2-T10*/
296 if(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))
298 /*Iverson patch for WMM A5-T07 ,WirelessStaToWirelessSta do not bulk out aggregate*/
299 if(pTxWI->PacketId == 6)
301 pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
304 else if (BulkOutPipeId == 1)
306 /*BK No Limit BulkOut size .*/
307 pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
310 else if (((ThisBulkSize&0xffff8000) != 0) || (((ThisBulkSize&0x1000) == 0x1000) && (BulkOutPipeId == 0) ))
312 /*BE Limit BulkOut size to about 4k bytes.*/
313 pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
316 else if (((ThisBulkSize&0xffff8000) != 0) || (((ThisBulkSize&0x1c00) == 0x1c00) && (BulkOutPipeId == 2) ))
318 /*VI Limit BulkOut size to about 7k bytes.*/
319 pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
322 else if (((ThisBulkSize&0xffff8000) != 0) || (((ThisBulkSize&0x2500) == 0x2500) && (BulkOutPipeId == 3) ))
324 /*VO Limit BulkOut size to about 9k bytes.*/
325 pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
329 else if (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&0x1000) == 0x1000))
331 /* Limit BulkOut size to about 4k bytes.*/
332 pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
336 if (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&0x1000) == 0x1000))
338 // Limit BulkOut size to about 4k bytes.
339 pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
342 #endif // INF_AMAZON_SE //
344 else if (((pAd->BulkOutMaxPacketSize < 512) && ((ThisBulkSize&0xfffff800) != 0) ) /*|| ( (ThisBulkSize != 0) && (pTxWI->AMPDU == 0))*/)
346 // For USB 1.1 or peer which didn't support AMPDU, limit the BulkOut size.
347 // For performence in b/g mode, now just check for USB 1.1 and didn't care about the APMDU or not! 2008/06/04.
348 pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
356 //#ifdef DOT11_N_SUPPORT
357 // if(((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&0x6000) == 0x6000) || ( (ThisBulkSize != 0) && (pTxWI->AMPDU == 0)))
359 // /* AMAZON_SE: BG mode Disable BulkOut Aggregate, N mode BulkOut Aggregaet size 24K */
360 // pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
364 //#endif // DOT11_N_SUPPORT //
366 if(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && (pTxWI->AMPDU == 0))
368 if (((pAd->BulkOutMaxPacketSize < 512) && ((ThisBulkSize&0xfffff800) != 0)) ||
371 /* AMAZON_SE: RT2070 Disable BulkOut Aggregate when WMM for USB issue */
372 pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
377 else if (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&0x6000) == 0x6000))
379 // Limit BulkOut size to about 24k bytes.
380 pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
385 #endif // INF_AMAZON_SE //
387 if (((ThisBulkSize&0xffff8000) != 0) || ((ThisBulkSize&0x6000) == 0x6000))
388 { // Limit BulkOut size to about 24k bytes.
389 pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
393 else if (((pAd->BulkOutMaxPacketSize < 512) && ((ThisBulkSize&0xfffff800) != 0) ) /*|| ( (ThisBulkSize != 0) && (pTxWI->AMPDU == 0))*/)
394 { // For USB 1.1 or peer which didn't support AMPDU, limit the BulkOut size.
395 // For performence in b/g mode, now just check for USB 1.1 and didn't care about the APMDU or not! 2008/06/04.
396 pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
401 if (TmpBulkEndPos == pHTTXContext->CurWritePosition)
403 pHTTXContext->ENextBulkOutPosition = TmpBulkEndPos;
406 //PS packets use HCCA queue when dequeue from PS unicast queue (WiFi WPA2 MA9_DT1 for Marvell B STA)
407 #ifdef CONFIG_STA_SUPPORT
408 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
410 if (pTxInfo->QSEL != FIFO_EDCA)
412 printk("%s(): ====> pTxInfo->QueueSel(%d)!= FIFO_EDCA!!!!\n", __FUNCTION__, pTxInfo->QSEL);
413 printk("\tCWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n", pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad);
414 hex_dump("Wrong QSel Pkt:", (PUCHAR)&pWirelessPkt[TmpBulkEndPos], (pHTTXContext->CurWritePosition - pHTTXContext->NextBulkOutPosition));
417 #endif // CONFIG_STA_SUPPORT //
419 if (pTxInfo->USBDMATxPktLen <= 8)
421 BULK_OUT_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2);
422 DBGPRINT(RT_DEBUG_ERROR /*RT_DEBUG_TRACE*/,("e2, USBDMATxPktLen==0, Size=%ld, bCSPad=%d, CWPos=%ld, NBPos=%ld, CWRPos=%ld!\n",
423 pHTTXContext->BulkOutSize, pHTTXContext->bCopySavePad, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition, pHTTXContext->CurWriteRealPos));
425 DBGPRINT_RAW(RT_DEBUG_ERROR /*RT_DEBUG_TRACE*/,("%x %x %x %x %x %x %x %x \n",
426 pHTTXContext->SavedPad[0], pHTTXContext->SavedPad[1], pHTTXContext->SavedPad[2],pHTTXContext->SavedPad[3]
427 ,pHTTXContext->SavedPad[4], pHTTXContext->SavedPad[5], pHTTXContext->SavedPad[6],pHTTXContext->SavedPad[7]));
429 pAd->bForcePrintTX = TRUE;
430 BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
431 pAd->BulkOutPending[BulkOutPipeId] = FALSE;
432 BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
433 //DBGPRINT(RT_DEBUG_LOUD,("Out:pTxInfo->USBDMATxPktLen=%d!\n", pTxInfo->USBDMATxPktLen));
437 // Increase Total transmit byte counter
438 pAd->RalinkCounters.OneSecTransmittedByteCount += pTxWI->MPDUtotalByteCount;
439 pAd->RalinkCounters.TransmittedByteCount += pTxWI->MPDUtotalByteCount;
441 pLastTxInfo = pTxInfo;
443 // Make sure we use EDCA QUEUE.
444 #ifdef CONFIG_STA_SUPPORT
445 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
446 pTxInfo->QSEL = FIFO_EDCA; //PS packets use HCCA queue when dequeue from PS unicast queue (WiFi WPA2 MA9_DT1 for Marvell B STA)
447 #endif // CONFIG_STA_SUPPORT //
448 ThisBulkSize += (pTxInfo->USBDMATxPktLen+4);
449 TmpBulkEndPos += (pTxInfo->USBDMATxPktLen+4);
451 if (TmpBulkEndPos != pHTTXContext->CurWritePosition)
452 pTxInfo->USBDMANextVLD = 1;
454 if (pTxInfo->SwUseLastRound == 1)
456 if (pHTTXContext->CurWritePosition == 8)
457 pTxInfo->USBDMANextVLD = 0;
458 pTxInfo->SwUseLastRound = 0;
460 bTxQLastRound = TRUE;
461 pHTTXContext->ENextBulkOutPosition = 8;
464 RTMPDescriptorEndianChange((PUCHAR)pTxInfo, TYPE_TXINFO);
465 RTMPWIEndianChange((PUCHAR)pTxWI, TYPE_TXWI);
466 #endif // RT_BIG_ENDIAN //
472 RTMPDescriptorEndianChange((PUCHAR)pTxInfo, TYPE_TXINFO);
473 RTMPWIEndianChange((PUCHAR)pTxWI, TYPE_TXWI);
474 #endif // RT_BIG_ENDIAN //
478 // adjust the pTxInfo->USBDMANextVLD value of last pTxInfo.
482 RTMPDescriptorEndianChange((PUCHAR)pLastTxInfo, TYPE_TXINFO);
483 #endif // RT_BIG_ENDIAN //
484 pLastTxInfo->USBDMANextVLD = 0;
486 RTMPDescriptorEndianChange((PUCHAR)pLastTxInfo, TYPE_TXINFO);
487 #endif // RT_BIG_ENDIAN //
491 We need to copy SavedPad when following condition matched!
492 1. Not the last round of the TxQueue and
493 2. any match of following cases:
494 (1). The End Position of this bulk out is reach to the Currenct Write position and
495 the TxInfo and related header already write to the CurWritePosition.
496 =>(ENextBulkOutPosition == CurWritePosition) && (CurWriteRealPos > CurWritePosition)
498 (2). The EndPosition of the bulk out is not reach to the Current Write Position.
499 =>(ENextBulkOutPosition != CurWritePosition)
501 if ((bTxQLastRound == FALSE) &&
502 (((pHTTXContext->ENextBulkOutPosition == pHTTXContext->CurWritePosition) && (pHTTXContext->CurWriteRealPos > pHTTXContext->CurWritePosition)) ||
503 (pHTTXContext->ENextBulkOutPosition != pHTTXContext->CurWritePosition))
506 NdisMoveMemory(pHTTXContext->SavedPad, &pWirelessPkt[pHTTXContext->ENextBulkOutPosition], 8);
507 pHTTXContext->bCopySavePad = TRUE;
508 if (RTMPEqualMemory(pHTTXContext->SavedPad, allzero,4))
510 PUCHAR pBuf = &pHTTXContext->SavedPad[0];
511 DBGPRINT_RAW(RT_DEBUG_ERROR,("WARNING-Zero-3:%02x%02x%02x%02x%02x%02x%02x%02x,CWPos=%ld, CWRPos=%ld, bCW=%d, NBPos=%ld, TBPos=%ld, TBSize=%ld\n",
512 pBuf[0], pBuf[1], pBuf[2],pBuf[3],pBuf[4], pBuf[5], pBuf[6],pBuf[7], pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos,
513 pHTTXContext->bCurWriting, pHTTXContext->NextBulkOutPosition, TmpBulkEndPos, ThisBulkSize));
515 pBuf = &pWirelessPkt[pHTTXContext->CurWritePosition];
516 DBGPRINT_RAW(RT_DEBUG_ERROR,("\tCWPos=%02x%02x%02x%02x%02x%02x%02x%02x\n", pBuf[0], pBuf[1], pBuf[2],pBuf[3],pBuf[4], pBuf[5], pBuf[6],pBuf[7]));
518 //DBGPRINT(RT_DEBUG_LOUD,("ENPos==CWPos=%ld, CWRPos=%ld, bCSPad=%d!\n", pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos, pHTTXContext->bCopySavePad));
521 if (pAd->bForcePrintTX == TRUE)
522 DBGPRINT(RT_DEBUG_TRACE,("BulkOut-A:Size=%ld, CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n", ThisBulkSize, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad));
523 //DBGPRINT(RT_DEBUG_LOUD,("BulkOut-A:Size=%ld, CWPos=%ld, CWRPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d, bLRound=%d!\n", ThisBulkSize, pHTTXContext->CurWritePosition, pHTTXContext->CurWriteRealPos, pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad, bTxQLastRound));
525 // USB DMA engine requires to pad extra 4 bytes. This pad doesn't count into real bulkoutsize.
526 pAppendant = &pWirelessPkt[TmpBulkEndPos];
527 NdisZeroMemory(pAppendant, 8);
529 pHTTXContext->LastOne = TRUE;
530 if ((ThisBulkSize % pAd->BulkOutMaxPacketSize) == 0)
532 pHTTXContext->BulkOutSize = ThisBulkSize;
534 pAd->watchDogTxPendingCnt[BulkOutPipeId] = 1;
535 BULK_OUT_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags2);
537 // Init Tx context descriptor
538 RTUSBInitHTTxDesc(pAd, pHTTXContext, BulkOutPipeId, ThisBulkSize, (usb_complete_t)RTUSBBulkOutDataPacketComplete);
540 pUrb = pHTTXContext->pUrb;
541 if((ret = RTUSB_SUBMIT_URB(pUrb))!=0)
543 DBGPRINT(RT_DEBUG_ERROR, ("RTUSBBulkOutDataPacket: Submit Tx URB failed %d\n", ret));
545 BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
546 pAd->BulkOutPending[BulkOutPipeId] = FALSE;
547 pAd->watchDogTxPendingCnt[BulkOutPipeId] = 0;
548 BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
553 BULK_OUT_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
554 pHTTXContext->IRPPending = TRUE;
555 BULK_OUT_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
561 VOID RTUSBBulkOutDataPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs)
563 PHT_TX_CONTEXT pHTTXContext;
569 pHTTXContext = (PHT_TX_CONTEXT)pUrb->context;
570 pAd = pHTTXContext->pAd;
571 pObj = (POS_COOKIE) pAd->OS_Cookie;
573 // Store BulkOut PipeId
574 BulkOutPipeId = pHTTXContext->BulkOutPipeId;
575 pAd->BulkOutDataOneSecCount++;
577 switch (BulkOutPipeId)
580 pObj->ac0_dma_done_task.data = (unsigned long)pUrb;
581 tasklet_hi_schedule(&pObj->ac0_dma_done_task);
584 pObj->ac1_dma_done_task.data = (unsigned long)pUrb;
585 tasklet_hi_schedule(&pObj->ac1_dma_done_task);
588 pObj->ac2_dma_done_task.data = (unsigned long)pUrb;
589 tasklet_hi_schedule(&pObj->ac2_dma_done_task);
592 pObj->ac3_dma_done_task.data = (unsigned long)pUrb;
593 tasklet_hi_schedule(&pObj->ac3_dma_done_task);
596 pObj->hcca_dma_done_task.data = (unsigned long)pUrb;
597 tasklet_hi_schedule(&pObj->hcca_dma_done_task);
604 ========================================================================
612 Note: NULL frame use BulkOutPipeId = 0
614 ========================================================================
616 VOID RTUSBBulkOutNullFrame(
617 IN PRTMP_ADAPTER pAd)
619 PTX_CONTEXT pNullContext = &(pAd->NullContext);
622 unsigned long IrqFlags;
624 RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags);
625 if ((pAd->BulkOutPending[0] == TRUE) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX))
627 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);
630 pAd->BulkOutPending[0] = TRUE;
631 pAd->watchDogTxPendingCnt[0] = 1;
632 pNullContext->IRPPending = TRUE;
633 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);
635 // Increase Total transmit byte counter
636 pAd->RalinkCounters.TransmittedByteCount += pNullContext->BulkOutSize;
639 // Clear Null frame bulk flag
640 RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL);
643 RTMPDescriptorEndianChange((PUCHAR)pNullContext->TransferBuffer, TYPE_TXINFO);
644 #endif // RT_BIG_ENDIAN //
646 // Init Tx context descriptor
647 RTUSBInitTxDesc(pAd, pNullContext, 0, (usb_complete_t)RTUSBBulkOutNullFrameComplete);
649 pUrb = pNullContext->pUrb;
650 if((ret = RTUSB_SUBMIT_URB(pUrb))!=0)
652 RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags);
653 pAd->BulkOutPending[0] = FALSE;
654 pAd->watchDogTxPendingCnt[0] = 0;
655 pNullContext->IRPPending = FALSE;
656 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);
658 DBGPRINT(RT_DEBUG_ERROR, ("RTUSBBulkOutNullFrame: Submit Tx URB failed %d\n", ret));
664 // NULL frame use BulkOutPipeId = 0
665 VOID RTUSBBulkOutNullFrameComplete(purbb_t pUrb, struct pt_regs *pt_regs)
668 PTX_CONTEXT pNullContext;
673 pNullContext = (PTX_CONTEXT)pUrb->context;
674 pAd = pNullContext->pAd;
675 Status = pUrb->status;
677 pObj = (POS_COOKIE) pAd->OS_Cookie;
678 pObj->null_frame_complete_task.data = (unsigned long)pUrb;
679 tasklet_hi_schedule(&pObj->null_frame_complete_task);
684 ========================================================================
692 Note: MLME use BulkOutPipeId = 0
694 ========================================================================
696 VOID RTUSBBulkOutMLMEPacket(
697 IN PRTMP_ADAPTER pAd,
700 PTX_CONTEXT pMLMEContext;
703 unsigned long IrqFlags;
705 pMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[pAd->MgmtRing.TxDmaIdx].AllocVa;
706 pUrb = pMLMEContext->pUrb;
708 if ((pAd->MgmtRing.TxSwFreeIdx >= MGMT_RING_SIZE) ||
709 (pMLMEContext->InUse == FALSE) ||
710 (pMLMEContext->bWaitingBulkOut == FALSE))
714 // Clear MLME bulk flag
715 RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);
721 RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
722 if ((pAd->BulkOutPending[MGMTPIPEIDX] == TRUE) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX))
724 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
728 pAd->BulkOutPending[MGMTPIPEIDX] = TRUE;
729 pAd->watchDogTxPendingCnt[MGMTPIPEIDX] = 1;
730 pMLMEContext->IRPPending = TRUE;
731 pMLMEContext->bWaitingBulkOut = FALSE;
732 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
734 // Increase Total transmit byte counter
735 pAd->RalinkCounters.TransmittedByteCount += pMLMEContext->BulkOutSize;
737 // Clear MLME bulk flag
738 RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);
741 RTMPDescriptorEndianChange((PUCHAR)pMLMEContext->TransferBuffer, TYPE_TXINFO);
742 #endif // RT_BIG_ENDIAN //
744 // Init Tx context descriptor
745 RTUSBInitTxDesc(pAd, pMLMEContext, MGMTPIPEIDX, (usb_complete_t)RTUSBBulkOutMLMEPacketComplete);
747 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
748 //For mgmt urb buffer, because we use sk_buff, so we need to notify the USB controller do dma mapping.
749 pUrb->transfer_dma = 0;
750 pUrb->transfer_flags &= (~URB_NO_TRANSFER_DMA_MAP);
753 pUrb = pMLMEContext->pUrb;
754 if((ret = RTUSB_SUBMIT_URB(pUrb))!=0)
756 DBGPRINT(RT_DEBUG_ERROR, ("RTUSBBulkOutMLMEPacket: Submit MLME URB failed %d\n", ret));
757 RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
758 pAd->BulkOutPending[MGMTPIPEIDX] = FALSE;
759 pAd->watchDogTxPendingCnt[MGMTPIPEIDX] = 0;
760 pMLMEContext->IRPPending = FALSE;
761 pMLMEContext->bWaitingBulkOut = TRUE;
762 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
767 //DBGPRINT_RAW(RT_DEBUG_INFO, ("<---RTUSBBulkOutMLMEPacket \n"));
768 // printk("<---RTUSBBulkOutMLMEPacket,Cpu=%d!, Dma=%d, SwIdx=%d!\n", pAd->MgmtRing.TxCpuIdx, pAd->MgmtRing.TxDmaIdx, pAd->MgmtRing.TxSwFreeIdx);
772 VOID RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs)
774 PTX_CONTEXT pMLMEContext;
780 //DBGPRINT_RAW(RT_DEBUG_INFO, ("--->RTUSBBulkOutMLMEPacketComplete\n"));
781 pMLMEContext = (PTX_CONTEXT)pUrb->context;
782 pAd = pMLMEContext->pAd;
783 pObj = (POS_COOKIE)pAd->OS_Cookie;
784 Status = pUrb->status;
785 index = pMLMEContext->SelfIdx;
787 pObj->mgmt_dma_done_task.data = (unsigned long)pUrb;
788 tasklet_hi_schedule(&pObj->mgmt_dma_done_task);
793 ========================================================================
801 Note: PsPoll use BulkOutPipeId = 0
803 ========================================================================
805 VOID RTUSBBulkOutPsPoll(
806 IN PRTMP_ADAPTER pAd)
808 PTX_CONTEXT pPsPollContext = &(pAd->PsPollContext);
811 unsigned long IrqFlags;
813 RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags);
814 if ((pAd->BulkOutPending[0] == TRUE) || RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_TX))
816 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);
819 pAd->BulkOutPending[0] = TRUE;
820 pAd->watchDogTxPendingCnt[0] = 1;
821 pPsPollContext->IRPPending = TRUE;
822 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);
825 // Clear PS-Poll bulk flag
826 RTUSB_CLEAR_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL);
829 RTMPDescriptorEndianChange((PUCHAR)pPsPollContext->TransferBuffer, TYPE_TXINFO);
830 #endif // RT_BIG_ENDIAN //
832 // Init Tx context descriptor
833 RTUSBInitTxDesc(pAd, pPsPollContext, MGMTPIPEIDX, (usb_complete_t)RTUSBBulkOutPsPollComplete);
835 pUrb = pPsPollContext->pUrb;
836 if((ret = RTUSB_SUBMIT_URB(pUrb))!=0)
838 RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], IrqFlags);
839 pAd->BulkOutPending[0] = FALSE;
840 pAd->watchDogTxPendingCnt[0] = 0;
841 pPsPollContext->IRPPending = FALSE;
842 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], IrqFlags);
844 DBGPRINT(RT_DEBUG_ERROR, ("RTUSBBulkOutPsPoll: Submit Tx URB failed %d\n", ret));
850 // PS-Poll frame use BulkOutPipeId = 0
851 VOID RTUSBBulkOutPsPollComplete(purbb_t pUrb,struct pt_regs *pt_regs)
854 PTX_CONTEXT pPsPollContext;
859 pPsPollContext= (PTX_CONTEXT)pUrb->context;
860 pAd = pPsPollContext->pAd;
861 Status = pUrb->status;
862 pObj = (POS_COOKIE) pAd->OS_Cookie;
863 pObj->pspoll_frame_complete_task.data = (unsigned long)pUrb;
864 tasklet_hi_schedule(&pObj->pspoll_frame_complete_task);
868 VOID DoBulkIn(IN RTMP_ADAPTER *pAd)
870 PRX_CONTEXT pRxContext;
873 unsigned long IrqFlags;
875 RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
876 pRxContext = &(pAd->RxContext[pAd->NextRxBulkInIndex]);
877 if ((pAd->PendingRx > 0) || (pRxContext->Readable == TRUE) || (pRxContext->InUse == TRUE))
879 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
882 pRxContext->InUse = TRUE;
883 pRxContext->IRPPending = TRUE;
886 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
888 // Init Rx context descriptor
889 NdisZeroMemory(pRxContext->TransferBuffer, pRxContext->BulkInOffset);
890 RTUSBInitRxDesc(pAd, pRxContext);
892 pUrb = pRxContext->pUrb;
893 if ((ret = RTUSB_SUBMIT_URB(pUrb))!=0)
896 RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
897 pRxContext->InUse = FALSE;
898 pRxContext->IRPPending = FALSE;
901 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
902 DBGPRINT(RT_DEBUG_ERROR, ("RTUSBBulkReceive: Submit Rx URB failed %d\n", ret));
906 ASSERT((pRxContext->InUse == pRxContext->IRPPending));
907 //printk("BIDone, Pend=%d,BIIdx=%d,BIRIdx=%d!\n", pAd->PendingRx, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex);
913 ========================================================================
916 USB_RxPacket initializes a URB and uses the Rx IRP to submit it
917 to USB. It checks if an Rx Descriptor is available and passes the
918 the coresponding buffer to be filled. If no descriptor is available
919 fails the request. When setting the completion routine we pass our
920 Adapter Object as Context.
925 TRUE found matched tuple cache
926 FALSE no matched found
930 ========================================================================
932 #define fRTMP_ADAPTER_NEED_STOP_RX \
933 (fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS | \
934 fRTMP_ADAPTER_RADIO_OFF | fRTMP_ADAPTER_RESET_IN_PROGRESS | \
935 fRTMP_ADAPTER_REMOVE_IN_PROGRESS | fRTMP_ADAPTER_BULKIN_RESET)
937 #define fRTMP_ADAPTER_NEED_STOP_HANDLE_RX \
938 (fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS | \
939 fRTMP_ADAPTER_RADIO_OFF | fRTMP_ADAPTER_RESET_IN_PROGRESS | \
940 fRTMP_ADAPTER_REMOVE_IN_PROGRESS)
942 VOID RTUSBBulkReceive(
943 IN PRTMP_ADAPTER pAd)
945 PRX_CONTEXT pRxContext;
946 unsigned long IrqFlags;
950 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_HANDLE_RX))
956 RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
957 pRxContext = &(pAd->RxContext[pAd->NextRxBulkInReadIndex]);
958 if (((pRxContext->InUse == FALSE) && (pRxContext->Readable == TRUE)) &&
959 (pRxContext->bRxHandling == FALSE))
961 pRxContext->bRxHandling = TRUE;
962 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
964 // read RxContext, Since not
965 #ifdef CONFIG_STA_SUPPORT
966 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
967 STARxDoneInterruptHandle(pAd, TRUE);
968 #endif // CONFIG_STA_SUPPORT //
970 // Finish to handle this bulkIn buffer.
971 RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
972 pRxContext->BulkInOffset = 0;
973 pRxContext->Readable = FALSE;
974 pRxContext->bRxHandling = FALSE;
975 pAd->ReadPosition = 0;
976 pAd->TransferBufferLength = 0;
977 INC_RING_INDEX(pAd->NextRxBulkInReadIndex, RX_RING_SIZE);
978 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
983 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
988 if (!(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NEED_STOP_RX)))
995 ========================================================================
998 This routine process Rx Irp and call rx complete function.
1001 DeviceObject Pointer to the device object for next lower
1002 device. DeviceObject passed in here belongs to
1003 the next lower driver in the stack because we
1004 were invoked via IoCallDriver in USB_RxPacket
1005 AND it is not OUR device object
1006 Irp Ptr to completed IRP
1007 Context Ptr to our Adapter object (context specified
1008 in IoSetCompletionRoutine
1011 Always returns STATUS_MORE_PROCESSING_REQUIRED
1014 Always returns STATUS_MORE_PROCESSING_REQUIRED
1015 ========================================================================
1017 VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs)
1019 // use a receive tasklet to handle received packets;
1020 // or sometimes hardware IRQ will be disabled here, so we can not
1021 // use spin_lock_bh()/spin_unlock_bh() after IRQ is disabled. :<
1022 PRX_CONTEXT pRxContext;
1027 pRxContext = (PRX_CONTEXT)pUrb->context;
1028 pAd = pRxContext->pAd;
1029 pObj = (POS_COOKIE) pAd->OS_Cookie;
1031 pObj->rx_done_task.data = (unsigned long)pUrb;
1032 tasklet_hi_schedule(&pObj->rx_done_task);
1037 ========================================================================
1039 Routine Description:
1047 ========================================================================
1049 VOID RTUSBKickBulkOut(
1050 IN PRTMP_ADAPTER pAd)
1052 // BulkIn Reset will reset whole USB PHY. So we need to make sure fRTMP_ADAPTER_BULKIN_RESET not flaged.
1053 if (!RTMP_TEST_FLAG(pAd ,fRTMP_ADAPTER_NEED_STOP_TX)
1056 #endif // RALINK_ATE //
1059 // 2. PS-Poll frame is next
1060 if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL))
1062 RTUSBBulkOutPsPoll(pAd);
1065 // 5. Mlme frame is next
1066 else if ((RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME)) &&
1067 (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE))
1069 RTUSBBulkOutMLMEPacket(pAd, pAd->MgmtRing.TxDmaIdx);
1072 // 6. Data frame normal is next
1073 if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL))
1075 if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) ||
1076 (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
1079 RTUSBBulkOutDataPacket(pAd, 0, pAd->NextBulkOutIndex[0]);
1082 if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_2))
1084 if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) ||
1085 (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
1088 RTUSBBulkOutDataPacket(pAd, 1, pAd->NextBulkOutIndex[1]);
1091 if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_3))
1093 if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) ||
1094 (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
1097 RTUSBBulkOutDataPacket(pAd, 2, pAd->NextBulkOutIndex[2]);
1100 if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_4))
1102 if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) ||
1103 (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
1106 RTUSBBulkOutDataPacket(pAd, 3, pAd->NextBulkOutIndex[3]);
1109 //PS packets use HCCA queue when dequeue from PS unicast queue (WiFi WPA2 MA9_DT1 for Marvell B STA)
1110 if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL_5))
1112 if (((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS)) ||
1113 (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
1119 // 7. Null frame is the last
1120 else if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NULL))
1122 if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS))
1124 RTUSBBulkOutNullFrame(pAd);
1128 // 8. No data avaliable
1135 /* If the mode is in ATE mode. */
1136 else if((ATE_ON(pAd)) &&
1137 !RTMP_TEST_FLAG(pAd ,fRTMP_ADAPTER_NEED_STOP_TX))// PETER : watch out !
1139 if (RTUSB_TEST_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_ATE))
1141 ATE_RTUSBBulkOutDataPacket(pAd, 0);
1144 #endif // RALINK_ATE //
1149 ========================================================================
1151 Routine Description:
1152 Call from Reset action after BulkOut failed.
1159 ========================================================================
1161 VOID RTUSBCleanUpDataBulkOutQueue(
1162 IN PRTMP_ADAPTER pAd)
1165 PHT_TX_CONTEXT pTxContext;
1167 DBGPRINT(RT_DEBUG_TRACE, ("--->CleanUpDataBulkOutQueue\n"));
1169 for (Idx = 0; Idx < 4; Idx++)
1171 pTxContext = &pAd->TxContext[Idx];
1173 pTxContext->CurWritePosition = pTxContext->NextBulkOutPosition;
1174 pTxContext->LastOne = FALSE;
1175 NdisAcquireSpinLock(&pAd->BulkOutLock[Idx]);
1176 pAd->BulkOutPending[Idx] = FALSE;
1177 NdisReleaseSpinLock(&pAd->BulkOutLock[Idx]);
1180 DBGPRINT(RT_DEBUG_TRACE, ("<---CleanUpDataBulkOutQueue\n"));
1184 ========================================================================
1186 Routine Description:
1194 ========================================================================
1196 VOID RTUSBCleanUpMLMEBulkOutQueue(
1197 IN PRTMP_ADAPTER pAd)
1199 DBGPRINT(RT_DEBUG_TRACE, ("--->CleanUpMLMEBulkOutQueue\n"));
1200 DBGPRINT(RT_DEBUG_TRACE, ("<---CleanUpMLMEBulkOutQueue\n"));
1205 ========================================================================
1207 Routine Description:
1216 ========================================================================
1218 VOID RTUSBCancelPendingIRPs(
1219 IN PRTMP_ADAPTER pAd)
1221 RTUSBCancelPendingBulkInIRP(pAd);
1222 RTUSBCancelPendingBulkOutIRP(pAd);
1226 ========================================================================
1228 Routine Description:
1236 ========================================================================
1238 VOID RTUSBCancelPendingBulkInIRP(
1239 IN PRTMP_ADAPTER pAd)
1241 PRX_CONTEXT pRxContext;
1244 DBGPRINT_RAW(RT_DEBUG_TRACE, ("--->RTUSBCancelPendingBulkInIRP\n"));
1245 for ( i = 0; i < (RX_RING_SIZE); i++)
1247 pRxContext = &(pAd->RxContext[i]);
1248 if(pRxContext->IRPPending == TRUE)
1250 RTUSB_UNLINK_URB(pRxContext->pUrb);
1251 pRxContext->IRPPending = FALSE;
1252 pRxContext->InUse = FALSE;
1253 //NdisInterlockedDecrement(&pAd->PendingRx);
1257 DBGPRINT_RAW(RT_DEBUG_TRACE, ("<---RTUSBCancelPendingBulkInIRP\n"));
1262 ========================================================================
1264 Routine Description:
1272 ========================================================================
1274 VOID RTUSBCancelPendingBulkOutIRP(
1275 IN PRTMP_ADAPTER pAd)
1277 PHT_TX_CONTEXT pHTTXContext;
1278 PTX_CONTEXT pMLMEContext;
1279 PTX_CONTEXT pBeaconContext;
1280 PTX_CONTEXT pNullContext;
1281 PTX_CONTEXT pPsPollContext;
1282 PTX_CONTEXT pRTSContext;
1284 // unsigned int IrqFlags;
1285 // NDIS_SPIN_LOCK *pLock;
1286 // BOOLEAN *pPending;
1289 // pLock = &pAd->BulkOutLock[MGMTPIPEIDX];
1290 // pPending = &pAd->BulkOutPending[MGMTPIPEIDX];
1292 for (Idx = 0; Idx < 4; Idx++)
1294 pHTTXContext = &(pAd->TxContext[Idx]);
1296 if (pHTTXContext->IRPPending == TRUE)
1299 // Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself
1300 // remove it from the HeadPendingSendList and NULL out HeadPendingSendList
1301 // when the last IRP on the list has been cancelled; that's how we exit this loop
1304 RTUSB_UNLINK_URB(pHTTXContext->pUrb);
1306 // Sleep 200 microseconds to give cancellation time to work
1311 pHTTXContext->bCopySavePad = 0;
1312 pHTTXContext->CurWritePosition = 0;
1313 pHTTXContext->CurWriteRealPos = 0;
1314 pHTTXContext->bCurWriting = FALSE;
1315 pHTTXContext->NextBulkOutPosition = 0;
1316 pHTTXContext->ENextBulkOutPosition = 0;
1317 #endif // RALINK_ATE //
1318 pAd->BulkOutPending[Idx] = FALSE;
1321 //RTMP_IRQ_LOCK(pLock, IrqFlags);
1322 for (i = 0; i < MGMT_RING_SIZE; i++)
1324 pMLMEContext = (PTX_CONTEXT)pAd->MgmtRing.Cell[i].AllocVa;
1325 if(pMLMEContext && (pMLMEContext->IRPPending == TRUE))
1328 // Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself
1329 // remove it from the HeadPendingSendList and NULL out HeadPendingSendList
1330 // when the last IRP on the list has been cancelled; that's how we exit this loop
1333 RTUSB_UNLINK_URB(pMLMEContext->pUrb);
1334 pMLMEContext->IRPPending = FALSE;
1336 // Sleep 200 microsecs to give cancellation time to work
1340 pAd->BulkOutPending[MGMTPIPEIDX] = FALSE;
1341 //RTMP_IRQ_UNLOCK(pLock, IrqFlags);
1344 for (i = 0; i < BEACON_RING_SIZE; i++)
1346 pBeaconContext = &(pAd->BeaconContext[i]);
1348 if(pBeaconContext->IRPPending == TRUE)
1351 // Get the USB_CONTEXT and cancel it's IRP; the completion routine will itself
1352 // remove it from the HeadPendingSendList and NULL out HeadPendingSendList
1353 // when the last IRP on the list has been cancelled; that's how we exit this loop
1356 RTUSB_UNLINK_URB(pBeaconContext->pUrb);
1358 // Sleep 200 microsecs to give cancellation time to work
1363 pNullContext = &(pAd->NullContext);
1364 if (pNullContext->IRPPending == TRUE)
1365 RTUSB_UNLINK_URB(pNullContext->pUrb);
1367 pRTSContext = &(pAd->RTSContext);
1368 if (pRTSContext->IRPPending == TRUE)
1369 RTUSB_UNLINK_URB(pRTSContext->pUrb);
1371 pPsPollContext = &(pAd->PsPollContext);
1372 if (pPsPollContext->IRPPending == TRUE)
1373 RTUSB_UNLINK_URB(pPsPollContext->pUrb);
1375 for (Idx = 0; Idx < 4; Idx++)
1377 NdisAcquireSpinLock(&pAd->BulkOutLock[Idx]);
1378 pAd->BulkOutPending[Idx] = FALSE;
1379 NdisReleaseSpinLock(&pAd->BulkOutLock[Idx]);