diff options
| author | Mohit Khanna <mkhannaqca@codeaurora.org> | 2016-05-12 21:43:13 -0700 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2016-08-19 18:33:16 -0700 |
| commit | fa99aea342c2142cc9cc6eeed61e89ecbc7fc8e1 (patch) | |
| tree | 3b7a5f614664a52a159b0f6d1505ccceec825662 | |
| parent | 11a08c08db6b40ee0cc905b4ea01b1c6d0fc22e7 (diff) | |
qcacld-3.0: Add USB bus support (HDD)
Add HDD specific changes for USB bus support.
CRs-Fixed: 1023663
Change-Id: I572a78cd9de1f7e531f300ced69a7eb51f4a167f
| -rw-r--r-- | core/hdd/inc/wlan_hdd_ipa.h | 26 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_assoc.c | 6 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.c | 4 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_driver_ops.c | 37 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_ftm.c | 1 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_hostapd.c | 8 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_ipa.c | 140 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_main.c | 3 |
8 files changed, 174 insertions, 51 deletions
diff --git a/core/hdd/inc/wlan_hdd_ipa.h b/core/hdd/inc/wlan_hdd_ipa.h index a7e8d5f7908d..f7221a653daf 100644 --- a/core/hdd/inc/wlan_hdd_ipa.h +++ b/core/hdd/inc/wlan_hdd_ipa.h @@ -35,7 +35,27 @@ * Originally written by Qualcomm Atheros, Inc */ -#include <linux/ipa.h> +/** + * enum hdd_ipa_wlan_event - HDD IPA events + * @HDD_IPA_CLIENT_CONNECT: Client Connects + * @HDD_IPA_CLIENT_DISCONNECT: Client Disconnects + * @HDD_IPA_AP_CONNECT: SoftAP is started + * @HDD_IPA_AP_DISCONNECT: SoftAP is stopped + * @HDD_IPA_STA_CONNECT: STA associates to AP + * @HDD_IPA_STA_DISCONNECT: STA dissociates from AP + * @HDD_IPA_CLIENT_CONNECT_EX: Peer associates/re-associates to softap + * @HDD_IPA_WLAN_EVENT_MAX: Max value for the enum + */ +enum hdd_ipa_wlan_event { + HDD_IPA_CLIENT_CONNECT, + HDD_IPA_CLIENT_DISCONNECT, + HDD_IPA_AP_CONNECT, + HDD_IPA_AP_DISCONNECT, + HDD_IPA_STA_CONNECT, + HDD_IPA_STA_DISCONNECT, + HDD_IPA_CLIENT_CONNECT_EX, + HDD_IPA_WLAN_EVENT_MAX +}; #ifdef IPA_OFFLOAD /* Include files */ @@ -57,7 +77,7 @@ QDF_STATUS hdd_ipa_cleanup(hdd_context_t *hdd_ctx); QDF_STATUS hdd_ipa_process_rxt(void *cds_context, qdf_nbuf_t rxBuf, uint8_t sta_id); int hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id, - enum ipa_wlan_event type, uint8_t *mac_addr); + enum hdd_ipa_wlan_event type, uint8_t *mac_addr); int hdd_ipa_set_perf_level(hdd_context_t *hdd_ctx, uint64_t tx_packets, uint64_t rx_packets); int hdd_ipa_suspend(hdd_context_t *hdd_ctx); @@ -92,7 +112,7 @@ static inline QDF_STATUS hdd_ipa_process_rxt(void *cds_context, } static inline int hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id, - enum ipa_wlan_event type, uint8_t *mac_addr) + enum hdd_ipa_wlan_event type, uint8_t *mac_addr) { return 0; } diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index f6919bbb1269..bed513cd29ae 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -1593,8 +1593,8 @@ static QDF_STATUS hdd_dis_connect_handler(hdd_adapter_t *pAdapter, if (hdd_ipa_is_enabled(pHddCtx)) hdd_ipa_wlan_evt(pAdapter, pHddStaCtx->conn_info.staId[0], - WLAN_STA_DISCONNECT, - pHddStaCtx->conn_info.bssId.bytes); + HDD_IPA_STA_DISCONNECT, + pHddStaCtx->conn_info.bssId.bytes); #ifdef FEATURE_WLAN_AUTO_SHUTDOWN wlan_hdd_auto_shutdown_enable(pHddCtx, true); @@ -2453,7 +2453,7 @@ static QDF_STATUS hdd_association_completion_handler(hdd_adapter_t *pAdapter, if (hdd_ipa_is_enabled(pHddCtx)) hdd_ipa_wlan_evt(pAdapter, pRoamInfo->staId, - WLAN_STA_CONNECT, + HDD_IPA_STA_CONNECT, pRoamInfo->bssid.bytes); #ifdef FEATURE_WLAN_AUTO_SHUTDOWN diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index b73d99c82291..b0c9328e7445 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -12329,7 +12329,7 @@ int __wlan_hdd_cfg80211_del_station(struct wiphy *wiphy, pAdapter-> aStaInfo[i]. ucSTAId, - WLAN_CLIENT_DISCONNECT, + HDD_IPA_CLIENT_DISCONNECT, mac); } hdd_notice("Delete STA with MAC::" @@ -12373,7 +12373,7 @@ int __wlan_hdd_cfg80211_del_station(struct wiphy *wiphy, if (hdd_ipa_uc_is_enabled(pHddCtx)) { hdd_ipa_wlan_evt(pAdapter, staId, - WLAN_CLIENT_DISCONNECT, mac); + HDD_IPA_CLIENT_DISCONNECT, mac); } if (pAdapter->aStaInfo[staId].isDeauthInProgress == diff --git a/core/hdd/src/wlan_hdd_driver_ops.c b/core/hdd/src/wlan_hdd_driver_ops.c index e4527bdb170a..4470ca3e3994 100644 --- a/core/hdd/src/wlan_hdd_driver_ops.c +++ b/core/hdd/src/wlan_hdd_driver_ops.c @@ -193,6 +193,8 @@ static enum qdf_bus_type to_bus_type(enum pld_bus_type bus_type) return QDF_BUS_TYPE_SNOC; case PLD_BUS_TYPE_SDIO: return QDF_BUS_TYPE_SDIO; + case PLD_BUS_TYPE_USB: + return QDF_BUS_TYPE_USB; default: return QDF_BUS_TYPE_NONE; } @@ -446,7 +448,7 @@ static void wlan_hdd_remove(struct device *dev) hdd_deinit(); - pr_info("%s: Driver Removed\n", WLAN_MODULE_NAME); + pr_info("%s: Driver De-initialized\n", WLAN_MODULE_NAME); } /** @@ -658,6 +660,25 @@ int wlan_hdd_bus_resume(void) return ret; } +/** + * wlan_hdd_bus_reset_resume() - resume wlan bus after reset + * + * This function is called to tell the driver that the device has been resumed + * and it has also been reset. The driver should redo any necessary + * initialization. It is mainly used by the USB bus + * + * Return: int 0 for success, non zero for failure + */ +static int wlan_hdd_bus_reset_resume(void) +{ + int ret; + + cds_ssr_protect(__func__); + ret = hif_bus_reset_resume(cds_get_context(QDF_MODULE_ID_HIF)); + cds_ssr_unprotect(__func__); + return ret; +} + #ifdef FEATURE_RUNTIME_PM /** * __wlan_hdd_runtime_suspend() - suspend the wlan bus without apps suspend @@ -902,6 +923,19 @@ static int wlan_hdd_pld_resume(struct device *dev, } /** + * wlan_hdd_pld_reset_resume() - reset resume function registered to PLD + * @dev: device + * @pld_bus_type: PLD bus type + * + * Return: 0 on success + */ +static int wlan_hdd_pld_reset_resume(struct device *dev, + enum pld_bus_type bus_type) +{ + return wlan_hdd_bus_reset_resume(); +} + +/** * wlan_hdd_pld_notify_handler() - notify_handler function registered to PLD * @dev: device * @pld_bus_type: PLD bus type @@ -952,6 +986,7 @@ struct pld_driver_ops wlan_drv_ops = { .crash_shutdown = wlan_hdd_pld_crash_shutdown, .suspend = wlan_hdd_pld_suspend, .resume = wlan_hdd_pld_resume, + .reset_resume = wlan_hdd_pld_reset_resume, .modem_status = wlan_hdd_pld_notify_handler, #ifdef FEATURE_RUNTIME_PM .runtime_suspend = wlan_hdd_pld_runtime_suspend, diff --git a/core/hdd/src/wlan_hdd_ftm.c b/core/hdd/src/wlan_hdd_ftm.c index 83d4cdd723b6..b3e88a2fcbf6 100644 --- a/core/hdd/src/wlan_hdd_ftm.c +++ b/core/hdd/src/wlan_hdd_ftm.c @@ -76,6 +76,7 @@ typedef struct qcmbr_queue_s { } qcmbr_queue_t; LIST_HEAD(qcmbr_queue_head); DEFINE_SPINLOCK(qcmbr_queue_lock); +static void wlanqcmbr_mc_process_msg(void *message); #endif #endif diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index d7c8aa302e13..235c050ef7a1 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -1078,7 +1078,7 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, if (hdd_ipa_is_enabled(pHddCtx)) { status = hdd_ipa_wlan_evt(pHostapdAdapter, pHddApCtx->uBCStaId, - WLAN_AP_CONNECT, + HDD_IPA_AP_CONNECT, pHostapdAdapter->dev->dev_addr); if (status) { hdd_err("WLAN_AP_CONNECT event failed!!"); @@ -1234,7 +1234,7 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, if (hdd_ipa_is_enabled(pHddCtx)) { status = hdd_ipa_wlan_evt(pHostapdAdapter, pHddApCtx->uBCStaId, - WLAN_AP_DISCONNECT, + HDD_IPA_AP_DISCONNECT, pHostapdAdapter->dev->dev_addr); if (status) { hdd_err("WLAN_AP_DISCONNECT event failed!!"); @@ -1473,7 +1473,7 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, status = hdd_ipa_wlan_evt(pHostapdAdapter, pSapEvent->sapevt. sapStationAssocReassocCompleteEvent. - staId, WLAN_CLIENT_CONNECT_EX, + staId, HDD_IPA_CLIENT_CONNECT_EX, pSapEvent->sapevt. sapStationAssocReassocCompleteEvent. staMac.bytes); @@ -1608,7 +1608,7 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, #ifdef IPA_OFFLOAD if (hdd_ipa_is_enabled(pHddCtx)) { status = hdd_ipa_wlan_evt(pHostapdAdapter, staId, - WLAN_CLIENT_DISCONNECT, + HDD_IPA_CLIENT_DISCONNECT, pSapEvent->sapevt. sapStationDisassocCompleteEvent. staMac.bytes); diff --git a/core/hdd/src/wlan_hdd_ipa.c b/core/hdd/src/wlan_hdd_ipa.c index 87ae722f5726..1377b92d31b6 100644 --- a/core/hdd/src/wlan_hdd_ipa.c +++ b/core/hdd/src/wlan_hdd_ipa.c @@ -35,6 +35,7 @@ #ifdef IPA_OFFLOAD /* Include Files */ +#include <linux/ipa.h> #include <wlan_hdd_includes.h> #include <wlan_hdd_ipa.h> @@ -593,6 +594,7 @@ static void hdd_ipa_w2i_cb(void *priv, enum ipa_dp_evt_type evt, unsigned long data); static void hdd_ipa_cleanup_iface(struct hdd_ipa_iface_context *iface_context); +static void hdd_ipa_uc_proc_pending_event (struct hdd_ipa_priv *hdd_ipa); /** * hdd_ipa_is_enabled() - Is IPA enabled? @@ -1290,40 +1292,6 @@ static void hdd_ipa_uc_rm_notify_defer(struct work_struct *work) } /** - * hdd_ipa_uc_proc_pending_event() - Process IPA uC pending events - * @hdd_ipa: Global HDD IPA context - * - * Return: None - */ -static void hdd_ipa_uc_proc_pending_event(struct hdd_ipa_priv *hdd_ipa) -{ - unsigned int pending_event_count; - struct ipa_uc_pending_event *pending_event = NULL; - - pending_event_count = qdf_list_size(&hdd_ipa->pending_event); - HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO, - "%s, Pending Event Count %d", __func__, pending_event_count); - if (!pending_event_count) { - HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO, - "%s, No Pending Event", __func__); - return; - } - - qdf_list_remove_front(&hdd_ipa->pending_event, - (qdf_list_node_t **)&pending_event); - while (pending_event != NULL) { - hdd_ipa_wlan_evt(pending_event->adapter, - pending_event->type, - pending_event->sta_id, - pending_event->mac_addr); - qdf_mem_free(pending_event); - pending_event = NULL; - qdf_list_remove_front(&hdd_ipa->pending_event, - (qdf_list_node_t **)&pending_event); - } -} - -/** * hdd_ipa_uc_op_cb() - IPA uC operation callback * @op_msg: operation message received from firmware * @usr_ctxt: user context registered with TL (we register the HDD Global @@ -3582,15 +3550,59 @@ static inline char *hdd_ipa_wlan_event_to_str(enum ipa_wlan_event event) } /** - * hdd_ipa_wlan_evt() - IPA event handler + * hdd_to_ipa_wlan_event() - convert hdd_ipa_wlan_event to ipa_wlan_event + * @hdd_ipa_event_type: HDD IPA WLAN event to be converted to an ipa_wlan_event + * + * Return: ipa_wlan_event representing the hdd_ipa_wlan_event + */ +static enum ipa_wlan_event +hdd_to_ipa_wlan_event(enum hdd_ipa_wlan_event hdd_ipa_event_type) +{ + enum ipa_wlan_event ipa_event; + + switch (hdd_ipa_event_type) { + case HDD_IPA_CLIENT_CONNECT: + ipa_event = WLAN_CLIENT_CONNECT; + break; + case HDD_IPA_CLIENT_DISCONNECT: + ipa_event = WLAN_CLIENT_DISCONNECT; + break; + case HDD_IPA_AP_CONNECT: + ipa_event = WLAN_AP_CONNECT; + break; + case HDD_IPA_AP_DISCONNECT: + ipa_event = WLAN_AP_DISCONNECT; + break; + case HDD_IPA_STA_CONNECT: + ipa_event = WLAN_STA_CONNECT; + break; + case HDD_IPA_STA_DISCONNECT: + ipa_event = WLAN_STA_DISCONNECT; + break; + case HDD_IPA_CLIENT_CONNECT_EX: + ipa_event = WLAN_CLIENT_CONNECT_EX; + break; + case HDD_IPA_WLAN_EVENT_MAX: + default: + ipa_event = IPA_WLAN_EVENT_MAX; + break; + } + return ipa_event; + +} + +/** + * __hdd_ipa_wlan_evt() - IPA event handler * @adapter: adapter upon which the event was received * @sta_id: station id for the event - * @type: the event type + * @type: event enum of type ipa_wlan_event * @mac_address: MAC address associated with the event * + * This function is meant to be called from within wlan_hdd_ipa.c + * * Return: 0 on success, negative errno value on error */ -int hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id, +static int __hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id, enum ipa_wlan_event type, uint8_t *mac_addr) { struct hdd_ipa_priv *hdd_ipa = ghdd_ipa; @@ -3958,6 +3970,60 @@ end: } /** + * hdd_ipa_wlan_evt() - IPA event handler + * @adapter: adapter upon which the event was received + * @sta_id: station id for the event + * @hdd_event_type: event enum of type hdd_ipa_wlan_event + * @mac_address: MAC address associated with the event + * + * This function is meant to be called from outside of wlan_hdd_ipa.c. + * + * Return: 0 on success, negative errno value on error + */ +int hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id, + enum hdd_ipa_wlan_event hdd_event_type, uint8_t *mac_addr) +{ + enum ipa_wlan_event type = hdd_to_ipa_wlan_event(hdd_event_type); + + return __hdd_ipa_wlan_evt(adapter, sta_id, type, mac_addr); +} + +/** + * hdd_ipa_uc_proc_pending_event() - Process IPA uC pending events + * @hdd_ipa: Global HDD IPA context + * + * Return: None + */ +static void +hdd_ipa_uc_proc_pending_event(struct hdd_ipa_priv *hdd_ipa) +{ + unsigned int pending_event_count; + struct ipa_uc_pending_event *pending_event = NULL; + + pending_event_count = qdf_list_size(&hdd_ipa->pending_event); + HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO, + "%s, Pending Event Count %d", __func__, pending_event_count); + if (!pending_event_count) { + HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO, + "%s, No Pending Event", __func__); + return; + } + + qdf_list_remove_front(&hdd_ipa->pending_event, + (qdf_list_node_t **)&pending_event); + while (pending_event != NULL) { + __hdd_ipa_wlan_evt(pending_event->adapter, + pending_event->type, + pending_event->sta_id, + pending_event->mac_addr); + qdf_mem_free(pending_event); + pending_event = NULL; + qdf_list_remove_front(&hdd_ipa->pending_event, + (qdf_list_node_t **)&pending_event); + } +} + +/** * hdd_ipa_rm_state_to_str() - Convert IPA RM state to string * @state: IPA RM state value * diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 0090d0b0d4ec..b2699bc28dfb 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -8506,7 +8506,8 @@ static int __hdd_module_init(void) ret = wlan_hdd_register_driver(); if (ret) { - pr_err("%s: driver load failure\n", WLAN_MODULE_NAME); + pr_err("%s: driver load failure, err %d\n", WLAN_MODULE_NAME, + ret); goto out; } |
