tzh
2024-08-15 d4a1bd480003f3e1a0590bc46fbcb24f05652ca7
longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/aicwf_txrxif.c
old mode 100644new mode 100755
....@@ -25,6 +25,7 @@
2525 #ifdef AICWF_SDIO_SUPPORT
2626 #include "sdio_host.h"
2727 #endif
28
+#include "aic_bsp_export.h"
2829
2930 int aicwf_bus_init(uint bus_hdrlen, struct device *dev)
3031 {
....@@ -99,8 +100,9 @@
99100 #endif
100101 #ifdef AICWF_SDIO_SUPPORT
101102 sdiodev = bus_if->bus_priv.sdio;
102
- if (g_rwnx_plat->enabled)
103
+ if (g_rwnx_plat && g_rwnx_plat->enabled) {
103104 rwnx_platform_deinit(sdiodev->rwnx_hw);
105
+ }
104106 #endif
105107
106108 if (bus_if->cmd_buf) {
....@@ -109,7 +111,7 @@
109111 }
110112
111113 if (bus_if->bustx_thread) {
112
- complete(&bus_if->bustx_trgg);
114
+ complete_all(&bus_if->bustx_trgg);
113115 kthread_stop(bus_if->bustx_thread);
114116 bus_if->bustx_thread = NULL;
115117 }
....@@ -149,7 +151,11 @@
149151 #endif
150152
151153 atomic_set(&tx_priv->aggr_count, 0);
154
+#ifdef AICBSP_RESV_MEM_SUPPORT
155
+ tx_priv->aggr_buf = aicbsp_resv_mem_alloc_skb(MAX_AGGR_TXPKT_LEN, AIC_RESV_MEM_TXDATA);
156
+#else
152157 tx_priv->aggr_buf = dev_alloc_skb(MAX_AGGR_TXPKT_LEN);
158
+#endif
153159 if (!tx_priv->aggr_buf) {
154160 txrx_err("Alloc bus->txdata_buf failed!\n");
155161 kfree(tx_priv);
....@@ -163,10 +169,14 @@
163169
164170 void aicwf_tx_deinit(struct aicwf_tx_priv *tx_priv)
165171 {
166
- if (tx_priv && tx_priv->aggr_buf)
172
+ if (tx_priv && tx_priv->aggr_buf) {
173
+#ifdef AICBSP_RESV_MEM_SUPPORT
174
+ aicbsp_resv_mem_kfree_skb(tx_priv->aggr_buf, AIC_RESV_MEM_TXDATA);
175
+#else
167176 dev_kfree_skb(tx_priv->aggr_buf);
168
-
169
- kfree(tx_priv);
177
+#endif
178
+ kfree(tx_priv);
179
+ }
170180 }
171181
172182 #ifdef AICWF_SDIO_SUPPORT
....@@ -187,6 +197,41 @@
187197 return true;
188198 }
189199 #endif
200
+
201
+static void aicwf_count_rx_tp(struct aicwf_rx_priv *rx_priv, int len)
202
+{
203
+#ifdef AICWF_SDIO_SUPPORT
204
+ struct device *rwnx_dev = rx_priv->sdiodev->dev;
205
+#endif
206
+#ifdef AICWF_USB_SUPPORT
207
+ struct device *rwnx_dev = rx_priv->usbdev->dev;
208
+#endif
209
+ long long timeus = 0;
210
+ char *envp[] = {
211
+ "SYSTEM=WIFI",
212
+ "EVENT=BOOSTREQ",
213
+ "SUBEVENT=RX",
214
+ "TIMEOUT_SEC=5",
215
+ NULL};
216
+
217
+ rx_priv->rx_data_len += len;
218
+
219
+ rx_priv->rxtimeend = ktime_get();
220
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
221
+ timeus = div_u64(rx_priv->rxtimeend.tv64 - rx_priv->rxtimebegin.tv64, NSEC_PER_USEC);
222
+#else
223
+ timeus = ktime_to_us(rx_priv->rxtimeend - rx_priv->rxtimebegin);
224
+#endif
225
+
226
+ if (timeus >= USEC_PER_SEC) {
227
+ // calc & send uevent
228
+ if (div_u64(rx_priv->rx_data_len, timeus) >= 6)
229
+ kobject_uevent_env(&rwnx_dev->kobj, KOBJ_CHANGE, envp);
230
+
231
+ rx_priv->rx_data_len = 0;
232
+ rx_priv->rxtimebegin = rx_priv->rxtimeend;
233
+ }
234
+}
190235
191236 int aicwf_process_rxframes(struct aicwf_rx_priv *rx_priv)
192237 {
....@@ -224,43 +269,48 @@
224269 else
225270 adjust_len = aggr_len;
226271
227
- skb_inblock = __dev_alloc_skb(aggr_len + CCMP_OR_WEP_INFO, GFP_KERNEL);
228
- if (skb_inblock == NULL) {
229
- txrx_err("no more space! skip\n");
230
- skb_pull(skb, adjust_len);
231
- continue;
272
+ skb_inblock = __dev_alloc_skb(aggr_len + CCMP_OR_WEP_INFO, GFP_KERNEL);
273
+ if (skb_inblock == NULL) {
274
+ txrx_err("no more space! skip\n");
275
+ skb_pull(skb, adjust_len);
276
+ continue;
277
+ }
278
+
279
+ skb_put(skb_inblock, aggr_len);
280
+ memcpy(skb_inblock->data, data, aggr_len);
281
+ aicwf_count_rx_tp(rx_priv, aggr_len);
282
+ rwnx_rxdataind_aicwf(rx_priv->sdiodev->rwnx_hw, skb_inblock, (void *)rx_priv);
283
+ skb_pull(skb, adjust_len);
284
+ } else {
285
+ // type : config
286
+ aggr_len = pkt_len;
287
+
288
+ if (aggr_len & (RX_ALIGNMENT - 1))
289
+ adjust_len = roundup(aggr_len, RX_ALIGNMENT);
290
+ else
291
+ adjust_len = aggr_len;
292
+
293
+ msg = kmalloc(aggr_len+4, GFP_KERNEL);
294
+ if (msg == NULL) {
295
+ txrx_err("no more space for msg!\n");
296
+ aicwf_dev_skb_free(skb);
297
+ return -EBADE;
298
+ }
299
+
300
+ memcpy(msg, data, aggr_len + 4);
301
+ if ((*(msg + 2) & 0x7f) == SDIO_TYPE_CFG_CMD_RSP)
302
+ rwnx_rx_handle_msg(rx_priv->sdiodev->rwnx_hw, (struct ipc_e2a_msg *)(msg + 4));
303
+
304
+ if ((*(msg + 2) & 0x7f) == SDIO_TYPE_CFG_DATA_CFM)
305
+ aicwf_sdio_host_tx_cfm_handler(&(rx_priv->sdiodev->rwnx_hw->sdio_env), (u32 *)(msg + 4));
306
+
307
+ if ((*(msg + 2) & 0x7f) == SDIO_TYPE_CFG_PRINT)
308
+ rwnx_rx_handle_print(rx_priv->sdiodev->rwnx_hw, msg + 4, aggr_len);
309
+
310
+ skb_pull(skb, adjust_len+4);
311
+ kfree(msg);
312
+ }
232313 }
233
-
234
- skb_put(skb_inblock, aggr_len);
235
- memcpy(skb_inblock->data, data, aggr_len);
236
- rwnx_rxdataind_aicwf(rx_priv->sdiodev->rwnx_hw, skb_inblock, (void *)rx_priv);
237
- skb_pull(skb, adjust_len);
238
- } else {
239
- // type : config
240
- aggr_len = pkt_len;
241
-
242
- if (aggr_len & (RX_ALIGNMENT - 1))
243
- adjust_len = roundup(aggr_len, RX_ALIGNMENT);
244
- else
245
- adjust_len = aggr_len;
246
-
247
- msg = kmalloc(aggr_len+4, GFP_KERNEL);
248
- if (msg == NULL) {
249
- txrx_err("no more space for msg!\n");
250
- aicwf_dev_skb_free(skb);
251
- return -EBADE;
252
- }
253
-
254
- memcpy(msg, data, aggr_len + 4);
255
- if ((*(msg + 2) & 0x7f) == SDIO_TYPE_CFG_CMD_RSP)
256
- rwnx_rx_handle_msg(rx_priv->sdiodev->rwnx_hw, (struct ipc_e2a_msg *)(msg + 4));
257
-
258
- if ((*(msg + 2) & 0x7f) == SDIO_TYPE_CFG_DATA_CFM)
259
- aicwf_sdio_host_tx_cfm_handler(&(rx_priv->sdiodev->rwnx_hw->sdio_env), (u32 *)(msg + 4));
260
- skb_pull(skb, adjust_len+4);
261
- kfree(msg);
262
- }
263
- }
264314
265315 dev_kfree_skb(skb);
266316 atomic_dec(&rx_priv->rx_cnt);
....@@ -308,15 +358,16 @@
308358 else
309359 adjust_len = aggr_len;
310360
311
- skb_inblock = __dev_alloc_skb(aggr_len + CCMP_OR_WEP_INFO, GFP_KERNEL);//8 is for ccmp mic or wep icv
312
- if (skb_inblock == NULL) {
313
- txrx_err("no more space! skip!\n");
314
- skb_pull(skb, adjust_len);
315
- continue;
316
- }
361
+ skb_inblock = __dev_alloc_skb(aggr_len + CCMP_OR_WEP_INFO, GFP_KERNEL);//8 is for ccmp mic or wep icv
362
+ if (skb_inblock == NULL) {
363
+ txrx_err("no more space! skip!\n");
364
+ skb_pull(skb, adjust_len);
365
+ continue;
366
+ }
317367
318368 skb_put(skb_inblock, aggr_len);
319369 memcpy(skb_inblock->data, data, aggr_len);
370
+ aicwf_count_rx_tp(rx_priv, aggr_len);
320371 rwnx_rxdataind_aicwf(rx_priv->usbdev->rwnx_hw, skb_inblock, (void *)rx_priv);
321372 ///TODO: here need to add rx data process
322373
....@@ -421,7 +472,6 @@
421472 struct reord_ctrl_info *reord_info, *tmp;
422473
423474 txrx_dbg("%s\n", __func__);
424
-
425475 spin_lock_bh(&rx_priv->stas_reord_lock);
426476 list_for_each_entry_safe(reord_info, tmp,
427477 &rx_priv->stas_reord_list, list) {
....@@ -430,17 +480,17 @@
430480 spin_unlock_bh(&rx_priv->stas_reord_lock);
431481 #endif
432482
433
- txrx_dbg("stio rx thread\n");
434483 #ifdef AICWF_SDIO_SUPPORT
484
+ txrx_dbg("sdio rx thread\n");
435485 if (rx_priv->sdiodev->bus_if->busrx_thread) {
436
- complete(&rx_priv->sdiodev->bus_if->busrx_trgg);
486
+ complete_all(&rx_priv->sdiodev->bus_if->busrx_trgg);
437487 kthread_stop(rx_priv->sdiodev->bus_if->busrx_thread);
438488 rx_priv->sdiodev->bus_if->busrx_thread = NULL;
439489 }
440490 #endif
441491 #ifdef AICWF_USB_SUPPORT
442492 if (rx_priv->usbdev->bus_if->busrx_thread) {
443
- complete(&rx_priv->usbdev->bus_if->busrx_trgg);
493
+ complete_all(&rx_priv->usbdev->bus_if->busrx_trgg);
444494 kthread_stop(rx_priv->usbdev->bus_if->busrx_thread);
445495 rx_priv->usbdev->bus_if->busrx_thread = NULL;
446496 }
....@@ -569,48 +619,13 @@
569619 return p;
570620 }
571621
572
-static struct sk_buff *aicwf_skb_dequeue_tail(struct frame_queue *pq, int prio)
573
-{
574
- struct sk_buff_head *q = &pq->queuelist[prio];
575
- struct sk_buff *p = skb_dequeue_tail(q);
576
-
577
- if (!p)
578
- return NULL;
579
-
580
- pq->qcnt--;
581
- return p;
582
-}
583
-
584622 bool aicwf_frame_enq(struct device *dev, struct frame_queue *q, struct sk_buff *pkt, int prio)
585623 {
586
- struct sk_buff *p = NULL;
587
- int prio_modified = -1;
588
-
589624 if (q->queuelist[prio].qlen < q->qmax && q->qcnt < q->qmax) {
590625 aicwf_frame_queue_penq(q, prio, pkt);
591626 return true;
592
- }
593
- if (q->queuelist[prio].qlen >= q->qmax) {
594
- prio_modified = prio;
595
- } else if (q->qcnt >= q->qmax) {
596
- p = aicwf_frame_queue_peek_tail(q, &prio_modified);
597
- if (prio_modified > prio)
598
- return false;
599
- }
600
-
601
- if (prio_modified >= 0) {
602
- if (prio_modified == prio)
603
- return false;
604
-
605
- p = aicwf_skb_dequeue_tail(q, prio_modified);
606
- aicwf_dev_skb_free(p);
607
-
608
- p = aicwf_frame_queue_penq(q, prio_modified, pkt);
609
- if (p == NULL)
610
- txrx_err("failed\n");
611
- }
612
-
613
- return p != NULL;
627
+ } else
628
+ return false;
614629 }
615630
616631