Staging: rt3070: remove dead CONFIG_AP_SUPPORT code
[linux-2.6] / drivers / staging / rt3070 / common / rtusb_data.c
1 /*
2  *************************************************************************
3  * Ralink Tech Inc.
4  * 5F., No.36, Taiyuan St., Jhubei City,
5  * Hsinchu County 302,
6  * Taiwan, R.O.C.
7  *
8  * (c) Copyright 2002-2007, Ralink Technology, Inc.
9  *
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.                                   *
14  *                                                                       *
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.                          *
19  *                                                                       *
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.             *
24  *                                                                       *
25  *************************************************************************
26
27         Module Name:
28         rtusb_data.c
29
30         Abstract:
31         Ralink USB driver Tx/Rx functions.
32
33         Revision History:
34         Who         When          What
35         --------    ----------    ----------------------------------------------
36         Jan            03-25-2006    created
37
38 */
39 #include        "../rt_config.h"
40
41 extern  UCHAR Phy11BGNextRateUpward[]; // defined in mlme.c
42 extern UCHAR    EpToQueue[];
43
44
45 VOID REPORT_AMSDU_FRAMES_TO_LLC(
46         IN      PRTMP_ADAPTER   pAd,
47         IN      PUCHAR                  pData,
48         IN      ULONG                   DataSize)
49 {
50         PNDIS_PACKET    pPacket;
51         UINT                    nMSDU;
52         struct                  sk_buff *pSkb;
53
54         nMSDU = 0;
55         /* allocate a rx packet */
56         pSkb = dev_alloc_skb(RX_BUFFER_AGGRESIZE);
57         pPacket = (PNDIS_PACKET)OSPKT_TO_RTPKT(pSkb);
58         if (pSkb)
59         {
60
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);
65         }
66         else
67         {
68                 DBGPRINT(RT_DEBUG_ERROR,("Can't allocate skb\n"));
69         }
70 }
71
72 NDIS_STATUS     RTUSBFreeDescriptorRequest(
73         IN      PRTMP_ADAPTER   pAd,
74         IN      UCHAR                   BulkOutPipeId,
75         IN      UINT32                  NumberRequired)
76 {
77 //      UCHAR                   FreeNumber = 0;
78 //      UINT                    Index;
79         NDIS_STATUS             Status = NDIS_STATUS_FAILURE;
80         unsigned long   IrqFlags;
81         HT_TX_CONTEXT   *pHTTXContext;
82
83
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))
87         {
88
89                 RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));
90         }
91         else if ((pHTTXContext->CurWritePosition == 8) && (pHTTXContext->NextBulkOutPosition < (NumberRequired + LOCAL_TXBUF_SIZE)))
92         {
93                 RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));
94         }
95         else if (pHTTXContext->bCurWriting == TRUE)
96         {
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));
99         }
100         else
101         {
102                 Status = NDIS_STATUS_SUCCESS;
103         }
104         RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
105
106
107         return (Status);
108 }
109
110
111 NDIS_STATUS RTUSBFreeDescriptorRelease(
112         IN RTMP_ADAPTER *pAd,
113         IN UCHAR                BulkOutPipeId)
114 {
115         unsigned long   IrqFlags;
116         HT_TX_CONTEXT   *pHTTXContext;
117
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);
122
123         return (NDIS_STATUS_SUCCESS);
124 }
125
126
127 BOOLEAN RTUSBNeedQueueBackForAgg(
128         IN RTMP_ADAPTER *pAd,
129         IN UCHAR                BulkOutPipeId)
130 {
131         unsigned long   IrqFlags;
132         HT_TX_CONTEXT   *pHTTXContext;
133         BOOLEAN                 needQueBack = FALSE;
134
135         pHTTXContext = &pAd->TxContext[BulkOutPipeId];
136
137         RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
138         if ((pHTTXContext->IRPPending == TRUE)  /*&& (pAd->TxSwQueue[BulkOutPipeId].Number == 0) */)
139         {
140                 if ((pHTTXContext->CurWritePosition < pHTTXContext->ENextBulkOutPosition) &&
141                         (((pHTTXContext->ENextBulkOutPosition+MAX_AGGREGATION_SIZE) < MAX_TXBULK_LIMIT) || (pHTTXContext->CurWritePosition > MAX_AGGREGATION_SIZE)))
142                 {
143                         needQueBack = TRUE;
144                 }
145                 else if ((pHTTXContext->CurWritePosition > pHTTXContext->ENextBulkOutPosition) &&
146                                  ((pHTTXContext->ENextBulkOutPosition + MAX_AGGREGATION_SIZE) < pHTTXContext->CurWritePosition))
147                 {
148                         needQueBack = TRUE;
149                 }
150         }
151         RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
152
153         return needQueBack;
154
155 }
156
157
158 /*
159         ========================================================================
160
161         Routine Description:
162
163         Arguments:
164
165         Return Value:
166
167         IRQL =
168
169         Note:
170
171         ========================================================================
172 */
173 VOID    RTUSBRejectPendingPackets(
174         IN      PRTMP_ADAPTER   pAd)
175 {
176         UCHAR                   Index;
177         PQUEUE_ENTRY    pEntry;
178         PNDIS_PACKET    pPacket;
179         PQUEUE_HEADER   pQueue;
180
181
182         for (Index = 0; Index < 4; Index++)
183         {
184                 NdisAcquireSpinLock(&pAd->TxSwQueueLock[Index]);
185                 while (pAd->TxSwQueue[Index].Head != NULL)
186                 {
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);
191                 }
192                 NdisReleaseSpinLock(&pAd->TxSwQueueLock[Index]);
193
194         }
195
196 }
197
198 VOID RTMPWriteTxInfo(
199         IN      PRTMP_ADAPTER   pAd,
200         IN      PTXINFO_STRUC   pTxInfo,
201         IN        USHORT                USBDMApktLen,
202         IN        BOOLEAN               bWiv,
203         IN        UCHAR                 QueueSel,
204         IN        UCHAR                 NextValid,
205         IN        UCHAR                 TxBurst)
206 {
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;
213         pTxInfo->WIV = bWiv;
214         pTxInfo->SwUseLastRound = 0;
215         pTxInfo->rsv = 0;
216         pTxInfo->rsv2 = 0;
217 }
218