int.c 6.2 KB

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