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
42 #include "../rt_config.h"
44 extern UCHAR Phy11BGNextRateUpward
[]; // defined in mlme.c
45 extern UCHAR EpToQueue
[];
47 VOID
REPORT_AMSDU_FRAMES_TO_LLC(IN PRTMP_ADAPTER pAd
,
48 IN PUCHAR pData
, IN ULONG DataSize
)
55 /* allocate a rx packet */
56 pSkb
= dev_alloc_skb(RX_BUFFER_AGGRESIZE
);
57 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
);
65 DBGPRINT(RT_DEBUG_ERROR
, ("Can't allocate skb\n"));
70 ========================================================================
73 This subroutine will scan through releative ring descriptor to find
74 out avaliable free ring descriptor and compare with request size.
77 pAd Pointer to our adapter
78 RingType Selected Ring
81 NDIS_STATUS_FAILURE Not enough free descriptor
82 NDIS_STATUS_SUCCESS Enough free descriptor
86 ========================================================================
88 NDIS_STATUS
RTUSBFreeDescriptorRequest(IN PRTMP_ADAPTER pAd
,
89 IN UCHAR BulkOutPipeId
,
90 IN UINT32 NumberRequired
)
92 // UCHAR FreeNumber = 0;
94 NDIS_STATUS Status
= NDIS_STATUS_FAILURE
;
95 unsigned long IrqFlags
;
96 HT_TX_CONTEXT
*pHTTXContext
;
98 pHTTXContext
= &pAd
->TxContext
[BulkOutPipeId
];
99 RTMP_IRQ_LOCK(&pAd
->TxContextQueueLock
[BulkOutPipeId
], IrqFlags
);
100 if ((pHTTXContext
->CurWritePosition
< pHTTXContext
->NextBulkOutPosition
)
102 ((pHTTXContext
->CurWritePosition
+ NumberRequired
+
103 LOCAL_TXBUF_SIZE
) > pHTTXContext
->NextBulkOutPosition
)) {
105 RTUSB_SET_BULK_FLAG(pAd
,
106 (fRTUSB_BULK_OUT_DATA_NORMAL
<<
108 } else if ((pHTTXContext
->CurWritePosition
== 8)
109 && (pHTTXContext
->NextBulkOutPosition
<
110 (NumberRequired
+ LOCAL_TXBUF_SIZE
))) {
111 RTUSB_SET_BULK_FLAG(pAd
,
112 (fRTUSB_BULK_OUT_DATA_NORMAL
<<
114 } else if (pHTTXContext
->bCurWriting
== TRUE
) {
115 DBGPRINT(RT_DEBUG_TRACE
,
116 ("RTUSBFreeD c3 --> QueIdx=%d, CWPos=%ld, NBOutPos=%ld!\n",
117 BulkOutPipeId
, pHTTXContext
->CurWritePosition
,
118 pHTTXContext
->NextBulkOutPosition
));
119 RTUSB_SET_BULK_FLAG(pAd
,
120 (fRTUSB_BULK_OUT_DATA_NORMAL
<<
123 Status
= NDIS_STATUS_SUCCESS
;
125 RTMP_IRQ_UNLOCK(&pAd
->TxContextQueueLock
[BulkOutPipeId
], IrqFlags
);
130 NDIS_STATUS
RTUSBFreeDescriptorRelease(IN RTMP_ADAPTER
* pAd
,
131 IN UCHAR BulkOutPipeId
)
133 unsigned long IrqFlags
;
134 HT_TX_CONTEXT
*pHTTXContext
;
136 pHTTXContext
= &pAd
->TxContext
[BulkOutPipeId
];
137 RTMP_IRQ_LOCK(&pAd
->TxContextQueueLock
[BulkOutPipeId
], IrqFlags
);
138 pHTTXContext
->bCurWriting
= FALSE
;
139 RTMP_IRQ_UNLOCK(&pAd
->TxContextQueueLock
[BulkOutPipeId
], IrqFlags
);
141 return (NDIS_STATUS_SUCCESS
);
144 BOOLEAN
RTUSBNeedQueueBackForAgg(IN RTMP_ADAPTER
* pAd
, IN UCHAR BulkOutPipeId
)
146 unsigned long IrqFlags
;
147 HT_TX_CONTEXT
*pHTTXContext
;
148 BOOLEAN needQueBack
= FALSE
;
150 pHTTXContext
= &pAd
->TxContext
[BulkOutPipeId
];
152 RTMP_IRQ_LOCK(&pAd
->TxContextQueueLock
[BulkOutPipeId
], IrqFlags
);
153 if ((pHTTXContext
->IRPPending
==
154 TRUE
) /*&& (pAd->TxSwQueue[BulkOutPipeId].Number == 0) */ ) {
155 if ((pHTTXContext
->CurWritePosition
<
156 pHTTXContext
->ENextBulkOutPosition
)
158 (((pHTTXContext
->ENextBulkOutPosition
+
159 MAX_AGGREGATION_SIZE
) < MAX_TXBULK_LIMIT
)
160 || (pHTTXContext
->CurWritePosition
>
161 MAX_AGGREGATION_SIZE
))) {
164 if ((pHTTXContext
->CurWritePosition
>
165 pHTTXContext
->ENextBulkOutPosition
)
167 ((pHTTXContext
->ENextBulkOutPosition
+
168 MAX_AGGREGATION_SIZE
) <
169 pHTTXContext
->CurWritePosition
)) {
173 RTMP_IRQ_UNLOCK(&pAd
->TxContextQueueLock
[BulkOutPipeId
], IrqFlags
);
180 ========================================================================
192 ========================================================================
194 VOID
RTUSBRejectPendingPackets(IN PRTMP_ADAPTER pAd
)
198 PNDIS_PACKET pPacket
;
199 PQUEUE_HEADER pQueue
;
201 for (Index
= 0; Index
< 4; Index
++) {
202 NdisAcquireSpinLock(&pAd
->TxSwQueueLock
[Index
]);
203 while (pAd
->TxSwQueue
[Index
].Head
!= NULL
) {
204 pQueue
= (PQUEUE_HEADER
) & (pAd
->TxSwQueue
[Index
]);
205 pEntry
= RemoveHeadQueue(pQueue
);
206 pPacket
= QUEUE_ENTRY_TO_PACKET(pEntry
);
207 RELEASE_NDIS_PACKET(pAd
, pPacket
, NDIS_STATUS_FAILURE
);
209 NdisReleaseSpinLock(&pAd
->TxSwQueueLock
[Index
]);
216 ========================================================================
219 Calculates the duration which is required to transmit out frames
220 with given size and specified rate.
223 pTxD Pointer to transmit descriptor
224 Ack Setting for Ack requirement bit
225 Fragment Setting for Fragment bit
226 RetryMode Setting for retry mode
227 Ifs Setting for IFS gap
228 Rate Setting for transmit rate
229 Service Setting for service
231 TxPreamble Short or Long preamble when using CCK rates
232 QueIdx - 0-3, according to 802.11e/d4.4 June/2003
238 IRQL = DISPATCH_LEVEL
240 ========================================================================
243 VOID
RTMPWriteTxInfo(IN PRTMP_ADAPTER pAd
,
244 IN PTXINFO_STRUC pTxInfo
,
245 IN USHORT USBDMApktLen
,
247 IN UCHAR QueueSel
, IN UCHAR NextValid
, IN UCHAR TxBurst
)
249 pTxInfo
->USBDMATxPktLen
= USBDMApktLen
;
250 pTxInfo
->QSEL
= QueueSel
;
251 if (QueueSel
!= FIFO_EDCA
)
252 DBGPRINT(RT_DEBUG_TRACE
,
253 ("====> QueueSel != FIFO_EDCA<============\n"));
254 pTxInfo
->USBDMANextVLD
= FALSE
; //NextValid; // Need to check with Jan about this.
255 pTxInfo
->USBDMATxburst
= TxBurst
;
257 pTxInfo
->SwUseLastRound
= 0;
262 #endif // RTMP_MAC_USB //