Commit | Line | Data |
---|---|---|
92b96797 FB |
1 | /* |
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 | ||
92b96797 | 35 | #include "int.h" |
92b96797 | 36 | #include "mib.h" |
92b96797 | 37 | #include "tmacro.h" |
92b96797 | 38 | #include "mac.h" |
92b96797 | 39 | #include "power.h" |
92b96797 | 40 | #include "bssdb.h" |
92b96797 | 41 | #include "usbpipe.h" |
92b96797 FB |
42 | |
43 | /*--------------------- Static Definitions -------------------------*/ | |
44 | //static int msglevel =MSG_LEVEL_DEBUG; | |
45 | static int msglevel =MSG_LEVEL_INFO; | |
46 | ||
47 | ||
48 | /*--------------------- Static Classes ----------------------------*/ | |
49 | ||
50 | /*--------------------- Static Variables --------------------------*/ | |
51 | ||
52 | /*--------------------- Static Functions --------------------------*/ | |
53 | ||
54 | /*--------------------- Export Variables --------------------------*/ | |
55 | ||
56 | ||
57 | /*--------------------- Export Functions --------------------------*/ | |
58 | ||
59 | ||
60 | /*+ | |
61 | * | |
62 | * Function: InterruptPollingThread | |
63 | * | |
64 | * Synopsis: Thread running at IRQL PASSIVE_LEVEL. | |
65 | * | |
66 | * Arguments: Device Extension | |
67 | * | |
68 | * Returns: | |
69 | * | |
70 | * Algorithm: Call USBD for input data; | |
71 | * | |
72 | * History: dd-mm-yyyy Author Comment | |
73 | * | |
74 | * | |
75 | * Notes: | |
76 | * | |
77 | * USB reads are by nature 'Blocking', and when in a read, the device looks like it's | |
78 | * in a 'stall' condition, so we deliberately time out every second if we've gotten no data | |
79 | * | |
80 | -*/ | |
81 | VOID | |
82 | INTvWorkItem( | |
83 | PVOID Context | |
84 | ) | |
85 | { | |
86 | PSDevice pDevice = (PSDevice) Context; | |
87 | NTSTATUS ntStatus; | |
88 | ||
89 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Interrupt Polling Thread\n"); | |
90 | ||
91 | spin_lock_irq(&pDevice->lock); | |
92 | if (pDevice->fKillEventPollingThread != TRUE) { | |
93 | ntStatus = PIPEnsInterruptRead(pDevice); | |
94 | } | |
95 | spin_unlock_irq(&pDevice->lock); | |
96 | ||
97 | } | |
98 | ||
99 | ||
100 | NTSTATUS | |
101 | INTnsProcessData( | |
102 | IN PSDevice pDevice | |
103 | ) | |
104 | { | |
105 | NTSTATUS status = STATUS_SUCCESS; | |
106 | PSINTData pINTData; | |
107 | PSMgmtObject pMgmt = &(pDevice->sMgmtObj); | |
108 | struct net_device_stats* pStats = &pDevice->stats; | |
109 | ||
110 | ||
111 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsInterruptProcessData\n"); | |
112 | ||
113 | pINTData = (PSINTData) pDevice->intBuf.pDataBuf; | |
8a3d91b0 | 114 | if (pINTData->byTSR0 & TSR_VALID) { |
92b96797 FB |
115 | STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt0 & 0x0F), (BYTE) (pINTData->byPkt0>>4), pINTData->byTSR0); |
116 | BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic), pINTData->byTSR0, pINTData->byPkt0); | |
117 | //DBG_PRN_GRP01(("TSR0 %02x\n", pINTData->byTSR0)); | |
118 | } | |
8a3d91b0 | 119 | if (pINTData->byTSR1 & TSR_VALID) { |
92b96797 FB |
120 | STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt1 & 0x0F), (BYTE) (pINTData->byPkt1>>4), pINTData->byTSR1); |
121 | BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic), pINTData->byTSR1, pINTData->byPkt1); | |
122 | //DBG_PRN_GRP01(("TSR1 %02x\n", pINTData->byTSR1)); | |
123 | } | |
8a3d91b0 | 124 | if (pINTData->byTSR2 & TSR_VALID) { |
92b96797 FB |
125 | STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt2 & 0x0F), (BYTE) (pINTData->byPkt2>>4), pINTData->byTSR2); |
126 | BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic), pINTData->byTSR2, pINTData->byPkt2); | |
127 | //DBG_PRN_GRP01(("TSR2 %02x\n", pINTData->byTSR2)); | |
128 | } | |
8a3d91b0 | 129 | if (pINTData->byTSR3 & TSR_VALID) { |
92b96797 FB |
130 | STAvUpdateTDStatCounter (&(pDevice->scStatistic), (BYTE) (pINTData->byPkt3 & 0x0F), (BYTE) (pINTData->byPkt3>>4), pINTData->byTSR3); |
131 | BSSvUpdateNodeTxCounter (pDevice, &(pDevice->scStatistic), pINTData->byTSR3, pINTData->byPkt3); | |
132 | //DBG_PRN_GRP01(("TSR3 %02x\n", pINTData->byTSR3)); | |
133 | } | |
134 | if ( pINTData->byISR0 != 0 ) { | |
8a3d91b0 | 135 | if (pINTData->byISR0 & ISR_BNTX) { |
92b96797 FB |
136 | |
137 | if (pDevice->eOPMode == OP_MODE_AP) { | |
138 | if(pMgmt->byDTIMCount > 0) { | |
139 | pMgmt->byDTIMCount --; | |
140 | pMgmt->sNodeDBTable[0].bRxPSPoll = FALSE; | |
141 | } else if(pMgmt->byDTIMCount == 0) { | |
142 | // check if mutltcast tx bufferring | |
143 | pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1; | |
144 | pMgmt->sNodeDBTable[0].bRxPSPoll = TRUE; | |
145 | if (pMgmt->sNodeDBTable[0].bPSEnable) { | |
146 | bScheduleCommand((HANDLE)pDevice, WLAN_CMD_RX_PSPOLL, NULL); | |
147 | } | |
148 | } | |
149 | bScheduleCommand((HANDLE)pDevice, WLAN_CMD_BECON_SEND, NULL); | |
150 | } // if (pDevice->eOPMode == OP_MODE_AP) | |
151 | ||
152 | pDevice->bBeaconSent = TRUE; | |
153 | } else { | |
154 | pDevice->bBeaconSent = FALSE; | |
155 | } | |
8a3d91b0 | 156 | if (pINTData->byISR0 & ISR_TBTT) { |
92b96797 FB |
157 | if ( pDevice->bEnablePSMode ) { |
158 | bScheduleCommand((HANDLE) pDevice, WLAN_CMD_TBTT_WAKEUP, NULL); | |
159 | } | |
160 | if ( pDevice->bChannelSwitch ) { | |
161 | pDevice->byChannelSwitchCount--; | |
162 | if ( pDevice->byChannelSwitchCount == 0 ) { | |
163 | bScheduleCommand((HANDLE) pDevice, WLAN_CMD_11H_CHSW, NULL); | |
164 | } | |
165 | } | |
166 | } | |
167 | LODWORD(pDevice->qwCurrTSF) = pINTData->dwLoTSF; | |
168 | HIDWORD(pDevice->qwCurrTSF) = pINTData->dwHiTSF; | |
169 | //DBG_PRN_GRP01(("ISR0 = %02x ,LoTsf = %08x,HiTsf = %08x\n", pINTData->byISR0, pINTData->dwLoTSF,pINTData->dwHiTSF)); | |
170 | ||
171 | STAvUpdate802_11Counter(&pDevice->s802_11Counter, &pDevice->scStatistic, pINTData->byRTSSuccess, | |
172 | pINTData->byRTSFail, pINTData->byACKFail, pINTData->byFCSErr ); | |
173 | STAvUpdateIsrStatCounter(&pDevice->scStatistic, pINTData->byISR0, pINTData->byISR1); | |
174 | ||
175 | } | |
176 | ||
177 | if ( pINTData->byISR1 != 0 ) { | |
8a3d91b0 | 178 | if (pINTData->byISR1 & ISR_GPIO3) { |
92b96797 FB |
179 | bScheduleCommand((HANDLE) pDevice, WLAN_CMD_RADIO, NULL); |
180 | } | |
181 | } | |
182 | pDevice->intBuf.uDataLen = 0; | |
183 | pDevice->intBuf.bInUse = FALSE; | |
184 | ||
185 | pStats->tx_packets = pDevice->scStatistic.ullTsrOK; | |
186 | pStats->tx_bytes = pDevice->scStatistic.ullTxDirectedBytes + | |
187 | pDevice->scStatistic.ullTxMulticastBytes + | |
188 | pDevice->scStatistic.ullTxBroadcastBytes; | |
189 | pStats->tx_errors = pDevice->scStatistic.dwTsrErr; | |
190 | pStats->tx_dropped = pDevice->scStatistic.dwTsrErr; | |
191 | ||
192 | return status; | |
193 | } |