From 3d95b907262c0016fd652bc9a4c0bb8897eaabb1 Mon Sep 17 00:00:00 2001 From: Himanshu Agarwal Date: Wed, 24 Aug 2016 16:27:03 +0530 Subject: [PATCH] qcacld-3.0: Do LRO enable and disable on iface up and down In case of dynamic mode driver load/unload, a timer is started whenever driver is loaded. If some iface don't come up in certain amount of time, this timer expires resulting in cleanup of hif_softc structure. This structure has LRO flush callback stored in it which also gets removed as part of cleanup. As this callback is stored only at the time of driver load, this cause a break in LRO functionality and also an assert in HOST driver as driver is trying to remove the callback at the time of driver unload which has already been removed at the time of timer expiration. Do LRO enable and disable at the time of ifconfig up and ifconfig down. This ensures that even after the modules are cleaned when timer expires, the callback is registered again at the time of ifconfig up. Change-Id: I91116d4ff4fe8f24671f63b2c73759fe9e088172 CRs-Fixed: 1059720 --- core/hdd/src/wlan_hdd_main.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index c5bfe0ff7ee7..180c8ad9de2a 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -2629,13 +2629,17 @@ QDF_STATUS hdd_init_station_mode(hdd_adapter_t *adapter) if (status != QDF_STATUS_SUCCESS) goto error_tdls_init; + status = hdd_lro_enable(hdd_ctx, adapter); + if (status != QDF_STATUS_SUCCESS) + goto error_lro_enable; + return QDF_STATUS_SUCCESS; -#ifdef FEATURE_WLAN_TDLS +error_lro_enable: + wlan_hdd_tdls_exit(adapter); error_tdls_init: clear_bit(WMM_INIT_DONE, &adapter->event_flags); hdd_wmm_adapter_close(adapter); -#endif error_wmm_init: clear_bit(INIT_TX_RX_SUCCESS, &adapter->event_flags); hdd_deinit_tx_rx(adapter); @@ -2787,7 +2791,6 @@ void hdd_cleanup_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, return; } - hdd_lro_disable(hdd_ctx, adapter); hdd_debugfs_exit(adapter); /* * The adapter is marked as closed. When hdd_wlan_exit() call returns, @@ -3098,8 +3101,6 @@ hdd_adapter_t *hdd_open_adapter(hdd_context_t *hdd_ctx, uint8_t session_type, goto err_free_netdev; } - hdd_lro_enable(hdd_ctx, adapter); - /* * Workqueue which gets scheduled in IPv4 notification * callback @@ -3440,6 +3441,7 @@ QDF_STATUS hdd_stop_adapter(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter, hdd_abort_mac_scan(hdd_ctx, adapter->sessionId, eCSR_SCAN_ABORT_DEFAULT); } + hdd_lro_disable(hdd_ctx, adapter); wlan_hdd_cleanup_remain_on_channel_ctx(adapter); #ifdef WLAN_OPEN_SOURCE