import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / connectivity / combo / drv_wlan / mt6620 / wlan / nic / p2p_nic.c
1 /*
2 ** $Id: @(#) p2p_nic.c@@
3 */
4
5 /*! \file p2p_nic.c
6 \brief Wi-Fi Direct Functions that provide operation in NIC's (Network Interface Card) point of view.
7
8 This file includes functions which unite multiple hal(Hardware) operations
9 and also take the responsibility of Software Resource Management in order
10 to keep the synchronization with Hardware Manipulation.
11 */
12
13
14
15
16
17 /*******************************************************************************
18 * C O M P I L E R F L A G S
19 ********************************************************************************
20 */
21
22 /*******************************************************************************
23 * E X T E R N A L R E F E R E N C E S
24 ********************************************************************************
25 */
26
27 #include "precomp.h"
28
29 /*******************************************************************************
30 * C O N S T A N T S
31 ********************************************************************************
32 */
33
34 /*******************************************************************************
35 * D A T A T Y P E S
36 ********************************************************************************
37 */
38
39 /*******************************************************************************
40 * P U B L I C D A T A
41 ********************************************************************************
42 */
43
44 /*******************************************************************************
45 * P R I V A T E D A T A
46 ********************************************************************************
47 */
48
49 /*******************************************************************************
50 * M A C R O S
51 ********************************************************************************
52 */
53
54 /*******************************************************************************
55 * F U N C T I O N D E C L A R A T I O N S
56 ********************************************************************************
57 */
58
59 /*******************************************************************************
60 * F U N C T I O N S
61 ********************************************************************************
62 */
63
64
65 /*----------------------------------------------------------------------------*/
66 /*!
67 * @brief When Probe Rsp & Beacon frame is received and decide a P2P device,
68 * this function will be invoked to buffer scan result
69 *
70 * @param prAdapter Pointer to the Adapter structure.
71 * @param prEventScanResult Pointer of EVENT_SCAN_RESULT_T.
72 *
73 * @return (none)
74 */
75 /*----------------------------------------------------------------------------*/
76 VOID
77 nicRxAddP2pDevice(IN P_ADAPTER_T prAdapter,
78 IN P_EVENT_P2P_DEV_DISCOVER_RESULT_T prP2pResult,
79 IN PUINT_8 pucRxIEBuf, IN UINT_16 u2RxIELength)
80 {
81 P_P2P_INFO_T prP2pInfo = (P_P2P_INFO_T) NULL;
82 P_EVENT_P2P_DEV_DISCOVER_RESULT_T prTargetResult = (P_EVENT_P2P_DEV_DISCOVER_RESULT_T) NULL;
83 UINT_32 u4Idx = 0;
84 BOOLEAN bUpdate = FALSE;
85
86 PUINT_8 pucIeBuf = (PUINT_8) NULL;
87 UINT_16 u2IELength = 0;
88 UINT_8 zeroMac[] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
89
90 ASSERT(prAdapter);
91
92 prP2pInfo = prAdapter->prP2pInfo;
93
94 for (u4Idx = 0; u4Idx < prP2pInfo->u4DeviceNum; u4Idx++) {
95 prTargetResult = &prP2pInfo->arP2pDiscoverResult[u4Idx];
96
97 if (EQUAL_MAC_ADDR(prTargetResult->aucDeviceAddr, prP2pResult->aucDeviceAddr)) {
98 bUpdate = TRUE;
99
100 /* Backup OLD buffer result. */
101 pucIeBuf = prTargetResult->pucIeBuf;
102 u2IELength = prTargetResult->u2IELength;
103
104 /* Update Device Info. */
105 /* zero */
106 kalMemZero(prTargetResult, sizeof(EVENT_P2P_DEV_DISCOVER_RESULT_T));
107
108 /* then buffer */
109 kalMemCopy(prTargetResult,
110 (PVOID) prP2pResult, sizeof(EVENT_P2P_DEV_DISCOVER_RESULT_T));
111
112 /* See if new IE length is longer or not. */
113 if ((u2RxIELength > u2IELength) && (u2IELength != 0)) {
114 /* Buffer is not enough. */
115 u2RxIELength = u2IELength;
116 } else if ((u2IELength == 0) && (u2RxIELength != 0)) {
117 /* RX new IE buf. */
118 ASSERT(pucIeBuf == NULL);
119 pucIeBuf = prP2pInfo->pucCurrIePtr;
120
121 if (((UINT_32) prP2pInfo->pucCurrIePtr + (UINT_32) u2RxIELength) >
122 (UINT_32) &prP2pInfo->
123 aucCommIePool[CFG_MAX_COMMON_IE_BUF_LEN]) {
124 /* Common Buffer is no enough. */
125 u2RxIELength =
126 (UINT_16) ((UINT_32) &prP2pInfo->
127 aucCommIePool[CFG_MAX_COMMON_IE_BUF_LEN] -
128 (UINT_32) prP2pInfo->pucCurrIePtr);
129 }
130
131 /* Step to next buffer address. */
132 prP2pInfo->pucCurrIePtr =
133 (PUINT_8) ((UINT_32) prP2pInfo->pucCurrIePtr +
134 (UINT_32) u2RxIELength);
135 }
136
137 /* Restore buffer pointer. */
138 prTargetResult->pucIeBuf = pucIeBuf;
139
140 if (pucRxIEBuf) {
141 /* If new received IE is availabe.
142 * Replace the old one & update new IE length.
143 */
144 kalMemCopy(pucIeBuf, pucRxIEBuf, u2RxIELength);
145 prTargetResult->u2IELength = u2RxIELength;
146 } else {
147 /* There is no new IE information, keep the old one. */
148 prTargetResult->u2IELength = u2IELength;
149 }
150 }
151 }
152
153 if (!bUpdate) {
154 /* We would flush the whole scan result after each scan request is issued.
155 * If P2P device is too many, it may over the scan list.
156 */
157 if ((u4Idx < CFG_MAX_NUM_BSS_LIST) && (UNEQUAL_MAC_ADDR(zeroMac, prP2pResult->aucDeviceAddr))) { /* whsu:XXX */
158 prTargetResult = &prP2pInfo->arP2pDiscoverResult[u4Idx];
159
160 /* zero */
161 kalMemZero(prTargetResult, sizeof(EVENT_P2P_DEV_DISCOVER_RESULT_T));
162
163 /* then buffer */
164 kalMemCopy(prTargetResult,
165 (PVOID) prP2pResult, sizeof(EVENT_P2P_DEV_DISCOVER_RESULT_T));
166
167 /* printk("DVC FND %d " MACSTR", " MACSTR "\n", prP2pInfo->u4DeviceNum, MAC2STR(prP2pResult->aucDeviceAddr), MAC2STR(prTargetResult->aucDeviceAddr)); */
168
169 if (u2RxIELength) {
170 prTargetResult->pucIeBuf = prP2pInfo->pucCurrIePtr;
171
172 if (((UINT_32) prP2pInfo->pucCurrIePtr + (UINT_32) u2RxIELength) >
173 (UINT_32) &prP2pInfo->
174 aucCommIePool[CFG_MAX_COMMON_IE_BUF_LEN]) {
175 /* Common Buffer is no enough. */
176 u2IELength =
177 (UINT_16) ((UINT_32) &prP2pInfo->
178 aucCommIePool[CFG_MAX_COMMON_IE_BUF_LEN] -
179 (UINT_32) prP2pInfo->pucCurrIePtr);
180 } else {
181 u2IELength = u2RxIELength;
182 }
183
184 prP2pInfo->pucCurrIePtr =
185 (PUINT_8) ((UINT_32) prP2pInfo->pucCurrIePtr +
186 (UINT_32) u2IELength);
187
188 kalMemCopy((PVOID) prTargetResult->pucIeBuf, (PVOID) pucRxIEBuf,
189 (UINT_32) u2IELength);
190 prTargetResult->u2IELength = u2IELength;
191 } else {
192 prTargetResult->pucIeBuf = NULL;
193 prTargetResult->u2IELength = 0;
194 }
195
196 prP2pInfo->u4DeviceNum++;
197
198 } else {
199 /* TODO: Fixme to replace an old one. (?) */
200 ASSERT(FALSE);
201 }
202 }
203 } /* nicRxAddP2pDevice */