qcacld-3.0: Update Wifi netdevs for IPA exception path NAPI
Starting Kernel 4.19 IPA LAN RX supports NAPI polling mechanism. Netdevs that hook into IPA need to call netif_receive_skb() or similar to deliver the packet to network stack instead of using netif_rx_ni(). IPA driver exports ipa_get_lan_rx_napi(void) API for this purpose. If this API call returns true use netif_receive_skb() or fallback on legacy api. Add the changes under a feature flag IPA_LAN_RX_NAPI_SUPPORT. The flag is enabled only for linux kernel version 4.19 and above. Change-Id: I3bf200c993461e45da0d07697678c634760e9a89 CRs-Fixed: 2560360
This commit is contained in:

gecommit door
nshrivas

bovenliggende
3193c42596
commit
9db78810c9
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2013-2019 The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2013-2020 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
|
||||
@@ -355,6 +355,28 @@ static void hdd_ipa_set_wake_up_idle(bool wake_up_idle)
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* hdd_ipa_send_to_nw_stack() - Check if IPA supports NAPI
|
||||
* polling during RX
|
||||
* @skb : data buffer sent to network stack
|
||||
*
|
||||
* If IPA LAN RX supports NAPI polling mechanism use
|
||||
* netif_receive_skb instead of netif_rx_ni to forward the skb
|
||||
* to network stack.
|
||||
*
|
||||
* Return: Return value from netif_rx_ni/netif_receive_skb
|
||||
*/
|
||||
static int hdd_ipa_send_to_nw_stack(qdf_nbuf_t skb)
|
||||
{
|
||||
int result;
|
||||
|
||||
if (qdf_ipa_get_lan_rx_napi())
|
||||
result = netif_receive_skb(skb);
|
||||
else
|
||||
result = netif_rx_ni(skb);
|
||||
return result;
|
||||
}
|
||||
|
||||
#ifdef QCA_CONFIG_SMP
|
||||
|
||||
/**
|
||||
@@ -367,13 +389,16 @@ static void hdd_ipa_set_wake_up_idle(bool wake_up_idle)
|
||||
* In this manner, UDP/TCP packets are sent in an aggregated way to the stack.
|
||||
* For IP/ICMP packets, simply call netif_rx_ni.
|
||||
*
|
||||
* Check if IPA supports NAPI polling then use netif_receive_skb
|
||||
* instead of netif_rx_ni.
|
||||
*
|
||||
* Return: return value from the netif_rx_ni/netif_rx api.
|
||||
*/
|
||||
static int hdd_ipa_aggregated_rx_ind(qdf_nbuf_t skb)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = netif_rx_ni(skb);
|
||||
ret = hdd_ipa_send_to_nw_stack(skb);
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
@@ -387,13 +412,13 @@ static int hdd_ipa_aggregated_rx_ind(qdf_nbuf_t skb)
|
||||
ip_h = (struct iphdr *)(skb->data);
|
||||
if ((skb->protocol == htons(ETH_P_IP)) &&
|
||||
(ip_h->protocol == IPPROTO_ICMP)) {
|
||||
result = netif_rx_ni(skb);
|
||||
result = hdd_ipa_send_to_nw_stack(skb);
|
||||
} else {
|
||||
/* Call netif_rx_ni for every IPA_WLAN_RX_SOFTIRQ_THRESH packets
|
||||
* to avoid excessive softirq's.
|
||||
*/
|
||||
if (atomic_dec_and_test(&softirq_mitigation_cntr)) {
|
||||
result = netif_rx_ni(skb);
|
||||
result = hdd_ipa_send_to_nw_stack(skb);
|
||||
atomic_set(&softirq_mitigation_cntr,
|
||||
IPA_WLAN_RX_SOFTIRQ_THRESH);
|
||||
} else {
|
||||
|
Verwijs in nieuw issue
Block a user