Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 041b2c7c authored by Linux Build Service Account's avatar Linux Build Service Account
Browse files

Merge 3bae0eca on remote branch

Change-Id: If0eb5eb0537b87c41934111f22a6c56051bb5f65
parents 3a66174d 3bae0eca
Loading
Loading
Loading
Loading
+23 −2
Original line number Diff line number Diff line
/*
 * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved.
 * Copyright (c) 2013-2019, 2021 The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
@@ -592,9 +592,23 @@ static inline
void ipa_set_rps_per_vdev(struct wlan_ipa_priv *ipa_ctx, uint8_t vdev_id,
			  bool enable)
{
	if (ipa_ctx->rps_enable)
		ipa_ctx->rps_enable(vdev_id, enable);
}

/**
 * wlan_ipa_handle_multiple_sap_evt() - Handle multiple SAP connect/disconnect
 * @ipa_ctx: IPA global context
 * @type: IPA event type.
 *
 * This function is used to disable pipes when multiple SAP are connected and
 * enable pipes back when only one SAP is connected.
 *
 * Return: None
 */
void wlan_ipa_handle_multiple_sap_evt(struct wlan_ipa_priv *ipa_ctx,
				      qdf_ipa_wlan_event type);

#else
static inline
void ipa_set_rps(struct wlan_ipa_priv *ipa_ctx, enum QDF_OPMODE mode,
@@ -607,6 +621,13 @@ void ipa_set_rps_per_vdev(struct wlan_ipa_priv *ipa_ctx, uint8_t vdev_id,
			  bool enable)
{
}

static inline
void wlan_ipa_handle_multiple_sap_evt(struct wlan_ipa_priv *ipa_ctx,
				      qdf_ipa_wlan_event type)
{
}

#endif

/**
+3 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2013-2021 The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
@@ -353,6 +353,7 @@ struct wlan_ipa_iface_context {
 * @num_tx_dequeued: Number of TX dequeued
 * @num_max_pm_queue: Number of packets in PM queue
 * @num_rx_excep: Number of RX IPA exception packets
 * @num_rx_no_iface_eapol: No of EAPOL pkts before iface setup
 * @num_tx_fwd_ok: Number of TX forward packet success
 * @num_tx_fwd_err: Number of TX forward packet failures
 */
@@ -373,6 +374,7 @@ struct wlan_ipa_stats {
	uint64_t num_tx_dequeued;
	uint64_t num_max_pm_queue;
	uint64_t num_rx_excep;
	uint64_t num_rx_no_iface_eapol;
	uint64_t num_tx_fwd_ok;
	uint64_t num_tx_fwd_err;
};
+69 −26
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
/* Include Files */
#include "wlan_ipa_core.h"
#include "wlan_ipa_main.h"
#include "wlan_hdd_main.h"
#include <ol_txrx.h>
#include "cdp_txrx_ipa.h"
#include "wal_rx_desc.h"
@@ -895,6 +896,50 @@ wlan_ipa_rx_intrabss_fwd(struct wlan_ipa_priv *ipa_ctx,

#endif /* CONFIG_IPA_WDI_UNIFIED_API */

/**
 * wlan_ipa_send_sta_eapol_to_nw() - Send Rx EAPOL pkt for STA to Kernel
 * @skb: network buffer
 *
 * Called when a EAPOL packet is received via IPA Exception path
 * before wlan_ipa_setup_iface is done for STA.
 *
 * Return: 0 on success, err_code for failure.
 */
static int wlan_ipa_send_sta_eapol_to_nw(qdf_nbuf_t skb)
{
	struct wlan_ipa_priv *ipa_ctx = gp_ipa;
	struct hdd_context *hdd_ctx;
	struct hdd_adapter *adapter;
	struct ethhdr *eh;

	hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
	if (!hdd_ctx) {
		ipa_err_rl("Invalid hdd_context");
		return -EINVAL;
	}

	eh = (struct ethhdr *)qdf_nbuf_data(skb);
	adapter = hdd_get_adapter_by_macaddr(hdd_ctx, eh->h_dest);
	if (hdd_validate_adapter(adapter)) {
		ipa_err_rl("Invalid adapter");
		return -EINVAL;
	}
	if (adapter->device_mode != QDF_STA_MODE) {
		ipa_err_rl("device_mode is not STA");
		return -EINVAL;
	}

	skb->destructor = wlan_ipa_uc_rt_debug_destructor;

	if (ipa_ctx->send_to_nw)
		ipa_ctx->send_to_nw(skb, adapter->dev);

	ipa_ctx->ipa_rx_net_send_count++;
	ipa_ctx->stats.num_rx_no_iface_eapol++;

	return 0;
}

/**
 * wlan_ipa_send_skb_to_network() - Send skb to kernel
 * @skb: network buffer
@@ -959,13 +1004,24 @@ static void __wlan_ipa_w2i_cb(void *priv, qdf_ipa_dp_evt_type_t evt,
		if (wlan_ipa_uc_is_enabled(ipa_ctx->config)) {
			session_id = (uint8_t)skb->cb[0];
			iface_id = ipa_ctx->vdev_to_iface[session_id];
			ipa_ctx->stats.num_rx_excep++;
			qdf_nbuf_pull_head(skb, WLAN_IPA_UC_WLAN_CLD_HDR_LEN);
		} else {
			iface_id = WLAN_IPA_GET_IFACE_ID(skb->data);
			qdf_nbuf_pull_head(skb, WLAN_IPA_WLAN_CLD_HDR_LEN);
		}

		if (iface_id >= WLAN_IPA_MAX_IFACE) {
			ipa_err_rl("Invalid iface_id: %u,session id: %x %x %x %x. Dropped!",
			ipa_err_rl("Invalid iface_id %u,session_id %x %x %x %x",
				   iface_id, session_id, (uint8_t)skb->cb[1],
				   (uint8_t)skb->cb[2], (uint8_t)skb->cb[3]);

			if (qdf_nbuf_is_ipv4_eapol_pkt(skb)) {
				ipa_err_rl("EAPOL pkt. Sending to NW!");
				if (!wlan_ipa_send_sta_eapol_to_nw(skb))
					break;
			}
			ipa_err_rl("Pkt Dropped!");
			ipa_ctx->ipa_rx_internal_drop_count++;
			dev_kfree_skb_any(skb);
			return;
@@ -979,13 +1035,6 @@ static void __wlan_ipa_w2i_cb(void *priv, qdf_ipa_dp_evt_type_t evt,
			dev_kfree_skb_any(skb);
			return;
		}

		if (wlan_ipa_uc_is_enabled(ipa_ctx->config)) {
			ipa_ctx->stats.num_rx_excep++;
			qdf_nbuf_pull_head(skb, WLAN_IPA_UC_WLAN_CLD_HDR_LEN);
		} else {
			qdf_nbuf_pull_head(skb, WLAN_IPA_WLAN_CLD_HDR_LEN);
		}
		iface_context->stats.num_rx_ipa_excep++;

		/* Disable to forward Intra-BSS Rx packets when
@@ -1617,7 +1666,7 @@ static QDF_STATUS wlan_ipa_uc_handle_first_con(struct wlan_ipa_priv *ipa_ctx)
{
	ipa_debug("enter");

	if (ipa_ctx->num_sap_connected > 1) {
	if (qdf_ipa_get_lan_rx_napi() && (ipa_ctx->num_sap_connected > 1)) {
		ipa_debug("Multiple SAP connected. Not enabling pipes. Exit");
		return QDF_STATUS_E_PERM;
	}
@@ -1936,17 +1985,7 @@ static QDF_STATUS wlan_ipa_send_msg(qdf_netdev_t net_dev,
	return QDF_STATUS_SUCCESS;
}

/**
 * wlan_ipa_handle_multiple_sap_evt() - Handle multiple SAP connect/disconnect
 * @ipa_ctx: IPA global context
 * @type: IPA event type.
 *
 * This function is used to disable pipes when multiple SAP are connected and
 * enable pipes back when only one SAP is connected.
 *
 * Return: None
 */
static inline
#ifdef IPA_LAN_RX_NAPI_SUPPORT
void wlan_ipa_handle_multiple_sap_evt(struct wlan_ipa_priv *ipa_ctx,
				      qdf_ipa_wlan_event type)
{
@@ -1988,6 +2027,7 @@ void wlan_ipa_handle_multiple_sap_evt(struct wlan_ipa_priv *ipa_ctx,
			wlan_ipa_uc_disable_pipes(ipa_ctx, true);
	}
}
#endif

/**
 * __wlan_ipa_wlan_evt() - IPA event handler
@@ -2139,7 +2179,8 @@ static QDF_STATUS __wlan_ipa_wlan_evt(qdf_netdev_t net_dev, uint8_t device_mode,
					}
				}

				if (ipa_ctx->num_sap_connected == 1) {
				if (qdf_ipa_get_lan_rx_napi() &&
				    ipa_ctx->num_sap_connected == 1) {
					wlan_ipa_handle_multiple_sap_evt(ipa_ctx,
									 type);
				}
@@ -2260,12 +2301,13 @@ static QDF_STATUS __wlan_ipa_wlan_evt(qdf_netdev_t net_dev, uint8_t device_mode,

		if (wlan_ipa_uc_is_enabled(ipa_ctx->config)) {
			qdf_mutex_release(&ipa_ctx->event_lock);
			if (ipa_ctx->num_sap_connected == 1) {
			if (qdf_ipa_get_lan_rx_napi() &&
			    (ipa_ctx->num_sap_connected > 1)) {
				wlan_ipa_handle_multiple_sap_evt(ipa_ctx, type);
			} else {
				wlan_ipa_uc_offload_enable_disable(ipa_ctx,
							SIR_AP_RX_DATA_OFFLOAD,
							session_id, true);
			} else {
				wlan_ipa_handle_multiple_sap_evt(ipa_ctx, type);
			}
			qdf_mutex_acquire(&ipa_ctx->event_lock);
		}
@@ -2352,7 +2394,7 @@ static QDF_STATUS __wlan_ipa_wlan_evt(qdf_netdev_t net_dev, uint8_t device_mode,
		if (iface_ctx)
			wlan_ipa_cleanup_iface(iface_ctx);

		if (qdf_ipa_get_lan_rx_napi())
		if (qdf_ipa_get_lan_rx_napi() && ipa_ctx->sap_num_connected_sta)
			ipa_set_rps_per_vdev(ipa_ctx, session_id, false);

		qdf_mutex_release(&ipa_ctx->event_lock);
@@ -2406,7 +2448,8 @@ static QDF_STATUS __wlan_ipa_wlan_evt(qdf_netdev_t net_dev, uint8_t device_mode,
			}
		}

		if (ipa_ctx->num_sap_connected == 1)
		if (qdf_ipa_get_lan_rx_napi() &&
		    (ipa_ctx->num_sap_connected == 1))
			wlan_ipa_handle_multiple_sap_evt(ipa_ctx, type);

		qdf_mutex_release(&ipa_ctx->event_lock);
+15 −9
Original line number Diff line number Diff line
/*
 * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
 * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
@@ -2797,6 +2797,8 @@ void cds_incr_arp_stats_tx_tgt_delivered(void)
{
	struct hdd_context *hdd_ctx;
	struct hdd_adapter *adapter, *next_adapter = NULL;
	wlan_net_dev_ref_dbgid dbgid =
			NET_DEV_HOLD_CDS_INCR_ARP_STATS_TX_TGT_DELIVERED;

	hdd_ctx = gp_cds_context->hdd_context;
	if (!hdd_ctx) {
@@ -2804,14 +2806,15 @@ void cds_incr_arp_stats_tx_tgt_delivered(void)
		return;
	}

	hdd_for_each_adapter_dev_held_safe(hdd_ctx, adapter, next_adapter) {
	hdd_for_each_adapter_dev_held_safe(hdd_ctx, adapter, next_adapter,
					   dbgid) {
		if (adapter->device_mode == QDF_STA_MODE) {
			dev_put(adapter->dev);
			hdd_adapter_dev_put_debug(adapter, dbgid);
			if (next_adapter)
				dev_put(next_adapter->dev);
				hdd_adapter_dev_put_debug(next_adapter, dbgid);
			break;
		}
		dev_put(adapter->dev);
		hdd_adapter_dev_put_debug(adapter, dbgid);
	}

	if (adapter)
@@ -2827,6 +2830,8 @@ void cds_incr_arp_stats_tx_tgt_acked(void)
{
	struct hdd_context *hdd_ctx;
	struct hdd_adapter *adapter, *next_adapter = NULL;
	wlan_net_dev_ref_dbgid dbgid =
			NET_DEV_HOLD_CDS_INCR_ARP_STATS_TX_TGT_ACKED;

	hdd_ctx = gp_cds_context->hdd_context;
	if (!hdd_ctx) {
@@ -2834,14 +2839,15 @@ void cds_incr_arp_stats_tx_tgt_acked(void)
		return;
	}

	hdd_for_each_adapter_dev_held_safe(hdd_ctx, adapter, next_adapter) {
	hdd_for_each_adapter_dev_held_safe(hdd_ctx, adapter, next_adapter,
					   dbgid) {
		if (adapter->device_mode == QDF_STA_MODE) {
			dev_put(adapter->dev);
			hdd_adapter_dev_put_debug(adapter, dbgid);
			if (next_adapter)
				dev_put(next_adapter->dev);
				hdd_adapter_dev_put_debug(next_adapter, dbgid);
			break;
		}
		dev_put(adapter->dev);
		hdd_adapter_dev_put_debug(adapter, dbgid);
	}

	if (adapter)
+2 −2
Original line number Diff line number Diff line
/*
 * Copyright (c) 2011-2019 The Linux Foundation. All rights reserved.
 * Copyright (c) 2011-2019,2021 The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
@@ -868,7 +868,7 @@ ol_rx_frag_tkip_demic(ol_txrx_pdev_handle pdev, const uint8_t *key,

	ol_rx_defrag_copydata(msdu, pktlen - f_tkip.ic_miclen + rx_desc_len,
			      f_tkip.ic_miclen, (caddr_t) mic0);
	if (!qdf_mem_cmp(mic, mic0, f_tkip.ic_miclen))
	if (qdf_mem_cmp(mic, mic0, f_tkip.ic_miclen))
		return OL_RX_DEFRAG_ERR;

	qdf_nbuf_trim_tail(msdu, f_tkip.ic_miclen);
Loading