epping_rx.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /*
  2. * Copyright (c) 2014-2017, 2019 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. /*========================================================================
  19. \file epping_rx.c
  20. \brief WLAN End Point Ping test tool implementation
  21. ========================================================================*/
  22. /*--------------------------------------------------------------------------
  23. Include Files
  24. ------------------------------------------------------------------------*/
  25. #include <cds_api.h>
  26. #include <cds_sched.h>
  27. #include <linux/etherdevice.h>
  28. #include <linux/firmware.h>
  29. #include <wni_api.h>
  30. #include <wlan_ptt_sock_svc.h>
  31. #include <linux/wireless.h>
  32. #include <net/cfg80211.h>
  33. #include <linux/rtnetlink.h>
  34. #include <linux/semaphore.h>
  35. #include <linux/ctype.h>
  36. #include "epping_main.h"
  37. #include "epping_internal.h"
  38. #include "epping_test.h"
  39. #include <wlan_hdd_napi.h>
  40. #define AR6000_MAX_RX_BUFFERS 16
  41. #define AR6000_BUFFER_SIZE 1664
  42. #define AR6000_MIN_HEAD_ROOM 64
  43. static bool enb_rx_dump;
  44. #ifdef HIF_SDIO
  45. void epping_refill(void *ctx, HTC_ENDPOINT_ID Endpoint)
  46. {
  47. epping_context_t *pEpping_ctx = (epping_context_t *) ctx;
  48. void *osBuf;
  49. int RxBuffers;
  50. int buffersToRefill;
  51. HTC_PACKET *pPacket;
  52. HTC_PACKET_QUEUE queue;
  53. buffersToRefill = (int)AR6000_MAX_RX_BUFFERS -
  54. htc_get_num_recv_buffers(pEpping_ctx->HTCHandle, Endpoint);
  55. if (buffersToRefill <= 0) {
  56. /* fast return, nothing to fill */
  57. return;
  58. }
  59. INIT_HTC_PACKET_QUEUE(&queue);
  60. EPPING_LOG(QDF_TRACE_LEVEL_INFO,
  61. "%s: providing htc with %d buffers at eid=%d\n",
  62. __func__, buffersToRefill, Endpoint);
  63. for (RxBuffers = 0; RxBuffers < buffersToRefill; RxBuffers++) {
  64. osBuf = qdf_nbuf_alloc(NULL, AR6000_BUFFER_SIZE,
  65. AR6000_MIN_HEAD_ROOM, 4, false);
  66. if (!osBuf) {
  67. break;
  68. }
  69. /* the HTC packet wrapper is at the head of the reserved area
  70. * in the skb */
  71. pPacket = (HTC_PACKET *) (A_NETBUF_HEAD(osBuf));
  72. /* set re-fill info */
  73. SET_HTC_PACKET_INFO_RX_REFILL(pPacket, osBuf,
  74. qdf_nbuf_data(osBuf),
  75. AR6000_BUFFER_SIZE, Endpoint);
  76. SET_HTC_PACKET_NET_BUF_CONTEXT(pPacket, osBuf);
  77. /* add to queue */
  78. HTC_PACKET_ENQUEUE(&queue, pPacket);
  79. }
  80. if (!HTC_QUEUE_EMPTY(&queue)) {
  81. /* add packets */
  82. htc_add_receive_pkt_multiple(pEpping_ctx->HTCHandle, &queue);
  83. }
  84. }
  85. #endif /* HIF_SDIO */
  86. void epping_rx(void *ctx, HTC_PACKET *pPacket)
  87. {
  88. epping_context_t *pEpping_ctx = (epping_context_t *) ctx;
  89. epping_adapter_t *adapter = pEpping_ctx->epping_adapter;
  90. struct net_device *dev = adapter->dev;
  91. QDF_STATUS status = pPacket->Status;
  92. HTC_ENDPOINT_ID eid = pPacket->Endpoint;
  93. struct sk_buff *pktSkb = (struct sk_buff *)pPacket->pPktContext;
  94. EPPING_LOG(QDF_TRACE_LEVEL_INFO,
  95. "%s: adapter = 0x%pK eid=%d, skb=0x%pK, data=0x%pK, len=0x%x status:%d",
  96. __func__, adapter, eid, pktSkb, pPacket->pBuffer,
  97. pPacket->ActualLength, status);
  98. if (status != QDF_STATUS_SUCCESS) {
  99. if (status != QDF_STATUS_E_CANCELED) {
  100. EPPING_LOG(QDF_TRACE_LEVEL_ERROR, "%s: RX ERR (%d)",
  101. __func__, status);
  102. }
  103. qdf_nbuf_free(pktSkb);
  104. return;
  105. }
  106. /* deliver to up layer */
  107. if (pktSkb) {
  108. if (EPPING_ALIGNMENT_PAD > 0) {
  109. A_NETBUF_PULL(pktSkb, EPPING_ALIGNMENT_PAD);
  110. }
  111. if (enb_rx_dump)
  112. epping_hex_dump((void *)qdf_nbuf_data(pktSkb),
  113. pktSkb->len, __func__);
  114. pktSkb->dev = dev;
  115. if ((pktSkb->dev->flags & IFF_UP) == IFF_UP) {
  116. pktSkb->protocol = eth_type_trans(pktSkb, pktSkb->dev);
  117. ++adapter->stats.rx_packets;
  118. adapter->stats.rx_bytes += pktSkb->len;
  119. qdf_net_buf_debug_release_skb(pktSkb);
  120. if (hdd_napi_enabled(HDD_NAPI_ANY))
  121. netif_receive_skb(pktSkb);
  122. else
  123. netif_rx_ni(pktSkb);
  124. if ((adapter->stats.rx_packets %
  125. EPPING_STATS_LOG_COUNT) == 0) {
  126. EPPING_LOG(QDF_TRACE_LEVEL_FATAL,
  127. "%s: total_rx_pkts = %lu",
  128. __func__,
  129. adapter->stats.rx_packets);
  130. }
  131. } else {
  132. ++adapter->stats.rx_dropped;
  133. qdf_nbuf_free(pktSkb);
  134. }
  135. }
  136. }