diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2019-02-05 23:49:45 -0800 |
|---|---|---|
| committer | Linux Build Service Account <lnxbuild@localhost> | 2019-02-05 23:49:45 -0800 |
| commit | 456abd7e6906f9dcc3b5547cc7e8a09d83d489bf (patch) | |
| tree | 9af571b6c43c9abba0913e5ee2d3f7da13355ade | |
| parent | 6202d1d9d9ba3cfc464225087c65e2d079b6d689 (diff) | |
| parent | e4646b07ba96d4110362310266f05f27d42bc360 (diff) | |
Merge e4646b07ba96d4110362310266f05f27d42bc360 on remote branch
Change-Id: Idf3005469e60b327910ddff4ded7e101b10c662a
90 files changed, 2462 insertions, 1141 deletions
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx.c b/CORE/CLD_TXRX/TXRX/ol_tx.c index 76392d92bc4f..baa2ad5dc967 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx.c @@ -436,6 +436,7 @@ ol_tx_ll(ol_txrx_vdev_handle vdev, adf_nbuf_t msdu_list) while (msdu) { adf_nbuf_t next; struct ol_tx_desc_t *tx_desc; + struct ol_txrx_pdev_t *pdev = vdev->pdev; a_status_t ret; msdu_info.htt.info.ext_tid = adf_nbuf_get_tid(msdu); @@ -452,7 +453,14 @@ ol_tx_ll(ol_txrx_vdev_handle vdev, adf_nbuf_t msdu_list) } } - ol_tx_prepare_ll(tx_desc, vdev, msdu, &msdu_info); + msdu_info.htt.info.frame_type = pdev->htt_pkt_type; + tx_desc = ol_tx_desc_ll(pdev, vdev, msdu, &msdu_info); + if (adf_os_unlikely(! tx_desc)) { + TXRX_STATS_MSDU_LIST_INCR( + pdev, tx.dropped.host_reject, msdu); + adf_nbuf_unmap_single(pdev->osdev, msdu, ADF_OS_DMA_TO_DEVICE); + return msdu; + } /* * If debug display is enabled, show the meta-data being diff --git a/CORE/EPPING/src/epping_main.c b/CORE/EPPING/src/epping_main.c index 04c6f20e5f86..1a8be9140be0 100644 --- a/CORE/EPPING/src/epping_main.c +++ b/CORE/EPPING/src/epping_main.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2014, 2016, 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -171,6 +171,7 @@ int epping_driver_init(int con_mode, vos_wake_lock_t *g_wake_lock, #ifdef MEMORY_DEBUG adf_net_buf_debug_exit(); + adf_nbuf_map_check_for_leaks(); vos_mem_exit(); #endif #ifdef TIMER_MANAGER @@ -189,6 +190,7 @@ error1: } #ifdef MEMORY_DEBUG adf_net_buf_debug_exit(); + adf_nbuf_map_check_for_leaks(); vos_mem_exit(); #endif #ifdef TIMER_MANAGER @@ -259,6 +261,7 @@ void epping_driver_exit(v_CONTEXT_t pVosContext) vos_preClose( &pVosContext ); #ifdef MEMORY_DEBUG adf_net_buf_debug_exit(); + adf_nbuf_map_check_for_leaks(); vos_mem_exit(); #endif #ifdef TIMER_MANAGER diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h index e9961b2decaa..98f2f2be228a 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/CORE/HDD/inc/wlan_hdd_cfg.h @@ -4153,6 +4153,13 @@ FG_BTC_BT_INTERVAL_PAGE_P2P_STA_DEFAULT #define TSF_GPIO_PIN_INVALID (255) #define CFG_SET_TSF_GPIO_PIN_DEFAULT (TSF_GPIO_PIN_INVALID) +#ifdef WLAN_FEATURE_TSF +/* GPIO pin to toogle when capture tsf in host side */ +#define CFG_SET_TSF_GPIO_PIN_HOST_NAME "gtsf_gpio_pin_host" +#define CFG_SET_TSF_GPIO_PIN_HOST_MIN (0) +#define CFG_SET_TSF_GPIO_PIN_HOST_MAX (254) +#define CFG_SET_TSF_GPIO_PIN_HOST_DEFAULT (45) + #ifdef WLAN_FEATURE_TSF_PLUS /* PTP options */ #define CFG_SET_TSF_PTP_OPT_NAME "gtsf_ptp_options" @@ -4164,6 +4171,7 @@ FG_BTC_BT_INTERVAL_PAGE_P2P_STA_DEFAULT #define CFG_SET_TSF_DBG_FS (0x8) #define CFG_SET_TSF_PTP_OPT_DEFAULT (0xf) #endif +#endif #define CFG_MULTICAST_HOST_FW_MSGS "gMulticastHostFwMsgs" #define CFG_MULTICAST_HOST_FW_MSGS_MIN (0) @@ -6257,7 +6265,7 @@ struct hdd_config { uint8_t inform_bss_rssi_raw; #ifdef WLAN_FEATURE_TSF uint32_t tsf_gpio_pin; - + uint32_t tsf_gpio_pin_host; #ifdef WLAN_FEATURE_TSF_PLUS uint8_t tsf_ptp_options; #endif /* WLAN_FEATURE_TSF_PLUS */ diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h index 87c7684747c0..66ecc0af5c04 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg80211.h +++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h @@ -3085,4 +3085,47 @@ int wlan_hdd_disconnect(hdd_adapter_t *pAdapter, u16 reason); #ifdef FEATURE_WLAN_DISABLE_CHANNEL_SWITCH int wlan_hdd_send_avoid_freq_for_dnbs(hdd_context_t *hdd_ctx, uint8_t op_chan); #endif + +#undef nla_parse +#undef nla_parse_nested +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0) +static inline int wlan_cfg80211_nla_parse(struct nlattr **tb, + int maxtype, + const struct nlattr *head, + int len, + const struct nla_policy *policy) +{ + return nla_parse(tb, maxtype, head, len, policy); +} + +static inline int +wlan_cfg80211_nla_parse_nested(struct nlattr *tb[], + int maxtype, + const struct nlattr *nla, + const struct nla_policy *policy) +{ + return nla_parse_nested(tb, maxtype, nla, policy); +} +#else +static inline int wlan_cfg80211_nla_parse(struct nlattr **tb, + int maxtype, + const struct nlattr *head, + int len, + const struct nla_policy *policy) +{ + return nla_parse(tb, maxtype, head, len, policy, NULL); +} + +static inline int +wlan_cfg80211_nla_parse_nested(struct nlattr *tb[], + int maxtype, + const struct nlattr *nla, + const struct nla_policy *policy) +{ + return nla_parse_nested(tb, maxtype, nla, policy, NULL); +} +#endif +#define nla_parse(...) (obsolete, use wlan_cfg80211_nla_parse) +#define nla_parse_nested(...) (obsolete, use wlan_cfg80211_nla_parse_nested) + #endif diff --git a/CORE/HDD/inc/wlan_hdd_dp_utils.h b/CORE/HDD/inc/wlan_hdd_dp_utils.h index 0a044784daf7..83bade36427a 100644 --- a/CORE/HDD/inc/wlan_hdd_dp_utils.h +++ b/CORE/HDD/inc/wlan_hdd_dp_utils.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -49,6 +49,7 @@ #include <linux/spinlock.h> #include <vos_trace.h> #include <vos_list.h> +#include <adf_os_lock.h> /**----------------------------------------------------------------------------- Preprocessor definitions and constants @@ -64,7 +65,7 @@ typedef struct hdd_list_s hdd_list_node_t anchor; v_SIZE_t count; v_SIZE_t max_size; - spinlock_t lock; + adf_os_spinlock_t lock; } hdd_list_t; typedef struct @@ -84,7 +85,7 @@ VOS_INLINE_FN v_VOID_t hdd_list_init( hdd_list_t *pList, v_SIZE_t max_size) INIT_LIST_HEAD( &pList->anchor ); pList->count = 0; pList->max_size = max_size; - spin_lock_init(&pList->lock); + adf_os_spinlock_init(&pList->lock); } VOS_INLINE_FN v_VOID_t hdd_list_destroy( hdd_list_t *pList ) diff --git a/CORE/HDD/inc/wlan_hdd_hostapd.h b/CORE/HDD/inc/wlan_hdd_hostapd.h index a45564def0d4..ea9a43683f36 100644 --- a/CORE/HDD/inc/wlan_hdd_hostapd.h +++ b/CORE/HDD/inc/wlan_hdd_hostapd.h @@ -151,9 +151,9 @@ static inline bool hdd_is_sta_connection_pending(hdd_context_t *hdd_ctx) { bool status; - spin_lock(&hdd_ctx->sta_update_info_lock); + adf_os_spin_lock(&hdd_ctx->sta_update_info_lock); status = hdd_ctx->is_sta_connection_pending; - spin_unlock(&hdd_ctx->sta_update_info_lock); + adf_os_spin_unlock(&hdd_ctx->sta_update_info_lock); return status; } @@ -171,9 +171,9 @@ static inline void hdd_change_sta_conn_pending_status(hdd_context_t *hdd_ctx, bool value) { - spin_lock(&hdd_ctx->sta_update_info_lock); + adf_os_spin_lock(&hdd_ctx->sta_update_info_lock); hdd_ctx->is_sta_connection_pending = value; - spin_unlock(&hdd_ctx->sta_update_info_lock); + adf_os_spin_unlock(&hdd_ctx->sta_update_info_lock); } /** @@ -189,10 +189,10 @@ static inline bool hdd_is_sap_restart_required(hdd_context_t *hdd_ctx) { bool status = false; - spin_lock(&hdd_ctx->sap_update_info_lock); + adf_os_spin_lock(&hdd_ctx->sap_update_info_lock); if (!hdd_ctx->is_ch_avoid_in_progress) status = hdd_ctx->is_sap_restart_required; - spin_unlock(&hdd_ctx->sap_update_info_lock); + adf_os_spin_unlock(&hdd_ctx->sap_update_info_lock); return status; } @@ -211,9 +211,9 @@ static inline void hdd_change_sap_restart_required_status(hdd_context_t *hdd_ctx, bool value) { - spin_lock(&hdd_ctx->sap_update_info_lock); + adf_os_spin_lock(&hdd_ctx->sap_update_info_lock); hdd_ctx->is_sap_restart_required = value; - spin_unlock(&hdd_ctx->sap_update_info_lock); + adf_os_spin_unlock(&hdd_ctx->sap_update_info_lock); } /** @@ -230,9 +230,9 @@ static inline void hdd_change_ch_avoidance_status(hdd_context_t *hdd_ctx, bool value) { - spin_lock(&hdd_ctx->sap_update_info_lock); + adf_os_spin_lock(&hdd_ctx->sap_update_info_lock); hdd_ctx->is_ch_avoid_in_progress = value; - spin_unlock(&hdd_ctx->sap_update_info_lock); + adf_os_spin_unlock(&hdd_ctx->sap_update_info_lock); hddLog(LOG1, FL("is_ch_avoid_in_progress %d"), value); } diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h index 63375984f4f3..d60734a149af 100644 --- a/CORE/HDD/inc/wlan_hdd_main.h +++ b/CORE/HDD/inc/wlan_hdd_main.h @@ -51,6 +51,10 @@ #include <wlan_hdd_wmm.h> #include <wlan_hdd_cfg.h> #include <linux/spinlock.h> +#ifdef WLAN_FEATURE_TSF_PTP +#include <linux/ptp_classify.h> +#include <linux/ptp_clock_kernel.h> +#endif #include <wlan_hdd_ftm.h> #ifdef FEATURE_WLAN_TDLS #include "wlan_hdd_tdls.h" @@ -343,7 +347,7 @@ struct linkspeedContext unsigned int magic; }; -extern spinlock_t hdd_context_lock; +extern adf_os_spinlock_t hdd_context_lock; #define STATS_CONTEXT_MAGIC 0x53544154 //STAT #define PEER_INFO_CONTEXT_MAGIC 0x52535349 /* PEER_INFO */ @@ -1301,7 +1305,7 @@ struct hdd_adapter_s */ /** Multiple station supports */ /** Per-station structure */ - spinlock_t staInfo_lock; //To protect access to station Info + adf_os_spinlock_t staInfo_lock; //To protect access to station Info hdd_station_info_t aStaInfo[WLAN_MAX_STA_COUNT]; //v_U8_t uNumActiveStation; @@ -1335,7 +1339,7 @@ struct hdd_adapter_s vos_timer_t host_capture_req_timer; #ifdef WLAN_FEATURE_TSF_PLUS /* spin lock for read/write timestamps */ - spinlock_t host_target_sync_lock; + adf_os_spinlock_t host_target_sync_lock; vos_timer_t host_target_sync_timer; uint64_t cur_host_time; uint64_t last_host_time; @@ -1431,7 +1435,7 @@ struct hdd_adapter_s /* BITMAP indicating pause reason */ uint32_t pause_map; - spinlock_t pause_map_lock; + adf_os_spinlock_t pause_map_lock; adf_os_time_t start_time; adf_os_time_t last_time; @@ -1444,7 +1448,7 @@ struct hdd_adapter_s struct hdd_netif_queue_stats queue_oper_stats[WLAN_REASON_TYPE_MAX]; /* random address management for management action frames */ - spinlock_t random_mac_lock; + adf_os_spinlock_t random_mac_lock; struct action_frame_random_mac random_mac[MAX_RANDOM_MAC_ADDRS]; /* * Store the restrict_offchannel count @@ -1813,7 +1817,7 @@ struct hdd_context_s #ifdef FEATURE_WLAN_THERMAL_SHUTDOWN bool system_suspended; volatile int thermal_suspend_state; - spinlock_t thermal_suspend_lock; + adf_os_spinlock_t thermal_suspend_lock; struct workqueue_struct *thermal_suspend_wq; struct delayed_work thermal_suspend_work; #endif @@ -1834,7 +1838,7 @@ struct hdd_context_s v_BOOL_t suspended; bool prevent_suspend; - spinlock_t filter_lock; + adf_os_spinlock_t filter_lock; /* Lock to avoid race condition during start/stop bss */ struct mutex sap_lock; @@ -1947,7 +1951,7 @@ struct hdd_context_s /* Use below lock to protect access to isSchedScanUpdatePending * since it will be accessed in two different contexts. */ - spinlock_t schedScan_lock; + adf_os_spinlock_t schedScan_lock; // Flag keeps track of wiphy suspend/resume v_BOOL_t isWiphySuspended; @@ -1959,7 +1963,7 @@ struct hdd_context_s /* DDR bus bandwidth compute timer */ vos_timer_t bus_bw_timer; int cur_vote_level; - spinlock_t bus_bw_lock; + adf_os_spinlock_t bus_bw_lock; int cur_rx_level; uint64_t prev_rx; int cur_tx_level; @@ -2006,8 +2010,8 @@ struct hdd_context_s bool is_ch_avoid_in_progress; bool is_sta_connection_pending; - spinlock_t sap_update_info_lock; - spinlock_t sta_update_info_lock; + adf_os_spinlock_t sap_update_info_lock; + adf_os_spinlock_t sta_update_info_lock; v_U8_t dev_dfs_cac_status; @@ -2021,7 +2025,7 @@ struct hdd_context_s v_U8_t skip_acs_scan_status; uint8_t *last_acs_channel_list; uint8_t num_of_channels; - spinlock_t acs_skip_lock; + adf_os_spinlock_t acs_skip_lock; #endif vos_wake_lock_t sap_dfs_wakelock; @@ -2052,7 +2056,7 @@ struct hdd_context_s * radar found indication and application triggered channel * switch */ - spinlock_t dfs_lock; + adf_os_spinlock_t dfs_lock; #ifdef FEATURE_WLAN_EXTSCAN struct hdd_ext_scan_context ext_scan_context; @@ -2138,6 +2142,10 @@ struct hdd_context_s /* the context that is capturing tsf */ hdd_adapter_t *cap_tsf_context; #endif +#ifdef WLAN_FEATURE_TSF_PTP + struct ptp_clock_info ptp_cinfo; + struct ptp_clock *ptp_clock; +#endif /* flag to show whether moniotr mode is enabled */ bool is_mon_enable; v_MACADDR_t hw_macaddr; @@ -2149,7 +2157,7 @@ struct hdd_context_s /* Lock to control access to dnbs avoid freq list */ struct mutex avoid_freq_lock; #endif - spinlock_t restrict_offchan_lock; + adf_os_spinlock_t restrict_offchan_lock; bool restrict_offchan_flag; }; @@ -2404,6 +2412,18 @@ int hdd_set_mas(hdd_adapter_t *hostapd_adapter, uint8_t filter_type); uint8_t hdd_is_mcc_in_24G(hdd_context_t *hdd_ctx); bool wlan_hdd_get_fw_state(hdd_adapter_t *adapter); +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0) +static inline void hdd_dev_setup_destructor(struct net_device *dev) +{ + dev->destructor = free_netdev; +} +#else +static inline void hdd_dev_setup_destructor(struct net_device *dev) +{ + dev->needs_free_netdev = true; +} +#endif /* KERNEL_VERSION(4, 12, 0) */ + #ifdef WLAN_FEATURE_LINK_LAYER_STATS static inline bool hdd_link_layer_stats_supported(void) { diff --git a/CORE/HDD/inc/wlan_hdd_p2p.h b/CORE/HDD/inc/wlan_hdd_p2p.h index 55236875ff24..3cb3f57cea91 100644 --- a/CORE/HDD/inc/wlan_hdd_p2p.h +++ b/CORE/HDD/inc/wlan_hdd_p2p.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -171,8 +171,13 @@ int wlan_hdd_mgmt_tx( struct wiphy *wiphy, struct net_device *dev, const u8 *buf, size_t len, u64 *cookie ); #endif - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)) +struct wireless_dev *wlan_hdd_add_virtual_intf(struct wiphy *wiphy, + const char *name, + unsigned char name_assign_type, + enum nl80211_iftype type, + struct vif_params *params); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) struct wireless_dev *wlan_hdd_add_virtual_intf(struct wiphy *wiphy, const char *name, unsigned char name_assign_type, diff --git a/CORE/HDD/inc/wlan_hdd_tsf.h b/CORE/HDD/inc/wlan_hdd_tsf.h index 6cabf3b90245..a1a329b87fc4 100644 --- a/CORE/HDD/inc/wlan_hdd_tsf.h +++ b/CORE/HDD/inc/wlan_hdd_tsf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015,2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2015,2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -91,6 +91,15 @@ int hdd_capture_tsf(hdd_adapter_t *adapter, uint32_t *buf, int len); * Return: Describe the execute result of this routine */ int hdd_indicate_tsf(hdd_adapter_t *adapter, uint32_t *buf, int len); + +/** + * wlan_get_ts_info() - return ts info to uplayer + * @dev: pointer to net_device + * @info: pointer to ethtool_ts_info + * + * Return: Describe the execute result of this routine + */ +int wlan_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info); #else static inline void wlan_hdd_tsf_init(hdd_context_t *hdd_ctx) @@ -112,6 +121,12 @@ hdd_capture_tsf(hdd_adapter_t *adapter, uint32_t *buf, int len) { return -ENOTSUPP; } + +static inline int +wlan_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info) +{ + return -ENOTSUPP; +} #endif #if defined(WLAN_FEATURE_TSF_PLUS) && defined(WLAN_FEATURE_TSF) diff --git a/CORE/HDD/inc/wlan_hdd_wowl.h b/CORE/HDD/inc/wlan_hdd_wowl.h index 0e2433b29cd9..26aac5d4a623 100644 --- a/CORE/HDD/inc/wlan_hdd_wowl.h +++ b/CORE/HDD/inc/wlan_hdd_wowl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014, 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c index af3563a39c40..58e2d704b84b 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -744,6 +744,22 @@ static void hdd_copy_ht_operation(hdd_station_ctx_t *hdd_sta_ctx, roam_ht_ops->basicMCSSet[i]; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) +static void hdd_copy_vht_center_freq(struct ieee80211_vht_operation *ieee_ops, + tDot11fIEVHTOperation *roam_ops) +{ + ieee_ops->center_freq_seg0_idx = roam_ops->chanCenterFreqSeg1; + ieee_ops->center_freq_seg1_idx = roam_ops->chanCenterFreqSeg2; +} +#else +static void hdd_copy_vht_center_freq(struct ieee80211_vht_operation *ieee_ops, + tDot11fIEVHTOperation *roam_ops) +{ + ieee_ops->center_freq_seg1_idx = roam_ops->chanCenterFreqSeg1; + ieee_ops->center_freq_seg2_idx = roam_ops->chanCenterFreqSeg2; +} +#endif /* KERNEL_VERSION(4, 12, 0) */ + /** * hdd_copy_vht_operation()- copy VHT operations element from roam info to * hdd station context. @@ -762,8 +778,7 @@ static void hdd_copy_vht_operation(hdd_station_ctx_t *hdd_sta_ctx, adf_os_mem_zero(hdd_vht_ops, sizeof(struct ieee80211_vht_operation)); hdd_vht_ops->chan_width = roam_vht_ops->chanWidth; - hdd_vht_ops->center_freq_seg1_idx = roam_vht_ops->chanCenterFreqSeg1; - hdd_vht_ops->center_freq_seg2_idx = roam_vht_ops->chanCenterFreqSeg2; + hdd_copy_vht_center_freq(hdd_vht_ops, roam_vht_ops); hdd_vht_ops->basic_mcs_set = roam_vht_ops->basicMCSSet; } @@ -1298,13 +1313,13 @@ static void hdd_SendAssociationEvent(struct net_device *dev,tCsrRoamInfo *pCsrRo #ifdef FEATURE_BUS_BANDWIDTH /* start timer in sta/p2p_cli */ - spin_lock_bh(&pHddCtx->bus_bw_lock); + adf_os_spin_lock_bh(&pHddCtx->bus_bw_lock); pAdapter->prev_tx_packets = pAdapter->stats.tx_packets; pAdapter->prev_rx_packets = pAdapter->stats.rx_packets; tlshim_get_intra_bss_fwd_pkts_count(pAdapter->sessionId, &pAdapter->prev_fwd_tx_packets, &pAdapter->prev_fwd_rx_packets); pAdapter->prev_tx_bytes = pAdapter->stats.tx_bytes; - spin_unlock_bh(&pHddCtx->bus_bw_lock); + adf_os_spin_unlock_bh(&pHddCtx->bus_bw_lock); hdd_start_bus_bw_compute_timer(pAdapter); #endif if (pHddCtx->cfg_ini->mon_on_sta_enable && @@ -1363,13 +1378,13 @@ static void hdd_SendAssociationEvent(struct net_device *dev,tCsrRoamInfo *pCsrRo #ifdef FEATURE_BUS_BANDWIDTH /* stop timer in sta/p2p_cli */ - spin_lock_bh(&pHddCtx->bus_bw_lock); + adf_os_spin_lock_bh(&pHddCtx->bus_bw_lock); pAdapter->prev_tx_packets = 0; pAdapter->prev_rx_packets = 0; pAdapter->prev_fwd_tx_packets = 0; pAdapter->prev_fwd_rx_packets = 0; pAdapter->prev_tx_bytes = 0; - spin_unlock_bh(&pHddCtx->bus_bw_lock); + adf_os_spin_unlock_bh(&pHddCtx->bus_bw_lock); hdd_stop_bus_bw_compute_timer(pAdapter); #endif if (pHddCtx->cfg_ini->mon_on_sta_enable && @@ -4572,8 +4587,8 @@ hdd_smeRoamCallback(void *pContext, tCsrRoamInfo *pRoamInfo, tANI_U32 roamId, VOS_STATUS status = VOS_STATUS_SUCCESS; hdd_context_t *pHddCtx = NULL; struct cfg80211_bss *bss_status; - tHalHandle hal = WLAN_HDD_GET_HAL_CTX(pAdapter); - tpAniSirGlobal mac = PMAC_STRUCT(hal); + tHalHandle hal; + tpAniSirGlobal mac; VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "CSR Callback: status= %d result= %d roamID=%d", roamStatus, roamResult, roamId ); @@ -4958,9 +4973,16 @@ hdd_smeRoamCallback(void *pContext, tCsrRoamInfo *pRoamInfo, tANI_U32 roamId, roamResult ); break; case eCSR_ROAM_STA_CHANNEL_SWITCH: - hdd_chan_change_notify(pAdapter, pAdapter->dev, - pRoamInfo->chan_info.chan_id, - mac->roam.configParam.phyMode); + { + pHddCtx = WLAN_HDD_GET_CTX(pAdapter); + if((pHddCtx) && (pHddCtx->hHal) && (pRoamInfo)) { + hal = pHddCtx->hHal; + mac = PMAC_STRUCT(hal); + hdd_chan_change_notify(pAdapter, pAdapter->dev, + pRoamInfo->chan_info.chan_id, + mac->roam.configParam.phyMode); + } + } default: break; } diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index ec651ed6804a..6fc2a9472f0f 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -4564,6 +4564,13 @@ REG_TABLE_ENTRY g_registry_table[] = CFG_INFORM_BSS_RSSI_RAW_MIN, CFG_INFORM_BSS_RSSI_RAW_MAX), #ifdef WLAN_FEATURE_TSF + REG_VARIABLE(CFG_SET_TSF_GPIO_PIN_HOST_NAME, WLAN_PARAM_Integer, + hdd_config_t, tsf_gpio_pin_host, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_SET_TSF_GPIO_PIN_HOST_DEFAULT, + CFG_SET_TSF_GPIO_PIN_HOST_MIN, + CFG_SET_TSF_GPIO_PIN_HOST_MAX), + REG_VARIABLE(CFG_SET_TSF_GPIO_PIN_NAME, WLAN_PARAM_Integer, hdd_config_t, tsf_gpio_pin, VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c index 173d9a17a350..8ce1070bb4c3 100644 --- a/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -191,9 +191,13 @@ } #ifdef WLAN_FEATURE_VOWIFI_11R +#ifndef WLAN_AKM_SUITE_FT_8021X #define WLAN_AKM_SUITE_FT_8021X 0x000FAC03 +#endif +#ifndef WLAN_AKM_SUITE_FT_PSK #define WLAN_AKM_SUITE_FT_PSK 0x000FAC04 #endif +#endif #define MAX_TXPOWER_SCALE 4 @@ -1909,9 +1913,9 @@ __wlan_hdd_cfg80211_set_scanning_mac_oui(struct wiphy *wiphy, return -ENOTSUPP; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_SET_SCANNING_MAC_OUI_MAX, - data, data_len, - NULL)) { + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_SET_SCANNING_MAC_OUI_MAX, + data, data_len, NULL)) { hddLog(LOGE, FL("Invalid ATTR")); return -EINVAL; } @@ -2027,7 +2031,7 @@ __wlan_hdd_cfg80211_get_concurrency_matrix(struct wiphy *wiphy, if (0 != ret) return ret; - if (nla_parse(tb, MAX_CONCURRENT_MATRIX, + if (wlan_cfg80211_nla_parse(tb, MAX_CONCURRENT_MATRIX, data, data_len, wlan_hdd_get_concurrency_matrix_policy)) { hddLog(LOGE, FL("Invalid ATTR")); return -EINVAL; @@ -2179,7 +2183,7 @@ __wlan_hdd_cfg80211_set_ext_roam_params(struct wiphy *wiphy, if (0 != ret) return -EINVAL; - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX, data, data_len, wlan_hdd_set_roam_param_policy)) { hddLog(LOGE, FL("Invalid ATTR")); @@ -2217,11 +2221,11 @@ __wlan_hdd_cfg80211_set_ext_roam_params(struct wiphy *wiphy, nla_for_each_nested(curr_attr, tb[QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_WHITE_LIST_SSID_LIST], rem) { - if (nla_parse(tb2, + if (wlan_cfg80211_nla_parse(tb2, QCA_WLAN_VENDOR_ATTR_ROAM_SUBCMD_MAX, nla_data(curr_attr), nla_len(curr_attr), wlan_hdd_set_roam_param_policy)) { - hddLog(LOGE, FL("nla_parse failed")); + hddLog(LOGE, FL("wlan_cfg80211_nla_parse failed")); goto fail; } /* Parse and Fetch allowed SSID list*/ @@ -2381,11 +2385,11 @@ __wlan_hdd_cfg80211_set_ext_roam_params(struct wiphy *wiphy, break; } - if (nla_parse(tb2, + if (wlan_cfg80211_nla_parse(tb2, QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX, nla_data(curr_attr), nla_len(curr_attr), wlan_hdd_set_roam_param_policy)) { - hddLog(LOGE, FL("nla_parse failed")); + hddLog(LOGE, FL("wlan_cfg80211_nla_parse failed")); goto fail; } /* Parse and fetch MAC address */ @@ -2443,11 +2447,11 @@ __wlan_hdd_cfg80211_set_ext_roam_params(struct wiphy *wiphy, hddLog(LOGW, FL("Ignoring excess Blacklist BSSID")); break; } - if (nla_parse(tb2, + if (wlan_cfg80211_nla_parse(tb2, QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX, nla_data(curr_attr), nla_len(curr_attr), wlan_hdd_set_roam_param_policy)) { - hddLog(LOGE, FL("nla_parse failed")); + hddLog(LOGE, FL("wlan_cfg80211_nla_parse failed")); goto fail; } /* Parse and fetch MAC address */ @@ -2902,7 +2906,8 @@ static int __wlan_hdd_cfg80211_extscan_get_capabilities(struct wiphy *wiphy, hddLog(LOGE, FL("extscan not supported")); return -ENOTSUPP; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, data, data_len, wlan_hdd_extscan_config_policy)) { hddLog(VOS_TRACE_LEVEL_ERROR, FL("Invalid ATTR")); @@ -2928,11 +2933,11 @@ static int __wlan_hdd_cfg80211_extscan_get_capabilities(struct wiphy *wiphy, pReqMsg->sessionId = pAdapter->sessionId; hddLog(VOS_TRACE_LEVEL_INFO, FL("Session Id %d"), pReqMsg->sessionId); - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context = &pHddCtx->ext_scan_context; context->request_id = pReqMsg->requestId; INIT_COMPLETION(context->response_event); - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); status = sme_ExtScanGetCapabilities(pHddCtx->hHal, pReqMsg); @@ -3045,7 +3050,7 @@ static int __wlan_hdd_cfg80211_extscan_get_cached_results(struct wiphy *wiphy, hddLog(LOGE, FL("extscan not supported")); return -ENOTSUPP; } - if (nla_parse(tb, PARAM_MAX, data, data_len, + if (wlan_cfg80211_nla_parse(tb, PARAM_MAX, data, data_len, wlan_hdd_extscan_config_policy)) { hddLog(LOGE, FL("Invalid ATTR")); return -EINVAL; @@ -3075,12 +3080,12 @@ static int __wlan_hdd_cfg80211_extscan_get_cached_results(struct wiphy *wiphy, hddLog(LOG1, FL("Req Id: %u Session Id: %d Flush: %d"), pReqMsg->requestId, pReqMsg->sessionId, pReqMsg->flush); - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context = &pHddCtx->ext_scan_context; context->request_id = pReqMsg->requestId; context->ignore_cached_results = false; INIT_COMPLETION(context->response_event); - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); status = sme_getCachedResults(pHddCtx->hHal, pReqMsg); if (!HAL_STATUS_SUCCESS(status)) { @@ -3094,13 +3099,13 @@ static int __wlan_hdd_cfg80211_extscan_get_cached_results(struct wiphy *wiphy, if (!rc) { hddLog(LOGE, FL("Target response timed out")); retval = -ETIMEDOUT; - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context->ignore_cached_results = true; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } else { - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); retval = context->response_status; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } return retval; @@ -3180,7 +3185,8 @@ static int __wlan_hdd_cfg80211_extscan_set_bssid_hotlist(struct wiphy *wiphy, if (0 != status) return -EINVAL; - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, data, data_len, wlan_hdd_extscan_config_policy)) { hddLog(VOS_TRACE_LEVEL_ERROR, FL("Invalid ATTR")); @@ -3242,10 +3248,11 @@ static int __wlan_hdd_cfg80211_extscan_set_bssid_hotlist(struct wiphy *wiphy, break; } - if (nla_parse(tb2, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, + if (wlan_cfg80211_nla_parse(tb2, + QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, nla_data(apTh), nla_len(apTh), wlan_hdd_extscan_config_policy)) { - hddLog(LOGE, FL("nla_parse failed")); + hddLog(LOGE, FL("wlan_cfg80211_nla_parse failed")); goto fail; } @@ -3287,10 +3294,10 @@ static int __wlan_hdd_cfg80211_extscan_set_bssid_hotlist(struct wiphy *wiphy, } context = &pHddCtx->ext_scan_context; - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); INIT_COMPLETION(context->response_event); context->request_id = request_id = pReqMsg->requestId; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); status = sme_SetBssHotlist(pHddCtx->hHal, pReqMsg); if (!HAL_STATUS_SUCCESS(status)) { @@ -3306,12 +3313,12 @@ static int __wlan_hdd_cfg80211_extscan_set_bssid_hotlist(struct wiphy *wiphy, hddLog(LOGE, FL("sme_SetBssHotlist timed out")); retval = -ETIMEDOUT; } else { - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); if (context->request_id == request_id) retval = context->response_status; else retval = -EINVAL; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } EXIT(); return retval; @@ -3377,7 +3384,8 @@ static int __wlan_hdd_cfg80211_extscan_set_significant_change( if (0 != retval) return -EINVAL; - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, data, data_len, wlan_hdd_extscan_config_policy)) { hddLog(LOGE, FL("Invalid ATTR")); @@ -3459,11 +3467,11 @@ static int __wlan_hdd_cfg80211_extscan_set_significant_change( break; } - if (nla_parse(tb2, + if (wlan_cfg80211_nla_parse(tb2, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, nla_data(apTh), nla_len(apTh), wlan_hdd_extscan_config_policy)) { - hddLog(LOGE, FL("nla_parse failed")); + hddLog(LOGE, FL("wlan_cfg80211_nla_parse failed")); goto fail; } @@ -3505,10 +3513,10 @@ static int __wlan_hdd_cfg80211_extscan_set_significant_change( } context = &pHddCtx->ext_scan_context; - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); INIT_COMPLETION(context->response_event); context->request_id = request_id = pReqMsg->requestId; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); status = sme_SetSignificantChange(pHddCtx->hHal, pReqMsg); if (!HAL_STATUS_SUCCESS(status)) { @@ -3524,12 +3532,12 @@ static int __wlan_hdd_cfg80211_extscan_set_significant_change( hddLog(LOGE, FL("sme_SetSignificantChange timed out")); retval = -ETIMEDOUT; } else { - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); if (context->request_id == request_id) retval = context->response_status; else retval = -EINVAL; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } EXIT(); return retval; @@ -3590,7 +3598,8 @@ static int __wlan_hdd_cfg80211_extscan_get_valid_channels(struct wiphy *wiphy, if (0 != retval) return -EINVAL; - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, data, data_len, wlan_hdd_extscan_config_policy)) { hddLog(LOGE, FL("Invalid ATTR")); @@ -3840,11 +3849,11 @@ static int hdd_extscan_start_fill_bucket_channel_spec( break; } - if (nla_parse(bucket, + if (wlan_cfg80211_nla_parse(bucket, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, nla_data(buckets), nla_len(buckets), wlan_hdd_extscan_config_policy)) { - hddLog(LOGE, FL("nla_parse failed")); + hddLog(LOGE, FL("wlan_cfg80211_nla_parse failed")); return -EINVAL; } @@ -4063,11 +4072,11 @@ static int hdd_extscan_start_fill_bucket_channel_spec( total_channels)) break; - if (nla_parse(channel, + if (wlan_cfg80211_nla_parse(channel, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, nla_data(channels), nla_len(channels), wlan_hdd_extscan_config_policy)) { - hddLog(LOGE, FL("nla_parse failed")); + hddLog(LOGE, FL("wlan_cfg80211_nla_parse failed")); return -EINVAL; } @@ -4281,7 +4290,7 @@ static int __wlan_hdd_cfg80211_extscan_start(struct wiphy *wiphy, return -ENOTSUPP; } - if (nla_parse(tb, PARAM_MAX, data, data_len, + if (wlan_cfg80211_nla_parse(tb, PARAM_MAX, data, data_len, wlan_hdd_extscan_config_policy)) { hddLog(LOGE, FL("Invalid ATTR")); return -EINVAL; @@ -4372,11 +4381,11 @@ static int __wlan_hdd_cfg80211_extscan_start(struct wiphy *wiphy, goto fail; context = &pHddCtx->ext_scan_context; - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); INIT_COMPLETION(context->response_event); context->request_id = request_id = pReqMsg->requestId; context->buckets_scanned = 0; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); status = sme_ExtScanStart(pHddCtx->hHal, pReqMsg); if (!HAL_STATUS_SUCCESS(status)) { @@ -4397,12 +4406,12 @@ static int __wlan_hdd_cfg80211_extscan_start(struct wiphy *wiphy, hddLog(LOGE, FL("sme_ExtScanStart timed out")); retval = -ETIMEDOUT; } else { - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); if (context->request_id == request_id) retval = context->response_status; else retval = -EINVAL; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } EXIT(); return retval; @@ -4495,7 +4504,7 @@ static int __wlan_hdd_cfg80211_extscan_stop(struct wiphy *wiphy, hddLog(LOGE, FL("extscan not supported")); return -ENOTSUPP; } - if (nla_parse(tb, PARAM_MAX, data, data_len, + if (wlan_cfg80211_nla_parse(tb, PARAM_MAX, data, data_len, wlan_hdd_extscan_config_policy)) { hddLog(LOGE, FL("Invalid ATTR")); return -EINVAL; @@ -4519,10 +4528,10 @@ static int __wlan_hdd_cfg80211_extscan_stop(struct wiphy *wiphy, pReqMsg->requestId, pReqMsg->sessionId); context = &pHddCtx->ext_scan_context; - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); INIT_COMPLETION(context->response_event); context->request_id = request_id = pReqMsg->requestId; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); status = sme_ExtScanStop(pHddCtx->hHal, pReqMsg); if (!HAL_STATUS_SUCCESS(status)) { @@ -4539,12 +4548,12 @@ static int __wlan_hdd_cfg80211_extscan_stop(struct wiphy *wiphy, hddLog(LOGE, FL("sme_ExtScanStop timed out")); retval = -ETIMEDOUT; } else { - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); if (context->request_id == request_id) retval = context->response_status; else retval = -EINVAL; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } EXIT(); return retval; @@ -4614,7 +4623,8 @@ static int __wlan_hdd_cfg80211_extscan_reset_bssid_hotlist(struct wiphy *wiphy, hddLog(LOGE, FL("extscan not supported")); return -ENOTSUPP; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, data, data_len, wlan_hdd_extscan_config_policy)) { hddLog(LOGE, FL("Invalid ATTR")); @@ -4641,10 +4651,10 @@ static int __wlan_hdd_cfg80211_extscan_reset_bssid_hotlist(struct wiphy *wiphy, pReqMsg->requestId, pReqMsg->sessionId); context = &pHddCtx->ext_scan_context; - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); INIT_COMPLETION(context->response_event); context->request_id = request_id = pReqMsg->requestId; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); status = sme_ResetBssHotlist(pHddCtx->hHal, pReqMsg); if (!HAL_STATUS_SUCCESS(status)) { @@ -4659,12 +4669,12 @@ static int __wlan_hdd_cfg80211_extscan_reset_bssid_hotlist(struct wiphy *wiphy, hddLog(LOGE, FL("sme_ResetBssHotlist timed out")); retval = -ETIMEDOUT; } else { - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); if (context->request_id == request_id) retval = context->response_status; else retval = -EINVAL; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } EXIT(); return retval; @@ -4729,7 +4739,8 @@ static int __wlan_hdd_cfg80211_extscan_reset_significant_change( hddLog(LOGE, FL("extscan not supported")); return -ENOTSUPP; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_EXTSCAN_SUBCMD_CONFIG_PARAM_MAX, data, data_len, wlan_hdd_extscan_config_policy)) { hddLog(LOGE, FL("Invalid ATTR")); @@ -4756,10 +4767,10 @@ static int __wlan_hdd_cfg80211_extscan_reset_significant_change( pReqMsg->requestId, pReqMsg->sessionId); context = &pHddCtx->ext_scan_context; - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); INIT_COMPLETION(context->response_event); context->request_id = request_id = pReqMsg->requestId; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); status = sme_ResetSignificantChange(pHddCtx->hHal, pReqMsg); if (!HAL_STATUS_SUCCESS(status)) { @@ -4775,12 +4786,12 @@ static int __wlan_hdd_cfg80211_extscan_reset_significant_change( hddLog(LOGE, FL("sme_ResetSignificantChange timed out")); retval = -ETIMEDOUT; } else { - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); if (context->request_id == request_id) retval = context->response_status; else retval = -EINVAL; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } EXIT(); return retval; @@ -4853,10 +4864,11 @@ static int hdd_extscan_epno_fill_network_list( break; } - if (nla_parse(network, QCA_WLAN_VENDOR_ATTR_PNO_MAX, + if (wlan_cfg80211_nla_parse(network, + QCA_WLAN_VENDOR_ATTR_PNO_MAX, nla_data(networks), nla_len(networks), wlan_hdd_pno_config_policy)) { - hddLog(LOGE, FL("nla_parse failed")); + hddLog(LOGE, FL("wlan_cfg80211_nla_parse failed")); return -EINVAL; } @@ -4868,7 +4880,7 @@ static int hdd_extscan_epno_fill_network_list( ssid_len = nla_len( network[QCA_WLAN_VENDOR_ATTR_PNO_SET_LIST_PARAM_EPNO_NETWORK_SSID]); - /* nla_parse will detect overflow but not underflow */ + /* wlan_cfg80211_nla_parse will detect overflow but not underflow */ if (0 == ssid_len) { hddLog(LOGE, FL("zero ssid length")); return -EINVAL; @@ -4948,7 +4960,7 @@ static int __wlan_hdd_cfg80211_set_epno_list(struct wiphy *wiphy, return -EINVAL; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_PNO_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_PNO_MAX, data, data_len, wlan_hdd_pno_config_policy)) { hddLog(LOGE, FL("Invalid ATTR")); @@ -5162,11 +5174,11 @@ static int hdd_extscan_passpoint_fill_network_list( break; } - if (nla_parse(network, + if (wlan_cfg80211_nla_parse(network, QCA_WLAN_VENDOR_ATTR_PNO_MAX, nla_data(networks), nla_len(networks), wlan_hdd_pno_config_policy)) { - hddLog(LOGE, FL("nla_parse failed")); + hddLog(LOGE, FL("wlan_cfg80211_nla_parse failed")); return -EINVAL; } @@ -5264,7 +5276,8 @@ static int __wlan_hdd_cfg80211_set_passpoint_list(struct wiphy *wiphy, return -EINVAL; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_PNO_MAX, data, data_len, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_PNO_MAX, data, data_len, wlan_hdd_pno_config_policy)) { hddLog(LOGE, FL("Invalid ATTR")); return -EINVAL; @@ -5385,7 +5398,8 @@ static int __wlan_hdd_cfg80211_reset_passpoint_list(struct wiphy *wiphy, return -EINVAL; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_PNO_MAX, data, data_len, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_PNO_MAX, data, data_len, wlan_hdd_extscan_config_policy)) { hddLog(LOGE, FL("Invalid ATTR")); return -EINVAL; @@ -6354,19 +6368,19 @@ static void wlan_hdd_cfg80211_link_layer_stats_callback(void *ctx, int indType, linkLayerStatsResults->num_radio, linkLayerStatsResults->results); - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context = &pHddCtx->ll_stats_context; /* validate response received from target */ if ((context->request_id != linkLayerStatsResults->rspId) || !(context->request_bitmap & linkLayerStatsResults->paramId)) { - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); hddLog(LOGE, FL("Error : Request id %d response id %d request bitmap 0x%x response bitmap 0x%x"), context->request_id, linkLayerStatsResults->rspId, context->request_bitmap, linkLayerStatsResults->paramId); return; } - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); if (linkLayerStatsResults->paramId & WMI_LINK_STATS_RADIO ) { @@ -6376,10 +6390,10 @@ static void wlan_hdd_cfg80211_link_layer_stats_callback(void *ctx, int indType, linkLayerStatsResults->results, linkLayerStatsResults->num_radio); - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); if (!linkLayerStatsResults->moreResultToFollow) context->request_bitmap &= ~(WMI_LINK_STATS_RADIO); - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } else if (linkLayerStatsResults->paramId & WMI_LINK_STATS_IFACE ) @@ -6389,7 +6403,7 @@ static void wlan_hdd_cfg80211_link_layer_stats_callback(void *ctx, int indType, linkLayerStatsResults->results, linkLayerStatsResults->num_peers); - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); /* Firmware doesn't send peerstats event if no peers are * connected. HDD should not wait for any peerstats in this case * and return the status to middlewre after receiving iface @@ -6398,7 +6412,7 @@ static void wlan_hdd_cfg80211_link_layer_stats_callback(void *ctx, int indType, if (!linkLayerStatsResults->num_peers) context->request_bitmap &= ~(WMI_LINK_STATS_ALL_PEER); context->request_bitmap &= ~(WMI_LINK_STATS_IFACE); - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } else if (linkLayerStatsResults->paramId & WMI_LINK_STATS_ALL_PEER ) @@ -6408,10 +6422,10 @@ static void wlan_hdd_cfg80211_link_layer_stats_callback(void *ctx, int indType, (tpSirWifiPeerStat) linkLayerStatsResults->results); - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); if (!linkLayerStatsResults->moreResultToFollow) context->request_bitmap &= ~(WMI_LINK_STATS_ALL_PEER); - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } else @@ -6420,11 +6434,11 @@ static void wlan_hdd_cfg80211_link_layer_stats_callback(void *ctx, int indType, FL("INVALID LL_STATS_NOTIFY RESPONSE ***********")); } - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); /* complete response event if all requests bitmaps are cleared */ if (0 == context->request_bitmap) complete(&context->response_event); - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); break; } @@ -6607,7 +6621,7 @@ static int __wlan_hdd_cfg80211_ll_stats_ext_set_param(struct wiphy *wiphy, hddLog(VOS_TRACE_LEVEL_INFO_LOW, FL("Get user layer settings for LL stat. Length is %d bytes"), data_len); - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_MAX, (struct nlattr *)data, data_len, qca_wlan_vendor_ll_ext_policy)) { hddLog(VOS_TRACE_LEVEL_ERROR, @@ -7597,7 +7611,8 @@ static int __wlan_hdd_cfg80211_ll_stats_set(struct wiphy *wiphy, if (0 != status) return -EINVAL; - if (nla_parse(tb_vendor, QCA_WLAN_VENDOR_ATTR_LL_STATS_SET_MAX, + if (wlan_cfg80211_nla_parse(tb_vendor, + QCA_WLAN_VENDOR_ATTR_LL_STATS_SET_MAX, (struct nlattr *)data, data_len, qca_wlan_vendor_ll_set_policy)) { @@ -7732,7 +7747,8 @@ static int __wlan_hdd_cfg80211_ll_stats_get(struct wiphy *wiphy, return -EBUSY; } - if (nla_parse(tb_vendor, QCA_WLAN_VENDOR_ATTR_LL_STATS_GET_MAX, + if (wlan_cfg80211_nla_parse(tb_vendor, + QCA_WLAN_VENDOR_ATTR_LL_STATS_GET_MAX, (struct nlattr *)data, data_len, qca_wlan_vendor_ll_get_policy)) { @@ -7763,12 +7779,12 @@ static int __wlan_hdd_cfg80211_ll_stats_get(struct wiphy *wiphy, LinkLayerStatsGetReq.staId = pAdapter->sessionId; - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context = &pHddCtx->ll_stats_context; context->request_id = LinkLayerStatsGetReq.reqId; context->request_bitmap = LinkLayerStatsGetReq.paramIdMask; INIT_COMPLETION(context->response_event); - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); if (eHAL_STATUS_SUCCESS != sme_LLStatsGetReq(pHddCtx->hHal, &LinkLayerStatsGetReq)) @@ -7857,7 +7873,8 @@ static int __wlan_hdd_cfg80211_ll_stats_clear(struct wiphy *wiphy, return -EINVAL; } - if (nla_parse(tb_vendor, QCA_WLAN_VENDOR_ATTR_LL_STATS_CLR_MAX, + if (wlan_cfg80211_nla_parse(tb_vendor, + QCA_WLAN_VENDOR_ATTR_LL_STATS_CLR_MAX, (struct nlattr *)data, data_len, qca_wlan_vendor_ll_clr_policy)) { @@ -8204,7 +8221,8 @@ __wlan_hdd_cfg80211_get_wifi_info(struct wiphy *wiphy, if (0 != status) return -EINVAL; - if (nla_parse(tb_vendor, QCA_WLAN_VENDOR_ATTR_WIFI_INFO_GET_MAX, data, + if (wlan_cfg80211_nla_parse(tb_vendor, + QCA_WLAN_VENDOR_ATTR_WIFI_INFO_GET_MAX, data, data_len, qca_wlan_vendor_get_wifi_info_policy)) { hddLog(LOGE, FL("WIFI_INFO_GET NL CMD parsing failed")); return -EINVAL; @@ -8642,7 +8660,8 @@ __wlan_hdd_cfg80211_thermal_cmd(struct wiphy *wiphy, if (wlan_hdd_validate_context(hdd_ctx)) return -EINVAL; - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_THERMAL_CMD_VALUE, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_THERMAL_CMD_VALUE, data, data_len, qca_wlan_vendor_thermal_cmd_policy)) { hddLog(LOGE, FL("Invalid ATTR")); @@ -8788,7 +8807,8 @@ static int __wlan_hdd_cfg80211_exttdls_get_status(struct wiphy *wiphy, if (pHddCtx->cfg_ini->fTDLSExternalControl == FALSE) { return -ENOTSUPP; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_TDLS_GET_STATUS_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_TDLS_GET_STATUS_MAX, data, data_len, wlan_hdd_tdls_config_get_status_policy)) { hddLog(VOS_TRACE_LEVEL_ERROR, FL("Invalid attribute")); @@ -8975,7 +8995,7 @@ static int __wlan_hdd_cfg80211_exttdls_enable(struct wiphy *wiphy, FL("TDLS External Control is not enabled")); return -ENOTSUPP; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_TDLS_ENABLE_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_TDLS_ENABLE_MAX, data, data_len, wlan_hdd_tdls_config_enable_policy)) { hddLog(VOS_TRACE_LEVEL_ERROR, FL("Invalid ATTR")); @@ -9091,7 +9111,7 @@ static int __wlan_hdd_cfg80211_exttdls_disable(struct wiphy *wiphy, return -ENOTSUPP; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_TDLS_DISABLE_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_TDLS_DISABLE_MAX, data, data_len, wlan_hdd_tdls_config_disable_policy)) { hddLog(VOS_TRACE_LEVEL_ERROR, FL("Invalid ATTR")); @@ -9277,7 +9297,7 @@ static int __wlan_hdd_cfg80211_disable_dfs_chan_scan(struct wiphy *wiphy, if ((ret_val = wlan_hdd_validate_context(pHddCtx))) return ret_val; - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_SET_NO_DFS_FLAG_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_SET_NO_DFS_FLAG_MAX, data, data_len, wlan_hdd_set_no_dfs_flag_config_policy)) { hddLog(LOGE, FL("invalid attr")); @@ -9854,13 +9874,13 @@ static int __wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy, } #ifdef FEATURE_WLAN_DISABLE_CHANNEL_SWITCH - spin_lock_bh(&hdd_ctx->restrict_offchan_lock); + adf_os_spin_lock_bh(&hdd_ctx->restrict_offchan_lock); if(hdd_ctx->restrict_offchan_flag) { hddLog(LOGE, FL("Channel switch is disabled, reject ACS")); - spin_unlock_bh(&hdd_ctx->restrict_offchan_lock); + adf_os_spin_unlock_bh(&hdd_ctx->restrict_offchan_lock); return -EPERM; } - spin_unlock_bh(&hdd_ctx->restrict_offchan_lock); + adf_os_spin_unlock_bh(&hdd_ctx->restrict_offchan_lock); #endif /* ***Note*** Donot set SME config related to ACS operation here because * ACS operation is not synchronouse and ACS for Second AP may come when @@ -9905,8 +9925,9 @@ static int __wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy, sap_config = &adapter->sessionCtx.ap.sapConfig; vos_mem_zero(&sap_config->acs_cfg, sizeof(struct sap_acs_cfg)); - status = nla_parse(tb, QCA_WLAN_VENDOR_ATTR_ACS_MAX, data, data_len, - wlan_hdd_cfg80211_do_acs_policy); + status = wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_ACS_MAX, data, data_len, + wlan_hdd_cfg80211_do_acs_policy); if (status) { hddLog(VOS_TRACE_LEVEL_ERROR, FL("Invalid ATTR")); goto out; @@ -10514,9 +10535,9 @@ static int wlan_hdd_handle_restrict_offchan_config(hdd_adapter_t *adapter, int chan; adapter->restrict_offchannel_cnt++; if (adapter->restrict_offchannel_cnt == 1) { - spin_lock_bh(&hdd_ctx->restrict_offchan_lock); + adf_os_spin_lock_bh(&hdd_ctx->restrict_offchan_lock); hdd_ctx->restrict_offchan_flag = true; - spin_unlock_bh(&hdd_ctx->restrict_offchan_lock); + adf_os_spin_unlock_bh(&hdd_ctx->restrict_offchan_lock); chan = hdd_get_operating_channel(hdd_ctx, dev_mode); hddLog(LOGE, FL("chan is %d"), chan); if (!chan || @@ -10529,9 +10550,9 @@ static int wlan_hdd_handle_restrict_offchan_config(hdd_adapter_t *adapter, (adapter->restrict_offchannel_cnt > 0)) { adapter->restrict_offchannel_cnt--; if (adapter->restrict_offchannel_cnt == 0) { - spin_lock_bh(&hdd_ctx->restrict_offchan_lock); + adf_os_spin_lock_bh(&hdd_ctx->restrict_offchan_lock); hdd_ctx->restrict_offchan_flag = false; - spin_unlock_bh(&hdd_ctx->restrict_offchan_lock); + adf_os_spin_unlock_bh(&hdd_ctx->restrict_offchan_lock); if (wlan_hdd_send_avoid_freq_for_dnbs(hdd_ctx, 0)) { hddLog(LOGE, FL("unable to clear avoid_freq")); ret_val = -EINVAL; @@ -10598,7 +10619,7 @@ static int __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy, if (ret_val) return ret_val; - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_CONFIG_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_CONFIG_MAX, data, data_len, wlan_hdd_wifi_config_policy)) { hddLog(LOGE, FL("invalid attr")); @@ -11210,7 +11231,8 @@ __wlan_hdd_cfg80211_wifi_configuration_get(struct wiphy *wiphy, if (0 != status) return -EINVAL; - if (nla_parse(tb_vendor, QCA_WLAN_VENDOR_ATTR_CONFIG_MAX, data, + if (wlan_cfg80211_nla_parse(tb_vendor, + QCA_WLAN_VENDOR_ATTR_CONFIG_MAX, data, data_len, wlan_hdd_wifi_config_policy)) { hddLog(LOGE, FL("WIFI_CFG_GET NL CMD parsing failed")); return -EINVAL; @@ -11441,7 +11463,8 @@ static int __wlan_hdd_cfg80211_wifi_logger_start(struct wiphy *wiphy, if (0 != status) return -EINVAL; - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_WIFI_LOGGER_START_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_WIFI_LOGGER_START_MAX, data, data_len, qca_wlan_vendor_wifi_logger_start_policy)) { hddLog(LOGE, FL("Invalid attribute")); @@ -11542,7 +11565,8 @@ static int __wlan_hdd_cfg80211_get_link_properties(struct wiphy *wiphy, if (0 != wlan_hdd_validate_context(hdd_ctx)) return -EINVAL; - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_MAX, data, data_len, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_MAX, data, data_len, qca_wlan_vendor_attr_policy)) { hddLog(VOS_TRACE_LEVEL_ERROR, FL("Invalid attribute")); return -EINVAL; @@ -11767,7 +11791,8 @@ static int __wlan_hdd_cfg80211_wifi_logger_get_ring_data(struct wiphy *wiphy, if (0 != status) return -EINVAL; - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_WIFI_LOGGER_GET_RING_DATA_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_WIFI_LOGGER_GET_RING_DATA_MAX, data, data_len, qca_wlan_vendor_wifi_logger_get_ring_data_policy)) { hddLog(LOGE, FL("Invalid attribute")); @@ -12174,7 +12199,7 @@ __wlan_hdd_cfg80211_offloaded_packets(struct wiphy *wiphy, return -ENOTSUPP; } - if (nla_parse(tb, PARAM_MAX, data, data_len, policy)) { + if (wlan_cfg80211_nla_parse(tb, PARAM_MAX, data, data_len, policy)) { hddLog(LOGE, FL("Invalid ATTR")); return -EINVAL; } @@ -12284,7 +12309,7 @@ __wlan_hdd_cfg80211_monitor_rssi(struct wiphy *wiphy, return -ENOTSUPP; } - if (nla_parse(tb, PARAM_MAX, data, data_len, policy)) { + if (wlan_cfg80211_nla_parse(tb, PARAM_MAX, data, data_len, policy)) { hddLog(LOGE, FL("Invalid ATTR")); return -EINVAL; } @@ -12541,10 +12566,10 @@ __wlan_hdd_cfg80211_set_ns_offload(struct wiphy *wiphy, return -EINVAL; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_ND_OFFLOAD_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_ND_OFFLOAD_MAX, (struct nlattr *)data, data_len, ns_offload_set_policy)) { - hddLog(LOGE, FL("nla_parse failed")); + hddLog(LOGE, FL("wlan_cfg80211_nla_parse failed")); return -EINVAL; } @@ -12619,7 +12644,8 @@ __wlan_hdd_cfg80211_setband(struct wiphy *wiphy, if (ret) return ret; - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_MAX, data, data_len, policy)) { + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_MAX, data, data_len, policy)) { hddLog(LOGE, FL("Invalid ATTR")); return -EINVAL; } @@ -12712,12 +12738,12 @@ void hdd_get_bpf_offload_cb(void *hdd_context, hddLog(LOGE, FL("Data is null")); return; } - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context = &bpf_context; /* The caller presumably timed out so there is nothing we can do */ if (context->magic != BPF_CONTEXT_MAGIC) { - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return; } @@ -12728,7 +12754,7 @@ void hdd_get_bpf_offload_cb(void *hdd_context, context->capability_response = *data; complete(&context->completion); - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return; } @@ -12794,11 +12820,11 @@ static int hdd_get_bpf_offload(hdd_context_t *hdd_ctx) ENTER(); - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context = &bpf_context; context->magic = BPF_CONTEXT_MAGIC; INIT_COMPLETION(context->completion); - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); hstatus = sme_get_bpf_offload_capabilities(hdd_ctx->hHal); if (!HAL_STATUS_SUCCESS(hstatus)) { @@ -12810,9 +12836,9 @@ static int hdd_get_bpf_offload(hdd_context_t *hdd_ctx) msecs_to_jiffies(WLAN_WAIT_TIME_BPF)); if (!rc) { hddLog(LOGE, FL("Target response timed out")); - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context->magic = 0; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return -ETIMEDOUT; } @@ -12971,7 +12997,7 @@ __wlan_hdd_cfg80211_bpf_offload(struct wiphy *wiphy, return -ENOTSUPP; } - if (nla_parse(tb, BPF_MAX, data, data_len, + if (wlan_cfg80211_nla_parse(tb, BPF_MAX, data, data_len, wlan_hdd_bpf_offload_policy)) { hddLog(LOGE, FL("Invalid ATTR")); return -EINVAL; @@ -13420,7 +13446,7 @@ __wlan_hdd_cfg80211_acs_dfs_mode(struct wiphy *wiphy, if (0 != ret) return -EINVAL; - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_ACS_DFS_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_ACS_DFS_MAX, data, data_len, wlan_hdd_set_acs_dfs_config_policy)) { hddLog(LOGE, FL("invalid attr")); @@ -13593,7 +13619,8 @@ __wlan_hdd_cfg80211_sta_roam_policy(struct wiphy *wiphy, ret = wlan_hdd_validate_context(hdd_ctx); if (0 != ret) return -EINVAL; - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_STA_CONNECT_ROAM_POLICY_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_STA_CONNECT_ROAM_POLICY_MAX, data, data_len, wlan_hdd_set_sta_roam_config_policy)) { hddLog(LOGE, FL("invalid attr")); @@ -13864,7 +13891,7 @@ __wlan_hdd_cfg80211_sap_configuration_set(struct wiphy *wiphy, return -EINVAL; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_SAP_CONFIG_MAX, data, data_len, wlan_hdd_sap_config_policy)) { hddLog(LOGE, FL("invalid attr")); @@ -14792,7 +14819,7 @@ __hdd_cfg80211_get_station_cmd(struct wiphy *wiphy, if (0 != status) goto out; - status = nla_parse(tb, STATION_MAX, data, data_len, + status = wlan_cfg80211_nla_parse(tb, STATION_MAX, data, data_len, hdd_get_station_policy); if (status) { hddLog(LOGE, FL("Invalid ATTR")); @@ -14938,7 +14965,8 @@ static int __wlan_hdd_cfg80211_fast_roaming(struct wiphy *wiphy, return -EINVAL; } - ret = nla_parse(tb, QCA_WLAN_VENDOR_ATTR_MAX, data, data_len, + ret = wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_MAX, data, data_len, qca_wlan_vendor_attr); if (ret) { hddLog(LOGE, FL("Invalid ATTR")); @@ -15048,7 +15076,7 @@ static int __wlan_hdd_cfg80211_txpower_scale(struct wiphy *wiphy, adapter = WLAN_HDD_GET_PRIV_PTR(dev); - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_MAX, data, data_len, txpower_scale_policy)) { hddLog(LOGE, "Invalid ATTR"); return -EINVAL; @@ -15134,7 +15162,8 @@ static int __wlan_hdd_cfg80211_txpower_scale_decr_db(struct wiphy *wiphy, adapter = WLAN_HDD_GET_PRIV_PTR(dev); - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_TXPOWER_SCALE_DECR_DB_MAX, data, data_len, txpower_scale_decr_db_policy)) { hddLog(LOGE, "Invalid ATTR"); return -EINVAL; @@ -15258,7 +15287,8 @@ static int __wlan_hdd_cfg80211_get_chain_rssi(struct wiphy *wiphy, return retval; /* nla validation doesn't do exact lengths, do the validation later */ - retval = nla_parse(tb, QCA_WLAN_VENDOR_ATTR_MAX, data, data_len, NULL); + retval = wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_MAX, data, data_len, NULL); if (retval) { hddLog(LOGE, FL("Invalid ATTR")); return retval; @@ -15279,11 +15309,11 @@ static int __wlan_hdd_cfg80211_get_chain_rssi(struct wiphy *wiphy, memcpy(&req_msg.peer_macaddr, nla_data(tb[QCA_WLAN_VENDOR_ATTR_MAC_ADDR]), mac_len); - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context = &hdd_ctx->chain_rssi_context; INIT_COMPLETION(context->response_event); context->ignore_result = false; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); status = sme_get_chain_rssi(hdd_ctx->hHal, &req_msg); if (!HAL_STATUS_SUCCESS(status)) { @@ -15296,9 +15326,9 @@ static int __wlan_hdd_cfg80211_get_chain_rssi(struct wiphy *wiphy, msecs_to_jiffies(WLAN_WAIT_TIME_CHAIN_RSSI)); if (!rc) { hddLog(LOGE, FL("Target response timed out")); - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context->ignore_result = true; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return -ETIMEDOUT; } @@ -15376,7 +15406,8 @@ __wlan_hdd_cfg80211_peer_flush_pending(struct wiphy *wiphy, hddLog(LOGE, FL("Command not allowed in FTM mode")); return -EINVAL; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_FLUSH_PENDING_MAX, data, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_FLUSH_PENDING_MAX, data, data_len, qca_wlan_vendor_peer_flush_pending_policy)) { hddLog(LOGE, FL("Invalid attribute")); return -EINVAL; @@ -16111,6 +16142,23 @@ static void wlan_hdd_cfg80211_set_wiphy_fils_feature(struct wiphy *wiphy) } #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0) +static inline void +hdd_wiphy_set_max_sched_scans(struct wiphy *wiphy, uint8_t max_scans) +{ + if (max_scans == 0) + wiphy->flags &= ~WIPHY_FLAG_SUPPORTS_SCHED_SCAN; + else + wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; +} +#else +static inline void +hdd_wiphy_set_max_sched_scans(struct wiphy *wiphy, uint8_t max_scans) +{ + wiphy->max_sched_scan_reqs = max_scans; +} +#endif /* KERNEL_VERSION(4, 12, 0) */ + /* * FUNCTION: wlan_hdd_cfg80211_init * This function is called by hdd_wlan_startup() @@ -16189,8 +16237,7 @@ int wlan_hdd_cfg80211_init(struct device *dev, #ifdef FEATURE_WLAN_SCAN_PNO if (pCfg->configPNOScanSupport) { - wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; - wiphy->max_sched_scan_ssids = SIR_PNO_MAX_SUPP_NETWORKS; + hdd_wiphy_set_max_sched_scans(wiphy, 1); wiphy->max_match_sets = SIR_PNO_MAX_SUPP_NETWORKS; wiphy->max_sched_scan_ie_len = SIR_MAC_MAX_IE_LENGTH; } @@ -16515,7 +16562,7 @@ void wlan_hdd_cfg80211_update_wiphy_caps(struct wiphy *wiphy) * control comes here. Here just we need to clear it if firmware doesn't * have PNO support. */ if (!pCfg->PnoOffload) { - wiphy->flags &= ~WIPHY_FLAG_SUPPORTS_SCHED_SCAN; + hdd_wiphy_set_max_sched_scans(wiphy, 0); wiphy->max_sched_scan_ssids = 0; wiphy->max_match_sets = 0; wiphy->max_sched_scan_ie_len = 0; @@ -20006,6 +20053,7 @@ done: return 0; } +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0) /* * FUNCTION: wlan_hdd_cfg80211_change_iface * wrapper function to protect the actual implementation from SSR. @@ -20024,6 +20072,22 @@ static int wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy, return ret; } +#else +static int wlan_hdd_cfg80211_change_iface(struct wiphy *wiphy, + struct net_device *ndev, + enum nl80211_iftype type, + struct vif_params *params) +{ + int ret; + + vos_ssr_protect(__func__); + ret = __wlan_hdd_cfg80211_change_iface(wiphy, ndev, type, + ¶ms->flags, params); + vos_ssr_unprotect(__func__); + + return ret; +} +#endif #ifdef FEATURE_WLAN_TDLS static int wlan_hdd_tdls_add_station(struct wiphy *wiphy, @@ -22264,11 +22328,11 @@ static bool wlan_hdd_sap_skip_scan_check(hdd_context_t *hdd_ctx, hdd_ctx->skip_acs_scan_status); if (hdd_ctx->skip_acs_scan_status != eSAP_SKIP_ACS_SCAN) return false; - spin_lock(&hdd_ctx->acs_skip_lock); + adf_os_spin_lock(&hdd_ctx->acs_skip_lock); if (hdd_ctx->last_acs_channel_list == NULL || hdd_ctx->num_of_channels == 0 || request->n_channels == 0) { - spin_unlock(&hdd_ctx->acs_skip_lock); + adf_os_spin_unlock(&hdd_ctx->acs_skip_lock); return false; } skip = true; @@ -22288,7 +22352,7 @@ static bool wlan_hdd_sap_skip_scan_check(hdd_context_t *hdd_ctx, break; } } - spin_unlock(&hdd_ctx->acs_skip_lock); + adf_os_spin_unlock(&hdd_ctx->acs_skip_lock); return skip; } #else @@ -24779,10 +24843,6 @@ int wlan_hdd_disconnect( hdd_adapter_t *pAdapter, u16 reason ) ENTER(); - status = wlan_hdd_validate_context(pHddCtx); - if (0 != status) - return status; - prev_conn_state = pHddStaCtx->conn_info.connState; /*stop tx queues*/ @@ -28361,6 +28421,20 @@ int wlan_hdd_scan_abort(hdd_adapter_t *pAdapter) return 0; } +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0) +static inline void +wlan_cfg80211_sched_scan_results(struct wiphy *wiphy, uint64_t reqid) +{ + cfg80211_sched_scan_results(wiphy); +} +#else +static inline void +wlan_cfg80211_sched_scan_results(struct wiphy *wiphy, uint64_t reqid) +{ + cfg80211_sched_scan_results(wiphy, reqid); +} +#endif + #ifdef FEATURE_WLAN_SCAN_PNO void hdd_cfg80211_sched_scan_done_callback(void *callbackContext, tSirPrefNetworkFoundInd *pPrefNetworkFoundInd) @@ -28386,16 +28460,16 @@ void hdd_cfg80211_sched_scan_done_callback(void *callbackContext, return ; } - spin_lock(&pHddCtx->schedScan_lock); + adf_os_spin_lock(&pHddCtx->schedScan_lock); if (TRUE == pHddCtx->isWiphySuspended) { pHddCtx->isSchedScanUpdatePending = TRUE; - spin_unlock(&pHddCtx->schedScan_lock); + adf_os_spin_unlock(&pHddCtx->schedScan_lock); hddLog(VOS_TRACE_LEVEL_INFO, "%s: Update cfg80211 scan database after it resume", __func__); return ; } - spin_unlock(&pHddCtx->schedScan_lock); + adf_os_spin_unlock(&pHddCtx->schedScan_lock); ret = wlan_hdd_cfg80211_update_bss(pHddCtx->wiphy, pAdapter); @@ -28411,7 +28485,7 @@ void hdd_cfg80211_sched_scan_done_callback(void *callbackContext, */ hdd_prevent_suspend_timeout(1000, WIFI_POWER_EVENT_WAKELOCK_SCAN); } - cfg80211_sched_scan_results(pHddCtx->wiphy); + wlan_cfg80211_sched_scan_results(pHddCtx->wiphy, 0); VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "%s: cfg80211 scan result database updated", __func__); } @@ -28903,6 +28977,7 @@ static int __wlan_hdd_cfg80211_sched_scan_stop(struct wiphy *wiphy, return ret; } +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0) /* * FUNCTION: wlan_hdd_cfg80211_sched_scan_stop * NL interface to disable PNO @@ -28918,6 +28993,20 @@ static int wlan_hdd_cfg80211_sched_scan_stop(struct wiphy *wiphy, return ret; } +#else +int wlan_hdd_cfg80211_sched_scan_stop(struct wiphy *wiphy, + struct net_device *dev, + uint64_t reqid) +{ + int ret; + + vos_ssr_protect(__func__); + ret = __wlan_hdd_cfg80211_sched_scan_stop(wiphy, dev); + vos_ssr_unprotect(__func__); + + return ret; +} +#endif #endif /*FEATURE_WLAN_SCAN_PNO*/ #ifdef FEATURE_WLAN_TDLS @@ -30313,7 +30402,8 @@ static int __wlan_hdd_cfg80211_testmode(struct wiphy *wiphy, ENTER(); - err = nla_parse(tb, WLAN_HDD_TM_ATTR_MAX, data, len, wlan_hdd_tm_policy); + err = wlan_cfg80211_nla_parse(tb, + WLAN_HDD_TM_ATTR_MAX, data, len, wlan_hdd_tm_policy); if (err) { hddLog(LOGE, FL("Testmode INV ATTR")); return err; @@ -30949,16 +31039,16 @@ int __wlan_hdd_cfg80211_resume_wlan(struct wiphy *wiphy, bool thermal) MTRACE(vos_trace(VOS_MODULE_ID_HDD, TRACE_CODE_HDD_CFG80211_RESUME_WLAN, NO_SESSION, pHddCtx->isWiphySuspended)); - spin_lock(&pHddCtx->schedScan_lock); + adf_os_spin_lock(&pHddCtx->schedScan_lock); pHddCtx->isWiphySuspended = FALSE; if (TRUE != pHddCtx->isSchedScanUpdatePending) { - spin_unlock(&pHddCtx->schedScan_lock); + adf_os_spin_unlock(&pHddCtx->schedScan_lock); hddLog(LOG1, FL("Return resume is not due to PNO indication")); return 0; } /* Reset flag to avoid updating cfg80211 data old results again */ pHddCtx->isSchedScanUpdatePending = FALSE; - spin_unlock(&pHddCtx->schedScan_lock); + adf_os_spin_unlock(&pHddCtx->schedScan_lock); status = hdd_get_front_adapter (pHddCtx, &pAdapterNode); @@ -30976,7 +31066,7 @@ int __wlan_hdd_cfg80211_resume_wlan(struct wiphy *wiphy, bool thermal) */ hdd_prevent_suspend_timeout(1000, WIFI_POWER_EVENT_WAKELOCK_RESUME_WLAN); - cfg80211_sched_scan_results(pHddCtx->wiphy); + wlan_cfg80211_sched_scan_results(pHddCtx->wiphy, 0); } hddLog(LOG1, FL("cfg80211 scan result database updated")); @@ -31427,12 +31517,12 @@ wlan_hdd_cfg80211_extscan_get_capabilities_rsp(void *ctx, hddLog(LOGE, FL("data is null")); return; } - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context = &hdd_ctx->ext_scan_context; /* validate response received from target*/ if (context->request_id != data->requestId) { - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); hddLog(LOGE, FL("Target response id did not match: request_id %d resposne_id %d"), context->request_id, data->requestId); @@ -31442,7 +31532,7 @@ wlan_hdd_cfg80211_extscan_get_capabilities_rsp(void *ctx, complete(&context->response_event); } - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return; } @@ -31571,10 +31661,10 @@ wlan_hdd_cfg80211_extscan_cached_results_ind(void *ctx, hddLog(VOS_TRACE_LEVEL_ERROR, FL("data is null")); return; } - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context = &pHddCtx->ext_scan_context; ignore_cached_results = context->ignore_cached_results; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); if (ignore_cached_results) { hddLog(LOGE, @@ -31755,10 +31845,10 @@ wlan_hdd_cfg80211_extscan_cached_results_ind(void *ctx, cfg80211_vendor_cmd_reply(skb); if (!data->more_data) { - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context->response_status = 0; complete(&context->response_event); - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } return; @@ -31766,9 +31856,9 @@ fail: if (skb) kfree_skb(skb); - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context->response_status = -EINVAL; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return; } @@ -31952,12 +32042,12 @@ wlan_hdd_cfg80211_extscan_generic_rsp response->request_id, response->status); context = &hdd_ctx->ext_scan_context; - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); if (context->request_id == response->request_id) { context->response_status = response->status ? -EINVAL : 0; complete(&context->response_event); } - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return; } @@ -32215,16 +32305,16 @@ wlan_hdd_cfg80211_extscan_full_scan_result_event(void *ctx, goto nla_put_failure; } - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context = &pHddCtx->ext_scan_context; if (nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_BUCKETS_SCANNED, context->buckets_scanned)) { - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); hddLog(LOGE, FL("Failed to include buckets_scanned")); goto nla_put_failure; } - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); cfg80211_vendor_event(skb, flags); return; @@ -32444,19 +32534,19 @@ wlan_hdd_cfg80211_extscan_scan_progress_event(void *ctx, data->requestId, data->scanEventType, data->status, data->buckets_scanned); - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context = &pHddCtx->ext_scan_context; if (data->scanEventType == WIFI_EXTSCAN_CYCLE_COMPLETED_EVENT) { context->buckets_scanned = 0; data->scanEventType = WIFI_EXTSCAN_RESULTS_AVAILABLE; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } else if (data->scanEventType == WIFI_EXTSCAN_CYCLE_STARTED_EVENT) { context->buckets_scanned = data->buckets_scanned; /* No need to report to user space */ - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return; } else { - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } skb = cfg80211_vendor_event_alloc(pHddCtx->wiphy, @@ -32721,20 +32811,20 @@ void wlan_hdd_cfg80211_chainrssi_callback(void *ctx, void *pmsg) if (wlan_hdd_validate_context(hdd_ctx)) return; - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); context = &hdd_ctx->chain_rssi_context; ignore_result = context->ignore_result; if (ignore_result) { hddLog(LOGE, FL("Ignore the result received after timeout")); - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return; } memcpy(&context->result, data, sizeof(*data)); complete(&context->response_event); - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return; } diff --git a/CORE/HDD/src/wlan_hdd_debugfs_ocb.c b/CORE/HDD/src/wlan_hdd_debugfs_ocb.c index 9ea98101e1a5..e01b82425ebf 100644 --- a/CORE/HDD/src/wlan_hdd_debugfs_ocb.c +++ b/CORE/HDD/src/wlan_hdd_debugfs_ocb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2018 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 @@ -253,7 +253,7 @@ static int __wlan_hdd_read_dsrc_chan_stats_debugfs(struct file *file, ptr = chan_stats_buf + sizeof(uint32_t); chan_stats = ctx->chan_stats; - spin_lock(&ctx->chan_stats_lock); + adf_os_spin_lock(&ctx->chan_stats_lock); /* Now only two channel stats supported */ for (i = 0; i < DSRC_MAX_CHAN_STATS_CNT; i++, chan_stats++) { if (chan_stats->chan_freq == 0) @@ -266,7 +266,7 @@ static int __wlan_hdd_read_dsrc_chan_stats_debugfs(struct file *file, ptr += sizeof(*chan_stats); chan_cnt++; } - spin_unlock(&ctx->chan_stats_lock); + adf_os_spin_unlock(&ctx->chan_stats_lock); vos_mem_copy(chan_stats_buf, &chan_cnt, sizeof(uint32_t)); ret_cnt = sizeof(uint32_t) + chan_cnt * sizeof(*chan_stats); diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c index b02a914774e7..52fc13cdc74f 100644 --- a/CORE/HDD/src/wlan_hdd_early_suspend.c +++ b/CORE/HDD/src/wlan_hdd_early_suspend.c @@ -1713,10 +1713,10 @@ static void hdd_PowerStateChangedCB { pHddCtx->hdd_ignore_dtim_enabled = TRUE; } - spin_lock(&pHddCtx->filter_lock); + adf_os_spin_lock(&pHddCtx->filter_lock); if ((newState == BMPS) && pHddCtx->hdd_wlan_suspended) { - spin_unlock(&pHddCtx->filter_lock); + adf_os_spin_unlock(&pHddCtx->filter_lock); if (VOS_FALSE == pHddCtx->sus_res_mcastbcast_filter_valid) { pHddCtx->sus_res_mcastbcast_filter = @@ -1744,20 +1744,20 @@ static void hdd_PowerStateChangedCB * resume request will be lost. So reconfigure the filters on detecting * a change in the power state of the WCN chip. */ - spin_unlock(&pHddCtx->filter_lock); + adf_os_spin_unlock(&pHddCtx->filter_lock); if (IMPS != newState) { - spin_lock(&pHddCtx->filter_lock); + adf_os_spin_lock(&pHddCtx->filter_lock); if (FALSE == pHddCtx->hdd_wlan_suspended) { - spin_unlock(&pHddCtx->filter_lock); + adf_os_spin_unlock(&pHddCtx->filter_lock); hddLog(VOS_TRACE_LEVEL_INFO, "Not in IMPS/BMPS and suspended state"); hdd_conf_mcastbcast_filter(pHddCtx, FALSE); } else { - spin_unlock(&pHddCtx->filter_lock); + adf_os_spin_unlock(&pHddCtx->filter_lock); } } } @@ -1783,7 +1783,7 @@ void hdd_register_mcast_bcast_filter(hdd_context_t *pHddCtx) return; } - spin_lock_init(&pHddCtx->filter_lock); + adf_os_spinlock_init(&pHddCtx->filter_lock); if (WLAN_MAP_SUSPEND_TO_MCAST_BCAST_FILTER == pHddCtx->cfg_ini->nEnableSuspend) { @@ -2540,6 +2540,7 @@ err_vosclose: #ifdef MEMORY_DEBUG adf_net_buf_debug_exit(); + adf_nbuf_map_check_for_leaks(); vos_mem_exit(); #endif diff --git a/CORE/HDD/src/wlan_hdd_ftm.c b/CORE/HDD/src/wlan_hdd_ftm.c index acf8c77c0dd6..2ddb807e6dec 100644 --- a/CORE/HDD/src/wlan_hdd_ftm.c +++ b/CORE/HDD/src/wlan_hdd_ftm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -71,6 +71,7 @@ #include "wlan_nv.h" #include "wlan_qct_wda.h" #include "cfgApi.h" +#include <adf_os_lock.h> #if defined(QCA_WIFI_FTM) #include "bmi.h" @@ -834,7 +835,7 @@ int wlan_hdd_ftm_close(hdd_context_t *pHddCtx) } #if defined(QCA_WIFI_FTM) && defined(LINUX_QCMBR) - spin_lock_bh(&qcmbr_queue_lock); + adf_os_raw_spin_lock_bh(&qcmbr_queue_lock); if (!list_empty(&qcmbr_queue_head)) { qcmbr_queue_t *msg_buf, *tmp_buf; list_for_each_entry_safe(msg_buf, tmp_buf, &qcmbr_queue_head, list) { @@ -842,7 +843,7 @@ int wlan_hdd_ftm_close(hdd_context_t *pHddCtx) kfree(msg_buf); } } - spin_unlock_bh(&qcmbr_queue_lock); + adf_os_raw_spin_unlock_bh(&qcmbr_queue_lock); #endif return 0; @@ -972,7 +973,7 @@ static int wlan_hdd_qcmbr_command(hdd_adapter_t *pAdapter, qcmbr_data_t *pqcmbr_ case ATH_XIOCTL_UNIFIED_UTF_RSP: { pqcmbr_data->copy_to_user = 1; - spin_lock_bh(&qcmbr_queue_lock); + adf_os_raw_spin_lock_bh(&qcmbr_queue_lock); if (!list_empty(&qcmbr_queue_head)) { qcmbr_buf = list_first_entry(&qcmbr_queue_head, qcmbr_queue_t, list); @@ -981,7 +982,7 @@ static int wlan_hdd_qcmbr_command(hdd_adapter_t *pAdapter, qcmbr_data_t *pqcmbr_ } else { ret = -1; } - spin_unlock_bh(&qcmbr_queue_lock); + adf_os_raw_spin_unlock_bh(&qcmbr_queue_lock); if (!ret) { memcpy(pqcmbr_data->buf, qcmbr_buf->utf_buf, @@ -1085,9 +1086,9 @@ static void WLANQCMBR_McProcessMsg(v_VOID_t *message) qcmbr_buf = kzalloc(sizeof(qcmbr_queue_t), GFP_KERNEL); if (qcmbr_buf != NULL) { memcpy(qcmbr_buf->utf_buf, message, data_len); - spin_lock_bh(&qcmbr_queue_lock); + adf_os_raw_spin_lock_bh(&qcmbr_queue_lock); list_add_tail(&(qcmbr_buf->list), &qcmbr_queue_head); - spin_unlock_bh(&qcmbr_queue_lock); + adf_os_raw_spin_unlock_bh(&qcmbr_queue_lock); } } #endif /*LINUX_QCMBR*/ diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c index 46d06c180468..0cbce7d64a48 100644 --- a/CORE/HDD/src/wlan_hdd_hostapd.c +++ b/CORE/HDD/src/wlan_hdd_hostapd.c @@ -60,6 +60,7 @@ #include <vos_api.h> #include <vos_sched.h> #include <linux/etherdevice.h> +#include <linux/ethtool.h> #include <wlan_hdd_includes.h> #include <qc_sap_ioctl.h> #include <wlan_hdd_hostapd.h> @@ -397,7 +398,7 @@ bool hdd_hostapd_sub20_channelwidth_can_switch( return false; } - spin_lock_bh(&adapter->staInfo_lock); + adf_os_spin_lock_bh(&adapter->staInfo_lock); for (i = 0; i < WLAN_MAX_STA_COUNT; i++) { sta = &adapter->aStaInfo[i]; if (sta->isUsed && (ap->uBCStaId != i)) { @@ -406,7 +407,7 @@ bool hdd_hostapd_sub20_channelwidth_can_switch( sta->sub20_dynamic_channelwidth; } } - spin_unlock_bh(&adapter->staInfo_lock); + adf_os_spin_unlock_bh(&adapter->staInfo_lock); if (sta_count != 1) { hddLog(VOS_TRACE_LEVEL_ERROR, @@ -459,7 +460,7 @@ bool hdd_hostapd_sub20_channelwidth_can_restore( hddLog(LOGE, FL("sub20 none")); return false; } - spin_lock_bh(&adapter->staInfo_lock); + adf_os_spin_lock_bh(&adapter->staInfo_lock); for (i = 0; i < WLAN_MAX_STA_COUNT; i++) { sta = &adapter->aStaInfo[i]; if (sta->isUsed && (ap->uBCStaId != i)) { @@ -468,7 +469,7 @@ bool hdd_hostapd_sub20_channelwidth_can_restore( sta->sub20_dynamic_channelwidth; } } - spin_unlock_bh(&adapter->staInfo_lock); + adf_os_spin_unlock_bh(&adapter->staInfo_lock); if (sta_count != 0) { hddLog(VOS_TRACE_LEVEL_ERROR, @@ -566,7 +567,7 @@ bool hdd_sub20_channelwidth_can_set( return false; } - spin_lock_bh(&adapter->staInfo_lock); + adf_os_spin_lock_bh(&adapter->staInfo_lock); for (i = 0; i < WLAN_MAX_STA_COUNT; i++) { sta = &adapter->aStaInfo[i]; if (sta->isUsed && (ap->uBCStaId != i)) { @@ -575,7 +576,7 @@ bool hdd_sub20_channelwidth_can_set( sta->sub20_dynamic_channelwidth; } } - spin_unlock_bh(&adapter->staInfo_lock); + adf_os_spin_unlock_bh(&adapter->staInfo_lock); if (sta_count >= 1 && !(sta_s20_caps & sub20_channel_width)) { hddLog(VOS_TRACE_LEVEL_ERROR, "%d STAs connected with sub20 Channelwidth %d", @@ -1903,7 +1904,7 @@ static VOS_STATUS hdd_handle_acs_scan_event(tpSap_Event sap_event, } comp_evt = &sap_event->sapevt.sap_acs_scan_comp; hdd_ctx->skip_acs_scan_status = eSAP_SKIP_ACS_SCAN; - spin_lock(&hdd_ctx->acs_skip_lock); + adf_os_spin_lock(&hdd_ctx->acs_skip_lock); vos_mem_free(hdd_ctx->last_acs_channel_list); hdd_ctx->last_acs_channel_list = NULL; hdd_ctx->num_of_channels = 0; @@ -1923,7 +1924,7 @@ static VOS_STATUS hdd_handle_acs_scan_event(tpSap_Event sap_event, hdd_ctx->num_of_channels = comp_evt->num_of_channels; } } - spin_unlock(&hdd_ctx->acs_skip_lock); + adf_os_spin_unlock(&hdd_ctx->acs_skip_lock); /* Update ACS scan result to cfg80211. Then OBSS scan can reuse the * scan result. */ @@ -2326,6 +2327,7 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa pHddApCtx->operatingChannel); pHostapdState->bssState = BSS_START; + hdd_start_tsf_sync(pHostapdAdapter); /* Set default key index */ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, @@ -2375,9 +2377,9 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa } } - spin_lock_bh(&pHddCtx->dfs_lock); + adf_os_spin_lock_bh(&pHddCtx->dfs_lock); pHddCtx->dfs_radar_found = VOS_FALSE; - spin_unlock_bh(&pHddCtx->dfs_lock); + adf_os_spin_unlock_bh(&pHddCtx->dfs_lock); WLANSAP_Get_Dfs_Ignore_CAC(pHddCtx->hHal, &ignoreCAC); if ((NV_CHANNEL_DFS != vos_nv_getChannelEnabledState(pHddApCtx->operatingChannel)) @@ -2709,7 +2711,7 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa /* start timer in sap/p2p_go */ if (pHddApCtx->bApActive == VOS_FALSE) { - spin_lock_bh(&pHddCtx->bus_bw_lock); + adf_os_spin_lock_bh(&pHddCtx->bus_bw_lock); pHostapdAdapter->prev_tx_packets = pHostapdAdapter->stats.tx_packets; pHostapdAdapter->prev_rx_packets = pHostapdAdapter->stats.rx_packets; tlshim_get_intra_bss_fwd_pkts_count( @@ -2718,7 +2720,7 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa &pHostapdAdapter->prev_fwd_rx_packets); pHostapdAdapter->prev_tx_bytes = pHostapdAdapter->stats.tx_bytes; - spin_unlock_bh(&pHddCtx->bus_bw_lock); + adf_os_spin_unlock_bh(&pHddCtx->bus_bw_lock); hdd_start_bus_bw_compute_timer(pHostapdAdapter); } #endif @@ -2855,7 +2857,7 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa hdd_softap_DeregisterSTA(pHostapdAdapter, staId); pHddApCtx->bApActive = VOS_FALSE; - spin_lock_bh( &pHostapdAdapter->staInfo_lock ); + adf_os_spin_lock_bh( &pHostapdAdapter->staInfo_lock ); for (i = 0; i < WLAN_MAX_STA_COUNT; i++) { if (pHostapdAdapter->aStaInfo[i].isUsed && i != (WLAN_HDD_GET_AP_CTX_PTR(pHostapdAdapter))->uBCStaId) @@ -2864,7 +2866,7 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa break; } } - spin_unlock_bh( &pHostapdAdapter->staInfo_lock ); + adf_os_spin_unlock_bh( &pHostapdAdapter->staInfo_lock ); // Start AP inactivity timer if no stations associated with it if ((0 != (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->nAPAutoShutOff)) @@ -2929,13 +2931,13 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa /*stop timer in sap/p2p_go */ if (pHddApCtx->bApActive == FALSE) { - spin_lock_bh(&pHddCtx->bus_bw_lock); + adf_os_spin_lock_bh(&pHddCtx->bus_bw_lock); pHostapdAdapter->prev_tx_packets = 0; pHostapdAdapter->prev_rx_packets = 0; pHostapdAdapter->prev_fwd_tx_packets = 0; pHostapdAdapter->prev_fwd_rx_packets = 0; pHostapdAdapter->prev_tx_bytes = 0; - spin_unlock_bh(&pHddCtx->bus_bw_lock); + adf_os_spin_unlock_bh(&pHddCtx->bus_bw_lock); hdd_stop_bus_bw_compute_timer(pHostapdAdapter); } #endif @@ -3146,7 +3148,7 @@ stopbss : /* Change the BSS state now since, as we are shutting things down, * we don't want interfaces to become re-enabled */ pHostapdState->bssState = BSS_STOP; - + hdd_stop_tsf_sync(pHostapdAdapter); if (0 != (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->nAPAutoShutOff) { if (VOS_TIMER_STATE_RUNNING == pHddApCtx->hdd_ap_inactivity_timer.state) @@ -3372,10 +3374,10 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_channel) } } - spin_lock_bh(&pHddCtx->dfs_lock); + adf_os_spin_lock_bh(&pHddCtx->dfs_lock); if (pHddCtx->dfs_radar_found == VOS_TRUE) { - spin_unlock_bh(&pHddCtx->dfs_lock); + adf_os_spin_unlock_bh(&pHddCtx->dfs_lock); hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Channel switch in progress!!", __func__); ret = -EBUSY; @@ -3392,7 +3394,7 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_channel) */ pHddCtx->dfs_radar_found = VOS_TRUE; - spin_unlock_bh(&pHddCtx->dfs_lock); + adf_os_spin_unlock_bh(&pHddCtx->dfs_lock); /* * Post the Channel Change request to SAP. */ @@ -3415,9 +3417,9 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_channel) * queues. */ - spin_lock_bh(&pHddCtx->dfs_lock); + adf_os_spin_lock_bh(&pHddCtx->dfs_lock); pHddCtx->dfs_radar_found = VOS_FALSE; - spin_unlock_bh(&pHddCtx->dfs_lock); + adf_os_spin_unlock_bh(&pHddCtx->dfs_lock); ret = -EINVAL; } @@ -3492,9 +3494,9 @@ int hdd_softap_set_channel_sub20_chanwidth_change(struct net_device *dev, return -EINVAL; } - spin_lock_bh(&hdd_ctx_ptr->dfs_lock); + adf_os_spin_lock_bh(&hdd_ctx_ptr->dfs_lock); if (hdd_ctx_ptr->dfs_radar_found == VOS_TRUE) { - spin_unlock_bh(&hdd_ctx_ptr->dfs_lock); + adf_os_spin_unlock_bh(&hdd_ctx_ptr->dfs_lock); hddLog(LOGE, FL("sub20 chan width switch in progress!!")); return -EBUSY; @@ -3509,7 +3511,7 @@ int hdd_softap_set_channel_sub20_chanwidth_change(struct net_device *dev, * post eSAP_START_BSS_EVENT success event to HDD. */ hdd_ctx_ptr->dfs_radar_found = VOS_TRUE; - spin_unlock_bh(&hdd_ctx_ptr->dfs_lock); + adf_os_spin_unlock_bh(&hdd_ctx_ptr->dfs_lock); vos_ctx_ptr = WLAN_HDD_GET_SAP_CTX_PTR(hostapd_adapter); status = WLANSAP_set_sub20_channelwidth_with_csa(vos_ctx_ptr, @@ -3523,9 +3525,9 @@ int hdd_softap_set_channel_sub20_chanwidth_change(struct net_device *dev, * radar found flag and also restart the netif * queues. */ - spin_lock_bh(&hdd_ctx_ptr->dfs_lock); + adf_os_spin_lock_bh(&hdd_ctx_ptr->dfs_lock); hdd_ctx_ptr->dfs_radar_found = VOS_FALSE; - spin_unlock_bh(&hdd_ctx_ptr->dfs_lock); + adf_os_spin_unlock_bh(&hdd_ctx_ptr->dfs_lock); ret = -EINVAL; } @@ -5293,7 +5295,7 @@ static __iw_softap_getassoc_stamacaddr(struct net_device *dev, maclist_index = sizeof(maclist_index); left = wrqu->data.length - maclist_index; - spin_lock_bh(&pHostapdAdapter->staInfo_lock); + adf_os_spin_lock_bh(&pHostapdAdapter->staInfo_lock); while ((cnt < WLAN_MAX_STA_COUNT) && (left >= VOS_MAC_ADDR_SIZE)) { if ((pStaInfo[cnt].isUsed) && (!IS_BROADCAST_MAC(pStaInfo[cnt].macAddrSTA.bytes))) { @@ -5304,7 +5306,7 @@ static __iw_softap_getassoc_stamacaddr(struct net_device *dev, } cnt++; } - spin_unlock_bh(&pHostapdAdapter->staInfo_lock); + adf_os_spin_unlock_bh(&pHostapdAdapter->staInfo_lock); *((u32 *)buf) = maclist_index; wrqu->data.length = maclist_index; @@ -7692,6 +7694,10 @@ const struct iw_handler_def hostapd_handler_def = { .get_wireless_stats = NULL, }; +static const struct ethtool_ops wlan_hostapd_ethtool_ops = { + .get_ts_info = wlan_get_ts_info, +}; + struct net_device_ops net_ops_struct = { .ndo_open = hdd_hostapd_open, .ndo_stop = hdd_hostapd_stop, @@ -7712,7 +7718,8 @@ static int hdd_set_hostapd(hdd_adapter_t *pAdapter) void hdd_set_ap_ops( struct net_device *pWlanHostapdDev ) { - pWlanHostapdDev->netdev_ops = &net_ops_struct; + pWlanHostapdDev->netdev_ops = &net_ops_struct; + pWlanHostapdDev->ethtool_ops = &wlan_hostapd_ethtool_ops; } VOS_STATUS hdd_init_ap_mode(hdd_adapter_t *pAdapter, bool reinit) @@ -7947,7 +7954,7 @@ hdd_adapter_t* hdd_wlan_create_ap_dev(hdd_context_t *pHddCtx, vos_mem_copy(pHostapdAdapter->macAddressCurrent.bytes, (void *)macAddr, sizeof(tSirMacAddr)); pHostapdAdapter->offloads_configured = FALSE; - pWlanHostapdDev->destructor = free_netdev; + hdd_dev_setup_destructor(pWlanHostapdDev); pWlanHostapdDev->ieee80211_ptr = &pHostapdAdapter->wdev ; pHostapdAdapter->wdev.wiphy = pHddCtx->wiphy; pHostapdAdapter->wdev.netdev = pWlanHostapdDev; @@ -7967,7 +7974,7 @@ hdd_adapter_t* hdd_wlan_create_ap_dev(hdd_context_t *pHddCtx, pWlanHostapdDev->features |= NETIF_F_RXCSUM; SET_NETDEV_DEV(pWlanHostapdDev, pHddCtx->parent_dev); - spin_lock_init(&pHostapdAdapter->pause_map_lock); + adf_os_spinlock_init(&pHostapdAdapter->pause_map_lock); pHostapdAdapter->last_tx_jiffies = jiffies; pHostapdAdapter->bug_report_count = 0; pHostapdAdapter->start_time = diff --git a/CORE/HDD/src/wlan_hdd_ipa.c b/CORE/HDD/src/wlan_hdd_ipa.c index 61c5ad8d1da2..e3bf79a2c833 100644 --- a/CORE/HDD/src/wlan_hdd_ipa.c +++ b/CORE/HDD/src/wlan_hdd_ipa.c @@ -431,7 +431,7 @@ struct hdd_ipa_priv { uint32_t pending_hw_desc_cnt; uint32_t hw_desc_cnt; - spinlock_t q_lock; + adf_os_spinlock_t q_lock; uint32_t freeq_cnt; struct list_head free_desc_head; @@ -595,7 +595,7 @@ static struct ipa_tx_data_desc *hdd_ipa_alloc_data_desc( { struct ipa_tx_data_desc *desc = NULL; - spin_lock_bh(&hdd_ipa->q_lock); + adf_os_spin_lock_bh(&hdd_ipa->q_lock); /* Keep the descriptors for priority alloc which can be used for * anchor nodes @@ -615,7 +615,7 @@ static struct ipa_tx_data_desc *hdd_ipa_alloc_data_desc( } end: - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); return desc; } @@ -626,10 +626,10 @@ static void hdd_ipa_free_data_desc(struct hdd_ipa_priv *hdd_ipa, desc->priv = NULL; desc->pyld_buffer = NULL; desc->pyld_len = 0; - spin_lock_bh(&hdd_ipa->q_lock); + adf_os_spin_lock_bh(&hdd_ipa->q_lock); list_add_tail(&desc->link, &hdd_ipa->free_desc_head); hdd_ipa->freeq_cnt++; - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); } static struct iphdr * hdd_ipa_get_ip_pkt(void *data, uint16_t *eth_type) @@ -2531,12 +2531,12 @@ static int hdd_ipa_rm_try_release(struct hdd_ipa_priv *hdd_ipa) return -EAGAIN; #ifndef IPA_UC_STA_OFFLOAD - spin_lock_bh(&hdd_ipa->q_lock); + adf_os_spin_lock_bh(&hdd_ipa->q_lock); if (hdd_ipa->pending_hw_desc_cnt || hdd_ipa->pend_q_cnt) { - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); return -EAGAIN; } - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); #endif adf_os_spin_lock_bh(&hdd_ipa->pm_lock); @@ -2612,11 +2612,11 @@ static void hdd_ipa_send_pkt_to_ipa(struct hdd_ipa_priv *hdd_ipa) INIT_LIST_HEAD(&send_desc_head->link); - spin_lock_bh(&hdd_ipa->q_lock); + adf_os_spin_lock_bh(&hdd_ipa->q_lock); if (hdd_ipa->pending_hw_desc_cnt >= hdd_ipa->hw_desc_cnt) { hdd_ipa->stats.num_rx_ipa_hw_maxed_out++; - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); hdd_ipa_free_data_desc(hdd_ipa, send_desc_head); return; } @@ -2624,7 +2624,7 @@ static void hdd_ipa_send_pkt_to_ipa(struct hdd_ipa_priv *hdd_ipa) pend_q_cnt = hdd_ipa->pend_q_cnt; if (pend_q_cnt == 0) { - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); hdd_ipa_free_data_desc(hdd_ipa, send_desc_head); return; } @@ -2658,7 +2658,7 @@ static void hdd_ipa_send_pkt_to_ipa(struct hdd_ipa_priv *hdd_ipa) } hdd_ipa->pending_hw_desc_cnt += cur_send_cnt; - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); if (ipa_tx_dp_mul(hdd_ipa->prod_client, send_desc_head) != 0) { HDD_IPA_LOG(VOS_TRACE_LEVEL_ERROR, @@ -2676,9 +2676,9 @@ static void hdd_ipa_send_pkt_to_ipa(struct hdd_ipa_priv *hdd_ipa) ipa_tx_failed: - spin_lock_bh(&hdd_ipa->q_lock); + adf_os_spin_lock_bh(&hdd_ipa->q_lock); hdd_ipa->pending_hw_desc_cnt -= cur_send_cnt; - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); list_for_each_entry_safe(desc, tmp, &send_desc_head->link, link) { list_del(&desc->link); @@ -3127,10 +3127,10 @@ VOS_STATUS hdd_ipa_process_rxt(v_VOID_t *vosContext, adf_nbuf_t rx_buf_list, send_desc->priv = buf; send_desc->pyld_buffer = buf->data; send_desc->pyld_len = buf->len; - spin_lock_bh(&hdd_ipa->q_lock); + adf_os_spin_lock_bh(&hdd_ipa->q_lock); list_add_tail(&send_desc->link, &hdd_ipa->pend_desc_head); hdd_ipa->pend_q_cnt++; - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); cur_cnt++; buf = next_buf; } @@ -3393,9 +3393,9 @@ static void hdd_ipa_w2i_cb(void *priv, enum ipa_dp_evt_type evt, buf = done_desc->priv; adf_nbuf_free(buf); hdd_ipa_free_data_desc(hdd_ipa, done_desc); - spin_lock_bh(&hdd_ipa->q_lock); + adf_os_spin_lock_bh(&hdd_ipa->q_lock); hdd_ipa->pending_hw_desc_cnt--; - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); hdd_ipa->stats.num_rx_ipa_write_done++; } /* add anchor node also back to free list */ @@ -4752,24 +4752,24 @@ static void hdd_ipa_rx_pipe_desc_free(void) max_desc_cnt = hdd_ipa->hw_desc_cnt * HDD_IPA_DESC_BUFFER_RATIO; - spin_lock_bh(&hdd_ipa->q_lock); + adf_os_spin_lock_bh(&hdd_ipa->q_lock); list_for_each_entry_safe(desc, tmp, &hdd_ipa->pend_desc_head, link) { list_del(&desc->link); adf_nbuf_free(desc->priv); - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); hdd_ipa_free_data_desc(hdd_ipa, desc); - spin_lock_bh(&hdd_ipa->q_lock); + adf_os_spin_lock_bh(&hdd_ipa->q_lock); } list_for_each_entry_safe(desc, tmp, &hdd_ipa->free_desc_head, link) { list_del(&desc->link); - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); adf_os_mem_free(desc); - spin_lock_bh(&hdd_ipa->q_lock); + adf_os_spin_lock_bh(&hdd_ipa->q_lock); i++; } - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); if (i != max_desc_cnt) HDD_IPA_LOG(VOS_TRACE_LEVEL_FATAL, "free desc leak: %u, %u", i, @@ -4789,7 +4789,7 @@ static int hdd_ipa_rx_pipe_desc_alloc(void) hdd_ipa->hdd_ctx->cfg_ini->IpaDescSize); max_desc_cnt = hdd_ipa->hw_desc_cnt * HDD_IPA_DESC_BUFFER_RATIO; - spin_lock_init(&hdd_ipa->q_lock); + adf_os_spinlock_init(&hdd_ipa->q_lock); INIT_LIST_HEAD(&hdd_ipa->free_desc_head); INIT_LIST_HEAD(&hdd_ipa->pend_desc_head); @@ -4804,9 +4804,9 @@ static int hdd_ipa_rx_pipe_desc_alloc(void) "Descriptor allocation failed"); goto fail; } - spin_lock_bh(&hdd_ipa->q_lock); + adf_os_spin_lock_bh(&hdd_ipa->q_lock); list_add_tail(&tmp_desc->link, &hdd_ipa->free_desc_head); - spin_unlock_bh(&hdd_ipa->q_lock); + adf_os_spin_unlock_bh(&hdd_ipa->q_lock); } diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index b1b54f9e8a14..85cfccfc4e04 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -93,6 +93,7 @@ #include <linux/ctype.h> #include <linux/compat.h> #include <linux/pm_qos.h> +#include <linux/ethtool.h> #ifdef MSM_PLATFORM #ifdef CONFIG_CNSS #include <soc/qcom/subsystem_restart.h> @@ -196,8 +197,8 @@ static char fwpath_mode_local[BUF_LEN]; * spinlock for synchronizing asynchronous request/response * (full description of use in wlan_hdd_main.h) */ -DEFINE_SPINLOCK(hdd_context_lock); - +//DEFINE_SPINLOCK(hdd_context_lock); +adf_os_spinlock_t hdd_context_lock; /* * The rate at which the driver sends RESTART event to supplicant * once the function 'vos_wlanRestart()' is called @@ -1793,12 +1794,11 @@ static void hdd_set_thermal_level_cb(hdd_context_t *pHddCtx, u_int8_t level) static bool hdd_system_suspend_state(hdd_context_t *hdd_ctx) { - unsigned long flags; bool s; - spin_lock_irqsave(&hdd_ctx->thermal_suspend_lock, flags); + adf_os_spin_lock_irqsave(&hdd_ctx->thermal_suspend_lock); s = hdd_ctx->system_suspended; - spin_unlock_irqrestore(&hdd_ctx->thermal_suspend_lock, flags); + adf_os_spin_unlock_irqrestore(&hdd_ctx->thermal_suspend_lock); return s; } @@ -1814,13 +1814,12 @@ hdd_system_suspend_state(hdd_context_t *hdd_ctx) bool hdd_system_suspend_state_set(hdd_context_t *hdd_ctx, bool state) { - unsigned long flags; bool old; - spin_lock_irqsave(&hdd_ctx->thermal_suspend_lock, flags); + adf_os_spin_lock_irqsave(&hdd_ctx->thermal_suspend_lock); old = hdd_ctx->system_suspended; hdd_ctx->system_suspended = state; - spin_unlock_irqrestore(&hdd_ctx->thermal_suspend_lock, flags); + adf_os_spin_unlock_irqrestore(&hdd_ctx->thermal_suspend_lock); return old; } @@ -1836,12 +1835,11 @@ hdd_system_suspend_state_set(hdd_context_t *hdd_ctx, bool state) int hdd_thermal_suspend_state(hdd_context_t *hdd_ctx) { - unsigned long flags; int s; - spin_lock_irqsave(&hdd_ctx->thermal_suspend_lock, flags); + adf_os_spin_lock_irqsave(&hdd_ctx->thermal_suspend_lock); s = hdd_ctx->thermal_suspend_state; - spin_unlock_irqrestore(&hdd_ctx->thermal_suspend_lock, flags); + adf_os_spin_unlock_irqrestore(&hdd_ctx->thermal_suspend_lock); return s; } @@ -1849,11 +1847,10 @@ hdd_thermal_suspend_state(hdd_context_t *hdd_ctx) static bool hdd_thermal_suspend_transit(hdd_context_t *hdd_ctx, int target, int *old) { - unsigned long flags; int s; bool ret = false; - spin_lock_irqsave(&hdd_ctx->thermal_suspend_lock, flags); + adf_os_spin_lock_irqsave(&hdd_ctx->thermal_suspend_lock); s = hdd_ctx->thermal_suspend_state; if (old) @@ -1887,7 +1884,7 @@ hdd_thermal_suspend_transit(hdd_context_t *hdd_ctx, int target, int *old) if (ret) hdd_ctx->thermal_suspend_state = target; - spin_unlock_irqrestore(&hdd_ctx->thermal_suspend_lock, flags); + adf_os_spin_unlock_irqrestore(&hdd_ctx->thermal_suspend_lock); return ret; } @@ -7787,16 +7784,15 @@ mem_free: length = scnprintf( extra, sizeof(extra), "%d %d", (int)txRate, (int)pHddStaCtx->ibss_peer_info.peerInfoParams[0].rssi); - + length = VOS_MIN(priv_data.total_len, length + 1); /* Copy the data back into buffer */ - if (copy_to_user(priv_data.buf, &extra, length+ 1)) - { + if (copy_to_user(priv_data.buf, &extra, length)) { VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "%s: copy data to user buffer failed GETIBSSPEERINFO command", __func__); ret = -EFAULT; goto exit; - } + } } else { @@ -9558,18 +9554,18 @@ bool hdd_dfs_indicate_radar(void *context, void *param) if (VOS_TRUE == hdd_radar_event->dfs_radar_status) { - spin_lock_bh(&pHddCtx->dfs_lock); + adf_os_spin_lock_bh(&pHddCtx->dfs_lock); if (pHddCtx->dfs_radar_found) { /* Application already triggered channel switch * on current channel, so return here */ - spin_unlock_bh(&pHddCtx->dfs_lock); + adf_os_spin_unlock_bh(&pHddCtx->dfs_lock); return false; } pHddCtx->dfs_radar_found = VOS_TRUE; - spin_unlock_bh(&pHddCtx->dfs_lock); + adf_os_spin_unlock_bh(&pHddCtx->dfs_lock); status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode ); while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status ) @@ -10855,6 +10851,10 @@ static v_U16_t hdd_select_queue(struct net_device *dev, return hdd_wmm_select_queue(dev, skb); } +static const struct ethtool_ops wlan_ethtool_ops = { + .get_ts_info = wlan_get_ts_info, +}; + static struct net_device_ops wlan_drv_ops = { .ndo_open = hdd_open, .ndo_stop = hdd_stop, @@ -10893,6 +10893,7 @@ void hdd_set_station_ops( struct net_device *pWlanDev ) pWlanDev->netdev_ops = &wlan_mon_drv_ops; else pWlanDev->netdev_ops = &wlan_drv_ops; + pWlanDev->ethtool_ops = &wlan_ethtool_ops; } void hdd_set_monitor_ops(struct net_device *pwlan_dev) @@ -11007,7 +11008,7 @@ hdd_adapter_runtime_suspend_denit(hdd_adapter_t *adapter) { } */ static void hdd_adapter_init_action_frame_random_mac(hdd_adapter_t *adapter) { - spin_lock_init(&adapter->random_mac_lock); + adf_os_spinlock_init(&adapter->random_mac_lock); vos_mem_zero(adapter->random_mac, sizeof(adapter->random_mac)); } @@ -11067,7 +11068,7 @@ static hdd_adapter_t* hdd_alloc_station_adapter(hdd_context_t *pHddCtx, pWlanDev->features |= NETIF_F_RXCSUM; hdd_set_station_ops( pAdapter->dev ); - pWlanDev->destructor = free_netdev; + hdd_dev_setup_destructor(pWlanDev); pWlanDev->ieee80211_ptr = &pAdapter->wdev ; pWlanDev->tx_queue_len = HDD_NETDEV_TX_QUEUE_LEN; pAdapter->wdev.wiphy = pHddCtx->wiphy; @@ -11076,7 +11077,7 @@ static hdd_adapter_t* hdd_alloc_station_adapter(hdd_context_t *pHddCtx, SET_NETDEV_DEV(pWlanDev, pHddCtx->parent_dev); hdd_wmm_init( pAdapter ); hdd_adapter_runtime_suspend_init(pAdapter); - spin_lock_init(&pAdapter->pause_map_lock); + adf_os_spinlock_init(&pAdapter->pause_map_lock); pAdapter->last_tx_jiffies = jiffies; pAdapter->bug_report_count = 0; pAdapter->start_time = pAdapter->last_time = vos_system_ticks(); @@ -11140,7 +11141,7 @@ static hdd_adapter_t *hdd_alloc_monitor_adapter(hdd_context_t *pHddCtx, pwlan_dev->features |= NETIF_F_RXCSUM; hdd_set_monitor_ops(pAdapter->dev); - pwlan_dev->destructor = free_netdev; + hdd_dev_setup_destructor(pwlan_dev); pwlan_dev->ieee80211_ptr = &pAdapter->wdev; pwlan_dev->tx_queue_len = HDD_NETDEV_TX_QUEUE_LEN; pAdapter->wdev.wiphy = pHddCtx->wiphy; @@ -11149,7 +11150,7 @@ static hdd_adapter_t *hdd_alloc_monitor_adapter(hdd_context_t *pHddCtx, SET_NETDEV_DEV(pwlan_dev, pHddCtx->parent_dev); hdd_wmm_init(pAdapter); hdd_adapter_runtime_suspend_init(pAdapter); - spin_lock_init(&pAdapter->pause_map_lock); + adf_os_spinlock_init(&pAdapter->pause_map_lock); pAdapter->last_tx_jiffies = jiffies; pAdapter->bug_report_count = 0; pAdapter->start_time = pAdapter->last_time = vos_system_ticks(); @@ -12615,39 +12616,43 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter, * For NDI do not use pWextState from sta_ctx, if needed * extract from ndi_ctx. */ - if (WLAN_HDD_NDI == pAdapter->device_mode) - halStatus = sme_RoamDisconnect(pHddCtx->hHal, + if ((WLAN_HDD_NDI == pAdapter->device_mode) || + (pWextState->roamProfile.BSSType == eCSR_BSS_TYPE_START_IBSS)) + { + if (WLAN_HDD_NDI == pAdapter->device_mode) + halStatus = sme_RoamDisconnect(pHddCtx->hHal, pAdapter->sessionId, eCSR_DISCONNECT_REASON_NDI_DELETE); - else if (pWextState->roamProfile.BSSType == eCSR_BSS_TYPE_START_IBSS) - halStatus = sme_RoamDisconnect(pHddCtx->hHal, + else + halStatus = sme_RoamDisconnect(pHddCtx->hHal, pAdapter->sessionId, eCSR_DISCONNECT_REASON_IBSS_LEAVE); - else - halStatus = sme_RoamDisconnect(pHddCtx->hHal, - pAdapter->sessionId, - eCSR_DISCONNECT_REASON_UNSPECIFIED); - //success implies disconnect command got queued up successfully - if(halStatus == eHAL_STATUS_SUCCESS) - { - rc = wait_for_completion_timeout( + /* success implies disconnect command got queued up */ + if (halStatus == eHAL_STATUS_SUCCESS) + { + rc = wait_for_completion_timeout( &pAdapter->disconnect_comp_var, msecs_to_jiffies(WLAN_WAIT_TIME_DISCONNECT)); - if (!rc) { - hddLog(VOS_TRACE_LEVEL_ERROR, - "%s: wait on disconnect_comp_var failed", + if (!rc) { + hddLog(VOS_TRACE_LEVEL_ERROR, + "%s: wait on disconnect_comp_var failed", + __func__); + } + } + else + { + hddLog(LOGE, "%s: failed to post disconnect event to SME", __func__); } - } - else - { - hddLog(LOGE, "%s: failed to post disconnect event to SME", - __func__); - } - memset(&wrqu, '\0', sizeof(wrqu)); - wrqu.ap_addr.sa_family = ARPHRD_ETHER; - memset(wrqu.ap_addr.sa_data,'\0',ETH_ALEN); - wireless_send_event(pAdapter->dev, SIOCGIWAP, &wrqu, NULL); + } + else + { + wlan_hdd_disconnect(pAdapter, eCSR_DISCONNECT_REASON_DEAUTH); + } + memset(&wrqu, '\0', sizeof(wrqu)); + wrqu.ap_addr.sa_family = ARPHRD_ETHER; + memset(wrqu.ap_addr.sa_data,'\0',ETH_ALEN); + wireless_send_event(pAdapter->dev, SIOCGIWAP, &wrqu, NULL); } if (pScanInfo != NULL && pScanInfo->mScanPending) @@ -13312,7 +13317,6 @@ void hdd_connect_result(struct net_device *dev, { hdd_adapter_t *padapter = (hdd_adapter_t *) netdev_priv(dev); struct cfg80211_bss *bss = NULL; - if (WLAN_STATUS_SUCCESS == status) { struct ieee80211_channel *chan; int freq; @@ -13877,10 +13881,10 @@ VOS_STATUS hdd_get_front_adapter( hdd_context_t *pHddCtx, hdd_adapter_list_node_t** ppAdapterNode) { VOS_STATUS status; - spin_lock_bh(&pHddCtx->hddAdapters.lock); + adf_os_spin_lock_bh(&pHddCtx->hddAdapters.lock); status = hdd_list_peek_front ( &pHddCtx->hddAdapters, (hdd_list_node_t**) ppAdapterNode ); - spin_unlock_bh(&pHddCtx->hddAdapters.lock); + adf_os_spin_unlock_bh(&pHddCtx->hddAdapters.lock); return status; } @@ -13889,12 +13893,12 @@ VOS_STATUS hdd_get_next_adapter( hdd_context_t *pHddCtx, hdd_adapter_list_node_t** pNextAdapterNode) { VOS_STATUS status; - spin_lock_bh(&pHddCtx->hddAdapters.lock); + adf_os_spin_lock_bh(&pHddCtx->hddAdapters.lock); status = hdd_list_peek_next ( &pHddCtx->hddAdapters, (hdd_list_node_t*) pAdapterNode, (hdd_list_node_t**)pNextAdapterNode ); - spin_unlock_bh(&pHddCtx->hddAdapters.lock); + adf_os_spin_unlock_bh(&pHddCtx->hddAdapters.lock); return status; } @@ -13902,10 +13906,10 @@ VOS_STATUS hdd_remove_adapter( hdd_context_t *pHddCtx, hdd_adapter_list_node_t* pAdapterNode) { VOS_STATUS status; - spin_lock_bh(&pHddCtx->hddAdapters.lock); + adf_os_spin_lock_bh(&pHddCtx->hddAdapters.lock); status = hdd_list_remove_node ( &pHddCtx->hddAdapters, &pAdapterNode->node ); - spin_unlock_bh(&pHddCtx->hddAdapters.lock); + adf_os_spin_unlock_bh(&pHddCtx->hddAdapters.lock); return status; } @@ -13913,10 +13917,10 @@ VOS_STATUS hdd_remove_front_adapter( hdd_context_t *pHddCtx, hdd_adapter_list_node_t** ppAdapterNode) { VOS_STATUS status; - spin_lock_bh(&pHddCtx->hddAdapters.lock); + adf_os_spin_lock_bh(&pHddCtx->hddAdapters.lock); status = hdd_list_remove_front( &pHddCtx->hddAdapters, (hdd_list_node_t**) ppAdapterNode ); - spin_unlock_bh(&pHddCtx->hddAdapters.lock); + adf_os_spin_unlock_bh(&pHddCtx->hddAdapters.lock); return status; } @@ -13924,10 +13928,10 @@ VOS_STATUS hdd_add_adapter_back( hdd_context_t *pHddCtx, hdd_adapter_list_node_t* pAdapterNode) { VOS_STATUS status; - spin_lock_bh(&pHddCtx->hddAdapters.lock); + adf_os_spin_lock_bh(&pHddCtx->hddAdapters.lock); status = hdd_list_insert_back ( &pHddCtx->hddAdapters, (hdd_list_node_t*) pAdapterNode ); - spin_unlock_bh(&pHddCtx->hddAdapters.lock); + adf_os_spin_unlock_bh(&pHddCtx->hddAdapters.lock); return status; } @@ -13935,10 +13939,10 @@ VOS_STATUS hdd_add_adapter_front( hdd_context_t *pHddCtx, hdd_adapter_list_node_t* pAdapterNode) { VOS_STATUS status; - spin_lock_bh(&pHddCtx->hddAdapters.lock); + adf_os_spin_lock_bh(&pHddCtx->hddAdapters.lock); status = hdd_list_insert_front ( &pHddCtx->hddAdapters, (hdd_list_node_t*) pAdapterNode ); - spin_unlock_bh(&pHddCtx->hddAdapters.lock); + adf_os_spin_unlock_bh(&pHddCtx->hddAdapters.lock); return status; } @@ -14251,12 +14255,12 @@ static void hdd_full_power_callback(void *callbackContext, eHalStatus status) function and the caller since the caller could time out either before or while this code is executing. we use a spinlock to serialize these actions */ - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); if (POWER_CONTEXT_MAGIC != pContext->magic) { /* the caller presumably timed out so there is nothing we can do */ - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); hddLog(VOS_TRACE_LEVEL_WARN, "%s: Invalid context, magic [%08x]", __func__, pContext->magic); @@ -14272,7 +14276,7 @@ static void hdd_full_power_callback(void *callbackContext, eHalStatus status) complete(&pContext->completion); /* serialization is complete */ - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } static inline VOS_STATUS hdd_UnregisterWext_all_adapters(hdd_context_t *pHddCtx) @@ -14682,11 +14686,11 @@ void hdd_wlan_exit(hdd_context_t *pHddCtx) hddLog(VOS_TRACE_LEVEL_FATAL, "%s: deinit skip acs scan timer failed", __func__); - spin_lock(&pHddCtx->acs_skip_lock); + adf_os_spin_lock(&pHddCtx->acs_skip_lock); vos_mem_free(pHddCtx->last_acs_channel_list); pHddCtx->last_acs_channel_list = NULL; pHddCtx->num_of_channels = 0; - spin_unlock(&pHddCtx->acs_skip_lock); + adf_os_spin_unlock(&pHddCtx->acs_skip_lock); #endif @@ -14740,9 +14744,9 @@ void hdd_wlan_exit(hdd_context_t *pHddCtx) serialize these activities by invalidating the magic while holding a shared spinlock which will cause us to block if the callback is currently executing */ - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); powerContext.magic = 0; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); } else { @@ -14976,11 +14980,11 @@ void hdd_skip_acs_scan_timer_handler(void * data) hddLog(LOG1, FL("ACS Scan result expired. Reset ACS scan skip")); hdd_ctx->skip_acs_scan_status = eSAP_DO_NEW_ACS_SCAN; - spin_lock(&hdd_ctx->acs_skip_lock); + adf_os_spin_lock(&hdd_ctx->acs_skip_lock); vos_mem_free(hdd_ctx->last_acs_channel_list); hdd_ctx->last_acs_channel_list = NULL; hdd_ctx->num_of_channels = 0; - spin_unlock(&hdd_ctx->acs_skip_lock); + adf_os_spin_unlock(&hdd_ctx->acs_skip_lock); /* Get first SAP adapter to clear results */ ap_adapter = hdd_get_adapter(hdd_ctx, WLAN_HDD_SOFTAP); @@ -15598,13 +15602,13 @@ static void hdd_bus_bw_compute_cbk(void *priv) total_tx += pAdapter->stats.tx_packets; - spin_lock_bh(&pHddCtx->bus_bw_lock); + adf_os_spin_lock_bh(&pHddCtx->bus_bw_lock); pAdapter->prev_tx_packets = pAdapter->stats.tx_packets; pAdapter->prev_tx_bytes = pAdapter->stats.tx_bytes; pAdapter->prev_rx_packets = pAdapter->stats.rx_packets; pAdapter->prev_fwd_tx_packets = fwd_tx_packets; pAdapter->prev_fwd_rx_packets = fwd_rx_packets; - spin_unlock_bh(&pHddCtx->bus_bw_lock); + adf_os_spin_unlock_bh(&pHddCtx->bus_bw_lock); connected = TRUE; } @@ -16399,7 +16403,7 @@ static VOS_STATUS hdd_init_thermal_ctx(hdd_context_t *pHddCtx) { pHddCtx->system_suspended = false; pHddCtx->thermal_suspend_state = HDD_WLAN_THERMAL_ACTIVE; - spin_lock_init(&pHddCtx->thermal_suspend_lock); + adf_os_spinlock_init(&pHddCtx->thermal_suspend_lock); INIT_DELAYED_WORK(&pHddCtx->thermal_suspend_work, hdd_thermal_suspend_work); pHddCtx->thermal_suspend_wq = create_singlethread_workqueue("thermal_wq"); if (!pHddCtx->thermal_suspend_wq) @@ -16611,7 +16615,7 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) init_completion(&pHddCtx->chain_rssi_context.response_event); - spin_lock_init(&pHddCtx->schedScan_lock); + adf_os_spinlock_init(&pHddCtx->schedScan_lock); hdd_list_init( &pHddCtx->hddAdapters, MAX_NUMBER_OF_ADAPTERS ); @@ -16629,13 +16633,13 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) } #ifdef FEATURE_WLAN_DISABLE_CHANNEL_SWITCH - spin_lock_init(&pHddCtx->restrict_offchan_lock); + adf_os_spinlock_init(&pHddCtx->restrict_offchan_lock); mutex_init(&pHddCtx->avoid_freq_lock); #endif - spin_lock_init(&pHddCtx->dfs_lock); - spin_lock_init(&pHddCtx->sap_update_info_lock); - spin_lock_init(&pHddCtx->sta_update_info_lock); + adf_os_spinlock_init(&pHddCtx->dfs_lock); + adf_os_spinlock_init(&pHddCtx->sap_update_info_lock); + adf_os_spinlock_init(&pHddCtx->sta_update_info_lock); hdd_init_offloaded_packets_ctx(pHddCtx); // Load all config first as TL config is needed during vos_open pHddCtx->cfg_ini = (hdd_config_t*) vos_mem_malloc(sizeof(hdd_config_t)); @@ -17435,7 +17439,7 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) hdd_skip_acs_scan_timer_handler, (void *)pHddCtx); if (!VOS_IS_STATUS_SUCCESS(status)) hddLog(LOGE, FL("Failed to init ACS Skip timer\n")); - spin_lock_init(&pHddCtx->acs_skip_lock); + adf_os_spinlock_init(&pHddCtx->acs_skip_lock); #endif #ifdef WLAN_FEATURE_NAN @@ -17522,7 +17526,7 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc) wlan_hdd_change_tdls_mode, (void *)pHddCtx); #ifdef FEATURE_BUS_BANDWIDTH - spin_lock_init(&pHddCtx->bus_bw_lock); + adf_os_spinlock_init(&pHddCtx->bus_bw_lock); vos_timer_init(&pHddCtx->bus_bw_timer, VOS_TIMER_TYPE_SW, hdd_bus_bw_compute_cbk, @@ -17868,6 +17872,7 @@ static inline void hdd_timer_exit(void) static inline void hdd_mem_exit(void) { adf_net_buf_debug_exit(); + adf_nbuf_map_check_for_leaks(); vos_mem_exit(); } #else @@ -17919,6 +17924,7 @@ static int hdd_driver_init( void) start = adf_get_boottime(); + adf_os_spinlock_init(&hdd_context_lock); #ifdef WLAN_LOGGING_SOCK_SVC_ENABLE wlan_logging_sock_init_svc(); #endif @@ -18221,6 +18227,7 @@ static void hdd_driver_exit(void) #endif #ifdef MEMORY_DEBUG adf_net_buf_debug_exit(); + adf_nbuf_map_check_for_leaks(); vos_mem_exit(); #endif diff --git a/CORE/HDD/src/wlan_hdd_nan_datapath.c b/CORE/HDD/src/wlan_hdd_nan_datapath.c index feb1a2b64504..ffb9d9fe76fb 100644 --- a/CORE/HDD/src/wlan_hdd_nan_datapath.c +++ b/CORE/HDD/src/wlan_hdd_nan_datapath.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -1926,7 +1926,7 @@ static int __wlan_hdd_cfg80211_process_ndp_cmd(struct wiphy *wiphy, hddLog(LOGE, FL("NAN datapath is not enabled")); return -EPERM; } - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_NDP_PARAMS_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_NDP_PARAMS_MAX, data, data_len, qca_wlan_vendor_ndp_policy)) { hddLog(LOGE, FL("Invalid NDP vendor command attributes")); diff --git a/CORE/HDD/src/wlan_hdd_ocb.c b/CORE/HDD/src/wlan_hdd_ocb.c index 663e6cd8bcb0..46b61dff3050 100644 --- a/CORE/HDD/src/wlan_hdd_ocb.c +++ b/CORE/HDD/src/wlan_hdd_ocb.c @@ -988,7 +988,7 @@ static int __wlan_hdd_cfg80211_ocb_set_config(struct wiphy *wiphy, } /* Parse the netlink message */ - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_OCB_SET_CONFIG_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_OCB_SET_CONFIG_MAX, data, data_len, qca_wlan_vendor_ocb_set_config_policy)) { hddLog(LOGE, FL("Invalid ATTR")); @@ -1226,7 +1226,8 @@ static int __wlan_hdd_cfg80211_ocb_set_utc_time(struct wiphy *wiphy, } /* Parse the netlink message */ - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_OCB_SET_UTC_TIME_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_OCB_SET_UTC_TIME_MAX, data, data_len, qca_wlan_vendor_ocb_set_utc_time_policy)) { hddLog(LOGE, FL("Invalid ATTR")); @@ -1350,7 +1351,8 @@ __wlan_hdd_cfg80211_ocb_start_timing_advert(struct wiphy *wiphy, timing_advert->vdev_id = adapter->sessionId; /* Parse the netlink message */ - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_OCB_START_TIMING_ADVERT_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_OCB_START_TIMING_ADVERT_MAX, data, data_len, qca_wlan_vendor_ocb_start_timing_advert_policy)) { @@ -1472,7 +1474,8 @@ __wlan_hdd_cfg80211_ocb_stop_timing_advert(struct wiphy *wiphy, timing_advert->vdev_id = adapter->sessionId; /* Parse the netlink message */ - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_OCB_STOP_TIMING_ADVERT_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_OCB_STOP_TIMING_ADVERT_MAX, data, data_len, qca_wlan_vendor_ocb_stop_timing_advert_policy)) { @@ -1835,7 +1838,7 @@ static int __wlan_hdd_cfg80211_dcc_get_stats(struct wiphy *wiphy, } /* Parse the netlink message */ - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_DCC_GET_STATS_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_DCC_GET_STATS_MAX, data, data_len, qca_wlan_vendor_dcc_get_stats)) { @@ -2007,7 +2010,8 @@ static int __wlan_hdd_cfg80211_dcc_clear_stats(struct wiphy *wiphy, } /* Parse the netlink message */ - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_DCC_CLEAR_STATS_MAX, + if (wlan_cfg80211_nla_parse(tb, + QCA_WLAN_VENDOR_ATTR_DCC_CLEAR_STATS_MAX, data, data_len, qca_wlan_vendor_dcc_clear_stats)) { @@ -2140,7 +2144,7 @@ static int __wlan_hdd_cfg80211_dcc_update_ndl(struct wiphy *wiphy, } /* Parse the netlink message */ - if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_DCC_UPDATE_NDL_MAX, + if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_DCC_UPDATE_NDL_MAX, data, data_len, qca_wlan_vendor_dcc_update_ndl)) { @@ -2325,10 +2329,10 @@ static void wlan_hdd_dsrc_update_radio_chan_stats( * entry in driver. If possible, driver can post * the recorders to application. */ - spin_lock(&ctx->chan_stats_lock); + adf_os_spin_lock(&ctx->chan_stats_lock); ctx->chan_stats_num = 0; vos_mem_zero(dest, 2 * sizeof(*dest)); - spin_unlock(&ctx->chan_stats_lock); + adf_os_spin_unlock(&ctx->chan_stats_lock); hddLog(LOGE, FL("Old Chan Stats Data")); return; } @@ -2337,15 +2341,15 @@ static void wlan_hdd_dsrc_update_radio_chan_stats( /* Save the first channels statistics event in adapter. */ src = resp->chan_stats; if (!ctx->chan_stats_num) { - spin_lock(&ctx->chan_stats_lock); + adf_os_spin_lock(&ctx->chan_stats_lock); vos_mem_copy(dest, src, resp->num_chans * sizeof(*src)); ctx->chan_stats_num = resp->num_chans; - spin_unlock(&ctx->chan_stats_lock); + adf_os_spin_unlock(&ctx->chan_stats_lock); return; } /* Merge new received channel statistics data to previous entry. */ - spin_lock(&ctx->chan_stats_lock); + adf_os_spin_lock(&ctx->chan_stats_lock); for (i = 0; i < resp->num_chans; i++, src++) { struct radio_chan_stats_info *dest_entry = NULL; struct radio_chan_stats_info *empty_entry = NULL; @@ -2372,7 +2376,7 @@ static void wlan_hdd_dsrc_update_radio_chan_stats( vos_mem_copy(empty_entry, src, sizeof(*src)); continue; } else { - spin_unlock(&ctx->chan_stats_lock); + adf_os_spin_unlock(&ctx->chan_stats_lock); hddLog(LOGE, FL("No entry found.")); return; } @@ -2404,7 +2408,7 @@ static void wlan_hdd_dsrc_update_radio_chan_stats( dest->rx_succ_pkts += src->rx_succ_pkts; dest->rx_fail_pkts += src->rx_fail_pkts; } - spin_unlock(&ctx->chan_stats_lock); + adf_os_spin_unlock(&ctx->chan_stats_lock); return; } @@ -2446,9 +2450,9 @@ static void wlan_hdd_dsrc_radio_chan_stats_event_callback(void *context_ptr, * 2. Firmware response to the request from Host APP. * Need check whether current event is response for request. */ - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); if ((ctx->magic != HDD_OCB_MAGIC) || (!ctx->cur_req)) { - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return; } req = ctx->cur_req; @@ -2457,27 +2461,27 @@ static void wlan_hdd_dsrc_radio_chan_stats_event_callback(void *context_ptr, if ((resp->num_chans == 1) && (req->chan_freq == chan_stats->chan_freq)) { complete(&ctx->completion_evt); - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return; } break; case WLAN_DSRC_REQUEST_ALL_RADIO_CHAN_STATS: if (resp->num_chans != ctx->config_chans_num) { - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return; } /* Check response channel is configured. */ for (i = 0; i < resp->num_chans; i++) { if (chan_stats[i].chan_freq != ctx->config_chans_freq[i]) { - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return; } } complete(&ctx->completion_evt); break; } - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return; } @@ -2510,7 +2514,7 @@ int wlan_hdd_dsrc_config_radio_chan_stats(hdd_adapter_t *adapter, vos_mem_zero(chan_stats, DSRC_MAX_CHAN_STATS_CNT * sizeof(*chan_stats)); if (enable_chan_stats) { - spin_lock_init(&ctx->chan_stats_lock); + adf_os_spinlock_init(&ctx->chan_stats_lock); ret = sme_register_radio_chan_stats_cb( ((hdd_context_t *)adapter->pHddCtx)->hHal, (void *)ctx, wlan_hdd_dsrc_radio_chan_stats_event_callback); @@ -2545,18 +2549,18 @@ int wlan_hdd_dsrc_request_radio_chan_stats(hdd_adapter_t *adapter, ctx = &adapter->dsrc_chan_stats; init_completion(&ctx->completion_evt); - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); ctx->magic = HDD_OCB_MAGIC; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); if (!wait_for_completion_timeout(&ctx->completion_evt, msecs_to_jiffies(WLAN_WAIT_TIME_OCB_CMD))) { hddLog(LOGE, FL("Wait for request completion timedout.")); ret = -ETIMEDOUT; } - spin_lock(&hdd_context_lock); + adf_os_spin_lock(&hdd_context_lock); ctx->magic = 0; - spin_unlock(&hdd_context_lock); + adf_os_spin_unlock(&hdd_context_lock); return ret; } diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c index 74108517c20b..73d00dda50dd 100644 --- a/CORE/HDD/src/wlan_hdd_p2p.c +++ b/CORE/HDD/src/wlan_hdd_p2p.c @@ -292,16 +292,16 @@ bool hdd_check_random_mac(hdd_adapter_t *adapter, uint8_t *random_mac_addr) { uint32_t i = 0; - spin_lock(&adapter->random_mac_lock); + adf_os_spin_lock(&adapter->random_mac_lock); for (i = 0; i < MAX_RANDOM_MAC_ADDRS; i++) { if ((adapter->random_mac[i].in_use) && (!memcmp(adapter->random_mac[i].addr, random_mac_addr, VOS_MAC_ADDR_SIZE))) { - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); return true; } } - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); return false; } @@ -434,7 +434,7 @@ static int32_t hdd_set_action_frame_random_mac(hdd_adapter_t *adapter, hddLog(LOG1, FL("mac_addr: " MAC_ADDRESS_STR " && cookie = %llu"), MAC_ADDR_ARRAY(random_mac_addr), cookie); - spin_lock(&adapter->random_mac_lock); + adf_os_spin_lock(&adapter->random_mac_lock); for (i = 0; i < MAX_RANDOM_MAC_ADDRS; i++) { if (adapter->random_mac[i].in_use) { in_use_cnt++; @@ -448,7 +448,7 @@ static int32_t hdd_set_action_frame_random_mac(hdd_adapter_t *adapter, append_ret = append_action_frame_cookie( &adapter->random_mac[i].cookie_list, cookie); - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); if(append_ret == -ENOMEM) { hddLog(LOGE, FL("No Sufficient memory for cookie")); @@ -466,7 +466,7 @@ static int32_t hdd_set_action_frame_random_mac(hdd_adapter_t *adapter, if ((in_use_cnt == MAX_RANDOM_MAC_ADDRS) || (i == MAX_RANDOM_MAC_ADDRS)) { - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); hddLog(LOGE, FL("Reached the limit of Max random addresses")); return -EBUSY; } @@ -475,21 +475,21 @@ static int32_t hdd_set_action_frame_random_mac(hdd_adapter_t *adapter, action_cookie = allocate_action_frame_cookie(&adapter->random_mac[i].cookie_list, cookie); if(!action_cookie) { - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); hddLog(LOGE, FL("No Sufficient memory for cookie")); return -ENOMEM; } vos_mem_copy(adapter->random_mac[i].addr, random_mac_addr, VOS_MAC_ADDR_SIZE); adapter->random_mac[i].in_use = true; - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); /* Program random mac_addr */ if (!hdd_set_random_mac(adapter, adapter->random_mac[i].addr)) { - spin_lock(&adapter->random_mac_lock); + adf_os_spin_lock(&adapter->random_mac_lock); /* clear the cookie */ delete_action_frame_cookie(action_cookie); adapter->random_mac[i].in_use = false; - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); hddLog(LOGE, FL("random mac filter set failed for: " MAC_ADDRESS_STR), MAC_ADDR_ARRAY(adapter->random_mac[i].addr)); @@ -527,7 +527,7 @@ static int32_t hdd_reset_action_frame_random_mac(hdd_adapter_t *adapter, hddLog(LOG1, FL("mac_addr: " MAC_ADDRESS_STR " && cookie = %llu"), MAC_ADDR_ARRAY(random_mac_addr), cookie); - spin_lock(&adapter->random_mac_lock); + adf_os_spin_lock(&adapter->random_mac_lock); for (i = 0; i < MAX_RANDOM_MAC_ADDRS; i++) { if ((adapter->random_mac[i].in_use) && (!memcmp(adapter->random_mac[i].addr, @@ -536,7 +536,7 @@ static int32_t hdd_reset_action_frame_random_mac(hdd_adapter_t *adapter, } if (i == MAX_RANDOM_MAC_ADDRS) { - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); hddLog(LOGE, FL("trying to delete cookie of random mac-addr" " for which entry is not present")); return -EINVAL; @@ -546,7 +546,7 @@ static int32_t hdd_reset_action_frame_random_mac(hdd_adapter_t *adapter, cookie); if (!action_cookie) { - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); hddLog(LOG1, FL("No cookie matches")); return 0; } @@ -554,7 +554,7 @@ static int32_t hdd_reset_action_frame_random_mac(hdd_adapter_t *adapter, delete_action_frame_cookie(action_cookie); if (list_empty(&adapter->random_mac[i].cookie_list)) { adapter->random_mac[i].in_use = false; - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); hdd_clear_random_mac(adapter, random_mac_addr); hddLog(LOG1, FL("Deleted random mac_addr:" MAC_ADDRESS_STR), @@ -562,7 +562,7 @@ static int32_t hdd_reset_action_frame_random_mac(hdd_adapter_t *adapter, return 0; } - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); return 0; } @@ -585,7 +585,7 @@ static int32_t hdd_delete_action_frame_cookie(hdd_adapter_t *adapter, hddLog(LOG1, FL("Delete cookie = %llu"), cookie); - spin_lock(&adapter->random_mac_lock); + adf_os_spin_lock(&adapter->random_mac_lock); for (i = 0; i < MAX_RANDOM_MAC_ADDRS; i++) { if (!adapter->random_mac[i].in_use) continue; @@ -600,18 +600,18 @@ static int32_t hdd_delete_action_frame_cookie(hdd_adapter_t *adapter, if (list_empty(&adapter->random_mac[i].cookie_list)) { adapter->random_mac[i].in_use = false; - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); hdd_clear_random_mac(adapter, adapter->random_mac[i].addr); hddLog(LOG1, FL("Deleted random addr "MAC_ADDRESS_STR), MAC_ADDR_ARRAY(adapter->random_mac[i].addr)); return 0; } - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); return 0; } - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); hddLog(LOG1, FL("Invalid cookie")); return -EINVAL; } @@ -632,7 +632,7 @@ static void hdd_delete_all_action_frame_cookies(hdd_adapter_t *adapter) struct list_head *n; struct list_head *temp; - spin_lock(&adapter->random_mac_lock); + adf_os_spin_lock(&adapter->random_mac_lock); for (i = 0; i < MAX_RANDOM_MAC_ADDRS; i++) { @@ -650,14 +650,14 @@ static void hdd_delete_all_action_frame_cookies(hdd_adapter_t *adapter) } adapter->random_mac[i].in_use = false; - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); hdd_clear_random_mac(adapter, adapter->random_mac[i].addr); hddLog(LOG1, FL("Deleted random addr " MAC_ADDRESS_STR), MAC_ADDR_ARRAY(adapter->random_mac[i].addr)); - spin_lock(&adapter->random_mac_lock); + adf_os_spin_lock(&adapter->random_mac_lock); } - spin_unlock(&adapter->random_mac_lock); + adf_os_spin_unlock(&adapter->random_mac_lock); } static eHalStatus @@ -1286,10 +1286,10 @@ static int wlan_hdd_roc_request_enqueue(hdd_adapter_t *adapter, hdd_roc_req->pRemainChanCtx = remain_chan_ctx; /* Enqueue this RoC request */ - spin_lock(&hdd_ctx->hdd_roc_req_q.lock); + adf_os_spin_lock(&hdd_ctx->hdd_roc_req_q.lock); status = hdd_list_insert_back(&hdd_ctx->hdd_roc_req_q, &hdd_roc_req->node); - spin_unlock(&hdd_ctx->hdd_roc_req_q.lock); + adf_os_spin_unlock(&hdd_ctx->hdd_roc_req_q.lock); if (VOS_STATUS_SUCCESS != status) { hddLog(LOGP, FL("Not able to enqueue RoC Req context")); @@ -1368,14 +1368,14 @@ void wlan_hdd_roc_request_dequeue(struct work_struct *work) * that any pending roc in the queue will be scheduled * on the current roc completion by scheduling the work queue. */ - spin_lock(&hdd_ctx->hdd_roc_req_q.lock); + adf_os_spin_lock(&hdd_ctx->hdd_roc_req_q.lock); if (list_empty(&hdd_ctx->hdd_roc_req_q.anchor)) { - spin_unlock(&hdd_ctx->hdd_roc_req_q.lock); + adf_os_spin_unlock(&hdd_ctx->hdd_roc_req_q.lock); return; } status = hdd_list_remove_front(&hdd_ctx->hdd_roc_req_q, (hdd_list_node_t **) &hdd_roc_req); - spin_unlock(&hdd_ctx->hdd_roc_req_q.lock); + adf_os_spin_unlock(&hdd_ctx->hdd_roc_req_q.lock); if (VOS_STATUS_SUCCESS != status) { hddLog(LOG1, FL("unable to remove roc element from list")); return; @@ -1756,13 +1756,13 @@ int __wlan_hdd_cfg80211_cancel_remain_on_channel( struct wiphy *wiphy, } /* Remove RoC request inside queue */ - spin_lock(&pHddCtx->hdd_roc_req_q.lock); + adf_os_spin_lock(&pHddCtx->hdd_roc_req_q.lock); list_for_each_safe(tmp, q, &pHddCtx->hdd_roc_req_q.anchor) { curr_roc_req = list_entry(tmp, hdd_roc_req_t, node); if ((uintptr_t)curr_roc_req->pRemainChanCtx == cookie) { status = hdd_list_remove_node(&pHddCtx->hdd_roc_req_q, (hdd_list_node_t*)curr_roc_req); - spin_unlock(&pHddCtx->hdd_roc_req_q.lock); + adf_os_spin_unlock(&pHddCtx->hdd_roc_req_q.lock); if (status == VOS_STATUS_SUCCESS) { vos_mem_free(curr_roc_req->pRemainChanCtx); vos_mem_free(curr_roc_req); @@ -1770,7 +1770,7 @@ int __wlan_hdd_cfg80211_cancel_remain_on_channel( struct wiphy *wiphy, return 0; } } - spin_unlock(&pHddCtx->hdd_roc_req_q.lock); + adf_os_spin_unlock(&pHddCtx->hdd_roc_req_q.lock); /* FIXME cancel currently running remain on chan. * Need to check cookie and cancel accordingly @@ -3008,7 +3008,23 @@ struct wireless_dev* __wlan_hdd_add_virtual_intf( #endif } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) +struct wireless_dev *wlan_hdd_add_virtual_intf(struct wiphy *wiphy, + const char *name, + unsigned char name_assign_type, + enum nl80211_iftype type, + struct vif_params *params) +{ + struct wireless_dev *wdev; + + vos_ssr_protect(__func__); + wdev = __wlan_hdd_add_virtual_intf(wiphy, name, name_assign_type, + type, ¶ms->flags, params); + vos_ssr_unprotect(__func__); + + return wdev; +} +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)) /** * wlan_hdd_add_virtual_intf() - Add virtual interface wrapper * @wiphy: wiphy pointer diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c index 9a370a153561..e1e10f78e72f 100644 --- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c +++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c @@ -82,7 +82,7 @@ static VOS_STATUS hdd_softap_flush_tx_queues( hdd_adapter_t *pAdapter ) skb_list_node_t *pktNode = NULL; struct sk_buff *skb = NULL; - spin_lock_bh( &pAdapter->staInfo_lock ); + adf_os_spin_lock_bh( &pAdapter->staInfo_lock ); for (STAId = 0; STAId < WLAN_MAX_STA_COUNT; STAId++) { if (FALSE == pAdapter->aStaInfo[STAId].isUsed) @@ -92,7 +92,7 @@ static VOS_STATUS hdd_softap_flush_tx_queues( hdd_adapter_t *pAdapter ) for (i = 0; i < NUM_TX_QUEUES; i ++) { - spin_lock_bh(&pAdapter->aStaInfo[STAId].wmm_tx_queue[i].lock); + adf_os_spin_lock_bh(&pAdapter->aStaInfo[STAId].wmm_tx_queue[i].lock); while (true) { status = hdd_list_remove_front ( &pAdapter->aStaInfo[STAId].wmm_tx_queue[i], &anchor); @@ -111,12 +111,12 @@ static VOS_STATUS hdd_softap_flush_tx_queues( hdd_adapter_t *pAdapter ) break; } pAdapter->aStaInfo[STAId].txSuspended[i] = VOS_FALSE; - spin_unlock_bh(&pAdapter->aStaInfo[STAId].wmm_tx_queue[i].lock); + adf_os_spin_unlock_bh(&pAdapter->aStaInfo[STAId].wmm_tx_queue[i].lock); } pAdapter->aStaInfo[STAId].vosLowResource = VOS_FALSE; } - spin_unlock_bh( &pAdapter->staInfo_lock ); + adf_os_spin_unlock_bh( &pAdapter->staInfo_lock ); return status; } @@ -628,7 +628,7 @@ VOS_STATUS hdd_softap_init_tx_rx( hdd_adapter_t *pAdapter ) pAdapter->aTxQueueLimit[WLANTL_AC_VI] = HDD_SOFTAP_TX_VI_QUEUE_MAX_LEN; pAdapter->aTxQueueLimit[WLANTL_AC_VO] = HDD_SOFTAP_TX_VO_QUEUE_MAX_LEN; - spin_lock_init( &pAdapter->staInfo_lock ); + adf_os_spinlock_init( &pAdapter->staInfo_lock ); for (STAId = 0; STAId < WLAN_MAX_STA_COUNT; STAId++) { @@ -680,7 +680,7 @@ static void hdd_softap_flush_tx_queues_sta( hdd_adapter_t *pAdapter, v_U8_t STAI for (i = 0; i < NUM_TX_QUEUES; i ++) { - spin_lock_bh(&pAdapter->aStaInfo[STAId].wmm_tx_queue[i].lock); + adf_os_spin_lock_bh(&pAdapter->aStaInfo[STAId].wmm_tx_queue[i].lock); while (true) { if (VOS_STATUS_E_EMPTY != @@ -698,7 +698,7 @@ static void hdd_softap_flush_tx_queues_sta( hdd_adapter_t *pAdapter, v_U8_t STAI //current list is empty break; } - spin_unlock_bh(&pAdapter->aStaInfo[STAId].wmm_tx_queue[i].lock); + adf_os_spin_unlock_bh(&pAdapter->aStaInfo[STAId].wmm_tx_queue[i].lock); } return; @@ -717,12 +717,12 @@ static void hdd_softap_flush_tx_queues_sta( hdd_adapter_t *pAdapter, v_U8_t STAI VOS_STATUS hdd_softap_init_tx_rx_sta( hdd_adapter_t *pAdapter, v_U8_t STAId, v_MACADDR_t *pmacAddrSTA) { v_U8_t i = 0; - spin_lock_bh( &pAdapter->staInfo_lock ); + adf_os_spin_lock_bh( &pAdapter->staInfo_lock ); if (pAdapter->aStaInfo[STAId].isUsed) { VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_ERROR, "%s: Reinit station %d", __func__, STAId ); - spin_unlock_bh( &pAdapter->staInfo_lock ); + adf_os_spin_unlock_bh( &pAdapter->staInfo_lock ); return VOS_STATUS_E_FAILURE; } @@ -736,7 +736,7 @@ VOS_STATUS hdd_softap_init_tx_rx_sta( hdd_adapter_t *pAdapter, v_U8_t STAId, v_M pAdapter->aStaInfo[STAId].isDeauthInProgress = FALSE; vos_copy_macaddr( &pAdapter->aStaInfo[STAId].macAddrSTA, pmacAddrSTA); - spin_unlock_bh( &pAdapter->staInfo_lock ); + adf_os_spin_unlock_bh( &pAdapter->staInfo_lock ); return VOS_STATUS_SUCCESS; } @@ -761,12 +761,12 @@ VOS_STATUS hdd_softap_deinit_tx_rx_sta ( hdd_adapter_t *pAdapter, v_U8_t STAId ) pHostapdState = WLAN_HDD_GET_HOSTAP_STATE_PTR(pAdapter); - spin_lock_bh( &pAdapter->staInfo_lock ); + adf_os_spin_lock_bh( &pAdapter->staInfo_lock ); if (FALSE == pAdapter->aStaInfo[STAId].isUsed) { VOS_TRACE( VOS_MODULE_ID_HDD_SAP_DATA, VOS_TRACE_LEVEL_ERROR, "%s: Deinit station not inited %d", __func__, STAId ); - spin_unlock_bh( &pAdapter->staInfo_lock ); + adf_os_spin_unlock_bh( &pAdapter->staInfo_lock ); return VOS_STATUS_E_FAILURE; } @@ -814,7 +814,7 @@ VOS_STATUS hdd_softap_deinit_tx_rx_sta ( hdd_adapter_t *pAdapter, v_U8_t STAId ) } } - spin_unlock_bh( &pAdapter->staInfo_lock ); + adf_os_spin_unlock_bh( &pAdapter->staInfo_lock ); return status; } @@ -1009,7 +1009,7 @@ VOS_STATUS hdd_softap_DeregisterSTA( hdd_adapter_t *pAdapter, tANI_U8 staId ) } if (pAdapter->aStaInfo[staId].isUsed) { - spin_lock_bh( &pAdapter->staInfo_lock ); + adf_os_spin_lock_bh( &pAdapter->staInfo_lock ); vos_mem_zero(&pAdapter->aStaInfo[staId], sizeof(hdd_station_info_t)); /* re-init spin lock, since netdev can still open adapter until @@ -1020,7 +1020,7 @@ VOS_STATUS hdd_softap_DeregisterSTA( hdd_adapter_t *pAdapter, tANI_U8 staId ) hdd_list_init(&pAdapter->aStaInfo[staId].wmm_tx_queue[i], HDD_TX_QUEUE_MAX_LEN); } - spin_unlock_bh( &pAdapter->staInfo_lock ); + adf_os_spin_unlock_bh( &pAdapter->staInfo_lock ); } pHddCtx->sta_to_adapter[staId] = NULL; diff --git a/CORE/HDD/src/wlan_hdd_tsf.c b/CORE/HDD/src/wlan_hdd_tsf.c index 8ce23b344f49..6ad7f14af2c6 100644 --- a/CORE/HDD/src/wlan_hdd_tsf.c +++ b/CORE/HDD/src/wlan_hdd_tsf.c @@ -33,7 +33,10 @@ #include "wlan_hdd_tsf.h" #include "wma_api.h" #include <linux/errqueue.h> - +#if defined(CONFIG_NON_QC_PLATFORM) +#include <linux/gpio.h> +int irq_tsf = -1; +#endif /** * enum hdd_tsf_op_result - result of tsf operation * @@ -207,7 +210,6 @@ static enum hdd_tsf_op_result hdd_indicate_tsf_internal( { int ret; hdd_context_t *hddctx; - if (adapter == NULL || buf == NULL) { hddLog(VOS_TRACE_LEVEL_ERROR, FL("invalid pointer")); @@ -280,13 +282,21 @@ static enum hdd_tsf_op_result hdd_indicate_tsf_internal( * to distinguish 32-bit overflow case, this inverval should: * equal or less than (1/2 * OVERFLOW_INDICATOR32 us) */ +#if defined(CONFIG_NON_QC_PLATFORM) +#define WLAN_HDD_CAPTURE_TSF_INTERVAL_SEC 2 +#else #define WLAN_HDD_CAPTURE_TSF_INTERVAL_SEC 10 +#endif #define WLAN_HDD_CAPTURE_TSF_INIT_INTERVAL_MS 100 #define OVERFLOW_INDICATOR32 (((int64_t)0x1) << 32) #define MAX_UINT64 ((uint64_t)0xffffffffffffffff) #define MASK_UINT32 0xffffffff #define CAP_TSF_TIMER_FIX_SEC 1 +#if defined(CONFIG_NON_QC_PLATFORM) +#define WLAN_HDD_CAPTURE_TSF_RESYNC_INTERVAL 1 +#else #define WLAN_HDD_CAPTURE_TSF_RESYNC_INTERVAL 9 +#endif /** * TS_STATUS - timestamp status @@ -345,12 +355,12 @@ enum hdd_tsf_op_result __hdd_stop_tsf_sync(hdd_adapter_t *adapter) static inline void hdd_reset_timestamps(hdd_adapter_t *adapter) { - spin_lock_bh(&adapter->host_target_sync_lock); + adf_os_spin_lock_bh(&adapter->host_target_sync_lock); adapter->cur_host_time = 0; adapter->cur_target_time = 0; adapter->last_host_time = 0; adapter->last_target_time = 0; - spin_unlock_bh(&adapter->host_target_sync_lock); + adf_os_spin_unlock_bh(&adapter->host_target_sync_lock); } /** @@ -414,9 +424,13 @@ enum hdd_ts_status hdd_check_timestamp_status( /* the deviation should be smaller than a threshold */ if (delta_ns > MAX_ALLOWED_DEVIATION_NS) { hddLog(VOS_TRACE_LEVEL_ERROR, - FL("Invalid timestamps - delta: %llu ns"), delta_ns); + FL("Invalid timestamps - delta: %llu ns"), delta_ns); return HDD_TS_STATUS_INVALID; + } else { + hddLog(VOS_TRACE_LEVEL_DEBUG, + FL("valid timestamps - delta: %llu ns"), delta_ns); } + return HDD_TS_STATUS_READY; } @@ -441,7 +455,7 @@ static void hdd_update_timestamp(hdd_adapter_t *adapter, return; } - spin_lock_bh(&adapter->host_target_sync_lock); + adf_os_spin_lock_bh(&adapter->host_target_sync_lock); if (target_time > 0) adapter->cur_target_time = target_time; @@ -494,7 +508,7 @@ static void hdd_update_timestamp(hdd_adapter_t *adapter, interval = 0; break; } - spin_unlock_bh(&adapter->host_target_sync_lock); + adf_os_spin_unlock_bh(&adapter->host_target_sync_lock); if (interval > 0) vos_timer_start(&adapter->host_target_sync_timer, interval); @@ -570,7 +584,7 @@ static inline int32_t hdd_get_hosttime_from_targettime( * (the tstamp-pair won't be changed) */ if (in_cap_state) - spin_lock_bh(&adapter->host_target_sync_lock); + adf_os_spin_lock_bh(&adapter->host_target_sync_lock); /* at present, target_time is only 32bit in fact */ delta32_target = (int64_t)((target_time & MASK_UINT32) - @@ -593,7 +607,7 @@ static inline int32_t hdd_get_hosttime_from_targettime( host_time); if (in_cap_state) - spin_unlock_bh(&adapter->host_target_sync_lock); + adf_os_spin_unlock_bh(&adapter->host_target_sync_lock); return ret; } @@ -610,7 +624,7 @@ static inline int32_t hdd_get_targettime_from_hosttime( in_cap_state = hdd_tsf_is_in_cap(adapter); if (in_cap_state) - spin_lock_bh(&adapter->host_target_sync_lock); + adf_os_spin_lock_bh(&adapter->host_target_sync_lock); if (host_time < adapter->last_host_time) ret = hdd_uint64_minus(adapter->last_target_time, @@ -626,7 +640,7 @@ static inline int32_t hdd_get_targettime_from_hosttime( target_time); if (in_cap_state) - spin_unlock_bh(&adapter->host_target_sync_lock); + adf_os_spin_unlock_bh(&adapter->host_target_sync_lock); return ret; } @@ -641,10 +655,12 @@ static ssize_t __hdd_wlan_tsf_show(struct device *dev, struct device_attribute *attr, char *buf) { hdd_station_ctx_t *hdd_sta_ctx; + hdd_ap_ctx_t *hdd_ap_ctx; hdd_adapter_t *adapter; hdd_context_t *hdd_ctx; ssize_t size; uint64_t host_time, target_time; + uint8_t *bssid; struct net_device *net_dev = container_of(dev, struct net_device, dev); @@ -656,22 +672,32 @@ static ssize_t __hdd_wlan_tsf_show(struct device *dev, return scnprintf(buf, PAGE_SIZE, "TSF sync is not initialized\n"); - hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); - if (eConnectionState_Associated != hdd_sta_ctx->conn_info.connState) - return scnprintf(buf, PAGE_SIZE, "NOT connected\n"); - hdd_ctx = WLAN_HDD_GET_CTX(adapter); if (!hdd_ctx) return scnprintf(buf, PAGE_SIZE, "Invalid HDD context\n"); + if (adapter->device_mode == WLAN_HDD_INFRA_STATION || + adapter->device_mode == WLAN_HDD_P2P_CLIENT) { + hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); + if (eConnectionState_Associated != + hdd_sta_ctx->conn_info.connState) + return scnprintf(buf, PAGE_SIZE, "NOT connected\n"); + bssid = hdd_sta_ctx->conn_info.bssId; + } else if (adapter->device_mode == WLAN_HDD_SOFTAP || + adapter->device_mode == WLAN_HDD_P2P_GO) { + hdd_ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(adapter); + bssid = hdd_ap_ctx->sapConfig.self_macaddr.bytes; + } else { + return scnprintf(buf, PAGE_SIZE, "Invalid interface\n"); + } + host_time = hdd_get_monotonic_host_time(hdd_ctx); if (hdd_get_targettime_from_hosttime(adapter, host_time, &target_time)) size = scnprintf(buf, PAGE_SIZE, "Invalid timestamp\n"); else size = scnprintf(buf, PAGE_SIZE, "%s%llu %llu %pM\n", - buf, target_time, host_time, - hdd_sta_ctx->conn_info.bssId); + buf, target_time, host_time, bssid); return size; } @@ -711,6 +737,10 @@ static irqreturn_t hdd_tsf_captured_irq_handler(int irq, void *arg) if (!arg) return IRQ_NONE; +#if defined(CONFIG_NON_QC_PLATFORM) + if (irq != irq_tsf) + return IRQ_NONE; +#endif hdd_ctx = (hdd_context_t *)arg; host_time = hdd_get_monotonic_host_time(hdd_ctx); @@ -760,10 +790,10 @@ static void hdd_capture_req_timer_expired_handler(void *arg) return; } - spin_lock_bh(&adapter->host_target_sync_lock); + adf_os_spin_lock_bh(&adapter->host_target_sync_lock); adapter->cur_host_time = 0; adapter->cur_target_time = 0; - spin_unlock_bh(&adapter->host_target_sync_lock); + adf_os_spin_unlock_bh(&adapter->host_target_sync_lock); ret = hdd_reset_tsf_gpio(adapter); if (0 != ret) @@ -812,7 +842,7 @@ static enum hdd_tsf_op_result hdd_tsf_sync_init(hdd_adapter_t *adapter) return HDD_TSF_OP_SUCC; } - spin_lock_init(&adapter->host_target_sync_lock); + adf_os_spinlock_init(&adapter->host_target_sync_lock); hdd_reset_timestamps(adapter); @@ -1046,6 +1076,99 @@ static inline int __hdd_indicate_tsf(hdd_adapter_t *adapter, return 0; } +#if defined(CONFIG_NON_QC_PLATFORM) +/** + * wlan_hdd_tsf_plus_init() - tsf plus init + * @hdd_ctx: pointer to the hdd_contex. + * + * Return: Describe the execute result of this routine + */ +static inline +enum hdd_tsf_op_result wlan_hdd_tsf_plus_init(hdd_context_t *hdd_ctx) +{ + int ret; + + if (!HDD_TSF_IS_PTP_ENABLED(hdd_ctx)) { + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("To enable TSF_PLUS, set gtsf_ptp_options in ini")); + goto fail; + } + + if (hdd_ctx->cfg_ini->tsf_gpio_pin_host == TSF_GPIO_PIN_INVALID) { + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("gpio host pin is invalid %d"), + hdd_ctx->cfg_ini->tsf_gpio_pin_host); + goto fail; + } + + ret = gpio_request(hdd_ctx->cfg_ini->tsf_gpio_pin_host, "wlan_tsf"); + if (ret) { + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("%s: fail to request irq, gpio %d\n"), __func__, + hdd_ctx->cfg_ini->tsf_gpio_pin_host); + goto fail; + } + + ret = gpio_direction_input(hdd_ctx->cfg_ini->tsf_gpio_pin_host); + if (ret) { + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("Failed to set gpio dir %d\n"), ret); + goto fail_free_gpio; + } + + irq_tsf = gpio_to_irq(hdd_ctx->cfg_ini->tsf_gpio_pin_host); + if (irq_tsf < 0) { + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("%s: fail to get irq: %d\n"), __func__, irq_tsf); + goto fail_free_gpio; + } + + ret = request_irq(irq_tsf, hdd_tsf_captured_irq_handler, + IRQF_SHARED | IRQF_TRIGGER_RISING, "wlan_tsf", + (void *)hdd_ctx); + + if (ret) { + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("Failed to register irq handler: %d"), ret); + goto fail_free_gpio; + } + + if (HDD_TSF_IS_TX_SET(hdd_ctx)) + ol_register_timestamp_callback(hdd_tx_timestamp); + + return HDD_TSF_OP_SUCC; + +fail_free_gpio: + gpio_free(hdd_ctx->cfg_ini->tsf_gpio_pin_host); +fail: + irq_tsf = -1; + return HDD_TSF_OP_FAIL; +} + +/** + * wlan_hdd_tsf_plus_deinit() - tsf plus deinit + * @hdd_ctx: pointer to the hdd_contex. + * + * Return: Describe the execute result of this routine + */ +static inline +enum hdd_tsf_op_result wlan_hdd_tsf_plus_deinit(hdd_context_t *hdd_ctx) +{ + if (!HDD_TSF_IS_PTP_ENABLED(hdd_ctx)) + return HDD_TSF_OP_SUCC; + + if (HDD_TSF_IS_TX_SET(hdd_ctx)) + ol_deregister_timestamp_callback(); + + if (irq_tsf >= 0) { + free_irq(irq_tsf, (void *)hdd_ctx); + irq_tsf = -1; + gpio_free(hdd_ctx->cfg_ini->tsf_gpio_pin_host); + } + + return HDD_TSF_OP_SUCC; +} +#else static inline enum hdd_tsf_op_result wlan_hdd_tsf_plus_init(hdd_context_t *hdd_ctx) { @@ -1056,7 +1179,6 @@ enum hdd_tsf_op_result wlan_hdd_tsf_plus_init(hdd_context_t *hdd_ctx) FL("To enable TSF_PLUS, set gtsf_ptp_options in ini")); return HDD_TSF_OP_FAIL; } - ret = cnss_common_register_tsf_captured_handler( hdd_ctx->parent_dev, hdd_tsf_captured_irq_handler, @@ -1066,7 +1188,6 @@ enum hdd_tsf_op_result wlan_hdd_tsf_plus_init(hdd_context_t *hdd_ctx) FL("Failed to register irq handler: %d"), ret); return HDD_TSF_OP_FAIL; } - if (HDD_TSF_IS_TX_SET(hdd_ctx)) ol_register_timestamp_callback(hdd_tx_timestamp); @@ -1096,6 +1217,7 @@ enum hdd_tsf_op_result wlan_hdd_tsf_plus_deinit(hdd_context_t *hdd_ctx) return HDD_TSF_OP_SUCC; } +#endif void hdd_tsf_notify_wlan_state_change(hdd_adapter_t *adapter, eConnectionState old_state, @@ -1191,6 +1313,176 @@ int hdd_indicate_tsf(hdd_adapter_t *adapter, uint32_t *buf, int len) return __hdd_indicate_tsf(adapter, buf, len); } +#ifdef WLAN_FEATURE_TSF_PTP +int wlan_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info) + +{ + hdd_adapter_t *adapter = netdev_priv(dev); + hdd_context_t *hdd_ctx; + + hdd_ctx = WLAN_HDD_GET_CTX(adapter); + if (!hdd_ctx) { + hddLog(VOS_TRACE_LEVEL_ERROR, FL("invalid hdd context")); + return -EINVAL; + } + + info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE | + SOF_TIMESTAMPING_RX_HARDWARE | + SOF_TIMESTAMPING_RAW_HARDWARE; + if (hdd_ctx->ptp_clock) + info->phc_index = ptp_clock_index(hdd_ctx->ptp_clock); + else + info->phc_index = -1; + + return 0; +} + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)) +/** + * wlan_ptp_gettime() - return fw ts info to uplayer + * @ptp: pointer to ptp_clock_info. + * @ts: pointer to timespec. + * + * Return: Describe the execute result of this routine + */ +static int wlan_ptp_gettime(struct ptp_clock_info *ptp, struct timespec *ts) +{ + uint64_t host_time, target_time = 0; + VosContextType *pVosContext = NULL; + hdd_context_t *pHddCtx = NULL; + hdd_adapter_t *adapter = NULL; + + pVosContext = vos_get_global_context(VOS_MODULE_ID_HDD, NULL); + pHddCtx = (hdd_context_t *)vos_get_context(VOS_MODULE_ID_HDD, + pVosContext); + if (!pHddCtx) { + hddLog(VOS_TRACE_LEVEL_ERROR, FL("invalid hdd context")); + return -EINVAL; + } + + adapter = hdd_get_adapter(pHddCtx, WLAN_HDD_P2P_GO); + if (!adapter) { + adapter = hdd_get_adapter(pHddCtx, WLAN_HDD_P2P_CLIENT); + if (!adapter) { + adapter = hdd_get_adapter(pHddCtx, WLAN_HDD_SOFTAP); + if (!adapter) + adapter = hdd_get_adapter(pHddCtx, + WLAN_HDD_INFRA_STATION); + } + } + + host_time = hdd_get_monotonic_host_time(pHddCtx); + if (hdd_get_targettime_from_hosttime(adapter, host_time, + &target_time)) { + hddLog(VOS_TRACE_LEVEL_ERROR, FL("get invalid target timestamp")); + return -EINVAL; + } else { + *ts = ns_to_timespec(target_time * NSEC_PER_USEC); + } + + return 0; +} + +/** + * wlan_hdd_phc_init() - phc init + * @hdd_ctx: pointer to the hdd_contex. + * + * Return: NULL + */ +static void wlan_hdd_phc_init(hdd_context_t *hdd_ctx) +{ + hdd_ctx->ptp_cinfo.gettime = wlan_ptp_gettime; + + hdd_ctx->ptp_clock = ptp_clock_register(&hdd_ctx->ptp_cinfo, + hdd_ctx->parent_dev); +} + +/** + * wlan_hdd_phc_deinit() - phc deinit + * @hdd_ctx: pointer to the hdd_contex. + * + * Return: NULL + */ +static void wlan_hdd_phc_deinit(hdd_context_t *hdd_ctx) +{ + hdd_ctx->ptp_cinfo.gettime = NULL; + + if (hdd_ctx->ptp_clock) { + ptp_clock_unregister(hdd_ctx->ptp_clock); + hdd_ctx->ptp_clock = NULL; + } +} +#else +static int wlan_ptp_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts) +{ + uint64_t host_time, target_time = 0; + VosContextType *pVosContext = NULL; + hdd_context_t *pHddCtx = NULL; + hdd_adapter_t *adapter = NULL; + + pVosContext = vos_get_global_context(VOS_MODULE_ID_HDD, NULL); + pHddCtx = (hdd_context_t *)vos_get_context(VOS_MODULE_ID_HDD, + pVosContext); + if (!pHddCtx) { + hddLog(VOS_TRACE_LEVEL_ERROR, FL("invalid hdd context")); + return -EINVAL; + } + + adapter = hdd_get_adapter(pHddCtx, WLAN_HDD_P2P_GO); + if (!adapter) { + adapter = hdd_get_adapter(pHddCtx, WLAN_HDD_P2P_CLIENT); + if (!adapter) { + adapter = hdd_get_adapter(pHddCtx, WLAN_HDD_SOFTAP); + if (!adapter) + adapter = hdd_get_adapter(pHddCtx, + WLAN_HDD_INFRA_STATION); + } + } + + host_time = hdd_get_monotonic_host_time(pHddCtx); + if (hdd_get_targettime_from_hosttime(adapter, host_time, + &target_time)) { + hddLog(VOS_TRACE_LEVEL_ERROR, FL("get invalid target timestamp")); + return -EINVAL; + } else { + *ts = ns_to_timespec64(target_time * NSEC_PER_USEC); + } + + return 0; +} + +static void wlan_hdd_phc_init(hdd_context_t *hdd_ctx) +{ + hdd_ctx->ptp_cinfo.gettime64 = wlan_ptp_gettime; + hdd_ctx->ptp_clock = ptp_clock_register(&hdd_ctx->ptp_cinfo, + hdd_ctx->parent_dev); +} + +static void wlan_hdd_phc_deinit(hdd_context_t *hdd_ctx) +{ + hdd_ctx->ptp_cinfo.gettime64 = NULL; + + if (hdd_ctx->ptp_clock) { + ptp_clock_unregister(hdd_ctx->ptp_clock); + hdd_ctx->ptp_clock = NULL; + } +} +#endif +#else +int wlan_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info) +{ + return -ENOTSUPP; +} + +static void wlan_hdd_phc_init(hdd_context_t *hdd_ctx) +{ +} + +static void wlan_hdd_phc_deinit(hdd_context_t *hdd_ctx) +{ +} +#endif + /** * hdd_get_tsf_cb() - handle tsf callback * @@ -1210,7 +1502,6 @@ static int hdd_get_tsf_cb(void *pcb_cxt, struct stsf *ptsf) hdd_adapter_t *adapter; int status; VOS_TIMER_STATE capture_req_timer_status; - if (pcb_cxt == NULL || ptsf == NULL) { hddLog(VOS_TRACE_LEVEL_ERROR, FL("HDD context is not valid")); @@ -1298,6 +1589,8 @@ void wlan_hdd_tsf_init(hdd_context_t *hdd_ctx) if (wlan_hdd_tsf_plus_init(hdd_ctx) != HDD_TSF_OP_SUCC) goto fail; + wlan_hdd_phc_init(hdd_ctx); + return; fail: @@ -1325,6 +1618,7 @@ void wlan_hdd_tsf_deinit(hdd_context_t *hdd_ctx) hal_status); } + wlan_hdd_phc_deinit(hdd_ctx); wlan_hdd_tsf_plus_deinit(hdd_ctx); vos_status = hdd_get_front_adapter(hdd_ctx, &adapternode_ptr); diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c index d803c5d9ee93..c720f42b0f9f 100644 --- a/CORE/HDD/src/wlan_hdd_tx_rx.c +++ b/CORE/HDD/src/wlan_hdd_tx_rx.c @@ -114,7 +114,7 @@ static VOS_STATUS hdd_flush_tx_queues( hdd_adapter_t *pAdapter ) while (++i != NUM_TX_QUEUES) { //Free up any packets in the Tx queue - spin_lock_bh(&pAdapter->wmm_tx_queue[i].lock); + adf_os_spin_lock_bh(&pAdapter->wmm_tx_queue[i].lock); while (true) { status = hdd_list_remove_front( &pAdapter->wmm_tx_queue[i], &anchor ); @@ -128,7 +128,7 @@ static VOS_STATUS hdd_flush_tx_queues( hdd_adapter_t *pAdapter ) } break; } - spin_unlock_bh(&pAdapter->wmm_tx_queue[i].lock); + adf_os_spin_unlock_bh(&pAdapter->wmm_tx_queue[i].lock); /* Back pressure is no longer in effect */ pAdapter->isTxSuspended[i] = VOS_FALSE; } @@ -165,11 +165,11 @@ void hdd_flush_ibss_tx_queues( hdd_adapter_t *pAdapter, v_U8_t STAId) for (i = 0; i < NUM_TX_QUEUES; i++) { - spin_lock_bh(&pAdapter->wmm_tx_queue[i].lock); + adf_os_spin_lock_bh(&pAdapter->wmm_tx_queue[i].lock); if ( list_empty( &pAdapter->wmm_tx_queue[i].anchor ) ) { - spin_unlock_bh(&pAdapter->wmm_tx_queue[i].lock); + adf_os_spin_unlock_bh(&pAdapter->wmm_tx_queue[i].lock); continue; } @@ -204,7 +204,7 @@ void hdd_flush_ibss_tx_queues( hdd_adapter_t *pAdapter, v_U8_t STAId) pAdapter->isTxSuspended[i] = VOS_FALSE; } - spin_unlock_bh(&pAdapter->wmm_tx_queue[i].lock); + adf_os_spin_unlock_bh(&pAdapter->wmm_tx_queue[i].lock); } } @@ -1726,38 +1726,38 @@ void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter, break; case WLAN_STOP_ALL_NETIF_QUEUE: - spin_lock_bh(&adapter->pause_map_lock); + adf_os_spin_lock_bh(&adapter->pause_map_lock); if (!adapter->pause_map) { netif_tx_stop_all_queues(adapter->dev); wlan_hdd_update_txq_timestamp(adapter->dev); wlan_hdd_update_unpause_time(adapter); } adapter->pause_map |= (1 << reason); - spin_unlock_bh(&adapter->pause_map_lock); + adf_os_spin_unlock_bh(&adapter->pause_map_lock); break; case WLAN_START_ALL_NETIF_QUEUE: - spin_lock_bh(&adapter->pause_map_lock); + adf_os_spin_lock_bh(&adapter->pause_map_lock); adapter->pause_map &= ~(1 << reason); if (!adapter->pause_map) { netif_tx_start_all_queues(adapter->dev); wlan_hdd_update_pause_time(adapter); } - spin_unlock_bh(&adapter->pause_map_lock); + adf_os_spin_unlock_bh(&adapter->pause_map_lock); break; case WLAN_WAKE_ALL_NETIF_QUEUE: - spin_lock_bh(&adapter->pause_map_lock); + adf_os_spin_lock_bh(&adapter->pause_map_lock); adapter->pause_map &= ~(1 << reason); if (!adapter->pause_map) { netif_tx_wake_all_queues(adapter->dev); wlan_hdd_update_pause_time(adapter); } - spin_unlock_bh(&adapter->pause_map_lock); + adf_os_spin_unlock_bh(&adapter->pause_map_lock); break; case WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER: - spin_lock_bh(&adapter->pause_map_lock); + adf_os_spin_lock_bh(&adapter->pause_map_lock); if (!adapter->pause_map) { netif_tx_stop_all_queues(adapter->dev); wlan_hdd_update_txq_timestamp(adapter->dev); @@ -1765,33 +1765,33 @@ void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter, } adapter->pause_map |= (1 << reason); netif_carrier_off(adapter->dev); - spin_unlock_bh(&adapter->pause_map_lock); + adf_os_spin_unlock_bh(&adapter->pause_map_lock); break; case WLAN_START_ALL_NETIF_QUEUE_N_CARRIER: - spin_lock_bh(&adapter->pause_map_lock); + adf_os_spin_lock_bh(&adapter->pause_map_lock); netif_carrier_on(adapter->dev); adapter->pause_map &= ~(1 << reason); if (!adapter->pause_map) { netif_tx_start_all_queues(adapter->dev); wlan_hdd_update_pause_time(adapter); } - spin_unlock_bh(&adapter->pause_map_lock); + adf_os_spin_unlock_bh(&adapter->pause_map_lock); break; case WLAN_NETIF_TX_DISABLE: - spin_lock_bh(&adapter->pause_map_lock); + adf_os_spin_lock_bh(&adapter->pause_map_lock); if (!adapter->pause_map) { netif_tx_disable(adapter->dev); wlan_hdd_update_txq_timestamp(adapter->dev); wlan_hdd_update_unpause_time(adapter); } adapter->pause_map |= (1 << reason); - spin_unlock_bh(&adapter->pause_map_lock); + adf_os_spin_unlock_bh(&adapter->pause_map_lock); break; case WLAN_NETIF_TX_DISABLE_N_CARRIER: - spin_lock_bh(&adapter->pause_map_lock); + adf_os_spin_lock_bh(&adapter->pause_map_lock); if (!adapter->pause_map) { netif_tx_disable(adapter->dev); wlan_hdd_update_txq_timestamp(adapter->dev); @@ -1799,7 +1799,7 @@ void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter, } adapter->pause_map |= (1 << reason); netif_carrier_off(adapter->dev); - spin_unlock_bh(&adapter->pause_map_lock); + adf_os_spin_unlock_bh(&adapter->pause_map_lock); break; default: diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c index 8625675680b6..d65b2bc7bd73 100644 --- a/CORE/HDD/src/wlan_hdd_wext.c +++ b/CORE/HDD/src/wlan_hdd_wext.c @@ -8746,11 +8746,11 @@ void hdd_wmm_tx_snapshot(hdd_adapter_t *pAdapter) int i = 0, j = 0; for ( i=0; i< NUM_TX_QUEUES; i++) { - spin_lock_bh(&pAdapter->wmm_tx_queue[i].lock); + adf_os_spin_lock_bh(&pAdapter->wmm_tx_queue[i].lock); hddLog(LOGE, "HDD WMM TxQueue Info For AC: %d Count: %d PrevAdress:%pK, NextAddress:%pK", i, pAdapter->wmm_tx_queue[i].count, pAdapter->wmm_tx_queue[i].anchor.prev, pAdapter->wmm_tx_queue[i].anchor.next); - spin_unlock_bh(&pAdapter->wmm_tx_queue[i].lock); + adf_os_spin_unlock_bh(&pAdapter->wmm_tx_queue[i].lock); } for(i =0; i<WLAN_MAX_STA_COUNT; i++) @@ -8760,12 +8760,12 @@ void hdd_wmm_tx_snapshot(hdd_adapter_t *pAdapter) hddLog(LOGE, "******STAIndex: %d*********", i); for ( j=0; j< NUM_TX_QUEUES; j++) { - spin_lock_bh(&pAdapter->aStaInfo[i].wmm_tx_queue[j].lock); + adf_os_spin_lock_bh(&pAdapter->aStaInfo[i].wmm_tx_queue[j].lock); hddLog(LOGE, "HDD TxQueue Info For AC: %d Count: %d PrevAdress:%pK, NextAddress:%pK", j, pAdapter->aStaInfo[i].wmm_tx_queue[j].count, pAdapter->aStaInfo[i].wmm_tx_queue[j].anchor.prev, pAdapter->aStaInfo[i].wmm_tx_queue[j].anchor.next); - spin_unlock_bh(&pAdapter->aStaInfo[i].wmm_tx_queue[j].lock); + adf_os_spin_unlock_bh(&pAdapter->aStaInfo[i].wmm_tx_queue[j].lock); } } } diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h index d95f0490da78..a023876cdf7f 100644 --- a/CORE/MAC/inc/sirApi.h +++ b/CORE/MAC/inc/sirApi.h @@ -7528,7 +7528,7 @@ struct dsrc_radio_chan_stats_ctxt { struct completion completion_evt; uint32_t config_chans_num; uint32_t config_chans_freq[DSRC_MAX_CHAN_STATS_CNT]; - spinlock_t chan_stats_lock; + adf_os_spinlock_t chan_stats_lock; uint32_t chan_stats_num; struct radio_chan_stats_info chan_stats[DSRC_MAX_CHAN_STATS_CNT]; }; diff --git a/CORE/MAC/src/include/dot11f.h b/CORE/MAC/src/include/dot11f.h index c2d5592d5f28..e6be54c2a589 100644 --- a/CORE/MAC/src/include/dot11f.h +++ b/CORE/MAC/src/include/dot11f.h @@ -32,7 +32,7 @@ * \brief Structures, function prototypes & definitions * for working with 802.11 Frames * This file was automatically generated by 'framesc' - * Fri Aug 31 18:54:55 2018 from the following file(s): + * Mon Dec 3 16:47:12 2018 from the following file(s): * * dot11f.frms * diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h index 911a9acbff03..2778b57d32fc 100644 --- a/CORE/MAC/src/include/sirParams.h +++ b/CORE/MAC/src/include/sirParams.h @@ -287,7 +287,6 @@ typedef struct sSirMbMsgP2p #define SIR_HAL_UPDATE_STARATEINFO_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 46) #define SIR_HAL_UPDATE_BEACON_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 47) -#define SIR_HAL_UPDATE_CF_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 48) #define SIR_HAL_CHNL_SWITCH_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 49) #define SIR_HAL_ADD_TS_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 50) #define SIR_HAL_DEL_TS_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 51) diff --git a/CORE/MAC/src/pe/lim/limScanResultUtils.c b/CORE/MAC/src/pe/lim/limScanResultUtils.c index 267a396b3038..f8d162f767d7 100644 --- a/CORE/MAC/src/pe/lim/limScanResultUtils.c +++ b/CORE/MAC/src/pe/lim/limScanResultUtils.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -227,17 +227,21 @@ lim_check_and_change_cc(tpAniSirGlobal mac_ptr, timer_status = VOS_TIMER_STATE_UNUSED; else { do { - timer_status = - vos_timer_getCurrentState(&(session_ptr->reg_update_pwr_timer)); - count++; - if (count > 255) { - limLog(mac_ptr, LOGE, FL("pwr timer busy!")); - return; - } - } while(timer_status != VOS_TIMER_STATE_UNUSED); + timer_status = + vos_timer_getCurrentState(&(session_ptr->reg_update_pwr_timer)); + count++; + if (count > 255) { + limLog(mac_ptr, LOGE, FL("pwr timer busy!")); + return; + } + } while (timer_status != VOS_TIMER_STATE_UNUSED); } pwr_timer_data = vos_mem_malloc(sizeof(*pwr_timer_data)); + if (pwr_timer_data == NULL) { + limLog(mac_ptr, LOGE, FL("Mem alloc failed")); + return; + } pwr_timer_data->session_ptr = session_ptr; pwr_timer_data->mac_ptr = mac_ptr; vos_timer_init(&(session_ptr->reg_update_pwr_timer), VOS_TIMER_TYPE_SW, diff --git a/CORE/MAC/src/pe/lim/limSendMessages.c b/CORE/MAC/src/pe/lim/limSendMessages.c index f2eee7bfc33e..c1dc90b20ea8 100644 --- a/CORE/MAC/src/pe/lim/limSendMessages.c +++ b/CORE/MAC/src/pe/lim/limSendMessages.c @@ -72,64 +72,6 @@ static tBeaconFilterIe beaconFilterTable[] = { }; /** - * limSendCFParams() - * - *FUNCTION: - * This function is called to send CFP Parameters to WDA, when they are changed. - * - *LOGIC: - * - *ASSUMPTIONS: - * NA - * - *NOTE: - * NA - * - * @param pMac pointer to Global Mac structure. - * @param bssIdx Bss Index of the BSS to which STA is associated. - * @param cfpCount CFP Count, if that is changed. - * @param cfpPeriod CFP Period if that is changed. - * - * @return success if message send is ok, else false. - */ -tSirRetStatus limSendCFParams(tpAniSirGlobal pMac, tANI_U8 bssIdx, tANI_U8 cfpCount, tANI_U8 cfpPeriod) -{ - tpUpdateCFParams pCFParams = NULL; - tSirRetStatus retCode = eSIR_SUCCESS; - tSirMsgQ msgQ; - - pCFParams = vos_mem_malloc(sizeof( tUpdateCFParams )); - if ( NULL == pCFParams ) - { - limLog( pMac, LOGP, - FL( "Unable to allocate memory during Update CF Params" )); - retCode = eSIR_MEM_ALLOC_FAILED; - goto returnFailure; - } - vos_mem_set( (tANI_U8 *) pCFParams, sizeof(tUpdateCFParams), 0); - pCFParams->cfpCount = cfpCount; - pCFParams->cfpPeriod = cfpPeriod; - pCFParams->bssIdx = bssIdx; - - msgQ.type = WDA_UPDATE_CF_IND; - msgQ.reserved = 0; - msgQ.bodyptr = pCFParams; - msgQ.bodyval = 0; - limLog( pMac, LOG3, - FL( "Sending WDA_UPDATE_CF_IND..." )); - MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type)); - if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ ))) - { - vos_mem_free(pCFParams); - limLog( pMac, LOGP, - FL("Posting WDA_UPDATE_CF_IND to WDA failed, reason=%X"), - retCode ); - } -returnFailure: - return retCode; -} - -/** * limSendBeaconParams() * *FUNCTION: diff --git a/CORE/MAC/src/pe/lim/limSendMessages.h b/CORE/MAC/src/pe/lim/limSendMessages.h index dda834668646..d377d717e294 100644 --- a/CORE/MAC/src/pe/lim/limSendMessages.h +++ b/CORE/MAC/src/pe/lim/limSendMessages.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2014 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -43,7 +43,6 @@ #include "limTypes.h" #include "halMsgApi.h" #include "sirParams.h" -tSirRetStatus limSendCFParams(tpAniSirGlobal pMac, tANI_U8 bssIdx, tANI_U8 cfpCount, tANI_U8 cfpPeriod); tSirRetStatus limSendBeaconParams(tpAniSirGlobal pMac, tpUpdateBeaconParams pUpdatedBcnParams, tpPESession psessionEntry ); diff --git a/CORE/MAC/src/pe/sch/schBeaconProcess.c b/CORE/MAC/src/pe/sch/schBeaconProcess.c index 10e9920adf08..0454495f180c 100644 --- a/CORE/MAC/src/pe/sch/schBeaconProcess.c +++ b/CORE/MAC/src/pe/sch/schBeaconProcess.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -423,10 +423,7 @@ static void __schBeaconProcessForSession( tpAniSirGlobal pMac, } if (pBeacon->cfPresent) - { cfgSetInt(pMac, WNI_CFG_CFP_PERIOD, pBeacon->cfParamSet.cfpPeriod); - limSendCFParams(pMac, bssIdx, pBeacon->cfParamSet.cfpCount, pBeacon->cfParamSet.cfpPeriod); - } if (pBeacon->timPresent) { diff --git a/CORE/SAP/src/sapChSelect.c b/CORE/SAP/src/sapChSelect.c index 6db07799b0f7..1711e62fcb17 100644 --- a/CORE/SAP/src/sapChSelect.c +++ b/CORE/SAP/src/sapChSelect.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -429,6 +429,7 @@ sap_process_avoid_ie(tHalHandle hal, void sapUpdateUnsafeChannelList(ptSapContext pSapCtx) { v_U16_t i, j; + uint16_t unsafe_channel_count; v_PVOID_t pvosGCtx = vos_get_global_context(VOS_MODULE_ID_SAP, NULL); struct hdd_context_s *hdd_ctxt; @@ -449,6 +450,9 @@ void sapUpdateUnsafeChannelList(ptSapContext pSapCtx) return ; } + unsafe_channel_count = VOS_MIN((uint16_t)hdd_ctxt->unsafe_channel_count, + (uint16_t)NUM_20MHZ_RF_CHANNELS); + /* Flush, default set all channel safe */ for (i = 0; i < NUM_20MHZ_RF_CHANNELS; i++) { @@ -469,7 +473,7 @@ void sapUpdateUnsafeChannelList(ptSapContext pSapCtx) } #endif - for (i = 0; i < hdd_ctxt->unsafe_channel_count; i++) + for (i = 0; i < unsafe_channel_count; i++) { for (j = 0; j < NUM_20MHZ_RF_CHANNELS; j++) { diff --git a/CORE/SERVICES/BMI/ol_fw.c b/CORE/SERVICES/BMI/ol_fw.c index d10fa978cc5e..4289a7e041ca 100644 --- a/CORE/SERVICES/BMI/ol_fw.c +++ b/CORE/SERVICES/BMI/ol_fw.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -890,10 +890,10 @@ defined(CONFIG_NON_QC_PLATFORM_PCI) && (chip_id == AR6320_REV1_1_VERSION || chip_id == AR6320_REV1_3_VERSION || chip_id == AR6320_REV2_1_VERSION)) { - + bin_off = sizeof(SIGN_HEADER_T); status = BMISignStreamStart(scn->hif_hdl, address, (u_int8_t *)fw_entry->data, - sizeof(SIGN_HEADER_T), scn); + bin_off, scn); if (status != EOK) { AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("%s: unable to start sign stream\n", @@ -902,9 +902,15 @@ defined(CONFIG_NON_QC_PLATFORM_PCI) goto end; } - bin_off = sizeof(SIGN_HEADER_T); - bin_len = sign_header->rampatch_len - - sizeof(SIGN_HEADER_T); + bin_len = sign_header->rampatch_len - bin_off; + if (bin_len <= 0 || + bin_len > fw_entry_size - bin_off) { + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, + ("%s: Invalid sign header\n", + __func__)); + status = A_ERROR; + goto end; + } } else { bin_sign = FALSE; bin_off = 0; @@ -937,7 +943,7 @@ defined(CONFIG_NON_QC_PLATFORM_PCI) bin_len = sign_header->total_len - sign_header->rampatch_len; - if (bin_len > 0) { + if (bin_len > 0 && bin_len <= fw_entry_size - bin_off) { status = BMISignStreamStart(scn->hif_hdl, 0, (u_int8_t *)fw_entry->data + bin_off, bin_len, scn); @@ -2868,6 +2874,8 @@ int ol_target_coredump(void *inst, void *memoryBlock, u_int32_t blockLength) char *fw_ram_seg_name[] = {"DRAM ", "AXI ", "REG ", "IRAM1 ", "IRAM2 "}; #endif + vos_mem_set(result, 0, sizeof(result)); + if (scn->fastfwdump_host && scn->fastfwdump_fw) { if(scn->pdev_txrx_handle) { ol_tx_queue_flush(scn->pdev_txrx_handle); diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.c b/CORE/SERVICES/COMMON/adf/adf_nbuf.c index 9b1ee4c00314..03a4b71db205 100644 --- a/CORE/SERVICES/COMMON/adf/adf_nbuf.c +++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.c @@ -26,6 +26,7 @@ */ +#include <linux/hashtable.h> #include <linux/kernel.h> #include <linux/version.h> #include <linux/skbuff.h> @@ -37,6 +38,9 @@ #include <net/ieee80211_radiotap.h> #include "adf_trace.h" #include "vos_trace.h" +#include <vos_api.h> +#include <adf_os_atomic.h> +#include <adf_os_time.h> #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC #include <net/cnss_prealloc.h> @@ -358,6 +362,485 @@ __adf_nbuf_dmamap_destroy(adf_os_device_t osdev, __adf_os_dma_map_t dmap) kfree(dmap); } +#ifdef NBUF_MAP_UNMAP_DEBUG + +/** + * DEFINE_ADF_FLEX_MEM_POOL() - define a new flex mem pool with one segment + * @name: the name of the pool variable + * @size_of_item: size of the items the pool will allocate + * @rm_limit: min number of segments to keep during reduction + */ +#define DEFINE_ADF_FLEX_MEM_POOL(name, size_of_item, rm_limit) \ + struct adf_flex_mem_pool name; \ + uint8_t __ ## name ## _head_bytes[ADF_FM_BITMAP_BITS * (size_of_item)];\ + struct adf_flex_mem_segment __ ## name ## _head = { \ + .node = VOS_LIST_NODE_INIT_SINGLE( \ + VOS_LIST_ANCHOR(name.seg_list)), \ + .bytes = __ ## name ## _head_bytes, \ + }; \ + struct adf_flex_mem_pool name = { \ + .reduction_limit = (rm_limit), \ + .item_size = (size_of_item), \ + } + +/** + * adf_flex_mem_pool - a pool of memory segments + * @seg_list: the list containing the memory segments + * @lock: spinlock for protecting internal data structures + * @reduction_limit: the minimum number of segments to keep during reduction + * @item_size: the size of the items the pool will allocate + */ +struct adf_flex_mem_pool { + vos_list_t seg_list; + adf_os_spinlock_t lock; + uint16_t reduction_limit; + uint16_t item_size; +}; + +/** + * adf_flex_mem_segment - a memory pool segment + * @node: the list node for membership in the memory pool + * @dynamic: true if this segment was dynamically allocated + * @used_bitmap: bitmap for tracking which items in the segment are in use + * @bytes: raw memory for allocating items from + */ +struct adf_flex_mem_segment { + vos_list_node_t node; + bool dynamic; + uint32_t used_bitmap; + uint8_t *bytes; +}; +#define ADF_NBUF_HISTORY_SIZE 4096 + +static adf_os_atomic_t adf_nbuf_history_index; +static struct adf_nbuf_event adf_nbuf_history[ADF_NBUF_HISTORY_SIZE]; + +static int32_t adf_nbuf_circular_index_next(adf_os_atomic_t *index, int size) +{ + int32_t next = adf_os_atomic_inc_return(index); + + if (next == size) + adf_os_atomic_sub(size, index); + + return next % size; +} + +void +adf_nbuf_history_add(adf_nbuf_t nbuf, const char *file, uint32_t line, + enum adf_nbuf_event_type type) +{ + int32_t idx = adf_nbuf_circular_index_next(&adf_nbuf_history_index, + ADF_NBUF_HISTORY_SIZE); + struct adf_nbuf_event *event = &adf_nbuf_history[idx]; + + event->nbuf = nbuf; + strlcpy(event->file, kbasename(file), ADF_MEM_FILE_NAME_SIZE); + event->line = line; + event->type = type; + event->timestamp = adf_os_ticks(); +} + +DEFINE_ADF_FLEX_MEM_POOL(adf_nbuf_map_pool, + sizeof(struct adf_nbuf_map_metadata), 0); +#define ADF_NBUF_MAP_HT_BITS 10 /* 1024 buckets */ +static DECLARE_HASHTABLE(adf_nbuf_map_ht, ADF_NBUF_MAP_HT_BITS); +static adf_os_spinlock_t adf_nbuf_map_lock; + +static void __adf_flex_mem_release(struct adf_flex_mem_pool *pool) +{ + struct adf_flex_mem_segment *seg; + struct adf_flex_mem_segment *next; + + list_for_each_entry_safe(seg, next, &(pool->seg_list.anchor), node) { + if (!seg->dynamic) + continue; + + if (seg->used_bitmap != 0) + continue; + + vos_list_remove_node_no_mutex(&pool->seg_list, &seg->node); + vos_mem_free(seg); + } +} + +void adf_flex_mem_release(struct adf_flex_mem_pool *pool) +{ + VOS_BUG(pool); + if (!pool) + return; + + adf_os_spin_lock_bh(&pool->lock); + __adf_flex_mem_release(pool); + adf_os_spin_unlock_bh(&pool->lock); +} + +void adf_flex_mem_deinit(struct adf_flex_mem_pool *pool) +{ + v_SIZE_t pSize = 0; + adf_flex_mem_release(pool); + if (vos_list_size_no_mutex(&pool->seg_list, &pSize) == + VOS_STATUS_SUCCESS) + VOS_BUG(!pSize); + else + adf_print("%s seg list get ailed",__func__); + + adf_os_spinlock_destroy(&pool->lock); +} + +static struct adf_flex_mem_segment * +adf_flex_mem_seg_alloc(struct adf_flex_mem_pool *pool) +{ + struct adf_flex_mem_segment *seg; + size_t total_size = sizeof(struct adf_flex_mem_segment) + + pool->item_size * ADF_FM_BITMAP_BITS; + + seg = vos_mem_malloc(total_size); + if (!seg) + return NULL; + + seg->dynamic = true; + seg->bytes = (uint8_t *)(seg + 1); + seg->used_bitmap = 0; + vos_list_insert_back_no_mutex(&pool->seg_list, &seg->node); + + return seg; +} + +void adf_flex_mem_init(struct adf_flex_mem_pool *pool) +{ + int i; + + adf_os_spinlock_init(&pool->lock); + vos_list_init(&pool->seg_list); + for (i = 0; i < pool->reduction_limit; i++) + adf_flex_mem_seg_alloc(pool); +} + +static void *__adf_flex_mem_alloc(struct adf_flex_mem_pool *pool) +{ + struct adf_flex_mem_segment *seg; + + list_for_each_entry(seg, &(pool->seg_list.anchor), node) { + int index; + void *ptr; + + index = adf_ffz(seg->used_bitmap); + if (index < 0) + continue; + + VOS_BUG(index < ADF_FM_BITMAP_BITS); + + seg->used_bitmap ^= (ADF_FM_BITMAP)1 << index; + ptr = &seg->bytes[index * pool->item_size]; + vos_mem_zero(ptr, pool->item_size); + + return ptr; + } + + seg = adf_flex_mem_seg_alloc(pool); + if (!seg) + return NULL; + + seg->used_bitmap = 1; + + return seg->bytes; +} + +void *adf_flex_mem_alloc(struct adf_flex_mem_pool *pool) +{ + void *ptr; + + VOS_BUG(pool); + if (!pool) + return NULL; + + adf_os_spin_lock_bh(&pool->lock); + ptr = __adf_flex_mem_alloc(pool); + adf_os_spin_unlock_bh(&pool->lock); + + return ptr; +} + +static void adf_flex_mem_seg_free(struct adf_flex_mem_pool *pool, + struct adf_flex_mem_segment *seg) +{ + v_SIZE_t pSize = 0; + if (!seg->dynamic) + return; + + if (vos_list_size_no_mutex(&pool->seg_list, &pSize) == + VOS_STATUS_SUCCESS) { + if (pSize <= pool->reduction_limit) + return; + } else { + adf_print("%s seg list size get failed", __func__); + } + + vos_list_remove_node_no_mutex(&pool->seg_list, &seg->node); + vos_mem_free(seg); +} + +static void __adf_flex_mem_free(struct adf_flex_mem_pool *pool, void *ptr) +{ + struct adf_flex_mem_segment *seg; + void *low_addr; + void *high_addr; + unsigned long index; + + list_for_each_entry(seg, &(pool->seg_list.anchor), node) { + low_addr = seg->bytes; + high_addr = low_addr + pool->item_size * ADF_FM_BITMAP_BITS; + + if (ptr < low_addr || ptr > high_addr) + continue; + + index = (ptr - low_addr) / pool->item_size; + VOS_BUG(index < ADF_FM_BITMAP_BITS); + + seg->used_bitmap ^= (ADF_FM_BITMAP)1 << index; + if (!seg->used_bitmap) + adf_flex_mem_seg_free(pool, seg); + + return; + } + + adf_print("Failed to find pointer in segment pool"); +} + +void adf_flex_mem_free(struct adf_flex_mem_pool *pool, void *ptr) +{ + VOS_BUG(pool); + if (!pool) + return; + + VOS_BUG(ptr); + if (!ptr) + return; + + adf_os_spin_lock_bh(&pool->lock); + __adf_flex_mem_free(pool, ptr); + adf_os_spin_unlock_bh(&pool->lock); +} + +static void adf_nbuf_map_tracking_init(void) +{ + adf_flex_mem_init(&adf_nbuf_map_pool); + hash_init(adf_nbuf_map_ht); + adf_os_spinlock_init(&adf_nbuf_map_lock); +} + +void adf_nbuf_map_check_for_leaks(void) +{ + struct adf_nbuf_map_metadata *meta; + int bucket; + uint32_t count = 0; + bool is_empty; + + adf_flex_mem_release(&adf_nbuf_map_pool); + adf_os_spin_lock_irqsave(&adf_nbuf_map_lock); + is_empty = hash_empty(adf_nbuf_map_ht); + adf_os_spin_unlock_irqrestore(&adf_nbuf_map_lock); + + if (is_empty) + return; + + adf_print("Nbuf map without unmap events detected!"); + adf_print("------------------------------------------------------------"); + + /* Hold the lock for the entire iteration for safe list/meta access. We + * are explicitly preferring the chance to watchdog on the print, over + * the posibility of invalid list/memory access. Since we are going to + * panic anyway, the worst case is loading up the crash dump to find out + * what was in the hash table. + */ + adf_os_spin_lock_irqsave(&adf_nbuf_map_lock); + hash_for_each(adf_nbuf_map_ht, bucket, meta, node) { + count++; + adf_print("0x%pk @ %s:%u", + meta->nbuf, meta->file, meta->line); + } + adf_os_spin_unlock_irqrestore(&adf_nbuf_map_lock); + + adf_print("%u fatal nbuf map without unmap events detected!", count); +} + +static void adf_nbuf_map_tracking_deinit(void) +{ + adf_nbuf_map_check_for_leaks(); + adf_os_spinlock_destroy(&adf_nbuf_map_lock); + adf_flex_mem_deinit(&adf_nbuf_map_pool); +} + +static struct adf_nbuf_map_metadata *adf_nbuf_meta_get(adf_nbuf_t nbuf) +{ + struct adf_nbuf_map_metadata *meta; + + hash_for_each_possible(adf_nbuf_map_ht, meta, node, (size_t)nbuf) { + if (meta->nbuf == nbuf) + return meta; + } + + return NULL; +} + +static a_status_t +adf_nbuf_track_map(adf_nbuf_t nbuf, const char *file, uint32_t line) +{ + struct adf_nbuf_map_metadata *meta; + + VOS_BUG(nbuf); + if (!nbuf) { + adf_print("Cannot map null nbuf"); + return A_STATUS_EINVAL; + } + + adf_os_spin_lock_irqsave(&adf_nbuf_map_lock); + meta = adf_nbuf_meta_get(nbuf); + adf_os_spin_unlock_irqrestore(&adf_nbuf_map_lock); + if (meta) { + adf_print( + "Double nbuf map detected @ %s:%u; last map from %s:%u", + kbasename(file), line, meta->file, meta->line); + VOS_BUG(0); + return A_STATUS_EINVAL; + } + + meta = adf_flex_mem_alloc(&adf_nbuf_map_pool); + if (!meta) { + adf_print("Failed to allocate nbuf map tracking metadata"); + return A_STATUS_ENOMEM; + } + + meta->nbuf = nbuf; + strlcpy(meta->file, kbasename(file), ADF_MEM_FILE_NAME_SIZE); + meta->line = line; + + adf_os_spin_lock_irqsave(&adf_nbuf_map_lock); + hash_add(adf_nbuf_map_ht, &meta->node, (size_t)nbuf); + adf_os_spin_unlock_irqrestore(&adf_nbuf_map_lock); + + adf_nbuf_history_add(nbuf, file, line, ADF_NBUF_MAP); + + return A_STATUS_OK; +} + +static void +adf_nbuf_untrack_map(adf_nbuf_t nbuf, const char *file, uint32_t line) +{ + struct adf_nbuf_map_metadata *meta; + + VOS_BUG(nbuf); + if (!nbuf) { + adf_print("Cannot unmap null nbuf"); + return; + } + + adf_os_spin_lock_irqsave(&adf_nbuf_map_lock); + meta = adf_nbuf_meta_get(nbuf); + + if (!meta) { + adf_print( + "Double nbuf unmap or unmap without map detected @ %s:%u", + kbasename(file), line); + adf_os_spin_unlock_irqrestore(&adf_nbuf_map_lock); + VOS_BUG(0); + return; + } + + hash_del(&meta->node); + adf_os_spin_unlock_irqrestore(&adf_nbuf_map_lock); + + adf_flex_mem_free(&adf_nbuf_map_pool, meta); + + adf_nbuf_history_add(nbuf, file, line, ADF_NBUF_UNMAP); +} + +a_status_t adf_nbuf_map_debug(adf_os_device_t osdev, + adf_nbuf_t buf, + adf_os_dma_dir_t dir, + const char *file, + uint32_t line) +{ + a_status_t status; + + status = adf_nbuf_track_map(buf, file, line); + if (status) + return status; + + status = __adf_nbuf_map(osdev, buf, dir); + if (status) + adf_nbuf_untrack_map(buf, file, line); + + return status; +} + +void adf_nbuf_unmap_debug(adf_os_device_t osdev, + adf_nbuf_t buf, + adf_os_dma_dir_t dir, + const char *file, + uint32_t line) +{ + adf_nbuf_untrack_map(buf, file, line); + __adf_nbuf_unmap_single(osdev, buf, dir); +} + +a_status_t adf_nbuf_map_single_debug(adf_os_device_t osdev, + adf_nbuf_t buf, + adf_os_dma_dir_t dir, + const char *file, + uint32_t line) +{ + a_status_t status; + + status = adf_nbuf_track_map(buf, file, line); + if (status) + return status; + + status = __adf_nbuf_map_single(osdev, buf, dir); + if (status) + adf_nbuf_untrack_map(buf, file, line); + + return status; +} + +void adf_nbuf_unmap_single_debug(adf_os_device_t osdev, + adf_nbuf_t buf, + adf_os_dma_dir_t dir, + const char *file, + uint32_t line) +{ + adf_nbuf_untrack_map(buf, file, line); + __adf_nbuf_unmap_single(osdev, buf, dir); +} + +static void adf_nbuf_panic_on_free_if_mapped(adf_nbuf_t nbuf, uint8_t *file, + uint32_t line) +{ + struct adf_nbuf_map_metadata *meta; + + adf_os_spin_lock_irqsave(&adf_nbuf_map_lock); + meta = adf_nbuf_meta_get(nbuf); + if (meta) + adf_print( + "Nbuf freed @ %s:%u while mapped from %s:%u", + kbasename(file), line, meta->file, meta->line); + adf_os_spin_unlock_irqrestore(&adf_nbuf_map_lock); +} +#else +static inline void adf_nbuf_map_tracking_init(void) +{ +} + +static inline void adf_nbuf_map_tracking_deinit(void) +{ +} + +static inline void adf_nbuf_panic_on_free_if_mapped(adf_nbuf_t nbuf, + uint8_t *file, + uint32_t line) +{ +} +#endif /** * @brief get the dma map of the nbuf * @@ -1222,13 +1705,13 @@ struct adf_nbuf_track_t { size_t size; }; -static spinlock_t g_adf_net_buf_track_lock[ADF_NET_BUF_TRACK_MAX_SIZE]; +static adf_os_spinlock_t g_adf_net_buf_track_lock[ADF_NET_BUF_TRACK_MAX_SIZE]; typedef struct adf_nbuf_track_t ADF_NBUF_TRACK; static ADF_NBUF_TRACK *gp_adf_net_buf_track_tbl[ADF_NET_BUF_TRACK_MAX_SIZE]; static struct kmem_cache *nbuf_tracking_cache; static ADF_NBUF_TRACK *adf_net_buf_track_free_list; -static spinlock_t adf_net_buf_track_free_list_lock; +static adf_os_spinlock_t adf_net_buf_track_free_list_lock; static uint32_t adf_net_buf_track_free_list_count; static uint32_t adf_net_buf_track_used_list_count; static uint32_t adf_net_buf_track_max_used; @@ -1282,10 +1765,9 @@ static inline void adf_update_max_free(void) static ADF_NBUF_TRACK *adf_nbuf_track_alloc(void) { int flags = GFP_KERNEL; - unsigned long irq_flag; ADF_NBUF_TRACK *new_node = NULL; - spin_lock_irqsave(&adf_net_buf_track_free_list_lock, irq_flag); + adf_os_spin_lock_irqsave(&adf_net_buf_track_free_list_lock); adf_net_buf_track_used_list_count++; if (adf_net_buf_track_free_list != NULL) { new_node = adf_net_buf_track_free_list; @@ -1294,7 +1776,7 @@ static ADF_NBUF_TRACK *adf_nbuf_track_alloc(void) adf_net_buf_track_free_list_count--; } adf_update_max_used(); - spin_unlock_irqrestore(&adf_net_buf_track_free_list_lock, irq_flag); + adf_os_spin_unlock_irqrestore(&adf_net_buf_track_free_list_lock); if (new_node != NULL) return new_node; @@ -1320,8 +1802,6 @@ static ADF_NBUF_TRACK *adf_nbuf_track_alloc(void) */ static void adf_nbuf_track_free(ADF_NBUF_TRACK *node) { - unsigned long irq_flag; - if (!node) return; @@ -1333,7 +1813,7 @@ static void adf_nbuf_track_free(ADF_NBUF_TRACK *node) * traffic occurs. */ - spin_lock_irqsave(&adf_net_buf_track_free_list_lock, irq_flag); + adf_os_spin_lock_irqsave(&adf_net_buf_track_free_list_lock); adf_net_buf_track_used_list_count--; if (adf_net_buf_track_free_list_count > FREEQ_POOLSIZE && @@ -1346,7 +1826,7 @@ static void adf_nbuf_track_free(ADF_NBUF_TRACK *node) adf_net_buf_track_free_list_count++; } adf_update_max_free(); - spin_unlock_irqrestore(&adf_net_buf_track_free_list_lock, irq_flag); + adf_os_spin_unlock_irqrestore(&adf_net_buf_track_free_list_lock); } /** @@ -1392,7 +1872,7 @@ static void adf_nbuf_track_prefill(void) */ static void adf_nbuf_track_memory_manager_create(void) { - spin_lock_init(&adf_net_buf_track_free_list_lock); + adf_os_spinlock_init(&adf_net_buf_track_free_list_lock); nbuf_tracking_cache = kmem_cache_create("adf_nbuf_tracking_cache", sizeof(ADF_NBUF_TRACK), 0, 0, NULL); @@ -1412,7 +1892,6 @@ static void adf_nbuf_track_memory_manager_create(void) static void adf_nbuf_track_memory_manager_destroy(void) { ADF_NBUF_TRACK *node, *tmp; - unsigned long irq_flag; adf_print("%s: %d residual freelist size", __func__, adf_net_buf_track_free_list_count); @@ -1426,7 +1905,7 @@ static void adf_nbuf_track_memory_manager_destroy(void) adf_print("%s: %d max buffers allocated observed", __func__, adf_net_buf_track_max_allocated); - spin_lock_irqsave(&adf_net_buf_track_free_list_lock, irq_flag); + adf_os_spin_lock_irqsave(&adf_net_buf_track_free_list_lock); node = adf_net_buf_track_free_list; while (node) { @@ -1451,10 +1930,21 @@ static void adf_nbuf_track_memory_manager_destroy(void) adf_net_buf_track_max_free = 0; adf_net_buf_track_max_allocated = 0; - spin_unlock_irqrestore(&adf_net_buf_track_free_list_lock, irq_flag); + adf_os_spin_unlock_irqrestore(&adf_net_buf_track_free_list_lock); kmem_cache_destroy(nbuf_tracking_cache); } +void adf_nbuf_free_debug(adf_nbuf_t net_buf, uint8_t *file, uint32_t line) +{ + /* Remove SKB from internal ADF tracking table */ + adf_nbuf_panic_on_free_if_mapped(net_buf, file, line); + if (adf_os_likely(net_buf)) + adf_net_buf_debug_delete_node(net_buf); + + adf_nbuf_history_add(net_buf, file, line, ADF_NBUF_FREE); + __adf_nbuf_free(net_buf); +} + /** * adf_net_buf_debug_init() - initialize network buffer debug functionality * @@ -1470,11 +1960,14 @@ void adf_net_buf_debug_init(void) { uint32_t i; + adf_os_atomic_set(&adf_nbuf_history_index, -1); + + adf_nbuf_map_tracking_init(); adf_nbuf_track_memory_manager_create(); for (i = 0; i < ADF_NET_BUF_TRACK_MAX_SIZE; i++) { gp_adf_net_buf_track_tbl[i] = NULL; - spin_lock_init(&g_adf_net_buf_track_lock[i]); + adf_os_spinlock_init(&g_adf_net_buf_track_lock[i]); } return; @@ -1492,12 +1985,11 @@ void adf_net_buf_debug_init(void) void adf_net_buf_debug_exit(void) { uint32_t i; - unsigned long irq_flag; ADF_NBUF_TRACK *p_node; ADF_NBUF_TRACK *p_prev; for (i = 0; i < ADF_NET_BUF_TRACK_MAX_SIZE; i++) { - spin_lock_irqsave(&g_adf_net_buf_track_lock[i], irq_flag); + adf_os_spin_lock_irqsave(&g_adf_net_buf_track_lock[i]); p_node = gp_adf_net_buf_track_tbl[i]; while (p_node) { p_prev = p_node; @@ -1507,10 +1999,11 @@ void adf_net_buf_debug_exit(void) p_prev->size); adf_nbuf_track_free(p_prev); } - spin_unlock_irqrestore(&g_adf_net_buf_track_lock[i], irq_flag); + adf_os_spin_unlock_irqrestore(&g_adf_net_buf_track_lock[i]); } adf_nbuf_track_memory_manager_destroy(); + adf_nbuf_map_tracking_deinit(); return; } @@ -1563,14 +2056,13 @@ void adf_net_buf_debug_add_node(adf_nbuf_t net_buf, size_t size, uint8_t *file_name, uint32_t line_num) { uint32_t i; - unsigned long irq_flag; ADF_NBUF_TRACK *p_node; ADF_NBUF_TRACK *new_node; new_node = adf_nbuf_track_alloc(); i = adf_net_buf_debug_hash(net_buf); - spin_lock_irqsave(&g_adf_net_buf_track_lock[i], irq_flag); + adf_os_spin_lock_irqsave(&g_adf_net_buf_track_lock[i]); p_node = adf_net_buf_debug_look_up(net_buf); @@ -1599,7 +2091,7 @@ void adf_net_buf_debug_add_node(adf_nbuf_t net_buf, size_t size, } done: - spin_unlock_irqrestore(&g_adf_net_buf_track_lock[i], irq_flag); + adf_os_spin_unlock_irqrestore(&g_adf_net_buf_track_lock[i]); return; } @@ -1615,11 +2107,10 @@ void adf_net_buf_debug_delete_node(adf_nbuf_t net_buf) bool found = false; ADF_NBUF_TRACK *p_head; ADF_NBUF_TRACK *p_node; - unsigned long irq_flag; ADF_NBUF_TRACK *p_prev; i = adf_net_buf_debug_hash(net_buf); - spin_lock_irqsave(&g_adf_net_buf_track_lock[i], irq_flag); + adf_os_spin_lock_irqsave(&g_adf_net_buf_track_lock[i]); p_head = gp_adf_net_buf_track_tbl[i]; @@ -1647,7 +2138,7 @@ void adf_net_buf_debug_delete_node(adf_nbuf_t net_buf) } done: - spin_unlock_irqrestore(&g_adf_net_buf_track_lock[i], irq_flag); + adf_os_spin_unlock_irqrestore(&g_adf_net_buf_track_lock[i]); if (!found) { adf_print("Unallocated buffer ! Double free of net_buf %pK ?", diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h index 0bf5a009f33a..53e349c782a7 100644 --- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h +++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h @@ -387,6 +387,78 @@ adf_nbuf_dmamap_set_cb(adf_os_dma_map_t dmap, adf_os_dma_map_cb_t cb, __adf_nbuf_dmamap_set_cb(dmap, cb, arg); } +#ifdef NBUF_MAP_UNMAP_DEBUG +#define ADF_MEM_FILE_NAME_SIZE 48 +enum adf_nbuf_event_type { + ADF_NBUF_ALLOC, + ADF_NBUF_ALLOC_FAILURE, + ADF_NBUF_FREE, + ADF_NBUF_MAP, + ADF_NBUF_UNMAP, +}; + +struct adf_nbuf_event { + adf_nbuf_t nbuf; + char file[ADF_MEM_FILE_NAME_SIZE]; + uint32_t line; + enum adf_nbuf_event_type type; + uint64_t timestamp; +}; + +struct adf_nbuf_map_metadata { + struct hlist_node node; + adf_nbuf_t nbuf; + char file[ADF_MEM_FILE_NAME_SIZE]; + uint32_t line; +}; + +#define ADF_FM_BITMAP uint32_t +#define ADF_FM_BITMAP_BITS (sizeof(ADF_FM_BITMAP) * 8) + +#define adf_ffz(mask) (~(mask) == 0 ? -1 : ffz(mask)) +void +adf_nbuf_history_add(adf_nbuf_t nbuf, const char *file, uint32_t line, + enum adf_nbuf_event_type type); + +void adf_nbuf_map_check_for_leaks(void); + +a_status_t adf_nbuf_map_debug(adf_os_device_t osdev, + adf_nbuf_t buf, + adf_os_dma_dir_t dir, + const char *file, + uint32_t line); + +#define adf_nbuf_map(osdev, buf, dir) \ + adf_nbuf_map_debug(osdev, buf, dir, __FILE__, __LINE__) +void adf_nbuf_unmap_debug(adf_os_device_t osdev, + adf_nbuf_t buf, + adf_os_dma_dir_t dir, + const char *file, + uint32_t line); + +#define adf_nbuf_unmap(osdev, buf, dir) \ + adf_nbuf_unmap_debug(osdev, buf, dir, __FILE__, __LINE__) + +a_status_t adf_nbuf_map_single_debug(adf_os_device_t osdev, + adf_nbuf_t buf, + adf_os_dma_dir_t dir, + const char *file, + uint32_t line); + +#define adf_nbuf_map_single(osdev, buf, dir) \ + adf_nbuf_map_single_debug(osdev, buf, dir, __FILE__, __LINE__) + +void adf_nbuf_unmap_single_debug(adf_os_device_t osdev, + adf_nbuf_t buf, + adf_os_dma_dir_t dir, + const char *file, + uint32_t line); + +#define adf_nbuf_unmap_single(osdev, buf, dir) \ + adf_nbuf_unmap_single_debug(osdev, buf, dir, __FILE__, __LINE__) + +#else +static inline void adf_nbuf_map_check_for_leaks(void) {} /** * @brief Map a buffer to local bus address space * @@ -447,6 +519,7 @@ adf_nbuf_unmap_single( __adf_nbuf_unmap_single(osdev, buf, dir); #endif } +#endif static inline int adf_nbuf_get_num_frags(adf_nbuf_t buf) @@ -530,21 +603,19 @@ adf_nbuf_alloc_debug(adf_os_device_t osdev, adf_os_size_t size, int reserve, net_buf = __adf_nbuf_alloc(osdev, size, reserve, align, prio); /* Store SKB in internal ADF tracking table */ - if (adf_os_likely(net_buf)) + if (adf_os_likely(net_buf)) { adf_net_buf_debug_add_node(net_buf, size, file_name, line_num); - + adf_nbuf_history_add(net_buf, file_name, line_num, ADF_NBUF_ALLOC); + } else { + adf_nbuf_history_add(net_buf, file_name, line_num, ADF_NBUF_ALLOC_FAILURE); + } return net_buf; } -static inline void adf_nbuf_free(adf_nbuf_t net_buf) -{ - /* Remove SKB from internal ADF tracking table */ - if (adf_os_likely(net_buf)) - adf_net_buf_debug_delete_node(net_buf); - - __adf_nbuf_free(net_buf); -} +void adf_nbuf_free_debug(adf_nbuf_t nbuf, uint8_t *file, uint32_t line); +#define adf_nbuf_free(d) \ + adf_nbuf_free_debug(d, __FILE__, __LINE__) #else static inline void adf_net_buf_debug_release_skb(adf_nbuf_t net_buf) diff --git a/CORE/SERVICES/COMMON/adf/adf_os_lock.h b/CORE/SERVICES/COMMON/adf/adf_os_lock.h index 545e62cb3379..819285bd548a 100644 --- a/CORE/SERVICES/COMMON/adf/adf_os_lock.h +++ b/CORE/SERVICES/COMMON/adf/adf_os_lock.h @@ -126,6 +126,14 @@ adf_os_spinlock_destroy(adf_os_spinlock_t *lock) __adf_os_spinlock_destroy(lock); } +#define adf_os_raw_spin_lock(_lock) __adf_os_raw_spin_lock(_lock) +#define adf_os_raw_spin_unlock(_lock) __adf_os_raw_spin_unlock(_lock) +#define adf_os_raw_spin_lock_bh(_lock) __adf_os_raw_spin_lock_bh(_lock) +#define adf_os_raw_spin_unlock_bh(_lock) __adf_os_raw_spin_unlock_bh(_lock) +#define adf_os_raw_spin_lock_irqsave( _lock, flag) __adf_os_raw_spin_lock_irqsave(_lock, flag) +#define adf_os_raw_spin_unlock_irqrestore( _lock, flag) \ + __adf_os_raw_spin_unlock_irqrestore(_lock, flag) + #define adf_os_spin_lock( _lock) __adf_os_spin_lock(_lock) #define adf_os_spin_unlock( _lock ) __adf_os_spin_unlock(_lock) #define adf_os_spin_lock_irqsave( _lock) __adf_os_spin_lock_irqsave(_lock) diff --git a/CORE/SERVICES/COMMON/adf/adf_trace.c b/CORE/SERVICES/COMMON/adf/adf_trace.c index 4a7b30aea52c..fbe623564aee 100644 --- a/CORE/SERVICES/COMMON/adf/adf_trace.c +++ b/CORE/SERVICES/COMMON/adf/adf_trace.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -46,7 +46,7 @@ #include "vos_timer.h" /* Static and Global variables */ -static spinlock_t l_dp_trace_lock; +static adf_os_spinlock_t l_dp_trace_lock; static struct adf_dp_trace_record_s g_adf_dp_trace_tbl[MAX_ADF_DP_TRACE_RECORDS]; @@ -72,7 +72,7 @@ void adf_dp_trace_init(void) { uint8_t i; - spin_lock_init(&l_dp_trace_lock); + adf_os_spinlock_init(&l_dp_trace_lock); g_adf_dp_trace_data.head = INVALID_ADF_DP_TRACE_ADDR; g_adf_dp_trace_data.tail = INVALID_ADF_DP_TRACE_ADDR; g_adf_dp_trace_data.num = 0; @@ -114,11 +114,11 @@ void adf_dp_trace_init(void) void adf_dp_trace_set_value(uint8_t proto_bitmap, uint8_t no_of_record, uint8_t verbosity) { - spin_lock_bh(&l_dp_trace_lock); + adf_os_spin_lock_bh(&l_dp_trace_lock); g_adf_dp_trace_data.proto_bitmap = proto_bitmap; g_adf_dp_trace_data.no_of_record = no_of_record; g_adf_dp_trace_data.verbosity = verbosity; - spin_unlock_bh(&l_dp_trace_lock); + adf_os_spin_unlock_bh(&l_dp_trace_lock); } /** @@ -173,7 +173,7 @@ void adf_dp_trace_set_track(adf_nbuf_t nbuf, enum adf_proto_dir dir) { uint32_t count = 0; - spin_lock_bh(&l_dp_trace_lock); + adf_os_spin_lock_bh(&l_dp_trace_lock); if (ADF_TX == dir) count = ++g_adf_dp_trace_data.tx_count; else if (ADF_RX == dir) @@ -186,7 +186,7 @@ void adf_dp_trace_set_track(adf_nbuf_t nbuf, enum adf_proto_dir dir) else if (ADF_RX == dir) ADF_NBUF_CB_RX_DP_TRACE(nbuf) = 1; } - spin_unlock_bh(&l_dp_trace_lock); + adf_os_spin_unlock_bh(&l_dp_trace_lock); } #define DPTRACE_PRINT(args...) \ @@ -415,7 +415,7 @@ void adf_dp_add_record(enum ADF_DP_TRACE_ID code, struct adf_dp_trace_record_s *rec = NULL; int index; - spin_lock_bh(&l_dp_trace_lock); + adf_os_spin_lock_bh(&l_dp_trace_lock); g_adf_dp_trace_data.num++; @@ -456,7 +456,7 @@ void adf_dp_add_record(enum ADF_DP_TRACE_ID code, vos_get_time_of_the_day_in_hr_min_sec_usec(rec->time, sizeof(rec->time)); rec->pid = (in_interrupt() ? 0 : current->pid); - spin_unlock_bh(&l_dp_trace_lock); + adf_os_spin_unlock_bh(&l_dp_trace_lock); if ((g_adf_dp_trace_data.live_mode || print == true) && (rec->code < ADF_DP_TRACE_MAX)) @@ -874,7 +874,7 @@ void adf_dp_trace_dump_all(uint32_t count) /* aquire the lock so that only one thread at a time can read * the ring buffer */ - spin_lock_bh(&l_dp_trace_lock); + adf_os_spin_lock_bh(&l_dp_trace_lock); if (g_adf_dp_trace_data.head != INVALID_ADF_DP_TRACE_ADDR) { i = g_adf_dp_trace_data.head; @@ -891,7 +891,7 @@ void adf_dp_trace_dump_all(uint32_t count) } pRecord = g_adf_dp_trace_tbl[i]; - spin_unlock_bh(&l_dp_trace_lock); + adf_os_spin_unlock_bh(&l_dp_trace_lock); for (;; ) { adf_dp_trace_cb_table[pRecord. code] (&pRecord, (uint16_t)i); @@ -899,14 +899,14 @@ void adf_dp_trace_dump_all(uint32_t count) break; i += 1; - spin_lock_bh(&l_dp_trace_lock); + adf_os_spin_lock_bh(&l_dp_trace_lock); if (MAX_ADF_DP_TRACE_RECORDS == i) i = 0; pRecord = g_adf_dp_trace_tbl[i]; - spin_unlock_bh(&l_dp_trace_lock); + adf_os_spin_unlock_bh(&l_dp_trace_lock); } } else { - spin_unlock_bh(&l_dp_trace_lock); + adf_os_spin_unlock_bh(&l_dp_trace_lock); } } diff --git a/CORE/SERVICES/COMMON/adf/linux/adf_os_dma_pvt.h b/CORE/SERVICES/COMMON/adf/linux/adf_os_dma_pvt.h index d0e9e6322ed4..6a5bcda733c9 100644 --- a/CORE/SERVICES/COMMON/adf/linux/adf_os_dma_pvt.h +++ b/CORE/SERVICES/COMMON/adf/linux/adf_os_dma_pvt.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2013 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -42,6 +42,13 @@ #include <adf_os_types.h> #include <adf_os_util.h> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) +#define __adf_os_dma_alloc_noncoherent(dev, size, daddr, flag, attr) dma_alloc_attrs(dev, size, daddr, flag, attr) +#define __adf_os_dma_free_noncoherent(dev, size, vddr, daddr, attr) dma_free_attrs(dev, size, vddr, daddr, attr) +#else +#define __adf_os_dma_alloc_noncoherent(dev, size, daddr, flag, attr) dma_alloc_noncoherent(dev, size, daddr, flag) +#define __adf_os_dma_free_noncoherent(dev, size, vddr, daddr, attr) dma_free_noncoherent(dev, size, vddr, daddr) +#endif /** * XXX:error handling * @@ -74,8 +81,9 @@ __adf_os_dmamem_alloc(adf_os_device_t osdev, vaddr = dma_alloc_coherent(osdev->dev, size, &lmap->seg[0].daddr, GFP_ATOMIC); else - vaddr = dma_alloc_noncoherent(osdev->dev, size, &lmap->seg[0].daddr, - GFP_ATOMIC); + vaddr = __adf_os_dma_alloc_noncoherent(osdev->dev, size, + &lmap->seg[0].daddr, + GFP_ATOMIC, DMA_ATTR_NON_CONSISTENT); adf_os_assert(vaddr); @@ -100,7 +108,9 @@ __adf_os_dmamem_free(adf_os_device_t osdev, __adf_os_size_t size, if(coherent) dma_free_coherent(osdev->dev, size, vaddr, dmap->seg[0].daddr); else - dma_free_noncoherent(osdev->dev, size, vaddr, dmap->seg[0].daddr); + __adf_os_dma_free_noncoherent(osdev->dev, size, vaddr, + dmap->seg[0].daddr, + DMA_ATTR_NON_CONSISTENT); kfree(dmap); } diff --git a/CORE/SERVICES/COMMON/adf/linux/adf_os_lock_pvt.h b/CORE/SERVICES/COMMON/adf/linux/adf_os_lock_pvt.h index 123e248e6a7b..326502a7fabc 100644 --- a/CORE/SERVICES/COMMON/adf/linux/adf_os_lock_pvt.h +++ b/CORE/SERVICES/COMMON/adf/linux/adf_os_lock_pvt.h @@ -102,31 +102,14 @@ __adf_os_spinlock_init(__adf_os_spinlock_t *lock) return A_STATUS_OK; } -#define __adf_os_spinlock_destroy(lock) -/** - * @brief Acquire a Spinlock (SMP) & disable Preemption (Preemptive) - * - * @param lock (Lock object) - * @param flags (Current IRQ mask) - */ -static inline void -__adf_os_spin_lock(__adf_os_spinlock_t *lock) -{ - spin_lock(&lock->spinlock); -} - -/** - * @brief Unlock the spinlock and enables the Preemption - * - * @param lock - * @param flags - */ -static inline void -__adf_os_spin_unlock(__adf_os_spinlock_t *lock) -{ - spin_unlock(&lock->spinlock); -} +#define __adf_os_raw_spin_lock(_lock) spin_lock(_lock) +#define __adf_os_raw_spin_unlock(_lock) spin_unlock(_lock) +#define __adf_os_raw_spin_lock_bh(_lock) spin_lock_bh(_lock) +#define __adf_os_raw_spin_unlock_bh(_lock) spin_unlock_bh(_lock) +#define __adf_os_raw_spin_lock_irqsave(_lock, flag) spin_lock_irqsave(_lock, flag) +#define __adf_os_raw_spin_unlock_irqrestore(_lock, flag) spin_unlock_irqrestore(_lock, flag) +#define __adf_os_spinlock_destroy(lock) /** * @brief Acquire a Spinlock (SMP) & disable Preemption (Preemptive) * Disable IRQs @@ -182,6 +165,45 @@ __adf_os_spin_unlock_bh(__adf_os_spinlock_t *lock) spin_unlock(&lock->spinlock); } +/** + * @brief Acquire a Spinlock (SMP) & disable Preemption (Preemptive) + * + * @param lock (Lock object) + * @param flags (Current IRQ mask) + */ +#ifdef CONFIG_SMP +static inline void +__adf_os_spin_lock(__adf_os_spinlock_t *lock) +{ + __adf_os_spin_lock_bh(lock); +} + +static inline void +__adf_os_spin_unlock(__adf_os_spinlock_t *lock) +{ + __adf_os_spin_unlock_bh(lock); +} + +#else +static inline void +__adf_os_spin_lock(__adf_os_spinlock_t *lock) +{ + spin_lock(&lock->spinlock); +} + +/** + * @brief Unlock the spinlock and enables the Preemption + * + * @param lock + * @param flags + */ +static inline void +__adf_os_spin_unlock(__adf_os_spinlock_t *lock) +{ + spin_unlock(&lock->spinlock); +} +#endif + static inline a_bool_t __adf_os_spinlock_irq_exec(adf_os_handle_t hdl, __adf_os_spinlock_t *lock, diff --git a/CORE/SERVICES/COMMON/dbglog_id.h b/CORE/SERVICES/COMMON/dbglog_id.h index bd48e61b94de..26a1d9a5629e 100644 --- a/CORE/SERVICES/COMMON/dbglog_id.h +++ b/CORE/SERVICES/COMMON/dbglog_id.h @@ -2074,6 +2074,12 @@ typedef enum { #define WLAN_MODULE_QBOOST_DBGID_WLAN_PEER_NOT_FOUND 1 #define WLAN_MODULE_QBOOST_DEFINITION_END 2 +/* HPCS DBGID */ +#define HPCS_PULSE_START 0 +#define HPCS_PULSE_LF_TIMER 1 +#define HPCS_PULSE_HF_TIMER 2 +#define HPCS_PULSE_POWER_SAVE 3 + #ifdef __cplusplus } #endif diff --git a/CORE/SERVICES/COMMON/hif.h b/CORE/SERVICES/COMMON/hif.h index c3fd162d67a8..df15748cd251 100644 --- a/CORE/SERVICES/COMMON/hif.h +++ b/CORE/SERVICES/COMMON/hif.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016, 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * diff --git a/CORE/SERVICES/COMMON/osdep_adf.h b/CORE/SERVICES/COMMON/osdep_adf.h index 4e2ff99eb516..2ae84e03b382 100644 --- a/CORE/SERVICES/COMMON/osdep_adf.h +++ b/CORE/SERVICES/COMMON/osdep_adf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2014, 2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014, 2017-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -65,6 +65,7 @@ #include "if_upperproto.h" #include "ah_osdep.h" +#include <adf_os_lock.h> #ifdef AR9100 #include <ar9100.h> @@ -277,6 +278,7 @@ typedef rwlock_t usb_readwrite_lock_t; #ifdef CONFIG_SMP /* Undo the one provided by the kernel to debug spin locks */ +#if 0 #undef spin_lock #undef spin_unlock #undef spin_trylock @@ -297,6 +299,7 @@ spin_unlock_bh(x);\ } while (0) #define spin_trylock(x) spin_trylock_bh(x) +#endif #define OS_SUPPORT_ASYNC_Q 1 /* support for handling asyn function calls */ @@ -465,7 +468,7 @@ typedef struct { os_tasklet_routine_t routine; atomic_t queued; void *data; - spinlock_t lock; + adf_os_spinlock_t lock; } os_task_t; typedef struct _os_schedule_routing_mesg { @@ -492,8 +495,8 @@ typedef struct { u_int8_t *mesg_queue_buf; STAILQ_HEAD(, _os_mesg_t) mesg_head; /* queued mesg buffers */ STAILQ_HEAD(, _os_mesg_t) mesg_free_head; /* free mesg buffers */ - spinlock_t lock; - spinlock_t ev_handler_lock; + adf_os_spinlock_t lock; + adf_os_spinlock_t ev_handler_lock; #ifdef USE_SOFTINTR void *_task; #else @@ -686,7 +689,7 @@ os_mesgq_handler(void *timer_arg) /* * Request access to message queue to retrieve message for processing */ - spin_lock(&(queue->lock)); + adf_os_spin_lock(&(queue->lock)); mesg = STAILQ_FIRST(&queue->mesg_head); while(mesg) { @@ -699,19 +702,19 @@ os_mesgq_handler(void *timer_arg) /* * Release access to message queue before processing message */ - spin_unlock(&(queue->lock)); + adf_os_spin_unlock(&(queue->lock)); /* * Ensure just one message can be processes at a time. */ - spin_lock(&(queue->ev_handler_lock)); + adf_os_spin_lock(&(queue->ev_handler_lock)); queue->handler(queue->ctx,mesg->mesg_type,mesg->mesg_len, msg); - spin_unlock(&(queue->ev_handler_lock)); + adf_os_spin_unlock(&(queue->ev_handler_lock)); /* * Request access to message queue to retrieve next message */ - spin_lock(&(queue->lock)); + adf_os_spin_lock(&(queue->lock)); queue->num_queued--; STAILQ_INSERT_TAIL(&queue->mesg_free_head,mesg, mesg_next); mesg = STAILQ_FIRST(&queue->mesg_head); @@ -720,7 +723,7 @@ os_mesgq_handler(void *timer_arg) /* * Release message queue */ - spin_unlock(&(queue->lock)); + adf_os_spin_unlock(&(queue->lock)); } /* @@ -748,8 +751,8 @@ static INLINE int OS_MESGQ_INIT(osdev_t devhandle, os_mesg_queue_t *queue, queue->dev_handle = devhandle; STAILQ_INIT(&queue->mesg_head); STAILQ_INIT(&queue->mesg_free_head); - spin_lock_init(&(queue->lock)); - spin_lock_init(&(queue->ev_handler_lock)); + adf_os_spinlock_init(&(queue->lock)); + adf_os_spinlock_init(&(queue->ev_handler_lock)); mesg = (os_mesg_t *)queue->mesg_queue_buf; for (i=0;i<max_queued;++i) { STAILQ_INSERT_TAIL(&queue->mesg_free_head,mesg,mesg_next); @@ -785,7 +788,7 @@ static INLINE int OS_MESGQ_SEND(os_mesg_queue_t *queue,u_int16_t type, u_int16_t { os_mesg_t *mesg; - spin_lock(&(queue->lock)); + adf_os_spin_lock(&(queue->lock)); if (queue->is_synchronous ) { queue->handler(queue->ctx,type,len, msg); } else { @@ -801,7 +804,7 @@ static INLINE int OS_MESGQ_SEND(os_mesg_queue_t *queue,u_int16_t type, u_int16_t STAILQ_INSERT_TAIL(&queue->mesg_head, mesg, mesg_next); queue->num_queued++; } else { - spin_unlock(&(queue->lock)); + adf_os_spin_unlock(&(queue->lock)); printk("No more message queue buffers !!! \n"); return -ENOMEM; } @@ -814,7 +817,7 @@ static INLINE int OS_MESGQ_SEND(os_mesg_queue_t *queue,u_int16_t type, u_int16_t #endif } } - spin_unlock(&(queue->lock)); + adf_os_spin_unlock(&(queue->lock)); return 0; } @@ -842,7 +845,7 @@ static INLINE void OS_MESGQ_DRAIN(os_mesg_queue_t *queue, os_mesg_handler_t msg_ os_mesg_t *mesg = NULL; void *msg; - spin_lock(&(queue->lock)); + adf_os_spin_lock(&(queue->lock)); #ifndef USE_SOFTINTR OS_CANCEL_TIMER(&queue->_timer); #endif @@ -862,7 +865,7 @@ static INLINE void OS_MESGQ_DRAIN(os_mesg_queue_t *queue, os_mesg_handler_t msg_ mesg = STAILQ_FIRST(&queue->mesg_head); }; STAILQ_INIT(&queue->mesg_head); - spin_unlock(&(queue->lock)); + adf_os_spin_unlock(&(queue->lock)); } @@ -874,7 +877,7 @@ static INLINE void OS_MESGQ_DRAIN(os_mesg_queue_t *queue, os_mesg_handler_t msg_ static INLINE void OS_MESGQ_DESTROY(os_mesg_queue_t *queue) { - spin_lock(&(queue->lock)); + adf_os_spin_lock(&(queue->lock)); #ifdef USE_SOFTINTR softintr_disestablish(queue->_task); #else @@ -887,9 +890,9 @@ static INLINE void OS_MESGQ_DESTROY(os_mesg_queue_t *queue) #ifndef USE_SOFTINTR OS_FREE_TIMER(&queue->_timer); #endif - spin_unlock(&(queue->lock)); - spin_lock_destroy(&(queue->lock)); - spin_lock_destroy(&(queue->ev_handler_lock)); + adf_os_spin_unlock(&(queue->lock)); + adf_os_spinlock_destroy(&(queue->lock)); + adf_os_spinlock_destroy(&(queue->ev_handler_lock)); } diff --git a/CORE/SERVICES/COMMON/wlan_module_ids.h b/CORE/SERVICES/COMMON/wlan_module_ids.h index 19ea4294d220..9953a3e4bb62 100644 --- a/CORE/SERVICES/COMMON/wlan_module_ids.h +++ b/CORE/SERVICES/COMMON/wlan_module_ids.h @@ -112,6 +112,7 @@ typedef enum { WLAN_MODULE_STA_TWT, /* 0x4d */ WLAN_MODULE_AP_TWT, /* 0x4e */ WLAN_MODULE_UL_OFDMA, /* 0x4f */ + WLAN_MODULE_HPCS_PULSE, /* 0x50 */ WLAN_MODULE_ID_MAX, WLAN_MODULE_ID_INVALID = WLAN_MODULE_ID_MAX, diff --git a/CORE/SERVICES/HIF/PCIe/hif_pci.c b/CORE/SERVICES/HIF/PCIe/hif_pci.c index 280976459e56..0511191e3175 100644 --- a/CORE/SERVICES/HIF/PCIe/hif_pci.c +++ b/CORE/SERVICES/HIF/PCIe/hif_pci.c @@ -91,7 +91,7 @@ ATH_DEBUG_INSTANTIATE_MODULE_VAR(hif, #ifdef CONFIG_ATH_PCIE_ACCESS_DEBUG -spinlock_t pcie_access_log_lock; +adf_os_spinlock_t pcie_access_log_lock; unsigned int pcie_access_log_seqnum = 0; HIF_ACCESS_LOG pcie_access_log[PCIE_ACCESS_LOG_NUM]; static void HIFTargetDumpAccessLog(void); @@ -255,14 +255,14 @@ WAR_PCI_WRITE32(char *addr, u32 offset, u32 value) if (hif_pci_war1) { unsigned long irq_flags; - spin_lock_irqsave(&pciwar_lock, irq_flags); + adf_os_raw_spin_lock_irqsave(&pciwar_lock, irq_flags); (void)ioread32((void __iomem *)(addr+offset+4)); /* 3rd read prior to write */ (void)ioread32((void __iomem *)(addr+offset+4)); /* 2nd read prior to write */ (void)ioread32((void __iomem *)(addr+offset+4)); /* 1st read prior to write */ iowrite32((u32)(value), (void __iomem *)(addr+offset)); - spin_unlock_irqrestore(&pciwar_lock, irq_flags); + adf_os_raw_spin_unlock_irqrestore(&pciwar_lock, irq_flags); } else { iowrite32((u32)(value), (void __iomem *)(addr+offset)); } @@ -619,7 +619,7 @@ HIFPostInit(HIF_DEVICE *hif_device, void *unused, MSG_BASED_HIF_CALLBACKS *callb AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n",__FUNCTION__)); #ifdef CONFIG_ATH_PCIE_ACCESS_DEBUG - spin_lock_init(&pcie_access_log_lock); + adf_os_spinlock_init(&pcie_access_log_lock); #endif /* Save callbacks for later installation */ A_MEMCPY(&hif_state->msg_callbacks_pending, callbacks, sizeof(hif_state->msg_callbacks_pending)); @@ -2979,16 +2979,15 @@ HIFTargetReadChecked(A_target_id_t targid, A_UINT32 offset) value = A_PCI_READ32(addr); { - unsigned long irq_flags; int idx = pcie_access_log_seqnum % PCIE_ACCESS_LOG_NUM; - spin_lock_irqsave(&pcie_access_log_lock, irq_flags); + adf_os_spin_lock_irqsave(&pcie_access_log_lock); pcie_access_log[idx].seqnum = pcie_access_log_seqnum; pcie_access_log[idx].is_write = FALSE; pcie_access_log[idx].addr = addr; pcie_access_log[idx].value = value; pcie_access_log_seqnum++; - spin_unlock_irqrestore(&pcie_access_log_lock, irq_flags); + adf_os_spin_unlock_irqrestore(&pcie_access_log_lock); } return value; @@ -3007,16 +3006,15 @@ HIFTargetWriteChecked(A_target_id_t targid, A_UINT32 offset, A_UINT32 value) A_PCI_WRITE32(addr, value); { - unsigned long irq_flags; int idx = pcie_access_log_seqnum % PCIE_ACCESS_LOG_NUM; - spin_lock_irqsave(&pcie_access_log_lock, irq_flags); + adf_os_spin_lock_irqsave(&pcie_access_log_lock); pcie_access_log[idx].seqnum = pcie_access_log_seqnum; pcie_access_log[idx].is_write = TRUE; pcie_access_log[idx].addr = addr; pcie_access_log[idx].value = value; pcie_access_log_seqnum++; - spin_unlock_irqrestore(&pcie_access_log_lock, irq_flags); + adf_os_spin_unlock_irqrestore(&pcie_access_log_lock); } } @@ -3031,9 +3029,8 @@ void HIFTargetDumpAccessLog(void) { int idx, len, start_idx, cur_idx; - unsigned long irq_flags; - spin_lock_irqsave(&pcie_access_log_lock, irq_flags); + adf_os_spin_lock_irqsave(&pcie_access_log_lock); if (pcie_access_log_seqnum > PCIE_ACCESS_LOG_NUM) { len = PCIE_ACCESS_LOG_NUM; @@ -3057,7 +3054,7 @@ HIFTargetDumpAccessLog(void) } pcie_access_log_seqnum = 0; - spin_unlock_irqrestore(&pcie_access_log_lock, irq_flags); + adf_os_spin_unlock_irqrestore(&pcie_access_log_lock); } #endif @@ -3379,7 +3376,7 @@ void hif_pci_runtime_pm_timeout_fn(unsigned long data) unsigned long timer_expires; struct hif_pm_runtime_context *context, *temp; - spin_lock_bh(&hif_sc->runtime_lock); + adf_os_spin_lock_bh(&hif_sc->runtime_lock); timer_expires = hif_sc->runtime_timer_expires; @@ -3407,7 +3404,7 @@ void hif_pci_runtime_pm_timeout_fn(unsigned long data) } } - spin_unlock_bh(&hif_sc->runtime_lock); + adf_os_spin_unlock_bh(&hif_sc->runtime_lock); } int hif_pm_runtime_prevent_suspend(void *ol_sc, void *data) @@ -3425,10 +3422,10 @@ int hif_pm_runtime_prevent_suspend(void *ol_sc, void *data) if (in_irq()) WARN_ON(1); - spin_lock_bh(&hif_sc->runtime_lock); + adf_os_spin_lock_bh(&hif_sc->runtime_lock); context->timeout = 0; __hif_pm_runtime_prevent_suspend(hif_sc, context); - spin_unlock_bh(&hif_sc->runtime_lock); + adf_os_spin_unlock_bh(&hif_sc->runtime_lock); return 0; } @@ -3448,7 +3445,7 @@ int hif_pm_runtime_allow_suspend(void *ol_sc, void *data) if (in_irq()) WARN_ON(1); - spin_lock_bh(&hif_sc->runtime_lock); + adf_os_spin_lock_bh(&hif_sc->runtime_lock); __hif_pm_runtime_allow_suspend(hif_sc, context); @@ -3464,7 +3461,7 @@ int hif_pm_runtime_allow_suspend(void *ol_sc, void *data) hif_sc->runtime_timer_expires = 0; } - spin_unlock_bh(&hif_sc->runtime_lock); + adf_os_spin_unlock_bh(&hif_sc->runtime_lock); return 0; } @@ -3528,7 +3525,7 @@ int hif_pm_runtime_prevent_suspend_timeout(void *ol_sc, void *data, expires = jiffies + msecs_to_jiffies(delay); expires += !expires; - spin_lock_bh(&hif_sc->runtime_lock); + adf_os_spin_lock_bh(&hif_sc->runtime_lock); context->timeout = delay; ret = __hif_pm_runtime_prevent_suspend(hif_sc, context); @@ -3542,7 +3539,7 @@ int hif_pm_runtime_prevent_suspend_timeout(void *ol_sc, void *data, hif_sc->runtime_timer_expires = expires; } - spin_unlock_bh(&hif_sc->runtime_lock); + adf_os_spin_unlock_bh(&hif_sc->runtime_lock); VOS_TRACE(VOS_MODULE_ID_HIF, VOS_TRACE_LEVEL_INFO, "%s: pm_state: %d delay: %dms ret: %d\n", __func__, @@ -3606,9 +3603,9 @@ void hif_runtime_pm_prevent_suspend_deinit(void *data) * Ensure to delete the context list entry and reduce the usage count * before freeing the context if context is active. */ - spin_lock_bh(&sc->runtime_lock); + adf_os_spin_lock_bh(&sc->runtime_lock); __hif_pm_runtime_allow_suspend(sc, context); - spin_unlock_bh(&sc->runtime_lock); + adf_os_spin_unlock_bh(&sc->runtime_lock); adf_os_mem_free(context); } diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.c b/CORE/SERVICES/HIF/PCIe/if_pci.c index 470c7244f8df..9a937b60eda8 100644 --- a/CORE/SERVICES/HIF/PCIe/if_pci.c +++ b/CORE/SERVICES/HIF/PCIe/if_pci.c @@ -943,9 +943,9 @@ static int hif_pci_autopm_debugfs_show(struct seq_file *s, void *data) msecs_age / 1000, msecs_age % 1000); } - spin_lock_bh(&sc->runtime_lock); + adf_os_spin_lock_bh(&sc->runtime_lock); if (list_empty(&sc->prevent_suspend_list)) { - spin_unlock_bh(&sc->runtime_lock); + adf_os_spin_unlock_bh(&sc->runtime_lock); return 0; } @@ -957,7 +957,7 @@ static int hif_pci_autopm_debugfs_show(struct seq_file *s, void *data) seq_puts(s, " "); } seq_puts(s, "\n"); - spin_unlock_bh(&sc->runtime_lock); + adf_os_spin_unlock_bh(&sc->runtime_lock); return 0; #undef HIF_PCI_AUTOPM_STATS @@ -1431,7 +1431,7 @@ static inline void hif_pci_pm_debugfs(struct hif_pci_softc *sc, bool init) static void hif_pci_pm_runtime_pre_init(struct hif_pci_softc *sc) { - spin_lock_init(&sc->runtime_lock); + adf_os_spinlock_init(&sc->runtime_lock); setup_timer(&sc->runtime_timer, hif_pci_runtime_pm_timeout_fn, (unsigned long)sc); @@ -1514,13 +1514,13 @@ static void hif_pci_pm_runtime_post_exit(struct hif_pci_softc *sc) else return; - spin_lock_bh(&sc->runtime_lock); + adf_os_spin_lock_bh(&sc->runtime_lock); list_for_each_entry_safe(ctx, tmp, &sc->prevent_suspend_list, list) { - spin_unlock_bh(&sc->runtime_lock); + adf_os_spin_unlock_bh(&sc->runtime_lock); hif_runtime_pm_prevent_suspend_deinit(ctx); - spin_lock_bh(&sc->runtime_lock); + adf_os_spin_lock_bh(&sc->runtime_lock); } - spin_unlock_bh(&sc->runtime_lock); + adf_os_spin_unlock_bh(&sc->runtime_lock); /* * This is totally a preventive measure to ensure Runtime PM * isn't disabled for life time. @@ -1549,11 +1549,11 @@ static void hif_pci_pm_runtime_ssr_post_exit(struct hif_pci_softc *sc) { struct hif_pm_runtime_context *ctx, *tmp; - spin_lock_bh(&sc->runtime_lock); + adf_os_spin_lock_bh(&sc->runtime_lock); list_for_each_entry_safe(ctx, tmp, &sc->prevent_suspend_list, list) { hif_pm_ssr_runtime_allow_suspend(sc, ctx); } - spin_unlock_bh(&sc->runtime_lock); + adf_os_spin_unlock_bh(&sc->runtime_lock); } #else diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.h b/CORE/SERVICES/HIF/PCIe/if_pci.h index 0abd26a6adff..4ab0749b832e 100644 --- a/CORE/SERVICES/HIF/PCIe/if_pci.h +++ b/CORE/SERVICES/HIF/PCIe/if_pci.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -125,7 +125,7 @@ struct hif_pci_softc { uint32_t prevent_suspend_cnt; struct hif_pci_pm_stats pm_stats; struct work_struct pm_work; - struct spinlock runtime_lock; + adf_os_spinlock_t runtime_lock; struct timer_list runtime_timer; struct list_head prevent_suspend_list; unsigned long runtime_timer_expires; diff --git a/CORE/SERVICES/HIF/USB/hif_usb.c b/CORE/SERVICES/HIF/USB/hif_usb.c index c7eecb700518..0fad77b8955a 100644 --- a/CORE/SERVICES/HIF/USB/hif_usb.c +++ b/CORE/SERVICES/HIF/USB/hif_usb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -479,10 +479,10 @@ static HIF_DEVICE_USB *usb_hif_create(struct usb_interface *interface) adf_os_mem_zero(device, sizeof(*device)); usb_set_intfdata(interface, device); - spin_lock_init(&(device->cs_lock)); - spin_lock_init(&(device->rx_lock)); - spin_lock_init(&(device->tx_lock)); - spin_lock_init(&(device->rx_prestart_lock)); + adf_os_spinlock_init(&(device->cs_lock)); + adf_os_spinlock_init(&(device->rx_lock)); + adf_os_spinlock_init(&(device->tx_lock)); + adf_os_spinlock_init(&(device->rx_prestart_lock)); device->udev = dev; device->interface = interface; diff --git a/CORE/SERVICES/HIF/USB/hif_usb_internal.h b/CORE/SERVICES/HIF/USB/hif_usb_internal.h index cfe8613bb682..807329be69bd 100644 --- a/CORE/SERVICES/HIF/USB/hif_usb_internal.h +++ b/CORE/SERVICES/HIF/USB/hif_usb_internal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -114,10 +114,10 @@ typedef struct _HIF_USB_PIPE { } HIF_USB_PIPE; typedef struct _HIF_DEVICE_USB { - spinlock_t cs_lock; - spinlock_t tx_lock; - spinlock_t rx_lock; - spinlock_t rx_prestart_lock; + adf_os_spinlock_t cs_lock; + adf_os_spinlock_t tx_lock; + adf_os_spinlock_t rx_lock; + adf_os_spinlock_t rx_prestart_lock; MSG_BASED_HIF_CALLBACKS htcCallbacks; struct usb_device *udev; struct usb_interface *interface; diff --git a/CORE/SERVICES/HIF/USB/if_usb.c b/CORE/SERVICES/HIF/USB/if_usb.c index 0d4fdfccdaaa..2aadfc2ea2db 100644 --- a/CORE/SERVICES/HIF/USB/if_usb.c +++ b/CORE/SERVICES/HIF/USB/if_usb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016, 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * diff --git a/CORE/SERVICES/HIF/USB/usbdrv.c b/CORE/SERVICES/HIF/USB/usbdrv.c index e5011302e40b..86e38656fbf2 100644 --- a/CORE/SERVICES/HIF/USB/usbdrv.c +++ b/CORE/SERVICES/HIF/USB/usbdrv.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -60,27 +60,24 @@ static void usb_hif_cleanup_recv_urb(HIF_URB_CONTEXT *urb_context); static void usb_hif_free_urb_to_pipe(HIF_USB_PIPE *pipe, HIF_URB_CONTEXT *urb_context) { - unsigned long flags; - - spin_lock_irqsave(&pipe->device->cs_lock, flags); + adf_os_spin_lock_irqsave(&pipe->device->cs_lock); pipe->urb_cnt++; DL_ListAdd(&pipe->urb_list_head, &urb_context->link); - spin_unlock_irqrestore(&pipe->device->cs_lock, flags); + adf_os_spin_unlock_irqrestore(&pipe->device->cs_lock); } HIF_URB_CONTEXT *usb_hif_alloc_urb_from_pipe(HIF_USB_PIPE *pipe) { HIF_URB_CONTEXT *urb_context = NULL; DL_LIST *item; - unsigned long flags; - spin_lock_irqsave(&pipe->device->cs_lock, flags); + adf_os_spin_lock_irqsave(&pipe->device->cs_lock); item = DL_ListRemoveItemFromHead(&pipe->urb_list_head); if (item != NULL) { urb_context = A_CONTAINING_STRUCT(item, HIF_URB_CONTEXT, link); pipe->urb_cnt--; } - spin_unlock_irqrestore(&pipe->device->cs_lock, flags); + adf_os_spin_unlock_irqrestore(&pipe->device->cs_lock); return urb_context; } @@ -89,13 +86,12 @@ static HIF_URB_CONTEXT *usb_hif_dequeue_pending_transfer(HIF_USB_PIPE *pipe) { HIF_URB_CONTEXT *urb_context = NULL; DL_LIST *item; - unsigned long flags; - spin_lock_irqsave(&pipe->device->cs_lock, flags); + adf_os_spin_lock_irqsave(&pipe->device->cs_lock); item = DL_ListRemoveItemFromHead(&pipe->urb_pending_list); if (item != NULL) urb_context = A_CONTAINING_STRUCT(item, HIF_URB_CONTEXT, link); - spin_unlock_irqrestore(&pipe->device->cs_lock, flags); + adf_os_spin_unlock_irqrestore(&pipe->device->cs_lock); return urb_context; } @@ -103,20 +99,16 @@ static HIF_URB_CONTEXT *usb_hif_dequeue_pending_transfer(HIF_USB_PIPE *pipe) void usb_hif_enqueue_pending_transfer(HIF_USB_PIPE *pipe, HIF_URB_CONTEXT *urb_context) { - unsigned long flags; - - spin_lock_irqsave(&pipe->device->cs_lock, flags); + adf_os_spin_lock_irqsave(&pipe->device->cs_lock); DL_ListInsertTail(&pipe->urb_pending_list, &urb_context->link); - spin_unlock_irqrestore(&pipe->device->cs_lock, flags); + adf_os_spin_unlock_irqrestore(&pipe->device->cs_lock); } void usb_hif_remove_pending_transfer(HIF_URB_CONTEXT *urb_context) { - unsigned long flags; - - spin_lock_irqsave(&urb_context->pipe->device->cs_lock, flags); + adf_os_spin_lock_irqsave(&urb_context->pipe->device->cs_lock); DL_ListRemove(&urb_context->link); - spin_unlock_irqrestore(&urb_context->pipe->device->cs_lock, flags); + adf_os_spin_unlock_irqrestore(&urb_context->pipe->device->cs_lock); } static A_STATUS usb_hif_alloc_pipe_resources(HIF_USB_PIPE *pipe, int urb_cnt) @@ -439,7 +431,6 @@ static void usb_hif_usb_recv_prestart_complete(struct urb *urb) A_STATUS status = A_OK; adf_nbuf_t buf = NULL; HIF_USB_PIPE *pipe = urb_context->pipe; - unsigned long flags; AR_DEBUG_PRINTF(USB_HIF_DEBUG_BULK_IN, ( "+%s: recv pipe: %d, stat:%d,len:%d urb:0x%pK\n", @@ -502,11 +493,11 @@ static void usb_hif_usb_recv_prestart_complete(struct urb *urb) usb_hif_cleanup_recv_urb(urb_context); /* Prestart URBs runs out and now start working receive pipe. */ - spin_lock_irqsave(&pipe->device->rx_prestart_lock, flags); + adf_os_spin_lock_irqsave(&pipe->device->rx_prestart_lock); if (--pipe->urb_prestart_cnt == 0) { usb_hif_start_recv_pipes(pipe->device); } - spin_unlock_irqrestore(&pipe->device->rx_prestart_lock, flags); + adf_os_spin_unlock_irqrestore(&pipe->device->rx_prestart_lock); AR_DEBUG_PRINTF(USB_HIF_DEBUG_BULK_IN, ("-%s\n", __func__)); } @@ -761,11 +752,10 @@ static void usb_hif_post_recv_prestart_transfers(HIF_USB_PIPE *recv_pipe, a_uint32_t len; struct urb *urb; int i, usb_status, buffer_length = HIF_USB_RX_BUFFER_SIZE; - unsigned long flags; AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+%s\n", __func__)); - spin_lock_irqsave(&recv_pipe->device->rx_prestart_lock, flags); + adf_os_spin_lock_irqsave(&recv_pipe->device->rx_prestart_lock); for (i = 0; i < prestart_urb; i++) { urb_context = usb_hif_alloc_urb_from_pipe(recv_pipe); if (NULL == urb_context) @@ -812,7 +802,7 @@ static void usb_hif_post_recv_prestart_transfers(HIF_USB_PIPE *recv_pipe, recv_pipe->urb_prestart_cnt++; } - spin_unlock_irqrestore(&recv_pipe->device->rx_prestart_lock, flags); + adf_os_spin_unlock_irqrestore(&recv_pipe->device->rx_prestart_lock); AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-%s\n", __func__)); } diff --git a/CORE/SERVICES/HIF/sdio/hif_sdio_dev.c b/CORE/SERVICES/HIF/sdio/hif_sdio_dev.c index 8d215633d80d..4fb73c08dd66 100644 --- a/CORE/SERVICES/HIF/sdio/hif_sdio_dev.c +++ b/CORE/SERVICES/HIF/sdio/hif_sdio_dev.c @@ -176,8 +176,8 @@ HTC_PACKET *HIFDevAllocRxBuffer(HIF_SDIO_DEVICE *pDev, size_t length) */ static inline void rx_completion_sem_init(HIF_SDIO_DEVICE *pDev) { - spin_lock_init(&pDev->pRecvTask->rx_bundle_lock); - spin_lock_init(&pDev->pRecvTask->rx_sync_completion_lock); + adf_os_spinlock_init(&pDev->pRecvTask->rx_bundle_lock); + adf_os_spinlock_init(&pDev->pRecvTask->rx_sync_completion_lock); sema_init(&pDev->pRecvTask->sem_rx_completion, 0); } extern int rx_completion_task(void *param); @@ -273,7 +273,7 @@ HIF_SDIO_DEVICE* HIFDevCreate(HIF_DEVICE *hif_device, INIT_HTC_PACKET_QUEUE(&pDev->pRecvTask->rxBundleQueue); INIT_HTC_PACKET_QUEUE(&pDev->pRecvTask->rxSyncCompletionQueue); hif_start_rx_completion_thread(pDev); - spin_lock_init(&pDev->pRecvTask->rx_alloc_lock); + adf_os_spinlock_init(&pDev->pRecvTask->rx_alloc_lock); INIT_HTC_PACKET_QUEUE(&pDev->pRecvTask->rxAllocQueue); #endif diff --git a/CORE/SERVICES/HIF/sdio/hif_sdio_internal.h b/CORE/SERVICES/HIF/sdio/hif_sdio_internal.h index 842d9e8f2e91..6046e1fd8b8e 100644 --- a/CORE/SERVICES/HIF/sdio/hif_sdio_internal.h +++ b/CORE/SERVICES/HIF/sdio/hif_sdio_internal.h @@ -123,11 +123,11 @@ struct hif_recv_task { struct semaphore sem_rx_completion; int rx_completion_shutdown; struct completion rx_completion_exit; - spinlock_t rx_bundle_lock; - spinlock_t rx_sync_completion_lock; + adf_os_spinlock_t rx_bundle_lock; + adf_os_spinlock_t rx_sync_completion_lock; HTC_PACKET_QUEUE rxBundleQueue; HTC_PACKET_QUEUE rxSyncCompletionQueue; - spinlock_t rx_alloc_lock; + adf_os_spinlock_t rx_alloc_lock; HTC_PACKET_QUEUE rxAllocQueue; }; #endif diff --git a/CORE/SERVICES/HIF/sdio/hif_sdio_recv.c b/CORE/SERVICES/HIF/sdio/hif_sdio_recv.c index 0cf998fe5c18..fe3ba3338303 100644 --- a/CORE/SERVICES/HIF/sdio/hif_sdio_recv.c +++ b/CORE/SERVICES/HIF/sdio/hif_sdio_recv.c @@ -125,9 +125,6 @@ static A_STATUS HIFDevAllocAndPrepareRxPackets(HIF_SDIO_DEVICE *pDev, int numMessages; int fullLength; A_BOOL noRecycle; -#ifdef HIF_RX_THREAD - unsigned long flags; -#endif HTC_TARGET *target = NULL; target = (HTC_TARGET *)pDev->pTarget; /* lock RX while we assemble the packet buffers */ @@ -186,7 +183,7 @@ static A_STATUS HIFDevAllocAndPrepareRxPackets(HIF_SDIO_DEVICE *pDev, /* get packet buffers for each message, if there was a bundle detected in the header, * use pHdr as a template to fetch all packets in the bundle */ #ifdef HIF_RX_THREAD - spin_lock_irqsave(&pDev->pRecvTask->rx_alloc_lock, flags); + adf_os_spin_lock_irqsave(&pDev->pRecvTask->rx_alloc_lock); #endif for (j = 0; j < numMessages; j++) { @@ -275,7 +272,7 @@ static A_STATUS HIFDevAllocAndPrepareRxPackets(HIF_SDIO_DEVICE *pDev, pPacket->Completion = NULL; } #ifdef HIF_RX_THREAD - spin_unlock_irqrestore(&pDev->pRecvTask->rx_alloc_lock, flags); + adf_os_spin_unlock_irqrestore(&pDev->pRecvTask->rx_alloc_lock); #endif if (A_FAILED(status)) { @@ -863,7 +860,6 @@ int rx_completion_task(void *param) { HIF_SDIO_DEVICE *device; HTC_PACKET *pPacket = NULL; - unsigned long flags; HTC_PACKET *pPacketRxBundle; A_UINT32 paddedLength; unsigned char *pBundleBuffer = NULL; @@ -897,9 +893,9 @@ int rx_completion_task(void *param) } //process single packet - spin_lock_irqsave(&device->pRecvTask->rx_bundle_lock, flags); + adf_os_spin_lock_irqsave(&device->pRecvTask->rx_bundle_lock); if(HTC_QUEUE_EMPTY(&device->pRecvTask->rxBundleQueue)) { - spin_lock_irqsave(&device->pRecvTask->rx_sync_completion_lock, flags); + adf_os_spin_lock_irqsave(&device->pRecvTask->rx_sync_completion_lock); while(!HTC_QUEUE_EMPTY(&device->pRecvTask->rxSyncCompletionQueue)) { pPacket = HTC_PACKET_DEQUEUE(&device->pRecvTask->rxSyncCompletionQueue); if(pPacket == NULL) { @@ -911,7 +907,7 @@ int rx_completion_task(void *param) break; } } - spin_unlock_irqrestore(&device->pRecvTask->rx_sync_completion_lock, flags); + adf_os_spin_unlock_irqrestore(&device->pRecvTask->rx_sync_completion_lock); } else { //1. Dequeue from bundle buffer queue, scatter data to sync completion queue @@ -924,20 +920,20 @@ int rx_completion_task(void *param) AR_DEBUG_PRINTF(ATH_DEBUG_WARN, ("Packets in bundle buffer is < 1")); break; } - spin_lock_irqsave(&device->pRecvTask->rx_sync_completion_lock, flags); + adf_os_spin_lock_irqsave(&device->pRecvTask->rx_sync_completion_lock); if(HTC_PACKET_QUEUE_DEPTH(&device->pRecvTask->rxSyncCompletionQueue) < pPacketRxBundle->BundlePktnum) { // corner case: the sync queue depth is not enough for processing this bundle pkt, push it back HTC_PACKET_ENQUEUE_TO_HEAD(&device->pRecvTask->rxBundleQueue, pPacketRxBundle); - spin_unlock_irqrestore(&device->pRecvTask->rx_sync_completion_lock, flags); + adf_os_spin_unlock_irqrestore(&device->pRecvTask->rx_sync_completion_lock); break; } - spin_unlock_irqrestore(&device->pRecvTask->rx_sync_completion_lock, flags); + adf_os_spin_unlock_irqrestore(&device->pRecvTask->rx_sync_completion_lock); pBundleBuffer = pPacketRxBundle->pBuffer; pBuffer = pBundleBuffer; if(pPacketRxBundle == NULL) break; - spin_lock_irqsave(&device->pRecvTask->rx_sync_completion_lock, flags); + adf_os_spin_lock_irqsave(&device->pRecvTask->rx_sync_completion_lock); //if the next pkt is single, dequeue it and process it, until the bundle pkts while(TRUE) { nextIsSingle = 0; @@ -1011,13 +1007,13 @@ int rx_completion_task(void *param) else break; } - spin_unlock_irqrestore(&device->pRecvTask->rx_sync_completion_lock, flags); + adf_os_spin_unlock_irqrestore(&device->pRecvTask->rx_sync_completion_lock); FreeHTCBundleRxPacket(target, pPacketRxBundle); } } - spin_unlock_irqrestore(&device->pRecvTask->rx_bundle_lock, flags); + adf_os_spin_unlock_irqrestore(&device->pRecvTask->rx_bundle_lock); //alloc skb for next bundle - spin_lock_irqsave(&device->pRecvTask->rx_alloc_lock, flags); + adf_os_spin_lock_irqsave(&device->pRecvTask->rx_alloc_lock); while(HTC_PACKET_QUEUE_DEPTH(&device->pRecvTask->rxAllocQueue) < 64) { pPacket = HIFDevAllocRxBuffer(device, 2048); if(pPacket == NULL) { @@ -1026,7 +1022,7 @@ int rx_completion_task(void *param) } HTC_PACKET_ENQUEUE(&device->pRecvTask->rxAllocQueue, pPacket); } - spin_unlock_irqrestore(&device->pRecvTask->rx_alloc_lock, flags); + adf_os_spin_unlock_irqrestore(&device->pRecvTask->rx_alloc_lock); } complete_and_exit(&device->pRecvTask->rx_completion_exit, 0); return 0; @@ -1052,7 +1048,6 @@ static A_STATUS HIFDevIssueRecvPacketBundle(HIF_SDIO_DEVICE *pDev, HTC_TARGET *target = NULL; A_UINT32 paddedLength; #ifdef HIF_RX_THREAD - unsigned long flags; #else unsigned char *pBuffer = NULL; A_UINT16 curPayloadLen = 0; @@ -1145,14 +1140,14 @@ static A_STATUS HIFDevIssueRecvPacketBundle(HIF_SDIO_DEVICE *pDev, pNumLookAheads, lookAhead_part2); *pNumPacketsFetched = i; pPacketRxBundle->BundlePktnum = i; - spin_lock_irqsave(&pDev->pRecvTask->rx_bundle_lock, flags); + adf_os_spin_lock_irqsave(&pDev->pRecvTask->rx_bundle_lock); HTC_PACKET_ENQUEUE(&pDev->pRecvTask->rxBundleQueue, pPacketRxBundle); - spin_unlock_irqrestore(&pDev->pRecvTask->rx_bundle_lock, flags); + adf_os_spin_unlock_irqrestore(&pDev->pRecvTask->rx_bundle_lock); - spin_lock_irqsave(&pDev->pRecvTask->rx_sync_completion_lock, flags); + adf_os_spin_lock_irqsave(&pDev->pRecvTask->rx_sync_completion_lock); HTC_PACKET_QUEUE_TRANSFER_TO_TAIL(&pDev->pRecvTask->rxSyncCompletionQueue, pSyncCompletionQueue); - spin_unlock_irqrestore(&pDev->pRecvTask->rx_sync_completion_lock, flags); + adf_os_spin_unlock_irqrestore(&pDev->pRecvTask->rx_sync_completion_lock); #else *pNumPacketsFetched = i; pBuffer = pBundleBuffer; @@ -1198,9 +1193,6 @@ A_STATUS HIFDevRecvMessagePendingHandler(HIF_SDIO_DEVICE *pDev, A_BOOL partialBundle; HTC_ENDPOINT_ID id; int totalFetched = 0; -#ifdef HIF_RX_THREAD - unsigned long flags; -#endif HTC_TARGET *target = NULL; @@ -1365,9 +1357,9 @@ A_STATUS HIFDevRecvMessagePendingHandler(HIF_SDIO_DEVICE *pDev, HIFDevPreprocessTrailer(pDev, pPacket, lookAheads, &NumLookAheads, lookAhead_part2); pPacket->BundlePktnum = 1; - spin_lock_irqsave(&pDev->pRecvTask->rx_sync_completion_lock, flags); + adf_os_spin_lock_irqsave(&pDev->pRecvTask->rx_sync_completion_lock); HTC_PACKET_ENQUEUE(&pDev->pRecvTask->rxSyncCompletionQueue, pPacket); - spin_unlock_irqrestore(&pDev->pRecvTask->rx_sync_completion_lock, flags); + adf_os_spin_unlock_irqrestore(&pDev->pRecvTask->rx_sync_completion_lock); #else HTC_PACKET_ENQUEUE(&syncCompletedPktsQueue, pPacket); #endif diff --git a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c index c8f74c84cd3b..12c5fd47dbb3 100644 --- a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c +++ b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c @@ -159,7 +159,7 @@ ath_hif_sdio_probe(void *context, void *hif_handle) sc->aps_osdev.device = os_dev_info.pOSDevice; sc->aps_osdev.bc.bc_bustype = HAL_BUS_TYPE_SDIO; - spin_lock_init(&sc->target_lock); + adf_os_spinlock_init(&sc->target_lock); { /* diff --git a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h index 391658b5091f..198d40c2c907 100644 --- a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h +++ b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -68,7 +68,7 @@ struct ath_hif_sdio_softc { * Guard changes to Target HW state and to software * structures that track hardware state. */ - spinlock_t target_lock; + adf_os_spinlock_t target_lock; void *hif_handle; struct targetdef_s *targetdef; struct hostdef_s *hostdef; diff --git a/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h b/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h index 4b67e17049c6..9d3ae4f07093 100644 --- a/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h +++ b/CORE/SERVICES/HIF/sdio/linux/native_sdio/include/hif_internal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2014, 2016-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014, 2016-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -33,6 +33,7 @@ #include "a_osapi.h" #include "adf_os_timer.h" #include "adf_os_atomic.h" +#include <adf_os_lock.h> #include "hif.h" #include "hif_sdio_common.h" #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) @@ -93,7 +94,7 @@ typedef enum { struct hif_device { struct sdio_func *func; - spinlock_t asynclock; + adf_os_spinlock_t asynclock; struct task_struct* async_task; /* task to handle async commands */ struct semaphore sem_async; /* wake up for async task */ int async_shutdown; /* stop the async task */ @@ -105,11 +106,11 @@ struct hif_device { struct semaphore sem_tx_completion; int tx_completion_shutdown; struct completion tx_completion_exit; - spinlock_t tx_completion_lock; + adf_os_spinlock_t tx_completion_lock; BUS_REQUEST *tx_completion_req; BUS_REQUEST **last_tx_completion; #endif - spinlock_t lock; + adf_os_spinlock_t lock; BUS_REQUEST *s_busRequestFreeQueue; /* free list */ BUS_REQUEST busRequest[BUS_REQUEST_MAX_NUM]; /* available bus requests */ void *claimedContext; diff --git a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c index 656234fa6c6c..894f20b6b44a 100644 --- a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c +++ b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c @@ -50,13 +50,12 @@ #define BUS_REQ_RECORD_SIZE 100 u_int32_t g_bus_req_buf_idx = 0; -spinlock_t g_bus_request_record_lock; +adf_os_spinlock_t g_bus_request_record_lock; struct bus_request_record bus_request_record_buf[BUS_REQ_RECORD_SIZE]; #define BUS_REQUEST_RECORD(r, a, l) { \ - unsigned long flag; \ - spin_lock_irqsave(&g_bus_request_record_lock, flag); \ + adf_os_spin_lock_irqsave(&g_bus_request_record_lock); \ if (g_bus_req_buf_idx == BUS_REQ_RECORD_SIZE) \ g_bus_req_buf_idx = 0; \ bus_request_record_buf[g_bus_req_buf_idx].request = r; \ @@ -64,7 +63,7 @@ struct bus_request_record bus_request_record_buf[BUS_REQ_RECORD_SIZE]; bus_request_record_buf[g_bus_req_buf_idx].len = l; \ bus_request_record_buf[g_bus_req_buf_idx].time = adf_get_boottime(); \ g_bus_req_buf_idx++; \ - spin_unlock_irqrestore(&g_bus_request_record_lock, flag); \ + adf_os_spin_unlock_irqrestore(&g_bus_request_record_lock); \ } #if HIF_USE_DMA_BOUNCE_BUFFER @@ -602,11 +601,10 @@ __HIFReadWrite(HIF_DEVICE *device, void AddToAsyncList(HIF_DEVICE *device, BUS_REQUEST *busrequest) { - unsigned long flags; BUS_REQUEST *async; BUS_REQUEST *active; - spin_lock_irqsave(&device->asynclock, flags); + adf_os_spin_lock_irqsave(&device->asynclock); active = device->asyncreq; if (active == NULL) { device->asyncreq = busrequest; @@ -620,7 +618,7 @@ void AddToAsyncList(HIF_DEVICE *device, BUS_REQUEST *busrequest) active->inusenext = busrequest; busrequest->inusenext = NULL; } - spin_unlock_irqrestore(&device->asynclock, flags); + adf_os_spin_unlock_irqrestore(&device->asynclock); } A_STATUS @@ -758,13 +756,11 @@ static inline void _hif_free_bus_request(HIF_DEVICE *device, static void add_to_tx_completion_list(HIF_DEVICE *device, BUS_REQUEST *tx_comple) { - unsigned long flags; - - spin_lock_irqsave(&device->tx_completion_lock, flags); + adf_os_spin_lock_irqsave(&device->tx_completion_lock); tx_comple->inusenext = NULL; *device->last_tx_completion = tx_comple; device->last_tx_completion = &tx_comple->inusenext; - spin_unlock_irqrestore(&device->tx_completion_lock, flags); + adf_os_spin_unlock_irqrestore(&device->tx_completion_lock); } /** @@ -777,15 +773,14 @@ static void add_to_tx_completion_list(HIF_DEVICE *device, */ static void tx_clean_completion_list(HIF_DEVICE *device) { - unsigned long flags; BUS_REQUEST *comple; BUS_REQUEST *request; - spin_lock_irqsave(&device->tx_completion_lock, flags); + adf_os_spin_lock_irqsave(&device->tx_completion_lock); request = device->tx_completion_req; device->tx_completion_req = NULL; device->last_tx_completion = &device->tx_completion_req; - spin_unlock_irqrestore(&device->tx_completion_lock, flags); + adf_os_spin_unlock_irqrestore(&device->tx_completion_lock); while (request != NULL) { comple = request->inusenext; @@ -851,7 +846,7 @@ static int tx_completion_task(void *param) */ static inline void tx_completion_sem_init(HIF_DEVICE *device) { - spin_lock_init(&device->tx_completion_lock); + adf_os_spinlock_init(&device->tx_completion_lock); sema_init(&device->sem_tx_completion, 0); } @@ -994,7 +989,6 @@ static int async_task(void *param) HIF_DEVICE *device; BUS_REQUEST *request; A_STATUS status; - unsigned long flags; set_user_nice(current, -3); device = (HIF_DEVICE *)param; @@ -1021,7 +1015,7 @@ static int async_task(void *param) #endif /* we want to hold the host over multiple cmds if possible, but holding the host blocks card interrupts */ sdio_claim_host(device->func); - spin_lock_irqsave(&device->asynclock, flags); + adf_os_spin_lock_irqsave(&device->asynclock); /* pull the request to work on */ while (device->asyncreq != NULL) { request = device->asyncreq; @@ -1030,7 +1024,7 @@ static int async_task(void *param) } else { device->asyncreq = NULL; } - spin_unlock_irqrestore(&device->asynclock, flags); + adf_os_spin_unlock_irqrestore(&device->asynclock); AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("AR6000: async_task processing req: 0x%lX\n", (unsigned long)request)); #ifdef HIF_MBOX_SLEEP_WAR /* write request pending for mailbox(1-3), @@ -1064,9 +1058,9 @@ static int async_task(void *param) up(&request->sem_req); } } - spin_lock_irqsave(&device->asynclock, flags); + adf_os_spin_lock_irqsave(&device->asynclock); } - spin_unlock_irqrestore(&device->asynclock, flags); + adf_os_spin_unlock_irqrestore(&device->asynclock); sdio_release_host(device->func); } @@ -1821,8 +1815,8 @@ TODO: MMC SDIO3.0 Setting should also be modified in ReInit() function when Powe sdio_release_host(func); } - spin_lock_init(&device->asynclock); - spin_lock_init(&g_bus_request_record_lock); + adf_os_spinlock_init(&device->asynclock); + adf_os_spinlock_init(&g_bus_request_record_lock); DL_LIST_INIT(&device->ScatterReqHead); @@ -1947,31 +1941,29 @@ void HIFMaskInterrupt(HIF_DEVICE *device) void hif_release_bus_requests(HIF_DEVICE *device) { BUS_REQUEST *bus_req; - unsigned long flag; AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("AR6000: Release busrequest queue\n")); - spin_lock_irqsave(&device->lock, flag); + adf_os_spin_lock_irqsave(&device->lock); while ((bus_req = device->s_busRequestFreeQueue) != NULL) { device->s_busRequestFreeQueue = bus_req->next; - spin_unlock_irqrestore(&device->lock, flag); + adf_os_spin_unlock_irqrestore(&device->lock); A_FREE(bus_req); - spin_lock_irqsave(&device->lock, flag); + adf_os_spin_lock_irqsave(&device->lock); } - spin_unlock_irqrestore(&device->lock, flag); + adf_os_spin_unlock_irqrestore(&device->lock); } BUS_REQUEST *hifAllocateBusRequest(HIF_DEVICE *device) { BUS_REQUEST *busrequest; - unsigned long flag; /* Acquire lock */ - spin_lock_irqsave(&device->lock, flag); + adf_os_spin_lock_irqsave(&device->lock); /* Remove first in list */ if((busrequest = device->s_busRequestFreeQueue) != NULL) @@ -1979,7 +1971,7 @@ BUS_REQUEST *hifAllocateBusRequest(HIF_DEVICE *device) device->s_busRequestFreeQueue = busrequest->next; } /* Release lock */ - spin_unlock_irqrestore(&device->lock, flag); + adf_os_spin_unlock_irqrestore(&device->lock); if (adf_os_unlikely(!busrequest) && dynamic_busreq) { AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, @@ -1997,13 +1989,11 @@ BUS_REQUEST *hifAllocateBusRequest(HIF_DEVICE *device) void hifFreeBusRequest(HIF_DEVICE *device, BUS_REQUEST *busrequest) { - unsigned long flag; - if (busrequest == NULL) return; //AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("AR6000: hifFreeBusRequest: 0x%pK\n", busrequest)); /* Acquire lock */ - spin_lock_irqsave(&device->lock, flag); + adf_os_spin_lock_irqsave(&device->lock); /* Insert first in list */ @@ -2012,7 +2002,7 @@ hifFreeBusRequest(HIF_DEVICE *device, BUS_REQUEST *busrequest) device->s_busRequestFreeQueue = busrequest; /* Release lock */ - spin_unlock_irqrestore(&device->lock, flag); + adf_os_spin_unlock_irqrestore(&device->lock); } static A_STATUS hifDisableFunc(HIF_DEVICE *device, struct sdio_func *func) @@ -2642,7 +2632,7 @@ addHifDevice(struct sdio_func *func) hifdevice->func = func; hifdevice->powerConfig = HIF_DEVICE_POWER_UP; hifdevice->DeviceState = HIF_DEVICE_STATE_ON; - spin_lock_init(&hifdevice->lock); + adf_os_spinlock_init(&hifdevice->lock); if (dynamic_busreq) { for (count = 0; count < BUS_REQUEST_MAX_NUM; count++) { diff --git a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif_scatter.c b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif_scatter.c index 978a8b6972f2..e9b3c0c3daba 100644 --- a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif_scatter.c +++ b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif_scatter.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -33,6 +33,7 @@ #include <linux/kthread.h> #include "hif_internal.h" #include <adf_os_mem.h> +#include <adf_os_lock.h> #define ATH_MODULE_NAME hif #include "a_debug.h" @@ -54,26 +55,23 @@ static void FreeScatterReq(HIF_DEVICE *device, HIF_SCATTER_REQ *pReq) { - unsigned long flag; - - spin_lock_irqsave(&device->lock, flag); + adf_os_spin_lock_irqsave(&device->lock); DL_ListInsertTail(&device->ScatterReqHead, &pReq->ListLink); - spin_unlock_irqrestore(&device->lock, flag); + adf_os_spin_unlock_irqrestore(&device->lock); } static HIF_SCATTER_REQ *AllocScatterReq(HIF_DEVICE *device) { DL_LIST *pItem; - unsigned long flag; - spin_lock_irqsave(&device->lock, flag); + adf_os_spin_lock_irqsave(&device->lock); pItem = DL_ListRemoveItemFromHead(&device->ScatterReqHead); - spin_unlock_irqrestore(&device->lock, flag); + adf_os_spin_unlock_irqrestore(&device->lock); if (pItem != NULL) { return A_CONTAINING_STRUCT(pItem, HIF_SCATTER_REQ, ListLink); diff --git a/CORE/SERVICES/HTC/htc_send.c b/CORE/SERVICES/HTC/htc_send.c index d231ce509bc1..d3855a4f8fc1 100644 --- a/CORE/SERVICES/HTC/htc_send.c +++ b/CORE/SERVICES/HTC/htc_send.c @@ -685,10 +685,12 @@ static A_STATUS HTCIssuePackets(HTC_TARGET *target, target->CE_send_cnt--; pEndpoint->ul_outstanding_cnt--; HTC_PACKET_REMOVE(&pEndpoint->TxLookupQueue,pPacket); - /* reclaim credits */ - pEndpoint->TxCredits += pPacket->PktInfo.AsTx.CreditsUsed; - /* put it back into the callers queue */ + /* put it back into the callers queue */ HTC_PACKET_ENQUEUE_TO_HEAD(pPktQueue,pPacket); + /* reclaim credits */ + HTC_PACKET_QUEUE_ITERATE_ALLOW_REMOVE(pPktQueue, pPacket) { + pEndpoint->TxCredits += pPacket->PktInfo.AsTx.CreditsUsed; + } HTC_PACKET_QUEUE_ITERATE_END; UNLOCK_HTC_TX(target); break; } diff --git a/CORE/SERVICES/WMA/regdomain.h b/CORE/SERVICES/WMA/regdomain.h index c8b113dede81..13358f2915b5 100644 --- a/CORE/SERVICES/WMA/regdomain.h +++ b/CORE/SERVICES/WMA/regdomain.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2011, 2014-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -1001,6 +1001,7 @@ enum CountryCode { CTRY_MONACO = 492, /* Principality of Monaco */ CTRY_MONGOLIA = 496, CTRY_MOROCCO = 504, /* Morocco */ + CTRY_MYANMAR = 104, /* Myanmar*/ CTRY_NAMIBIA = 516, CTRY_NEPAL = 524, /* Nepal */ CTRY_NETHERLANDS = 528, /* Netherlands */ diff --git a/CORE/SERVICES/WMA/regdomain_common.h b/CORE/SERVICES/WMA/regdomain_common.h index 1dddcd6777ff..955284e267f6 100644 --- a/CORE/SERVICES/WMA/regdomain_common.h +++ b/CORE/SERVICES/WMA/regdomain_common.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014-2016 2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2011, 2014-2016 2018-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -128,6 +128,7 @@ enum EnumRd { ETSI9_WORLD = 0x3E, /* Ukraine */ ETSI13_WORLD = 0x27, ETSI14_WORLD = 0x29, + ETSI15_WORLD = 0x31, ETSI_RESERVED = 0x33, /* Reserved (Do not used) */ MKK1_MKKA = 0x40, /* Japan (JP1) */ @@ -163,6 +164,7 @@ enum EnumRd { APL17_ETSID = 0xE0, APL14_WORLD = 0x57, APL15_WORLD = 0x59, + APL19_ETSIC = 0x71, APL20_WORLD = 0xE5, APL23_WORLD = 0xE3, @@ -275,6 +277,7 @@ enum EnumRd { APL14 = 0x1180, APL15 = 0x1190, APL17 = 0x1210, + APL19 = 0x1240, APL20 = 0x1250, APL23 = 0x1280, @@ -292,6 +295,7 @@ enum EnumRd { ETSID = 0x0F30, ETSI13 = 0x0E39, ETSI14 = 0x0E40, + ETSI15 = 0x0E41, FCC1 = 0x0110, /* US & others */ FCC2 = 0x0120, /* Canada, Australia & New Zealand */ @@ -412,6 +416,7 @@ static const REG_DMN_PAIR_MAPPING ahCmnRegDomainPairs[] = { {APL12_WORLD, APL12, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, {APL14_WORLD, APL14, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, {APL15_WORLD, APL15, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, + {APL19_ETSIC, APL19, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, {APL20_WORLD, APL20, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, {APL23_WORLD, APL23, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, {APL17_ETSID, APL17, ETSID, NO_REQ, NO_REQ, PSCAN_DEFER, 0 }, @@ -587,7 +592,7 @@ static const COUNTRY_CODE_TO_ENUM_RD ahCmnAllCountries[] = { {CTRY_HONG_KONG, FCC3_WORLD, "HK", "HONG KONG", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_HUNGARY, ETSI13_WORLD, "HU", "HUNGARY", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_ICELAND, ETSI13_WORLD, "IS", "ICELAND", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, - {CTRY_INDIA, APL15_WORLD, "IN", "INDIA", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, + {CTRY_INDIA, APL19_ETSIC, "IN", "INDIA", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_INDONESIA, APL2_ETSIC, "ID", "INDONESIA", YES, YES, YES, YES, YES, YES, NO, NO, 7000 }, {CTRY_IRAQ, ETSI1_WORLD, "IQ", "IRAQ", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_IRELAND, ETSI13_WORLD, "IE", "IRELAND", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, @@ -624,6 +629,7 @@ static const COUNTRY_CODE_TO_ENUM_RD ahCmnAllCountries[] = { {CTRY_MONGOLIA, FCC3_WORLD, "MN", "MONGOLIA", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_MONTENEGRO, ETSI13_WORLD, "ME", "MONTENEGRO", YES, NO, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_MOROCCO, ETSI3_WORLD, "MA", "MOROCCO", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, + {CTRY_MYANMAR, APL1_WORLD, "MM", "MYANMAR", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_NAMIBIA, APL20_WORLD, "NA", "NAMIBIA", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_NEPAL, APL23_WORLD, "NP", "NEPAL", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_NETHERLANDS, ETSI13_WORLD, "NL", "NETHERLANDS", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, @@ -656,7 +662,7 @@ static const COUNTRY_CODE_TO_ENUM_RD ahCmnAllCountries[] = { {CTRY_SAINT_PIERRE_AND_MIQUELON, ETSI13_WORLD, "PM", "SAINT PIERRE AND MIQUELON", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_SAINT_VINCENT_AND_THE_GRENADIENS, ETSI13_WORLD, "VC", "VINCENT AND THE GRENADIENS", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_SAMOA, ETSI1_WORLD, "WS", "SAMOA", YES, YES, YES, YES, YES, YES, YES, NO, 7000 }, - {CTRY_SAUDI_ARABIA, ETSI1_WORLD, "SA", "SAUDI ARABIA", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, + {CTRY_SAUDI_ARABIA, ETSI15_WORLD, "SA", "SAUDI ARABIA", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_SENEGAL, FCC13_WORLD, "SN", "SENEGAL", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_SERBIA, ETSI13_WORLD, "RS", "REPUBLIC OF SERBIA", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, {CTRY_SINGAPORE, FCC3_WORLD, "SG", "SINGAPORE", YES, YES, YES, YES, YES, YES, YES, YES, 7000 }, @@ -1348,6 +1354,14 @@ static const REG_DOMAIN ahCmnRegDomains[] = { BMZERO, BMZERO }, + {APL19, FCC, DFS_ETSI, PSCAN_ETSI, NO_REQ, + BMNOTZERO, + BMNOTZERO, + BMNOTZERO, + BMZERO, + BMZERO, + BMZERO + }, {APL20, ETSI, DFS_ETSI, PSCAN_ETSI, NO_REQ, BMNOTZERO, @@ -1457,6 +1471,15 @@ static const REG_DOMAIN ahCmnRegDomains[] = { BMZERO }, + {ETSI15, ETSI, DFS_ETSI, PSCAN_ETSI, NO_REQ, + BMNOTZERO, + BMNOTZERO, + BMNOTZERO, + BMZERO, + BMZERO, + BMZERO + }, + {FCC1, FCC, NO_DFS, NO_PSCAN, NO_REQ, BM(F2_5180_5240, F4_5260_5320, F5_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1), BM(T6_5210_5210, T2_5250_5290, T6_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1), diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index f7f65c490225..06bad7751882 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -24731,6 +24731,11 @@ static int wma_wow_wakeup_host_event(void *handle, u_int8_t *event, vos_event_set(&wma->wma_resume_event); if (param_buf->wow_packet_buffer) { + if (param_buf->num_wow_packet_buffer <= 4) { + WMA_LOGE("Invalid wow packet buffer from firmware %u", + param_buf->num_wow_packet_buffer); + return -EINVAL; + } wow_buf_pkt_len = *(uint32_t *)param_buf->wow_packet_buffer; if (wow_buf_pkt_len > (param_buf->num_wow_packet_buffer - 4)) { WMA_LOGE("Invalid wow buf pkt len from firmware, wow_buf_pkt_len: %u, num_wow_packet_buffer: %u", @@ -27917,6 +27922,10 @@ static int wma_set_base_macaddr_indicate(tp_wma_handle wma_handle, WMA_LOGD("Base MAC Addr: "MAC_ADDRESS_STR, MAC_ADDR_ARRAY((*customAddr))); + /* update the mac addr, because wlan_mac.bin changes it */ + vos_mem_copy(wma_handle->myaddr, customAddr, sizeof(tSirMacAddr)); + vos_mem_copy(wma_handle->hwaddr, customAddr, sizeof(tSirMacAddr)); + return 0; } diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c index 2afe8131717c..f83b9fa285af 100644 --- a/CORE/SME/src/sme_common/sme_Api.c +++ b/CORE/SME/src/sme_common/sme_Api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -2344,6 +2344,9 @@ eHalStatus sme_handle_update_pwr_ind(tHalHandle hal_ptr, uint32_t pesession_id) peFindSessionBySessionId(mac_ptr, pesession_id); tPowerdBm regMax = 0,maxTxPower = 0; + if (pesession_ptr == NULL) + return eHAL_STATUS_FAILURE; + regMax = cfgGetRegulatoryMaxTransmitPower(mac_ptr, pesession_ptr->currentOperChannel); diff --git a/CORE/SVC/external/wlan_nlink_common.h b/CORE/SVC/external/wlan_nlink_common.h index fdec9d2fb8ba..d1248b0f4ae4 100644 --- a/CORE/SVC/external/wlan_nlink_common.h +++ b/CORE/SVC/external/wlan_nlink_common.h @@ -106,6 +106,14 @@ */ #define WLAN_SVC_SSR_FAIL_IND 0x110 +/* + * DO NOT USE, reserved for customization, + * in order for customers to report customized status, + * range required is from 0x900 - 0x90F. + */ +#define WLAN_SVC_USER_CUSTOMIZED_1_IND 0x900 +#define WLAN_SVC_USER_CUSTOMIZED_16_IND 0x90F + #define WLAN_SVC_MAX_SSID_LEN 32 #define WLAN_SVC_MAX_BSSID_LEN 6 #define WLAN_SVC_MAX_STR_LEN 16 diff --git a/CORE/SVC/src/logging/wlan_logging_sock_svc.c b/CORE/SVC/src/logging/wlan_logging_sock_svc.c index ff1fca24b368..51a9a0812c0a 100644 --- a/CORE/SVC/src/logging/wlan_logging_sock_svc.c +++ b/CORE/SVC/src/logging/wlan_logging_sock_svc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -142,7 +142,7 @@ struct wlan_logging { /* Number of buffers to be used for logging */ int num_buf; /* Lock to synchronize access to shared logging resource */ - spinlock_t spin_lock; + adf_os_spinlock_t spin_lock; /* Holds the free node which can be used for filling logs */ struct list_head free_list; /* Holds the filled nodes which needs to be indicated to APP */ @@ -170,7 +170,7 @@ struct wlan_logging { struct list_head pkt_stat_filled_list; struct pkt_stats_msg *pkt_stats_pcur_node; unsigned int pkt_stat_drop_cnt; - spinlock_t pkt_stats_lock; + adf_os_spinlock_t pkt_stats_lock; unsigned int pkt_stats_msg_idx; }; @@ -282,7 +282,6 @@ int wlan_log_to_user(VOS_TRACE_LEVEL log_level, char *to_be_sent, int length) int total_log_len; unsigned int *pfilled_length; bool wake_up_thread = false; - unsigned long flags; struct timeval tv; struct rtc_time tm; unsigned long local_time; @@ -323,10 +322,10 @@ int wlan_log_to_user(VOS_TRACE_LEVEL log_level, char *to_be_sent, int length) /* 1+1 indicate '\n'+'\0' */ total_log_len = length + tlen + 1 + 1; - spin_lock_irqsave(&gwlan_logging.spin_lock, flags); + adf_os_spin_lock_irqsave(&gwlan_logging.spin_lock); // wlan logging svc resources are not yet initialized if (!gwlan_logging.pcur_node) { - spin_unlock_irqrestore(&gwlan_logging.spin_lock, flags); + adf_os_spin_unlock_irqrestore(&gwlan_logging.spin_lock); return -EIO; } @@ -367,7 +366,7 @@ int wlan_log_to_user(VOS_TRACE_LEVEL log_level, char *to_be_sent, int length) ptr[*pfilled_length] = '\n'; *pfilled_length += 1; - spin_unlock_irqrestore(&gwlan_logging.spin_lock, flags); + adf_os_spin_unlock_irqrestore(&gwlan_logging.spin_lock); /* Wakeup logger thread */ if ((true == wake_up_thread)) { @@ -503,7 +502,6 @@ int pktlog_send_per_pkt_stats_to_user(void) { int ret = -1; struct pkt_stats_msg *pstats_msg; - unsigned long flags; struct sk_buff *skb_new = NULL; static int rate_limit; bool free_old_skb = false; @@ -522,12 +520,12 @@ int pktlog_send_per_pkt_stats_to_user(void) break; } - spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, flags); + adf_os_spin_lock_irqsave(&gwlan_logging.pkt_stats_lock); pstats_msg = (struct pkt_stats_msg *) (gwlan_logging.pkt_stat_filled_list.next); list_del_init(gwlan_logging.pkt_stat_filled_list.next); - spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, flags); + adf_os_spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock); ret = pkt_stats_fill_headers(pstats_msg->skb); if (ret < 0) { @@ -552,11 +550,11 @@ err: if (free_old_skb) dev_kfree_skb(pstats_msg->skb); - spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, flags); + adf_os_spin_lock_irqsave(&gwlan_logging.pkt_stats_lock); pstats_msg->skb = skb_new; list_add_tail(&pstats_msg->node, &gwlan_logging.pkt_stat_free_list); - spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, flags); + adf_os_spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock); ret = 0; } @@ -574,7 +572,6 @@ static int send_filled_buffers_to_user(void) struct sk_buff *skb = NULL; struct nlmsghdr *nlh; static int nlmsg_seq; - unsigned long flags; static int rate_limit; while (!list_empty(&gwlan_logging.filled_list) @@ -593,12 +590,12 @@ static int send_filled_buffers_to_user(void) } rate_limit = 0; - spin_lock_irqsave(&gwlan_logging.spin_lock, flags); + adf_os_spin_lock_irqsave(&gwlan_logging.spin_lock); plog_msg = (struct log_msg *) (gwlan_logging.filled_list.next); list_del_init(gwlan_logging.filled_list.next); - spin_unlock_irqrestore(&gwlan_logging.spin_lock, flags); + adf_os_spin_unlock_irqrestore(&gwlan_logging.spin_lock); /* 4 extra bytes for the radio idx */ payload_len = plog_msg->filled_length + sizeof(wnl->radio) + sizeof(tAniHdr); @@ -608,11 +605,10 @@ static int send_filled_buffers_to_user(void) ANI_NL_MSG_LOG, payload_len, NLM_F_REQUEST); if (NULL == nlh) { - spin_lock_irqsave(&gwlan_logging.spin_lock, flags); + adf_os_spin_lock_irqsave(&gwlan_logging.spin_lock); list_add_tail(&plog_msg->node, &gwlan_logging.free_list); - spin_unlock_irqrestore(&gwlan_logging.spin_lock, - flags); + adf_os_spin_unlock_irqrestore(&gwlan_logging.spin_lock); pr_err("%s: drop_count = %u\n", __func__, ++gwlan_logging.drop_count); pr_err("%s: nlmsg_put() failed for msg size[%d]\n", @@ -629,10 +625,10 @@ static int send_filled_buffers_to_user(void) plog_msg->filled_length + sizeof(tAniHdr)); - spin_lock_irqsave(&gwlan_logging.spin_lock, flags); + adf_os_spin_lock_irqsave(&gwlan_logging.spin_lock); list_add_tail(&plog_msg->node, &gwlan_logging.free_list); - spin_unlock_irqrestore(&gwlan_logging.spin_lock, flags); + adf_os_spin_unlock_irqrestore(&gwlan_logging.spin_lock); ret = nl_srv_bcast_host_logs(skb); /* print every 64th drop count */ @@ -709,7 +705,6 @@ static int wlan_logging_thread(void *Arg) { int ret_wait_status = 0; int ret = 0; - unsigned long flags; set_user_nice(current, -2); @@ -771,11 +766,9 @@ static int wlan_logging_thread(void *Arg) } else { gwlan_logging.is_flush_complete = true; /* Flush all current host logs*/ - spin_lock_irqsave(&gwlan_logging.spin_lock, - flags); + adf_os_spin_lock_irqsave(&gwlan_logging.spin_lock); wlan_queue_logmsg_for_app(); - spin_unlock_irqrestore(&gwlan_logging.spin_lock, - flags); + adf_os_spin_unlock_irqrestore(&gwlan_logging.spin_lock); set_bit(HOST_LOG_DRIVER_MSG, &gwlan_logging.eventFlag); set_bit(HOST_LOG_PER_PKT_STATS, @@ -798,7 +791,6 @@ static int wlan_logging_thread(void *Arg) int wlan_logging_sock_activate_svc(int log_fe_to_console, int num_buf) { int i, j, pkt_stats_size; - unsigned long irq_flag; gplog_msg = (struct log_msg *) vmalloc( num_buf * sizeof(struct log_msg)); @@ -812,7 +804,7 @@ int wlan_logging_sock_activate_svc(int log_fe_to_console, int num_buf) gwlan_logging.log_fe_to_console = !!log_fe_to_console; gwlan_logging.num_buf = num_buf; - spin_lock_irqsave(&gwlan_logging.spin_lock, irq_flag); + adf_os_spin_lock_irqsave(&gwlan_logging.spin_lock); INIT_LIST_HEAD(&gwlan_logging.free_list); INIT_LIST_HEAD(&gwlan_logging.filled_list); @@ -823,7 +815,7 @@ int wlan_logging_sock_activate_svc(int log_fe_to_console, int num_buf) gwlan_logging.pcur_node = (struct log_msg *) (gwlan_logging.free_list.next); list_del_init(gwlan_logging.free_list.next); - spin_unlock_irqrestore(&gwlan_logging.spin_lock, irq_flag); + adf_os_spin_unlock_irqrestore(&gwlan_logging.spin_lock); /* Initialize the pktStats data structure here */ pkt_stats_size = sizeof(struct pkt_stats_msg); @@ -836,11 +828,11 @@ int wlan_logging_sock_activate_svc(int log_fe_to_console, int num_buf) vos_mem_zero(gpkt_stats_buffers, MAX_PKTSTATS_BUFF * pkt_stats_size); - spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, irq_flag); + adf_os_spin_lock_irqsave(&gwlan_logging.pkt_stats_lock); gwlan_logging.pkt_stats_msg_idx = 0; INIT_LIST_HEAD(&gwlan_logging.pkt_stat_free_list); INIT_LIST_HEAD(&gwlan_logging.pkt_stat_filled_list); - spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, irq_flag); + adf_os_spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock); for (i = 0; i < MAX_PKTSTATS_BUFF; i++) { @@ -853,16 +845,16 @@ int wlan_logging_sock_activate_svc(int log_fe_to_console, int num_buf) } goto err2; } - spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, irq_flag); + adf_os_spin_lock_irqsave(&gwlan_logging.pkt_stats_lock); list_add(&gpkt_stats_buffers[i].node, &gwlan_logging.pkt_stat_free_list); - spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, irq_flag); + adf_os_spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock); } - spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, irq_flag); + adf_os_spin_lock_irqsave(&gwlan_logging.pkt_stats_lock); gwlan_logging.pkt_stats_pcur_node = (struct pkt_stats_msg *) (gwlan_logging.pkt_stat_free_list.next); list_del_init(gwlan_logging.pkt_stat_free_list.next); - spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, irq_flag); + adf_os_spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock); /* Pkt Stats intialization done */ init_waitqueue_head(&gwlan_logging.wait_queue); @@ -890,15 +882,15 @@ err3: dev_kfree_skb(gpkt_stats_buffers[i].skb); } err2: - spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, irq_flag); + adf_os_spin_lock_irqsave(&gwlan_logging.pkt_stats_lock); gwlan_logging.pkt_stats_pcur_node = NULL; - spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, irq_flag); + adf_os_spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock); vfree(gpkt_stats_buffers); gpkt_stats_buffers = NULL; err1: - spin_lock_irqsave(&gwlan_logging.spin_lock, irq_flag); + adf_os_spin_lock_irqsave(&gwlan_logging.spin_lock); gwlan_logging.pcur_node = NULL; - spin_unlock_irqrestore(&gwlan_logging.spin_lock, irq_flag); + adf_os_spin_unlock_irqrestore(&gwlan_logging.spin_lock); vfree(gplog_msg); gplog_msg = NULL; return -ENOMEM; @@ -906,7 +898,6 @@ err1: int wlan_logging_sock_deactivate_svc(void) { - unsigned long irq_flag; int i = 0; if (!gplog_msg) return 0; @@ -924,13 +915,13 @@ int wlan_logging_sock_deactivate_svc(void) wake_up_interruptible(&gwlan_logging.wait_queue); wait_for_completion(&gwlan_logging.shutdown_comp); - spin_lock_irqsave(&gwlan_logging.spin_lock, irq_flag); + adf_os_spin_lock_irqsave(&gwlan_logging.spin_lock); gwlan_logging.pcur_node = NULL; - spin_unlock_irqrestore(&gwlan_logging.spin_lock, irq_flag); + adf_os_spin_unlock_irqrestore(&gwlan_logging.spin_lock); vfree(gplog_msg); gplog_msg = NULL; - spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, irq_flag); + adf_os_spin_lock_irqsave(&gwlan_logging.pkt_stats_lock); gwlan_logging.pkt_stats_pcur_node = NULL; gwlan_logging.pkt_stats_msg_idx = 0; gwlan_logging.pkt_stat_drop_cnt = 0; @@ -938,7 +929,7 @@ int wlan_logging_sock_deactivate_svc(void) if (gpkt_stats_buffers[i].skb) dev_kfree_skb(gpkt_stats_buffers[i].skb); } - spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, irq_flag); + adf_os_spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock); vfree(gpkt_stats_buffers); gpkt_stats_buffers = NULL; @@ -948,8 +939,8 @@ int wlan_logging_sock_deactivate_svc(void) int wlan_logging_sock_init_svc(void) { - spin_lock_init(&gwlan_logging.spin_lock); - spin_lock_init(&gwlan_logging.pkt_stats_lock); + adf_os_spinlock_init(&gwlan_logging.spin_lock); + adf_os_spinlock_init(&gwlan_logging.pkt_stats_lock); gwlan_logging.pcur_node = NULL; gwlan_logging.pkt_stats_pcur_node = NULL; return 0; @@ -1074,7 +1065,6 @@ void wlan_pkt_stats_to_logger_thread(void *pl_hdr, void *pkt_dump, void *data) struct packet_dump *pkt_stats_dump; int total_stats_len = 0; bool wake_up_thread = false; - unsigned long flags; struct sk_buff *ptr; int hdr_size; @@ -1089,10 +1079,10 @@ void wlan_pkt_stats_to_logger_thread(void *pl_hdr, void *pkt_dump, void *data) total_stats_len = sizeof(struct ath_pktlog_hdr) + pktlog_hdr->size; - spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, flags); + adf_os_spin_lock_irqsave(&gwlan_logging.pkt_stats_lock); if (!gwlan_logging.pkt_stats_pcur_node) { - spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, flags); + adf_os_spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock); return; } @@ -1130,7 +1120,7 @@ void wlan_pkt_stats_to_logger_thread(void *pl_hdr, void *pkt_dump, void *data) wlan_get_pkt_stats_free_node(); } - spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, flags); + adf_os_spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock); /* Wakeup logger thread */ if (true == wake_up_thread) { @@ -1384,14 +1374,12 @@ void wlan_register_txrx_packetdump(void) */ void wlan_flush_host_logs_for_fatal(void) { - unsigned long flags; - if (vos_is_log_report_in_progress()) { pr_info("%s:flush all host logs Setting HOST_LOG_POST_MASK\n", __func__); - spin_lock_irqsave(&gwlan_logging.spin_lock, flags); + adf_os_spin_lock_irqsave(&gwlan_logging.spin_lock); wlan_queue_logmsg_for_app(); - spin_unlock_irqrestore(&gwlan_logging.spin_lock, flags); + adf_os_spin_unlock_irqrestore(&gwlan_logging.spin_lock); set_bit(HOST_LOG_DRIVER_MSG, &gwlan_logging.eventFlag); wake_up_interruptible(&gwlan_logging.wait_queue); } diff --git a/CORE/SYS/legacy/src/utils/src/dot11f.c b/CORE/SYS/legacy/src/utils/src/dot11f.c index 37f8a7f5d52c..f721294c861d 100644 --- a/CORE/SYS/legacy/src/utils/src/dot11f.c +++ b/CORE/SYS/legacy/src/utils/src/dot11f.c @@ -30,7 +30,7 @@ * \brief Structures, functions & definitions for * working with 802.11 Frames * This file was automatically generated by 'framesc' - * Fri Aug 31 18:54:55 2018 from the following file(s): + * Mon Dec 3 16:47:12 2018 from the following file(s): * * dot11f.frms * @@ -22126,16 +22126,13 @@ static tANI_U32 UnpackCore(tpAniSirGlobal pCtx, if (pIe) { - if ((nBufRemaining < pIe->minSize - pIe->noui - 2U) || - (len < pIe->minSize - pIe->noui - 2U)) + if ((nBufRemaining < pIe->minSize - pIe->noui - 2U)) { - FRAMES_LOG4(pCtx, FRLOGW, FRFL("The IE %s must " + FRAMES_LOG3(pCtx, FRLOGW, FRFL("The IE %s must " "be at least %d bytes in size, but " "there are only %d bytes remaining in " - "this frame or the IE reports a size " - "of %d bytes.\n"), - pIe->name, pIe->minSize, nBufRemaining, - (len + pIe->noui + 2U)); + "this frame.\n"), + pIe->name, pIe->minSize, nBufRemaining); FRAMES_DUMP(pCtx, FRLOG1, pBuf, nBuf); status |= DOT11F_INCOMPLETE_IE; FRAMES_DBG_BREAK(); @@ -22143,6 +22140,14 @@ static tANI_U32 UnpackCore(tpAniSirGlobal pCtx, } else { + if (len < pIe->minSize - pIe->noui - 2U) { + FRAMES_LOG3(pCtx, FRLOGW, FRFL("The IE %s must " + "be at least %d bytes in size, but " + "there are only %d bytes in the IE\n"), + pIe->name, pIe->minSize, (len + pIe->noui + 2U)); + goto skip_ie; + } + if (len > pIe->maxSize - pIe->noui - 2U){ FRAMES_LOG1(pCtx, FRLOGW, FRFL("The IE %s reports " "an unexpectedly large size; it is presumably " @@ -22155,7 +22160,7 @@ static tANI_U32 UnpackCore(tpAniSirGlobal pCtx, countOffset = ( (0 != pIe->arraybound) * ( *(tANI_U16* )(pFrm + pIe->countOffset))); if (0 != pIe->arraybound && countOffset >= pIe->arraybound) { status |= DOT11F_DUPLICATE_IE; - goto skip_dup_ie; + goto skip_ie; } switch (pIe->sig) { @@ -22629,7 +22634,7 @@ static tANI_U32 UnpackCore(tpAniSirGlobal pCtx, status |= DOT11F_UNKNOWN_IES; } -skip_dup_ie: +skip_ie: pBufRemaining += len; if (len > nBufRemaining) diff --git a/CORE/SYS/legacy/src/utils/src/macTrace.c b/CORE/SYS/legacy/src/utils/src/macTrace.c index a4aef9779aaf..e4cf1cd09f0f 100644 --- a/CORE/SYS/legacy/src/utils/src/macTrace.c +++ b/CORE/SYS/legacy/src/utils/src/macTrace.c @@ -666,7 +666,6 @@ tANI_U8* macTraceGetWdaMsgString(tANI_U16 wdaMsg) CASE_RETURN_STRING(WDA_UPDATE_STARATEINFO_RSP); CASE_RETURN_STRING(WDA_UPDATE_BEACON_IND); - CASE_RETURN_STRING(WDA_UPDATE_CF_IND); CASE_RETURN_STRING(WDA_CHNL_SWITCH_REQ); CASE_RETURN_STRING(WDA_ADD_TS_REQ); CASE_RETURN_STRING(WDA_DEL_TS_REQ); diff --git a/CORE/UTILS/FWLOG/dbglog_host.c b/CORE/UTILS/FWLOG/dbglog_host.c index f6a410924203..842c4aab66cc 100644 --- a/CORE/UTILS/FWLOG/dbglog_host.c +++ b/CORE/UTILS/FWLOG/dbglog_host.c @@ -190,6 +190,8 @@ const char *dbglog_get_module_str(A_UINT32 module_id) return "NAN20"; case WLAN_MODULE_QBOOST: return "QBOOST"; + case WLAN_MODULE_HPCS_PULSE: + return "HPCS"; default: return "UNKNOWN"; } @@ -1628,6 +1630,68 @@ char * DBG_MSG_ARR[WLAN_MODULE_ID_MAX][MAX_DBG_MSGS] = DBG_STRING(WLAN_MODULE_QBOOST_DBGID_WLAN_PEER_NOT_FOUND), DBG_STRING(WLAN_MODULE_QBOOST_DEFINITION_END), }, + { + /* WLAN_MODULE_P2P_LISTEN_OFFLOAD */ + "" + }, + { + /* WLAN_MODULE_HALPHY */ + "" + }, + { + /* WAL_MODULE_ENQ */ + "" + }, + { + /* WLAN_MODULE_GNSS */ + "" + }, + { + /* WLAN_MODULE_WAL_MEM */ + "" + }, + { + /* WLAN_MODULE_SCHED_ALGO */ + "" + }, + { + /* WLAN_MODULE_TX */ + "" + }, + { + /* WLAN_MODULE_RX */ + "" + }, + { + /* WLAN_MODULE_WLM */ + "" + }, + { + /* WLAN_MODULE_RU_ALLOCATOR */ + "" + }, + { + /* WLAN_MODULE_11K_OFFLOAD */ + "" + }, + { + /* WLAN_MODULE_STA_TWT */ + "" + }, + { + /* WLAN_MODULE_AP_TWT */ + "" + }, + { + /* WLAN_MODULE_UL_OFDMA */ + "" + }, + { + DBG_STRING(HPCS_PULSE_START), + DBG_STRING(HPCS_PULSE_LF_TIMER), + DBG_STRING(HPCS_PULSE_HF_TIMER), + DBG_STRING(HPCS_PULSE_POWER_SAVE), + }, }; @@ -1977,7 +2041,7 @@ dbglog_debugfs_raw_data(wmi_unified_t wmi_handle, const u_int8_t *buf, A_UINT32 /* Need to pad each record to fixed length ATH6KL_FWLOG_PAYLOAD_SIZE */ memset(slot->payload + length, 0, ATH6KL_FWLOG_PAYLOAD_SIZE - length); - spin_lock(&fwlog->fwlog_queue.lock); + adf_os_raw_spin_lock(&fwlog->fwlog_queue.lock); __skb_queue_tail(&fwlog->fwlog_queue, skb); @@ -1990,7 +2054,7 @@ dbglog_debugfs_raw_data(wmi_unified_t wmi_handle, const u_int8_t *buf, A_UINT32 kfree_skb(skb); } - spin_unlock(&fwlog->fwlog_queue.lock); + adf_os_raw_spin_unlock(&fwlog->fwlog_queue.lock); return TRUE; } @@ -4298,13 +4362,13 @@ static ssize_t dbglog_block_read(struct file *file, if (!buf) return -ENOMEM; - spin_lock_bh(&fwlog->fwlog_queue.lock); + adf_os_raw_spin_lock_bh(&fwlog->fwlog_queue.lock); if (skb_queue_len(&fwlog->fwlog_queue) == 0) { /* we must init under queue lock */ init_completion(&fwlog->fwlog_completion); - spin_unlock_bh(&fwlog->fwlog_queue.lock); + adf_os_raw_spin_unlock_bh(&fwlog->fwlog_queue.lock); ret = wait_for_completion_interruptible( &fwlog->fwlog_completion); @@ -4313,7 +4377,7 @@ static ssize_t dbglog_block_read(struct file *file, return ret; } - spin_lock_bh(&fwlog->fwlog_queue.lock); + adf_os_raw_spin_lock_bh(&fwlog->fwlog_queue.lock); } while ((skb = __skb_dequeue(&fwlog->fwlog_queue))) { @@ -4329,7 +4393,7 @@ static ssize_t dbglog_block_read(struct file *file, kfree_skb(skb); } - spin_unlock_bh(&fwlog->fwlog_queue.lock); + adf_os_raw_spin_unlock_bh(&fwlog->fwlog_queue.lock); /* FIXME: what to do if len == 0? */ not_copied = copy_to_user(user_buf, buf, len); diff --git a/CORE/UTILS/PKTLOG/include/pktlog_ac.h b/CORE/UTILS/PKTLOG/include/pktlog_ac.h index 4e3d34a2f19a..a64a56dbb524 100644 --- a/CORE/UTILS/PKTLOG/include/pktlog_ac.h +++ b/CORE/UTILS/PKTLOG/include/pktlog_ac.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2013, 2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2013, 2016, 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -40,10 +40,10 @@ #define NO_REG_FUNCS 4 /* Locking interface for pktlog */ -#define PKTLOG_LOCK_INIT(_pl_info) spin_lock_init(&(_pl_info)->log_lock) +#define PKTLOG_LOCK_INIT(_pl_info) adf_os_spinlock_init(&(_pl_info)->log_lock) #define PKTLOG_LOCK_DESTROY(_pl_info) -#define PKTLOG_LOCK(_pl_info) spin_lock(&(_pl_info)->log_lock) -#define PKTLOG_UNLOCK(_pl_info) spin_unlock(&(_pl_info)->log_lock) +#define PKTLOG_LOCK(_pl_info) adf_os_spin_lock(&(_pl_info)->log_lock) +#define PKTLOG_UNLOCK(_pl_info) adf_os_spin_unlock(&(_pl_info)->log_lock) #define PKTLOG_MODE_SYSTEM 1 #define PKTLOG_MODE_ADAPTER 2 diff --git a/CORE/UTILS/PKTLOG/include/pktlog_ac_api.h b/CORE/UTILS/PKTLOG/include/pktlog_ac_api.h index 5fdc83c575b5..55afc1e6037e 100644 --- a/CORE/UTILS/PKTLOG/include/pktlog_ac_api.h +++ b/CORE/UTILS/PKTLOG/include/pktlog_ac_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -71,7 +71,7 @@ struct ath_pktlog_info { /* Size of buffer in bytes */ int32_t buf_size; - spinlock_t log_lock; + adf_os_spinlock_t log_lock; struct mutex pktlog_mutex; /* Threshold of TCP SACK packets for triggered stop */ int sack_thr; diff --git a/CORE/UTILS/PKTLOG/linux_ac.c b/CORE/UTILS/PKTLOG/linux_ac.c index ed6db1766188..0560288ac888 100644 --- a/CORE/UTILS/PKTLOG/linux_ac.c +++ b/CORE/UTILS/PKTLOG/linux_ac.c @@ -136,13 +136,13 @@ int pktlog_alloc_buf(struct ol_softc *scn) page_cnt = (sizeof(*(pl_info->buf)) + pl_info->buf_size) / PAGE_SIZE; - spin_lock_bh(&pl_info->log_lock); + adf_os_spin_lock_bh(&pl_info->log_lock); if(pl_info->buf != NULL) { printk("Buffer is already in use\n"); - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); return -EINVAL; } - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); if ((buffer = vmalloc((page_cnt + 2) * PAGE_SIZE)) == NULL) { printk(PKTLOG_TAG @@ -167,12 +167,12 @@ int pktlog_alloc_buf(struct ol_softc *scn) SetPageReserved(vpg); } - spin_lock_bh(&pl_info->log_lock); + adf_os_spin_lock_bh(&pl_info->log_lock); if(pl_info->buf != NULL) pktlog_release_buf(scn); pl_info->buf = buffer; - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); return 0; } @@ -574,10 +574,10 @@ static void pktlog_detach(struct ol_softc *scn) remove_proc_entry(WLANDEV_BASENAME, g_pktlog_pde); pktlog_sysctl_unregister(pl_dev); - spin_lock_bh(&pl_info->log_lock); + adf_os_spin_lock_bh(&pl_info->log_lock); if (pl_info->buf) pktlog_release_buf(scn); - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); pktlog_cleanup(pl_info); if (pl_dev) { @@ -630,14 +630,14 @@ pktlog_read_proc_entry(char *buf, size_t nbytes, loff_t *ppos, int fold_offset, ppos_data, cur_rd_offset, cur_wr_offset; struct ath_pktlog_buf *log_buf; - spin_lock_bh(&pl_info->log_lock); + adf_os_spin_lock_bh(&pl_info->log_lock); log_buf = pl_info->buf; *read_complete = false; if (log_buf == NULL) { *read_complete = true; - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); return 0; } @@ -754,7 +754,7 @@ rd_done: *read_complete = true; } } - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); return ret_val; } @@ -776,11 +776,11 @@ __pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos) #endif struct ath_pktlog_buf *log_buf; - spin_lock_bh(&pl_info->log_lock); + adf_os_spin_lock_bh(&pl_info->log_lock); log_buf = pl_info->buf; if (log_buf == NULL) { - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); return 0; } @@ -797,13 +797,13 @@ __pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos) if (*ppos < bufhdr_size) { count = MIN((bufhdr_size - *ppos), rem_len); - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); if (copy_to_user(buf, ((char *)&log_buf->bufhdr) + *ppos, count)) return -EFAULT; rem_len -= count; ret_val += count; - spin_lock_bh(&pl_info->log_lock); + adf_os_spin_lock_bh(&pl_info->log_lock); } start_offset = log_buf->rd_offset; @@ -845,25 +845,25 @@ __pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos) goto rd_done; count = MIN(rem_len, (end_offset - ppos_data + 1)); - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); if (copy_to_user(buf + ret_val, log_buf->log_data + ppos_data, count)) return -EFAULT; ret_val += count; rem_len -= count; - spin_lock_bh(&pl_info->log_lock); + adf_os_spin_lock_bh(&pl_info->log_lock); } else { if (ppos_data <= fold_offset) { count = MIN(rem_len, (fold_offset - ppos_data + 1)); - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); if (copy_to_user(buf + ret_val, log_buf->log_data + ppos_data, count)) return -EFAULT; ret_val += count; rem_len -= count; - spin_lock_bh(&pl_info->log_lock); + adf_os_spin_lock_bh(&pl_info->log_lock); } if (rem_len == 0) @@ -875,14 +875,14 @@ __pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos) if (ppos_data <= end_offset) { count = MIN(rem_len, (end_offset - ppos_data + 1)); - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); if (copy_to_user(buf + ret_val, log_buf->log_data + ppos_data, count)) return -EFAULT; ret_val += count; rem_len -= count; - spin_lock_bh(&pl_info->log_lock); + adf_os_spin_lock_bh(&pl_info->log_lock); } } @@ -893,7 +893,7 @@ rd_done: } *ppos += ret_val; - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); return ret_val; } diff --git a/CORE/UTILS/PKTLOG/pktlog_ac.c b/CORE/UTILS/PKTLOG/pktlog_ac.c index 9141a2ba85ae..2f2ba4e1b4eb 100644 --- a/CORE/UTILS/PKTLOG/pktlog_ac.c +++ b/CORE/UTILS/PKTLOG/pktlog_ac.c @@ -351,7 +351,7 @@ __pktlog_enable(struct ol_softc *scn, int32_t log_state) } } - spin_lock_bh(&pl_info->log_lock); + adf_os_spin_lock_bh(&pl_info->log_lock); pl_info->buf->bufhdr.version = CUR_PKTLOG_VER; pl_info->buf->bufhdr.magic_num = PKTLOG_MAGIC_NUM; pl_info->buf->wr_offset = 0; @@ -360,7 +360,7 @@ __pktlog_enable(struct ol_softc *scn, int32_t log_state) pl_info->buf->bytes_written = 0; pl_info->buf->msg_index = 1; pl_info->buf->offset = PKTLOG_READ_OFFSET; - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); pl_info->start_time_thruput = OS_GET_TIMESTAMP(); pl_info->start_time_per = pl_info->start_time_thruput; @@ -450,13 +450,13 @@ __pktlog_setsize(struct ol_softc *scn, int32_t size) return -EINVAL; } - spin_lock_bh(&pl_info->log_lock); + adf_os_spin_lock_bh(&pl_info->log_lock); if (pl_info->buf != NULL) pktlog_release_buf(scn); if (size != 0) pl_info->buf_size = size; - spin_unlock_bh(&pl_info->log_lock); + adf_os_spin_unlock_bh(&pl_info->log_lock); return 0; } diff --git a/CORE/VOSS/inc/i_vos_list.h b/CORE/VOSS/inc/i_vos_list.h index 119531c78c3a..0e23e82805d9 100644 --- a/CORE/VOSS/inc/i_vos_list.h +++ b/CORE/VOSS/inc/i_vos_list.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2014, 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -73,4 +73,10 @@ typedef struct list_head vos_list_node_t; } #endif /* __cplusplus */ +#define __VOS_LIST_NODE_INIT(prev_node, next_node) \ + { .prev = &(prev_node), .next = &(next_node), } +#define __VOS_LIST_NODE_INIT_SINGLE(node) \ + __VOS_LIST_NODE_INIT(node, node) +#define __VOS_LIST_ANCHOR(list) ((list).anchor) + #endif // __I_VOS_LIST_H diff --git a/CORE/VOSS/inc/i_vos_timer.h b/CORE/VOSS/inc/i_vos_timer.h index f96efc2d2672..af63928deaa5 100644 --- a/CORE/VOSS/inc/i_vos_timer.h +++ b/CORE/VOSS/inc/i_vos_timer.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2014 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -46,6 +46,7 @@ #include <linux/timer.h> #include <linux/time.h> #include <linux/jiffies.h> +#include <adf_os_lock.h> /*-------------------------------------------------------------------------- Preprocessor definitions and constants @@ -63,7 +64,7 @@ typedef struct vos_timer_platform_s struct timer_list Timer; int threadID; v_U32_t cookie; - spinlock_t spinlock; + adf_os_spinlock_t spinlock; } vos_timer_platform_t; diff --git a/CORE/VOSS/inc/vos_list.h b/CORE/VOSS/inc/vos_list.h index 98893c8adfd3..1bd3d81c658c 100644 --- a/CORE/VOSS/inc/vos_list.h +++ b/CORE/VOSS/inc/vos_list.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2014, 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -252,6 +252,21 @@ VOS_STATUS vos_list_insert_front( vos_list_t *pList, vos_list_node_t *pNode ); --------------------------------------------------------------------------*/ VOS_STATUS vos_list_insert_back( vos_list_t *pList, vos_list_node_t *pNode ); +/** + * vos_list_insert_back_no_mutex() - insert node at back of a linked list + * @pList: Pointer to list object where the node will be inserted. + * @pNode: Pointer to the list node to be inserted into the list. + * + * Return VOS_STATUS_SUCCESS - list node was successfully inserted onto + * the back of the list. + * VOS_STATUS_E_INVAL - The value specified by pList is not a valid, + * initialized list object. + * VOS_STATUS_E_FAULT - pList is an invalid pointer or pNode is an + * invalid pointer. + */ +VOS_STATUS vos_list_insert_back_no_mutex(vos_list_t *pList, + vos_list_node_t *pNode); + /**--------------------------------------------------------------------------- \brief vos_list_insert_back_size() - insert node at back of a linked list and @@ -368,6 +383,20 @@ VOS_STATUS vos_list_remove_back( vos_list_t *pList, vos_list_node_t **ppNode ); --------------------------------------------------------------------------*/ VOS_STATUS vos_list_size( vos_list_t *pList, v_SIZE_t *pSize ); +/** + * vos_list_size_no_mutex() - return the size of of a linked list + * @pList: Pointer to list object where the node will be inserted. + * @pNode: Pointer to the list node to be inserted into the list. + * + * Return VOS_STATUS_SUCCESS - list node was successfully inserted onto + * the back of the list. + * VOS_STATUS_E_INVAL - The value specified by pList is not a valid, + * initialized list object. + * VOS_STATUS_E_FAULT - pList is an invalid pointer or pNode is an + * invalid pointer. + */ +VOS_STATUS vos_list_size_no_mutex( vos_list_t *pList, v_SIZE_t *pSize ); + /**--------------------------------------------------------------------------- \brief vos_list_peek_front() - peek at the node at front of a linked list @@ -579,6 +608,24 @@ VOS_STATUS vos_list_insert_after( vos_list_t *pList, vos_list_node_t *pNodeToIns --------------------------------------------------------------------------*/ VOS_STATUS vos_list_remove_node( vos_list_t *pList, vos_list_node_t *pNodeToRemove ); +/** + * vos_list_remove_node_no_mutex() - API will remove a specified node from the + * properly initialized vOS List object. + * @pList: Pointer to list object where the node will be inserted. + * @pNode: Pointer to the list node to be inserted into the list. + * + * Return VOS_STATUS_SUCCESS - list node was successfully inserted onto + * the back of the list. + * VOS_STATUS_E_INVAL - The value specified by pList is not a valid, + * initialized list object. + * VOS_STATUS_E_FAULT - pList is an invalid pointer or pNode is an + * invalid pointer. + */ +VOS_STATUS vos_list_remove_node_no_mutex(vos_list_t *pList, + vos_list_node_t *pNodeToRemove); + +#define VOS_LIST_NODE_INIT_SINGLE(node) __VOS_LIST_NODE_INIT_SINGLE(node) +#define VOS_LIST_ANCHOR(list) __VOS_LIST_ANCHOR(list) #endif // __VOS_LIST_H diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c index 393b7699b887..825cfd88d815 100644 --- a/CORE/VOSS/src/vos_api.c +++ b/CORE/VOSS/src/vos_api.c @@ -3515,18 +3515,18 @@ bool vos_is_chan_ok_for_dnbs(uint8_t channel) return false; } - spin_lock_bh(&pHddCtx->restrict_offchan_lock); + adf_os_spin_lock_bh(&pHddCtx->restrict_offchan_lock); if (pHddCtx->restrict_offchan_flag) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "%s: flag is set", __func__); wlansap_channel_compare(gpVosContext->pMACContext, channel, &equal); - spin_unlock_bh(&pHddCtx->restrict_offchan_lock); + adf_os_spin_unlock_bh(&pHddCtx->restrict_offchan_lock); return equal; } else VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "%s: flag is not set", __func__); - spin_unlock_bh(&pHddCtx->restrict_offchan_lock); + adf_os_spin_unlock_bh(&pHddCtx->restrict_offchan_lock); return true; } #endif diff --git a/CORE/VOSS/src/vos_list.c b/CORE/VOSS/src/vos_list.c index 2ce881343bed..31a4cca3b371 100644 --- a/CORE/VOSS/src/vos_list.c +++ b/CORE/VOSS/src/vos_list.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2015 The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2015 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -194,6 +194,31 @@ VOS_STATUS vos_list_insert_back( vos_list_t *pList, vos_list_node_t *pNode ) return VOS_STATUS_SUCCESS; } +VOS_STATUS vos_list_insert_back_no_mutex(vos_list_t *pList, + vos_list_node_t *pNode) +{ + if ( ( pList == NULL) || ( pNode == NULL) ) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: NULL pointer passed in", __func__); + return VOS_STATUS_E_FAULT; + } + + if ( pList->cookie != VOS_LIST_COOKIE ) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: list not initialized", __func__); + VOS_ASSERT(0); + return VOS_STATUS_E_INVAL; + } + + list_add_tail( pNode, &pList->anchor ); + + pList->count++; + + return VOS_STATUS_SUCCESS; +} + VOS_STATUS vos_list_insert_back_size( vos_list_t *pList, vos_list_node_t *pNode, v_SIZE_t *pSize ) { @@ -364,6 +389,28 @@ VOS_STATUS vos_list_size( vos_list_t *pList, v_SIZE_t *pSize ) return VOS_STATUS_SUCCESS; } +VOS_STATUS vos_list_size_no_mutex( vos_list_t *pList, v_SIZE_t *pSize ) +{ + if ( ( pList ==NULL) || ( pSize == NULL) ) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: NULL pointer passed in", __func__); + return VOS_STATUS_E_FAULT; + } + + if ( pList->cookie != VOS_LIST_COOKIE ) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: list not initialized", __func__); + VOS_ASSERT(0); + return VOS_STATUS_E_INVAL; + } + + *pSize = pList->count; + + return VOS_STATUS_SUCCESS; +} + /*---------------------------------------------------------------------------- @@ -583,8 +630,10 @@ VOS_STATUS vos_list_peek_next( vos_list_t *pList, vos_list_node_t *pNode, break; } } - if (found == 0) + if (found == 0) { + mutex_unlock(&pList->lock); return VOS_STATUS_E_INVAL; + } listptr = pNode->next; if (listptr == &pList->anchor) @@ -678,8 +727,10 @@ VOS_STATUS vos_list_peek_prev( vos_list_t *pList, vos_list_node_t *pNode, break; } } - if (found == 0) + if (found == 0) { + mutex_unlock(&pList->lock); return VOS_STATUS_E_INVAL; + } listptr = pNode->prev; @@ -769,8 +820,10 @@ VOS_STATUS vos_list_insert_before( vos_list_t *pList, vos_list_node_t *pNodeToIn break; } } - if (found == 0) + if (found == 0) { + mutex_unlock(&pList->lock); return VOS_STATUS_E_INVAL; + } list_add(pNodeToInsert, pNode); pList->count++; @@ -853,8 +906,10 @@ VOS_STATUS vos_list_insert_after( vos_list_t *pList, vos_list_node_t *pNodeToIns break; } } - if (found == 0) + if (found == 0) { + mutex_unlock(&pList->lock); return VOS_STATUS_E_INVAL; + } list_add_tail(pNodeToInsert, pNode); pList->count++; @@ -934,8 +989,10 @@ VOS_STATUS vos_list_remove_node( vos_list_t *pList, vos_list_node_t *pNodeToRemo break; } } - if (found == 0) + if (found == 0) { + mutex_unlock(&pList->lock); return VOS_STATUS_E_INVAL; + } list_del(pNodeToRemove); pList->count--; @@ -943,3 +1000,49 @@ VOS_STATUS vos_list_remove_node( vos_list_t *pList, vos_list_node_t *pNodeToRemo return VOS_STATUS_SUCCESS; } + +VOS_STATUS vos_list_remove_node_no_mutex(vos_list_t *pList, + vos_list_node_t *pNodeToRemove) +{ + int found = 0; + vos_list_node_t *tmp; + + if ( ( pList == NULL ) || ( pNodeToRemove == NULL) ) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: NULL pointer passed in", __func__); + return VOS_STATUS_E_FAULT; + } + + if ( pList->cookie != VOS_LIST_COOKIE ) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: list not initialized", __func__); + VOS_ASSERT(0); + return VOS_STATUS_E_INVAL; + } + + if ( list_empty(&pList->anchor) ) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: list empty", __func__); + return VOS_STATUS_E_EMPTY; + } + + // verify that pNodeToRemove is indeed part of list pList + list_for_each(tmp, &pList->anchor) + { + if (tmp == pNodeToRemove) + { + found = 1; + break; + } + } + if (found == 0) + return VOS_STATUS_E_INVAL; + + list_del(pNodeToRemove); + pList->count--; + + return VOS_STATUS_SUCCESS; +} diff --git a/CORE/VOSS/src/vos_memory.c b/CORE/VOSS/src/vos_memory.c index 4a3ce77cf510..e58ef1ef2c84 100644 --- a/CORE/VOSS/src/vos_memory.c +++ b/CORE/VOSS/src/vos_memory.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -233,7 +233,7 @@ void vos_mem_trace_dump(int level) VOS_STATUS vosStatus; struct s_vos_mem_struct *memStruct; - spin_lock(&vosMemList.lock); + adf_os_spin_lock(&vosMemList.lock); hdd_list_peek_front(&vosMemList, &pNodeNext); do { if (pNodeNext == NULL) @@ -251,7 +251,7 @@ void vos_mem_trace_dump(int level) pNodeNext = NULL; } while ((vosStatus = hdd_list_peek_next(&vosMemList, pNode, &pNodeNext)) == VOS_STATUS_SUCCESS); - spin_unlock(&vosMemList.lock); + adf_os_spin_unlock(&vosMemList.lock); VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_FATAL, "vos_mem [total active] count %d size %d", i, totalUsed); @@ -332,9 +332,9 @@ void vos_mem_clean() do { - spin_lock(&vosMemList.lock); + adf_os_spin_lock(&vosMemList.lock); vosStatus = hdd_list_remove_front(&vosMemList, &pNode); - spin_unlock(&vosMemList.lock); + adf_os_spin_unlock(&vosMemList.lock); if(VOS_STATUS_SUCCESS == vosStatus) { memStruct = (struct s_vos_mem_struct*)pNode; @@ -396,7 +396,6 @@ v_VOID_t *vos_mem_malloc_debug(v_SIZE_t size, const char *fileName, v_VOID_t* memPtr = NULL; v_SIZE_t new_size; int flags = GFP_KERNEL; - unsigned long IrqFlags; unsigned long time_before_kmalloc; @@ -452,10 +451,10 @@ v_VOID_t *vos_mem_malloc_debug(v_SIZE_t size, const char *fileName, vos_mem_copy(&memStruct->header[0], &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER)); vos_mem_copy( (v_U8_t*)(memStruct + 1) + size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL)); - spin_lock_irqsave(&vosMemList.lock, IrqFlags); + adf_os_spin_lock_irqsave(&vosMemList.lock); vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode); alloc_trace_usage(fileName, lineNum, size); - spin_unlock_irqrestore(&vosMemList.lock, IrqFlags); + adf_os_spin_unlock_irqrestore(&vosMemList.lock); if(VOS_STATUS_SUCCESS != vosStatus) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, @@ -470,8 +469,6 @@ v_VOID_t *vos_mem_malloc_debug(v_SIZE_t size, const char *fileName, v_VOID_t vos_mem_free( v_VOID_t *ptr ) { - unsigned long IrqFlags; - if (ptr != NULL) { VOS_STATUS vosStatus; @@ -482,11 +479,11 @@ v_VOID_t vos_mem_free( v_VOID_t *ptr ) return; #endif - spin_lock_irqsave(&vosMemList.lock, IrqFlags); + adf_os_spin_lock_irqsave(&vosMemList.lock); vosStatus = hdd_list_remove_node(&vosMemList, &memStruct->pNode); free_trace_usage(memStruct->fileName, memStruct->lineNum, memStruct->size); - spin_unlock_irqrestore(&vosMemList.lock, IrqFlags); + adf_os_spin_unlock_irqrestore(&vosMemList.lock); if(VOS_STATUS_SUCCESS == vosStatus) { @@ -726,10 +723,10 @@ v_VOID_t * vos_mem_dma_malloc_debug( v_SIZE_t size, char* fileName, v_U32_t line vos_mem_copy(&memStruct->header[0], &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER)); vos_mem_copy( (v_U8_t*)(memStruct + 1) + size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL)); - spin_lock(&vosMemList.lock); + adf_os_spin_lock(&vosMemList.lock); vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode); alloc_trace_usage(fileName, lineNum, size); - spin_unlock(&vosMemList.lock); + adf_os_spin_unlock(&vosMemList.lock); if(VOS_STATUS_SUCCESS != vosStatus) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, @@ -749,11 +746,11 @@ v_VOID_t vos_mem_dma_free( v_VOID_t *ptr ) VOS_STATUS vosStatus; struct s_vos_mem_struct* memStruct = ((struct s_vos_mem_struct*)ptr) - 1; - spin_lock(&vosMemList.lock); + adf_os_spin_lock(&vosMemList.lock); vosStatus = hdd_list_remove_node(&vosMemList, &memStruct->pNode); free_trace_usage(memStruct->fileName, memStruct->lineNum, memStruct->size); - spin_unlock(&vosMemList.lock); + adf_os_spin_unlock(&vosMemList.lock); if(VOS_STATUS_SUCCESS == vosStatus) { diff --git a/CORE/VOSS/src/vos_mq.c b/CORE/VOSS/src/vos_mq.c index 81c43598594e..78358597aa5f 100644 --- a/CORE/VOSS/src/vos_mq.c +++ b/CORE/VOSS/src/vos_mq.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2014, 2016, 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -86,7 +86,7 @@ __inline VOS_STATUS vos_mq_init(pVosMqType pMq) /* ** Now initialize the lock */ - spin_lock_init(&pMq->mqLock); + adf_os_spinlock_init(&pMq->mqLock); /* ** Now initialize the List data structure @@ -143,8 +143,6 @@ __inline void vos_mq_deinit(pVosMqType pMq) ---------------------------------------------------------------------------*/ __inline void vos_mq_put(pVosMqType pMq, pVosMsgWrapper pMsgWrapper) { - unsigned long flags; - /* ** Some quick sanity check */ @@ -154,11 +152,11 @@ __inline void vos_mq_put(pVosMqType pMq, pVosMsgWrapper pMsgWrapper) return ; } - spin_lock_irqsave(&pMq->mqLock, flags); + adf_os_spin_lock_irqsave(&pMq->mqLock); list_add_tail(&pMsgWrapper->msgNode, &pMq->mqList); - spin_unlock_irqrestore(&pMq->mqLock, flags); + adf_os_spin_unlock_irqrestore(&pMq->mqLock); } /* vos_mq_put() */ @@ -173,17 +171,15 @@ __inline void vos_mq_put(pVosMqType pMq, pVosMsgWrapper pMsgWrapper) */ void vos_mq_put_front(pVosMqType mq, pVosMsgWrapper msg_wrapper) { - unsigned long flags; - if ((mq == NULL) || (msg_wrapper == NULL)) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: NULL pointer passed", __func__); return; } - spin_lock_irqsave(&mq->mqLock, flags); + adf_os_spin_lock_irqsave(&mq->mqLock); list_add(&msg_wrapper->msgNode, &mq->mqList); - spin_unlock_irqrestore(&mq->mqLock, flags); + adf_os_spin_unlock_irqrestore(&mq->mqLock); } /*--------------------------------------------------------------------------- @@ -208,7 +204,6 @@ __inline pVosMsgWrapper vos_mq_get(pVosMqType pMq) ** Some quick sanity check */ struct list_head * listptr; - unsigned long flags; if (pMq == NULL) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, @@ -216,7 +211,7 @@ __inline pVosMsgWrapper vos_mq_get(pVosMqType pMq) return NULL; } - spin_lock_irqsave(&pMq->mqLock, flags); + adf_os_spin_lock_irqsave(&pMq->mqLock); if( list_empty(&pMq->mqList) ) { @@ -230,7 +225,7 @@ __inline pVosMsgWrapper vos_mq_get(pVosMqType pMq) list_del(pMq->mqList.next); } - spin_unlock_irqrestore(&pMq->mqLock, flags); + adf_os_spin_unlock_irqrestore(&pMq->mqLock); return pMsgWrapper; @@ -253,7 +248,6 @@ __inline pVosMsgWrapper vos_mq_get(pVosMqType pMq) __inline v_BOOL_t vos_is_mq_empty(pVosMqType pMq) { v_BOOL_t state = VOS_FALSE; - unsigned long flags; /* ** Some quick sanity check @@ -265,9 +259,9 @@ __inline v_BOOL_t vos_is_mq_empty(pVosMqType pMq) return VOS_STATUS_E_FAILURE; } - spin_lock_irqsave(&pMq->mqLock, flags); + adf_os_spin_lock_irqsave(&pMq->mqLock); state = list_empty(&pMq->mqList)?VOS_TRUE:VOS_FALSE; - spin_unlock_irqrestore(&pMq->mqLock, flags); + adf_os_spin_unlock_irqrestore(&pMq->mqLock); return state; diff --git a/CORE/VOSS/src/vos_nvitem.c b/CORE/VOSS/src/vos_nvitem.c index e4e2a73c6697..a3a325ef28a4 100644 --- a/CORE/VOSS/src/vos_nvitem.c +++ b/CORE/VOSS/src/vos_nvitem.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -292,7 +292,7 @@ chan_to_ht_40_index_map chan_to_ht_40_index[NUM_20MHZ_RF_CHANNELS] = static CountryInfoTable_t countryInfoTable = { /* the first entry in the table is always the world domain */ - 141, + 142, { {REGDOMAIN_WORLD, {'0', '0'}}, // WORLD DOMAIN {REGDOMAIN_FCC, {'A', 'D'}}, // ANDORRA @@ -375,6 +375,7 @@ static CountryInfoTable_t countryInfoTable = {REGDOMAIN_ETSI, {'M', 'A'}}, //MOROCCO {REGDOMAIN_ETSI, {'M', 'C'}}, //MONACO {REGDOMAIN_ETSI, {'M', 'K'}}, //MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF + {REGDOMAIN_ETSI, {'M', 'M'}}, //MYANMAR {REGDOMAIN_FCC, {'M','N'}}, //MONGOLIA {REGDOMAIN_FCC, {'M', 'O'}}, //MACAO {REGDOMAIN_FCC, {'M', 'P'}}, //NORTHERN MARIANA ISLANDS @@ -2148,13 +2149,27 @@ static int create_linux_regulatory_entry(struct wiphy *wiphy, } } } else { - /* Enable is only last flag we support */ - pnvEFSTable->halnv.tables.regDomains[temp_reg_domain]. - channels[k].enabled = NV_CHANNEL_ENABLE; - - /* max_power is in dBm */ - pnvEFSTable->halnv.tables.regDomains[temp_reg_domain].channels[k].pwrLimit = - (tANI_S8) ((wiphy->bands[i]->channels[j].max_power)); + /* there are 14 channel in hdd_channels_2_4_GHZ, + * there are 24/25 hdd_channels_5_GHZ, + * there are 2 channel in hdd_etsi_srd_chan + * the last element of wiphy->bands[i]->channels[j] + * is channel 173, and the index is 39/40.*/ + if((!pHddCtx->cfg_ini->dot11p_mode) && (k > RF_CHAN_169)) { + pnvEFSTable->halnv.tables.regDomains[temp_reg_domain]. + channels[RF_CHAN_173].enabled = NV_CHANNEL_ENABLE; + pnvEFSTable->halnv.tables.regDomains[temp_reg_domain]. + channels[RF_CHAN_173].pwrLimit = + (tANI_S8) ((wiphy->bands[i]->channels[j].max_power)); + } else { + /* Enable is only last flag we support */ + pnvEFSTable->halnv.tables.regDomains[temp_reg_domain]. + channels[k].enabled = NV_CHANNEL_ENABLE; + + /* max_power is in dBm */ + pnvEFSTable->halnv.tables.regDomains[temp_reg_domain]. + channels[k].pwrLimit = + (tANI_S8) ((wiphy->bands[i]->channels[j].max_power)); + } /* Disable the center channel if neither HT40+ nor HT40- is allowed */ diff --git a/CORE/VOSS/src/vos_packet.c b/CORE/VOSS/src/vos_packet.c index db8e10dc3977..f2fed19b59f6 100644 --- a/CORE/VOSS/src/vos_packet.c +++ b/CORE/VOSS/src/vos_packet.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2014, 2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2014, 2016, 2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -75,7 +75,7 @@ typedef struct vos_pkt_proto_trace_t *trace_buffer = NULL; unsigned int trace_buffer_order = 0; unsigned int trace_dump_order = 0; -spinlock_t trace_buffer_lock; +adf_os_spinlock_t trace_buffer_lock; #endif /* QCA_PKT_PROTO_TRACE */ /** @@ -342,11 +342,11 @@ void vos_pkt_trace_buf_update return; } - spin_lock_bh(&trace_buffer_lock); + adf_os_spin_lock_bh(&trace_buffer_lock); slot = trace_buffer_order % VOS_PKT_TRAC_MAX_TRACE_BUF; trace_buffer[slot].order = trace_buffer_order; trace_buffer_order++; - spin_unlock_bh(&trace_buffer_lock); + adf_os_spin_unlock_bh(&trace_buffer_lock); do_gettimeofday(&tv); trace_buffer[slot].event_sec_time = tv.tv_sec; trace_buffer[slot].event_msec_time = tv.tv_usec; @@ -436,7 +436,7 @@ void vos_pkt_proto_trace_init ) { /* Init spin lock to protect global memory */ - spin_lock_init(&trace_buffer_lock); + adf_os_spinlock_init(&trace_buffer_lock); trace_buffer_order = 0; trace_buffer = vos_mem_malloc( VOS_PKT_TRAC_MAX_TRACE_BUF * sizeof(vos_pkt_proto_trace_t)); @@ -462,10 +462,10 @@ void vos_pkt_proto_trace_close { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s %d", __func__, __LINE__); - spin_lock_bh(&trace_buffer_lock); + adf_os_spin_lock_bh(&trace_buffer_lock); vos_mem_free(trace_buffer); trace_buffer = NULL; - spin_unlock_bh(&trace_buffer_lock); + adf_os_spin_unlock_bh(&trace_buffer_lock); return; } diff --git a/CORE/VOSS/src/vos_sched.c b/CORE/VOSS/src/vos_sched.c index a190ed3f3833..dc89f52626b4 100644 --- a/CORE/VOSS/src/vos_sched.c +++ b/CORE/VOSS/src/vos_sched.c @@ -88,7 +88,7 @@ struct ssr_protect { uint32_t pid; }; -static spinlock_t ssr_protect_lock; +static adf_os_spinlock_t ssr_protect_lock; static struct ssr_protect ssr_protect_log[MAX_SSR_PROTECT_LOG]; /*--------------------------------------------------------------------------- @@ -535,9 +535,9 @@ vos_sched_open init_completion(&pSchedContext->McShutdown); init_completion(&pSchedContext->ResumeMcEvent); - spin_lock_init(&pSchedContext->McThreadLock); + adf_os_spinlock_init(&pSchedContext->McThreadLock); #ifdef QCA_CONFIG_SMP - spin_lock_init(&pSchedContext->TlshimRxThreadLock); + adf_os_spinlock_init(&pSchedContext->TlshimRxThreadLock); #endif init_waitqueue_head(&pSchedContext->mcWaitQueue); @@ -550,17 +550,17 @@ vos_sched_open init_completion(&pSchedContext->ResumeTlshimRxEvent); init_completion(&pSchedContext->TlshimRxShutdown); pSchedContext->tlshimRxEvtFlg = 0; - spin_lock_init(&pSchedContext->TlshimRxQLock); - spin_lock_init(&pSchedContext->VosTlshimPktFreeQLock); + adf_os_spinlock_init(&pSchedContext->TlshimRxQLock); + adf_os_spinlock_init(&pSchedContext->VosTlshimPktFreeQLock); INIT_LIST_HEAD(&pSchedContext->tlshimRxQueue); - spin_lock_bh(&pSchedContext->VosTlshimPktFreeQLock); + adf_os_spin_lock_bh(&pSchedContext->VosTlshimPktFreeQLock); INIT_LIST_HEAD(&pSchedContext->VosTlshimPktFreeQ); if (vos_alloc_tlshim_pkt_freeq(pSchedContext) != VOS_STATUS_SUCCESS) { - spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); + adf_os_spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); return VOS_STATUS_E_FAILURE; } - spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); + adf_os_spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); #if (LINUX_VERSION_CODE < KERNEL_VERSION(4,10,0)) register_hotcpu_notifier(&vos_cpu_hotplug_notifier); pSchedContext->cpuHotPlugNotifier = &vos_cpu_hotplug_notifier; @@ -691,8 +691,8 @@ VOS_STATUS vos_watchdog_open pWdContext->wdEventFlag = 0; // Initialize the lock - spin_lock_init(&pWdContext->wdLock); - spin_lock_init(&pWdContext->thread_stuck_lock); + adf_os_spinlock_init(&pWdContext->wdLock); + adf_os_spinlock_init(&pWdContext->thread_stuck_lock); //Create the Watchdog thread pWdContext->WdThread = kthread_create(VosWDThread, pWdContext,"VosWDThread"); @@ -955,13 +955,13 @@ VosMCThread if(test_bit(MC_SUSPEND_EVENT, &pSchedContext->mcEventFlag)) { clear_bit(MC_SUSPEND_EVENT, &pSchedContext->mcEventFlag); - spin_lock(&pSchedContext->McThreadLock); + adf_os_spin_lock(&pSchedContext->McThreadLock); INIT_COMPLETION(pSchedContext->ResumeMcEvent); /* Mc Thread Suspended */ complete(&pHddCtx->mc_sus_event_var); - spin_unlock(&pSchedContext->McThreadLock); + adf_os_spin_unlock(&pSchedContext->McThreadLock); /* Wait foe Resume Indication */ wait_for_completion_interruptible(&pSchedContext->ResumeMcEvent); @@ -998,14 +998,11 @@ v_BOOL_t isWDresetInProgress(void) */ static void vos_wd_detect_thread_stuck(void) { - unsigned long flags; - - spin_lock_irqsave(&gpVosWatchdogContext->thread_stuck_lock, flags); + adf_os_spin_lock_irqsave(&gpVosWatchdogContext->thread_stuck_lock); if (gpVosWatchdogContext->mc_thread_stuck_count == THREAD_STUCK_THRESHOLD) { - spin_unlock_irqrestore(&gpVosWatchdogContext->thread_stuck_lock, - flags); + adf_os_spin_unlock_irqrestore(&gpVosWatchdogContext->thread_stuck_lock); hddLog(LOGE, FL("MC Thread Stuck!!!")); vos_dump_stack(gpVosSchedContext->McThread); @@ -1013,8 +1010,7 @@ static void vos_wd_detect_thread_stuck(void) WLAN_LOG_INDICATOR_HOST_ONLY, WLAN_LOG_REASON_THREAD_STUCK, DUMP_VOS_TRACE); - spin_lock_irqsave(&gpVosWatchdogContext->thread_stuck_lock, - flags); + adf_os_spin_lock_irqsave(&gpVosWatchdogContext->thread_stuck_lock); } /* Increment the thread stuck count for all threads */ @@ -1022,12 +1018,10 @@ static void vos_wd_detect_thread_stuck(void) if (gpVosWatchdogContext->mc_thread_stuck_count <= THREAD_STUCK_THRESHOLD) { - spin_unlock_irqrestore(&gpVosWatchdogContext->thread_stuck_lock, - flags); + adf_os_spin_unlock_irqrestore(&gpVosWatchdogContext->thread_stuck_lock); vos_probe_threads(); } else - spin_unlock_irqrestore(&gpVosWatchdogContext->thread_stuck_lock, - flags); + adf_os_spin_unlock_irqrestore(&gpVosWatchdogContext->thread_stuck_lock); /* Restart the timer */ if (VOS_STATUS_SUCCESS != @@ -1094,13 +1088,11 @@ void vos_thread_stuck_timer_init(pVosWatchdogContext wd_ctx) */ void vos_wd_reset_thread_stuck_count(int thread_id) { - unsigned long flags; - - spin_lock_irqsave(&gpVosWatchdogContext->thread_stuck_lock, flags); + adf_os_spin_lock_irqsave(&gpVosWatchdogContext->thread_stuck_lock); if (vos_sched_is_mc_thread(thread_id)) gpVosWatchdogContext->mc_thread_stuck_count = 0; - spin_unlock_irqrestore(&gpVosWatchdogContext->thread_stuck_lock, flags); + adf_os_spin_unlock_irqrestore(&gpVosWatchdogContext->thread_stuck_lock); } /*--------------------------------------------------------------------------- @@ -1296,16 +1288,16 @@ void vos_free_tlshim_pkt_freeq(pVosSchedContext pSchedContext) { struct VosTlshimPkt *pkt; - spin_lock_bh(&pSchedContext->VosTlshimPktFreeQLock); + adf_os_spin_lock_bh(&pSchedContext->VosTlshimPktFreeQLock); while (!list_empty(&pSchedContext->VosTlshimPktFreeQ)) { pkt = list_entry((&pSchedContext->VosTlshimPktFreeQ)->next, typeof(*pkt), list); list_del(&pkt->list); - spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); + adf_os_spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); vos_mem_free(pkt); - spin_lock_bh(&pSchedContext->VosTlshimPktFreeQLock); + adf_os_spin_lock_bh(&pSchedContext->VosTlshimPktFreeQLock); } - spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); + adf_os_spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); } @@ -1360,9 +1352,9 @@ void vos_free_tlshim_pkt(pVosSchedContext pSchedContext, struct VosTlshimPkt *pkt) { memset(pkt, 0, sizeof(*pkt)); - spin_lock_bh(&pSchedContext->VosTlshimPktFreeQLock); + adf_os_spin_lock_bh(&pSchedContext->VosTlshimPktFreeQLock); list_add_tail(&pkt->list, &pSchedContext->VosTlshimPktFreeQ); - spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); + adf_os_spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); } /*--------------------------------------------------------------------------- @@ -1378,15 +1370,15 @@ struct VosTlshimPkt *vos_alloc_tlshim_pkt(pVosSchedContext pSchedContext) { struct VosTlshimPkt *pkt; - spin_lock_bh(&pSchedContext->VosTlshimPktFreeQLock); + adf_os_spin_lock_bh(&pSchedContext->VosTlshimPktFreeQLock); if (list_empty(&pSchedContext->VosTlshimPktFreeQ)) { - spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); + adf_os_spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); return NULL; } pkt = list_first_entry(&pSchedContext->VosTlshimPktFreeQ, struct VosTlshimPkt, list); list_del(&pkt->list); - spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); + adf_os_spin_unlock_bh(&pSchedContext->VosTlshimPktFreeQLock); return pkt; } @@ -1403,9 +1395,9 @@ struct VosTlshimPkt *vos_alloc_tlshim_pkt(pVosSchedContext pSchedContext) void vos_indicate_rxpkt(pVosSchedContext pSchedContext, struct VosTlshimPkt *pkt) { - spin_lock_bh(&pSchedContext->TlshimRxQLock); + adf_os_spin_lock_bh(&pSchedContext->TlshimRxQLock); list_add_tail(&pkt->list, &pSchedContext->tlshimRxQueue); - spin_unlock_bh(&pSchedContext->TlshimRxQLock); + adf_os_spin_unlock_bh(&pSchedContext->TlshimRxQLock); set_bit(RX_POST_EVENT, &pSchedContext->tlshimRxEvtFlg); wake_up_interruptible(&pSchedContext->tlshimRxWaitQueue); } @@ -1427,16 +1419,16 @@ void vos_drop_rxpkt_by_staid(pVosSchedContext pSchedContext, u_int16_t staId) adf_nbuf_t buf, next_buf; INIT_LIST_HEAD(&local_list); - spin_lock_bh(&pSchedContext->TlshimRxQLock); + adf_os_spin_lock_bh(&pSchedContext->TlshimRxQLock); if (list_empty(&pSchedContext->tlshimRxQueue)) { - spin_unlock_bh(&pSchedContext->TlshimRxQLock); + adf_os_spin_unlock_bh(&pSchedContext->TlshimRxQLock); return; } list_for_each_entry_safe(pkt, tmp, &pSchedContext->tlshimRxQueue, list) { if (pkt->staId == staId || staId == WLAN_MAX_STA_COUNT) list_move_tail(&pkt->list, &local_list); } - spin_unlock_bh(&pSchedContext->TlshimRxQLock); + adf_os_spin_unlock_bh(&pSchedContext->TlshimRxQLock); list_for_each_entry_safe(pkt, tmp, &local_list, list) { list_del(&pkt->list); @@ -1464,18 +1456,18 @@ static void vos_rx_from_queue(pVosSchedContext pSchedContext) struct VosTlshimPkt *pkt; u_int16_t sta_id; - spin_lock_bh(&pSchedContext->TlshimRxQLock); + adf_os_spin_lock_bh(&pSchedContext->TlshimRxQLock); while (!list_empty(&pSchedContext->tlshimRxQueue)) { pkt = list_first_entry(&pSchedContext->tlshimRxQueue, struct VosTlshimPkt, list); list_del(&pkt->list); - spin_unlock_bh(&pSchedContext->TlshimRxQLock); + adf_os_spin_unlock_bh(&pSchedContext->TlshimRxQLock); sta_id = pkt->staId; pkt->callback(pkt->context, pkt->Rxpkt, sta_id); vos_free_tlshim_pkt(pSchedContext, pkt); - spin_lock_bh(&pSchedContext->TlshimRxQLock); + adf_os_spin_lock_bh(&pSchedContext->TlshimRxQLock); } - spin_unlock_bh(&pSchedContext->TlshimRxQLock); + adf_os_spin_unlock_bh(&pSchedContext->TlshimRxQLock); } /*--------------------------------------------------------------------------- @@ -1549,10 +1541,10 @@ static int VosTlshimRxThread(void *arg) &pSchedContext->tlshimRxEvtFlg)) { clear_bit(RX_SUSPEND_EVENT, &pSchedContext->tlshimRxEvtFlg); - spin_lock(&pSchedContext->TlshimRxThreadLock); + adf_os_spin_lock(&pSchedContext->TlshimRxThreadLock); INIT_COMPLETION(pSchedContext->ResumeTlshimRxEvent); complete(&pSchedContext->SuspndTlshimRxEvent); - spin_unlock(&pSchedContext->TlshimRxThreadLock); + adf_os_spin_unlock(&pSchedContext->TlshimRxThreadLock); wait_for_completion_interruptible( &pSchedContext->ResumeTlshimRxEvent); } @@ -1930,7 +1922,7 @@ VOS_STATUS vos_watchdog_wlan_shutdown(void) } /* Take the lock here */ - spin_lock(&gpVosWatchdogContext->wdLock); + adf_os_spin_lock(&gpVosWatchdogContext->wdLock); /* reuse the existing 'reset in progress' */ if (gpVosWatchdogContext->resetInProgress) @@ -1939,7 +1931,7 @@ VOS_STATUS vos_watchdog_wlan_shutdown(void) "%s: Shutdown already in Progress. Ignoring signaling Watchdog", __func__); /* Release the lock here */ - spin_unlock(&gpVosWatchdogContext->wdLock); + adf_os_spin_unlock(&gpVosWatchdogContext->wdLock); return VOS_STATUS_E_FAILURE; } /* reuse the existing 'logp in progress', eventhough it is not @@ -1950,7 +1942,7 @@ VOS_STATUS vos_watchdog_wlan_shutdown(void) "%s: shutdown/re-init already in Progress. Ignoring signaling Watchdog", __func__); /* Release the lock here */ - spin_unlock(&gpVosWatchdogContext->wdLock); + adf_os_spin_unlock(&gpVosWatchdogContext->wdLock); return VOS_STATUS_E_FAILURE; } @@ -1960,7 +1952,7 @@ VOS_STATUS vos_watchdog_wlan_shutdown(void) pHddCtx->isLogpInProgress = TRUE; /* Release the lock here */ - spin_unlock(&gpVosWatchdogContext->wdLock); + adf_os_spin_unlock(&gpVosWatchdogContext->wdLock); if ((pHddCtx->isLoadInProgress) || (pHddCtx->isUnloadInProgress)) @@ -2028,7 +2020,7 @@ void vos_ssr_protect_init(void) { int i = 0; - spin_lock_init(&ssr_protect_lock); + adf_os_spinlock_init(&ssr_protect_lock); while (i < MAX_SSR_PROTECT_LOG) { ssr_protect_log[i].func = NULL; @@ -2048,9 +2040,8 @@ void vos_ssr_protect_init(void) static void vos_print_external_threads(void) { int i = 0; - unsigned long irq_flags; - spin_lock_irqsave(&ssr_protect_lock, irq_flags); + adf_os_spin_lock_irqsave(&ssr_protect_lock); while (i < MAX_SSR_PROTECT_LOG) { if (!ssr_protect_log[i].free) { @@ -2061,7 +2052,7 @@ static void vos_print_external_threads(void) i++; } - spin_unlock_irqrestore(&ssr_protect_lock, irq_flags); + adf_os_spin_unlock_irqrestore(&ssr_protect_lock); } @@ -2146,11 +2137,10 @@ void vos_ssr_protect(const char *caller_func) int count; int i = 0; bool status = false; - unsigned long irq_flags; count = atomic_inc_return(&ssr_protect_entry_count); - spin_lock_irqsave(&ssr_protect_lock, irq_flags); + adf_os_spin_lock_irqsave(&ssr_protect_lock); while (i < MAX_SSR_PROTECT_LOG) { if (ssr_protect_log[i].free) { @@ -2163,7 +2153,7 @@ void vos_ssr_protect(const char *caller_func) i++; } - spin_unlock_irqrestore(&ssr_protect_lock, irq_flags); + adf_os_spin_unlock_irqrestore(&ssr_protect_lock); if (!status) VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, @@ -2185,11 +2175,10 @@ void vos_ssr_unprotect(const char *caller_func) int count; int i = 0; bool status = false; - unsigned long irq_flags; count = atomic_dec_return(&ssr_protect_entry_count); - spin_lock_irqsave(&ssr_protect_lock, irq_flags); + adf_os_spin_lock_irqsave(&ssr_protect_lock); while (i < MAX_SSR_PROTECT_LOG) { if (!ssr_protect_log[i].free) { @@ -2205,7 +2194,7 @@ void vos_ssr_unprotect(const char *caller_func) i++; } - spin_unlock_irqrestore(&ssr_protect_lock, irq_flags); + adf_os_spin_unlock_irqrestore(&ssr_protect_lock); if (!status) VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, diff --git a/CORE/VOSS/src/vos_sched.h b/CORE/VOSS/src/vos_sched.h index 474bf24b2595..c1139eb9eb94 100644 --- a/CORE/VOSS/src/vos_sched.h +++ b/CORE/VOSS/src/vos_sched.h @@ -72,6 +72,7 @@ #include <adf_os_types.h> #include <vos_lock.h> #include <vos_timer.h> +#include <adf_os_lock.h> #define TX_POST_EVENT 0x000 #define TX_SUSPEND_EVENT 0x001 @@ -119,7 +120,7 @@ typedef void (*vos_tlshim_cb) (void *context, void *rxpkt, u_int16_t staid); typedef struct _VosMqType { /* Lock use to synchronize access to this message queue */ - spinlock_t mqLock; + adf_os_spinlock_t mqLock; /* List of vOS Messages waiting on this queue */ struct list_head mqList; @@ -196,9 +197,9 @@ typedef struct _VosSchedContext struct completion ResumeMcEvent; /* lock to make sure that McThread and TxThread Suspend/resume mechanism is in sync*/ - spinlock_t McThreadLock; + adf_os_spinlock_t McThreadLock; #ifdef QCA_CONFIG_SMP - spinlock_t TlshimRxThreadLock; + adf_os_spinlock_t TlshimRxThreadLock; /* Tlshim Rx thread handle */ struct task_struct *TlshimRxThread; @@ -224,13 +225,13 @@ typedef struct _VosSchedContext struct list_head tlshimRxQueue; /* Spinlock to synchronize between tasklet and thread */ - spinlock_t TlshimRxQLock; + adf_os_spinlock_t TlshimRxQLock; /* Rx queue length */ unsigned int TlshimRxQlen; /* Lock to synchronize free buffer queue access */ - spinlock_t VosTlshimPktFreeQLock; + adf_os_spinlock_t VosTlshimPktFreeQLock; /* Free message queue for Tlshim Rx processing */ struct list_head VosTlshimPktFreeQ; @@ -282,13 +283,13 @@ typedef struct _VosWatchdogContext v_BOOL_t resetInProgress; /* Lock for preventing multiple reset being triggered simultaneously */ - spinlock_t wdLock; + adf_os_spinlock_t wdLock; /* Timer to detect thread stuck issue */ vos_timer_t thread_stuck_timer; /* Count to determine thread stuck */ unsigned int mc_thread_stuck_count; /* lock to synchronize access to the thread stuck counts */ - spinlock_t thread_stuck_lock; + adf_os_spinlock_t thread_stuck_lock; } VosWatchdogContext, *pVosWatchdogContext; @@ -416,7 +417,7 @@ typedef struct _VosContextType struct vos_wdthread_timer_work wdthread_timer_work; struct list_head wdthread_timer_work_list; struct work_struct wdthread_work; - spinlock_t wdthread_work_lock; + adf_os_spinlock_t wdthread_work_lock; bool is_closed; } VosContextType, *pVosContextType; diff --git a/CORE/VOSS/src/vos_timer.c b/CORE/VOSS/src/vos_timer.c index f17539abcb55..42654ce65dbd 100644 --- a/CORE/VOSS/src/vos_timer.c +++ b/CORE/VOSS/src/vos_timer.c @@ -117,7 +117,6 @@ static void vos_linux_timer_callback (unsigned long data) vos_timer_t *timer = ( vos_timer_t *)data; vos_msg_t msg; VOS_STATUS vStatus; - unsigned long flags; vos_timer_callback_t callback=NULL; v_PVOID_t userData=NULL; @@ -136,7 +135,7 @@ static void vos_linux_timer_callback (unsigned long data) } threadId = timer->platformInfo.threadID; - spin_lock_irqsave( &timer->platformInfo.spinlock,flags ); + adf_os_spin_lock_irqsave( &timer->platformInfo.spinlock); switch ( timer->state ) { @@ -172,7 +171,7 @@ static void vos_linux_timer_callback (unsigned long data) break; } - spin_unlock_irqrestore( &timer->platformInfo.spinlock,flags ); + adf_os_spin_unlock_irqrestore( &timer->platformInfo.spinlock); if ( VOS_STATUS_SUCCESS != vStatus ) { @@ -209,10 +208,10 @@ static void vos_linux_timer_callback (unsigned long data) } wdthread_timer_work->callback = callback; wdthread_timer_work->userdata = userData; - spin_lock(&vos_global_context->wdthread_work_lock); + adf_os_spin_lock(&vos_global_context->wdthread_work_lock); list_add(&wdthread_timer_work->node, &vos_global_context->wdthread_timer_work_list); - spin_unlock(&vos_global_context->wdthread_work_lock); + adf_os_spin_unlock(&vos_global_context->wdthread_work_lock); schedule_work(&vos_global_context->wdthread_work); return; @@ -302,7 +301,6 @@ void vos_timer_manager_init() static void vos_timer_clean() { v_SIZE_t listSize; - unsigned long flags; hdd_list_size(&vosTimerList, &listSize); @@ -318,9 +316,9 @@ static void vos_timer_clean() do { - spin_lock_irqsave(&vosTimerList.lock, flags); + adf_os_spin_lock_irqsave(&vosTimerList.lock); vosStatus = hdd_list_remove_front(&vosTimerList, &pNode); - spin_unlock_irqrestore(&vosTimerList.lock, flags); + adf_os_spin_unlock_irqrestore(&vosTimerList.lock); if (VOS_STATUS_SUCCESS == vosStatus) { ptimerNode = (timer_node_t*)pNode; @@ -405,7 +403,6 @@ VOS_STATUS vos_timer_init_debug( vos_timer_t *timer, VOS_TIMER_TYPE timerType, char* fileName, v_U32_t lineNum ) { VOS_STATUS vosStatus; - unsigned long flags; // Check for invalid pointer if ((timer == NULL) || (callback == NULL)) { @@ -431,9 +428,9 @@ VOS_STATUS vos_timer_init_debug( vos_timer_t *timer, VOS_TIMER_TYPE timerType, timer->ptimerNode->lineNum = lineNum; timer->ptimerNode->vosTimer = timer; - spin_lock_irqsave(&vosTimerList.lock, flags); + adf_os_spin_lock_irqsave(&vosTimerList.lock); vosStatus = hdd_list_insert_front(&vosTimerList, &timer->ptimerNode->pNode); - spin_unlock_irqrestore(&vosTimerList.lock, flags); + adf_os_spin_unlock_irqrestore(&vosTimerList.lock); if(VOS_STATUS_SUCCESS != vosStatus) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, @@ -442,7 +439,7 @@ VOS_STATUS vos_timer_init_debug( vos_timer_t *timer, VOS_TIMER_TYPE timerType, // set the various members of the timer structure // with arguments passed or with default values - spin_lock_init(&timer->platformInfo.spinlock); + adf_os_spinlock_init(&timer->platformInfo.spinlock); if (VOS_TIMER_TYPE_SW == timerType) init_timer_deferrable(&(timer->platformInfo.Timer)); else @@ -473,7 +470,7 @@ VOS_STATUS vos_timer_init( vos_timer_t *timer, VOS_TIMER_TYPE timerType, // set the various members of the timer structure // with arguments passed or with default values - spin_lock_init(&timer->platformInfo.spinlock); + adf_os_spinlock_init(&timer->platformInfo.spinlock); if (VOS_TIMER_TYPE_SW == timerType) init_timer_deferrable(&(timer->platformInfo.Timer)); else @@ -528,7 +525,6 @@ VOS_STATUS vos_timer_init( vos_timer_t *timer, VOS_TIMER_TYPE timerType, VOS_STATUS vos_timer_destroy ( vos_timer_t *timer ) { VOS_STATUS vStatus=VOS_STATUS_SUCCESS; - unsigned long flags; // Check for invalid pointer if ( NULL == timer ) @@ -548,9 +544,9 @@ VOS_STATUS vos_timer_destroy ( vos_timer_t *timer ) return VOS_STATUS_E_INVAL; } - spin_lock_irqsave(&vosTimerList.lock, flags); + adf_os_spin_lock_irqsave(&vosTimerList.lock); vStatus = hdd_list_remove_node(&vosTimerList, &timer->ptimerNode->pNode); - spin_unlock_irqrestore(&vosTimerList.lock, flags); + adf_os_spin_unlock_irqrestore(&vosTimerList.lock); if(vStatus != VOS_STATUS_SUCCESS) { VOS_ASSERT(0); @@ -559,7 +555,7 @@ VOS_STATUS vos_timer_destroy ( vos_timer_t *timer ) vos_mem_free(timer->ptimerNode); - spin_lock_irqsave( &timer->platformInfo.spinlock,flags ); + adf_os_spin_lock_irqsave( &timer->platformInfo.spinlock); switch ( timer->state ) { @@ -586,11 +582,11 @@ VOS_STATUS vos_timer_destroy ( vos_timer_t *timer ) { timer->platformInfo.cookie = LINUX_INVALID_TIMER_COOKIE; timer->state = VOS_TIMER_STATE_UNUSED; - spin_unlock_irqrestore( &timer->platformInfo.spinlock,flags ); + adf_os_spin_unlock_irqrestore( &timer->platformInfo.spinlock); return vStatus; } - spin_unlock_irqrestore( &timer->platformInfo.spinlock,flags ); + adf_os_spin_unlock_irqrestore( &timer->platformInfo.spinlock); VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, @@ -604,7 +600,6 @@ VOS_STATUS vos_timer_destroy ( vos_timer_t *timer ) VOS_STATUS vos_timer_destroy ( vos_timer_t *timer ) { VOS_STATUS vStatus=VOS_STATUS_SUCCESS; - unsigned long flags; // Check for invalid pointer if ( NULL == timer ) @@ -623,7 +618,7 @@ VOS_STATUS vos_timer_destroy ( vos_timer_t *timer ) VOS_ASSERT(0); return VOS_STATUS_E_INVAL; } - spin_lock_irqsave( &timer->platformInfo.spinlock,flags ); + adf_os_spin_lock_irqsave( &timer->platformInfo.spinlock); switch ( timer->state ) { @@ -650,11 +645,11 @@ VOS_STATUS vos_timer_destroy ( vos_timer_t *timer ) { timer->platformInfo.cookie = LINUX_INVALID_TIMER_COOKIE; timer->state = VOS_TIMER_STATE_UNUSED; - spin_unlock_irqrestore( &timer->platformInfo.spinlock,flags ); + adf_os_spin_unlock_irqrestore( &timer->platformInfo.spinlock); return vStatus; } - spin_unlock_irqrestore( &timer->platformInfo.spinlock,flags ); + adf_os_spin_unlock_irqrestore( &timer->platformInfo.spinlock); VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: Cannot destroy timer in state = %d",__func__, timer->state); @@ -694,7 +689,6 @@ VOS_STATUS vos_timer_destroy ( vos_timer_t *timer ) -------------------------------------------------------------------------*/ VOS_STATUS vos_timer_start( vos_timer_t *timer, v_U32_t expirationTime ) { - unsigned long flags; VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH, "Timer Addr inside voss_start : 0x%pK ", timer ); @@ -728,12 +722,12 @@ VOS_STATUS vos_timer_start( vos_timer_t *timer, v_U32_t expirationTime ) } // make sure the remainer of the logic isn't interrupted - spin_lock_irqsave( &timer->platformInfo.spinlock,flags ); + adf_os_spin_lock_irqsave( &timer->platformInfo.spinlock); // Ensure if the timer can be started if ( VOS_TIMER_STATE_STOPPED != timer->state ) { - spin_unlock_irqrestore( &timer->platformInfo.spinlock,flags ); + adf_os_spin_unlock_irqrestore( &timer->platformInfo.spinlock); VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH, "%s: Cannot start timer in state = %d ",__func__, timer->state); return VOS_STATUS_E_ALREADY; @@ -758,7 +752,7 @@ VOS_STATUS vos_timer_start( vos_timer_t *timer, v_U32_t expirationTime ) } } - spin_unlock_irqrestore( &timer->platformInfo.spinlock,flags ); + adf_os_spin_unlock_irqrestore( &timer->platformInfo.spinlock); return VOS_STATUS_SUCCESS; } @@ -786,8 +780,6 @@ VOS_STATUS vos_timer_start( vos_timer_t *timer, v_U32_t expirationTime ) ------------------------------------------------------------------------*/ VOS_STATUS vos_timer_stop ( vos_timer_t *timer ) { - unsigned long flags; - VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH, "%s: Timer Addr inside voss_stop : 0x%pK",__func__,timer ); @@ -810,11 +802,11 @@ VOS_STATUS vos_timer_stop ( vos_timer_t *timer ) } // Ensure the timer state is correct - spin_lock_irqsave( &timer->platformInfo.spinlock,flags ); + adf_os_spin_lock_irqsave( &timer->platformInfo.spinlock); if ( VOS_TIMER_STATE_RUNNING != timer->state ) { - spin_unlock_irqrestore( &timer->platformInfo.spinlock,flags ); + adf_os_spin_unlock_irqrestore( &timer->platformInfo.spinlock); VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO_HIGH, "%s: Cannot stop timer in state = %d", __func__, timer->state); @@ -825,7 +817,7 @@ VOS_STATUS vos_timer_stop ( vos_timer_t *timer ) del_timer(&(timer->platformInfo.Timer)); - spin_unlock_irqrestore( &timer->platformInfo.spinlock,flags ); + adf_os_spin_unlock_irqrestore( &timer->platformInfo.spinlock); tryAllowingSleep( timer->type ); @@ -929,7 +921,7 @@ void vos_wdthread_init_timer_work(void *callbackptr) return; } - spin_lock_init(&context->wdthread_work_lock); + adf_os_spinlock_init(&context->wdthread_work_lock); INIT_LIST_HEAD(&context->wdthread_timer_work_list); vos_init_work(&context->wdthread_work, callbackptr); } @@ -977,21 +969,21 @@ static void __vos_process_wd_timer(void) vos_global_context = (pVosContextType)vos_context; - spin_lock(&vos_global_context->wdthread_work_lock); + adf_os_spin_lock(&vos_global_context->wdthread_work_lock); list_for_each_safe(pos, next, &vos_global_context->wdthread_timer_work_list) { wdthread_timer_work = list_entry(pos, struct vos_wdthread_timer_work, node); list_del(pos); - spin_unlock(&vos_global_context->wdthread_work_lock); + adf_os_spin_unlock(&vos_global_context->wdthread_work_lock); if (NULL != wdthread_timer_work->callback) wdthread_timer_work->callback( wdthread_timer_work->userdata); vos_mem_free(wdthread_timer_work); - spin_lock(&vos_global_context->wdthread_work_lock); + adf_os_spin_lock(&vos_global_context->wdthread_work_lock); } - spin_unlock(&vos_global_context->wdthread_work_lock); + adf_os_spin_unlock(&vos_global_context->wdthread_work_lock); return; } diff --git a/CORE/VOSS/src/vos_trace.c b/CORE/VOSS/src/vos_trace.c index b25ef46a6d2f..fec44079a090 100644 --- a/CORE/VOSS/src/vos_trace.c +++ b/CORE/VOSS/src/vos_trace.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2014, 2016-2017 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2014, 2016-2018 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -120,7 +120,7 @@ moduleTraceInfo gVosTraceInfo[ VOS_MODULE_ID_MAX ] = /*------------------------------------------------------------------------- Static and Global variables ------------------------------------------------------------------------*/ -static spinlock_t ltraceLock; +static adf_os_spinlock_t ltraceLock; static tvosTraceRecord gvosTraceTbl[MAX_VOS_TRACE_RECORDS]; // Global vosTraceData @@ -498,7 +498,6 @@ void vos_register_debugcb_init(void) void vos_trace(v_U8_t module, v_U8_t code, v_U16_t session, v_U32_t data) { tpvosTraceRecord rec = NULL; - unsigned long flags; char time[20]; if (!gvosTraceData.enable) @@ -514,7 +513,7 @@ void vos_trace(v_U8_t module, v_U8_t code, v_U16_t session, v_U32_t data) vos_get_time_of_the_day_in_hr_min_sec_usec(time, sizeof(time)); /* Aquire the lock so that only one thread at a time can fill the ring buffer */ - spin_lock_irqsave(<raceLock, flags); + adf_os_spin_lock_irqsave(<raceLock); gvosTraceData.num++; @@ -558,7 +557,7 @@ void vos_trace(v_U8_t module, v_U8_t code, v_U16_t session, v_U32_t data) rec->module = module; rec->pid = (in_interrupt() ? 0 : current->pid); gvosTraceData.numSinceLastDump ++; - spin_unlock_irqrestore(<raceLock, flags); + adf_os_spin_unlock_irqrestore(<raceLock); } @@ -570,7 +569,7 @@ void vos_trace(v_U8_t module, v_U8_t code, v_U16_t session, v_U32_t data) ----------------------------------------------------------------------------*/ VOS_STATUS vos_trace_spin_lock_init() { - spin_lock_init(<raceLock); + adf_os_spinlock_init(<raceLock); return VOS_STATUS_SUCCESS; } @@ -628,7 +627,7 @@ void vosTraceDumpAll(void *pMac, v_U8_t code, v_U8_t session, gvosTraceData.num, gvosTraceData.head, gvosTraceData.tail); /* Aquire the lock so that only one thread at a time can read the ring buffer */ - spin_lock(<raceLock); + adf_os_spin_lock(<raceLock); if (gvosTraceData.head != INVALID_VOS_TRACE_ADDR) { @@ -656,7 +655,7 @@ void vosTraceDumpAll(void *pMac, v_U8_t code, v_U8_t session, we might re-visit and use this member to track how many latest messages got added while we were dumping from ring buffer */ gvosTraceData.numSinceLastDump = 0; - spin_unlock(<raceLock); + adf_os_spin_unlock(<raceLock); for (;;) { if ((code == 0 || (code == pRecord.code)) && @@ -681,7 +680,7 @@ void vosTraceDumpAll(void *pMac, v_U8_t code, v_U8_t session, } i += 1; - spin_lock(<raceLock); + adf_os_spin_lock(<raceLock); if (MAX_VOS_TRACE_RECORDS == i) { i = 0; @@ -691,12 +690,12 @@ void vosTraceDumpAll(void *pMac, v_U8_t code, v_U8_t session, { pRecord = gvosTraceTbl[i]; } - spin_unlock(<raceLock); + adf_os_spin_unlock(<raceLock); } } else { - spin_unlock(<raceLock); + adf_os_spin_unlock(<raceLock); } } diff --git a/CORE/WDA/inc/legacy/halMsgApi.h b/CORE/WDA/inc/legacy/halMsgApi.h index d0da39367bd2..930ae2fedf9c 100644 --- a/CORE/WDA/inc/legacy/halMsgApi.h +++ b/CORE/WDA/inc/legacy/halMsgApi.h @@ -960,24 +960,6 @@ typedef struct #endif -//HAL MSG: SIR_HAL_UPDATE_CF_IND -typedef struct -{ - - tANI_U8 bssIdx; - - /* - * cfpCount indicates how many DTIMs (including the current frame) appear before the next CFP start. - * A CFPCount of 0 indicates that the current DTIM marks the start of the CFP. - */ - tANI_U8 cfpCount; - - /* cfpPeriod indicates the number of DTIM intervals between the start of CFPs. */ - tANI_U8 cfpPeriod; - -}tUpdateCFParams, *tpUpdateCFParams; - - //HAL MSG: SIR_HAL_UPDATE_DTIM_IND //This message not required, as Softmac is supposed to read these values from the beacon. diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h index 6798d16263f8..b56d1acb71e8 100644 --- a/CORE/WDA/inc/wlan_qct_wda.h +++ b/CORE/WDA/inc/wlan_qct_wda.h @@ -638,7 +638,6 @@ tSirRetStatus uMacPostCtrlMsg(void* pSirGlobal, tSirMbMsg* pMb); #define WDA_UPDATE_STARATEINFO_RSP SIR_HAL_UPDATE_STARATEINFO_RSP #define WDA_UPDATE_BEACON_IND SIR_HAL_UPDATE_BEACON_IND -#define WDA_UPDATE_CF_IND SIR_HAL_UPDATE_CF_IND #define WDA_CHNL_SWITCH_REQ SIR_HAL_CHNL_SWITCH_REQ #define WDA_ADD_TS_REQ SIR_HAL_ADD_TS_REQ #define WDA_DEL_TS_REQ SIR_HAL_DEL_TS_REQ @@ -477,6 +477,11 @@ ifeq ($(CONFIG_QCOM_TDLS),y) HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_tdls.o endif +ifeq ($(CONFIG_NETWORK_PHY_TIMESTAMPING), y) +CONFIG_WLAN_SYNC_TSF_PLUS := y +CONFIG_WLAN_SYNC_TSF_PTP := y +endif + ifeq ($(CONFIG_WLAN_SYNC_TSF_PLUS), y) CONFIG_WLAN_SYNC_TSF := y endif @@ -1205,6 +1210,7 @@ endif ifeq ($(CONFIG_SLUB_DEBUG_ON),y) CDEFINES += -DTIMER_MANAGER CDEFINES += -DMEMORY_DEBUG +CDEFINES += -DNBUF_MAP_UNMAP_DEBUG endif ifeq ($(HAVE_CFG80211),1) @@ -1617,6 +1623,10 @@ ifeq ($(CONFIG_WLAN_SYNC_TSF_PLUS), y) CDEFINES += -DWLAN_FEATURE_TSF_PLUS endif +ifeq ($(CONFIG_WLAN_SYNC_TSF_PTP), y) +CDEFINES += -DWLAN_FEATURE_TSF_PTP +endif + # Enable target dump for non-qualcomm platform ifeq ($(CONFIG_NON_QC_PLATFORM), y) CDEFINES += -DCONFIG_NON_QC_PLATFORM @@ -1688,7 +1698,6 @@ ifeq ($(CONFIG_WLAN_OFFLOAD_PACKETS),y) CDEFINES += -DWLAN_FEATURE_OFFLOAD_PACKETS endif - ifeq ($(CONFIG_WLAN_UDP_RESPONSE_OFFLOAD),y) CDEFINES += -DWLAN_FEATURE_UDP_RESPONSE_OFFLOAD endif |
