blob: 68f6f48f7251fe2750d9777a65d5b98ce955fa8d [file] [log] [blame]
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +02001/*
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_bulk.c
29
30 Abstract:
31
32 Revision History:
33 Who When What
34 -------- ---------- ----------------------------------------------
35 Name Date Modification logs
36
37*/
38
39#include "rt_config.h"
40
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -080041void dump_urb(struct urb *purb)
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +020042{
43 printk("urb :0x%08lx\n", (unsigned long)purb);
44 printk("\tdev :0x%08lx\n", (unsigned long)purb->dev);
45 printk("\t\tdev->state :0x%d\n", purb->dev->state);
46 printk("\tpipe :0x%08x\n", purb->pipe);
47 printk("\tstatus :%d\n", purb->status);
48 printk("\ttransfer_flags :0x%08x\n", purb->transfer_flags);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -080049 printk("\ttransfer_buffer :0x%08lx\n",
50 (unsigned long)purb->transfer_buffer);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +020051 printk("\ttransfer_buffer_length:%d\n", purb->transfer_buffer_length);
52 printk("\tactual_length :%d\n", purb->actual_length);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -080053 printk("\tsetup_packet :0x%08lx\n",
54 (unsigned long)purb->setup_packet);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +020055 printk("\tstart_frame :%d\n", purb->start_frame);
56 printk("\tnumber_of_packets :%d\n", purb->number_of_packets);
57 printk("\tinterval :%d\n", purb->interval);
58 printk("\terror_count :%d\n", purb->error_count);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -080059 printk("\tcontext :0x%08lx\n",
60 (unsigned long)purb->context);
61 printk("\tcomplete :0x%08lx\n\n",
62 (unsigned long)purb->complete);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +020063}
64
65/*
66========================================================================
67Routine Description:
68 Create kernel threads & tasklets.
69
70Arguments:
71 *net_dev Pointer to wireless net device interface
72
73Return Value:
74 NDIS_STATUS_SUCCESS
75 NDIS_STATUS_FAILURE
76
77Note:
78========================================================================
79*/
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -080080int RtmpMgmtTaskInit(IN RTMP_ADAPTER * pAd)
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +020081{
82 RTMP_OS_TASK *pTask;
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -080083 int status;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +020084
85 /*
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -080086 Creat TimerQ Thread, We need init timerQ related structure before create the timer thread.
87 */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +020088 RtmpTimerQInit(pAd);
89
90 pTask = &pAd->timerTask;
91 RtmpOSTaskInit(pTask, "RtmpTimerTask", pAd);
92 status = RtmpOSTaskAttach(pTask, RtmpTimerQThread, pTask);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -080093 if (status == NDIS_STATUS_FAILURE) {
94 printk(KERN_WARNING "%s: unable to start RtmpTimerQThread\n",
95 RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +020096 return NDIS_STATUS_FAILURE;
97 }
98
99 /* Creat MLME Thread */
100 pTask = &pAd->mlmeTask;
101 RtmpOSTaskInit(pTask, "RtmpMlmeTask", pAd);
102 status = RtmpOSTaskAttach(pTask, MlmeThread, pTask);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800103 if (status == NDIS_STATUS_FAILURE) {
104 printk(KERN_WARNING "%s: unable to start MlmeThread\n",
105 RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200106 return NDIS_STATUS_FAILURE;
107 }
108
109 /* Creat Command Thread */
110 pTask = &pAd->cmdQTask;
111 RtmpOSTaskInit(pTask, "RtmpCmdQTask", pAd);
112 status = RtmpOSTaskAttach(pTask, RTUSBCmdThread, pTask);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800113 if (status == NDIS_STATUS_FAILURE) {
114 printk(KERN_WARNING "%s: unable to start RTUSBCmdThread\n",
115 RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200116 return NDIS_STATUS_FAILURE;
117 }
118
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200119 return NDIS_STATUS_SUCCESS;
120}
121
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200122/*
123========================================================================
124Routine Description:
125 Close kernel threads.
126
127Arguments:
128 *pAd the raxx interface data pointer
129
130Return Value:
131 NONE
132
133Note:
134========================================================================
135*/
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800136void RtmpMgmtTaskExit(IN RTMP_ADAPTER * pAd)
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200137{
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800138 int ret;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800139 RTMP_OS_TASK *pTask;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200140
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800141 /* Sleep 50 milliseconds so pending io might finish normally */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200142 RTMPusecDelay(50000);
143
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800144 /* We want to wait until all pending receives and sends to the */
145 /* device object. We cancel any */
146 /* irps. Wait until sends and receives have stopped. */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200147 RTUSBCancelPendingIRPs(pAd);
148
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800149 /* We need clear timerQ related structure before exits of the timer thread. */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200150 RtmpTimerQExit(pAd);
151
152 /* Terminate Mlme Thread */
153 pTask = &pAd->mlmeTask;
154 ret = RtmpOSTaskKill(pTask);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800155 if (ret == NDIS_STATUS_FAILURE) {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200156 DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n",
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800157 RTMP_OS_NETDEV_GET_DEVNAME(pAd->
158 net_dev),
159 pTask->taskName));
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200160 }
161
162 /* Terminate cmdQ thread */
163 pTask = &pAd->cmdQTask;
164#ifdef KTHREAD_SUPPORT
165 if (pTask->kthread_task)
166#else
167 CHECK_PID_LEGALITY(pTask->taskPID)
168#endif
169 {
170 mb();
171 NdisAcquireSpinLock(&pAd->CmdQLock);
172 pAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED;
173 NdisReleaseSpinLock(&pAd->CmdQLock);
174 mb();
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800175 /*RTUSBCMDUp(pAd); */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200176 ret = RtmpOSTaskKill(pTask);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800177 if (ret == NDIS_STATUS_FAILURE) {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200178 DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n",
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800179 RTMP_OS_NETDEV_GET_DEVNAME
180 (pAd->net_dev),
181 pTask->taskName));
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200182 }
183 pAd->CmdQ.CmdQState = RTMP_TASK_STAT_UNKNOWN;
184 }
185
186 /* Terminate timer thread */
187 pTask = &pAd->timerTask;
188 ret = RtmpOSTaskKill(pTask);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800189 if (ret == NDIS_STATUS_FAILURE) {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200190 DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n",
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800191 RTMP_OS_NETDEV_GET_DEVNAME(pAd->
192 net_dev),
193 pTask->taskName));
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200194 }
195
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200196}
197
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200198static void rtusb_dataout_complete(unsigned long data)
199{
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800200 PRTMP_ADAPTER pAd;
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800201 struct urb *pUrb;
202 struct os_cookie *pObj;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800203 PHT_TX_CONTEXT pHTTXContext;
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800204 u8 BulkOutPipeId;
205 int Status;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800206 unsigned long IrqFlags;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200207
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800208 pUrb = (struct urb *)data;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800209 pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
210 pAd = pHTTXContext->pAd;
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800211 pObj = (struct os_cookie *)pAd->OS_Cookie;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800212 Status = pUrb->status;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200213
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800214 /* Store BulkOut PipeId */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200215 BulkOutPipeId = pHTTXContext->BulkOutPipeId;
216 pAd->BulkOutDataOneSecCount++;
217
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800218 /*DBGPRINT(RT_DEBUG_LOUD, ("Done-B(%d):I=0x%lx, CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n", BulkOutPipeId, in_interrupt(), pHTTXContext->CurWritePosition, */
219 /* pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad)); */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200220
221 RTMP_IRQ_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
222 pAd->BulkOutPending[BulkOutPipeId] = FALSE;
223 pHTTXContext->IRPPending = FALSE;
224 pAd->watchDogTxPendingCnt[BulkOutPipeId] = 0;
225
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800226 if (Status == USB_ST_NOERROR) {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200227 pAd->BulkOutComplete++;
228
229 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
230
231 pAd->Counters8023.GoodTransmits++;
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800232 /*RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200233 FREE_HTTX_RING(pAd, BulkOutPipeId, pHTTXContext);
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800234 /*RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200235
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800236 } else /* STATUS_OTHER */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200237 {
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800238 u8 *pBuf;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200239
240 pAd->BulkOutCompleteOther++;
241
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800242 pBuf =
243 &pHTTXContext->TransferBuffer->field.
244 WirelessPacket[pHTTXContext->NextBulkOutPosition];
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200245
246 if (!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800247 fRTMP_ADAPTER_HALT_IN_PROGRESS |
248 fRTMP_ADAPTER_NIC_NOT_EXIST |
249 fRTMP_ADAPTER_BULKOUT_RESET))) {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200250 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
251 pAd->bulkResetPipeid = BulkOutPipeId;
252 pAd->bulkResetReq[BulkOutPipeId] = pAd->BulkOutReq;
253 }
254 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
255
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800256 DBGPRINT_RAW(RT_DEBUG_ERROR,
257 ("BulkOutDataPacket failed: ReasonCode=%d!\n",
258 Status));
259 DBGPRINT_RAW(RT_DEBUG_ERROR,
260 ("\t>>BulkOut Req=0x%lx, Complete=0x%lx, Other=0x%lx\n",
261 pAd->BulkOutReq, pAd->BulkOutComplete,
262 pAd->BulkOutCompleteOther));
263 DBGPRINT_RAW(RT_DEBUG_ERROR,
264 ("\t>>BulkOut Header:%x %x %x %x %x %x %x %x\n",
265 pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4],
266 pBuf[5], pBuf[6], pBuf[7]));
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800267 /*DBGPRINT_RAW(RT_DEBUG_ERROR, (">>BulkOutCompleteCancel=0x%x, BulkOutCompleteOther=0x%x\n", pAd->BulkOutCompleteCancel, pAd->BulkOutCompleteOther)); */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200268
269 }
270
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800271 /* */
272 /* bInUse = TRUE, means some process are filling TX data, after that must turn on bWaitingBulkOut */
273 /* bWaitingBulkOut = TRUE, means the TX data are waiting for bulk out. */
274 /* */
275 /*RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); */
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800276 if ((pHTTXContext->ENextBulkOutPosition !=
277 pHTTXContext->CurWritePosition)
278 && (pHTTXContext->ENextBulkOutPosition !=
279 (pHTTXContext->CurWritePosition + 8))
280 && !RTUSB_TEST_BULK_FLAG(pAd,
281 (fRTUSB_BULK_OUT_DATA_FRAG <<
282 BulkOutPipeId))) {
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800283 /* Indicate There is data avaliable */
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800284 RTUSB_SET_BULK_FLAG(pAd,
285 (fRTUSB_BULK_OUT_DATA_NORMAL <<
286 BulkOutPipeId));
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200287 }
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800288 /*RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags); */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200289
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800290 /* Always call Bulk routine, even reset bulk. */
291 /* The protection of rest bulk should be in BulkOut routine */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200292 RTUSBKickBulkOut(pAd);
293}
294
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200295static void rtusb_null_frame_done_tasklet(unsigned long data)
296{
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800297 PRTMP_ADAPTER pAd;
298 PTX_CONTEXT pNullContext;
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800299 struct urb *pUrb;
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800300 int Status;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800301 unsigned long irqFlag;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200302
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800303 pUrb = (struct urb *)data;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800304 pNullContext = (PTX_CONTEXT) pUrb->context;
305 pAd = pNullContext->pAd;
306 Status = pUrb->status;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200307
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800308 /* Reset Null frame context flags */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200309 RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], irqFlag);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800310 pNullContext->IRPPending = FALSE;
311 pNullContext->InUse = FALSE;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200312 pAd->BulkOutPending[0] = FALSE;
313 pAd->watchDogTxPendingCnt[0] = 0;
314
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800315 if (Status == USB_ST_NOERROR) {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200316 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
317
318 RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800319 } else /* STATUS_OTHER */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200320 {
321 if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800322 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
323 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
324 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) {
325 DBGPRINT_RAW(RT_DEBUG_ERROR,
326 ("Bulk Out Null Frame Failed, ReasonCode=%d!\n",
327 Status));
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200328 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800329 pAd->bulkResetPipeid =
330 (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200331 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800332 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
333 NULL, 0);
334 } else {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200335 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
336 }
337 }
338
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800339 /* Always call Bulk routine, even reset bulk. */
340 /* The protectioon of rest bulk should be in BulkOut routine */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200341 RTUSBKickBulkOut(pAd);
342}
343
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200344static void rtusb_rts_frame_done_tasklet(unsigned long data)
345{
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800346 PRTMP_ADAPTER pAd;
347 PTX_CONTEXT pRTSContext;
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800348 struct urb *pUrb;
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800349 int Status;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800350 unsigned long irqFlag;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200351
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800352 pUrb = (struct urb *)data;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800353 pRTSContext = (PTX_CONTEXT) pUrb->context;
354 pAd = pRTSContext->pAd;
355 Status = pUrb->status;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200356
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800357 /* Reset RTS frame context flags */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200358 RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], irqFlag);
359 pRTSContext->IRPPending = FALSE;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800360 pRTSContext->InUse = FALSE;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200361
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800362 if (Status == USB_ST_NOERROR) {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200363 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
364 RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800365 } else /* STATUS_OTHER */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200366 {
367 if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800368 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
369 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
370 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) {
371 DBGPRINT_RAW(RT_DEBUG_ERROR,
372 ("Bulk Out RTS Frame Failed\n"));
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200373 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800374 pAd->bulkResetPipeid =
375 (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200376 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800377 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
378 NULL, 0);
379 } else {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200380 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
381 }
382 }
383
384 RTMP_SEM_LOCK(&pAd->BulkOutLock[pRTSContext->BulkOutPipeId]);
385 pAd->BulkOutPending[pRTSContext->BulkOutPipeId] = FALSE;
386 RTMP_SEM_UNLOCK(&pAd->BulkOutLock[pRTSContext->BulkOutPipeId]);
387
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800388 /* Always call Bulk routine, even reset bulk. */
389 /* The protectioon of rest bulk should be in BulkOut routine */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200390 RTUSBKickBulkOut(pAd);
391
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200392}
393
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200394static void rtusb_pspoll_frame_done_tasklet(unsigned long data)
395{
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800396 PRTMP_ADAPTER pAd;
397 PTX_CONTEXT pPsPollContext;
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800398 struct urb *pUrb;
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800399 int Status;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200400
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800401 pUrb = (struct urb *)data;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800402 pPsPollContext = (PTX_CONTEXT) pUrb->context;
403 pAd = pPsPollContext->pAd;
404 Status = pUrb->status;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200405
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800406 /* Reset PsPoll context flags */
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800407 pPsPollContext->IRPPending = FALSE;
408 pPsPollContext->InUse = FALSE;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200409 pAd->watchDogTxPendingCnt[0] = 0;
410
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800411 if (Status == USB_ST_NOERROR) {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200412 RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800413 } else /* STATUS_OTHER */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200414 {
415 if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800416 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
417 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
418 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) {
419 DBGPRINT_RAW(RT_DEBUG_ERROR,
420 ("Bulk Out PSPoll Failed\n"));
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200421 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800422 pAd->bulkResetPipeid =
423 (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
424 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
425 NULL, 0);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200426 }
427 }
428
429 RTMP_SEM_LOCK(&pAd->BulkOutLock[0]);
430 pAd->BulkOutPending[0] = FALSE;
431 RTMP_SEM_UNLOCK(&pAd->BulkOutLock[0]);
432
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800433 /* Always call Bulk routine, even reset bulk. */
434 /* The protectioon of rest bulk should be in BulkOut routine */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200435 RTUSBKickBulkOut(pAd);
436
437}
438
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200439/*
440========================================================================
441Routine Description:
442 Handle received packets.
443
444Arguments:
445 data - URB information pointer
446
447Return Value:
448 None
449
450Note:
451========================================================================
452*/
453static void rx_done_tasklet(unsigned long data)
454{
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800455 struct urb *pUrb;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800456 PRX_CONTEXT pRxContext;
457 PRTMP_ADAPTER pAd;
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800458 int Status;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800459 unsigned int IrqFlags;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200460
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800461 pUrb = (struct urb *)data;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800462 pRxContext = (PRX_CONTEXT) pUrb->context;
463 pAd = pRxContext->pAd;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200464 Status = pUrb->status;
465
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200466 RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
467 pRxContext->InUse = FALSE;
468 pRxContext->IRPPending = FALSE;
469 pRxContext->BulkInOffset += pUrb->actual_length;
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800470 /*NdisInterlockedDecrement(&pAd->PendingRx); */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200471 pAd->PendingRx--;
472
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800473 if (Status == USB_ST_NOERROR) {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200474 pAd->BulkInComplete++;
475 pAd->NextRxBulkInPosition = 0;
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800476 if (pRxContext->BulkInOffset) /* As jan's comment, it may bulk-in success but size is zero. */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200477 {
478 pRxContext->Readable = TRUE;
479 INC_RING_INDEX(pAd->NextRxBulkInIndex, RX_RING_SIZE);
480 }
481 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800482 } else /* STATUS_OTHER */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200483 {
484 pAd->BulkInCompleteFail++;
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800485 /* Still read this packet although it may comtain wrong bytes. */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200486 pRxContext->Readable = FALSE;
487 RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
488
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800489 /* Parsing all packets. because after reset, the index will reset to all zero. */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200490 if ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800491 fRTMP_ADAPTER_BULKIN_RESET |
492 fRTMP_ADAPTER_HALT_IN_PROGRESS |
493 fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200494
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800495 DBGPRINT_RAW(RT_DEBUG_ERROR,
496 ("Bulk In Failed. Status=%d, BIIdx=0x%x, BIRIdx=0x%x, actual_length= 0x%x\n",
497 Status, pAd->NextRxBulkInIndex,
498 pAd->NextRxBulkInReadIndex,
499 pRxContext->pUrb->actual_length));
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200500
501 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800502 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN,
503 NULL, 0);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200504 }
505 }
506
507 ASSERT((pRxContext->InUse == pRxContext->IRPPending));
508
509 RTUSBBulkReceive(pAd);
510
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200511 return;
512
513}
514
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200515static void rtusb_mgmt_dma_done_tasklet(unsigned long data)
516{
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800517 PRTMP_ADAPTER pAd;
518 PTX_CONTEXT pMLMEContext;
519 int index;
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800520 void *pPacket;
521 struct urb *pUrb;
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800522 int Status;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800523 unsigned long IrqFlags;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200524
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800525 pUrb = (struct urb *)data;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800526 pMLMEContext = (PTX_CONTEXT) pUrb->context;
527 pAd = pMLMEContext->pAd;
528 Status = pUrb->status;
529 index = pMLMEContext->SelfIdx;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200530
531 ASSERT((pAd->MgmtRing.TxDmaIdx == index));
532
533 RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
534
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800535 if (Status != USB_ST_NOERROR) {
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800536 /*Bulk-Out fail status handle */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200537 if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800538 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
539 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
540 (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))) {
541 DBGPRINT_RAW(RT_DEBUG_ERROR,
542 ("Bulk Out MLME Failed, Status=%d!\n",
543 Status));
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800544 /* TODO: How to handle about the MLMEBulkOut failed issue. Need to resend the mgmt pkt? */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200545 RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800546 pAd->bulkResetPipeid =
547 (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200548 }
549 }
550
551 pAd->BulkOutPending[MGMTPIPEIDX] = FALSE;
552 RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
553
554 RTMP_IRQ_LOCK(&pAd->MLMEBulkOutLock, IrqFlags);
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800555 /* Reset MLME context flags */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200556 pMLMEContext->IRPPending = FALSE;
557 pMLMEContext->InUse = FALSE;
558 pMLMEContext->bWaitingBulkOut = FALSE;
559 pMLMEContext->BulkOutSize = 0;
560
561 pPacket = pAd->MgmtRing.Cell[index].pNdisPacket;
562 pAd->MgmtRing.Cell[index].pNdisPacket = NULL;
563
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800564 /* Increase MgmtRing Index */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200565 INC_RING_INDEX(pAd->MgmtRing.TxDmaIdx, MGMT_RING_SIZE);
566 pAd->MgmtRing.TxSwFreeIdx++;
567 RTMP_IRQ_UNLOCK(&pAd->MLMEBulkOutLock, IrqFlags);
568
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800569 /* No-matter success or fail, we free the mgmt packet. */
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200570 if (pPacket)
571 RTMPFreeNdisPacket(pAd, pPacket);
572
573 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800574 fRTMP_ADAPTER_HALT_IN_PROGRESS |
575 fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800576 /* do nothing and return directly. */
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800577 } else {
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800578 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET) && ((pAd->bulkResetPipeid & BULKOUT_MGMT_RESET_FLAG) == BULKOUT_MGMT_RESET_FLAG)) { /* For Mgmt Bulk-Out failed, ignore it now. */
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800579 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
580 NULL, 0);
581 } else {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200582
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800583 /* Always call Bulk routine, even reset bulk. */
584 /* The protectioon of rest bulk should be in BulkOut routine */
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800585 if (pAd->MgmtRing.TxSwFreeIdx <
586 MGMT_RING_SIZE
587 /* pMLMEContext->bWaitingBulkOut == TRUE */ ) {
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200588 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);
589 }
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800590 RTUSBKickBulkOut(pAd);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200591 }
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800592 }
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200593
594}
595
596static void rtusb_ac3_dma_done_tasklet(unsigned long data)
597{
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800598 PRTMP_ADAPTER pAd;
599 PHT_TX_CONTEXT pHTTXContext;
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800600 u8 BulkOutPipeId = 3;
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800601 struct urb *pUrb;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200602
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800603 pUrb = (struct urb *)data;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800604 pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
605 pAd = pHTTXContext->pAd;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200606
607 rtusb_dataout_complete((unsigned long)pUrb);
608
609 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800610 fRTMP_ADAPTER_HALT_IN_PROGRESS |
611 fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800612 /* do nothing and return directly. */
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800613 } else {
614 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) {
615 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
616 NULL, 0);
617 } else {
618 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200619 if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800620 /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
621 (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
622 (pHTTXContext->bCurWriting == FALSE)) {
623 RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId,
624 MAX_TX_PROCESS);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200625 }
626
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800627 RTUSB_SET_BULK_FLAG(pAd,
628 fRTUSB_BULK_OUT_DATA_NORMAL << 3);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200629 RTUSBKickBulkOut(pAd);
630 }
631 }
632
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200633 return;
634}
635
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200636static void rtusb_ac2_dma_done_tasklet(unsigned long data)
637{
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800638 PRTMP_ADAPTER pAd;
639 PHT_TX_CONTEXT pHTTXContext;
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800640 u8 BulkOutPipeId = 2;
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800641 struct urb *pUrb;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200642
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800643 pUrb = (struct urb *)data;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800644 pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
645 pAd = pHTTXContext->pAd;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200646
647 rtusb_dataout_complete((unsigned long)pUrb);
648
649 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800650 fRTMP_ADAPTER_HALT_IN_PROGRESS |
651 fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800652 /* do nothing and return directly. */
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800653 } else {
654 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) {
655 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
656 NULL, 0);
657 } else {
658 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200659 if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800660 /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
661 (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
662 (pHTTXContext->bCurWriting == FALSE)) {
663 RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId,
664 MAX_TX_PROCESS);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200665 }
666
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800667 RTUSB_SET_BULK_FLAG(pAd,
668 fRTUSB_BULK_OUT_DATA_NORMAL << 2);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200669 RTUSBKickBulkOut(pAd);
670 }
671 }
672
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200673 return;
674}
675
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200676static void rtusb_ac1_dma_done_tasklet(unsigned long data)
677{
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800678 PRTMP_ADAPTER pAd;
679 PHT_TX_CONTEXT pHTTXContext;
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800680 u8 BulkOutPipeId = 1;
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800681 struct urb *pUrb;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200682
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800683 pUrb = (struct urb *)data;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800684 pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
685 pAd = pHTTXContext->pAd;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200686
687 rtusb_dataout_complete((unsigned long)pUrb);
688
689 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800690 fRTMP_ADAPTER_HALT_IN_PROGRESS |
691 fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800692 /* do nothing and return directly. */
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800693 } else {
694 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) {
695 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
696 NULL, 0);
697 } else {
698 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200699 if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800700 /*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
701 (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
702 (pHTTXContext->bCurWriting == FALSE)) {
703 RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId,
704 MAX_TX_PROCESS);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200705 }
706
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800707 RTUSB_SET_BULK_FLAG(pAd,
708 fRTUSB_BULK_OUT_DATA_NORMAL << 1);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200709 RTUSBKickBulkOut(pAd);
710 }
711 }
712 return;
713
714}
715
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200716static void rtusb_ac0_dma_done_tasklet(unsigned long data)
717{
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800718 PRTMP_ADAPTER pAd;
719 PHT_TX_CONTEXT pHTTXContext;
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800720 u8 BulkOutPipeId = 0;
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800721 struct urb *pUrb;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200722
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800723 pUrb = (struct urb *)data;
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800724 pHTTXContext = (PHT_TX_CONTEXT) pUrb->context;
725 pAd = pHTTXContext->pAd;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200726
727 rtusb_dataout_complete((unsigned long)pUrb);
728
729 if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800730 fRTMP_ADAPTER_HALT_IN_PROGRESS |
731 fRTMP_ADAPTER_NIC_NOT_EXIST)))) {
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800732 /* do nothing and return directly. */
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800733 } else {
734 if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)) {
735 RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT,
736 NULL, 0);
737 } else {
738 pHTTXContext = &pAd->TxContext[BulkOutPipeId];
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200739 if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800740 /* ((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
741 (pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
742 (pHTTXContext->bCurWriting == FALSE)) {
743 RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId,
744 MAX_TX_PROCESS);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200745 }
746
747 RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL);
748 RTUSBKickBulkOut(pAd);
749 }
750 }
751
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200752 return;
753
754}
755
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800756int RtmpNetTaskInit(IN RTMP_ADAPTER * pAd)
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200757{
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800758 struct os_cookie *pObj = (struct os_cookie *)pAd->OS_Cookie;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200759
Bartlomiej Zolnierkiewicz9f548a22009-12-11 12:23:14 -0800760 /* Create receive tasklet */
Bartlomiej Zolnierkiewicz51126de2009-12-11 12:23:15 -0800761 tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (unsigned long)pAd);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800762 tasklet_init(&pObj->mgmt_dma_done_task, rtusb_mgmt_dma_done_tasklet,
763 (unsigned long)pAd);
764 tasklet_init(&pObj->ac0_dma_done_task, rtusb_ac0_dma_done_tasklet,
765 (unsigned long)pAd);
766 tasklet_init(&pObj->ac1_dma_done_task, rtusb_ac1_dma_done_tasklet,
767 (unsigned long)pAd);
768 tasklet_init(&pObj->ac2_dma_done_task, rtusb_ac2_dma_done_tasklet,
769 (unsigned long)pAd);
770 tasklet_init(&pObj->ac3_dma_done_task, rtusb_ac3_dma_done_tasklet,
771 (unsigned long)pAd);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200772 tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd);
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800773 tasklet_init(&pObj->null_frame_complete_task,
774 rtusb_null_frame_done_tasklet, (unsigned long)pAd);
775 tasklet_init(&pObj->rts_frame_complete_task,
776 rtusb_rts_frame_done_tasklet, (unsigned long)pAd);
777 tasklet_init(&pObj->pspoll_frame_complete_task,
778 rtusb_pspoll_frame_done_tasklet, (unsigned long)pAd);
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200779
780 return NDIS_STATUS_SUCCESS;
781}
782
Bartlomiej Zolnierkiewicz66cd8d62009-12-11 12:23:13 -0800783void RtmpNetTaskExit(IN RTMP_ADAPTER * pAd)
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200784{
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800785 struct os_cookie *pObj;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200786
Bartlomiej Zolnierkiewicz8a10a542009-12-11 12:23:15 -0800787 pObj = (struct os_cookie *)pAd->OS_Cookie;
Bartlomiej Zolnierkiewiczca97b832009-09-22 20:44:07 +0200788
789 tasklet_kill(&pObj->rx_done_task);
790 tasklet_kill(&pObj->mgmt_dma_done_task);
791 tasklet_kill(&pObj->ac0_dma_done_task);
792 tasklet_kill(&pObj->ac1_dma_done_task);
793 tasklet_kill(&pObj->ac2_dma_done_task);
794 tasklet_kill(&pObj->ac3_dma_done_task);
795 tasklet_kill(&pObj->tbtt_task);
796 tasklet_kill(&pObj->null_frame_complete_task);
797 tasklet_kill(&pObj->rts_frame_complete_task);
798 tasklet_kill(&pObj->pspoll_frame_complete_task);
799}