qcacld-3.0: Disable LRO capability during concurrency

LRO rx jumbo packets cannot be forwarded to other vdev and kernel drops
them with warning message:
"skbuff: wlan0: received packets cannot be forwarded while LRO is enabled"
So disable LRO capability during concurrency.

Change-Id: Ib35e1ee5f9c18a846e21ce1eb293e12e17761fa8
CRs-Fixed: 1092193
This commit is contained in:
Manjunathappa Prakash
2017-10-09 00:40:24 -07:00
committed by snandini
parent a1f6dacf0c
commit 7b6cb00b26
5 changed files with 40 additions and 4 deletions

View File

@@ -174,6 +174,8 @@ struct cds_log_complete {
bool recovery_needed; bool recovery_needed;
}; };
/* forward-declare hdd_context_s as it is used ina function type */
struct hdd_context_s;
typedef struct _cds_context_type { typedef struct _cds_context_type {
/* Scheduler Context */ /* Scheduler Context */
cds_sched_context qdf_sched; cds_sched_context qdf_sched;

View File

@@ -50,6 +50,7 @@ int hdd_lro_init(struct hdd_context *hdd_ctx);
enum hdd_lro_rx_status hdd_lro_rx(struct hdd_context *hdd_ctx, enum hdd_lro_rx_status hdd_lro_rx(struct hdd_context *hdd_ctx,
struct hdd_adapter *adapter, struct sk_buff *skb); struct hdd_adapter *adapter, struct sk_buff *skb);
void hdd_lro_display_stats(struct hdd_context *hdd_ctx); void hdd_lro_display_stats(struct hdd_context *hdd_ctx);
void hdd_disable_lro_in_concurrency(bool);
#else #else
static inline int hdd_lro_init(struct hdd_context *hdd_ctx) static inline int hdd_lro_init(struct hdd_context *hdd_ctx)
{ {
@@ -65,5 +66,9 @@ static inline enum hdd_lro_rx_status hdd_lro_rx(struct hdd_context *hdd_ctx,
static inline void hdd_lro_display_stats(struct hdd_context *hdd_ctx) static inline void hdd_lro_display_stats(struct hdd_context *hdd_ctx)
{ {
} }
static inline void hdd_disable_lro_in_concurrency(bool disable)
{
}
#endif /* FEATURE_LRO */ #endif /* FEATURE_LRO */
#endif /* __WLAN_HDD_LRO_H__ */ #endif /* __WLAN_HDD_LRO_H__ */

View File

@@ -1763,6 +1763,7 @@ struct hdd_context {
bool imps_enabled; bool imps_enabled;
int user_configured_pkt_filter_rules; int user_configured_pkt_filter_rules;
bool is_fils_roaming_supported; bool is_fils_roaming_supported;
qdf_atomic_t disable_lro_in_concurrency;
}; };
/** /**

View File

@@ -86,7 +86,7 @@ int hdd_lro_init(struct hdd_context *hdd_ctx)
if ((!hdd_ctx->config->lro_enable) && if ((!hdd_ctx->config->lro_enable) &&
(hdd_napi_enabled(HDD_NAPI_ANY) == 0)) { (hdd_napi_enabled(HDD_NAPI_ANY) == 0)) {
hdd_warn("LRO and NAPI are both disabled"); hdd_warn("LRO and NAPI are both disabled");
return 0; return QDF_STATUS_E_FAILURE;
} }
lro_config.lro_enable = 1; lro_config.lro_enable = 1;
@@ -141,9 +141,13 @@ enum hdd_lro_rx_status hdd_lro_rx(struct hdd_context *hdd_ctx,
qdf_lro_ctx_t ctx; qdf_lro_ctx_t ctx;
enum hdd_lro_rx_status status = HDD_LRO_NO_RX; enum hdd_lro_rx_status status = HDD_LRO_NO_RX;
if ((adapter->dev->features & NETIF_F_LRO) && if (((adapter->dev->features & NETIF_F_LRO) != NETIF_F_LRO) ||
QDF_NBUF_CB_RX_TCP_PROTO(skb) && !QDF_NBUF_CB_RX_TCP_PROTO(skb) ||
!QDF_NBUF_CB_RX_PEER_CACHED_FRM(skb)) { QDF_NBUF_CB_RX_PEER_CACHED_FRM(skb) ||
qdf_atomic_read(&hdd_ctx->disable_lro_in_concurrency))
return HDD_LRO_NO_RX;
{
struct qdf_lro_info info; struct qdf_lro_info info;
struct net_lro_desc *lro_desc = NULL; struct net_lro_desc *lro_desc = NULL;
struct hif_opaque_softc *hif_hdl = struct hif_opaque_softc *hif_hdl =
@@ -200,3 +204,19 @@ void hdd_lro_display_stats(struct hdd_context *hdd_ctx)
{ {
hdd_debug("LRO stats is broken, will fix it"); hdd_debug("LRO stats is broken, will fix it");
} }
/**
* hdd_disable_lro_in_concurrency() - Disable LRO due to concurrency
* @disable: bool value
*
* Return: none
*/
void hdd_disable_lro_in_concurrency(bool disable)
{
struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
if (disable)
qdf_atomic_set(&hdd_ctx->disable_lro_in_concurrency, 1);
else
qdf_atomic_set(&hdd_ctx->disable_lro_in_concurrency, 0);
}

View File

@@ -9313,6 +9313,7 @@ int hdd_configure_cds(struct hdd_context *hdd_ctx, struct hdd_adapter *adapter)
uint32_t num_abg_tx_chains = 0; uint32_t num_abg_tx_chains = 0;
uint32_t num_11b_tx_chains = 0; uint32_t num_11b_tx_chains = 0;
uint32_t num_11ag_tx_chains = 0; uint32_t num_11ag_tx_chains = 0;
struct policy_mgr_dp_cbacks dp_cbs = {0};
if (hdd_ctx->config->sifs_burst_duration) { if (hdd_ctx->config->sifs_burst_duration) {
set_value = (SIFS_BURST_DUR_MULTIPLIER) * set_value = (SIFS_BURST_DUR_MULTIPLIER) *
@@ -9406,6 +9407,13 @@ int hdd_configure_cds(struct hdd_context *hdd_ctx, struct hdd_adapter *adapter)
if (ret) if (ret)
goto cds_disable; goto cds_disable;
dp_cbs.hdd_disable_lro_in_concurrency = hdd_disable_lro_in_concurrency;
status = policy_mgr_register_dp_cb(hdd_ctx->hdd_psoc, &dp_cbs);
if (!QDF_IS_STATUS_SUCCESS(status)) {
hdd_debug("LRO disbaled, failed to register with policy mgr");
goto cds_disable;
}
if (hdd_enable_egap(hdd_ctx)) if (hdd_enable_egap(hdd_ctx))
hdd_debug("enhance green ap is not enabled"); hdd_debug("enhance green ap is not enabled");