summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimanshu Agarwal <himanaga@codeaurora.org>2016-08-24 16:27:03 +0530
committerqcabuildsw <qcabuildsw@localhost>2016-09-02 17:24:18 -0700
commit3d95b907262c0016fd652bc9a4c0bb8897eaabb1 (patch)
treee141fbbea3680f44a86289033ec2629b942bfd59
parent818e16f2252d203e4831e341c45f0cb45ca4075e (diff)
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
-rw-r--r--core/hdd/src/wlan_hdd_main.c12
1 files 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