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 *************************************************************************
31 Ralink USB driver Tx/Rx functions.
35 -------- ---------- ----------------------------------------------
36 Jan 03-25-2006 created
39 #include "../rt_config.h"
41 extern UCHAR Phy11BGNextRateUpward[]; // defined in mlme.c
42 extern UCHAR EpToQueue[];
44 VOID REPORT_AMSDU_FRAMES_TO_LLC(
54 /* allocate a rx packet */
55 pSkb = dev_alloc_skb(RX_BUFFER_AGGRESIZE);
56 pPacket = (PNDIS_PACKET)OSPKT_TO_RTPKT(pSkb);
60 /* convert 802.11 to 802.3 packet */
61 pSkb->dev = get_netdev_from_bssid(pAd, BSS0);
62 RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);
63 deaggregate_AMSDU_announce(pAd, pPacket, pData, DataSize);
67 DBGPRINT(RT_DEBUG_ERROR,("Can't allocate skb\n"));
71 NDIS_STATUS RTUSBFreeDescriptorRequest(
73 IN UCHAR BulkOutPipeId,
74 IN UINT32 NumberRequired)
76 // UCHAR FreeNumber = 0;
78 NDIS_STATUS Status = NDIS_STATUS_FAILURE;
79 unsigned long IrqFlags;
80 HT_TX_CONTEXT *pHTTXContext;
83 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
84 RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
85 if ((pHTTXContext->CurWritePosition < pHTTXContext->NextBulkOutPosition) && ((pHTTXContext->CurWritePosition + NumberRequired + LOCAL_TXBUF_SIZE) > pHTTXContext->NextBulkOutPosition))
88 RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));
90 else if ((pHTTXContext->CurWritePosition == 8) && (pHTTXContext->NextBulkOutPosition < (NumberRequired + LOCAL_TXBUF_SIZE)))
92 RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));
94 else if (pHTTXContext->bCurWriting == TRUE)
96 DBGPRINT(RT_DEBUG_TRACE,("RTUSBFreeD c3 --> QueIdx=%d, CWPos=%ld, NBOutPos=%ld!\n", BulkOutPipeId, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition));
97 RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));
101 Status = NDIS_STATUS_SUCCESS;
103 RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
109 NDIS_STATUS RTUSBFreeDescriptorRelease(
110 IN RTMP_ADAPTER *pAd,
111 IN UCHAR BulkOutPipeId)
113 unsigned long IrqFlags;
114 HT_TX_CONTEXT *pHTTXContext;
116 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
117 RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
118 pHTTXContext->bCurWriting = FALSE;
119 RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
121 return (NDIS_STATUS_SUCCESS);
125 BOOLEAN RTUSBNeedQueueBackForAgg(
126 IN RTMP_ADAPTER *pAd,
127 IN UCHAR BulkOutPipeId)
129 unsigned long IrqFlags;
130 HT_TX_CONTEXT *pHTTXContext;
131 BOOLEAN needQueBack = FALSE;
133 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
135 RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
136 if ((pHTTXContext->IRPPending == TRUE) /*&& (pAd->TxSwQueue[BulkOutPipeId].Number == 0) */)
139 if ((pHTTXContext->CurWritePosition <= 8) &&
140 (pHTTXContext->NextBulkOutPosition > 8 && (pHTTXContext->NextBulkOutPosition+MAX_AGGREGATION_SIZE) < MAX_TXBULK_LIMIT))
144 else if ((pHTTXContext->CurWritePosition < pHTTXContext->NextBulkOutPosition) &&
145 ((pHTTXContext->NextBulkOutPosition + MAX_AGGREGATION_SIZE) < MAX_TXBULK_LIMIT))
150 if ((pHTTXContext->CurWritePosition < pHTTXContext->ENextBulkOutPosition) &&
151 (((pHTTXContext->ENextBulkOutPosition+MAX_AGGREGATION_SIZE) < MAX_TXBULK_LIMIT) || (pHTTXContext->CurWritePosition > MAX_AGGREGATION_SIZE)))
156 else if ((pHTTXContext->CurWritePosition > pHTTXContext->ENextBulkOutPosition) &&
157 ((pHTTXContext->ENextBulkOutPosition + MAX_AGGREGATION_SIZE) < pHTTXContext->CurWritePosition))
162 RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
170 ========================================================================
182 ========================================================================
184 VOID RTUSBRejectPendingPackets(
185 IN PRTMP_ADAPTER pAd)
189 PNDIS_PACKET pPacket;
190 PQUEUE_HEADER pQueue;
193 for (Index = 0; Index < 4; Index++)
195 NdisAcquireSpinLock(&pAd->TxSwQueueLock[Index]);
196 while (pAd->TxSwQueue[Index].Head != NULL)
198 pQueue = (PQUEUE_HEADER) &(pAd->TxSwQueue[Index]);
199 pEntry = RemoveHeadQueue(pQueue);
200 pPacket = QUEUE_ENTRY_TO_PACKET(pEntry);
201 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
203 NdisReleaseSpinLock(&pAd->TxSwQueueLock[Index]);
209 VOID RTMPWriteTxInfo(
210 IN PRTMP_ADAPTER pAd,
211 IN PTXINFO_STRUC pTxInfo,
212 IN USHORT USBDMApktLen,
218 pTxInfo->USBDMATxPktLen = USBDMApktLen;
219 pTxInfo->QSEL = QueueSel;
220 if (QueueSel != FIFO_EDCA)
221 DBGPRINT(RT_DEBUG_TRACE, ("====> QueueSel != FIFO_EDCA<============\n"));
222 pTxInfo->USBDMANextVLD = FALSE; //NextValid; // Need to check with Jan about this.
223 pTxInfo->USBDMATxburst = TxBurst;
225 pTxInfo->SwUseLastRound = 0;