blob: 2718e64e5a327fc219be0c3c0421244acc11f8b0 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302 * Copyright (c) 2014-2016 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28/*========================================================================
29
30 \file epping_main.c
31
32 \brief WLAN End Point Ping test tool implementation
33
34 ========================================================================*/
35
36/*--------------------------------------------------------------------------
37 Include Files
38 ------------------------------------------------------------------------*/
39#include <cds_api.h>
40#include <cds_sched.h>
41#include <linux/etherdevice.h>
42#include <linux/firmware.h>
43#include <wni_api.h>
44#include <wlan_ptt_sock_svc.h>
45#include <linux/wireless.h>
46#include <net/cfg80211.h>
47#include <linux/rtnetlink.h>
48#include <linux/semaphore.h>
49#include <linux/ctype.h>
50#include "epping_main.h"
51#include "epping_internal.h"
52#include "epping_test.h"
53#include <wlan_hdd_napi.h>
54
55#define AR6000_MAX_RX_BUFFERS 16
56#define AR6000_BUFFER_SIZE 1664
57#define AR6000_MIN_HEAD_ROOM 64
58
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053059static bool enb_rx_dump;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080060
61#ifdef HIF_SDIO
62void epping_refill(void *ctx, HTC_ENDPOINT_ID Endpoint)
63{
64 epping_context_t *pEpping_ctx = (epping_context_t *) ctx;
65 void *osBuf;
66 int RxBuffers;
67 int buffersToRefill;
68 HTC_PACKET *pPacket;
69 HTC_PACKET_QUEUE queue;
70
71 buffersToRefill = (int)AR6000_MAX_RX_BUFFERS -
72 htc_get_num_recv_buffers(pEpping_ctx->HTCHandle, Endpoint);
73
74 if (buffersToRefill <= 0) {
75 /* fast return, nothing to fill */
76 return;
77 }
78
79 INIT_HTC_PACKET_QUEUE(&queue);
80
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +053081 EPPING_LOG(QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080082 "%s: providing htc with %d buffers at eid=%d\n",
83 __func__, buffersToRefill, Endpoint);
84
85 for (RxBuffers = 0; RxBuffers < buffersToRefill; RxBuffers++) {
Nirav Shahcbc6d722016-03-01 16:24:53 +053086 osBuf = qdf_nbuf_alloc(NULL, AR6000_BUFFER_SIZE,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080087 AR6000_MIN_HEAD_ROOM, 4, false);
88 if (NULL == osBuf) {
89 break;
90 }
91 /* the HTC packet wrapper is at the head of the reserved area
92 * in the skb */
93 pPacket = (HTC_PACKET *) (A_NETBUF_HEAD(osBuf));
94 /* set re-fill info */
95 SET_HTC_PACKET_INFO_RX_REFILL(pPacket, osBuf,
Nirav Shahcbc6d722016-03-01 16:24:53 +053096 qdf_nbuf_data(osBuf),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080097 AR6000_BUFFER_SIZE, Endpoint);
98 SET_HTC_PACKET_NET_BUF_CONTEXT(pPacket, osBuf);
99 /* add to queue */
100 HTC_PACKET_ENQUEUE(&queue, pPacket);
101 }
102
103 if (!HTC_QUEUE_EMPTY(&queue)) {
104 /* add packets */
105 htc_add_receive_pkt_multiple(pEpping_ctx->HTCHandle, &queue);
106 }
107}
108#endif /* HIF_SDIO */
109
110void epping_rx(void *ctx, HTC_PACKET *pPacket)
111{
112 epping_context_t *pEpping_ctx = (epping_context_t *) ctx;
113 epping_adapter_t *pAdapter = pEpping_ctx->epping_adapter;
114 struct net_device *dev = pAdapter->dev;
115 A_STATUS status = pPacket->Status;
116 HTC_ENDPOINT_ID eid = pPacket->Endpoint;
117 struct sk_buff *pktSkb = (struct sk_buff *)pPacket->pPktContext;
118
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530119 EPPING_LOG(QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800120 "%s: pAdapter = 0x%p eid=%d, skb=0x%p, data=0x%p, len=0x%x status:%d",
121 __func__, pAdapter, eid, pktSkb, pPacket->pBuffer,
122 pPacket->ActualLength, status);
123
124 if (status != A_OK) {
125 if (status != A_ECANCELED) {
Nirav Shahcbc6d722016-03-01 16:24:53 +0530126 printk("%s: RX ERR (%d)\n", __func__, status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800127 }
Nirav Shahcbc6d722016-03-01 16:24:53 +0530128 qdf_nbuf_free(pktSkb);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800129 return;
130 }
131
132 /* deliver to up layer */
133 if (pktSkb) {
134 if (EPPING_ALIGNMENT_PAD > 0) {
135 A_NETBUF_PULL(pktSkb, EPPING_ALIGNMENT_PAD);
136 }
137 if (enb_rx_dump)
Nirav Shahcbc6d722016-03-01 16:24:53 +0530138 epping_hex_dump((void *)qdf_nbuf_data(pktSkb),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800139 pktSkb->len, __func__);
140 pktSkb->dev = dev;
141 if ((pktSkb->dev->flags & IFF_UP) == IFF_UP) {
142 pktSkb->protocol = eth_type_trans(pktSkb, pktSkb->dev);
143 ++pAdapter->stats.rx_packets;
144 pAdapter->stats.rx_bytes += pktSkb->len;
145 if (hdd_napi_enabled(HDD_NAPI_ANY))
146 netif_receive_skb(pktSkb);
147 else
148 netif_rx_ni(pktSkb);
149 if ((pAdapter->stats.rx_packets %
150 EPPING_STATS_LOG_COUNT) == 0) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530151 EPPING_LOG(QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800152 "%s: total_rx_pkts = %lu",
153 __func__,
154 pAdapter->stats.rx_packets);
155 }
156 } else {
157 ++pAdapter->stats.rx_dropped;
Nirav Shahcbc6d722016-03-01 16:24:53 +0530158 qdf_nbuf_free(pktSkb);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800159 }
160 }
161}