nic_rx.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. /*
  2. * This program is free software; you can redistribute it and/or modify
  3. * it under the terms of the GNU General Public License version 2 as
  4. * published by the Free Software Foundation.
  5. *
  6. * This program is distributed in the hope that it will be useful,
  7. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. * See http://www.gnu.org/licenses/gpl-2.0.html for more details.
  10. */
  11. #ifndef _NIC_RX_H
  12. #define _NIC_RX_H
  13. /*******************************************************************************
  14. * C O M P I L E R F L A G S
  15. ********************************************************************************
  16. */
  17. /*******************************************************************************
  18. * E X T E R N A L R E F E R E N C E S
  19. ********************************************************************************
  20. */
  21. extern P_SW_RFB_T g_arGscnResultsTempBuffer[];
  22. extern UINT_8 g_GscanResultsTempBufferIndex;
  23. extern UINT_8 g_arGscanResultsIndicateNumber[];
  24. extern UINT_8 g_GetResultsBufferedCnt;
  25. extern UINT_8 g_GetResultsCmdCnt;
  26. extern void kalDevLoopbkRxHandle(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb);
  27. /*******************************************************************************
  28. * C O N S T A N T S
  29. ********************************************************************************
  30. */
  31. #define MAX_SEQ_NO 4095
  32. #define MAX_SEQ_NO_COUNT 4096
  33. #define HALF_SEQ_NO_CNOUT 2048
  34. #define HALF_SEQ_NO_COUNT 2048
  35. #define MT6620_FIXED_WIN_SIZE 64
  36. #define CFG_RX_MAX_BA_ENTRY 4
  37. #define CFG_RX_MAX_BA_TID_NUM 8
  38. #define RX_STATUS_FLAG_MORE_PACKET BIT(30)
  39. #define RX_STATUS_CHKSUM_MASK BITS(0, 10)
  40. #define RX_RFB_LEN_FIELD_LEN 4
  41. #define RX_HEADER_OFFSET 2
  42. #define RX_RETURN_INDICATED_RFB_TIMEOUT_SEC 3
  43. #if defined(_HIF_SDIO) && defined(WINDOWS_DDK)
  44. /*! On XP, maximum Tx+Rx Statue <= 64-4(HISR)*/
  45. #define SDIO_MAXIMUM_RX_LEN_NUM 0 /*!< 0~15 (0: un-limited) */
  46. #else
  47. #define SDIO_MAXIMUM_RX_LEN_NUM 0 /*!< 0~15 (0: un-limited) */
  48. #endif
  49. /*******************************************************************************
  50. * D A T A T Y P E S
  51. ********************************************************************************
  52. */
  53. typedef enum _ENUM_RX_STATISTIC_COUNTER_T {
  54. RX_MPDU_TOTAL_COUNT = 0,
  55. RX_SIZE_ERR_DROP_COUNT,
  56. RX_DATA_INDICATION_COUNT,
  57. RX_DATA_RETURNED_COUNT,
  58. RX_DATA_RETAINED_COUNT,
  59. RX_DROP_TOTAL_COUNT,
  60. RX_TYPE_ERR_DROP_COUNT,
  61. RX_CLASS_ERR_DROP_COUNT,
  62. RX_DST_NULL_DROP_COUNT,
  63. #if CFG_TCP_IP_CHKSUM_OFFLOAD || CFG_TCP_IP_CHKSUM_OFFLOAD_NDIS_60
  64. RX_CSUM_TCP_FAILED_COUNT,
  65. RX_CSUM_UDP_FAILED_COUNT,
  66. RX_CSUM_IP_FAILED_COUNT,
  67. RX_CSUM_TCP_SUCCESS_COUNT,
  68. RX_CSUM_UDP_SUCCESS_COUNT,
  69. RX_CSUM_IP_SUCCESS_COUNT,
  70. RX_CSUM_UNKNOWN_L4_PKT_COUNT,
  71. RX_CSUM_UNKNOWN_L3_PKT_COUNT,
  72. RX_IP_V6_PKT_CCOUNT,
  73. #endif
  74. RX_STATISTIC_COUNTER_NUM
  75. } ENUM_RX_STATISTIC_COUNTER_T;
  76. typedef enum _ENUM_RX_PKT_DESTINATION_T {
  77. RX_PKT_DESTINATION_HOST, /* to OS */
  78. RX_PKT_DESTINATION_FORWARD, /* to TX queue for forward, AP mode */
  79. RX_PKT_DESTINATION_HOST_WITH_FORWARD, /* to both TX and OS, AP mode broadcast packet */
  80. RX_PKT_DESTINATION_NULL, /* packet to be freed */
  81. RX_PKT_DESTINATION_NUM
  82. } ENUM_RX_PKT_DESTINATION_T;
  83. struct _SW_RFB_T {
  84. QUE_ENTRY_T rQueEntry;
  85. PVOID pvPacket; /*!< ptr to rx Packet Descriptor */
  86. PUINT_8 pucRecvBuff; /*!< ptr to receive data buffer */
  87. P_HIF_RX_HEADER_T prHifRxHdr;
  88. UINT_32 u4HifRxHdrFlag;
  89. PVOID pvHeader;
  90. UINT_16 u2PacketLen;
  91. UINT_16 u2HeaderLen;
  92. UINT_16 u2SSN;
  93. UINT_8 ucTid;
  94. UINT_8 ucWlanIdx;
  95. UINT_8 ucPacketType;
  96. UINT_8 ucStaRecIdx;
  97. ENUM_CSUM_RESULT_T aeCSUM[CSUM_TYPE_NUM];
  98. ENUM_RX_PKT_DESTINATION_T eDst;
  99. ENUM_TRAFFIC_CLASS_INDEX_T eTC; /* only valid when eDst == FORWARD */
  100. UINT_64 rRxTime;
  101. };
  102. /*! RX configuration type structure */
  103. typedef struct _RX_CTRL_T {
  104. UINT_32 u4RxCachedSize;
  105. PUINT_8 pucRxCached;
  106. QUE_T rFreeSwRfbList;
  107. QUE_T rReceivedRfbList;
  108. QUE_T rIndicatedRfbList;
  109. QUE_T rUnInitializedRfbList;
  110. #if CFG_SDIO_RX_AGG
  111. PUINT_8 pucRxCoalescingBufPtr;
  112. #endif
  113. PVOID apvIndPacket[CFG_RX_MAX_PKT_NUM];
  114. PVOID apvRetainedPacket[CFG_RX_MAX_PKT_NUM];
  115. UINT_8 ucNumIndPacket;
  116. UINT_8 ucNumRetainedPacket;
  117. UINT_64 au8Statistics[RX_STATISTIC_COUNTER_NUM]; /*!< RX Counters */
  118. #if CFG_HIF_STATISTICS
  119. UINT_32 u4TotalRxAccessNum;
  120. UINT_32 u4TotalRxPacketNum;
  121. #endif
  122. #if CFG_HIF_RX_STARVATION_WARNING
  123. UINT_32 u4QueuedCnt;
  124. UINT_32 u4DequeuedCnt;
  125. #endif
  126. #if CFG_RX_PKTS_DUMP
  127. UINT_32 u4RxPktsDumpTypeMask;
  128. #endif
  129. } RX_CTRL_T, *P_RX_CTRL_T;
  130. typedef struct _RX_MAILBOX_T {
  131. UINT_32 u4RxMailbox[2]; /* for Device-to-Host Mailbox */
  132. } RX_MAILBOX_T, *P_RX_MAILBOX_T;
  133. typedef WLAN_STATUS(*PROCESS_RX_MGT_FUNCTION) (P_ADAPTER_T, P_SW_RFB_T);
  134. /*******************************************************************************
  135. * P U B L I C D A T A
  136. ********************************************************************************
  137. */
  138. /*******************************************************************************
  139. * P R I V A T E D A T A
  140. ********************************************************************************
  141. */
  142. /*******************************************************************************
  143. * M A C R O S
  144. ********************************************************************************
  145. */
  146. #define RX_INC_CNT(prRxCtrl, eCounter) \
  147. {((P_RX_CTRL_T)prRxCtrl)->au8Statistics[eCounter]++; }
  148. #define RX_ADD_CNT(prRxCtrl, eCounter, u8Amount) \
  149. {((P_RX_CTRL_T)prRxCtrl)->au8Statistics[eCounter] += (UINT_64)u8Amount; }
  150. #define RX_GET_CNT(prRxCtrl, eCounter) \
  151. (((P_RX_CTRL_T)prRxCtrl)->au8Statistics[eCounter])
  152. #define RX_RESET_ALL_CNTS(prRxCtrl) \
  153. {kalMemZero(&prRxCtrl->au8Statistics[0], sizeof(prRxCtrl->au8Statistics)); }
  154. #define RX_STATUS_TEST_MORE_FLAG(flag) \
  155. ((BOOLEAN)((flag & RX_STATUS_FLAG_MORE_PACKET) ? TRUE : FALSE))
  156. /*******************************************************************************
  157. * F U N C T I O N D E C L A R A T I O N S
  158. ********************************************************************************
  159. */
  160. VOID nicRxInitialize(IN P_ADAPTER_T prAdapter);
  161. VOID nicRxUninitialize(IN P_ADAPTER_T prAdapter);
  162. VOID nicRxProcessRFBs(IN P_ADAPTER_T prAdapter);
  163. #if !CFG_SDIO_INTR_ENHANCE
  164. VOID nicRxReceiveRFBs(IN P_ADAPTER_T prAdapter);
  165. WLAN_STATUS nicRxReadBuffer(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb);
  166. #else
  167. VOID nicRxSDIOReceiveRFBs(IN P_ADAPTER_T prAdapter);
  168. WLAN_STATUS
  169. nicRxEnhanceReadBuffer(IN P_ADAPTER_T prAdapter,
  170. IN UINT_32 u4DataPort, IN UINT_16 u2RxLength, IN OUT P_SW_RFB_T prSwRfb);
  171. #endif /* CFG_SDIO_INTR_ENHANCE */
  172. #if CFG_SDIO_RX_AGG
  173. VOID nicRxSDIOAggReceiveRFBs(IN P_ADAPTER_T prAdapter);
  174. #endif
  175. WLAN_STATUS nicRxSetupRFB(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prRfb);
  176. VOID nicRxReturnRFB(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb);
  177. VOID nicRxReturnRFBwithUninit(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb
  178. , IN BOOLEAN fgIsUninitRfb);
  179. VOID nicProcessRxInterrupt(IN P_ADAPTER_T prAdapter);
  180. VOID nicRxProcessPktWithoutReorder(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb);
  181. VOID nicRxProcessForwardPkt(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb);
  182. VOID nicRxProcessGOBroadcastPkt(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb);
  183. VOID nicRxFillRFB(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb);
  184. VOID nicRxProcessDataPacket(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb);
  185. VOID nicRxProcessEventPacket(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb);
  186. VOID nicRxProcessMgmtPacket(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb);
  187. #if CFG_TCP_IP_CHKSUM_OFFLOAD
  188. VOID nicRxFillChksumStatus(IN P_ADAPTER_T prAdapter, IN OUT P_SW_RFB_T prSwRfb, IN UINT_32 u4TcpUdpIpCksStatus);
  189. VOID nicRxUpdateCSUMStatistics(IN P_ADAPTER_T prAdapter, IN const ENUM_CSUM_RESULT_T aeCSUM[]);
  190. #endif /* CFG_TCP_IP_CHKSUM_OFFLOAD */
  191. VOID nicRxQueryStatus(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucBuffer, OUT PUINT_32 pu4Count);
  192. VOID nicRxClearStatistics(IN P_ADAPTER_T prAdapter);
  193. VOID nicRxQueryStatistics(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucBuffer, OUT PUINT_32 pu4Count);
  194. WLAN_STATUS
  195. nicRxWaitResponse(IN P_ADAPTER_T prAdapter,
  196. IN UINT_8 ucPortIdx, OUT PUINT_8 pucRspBuffer, IN UINT_32 u4MaxRespBufferLen, OUT PUINT_32 pu4Length);
  197. VOID nicRxEnablePromiscuousMode(IN P_ADAPTER_T prAdapter);
  198. VOID nicRxDisablePromiscuousMode(IN P_ADAPTER_T prAdapter);
  199. WLAN_STATUS nicRxFlush(IN P_ADAPTER_T prAdapter);
  200. WLAN_STATUS nicRxProcessActionFrame(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prSwRfb);
  201. #endif /* _NIC_RX_H */