blob: 158a4cc0e903606f0ba2388a2b85589dff9f3b4c [file] [log] [blame]
Forest Bond92b96792009-06-13 07:38:31 -04001/*
2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3 * All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 *
20 * File: int.c
21 *
22 * Purpose: Handle USB interrupt endpoint
23 *
24 * Author: Jerry Chen
25 *
26 * Date: Apr. 2, 2004
27 *
28 * Functions:
29 *
30 * Revision History:
31 * 04-02-2004 Jerry Chen: Initial release
32 *
33 */
34
35
36#if !defined(__INT_H__)
37#include "int.h"
38#endif
39#if !defined(__MIB_H__)
40#include "mib.h"
41#endif
42#if !defined(__TBIT_H__)
43#include "tbit.h"
44#endif
45#if !defined(__TMACRO_H__)
46#include "tmacro.h"
47#endif
48#if !defined(__MAC_H__)
49#include "mac.h"
50#endif
51#if !defined(__POWER_H__)
52#include "power.h"
53#endif
54#if !defined(__BSSDB_H__)
55#include "bssdb.h"
56#endif
57#if !defined(__UMEM_H__)
58#include "umem.h"
59#endif
60#if !defined(__USBPIPE_H__)
61#include "usbpipe.h"
62#endif
63
64/*--------------------- Static Definitions -------------------------*/
65//static int msglevel =MSG_LEVEL_DEBUG;
66static int msglevel =MSG_LEVEL_INFO;
67
68
69/*--------------------- Static Classes ----------------------------*/
70
71/*--------------------- Static Variables --------------------------*/
72
73/*--------------------- Static Functions --------------------------*/
74
75/*--------------------- Export Variables --------------------------*/
76
77
78/*--------------------- Export Functions --------------------------*/
79
80
81/*+
82 *
83 * Function: InterruptPollingThread
84 *
85 * Synopsis: Thread running at IRQL PASSIVE_LEVEL.
86 *
87 * Arguments: Device Extension
88 *
89 * Returns:
90 *
91 * Algorithm: Call USBD for input data;
92 *
93 * History: dd-mm-yyyy Author Comment
94 *
95 *
96 * Notes:
97 *
98 * USB reads are by nature 'Blocking', and when in a read, the device looks like it's
99 * in a 'stall' condition, so we deliberately time out every second if we've gotten no data
100 *
101-*/
102VOID
103INTvWorkItem(
104 PVOID Context
105 )
106{
107 PSDevice pDevice = (PSDevice) Context;
108 NTSTATUS ntStatus;
109
110 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Interrupt Polling Thread\n");
111
112 spin_lock_irq(&pDevice->lock);
113 if (pDevice->fKillEventPollingThread != TRUE) {
114 ntStatus = PIPEnsInterruptRead(pDevice);
115 }
116 spin_unlock_irq(&pDevice->lock);
117
118 }
119
120
121NTSTATUS
122INTnsProcessData(
123 IN PSDevice pDevice
124 )
125{
126 NTSTATUS status = STATUS_SUCCESS;
127 PSINTData pINTData;
128 PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
129 struct net_device_stats* pStats = &pDevice->stats;
130
131
132 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsInterruptProcessData\n");
133
134 pINTData = (PSINTData) pDevice->intBuf.pDataBuf;
135 if (BITbIsBitOn(pINTData->byTSR0, TSR_VALID)) {
136 STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt0 & 0x0F), (BYTE) (pINTData->byPkt0>>4), pINTData->byTSR0);
137 BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic), pINTData->byTSR0, pINTData->byPkt0);
138 //DBG_PRN_GRP01(("TSR0 %02x\n", pINTData->byTSR0));
139 }
140 if (BITbIsBitOn(pINTData->byTSR1, TSR_VALID)) {
141 STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt1 & 0x0F), (BYTE) (pINTData->byPkt1>>4), pINTData->byTSR1);
142 BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic), pINTData->byTSR1, pINTData->byPkt1);
143 //DBG_PRN_GRP01(("TSR1 %02x\n", pINTData->byTSR1));
144 }
145 if (BITbIsBitOn(pINTData->byTSR2, TSR_VALID)) {
146 STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt2 & 0x0F), (BYTE) (pINTData->byPkt2>>4), pINTData->byTSR2);
147 BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic), pINTData->byTSR2, pINTData->byPkt2);
148 //DBG_PRN_GRP01(("TSR2 %02x\n", pINTData->byTSR2));
149 }
150 if (BITbIsBitOn(pINTData->byTSR3, TSR_VALID)) {
151 STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt3 & 0x0F), (BYTE) (pINTData->byPkt3>>4), pINTData->byTSR3);
152 BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic), pINTData->byTSR3, pINTData->byPkt3);
153 //DBG_PRN_GRP01(("TSR3 %02x\n", pINTData->byTSR3));
154 }
155 if ( pINTData->byISR0 != 0 ) {
156 if ( BITbIsBitOn(pINTData->byISR0, ISR_BNTX) ) {
157
158 if (pDevice->eOPMode == OP_MODE_AP) {
159 if(pMgmt->byDTIMCount > 0) {
160 pMgmt->byDTIMCount --;
161 pMgmt->sNodeDBTable[0].bRxPSPoll = FALSE;
162 } else if(pMgmt->byDTIMCount == 0) {
163 // check if mutltcast tx bufferring
164 pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1;
165 pMgmt->sNodeDBTable[0].bRxPSPoll = TRUE;
166 if (pMgmt->sNodeDBTable[0].bPSEnable) {
167 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RX_PSPOLL, NULL);
168 }
169 }
170 bScheduleCommand((HANDLE)pDevice, WLAN_CMD_BECON_SEND, NULL);
171 } // if (pDevice->eOPMode == OP_MODE_AP)
172
173 pDevice->bBeaconSent = TRUE;
174 } else {
175 pDevice->bBeaconSent = FALSE;
176 }
177 if ( BITbIsBitOn(pINTData->byISR0, ISR_TBTT) ) {
178 if ( pDevice->bEnablePSMode ) {
179 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_TBTT_WAKEUP, NULL);
180 }
181 if ( pDevice->bChannelSwitch ) {
182 pDevice->byChannelSwitchCount--;
183 if ( pDevice->byChannelSwitchCount == 0 ) {
184 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_11H_CHSW, NULL);
185 }
186 }
187 }
188 LODWORD(pDevice->qwCurrTSF) = pINTData->dwLoTSF;
189 HIDWORD(pDevice->qwCurrTSF) = pINTData->dwHiTSF;
190 //DBG_PRN_GRP01(("ISR0 = %02x ,LoTsf = %08x,HiTsf = %08x\n", pINTData->byISR0, pINTData->dwLoTSF,pINTData->dwHiTSF));
191
192 STAvUpdate802_11Counter(&pDevice->s802_11Counter, &pDevice->scStatistic, pINTData->byRTSSuccess,
193 pINTData->byRTSFail, pINTData->byACKFail, pINTData->byFCSErr );
194 STAvUpdateIsrStatCounter(&pDevice->scStatistic, pINTData->byISR0, pINTData->byISR1);
195
196 }
197
198 if ( pINTData->byISR1 != 0 ) {
199 if ( BITbIsBitOn(pINTData->byISR1, ISR_GPIO3) ) {
200 bScheduleCommand((HANDLE) pDevice, WLAN_CMD_RADIO, NULL);
201 }
202 }
203 pDevice->intBuf.uDataLen = 0;
204 pDevice->intBuf.bInUse = FALSE;
205
206 pStats->tx_packets = pDevice->scStatistic.ullTsrOK;
207 pStats->tx_bytes = pDevice->scStatistic.ullTxDirectedBytes +
208 pDevice->scStatistic.ullTxMulticastBytes +
209 pDevice->scStatistic.ullTxBroadcastBytes;
210 pStats->tx_errors = pDevice->scStatistic.dwTsrErr;
211 pStats->tx_dropped = pDevice->scStatistic.dwTsrErr;
212
213 return status;
214}