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[];
45 VOID REPORT_AMSDU_FRAMES_TO_LLC(
55 /* allocate a rx packet */
56 pSkb = dev_alloc_skb(RX_BUFFER_AGGRESIZE);
57 pPacket = (PNDIS_PACKET)OSPKT_TO_RTPKT(pSkb);
61 /* convert 802.11 to 802.3 packet */
62 pSkb->dev = get_netdev_from_bssid(pAd, BSS0);
63 RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);
64 deaggregate_AMSDU_announce(pAd, pPacket, pData, DataSize);
68 DBGPRINT(RT_DEBUG_ERROR,("Can't allocate skb\n"));
72 NDIS_STATUS RTUSBFreeDescriptorRequest(
74 IN UCHAR BulkOutPipeId,
75 IN UINT32 NumberRequired)
77 // UCHAR FreeNumber = 0;
79 NDIS_STATUS Status = NDIS_STATUS_FAILURE;
80 unsigned long IrqFlags;
81 HT_TX_CONTEXT *pHTTXContext;
84 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
85 RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
86 if ((pHTTXContext->CurWritePosition < pHTTXContext->NextBulkOutPosition) && ((pHTTXContext->CurWritePosition + NumberRequired + LOCAL_TXBUF_SIZE) > pHTTXContext->NextBulkOutPosition))
89 RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));
91 else if ((pHTTXContext->CurWritePosition == 8) && (pHTTXContext->NextBulkOutPosition < (NumberRequired + LOCAL_TXBUF_SIZE)))
93 RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));
95 else if (pHTTXContext->bCurWriting == TRUE)
97 DBGPRINT(RT_DEBUG_TRACE,("RTUSBFreeD c3 --> QueIdx=%d, CWPos=%ld, NBOutPos=%ld!\n", BulkOutPipeId, pHTTXContext->CurWritePosition, pHTTXContext->NextBulkOutPosition));
98 RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));
102 Status = NDIS_STATUS_SUCCESS;
104 RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
111 NDIS_STATUS RTUSBFreeDescriptorRelease(
112 IN RTMP_ADAPTER *pAd,
113 IN UCHAR BulkOutPipeId)
115 unsigned long IrqFlags;
116 HT_TX_CONTEXT *pHTTXContext;
118 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
119 RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
120 pHTTXContext->bCurWriting = FALSE;
121 RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
123 return (NDIS_STATUS_SUCCESS);
127 BOOLEAN RTUSBNeedQueueBackForAgg(
128 IN RTMP_ADAPTER *pAd,
129 IN UCHAR BulkOutPipeId)
131 unsigned long IrqFlags;
132 HT_TX_CONTEXT *pHTTXContext;
133 BOOLEAN needQueBack = FALSE;
135 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
137 RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
138 if ((pHTTXContext->IRPPending == TRUE) /*&& (pAd->TxSwQueue[BulkOutPipeId].Number == 0) */)
140 if ((pHTTXContext->CurWritePosition < pHTTXContext->ENextBulkOutPosition) &&
141 (((pHTTXContext->ENextBulkOutPosition+MAX_AGGREGATION_SIZE) < MAX_TXBULK_LIMIT) || (pHTTXContext->CurWritePosition > MAX_AGGREGATION_SIZE)))
145 else if ((pHTTXContext->CurWritePosition > pHTTXContext->ENextBulkOutPosition) &&
146 ((pHTTXContext->ENextBulkOutPosition + MAX_AGGREGATION_SIZE) < pHTTXContext->CurWritePosition))
151 RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
159 ========================================================================
171 ========================================================================
173 VOID RTUSBRejectPendingPackets(
174 IN PRTMP_ADAPTER pAd)
178 PNDIS_PACKET pPacket;
179 PQUEUE_HEADER pQueue;
182 for (Index = 0; Index < 4; Index++)
184 NdisAcquireSpinLock(&pAd->TxSwQueueLock[Index]);
185 while (pAd->TxSwQueue[Index].Head != NULL)
187 pQueue = (PQUEUE_HEADER) &(pAd->TxSwQueue[Index]);
188 pEntry = RemoveHeadQueue(pQueue);
189 pPacket = QUEUE_ENTRY_TO_PACKET(pEntry);
190 RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
192 NdisReleaseSpinLock(&pAd->TxSwQueueLock[Index]);
198 VOID RTMPWriteTxInfo(
199 IN PRTMP_ADAPTER pAd,
200 IN PTXINFO_STRUC pTxInfo,
201 IN USHORT USBDMApktLen,
207 pTxInfo->USBDMATxPktLen = USBDMApktLen;
208 pTxInfo->QSEL = QueueSel;
209 if (QueueSel != FIFO_EDCA)
210 DBGPRINT(RT_DEBUG_TRACE, ("====> QueueSel != FIFO_EDCA<============\n"));
211 pTxInfo->USBDMANextVLD = FALSE; //NextValid; // Need to check with Jan about this.
212 pTxInfo->USBDMATxburst = TxBurst;
214 pTxInfo->SwUseLastRound = 0;