Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
authorJohn W. Linville <linville@tuxdriver.com>
Mon, 4 Nov 2013 19:51:28 +0000 (14:51 -0500)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 4 Nov 2013 19:51:28 +0000 (14:51 -0500)
Conflicts:
drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h

1  2 
drivers/net/wireless/ath/ath10k/debug.h
drivers/net/wireless/ath/ath10k/wmi.c
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/atmel.c
drivers/net/wireless/brcm80211/brcmfmac/sdio_host.h
drivers/net/wireless/iwlwifi/mvm/rs.h
include/net/bluetooth/bluetooth.h
include/net/bluetooth/hci_core.h
include/net/bluetooth/rfcomm.h

index 6576b82a8d86198e6edee01ddd67fcb0d6975aee,46e640a6968d0cd90c05f2d09b696844d348ef81..3cfe3ee90dbe1d802d7c3b8b4fe0c7cd8c815ee9
@@@ -38,14 -38,15 +38,15 @@@ enum ath10k_debug_mask 
  
  extern unsigned int ath10k_debug_mask;
  
 -extern __printf(1, 2) int ath10k_info(const char *fmt, ...);
 -extern __printf(1, 2) int ath10k_err(const char *fmt, ...);
 -extern __printf(1, 2) int ath10k_warn(const char *fmt, ...);
 +__printf(1, 2) int ath10k_info(const char *fmt, ...);
 +__printf(1, 2) int ath10k_err(const char *fmt, ...);
 +__printf(1, 2) int ath10k_warn(const char *fmt, ...);
  
  #ifdef CONFIG_ATH10K_DEBUGFS
  int ath10k_debug_start(struct ath10k *ar);
  void ath10k_debug_stop(struct ath10k *ar);
  int ath10k_debug_create(struct ath10k *ar);
+ void ath10k_debug_destroy(struct ath10k *ar);
  void ath10k_debug_read_service_map(struct ath10k *ar,
                                   void *service_map,
                                   size_t map_size);
@@@ -67,6 -68,10 +68,10 @@@ static inline int ath10k_debug_create(s
        return 0;
  }
  
+ static inline void ath10k_debug_destroy(struct ath10k *ar)
+ {
+ }
  static inline void ath10k_debug_read_service_map(struct ath10k *ar,
                                                 void *service_map,
                                                 size_t map_size)
@@@ -80,7 -85,7 +85,7 @@@ static inline void ath10k_debug_read_ta
  #endif /* CONFIG_ATH10K_DEBUGFS */
  
  #ifdef CONFIG_ATH10K_DEBUG
 -extern __printf(2, 3) void ath10k_dbg(enum ath10k_debug_mask mask,
 +__printf(2, 3) void ath10k_dbg(enum ath10k_debug_mask mask,
                                      const char *fmt, ...);
  void ath10k_dbg_dump(enum ath10k_debug_mask mask,
                     const char *msg, const char *prefix,
index 33cb19eb3d89e040c8a84ec1608f4e39085d0080,77238afbed759ae11baaaae0d8f168af16251625..ccf3597fd9e2511c11cce44e136c3d1c50c59d06
  #include "wmi.h"
  #include "mac.h"
  
+ /* MAIN WMI cmd track */
+ static struct wmi_cmd_map wmi_cmd_map = {
+       .init_cmdid = WMI_INIT_CMDID,
+       .start_scan_cmdid = WMI_START_SCAN_CMDID,
+       .stop_scan_cmdid = WMI_STOP_SCAN_CMDID,
+       .scan_chan_list_cmdid = WMI_SCAN_CHAN_LIST_CMDID,
+       .scan_sch_prio_tbl_cmdid = WMI_SCAN_SCH_PRIO_TBL_CMDID,
+       .pdev_set_regdomain_cmdid = WMI_PDEV_SET_REGDOMAIN_CMDID,
+       .pdev_set_channel_cmdid = WMI_PDEV_SET_CHANNEL_CMDID,
+       .pdev_set_param_cmdid = WMI_PDEV_SET_PARAM_CMDID,
+       .pdev_pktlog_enable_cmdid = WMI_PDEV_PKTLOG_ENABLE_CMDID,
+       .pdev_pktlog_disable_cmdid = WMI_PDEV_PKTLOG_DISABLE_CMDID,
+       .pdev_set_wmm_params_cmdid = WMI_PDEV_SET_WMM_PARAMS_CMDID,
+       .pdev_set_ht_cap_ie_cmdid = WMI_PDEV_SET_HT_CAP_IE_CMDID,
+       .pdev_set_vht_cap_ie_cmdid = WMI_PDEV_SET_VHT_CAP_IE_CMDID,
+       .pdev_set_dscp_tid_map_cmdid = WMI_PDEV_SET_DSCP_TID_MAP_CMDID,
+       .pdev_set_quiet_mode_cmdid = WMI_PDEV_SET_QUIET_MODE_CMDID,
+       .pdev_green_ap_ps_enable_cmdid = WMI_PDEV_GREEN_AP_PS_ENABLE_CMDID,
+       .pdev_get_tpc_config_cmdid = WMI_PDEV_GET_TPC_CONFIG_CMDID,
+       .pdev_set_base_macaddr_cmdid = WMI_PDEV_SET_BASE_MACADDR_CMDID,
+       .vdev_create_cmdid = WMI_VDEV_CREATE_CMDID,
+       .vdev_delete_cmdid = WMI_VDEV_DELETE_CMDID,
+       .vdev_start_request_cmdid = WMI_VDEV_START_REQUEST_CMDID,
+       .vdev_restart_request_cmdid = WMI_VDEV_RESTART_REQUEST_CMDID,
+       .vdev_up_cmdid = WMI_VDEV_UP_CMDID,
+       .vdev_stop_cmdid = WMI_VDEV_STOP_CMDID,
+       .vdev_down_cmdid = WMI_VDEV_DOWN_CMDID,
+       .vdev_set_param_cmdid = WMI_VDEV_SET_PARAM_CMDID,
+       .vdev_install_key_cmdid = WMI_VDEV_INSTALL_KEY_CMDID,
+       .peer_create_cmdid = WMI_PEER_CREATE_CMDID,
+       .peer_delete_cmdid = WMI_PEER_DELETE_CMDID,
+       .peer_flush_tids_cmdid = WMI_PEER_FLUSH_TIDS_CMDID,
+       .peer_set_param_cmdid = WMI_PEER_SET_PARAM_CMDID,
+       .peer_assoc_cmdid = WMI_PEER_ASSOC_CMDID,
+       .peer_add_wds_entry_cmdid = WMI_PEER_ADD_WDS_ENTRY_CMDID,
+       .peer_remove_wds_entry_cmdid = WMI_PEER_REMOVE_WDS_ENTRY_CMDID,
+       .peer_mcast_group_cmdid = WMI_PEER_MCAST_GROUP_CMDID,
+       .bcn_tx_cmdid = WMI_BCN_TX_CMDID,
+       .pdev_send_bcn_cmdid = WMI_PDEV_SEND_BCN_CMDID,
+       .bcn_tmpl_cmdid = WMI_BCN_TMPL_CMDID,
+       .bcn_filter_rx_cmdid = WMI_BCN_FILTER_RX_CMDID,
+       .prb_req_filter_rx_cmdid = WMI_PRB_REQ_FILTER_RX_CMDID,
+       .mgmt_tx_cmdid = WMI_MGMT_TX_CMDID,
+       .prb_tmpl_cmdid = WMI_PRB_TMPL_CMDID,
+       .addba_clear_resp_cmdid = WMI_ADDBA_CLEAR_RESP_CMDID,
+       .addba_send_cmdid = WMI_ADDBA_SEND_CMDID,
+       .addba_status_cmdid = WMI_ADDBA_STATUS_CMDID,
+       .delba_send_cmdid = WMI_DELBA_SEND_CMDID,
+       .addba_set_resp_cmdid = WMI_ADDBA_SET_RESP_CMDID,
+       .send_singleamsdu_cmdid = WMI_SEND_SINGLEAMSDU_CMDID,
+       .sta_powersave_mode_cmdid = WMI_STA_POWERSAVE_MODE_CMDID,
+       .sta_powersave_param_cmdid = WMI_STA_POWERSAVE_PARAM_CMDID,
+       .sta_mimo_ps_mode_cmdid = WMI_STA_MIMO_PS_MODE_CMDID,
+       .pdev_dfs_enable_cmdid = WMI_PDEV_DFS_ENABLE_CMDID,
+       .pdev_dfs_disable_cmdid = WMI_PDEV_DFS_DISABLE_CMDID,
+       .roam_scan_mode = WMI_ROAM_SCAN_MODE,
+       .roam_scan_rssi_threshold = WMI_ROAM_SCAN_RSSI_THRESHOLD,
+       .roam_scan_period = WMI_ROAM_SCAN_PERIOD,
+       .roam_scan_rssi_change_threshold = WMI_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
+       .roam_ap_profile = WMI_ROAM_AP_PROFILE,
+       .ofl_scan_add_ap_profile = WMI_ROAM_AP_PROFILE,
+       .ofl_scan_remove_ap_profile = WMI_OFL_SCAN_REMOVE_AP_PROFILE,
+       .ofl_scan_period = WMI_OFL_SCAN_PERIOD,
+       .p2p_dev_set_device_info = WMI_P2P_DEV_SET_DEVICE_INFO,
+       .p2p_dev_set_discoverability = WMI_P2P_DEV_SET_DISCOVERABILITY,
+       .p2p_go_set_beacon_ie = WMI_P2P_GO_SET_BEACON_IE,
+       .p2p_go_set_probe_resp_ie = WMI_P2P_GO_SET_PROBE_RESP_IE,
+       .p2p_set_vendor_ie_data_cmdid = WMI_P2P_SET_VENDOR_IE_DATA_CMDID,
+       .ap_ps_peer_param_cmdid = WMI_AP_PS_PEER_PARAM_CMDID,
+       .ap_ps_peer_uapsd_coex_cmdid = WMI_AP_PS_PEER_UAPSD_COEX_CMDID,
+       .peer_rate_retry_sched_cmdid = WMI_PEER_RATE_RETRY_SCHED_CMDID,
+       .wlan_profile_trigger_cmdid = WMI_WLAN_PROFILE_TRIGGER_CMDID,
+       .wlan_profile_set_hist_intvl_cmdid =
+                               WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
+       .wlan_profile_get_profile_data_cmdid =
+                               WMI_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
+       .wlan_profile_enable_profile_id_cmdid =
+                               WMI_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
+       .wlan_profile_list_profile_id_cmdid =
+                               WMI_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
+       .pdev_suspend_cmdid = WMI_PDEV_SUSPEND_CMDID,
+       .pdev_resume_cmdid = WMI_PDEV_RESUME_CMDID,
+       .add_bcn_filter_cmdid = WMI_ADD_BCN_FILTER_CMDID,
+       .rmv_bcn_filter_cmdid = WMI_RMV_BCN_FILTER_CMDID,
+       .wow_add_wake_pattern_cmdid = WMI_WOW_ADD_WAKE_PATTERN_CMDID,
+       .wow_del_wake_pattern_cmdid = WMI_WOW_DEL_WAKE_PATTERN_CMDID,
+       .wow_enable_disable_wake_event_cmdid =
+                               WMI_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
+       .wow_enable_cmdid = WMI_WOW_ENABLE_CMDID,
+       .wow_hostwakeup_from_sleep_cmdid = WMI_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
+       .rtt_measreq_cmdid = WMI_RTT_MEASREQ_CMDID,
+       .rtt_tsf_cmdid = WMI_RTT_TSF_CMDID,
+       .vdev_spectral_scan_configure_cmdid =
+                               WMI_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
+       .vdev_spectral_scan_enable_cmdid = WMI_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
+       .request_stats_cmdid = WMI_REQUEST_STATS_CMDID,
+       .set_arp_ns_offload_cmdid = WMI_SET_ARP_NS_OFFLOAD_CMDID,
+       .network_list_offload_config_cmdid =
+                               WMI_NETWORK_LIST_OFFLOAD_CONFIG_CMDID,
+       .gtk_offload_cmdid = WMI_GTK_OFFLOAD_CMDID,
+       .csa_offload_enable_cmdid = WMI_CSA_OFFLOAD_ENABLE_CMDID,
+       .csa_offload_chanswitch_cmdid = WMI_CSA_OFFLOAD_CHANSWITCH_CMDID,
+       .chatter_set_mode_cmdid = WMI_CHATTER_SET_MODE_CMDID,
+       .peer_tid_addba_cmdid = WMI_PEER_TID_ADDBA_CMDID,
+       .peer_tid_delba_cmdid = WMI_PEER_TID_DELBA_CMDID,
+       .sta_dtim_ps_method_cmdid = WMI_STA_DTIM_PS_METHOD_CMDID,
+       .sta_uapsd_auto_trig_cmdid = WMI_STA_UAPSD_AUTO_TRIG_CMDID,
+       .sta_keepalive_cmd = WMI_STA_KEEPALIVE_CMD,
+       .echo_cmdid = WMI_ECHO_CMDID,
+       .pdev_utf_cmdid = WMI_PDEV_UTF_CMDID,
+       .dbglog_cfg_cmdid = WMI_DBGLOG_CFG_CMDID,
+       .pdev_qvit_cmdid = WMI_PDEV_QVIT_CMDID,
+       .pdev_ftm_intg_cmdid = WMI_PDEV_FTM_INTG_CMDID,
+       .vdev_set_keepalive_cmdid = WMI_VDEV_SET_KEEPALIVE_CMDID,
+       .vdev_get_keepalive_cmdid = WMI_VDEV_GET_KEEPALIVE_CMDID,
+       .force_fw_hang_cmdid = WMI_FORCE_FW_HANG_CMDID,
+       .gpio_config_cmdid = WMI_GPIO_CONFIG_CMDID,
+       .gpio_output_cmdid = WMI_GPIO_OUTPUT_CMDID,
+ };
+ /* 10.X WMI cmd track */
+ static struct wmi_cmd_map wmi_10x_cmd_map = {
+       .init_cmdid = WMI_10X_INIT_CMDID,
+       .start_scan_cmdid = WMI_10X_START_SCAN_CMDID,
+       .stop_scan_cmdid = WMI_10X_STOP_SCAN_CMDID,
+       .scan_chan_list_cmdid = WMI_10X_SCAN_CHAN_LIST_CMDID,
+       .scan_sch_prio_tbl_cmdid = WMI_CMD_UNSUPPORTED,
+       .pdev_set_regdomain_cmdid = WMI_10X_PDEV_SET_REGDOMAIN_CMDID,
+       .pdev_set_channel_cmdid = WMI_10X_PDEV_SET_CHANNEL_CMDID,
+       .pdev_set_param_cmdid = WMI_10X_PDEV_SET_PARAM_CMDID,
+       .pdev_pktlog_enable_cmdid = WMI_10X_PDEV_PKTLOG_ENABLE_CMDID,
+       .pdev_pktlog_disable_cmdid = WMI_10X_PDEV_PKTLOG_DISABLE_CMDID,
+       .pdev_set_wmm_params_cmdid = WMI_10X_PDEV_SET_WMM_PARAMS_CMDID,
+       .pdev_set_ht_cap_ie_cmdid = WMI_10X_PDEV_SET_HT_CAP_IE_CMDID,
+       .pdev_set_vht_cap_ie_cmdid = WMI_10X_PDEV_SET_VHT_CAP_IE_CMDID,
+       .pdev_set_dscp_tid_map_cmdid = WMI_10X_PDEV_SET_DSCP_TID_MAP_CMDID,
+       .pdev_set_quiet_mode_cmdid = WMI_10X_PDEV_SET_QUIET_MODE_CMDID,
+       .pdev_green_ap_ps_enable_cmdid = WMI_10X_PDEV_GREEN_AP_PS_ENABLE_CMDID,
+       .pdev_get_tpc_config_cmdid = WMI_10X_PDEV_GET_TPC_CONFIG_CMDID,
+       .pdev_set_base_macaddr_cmdid = WMI_10X_PDEV_SET_BASE_MACADDR_CMDID,
+       .vdev_create_cmdid = WMI_10X_VDEV_CREATE_CMDID,
+       .vdev_delete_cmdid = WMI_10X_VDEV_DELETE_CMDID,
+       .vdev_start_request_cmdid = WMI_10X_VDEV_START_REQUEST_CMDID,
+       .vdev_restart_request_cmdid = WMI_10X_VDEV_RESTART_REQUEST_CMDID,
+       .vdev_up_cmdid = WMI_10X_VDEV_UP_CMDID,
+       .vdev_stop_cmdid = WMI_10X_VDEV_STOP_CMDID,
+       .vdev_down_cmdid = WMI_10X_VDEV_DOWN_CMDID,
+       .vdev_set_param_cmdid = WMI_10X_VDEV_SET_PARAM_CMDID,
+       .vdev_install_key_cmdid = WMI_10X_VDEV_INSTALL_KEY_CMDID,
+       .peer_create_cmdid = WMI_10X_PEER_CREATE_CMDID,
+       .peer_delete_cmdid = WMI_10X_PEER_DELETE_CMDID,
+       .peer_flush_tids_cmdid = WMI_10X_PEER_FLUSH_TIDS_CMDID,
+       .peer_set_param_cmdid = WMI_10X_PEER_SET_PARAM_CMDID,
+       .peer_assoc_cmdid = WMI_10X_PEER_ASSOC_CMDID,
+       .peer_add_wds_entry_cmdid = WMI_10X_PEER_ADD_WDS_ENTRY_CMDID,
+       .peer_remove_wds_entry_cmdid = WMI_10X_PEER_REMOVE_WDS_ENTRY_CMDID,
+       .peer_mcast_group_cmdid = WMI_10X_PEER_MCAST_GROUP_CMDID,
+       .bcn_tx_cmdid = WMI_10X_BCN_TX_CMDID,
+       .pdev_send_bcn_cmdid = WMI_10X_PDEV_SEND_BCN_CMDID,
+       .bcn_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
+       .bcn_filter_rx_cmdid = WMI_10X_BCN_FILTER_RX_CMDID,
+       .prb_req_filter_rx_cmdid = WMI_10X_PRB_REQ_FILTER_RX_CMDID,
+       .mgmt_tx_cmdid = WMI_10X_MGMT_TX_CMDID,
+       .prb_tmpl_cmdid = WMI_CMD_UNSUPPORTED,
+       .addba_clear_resp_cmdid = WMI_10X_ADDBA_CLEAR_RESP_CMDID,
+       .addba_send_cmdid = WMI_10X_ADDBA_SEND_CMDID,
+       .addba_status_cmdid = WMI_10X_ADDBA_STATUS_CMDID,
+       .delba_send_cmdid = WMI_10X_DELBA_SEND_CMDID,
+       .addba_set_resp_cmdid = WMI_10X_ADDBA_SET_RESP_CMDID,
+       .send_singleamsdu_cmdid = WMI_10X_SEND_SINGLEAMSDU_CMDID,
+       .sta_powersave_mode_cmdid = WMI_10X_STA_POWERSAVE_MODE_CMDID,
+       .sta_powersave_param_cmdid = WMI_10X_STA_POWERSAVE_PARAM_CMDID,
+       .sta_mimo_ps_mode_cmdid = WMI_10X_STA_MIMO_PS_MODE_CMDID,
+       .pdev_dfs_enable_cmdid = WMI_10X_PDEV_DFS_ENABLE_CMDID,
+       .pdev_dfs_disable_cmdid = WMI_10X_PDEV_DFS_DISABLE_CMDID,
+       .roam_scan_mode = WMI_10X_ROAM_SCAN_MODE,
+       .roam_scan_rssi_threshold = WMI_10X_ROAM_SCAN_RSSI_THRESHOLD,
+       .roam_scan_period = WMI_10X_ROAM_SCAN_PERIOD,
+       .roam_scan_rssi_change_threshold =
+                               WMI_10X_ROAM_SCAN_RSSI_CHANGE_THRESHOLD,
+       .roam_ap_profile = WMI_10X_ROAM_AP_PROFILE,
+       .ofl_scan_add_ap_profile = WMI_10X_OFL_SCAN_ADD_AP_PROFILE,
+       .ofl_scan_remove_ap_profile = WMI_10X_OFL_SCAN_REMOVE_AP_PROFILE,
+       .ofl_scan_period = WMI_10X_OFL_SCAN_PERIOD,
+       .p2p_dev_set_device_info = WMI_10X_P2P_DEV_SET_DEVICE_INFO,
+       .p2p_dev_set_discoverability = WMI_10X_P2P_DEV_SET_DISCOVERABILITY,
+       .p2p_go_set_beacon_ie = WMI_10X_P2P_GO_SET_BEACON_IE,
+       .p2p_go_set_probe_resp_ie = WMI_10X_P2P_GO_SET_PROBE_RESP_IE,
+       .p2p_set_vendor_ie_data_cmdid = WMI_CMD_UNSUPPORTED,
+       .ap_ps_peer_param_cmdid = WMI_CMD_UNSUPPORTED,
+       .ap_ps_peer_uapsd_coex_cmdid = WMI_CMD_UNSUPPORTED,
+       .peer_rate_retry_sched_cmdid = WMI_10X_PEER_RATE_RETRY_SCHED_CMDID,
+       .wlan_profile_trigger_cmdid = WMI_10X_WLAN_PROFILE_TRIGGER_CMDID,
+       .wlan_profile_set_hist_intvl_cmdid =
+                               WMI_10X_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
+       .wlan_profile_get_profile_data_cmdid =
+                               WMI_10X_WLAN_PROFILE_GET_PROFILE_DATA_CMDID,
+       .wlan_profile_enable_profile_id_cmdid =
+                               WMI_10X_WLAN_PROFILE_ENABLE_PROFILE_ID_CMDID,
+       .wlan_profile_list_profile_id_cmdid =
+                               WMI_10X_WLAN_PROFILE_LIST_PROFILE_ID_CMDID,
+       .pdev_suspend_cmdid = WMI_10X_PDEV_SUSPEND_CMDID,
+       .pdev_resume_cmdid = WMI_10X_PDEV_RESUME_CMDID,
+       .add_bcn_filter_cmdid = WMI_10X_ADD_BCN_FILTER_CMDID,
+       .rmv_bcn_filter_cmdid = WMI_10X_RMV_BCN_FILTER_CMDID,
+       .wow_add_wake_pattern_cmdid = WMI_10X_WOW_ADD_WAKE_PATTERN_CMDID,
+       .wow_del_wake_pattern_cmdid = WMI_10X_WOW_DEL_WAKE_PATTERN_CMDID,
+       .wow_enable_disable_wake_event_cmdid =
+                               WMI_10X_WOW_ENABLE_DISABLE_WAKE_EVENT_CMDID,
+       .wow_enable_cmdid = WMI_10X_WOW_ENABLE_CMDID,
+       .wow_hostwakeup_from_sleep_cmdid =
+                               WMI_10X_WOW_HOSTWAKEUP_FROM_SLEEP_CMDID,
+       .rtt_measreq_cmdid = WMI_10X_RTT_MEASREQ_CMDID,
+       .rtt_tsf_cmdid = WMI_10X_RTT_TSF_CMDID,
+       .vdev_spectral_scan_configure_cmdid =
+                               WMI_10X_VDEV_SPECTRAL_SCAN_CONFIGURE_CMDID,
+       .vdev_spectral_scan_enable_cmdid =
+                               WMI_10X_VDEV_SPECTRAL_SCAN_ENABLE_CMDID,
+       .request_stats_cmdid = WMI_10X_REQUEST_STATS_CMDID,
+       .set_arp_ns_offload_cmdid = WMI_CMD_UNSUPPORTED,
+       .network_list_offload_config_cmdid = WMI_CMD_UNSUPPORTED,
+       .gtk_offload_cmdid = WMI_CMD_UNSUPPORTED,
+       .csa_offload_enable_cmdid = WMI_CMD_UNSUPPORTED,
+       .csa_offload_chanswitch_cmdid = WMI_CMD_UNSUPPORTED,
+       .chatter_set_mode_cmdid = WMI_CMD_UNSUPPORTED,
+       .peer_tid_addba_cmdid = WMI_CMD_UNSUPPORTED,
+       .peer_tid_delba_cmdid = WMI_CMD_UNSUPPORTED,
+       .sta_dtim_ps_method_cmdid = WMI_CMD_UNSUPPORTED,
+       .sta_uapsd_auto_trig_cmdid = WMI_CMD_UNSUPPORTED,
+       .sta_keepalive_cmd = WMI_CMD_UNSUPPORTED,
+       .echo_cmdid = WMI_10X_ECHO_CMDID,
+       .pdev_utf_cmdid = WMI_10X_PDEV_UTF_CMDID,
+       .dbglog_cfg_cmdid = WMI_10X_DBGLOG_CFG_CMDID,
+       .pdev_qvit_cmdid = WMI_10X_PDEV_QVIT_CMDID,
+       .pdev_ftm_intg_cmdid = WMI_CMD_UNSUPPORTED,
+       .vdev_set_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
+       .vdev_get_keepalive_cmdid = WMI_CMD_UNSUPPORTED,
+       .force_fw_hang_cmdid = WMI_CMD_UNSUPPORTED,
+       .gpio_config_cmdid = WMI_10X_GPIO_CONFIG_CMDID,
+       .gpio_output_cmdid = WMI_10X_GPIO_OUTPUT_CMDID,
+ };
+ /* MAIN WMI VDEV param map */
+ static struct wmi_vdev_param_map wmi_vdev_param_map = {
+       .rts_threshold = WMI_VDEV_PARAM_RTS_THRESHOLD,
+       .fragmentation_threshold = WMI_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
+       .beacon_interval = WMI_VDEV_PARAM_BEACON_INTERVAL,
+       .listen_interval = WMI_VDEV_PARAM_LISTEN_INTERVAL,
+       .multicast_rate = WMI_VDEV_PARAM_MULTICAST_RATE,
+       .mgmt_tx_rate = WMI_VDEV_PARAM_MGMT_TX_RATE,
+       .slot_time = WMI_VDEV_PARAM_SLOT_TIME,
+       .preamble = WMI_VDEV_PARAM_PREAMBLE,
+       .swba_time = WMI_VDEV_PARAM_SWBA_TIME,
+       .wmi_vdev_stats_update_period = WMI_VDEV_STATS_UPDATE_PERIOD,
+       .wmi_vdev_pwrsave_ageout_time = WMI_VDEV_PWRSAVE_AGEOUT_TIME,
+       .wmi_vdev_host_swba_interval = WMI_VDEV_HOST_SWBA_INTERVAL,
+       .dtim_period = WMI_VDEV_PARAM_DTIM_PERIOD,
+       .wmi_vdev_oc_scheduler_air_time_limit =
+                                       WMI_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
+       .wds = WMI_VDEV_PARAM_WDS,
+       .atim_window = WMI_VDEV_PARAM_ATIM_WINDOW,
+       .bmiss_count_max = WMI_VDEV_PARAM_BMISS_COUNT_MAX,
+       .bmiss_first_bcnt = WMI_VDEV_PARAM_BMISS_FIRST_BCNT,
+       .bmiss_final_bcnt = WMI_VDEV_PARAM_BMISS_FINAL_BCNT,
+       .feature_wmm = WMI_VDEV_PARAM_FEATURE_WMM,
+       .chwidth = WMI_VDEV_PARAM_CHWIDTH,
+       .chextoffset = WMI_VDEV_PARAM_CHEXTOFFSET,
+       .disable_htprotection = WMI_VDEV_PARAM_DISABLE_HTPROTECTION,
+       .sta_quickkickout = WMI_VDEV_PARAM_STA_QUICKKICKOUT,
+       .mgmt_rate = WMI_VDEV_PARAM_MGMT_RATE,
+       .protection_mode = WMI_VDEV_PARAM_PROTECTION_MODE,
+       .fixed_rate = WMI_VDEV_PARAM_FIXED_RATE,
+       .sgi = WMI_VDEV_PARAM_SGI,
+       .ldpc = WMI_VDEV_PARAM_LDPC,
+       .tx_stbc = WMI_VDEV_PARAM_TX_STBC,
+       .rx_stbc = WMI_VDEV_PARAM_RX_STBC,
+       .intra_bss_fwd = WMI_VDEV_PARAM_INTRA_BSS_FWD,
+       .def_keyid = WMI_VDEV_PARAM_DEF_KEYID,
+       .nss = WMI_VDEV_PARAM_NSS,
+       .bcast_data_rate = WMI_VDEV_PARAM_BCAST_DATA_RATE,
+       .mcast_data_rate = WMI_VDEV_PARAM_MCAST_DATA_RATE,
+       .mcast_indicate = WMI_VDEV_PARAM_MCAST_INDICATE,
+       .dhcp_indicate = WMI_VDEV_PARAM_DHCP_INDICATE,
+       .unknown_dest_indicate = WMI_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
+       .ap_keepalive_min_idle_inactive_time_secs =
+                       WMI_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
+       .ap_keepalive_max_idle_inactive_time_secs =
+                       WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
+       .ap_keepalive_max_unresponsive_time_secs =
+                       WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
+       .ap_enable_nawds = WMI_VDEV_PARAM_AP_ENABLE_NAWDS,
+       .mcast2ucast_set = WMI_VDEV_PARAM_UNSUPPORTED,
+       .enable_rtscts = WMI_VDEV_PARAM_ENABLE_RTSCTS,
+       .txbf = WMI_VDEV_PARAM_TXBF,
+       .packet_powersave = WMI_VDEV_PARAM_PACKET_POWERSAVE,
+       .drop_unencry = WMI_VDEV_PARAM_DROP_UNENCRY,
+       .tx_encap_type = WMI_VDEV_PARAM_TX_ENCAP_TYPE,
+       .ap_detect_out_of_sync_sleeping_sta_time_secs =
+                                       WMI_VDEV_PARAM_UNSUPPORTED,
+ };
+ /* 10.X WMI VDEV param map */
+ static struct wmi_vdev_param_map wmi_10x_vdev_param_map = {
+       .rts_threshold = WMI_10X_VDEV_PARAM_RTS_THRESHOLD,
+       .fragmentation_threshold = WMI_10X_VDEV_PARAM_FRAGMENTATION_THRESHOLD,
+       .beacon_interval = WMI_10X_VDEV_PARAM_BEACON_INTERVAL,
+       .listen_interval = WMI_10X_VDEV_PARAM_LISTEN_INTERVAL,
+       .multicast_rate = WMI_10X_VDEV_PARAM_MULTICAST_RATE,
+       .mgmt_tx_rate = WMI_10X_VDEV_PARAM_MGMT_TX_RATE,
+       .slot_time = WMI_10X_VDEV_PARAM_SLOT_TIME,
+       .preamble = WMI_10X_VDEV_PARAM_PREAMBLE,
+       .swba_time = WMI_10X_VDEV_PARAM_SWBA_TIME,
+       .wmi_vdev_stats_update_period = WMI_10X_VDEV_STATS_UPDATE_PERIOD,
+       .wmi_vdev_pwrsave_ageout_time = WMI_10X_VDEV_PWRSAVE_AGEOUT_TIME,
+       .wmi_vdev_host_swba_interval = WMI_10X_VDEV_HOST_SWBA_INTERVAL,
+       .dtim_period = WMI_10X_VDEV_PARAM_DTIM_PERIOD,
+       .wmi_vdev_oc_scheduler_air_time_limit =
+                               WMI_10X_VDEV_OC_SCHEDULER_AIR_TIME_LIMIT,
+       .wds = WMI_10X_VDEV_PARAM_WDS,
+       .atim_window = WMI_10X_VDEV_PARAM_ATIM_WINDOW,
+       .bmiss_count_max = WMI_10X_VDEV_PARAM_BMISS_COUNT_MAX,
+       .bmiss_first_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
+       .bmiss_final_bcnt = WMI_VDEV_PARAM_UNSUPPORTED,
+       .feature_wmm = WMI_10X_VDEV_PARAM_FEATURE_WMM,
+       .chwidth = WMI_10X_VDEV_PARAM_CHWIDTH,
+       .chextoffset = WMI_10X_VDEV_PARAM_CHEXTOFFSET,
+       .disable_htprotection = WMI_10X_VDEV_PARAM_DISABLE_HTPROTECTION,
+       .sta_quickkickout = WMI_10X_VDEV_PARAM_STA_QUICKKICKOUT,
+       .mgmt_rate = WMI_10X_VDEV_PARAM_MGMT_RATE,
+       .protection_mode = WMI_10X_VDEV_PARAM_PROTECTION_MODE,
+       .fixed_rate = WMI_10X_VDEV_PARAM_FIXED_RATE,
+       .sgi = WMI_10X_VDEV_PARAM_SGI,
+       .ldpc = WMI_10X_VDEV_PARAM_LDPC,
+       .tx_stbc = WMI_10X_VDEV_PARAM_TX_STBC,
+       .rx_stbc = WMI_10X_VDEV_PARAM_RX_STBC,
+       .intra_bss_fwd = WMI_10X_VDEV_PARAM_INTRA_BSS_FWD,
+       .def_keyid = WMI_10X_VDEV_PARAM_DEF_KEYID,
+       .nss = WMI_10X_VDEV_PARAM_NSS,
+       .bcast_data_rate = WMI_10X_VDEV_PARAM_BCAST_DATA_RATE,
+       .mcast_data_rate = WMI_10X_VDEV_PARAM_MCAST_DATA_RATE,
+       .mcast_indicate = WMI_10X_VDEV_PARAM_MCAST_INDICATE,
+       .dhcp_indicate = WMI_10X_VDEV_PARAM_DHCP_INDICATE,
+       .unknown_dest_indicate = WMI_10X_VDEV_PARAM_UNKNOWN_DEST_INDICATE,
+       .ap_keepalive_min_idle_inactive_time_secs =
+               WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MIN_IDLE_INACTIVE_TIME_SECS,
+       .ap_keepalive_max_idle_inactive_time_secs =
+               WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_IDLE_INACTIVE_TIME_SECS,
+       .ap_keepalive_max_unresponsive_time_secs =
+               WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
+       .ap_enable_nawds = WMI_10X_VDEV_PARAM_AP_ENABLE_NAWDS,
+       .mcast2ucast_set = WMI_10X_VDEV_PARAM_MCAST2UCAST_SET,
+       .enable_rtscts = WMI_10X_VDEV_PARAM_ENABLE_RTSCTS,
+       .txbf = WMI_VDEV_PARAM_UNSUPPORTED,
+       .packet_powersave = WMI_VDEV_PARAM_UNSUPPORTED,
+       .drop_unencry = WMI_VDEV_PARAM_UNSUPPORTED,
+       .tx_encap_type = WMI_VDEV_PARAM_UNSUPPORTED,
+       .ap_detect_out_of_sync_sleeping_sta_time_secs =
+               WMI_10X_VDEV_PARAM_AP_DETECT_OUT_OF_SYNC_SLEEPING_STA_TIME_SECS,
+ };
+ static struct wmi_pdev_param_map wmi_pdev_param_map = {
+       .tx_chain_mask = WMI_PDEV_PARAM_TX_CHAIN_MASK,
+       .rx_chain_mask = WMI_PDEV_PARAM_RX_CHAIN_MASK,
+       .txpower_limit2g = WMI_PDEV_PARAM_TXPOWER_LIMIT2G,
+       .txpower_limit5g = WMI_PDEV_PARAM_TXPOWER_LIMIT5G,
+       .txpower_scale = WMI_PDEV_PARAM_TXPOWER_SCALE,
+       .beacon_gen_mode = WMI_PDEV_PARAM_BEACON_GEN_MODE,
+       .beacon_tx_mode = WMI_PDEV_PARAM_BEACON_TX_MODE,
+       .resmgr_offchan_mode = WMI_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
+       .protection_mode = WMI_PDEV_PARAM_PROTECTION_MODE,
+       .dynamic_bw = WMI_PDEV_PARAM_DYNAMIC_BW,
+       .non_agg_sw_retry_th = WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
+       .agg_sw_retry_th = WMI_PDEV_PARAM_AGG_SW_RETRY_TH,
+       .sta_kickout_th = WMI_PDEV_PARAM_STA_KICKOUT_TH,
+       .ac_aggrsize_scaling = WMI_PDEV_PARAM_AC_AGGRSIZE_SCALING,
+       .ltr_enable = WMI_PDEV_PARAM_LTR_ENABLE,
+       .ltr_ac_latency_be = WMI_PDEV_PARAM_LTR_AC_LATENCY_BE,
+       .ltr_ac_latency_bk = WMI_PDEV_PARAM_LTR_AC_LATENCY_BK,
+       .ltr_ac_latency_vi = WMI_PDEV_PARAM_LTR_AC_LATENCY_VI,
+       .ltr_ac_latency_vo = WMI_PDEV_PARAM_LTR_AC_LATENCY_VO,
+       .ltr_ac_latency_timeout = WMI_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
+       .ltr_sleep_override = WMI_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
+       .ltr_rx_override = WMI_PDEV_PARAM_LTR_RX_OVERRIDE,
+       .ltr_tx_activity_timeout = WMI_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
+       .l1ss_enable = WMI_PDEV_PARAM_L1SS_ENABLE,
+       .dsleep_enable = WMI_PDEV_PARAM_DSLEEP_ENABLE,
+       .pcielp_txbuf_flush = WMI_PDEV_PARAM_PCIELP_TXBUF_FLUSH,
+       .pcielp_txbuf_watermark = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
+       .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_EN,
+       .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_PCIELP_TXBUF_TMO_VALUE,
+       .pdev_stats_update_period = WMI_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
+       .vdev_stats_update_period = WMI_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
+       .peer_stats_update_period = WMI_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
+       .bcnflt_stats_update_period = WMI_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
+       .pmf_qos = WMI_PDEV_PARAM_PMF_QOS,
+       .arp_ac_override = WMI_PDEV_PARAM_ARP_AC_OVERRIDE,
+       .arpdhcp_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
+       .dcs = WMI_PDEV_PARAM_DCS,
+       .ani_enable = WMI_PDEV_PARAM_ANI_ENABLE,
+       .ani_poll_period = WMI_PDEV_PARAM_ANI_POLL_PERIOD,
+       .ani_listen_period = WMI_PDEV_PARAM_ANI_LISTEN_PERIOD,
+       .ani_ofdm_level = WMI_PDEV_PARAM_ANI_OFDM_LEVEL,
+       .ani_cck_level = WMI_PDEV_PARAM_ANI_CCK_LEVEL,
+       .dyntxchain = WMI_PDEV_PARAM_DYNTXCHAIN,
+       .proxy_sta = WMI_PDEV_PARAM_PROXY_STA,
+       .idle_ps_config = WMI_PDEV_PARAM_IDLE_PS_CONFIG,
+       .power_gating_sleep = WMI_PDEV_PARAM_POWER_GATING_SLEEP,
+       .fast_channel_reset = WMI_PDEV_PARAM_UNSUPPORTED,
+       .burst_dur = WMI_PDEV_PARAM_UNSUPPORTED,
+       .burst_enable = WMI_PDEV_PARAM_UNSUPPORTED,
+ };
+ static struct wmi_pdev_param_map wmi_10x_pdev_param_map = {
+       .tx_chain_mask = WMI_10X_PDEV_PARAM_TX_CHAIN_MASK,
+       .rx_chain_mask = WMI_10X_PDEV_PARAM_RX_CHAIN_MASK,
+       .txpower_limit2g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT2G,
+       .txpower_limit5g = WMI_10X_PDEV_PARAM_TXPOWER_LIMIT5G,
+       .txpower_scale = WMI_10X_PDEV_PARAM_TXPOWER_SCALE,
+       .beacon_gen_mode = WMI_10X_PDEV_PARAM_BEACON_GEN_MODE,
+       .beacon_tx_mode = WMI_10X_PDEV_PARAM_BEACON_TX_MODE,
+       .resmgr_offchan_mode = WMI_10X_PDEV_PARAM_RESMGR_OFFCHAN_MODE,
+       .protection_mode = WMI_10X_PDEV_PARAM_PROTECTION_MODE,
+       .dynamic_bw = WMI_10X_PDEV_PARAM_DYNAMIC_BW,
+       .non_agg_sw_retry_th = WMI_10X_PDEV_PARAM_NON_AGG_SW_RETRY_TH,
+       .agg_sw_retry_th = WMI_10X_PDEV_PARAM_AGG_SW_RETRY_TH,
+       .sta_kickout_th = WMI_10X_PDEV_PARAM_STA_KICKOUT_TH,
+       .ac_aggrsize_scaling = WMI_10X_PDEV_PARAM_AC_AGGRSIZE_SCALING,
+       .ltr_enable = WMI_10X_PDEV_PARAM_LTR_ENABLE,
+       .ltr_ac_latency_be = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BE,
+       .ltr_ac_latency_bk = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_BK,
+       .ltr_ac_latency_vi = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VI,
+       .ltr_ac_latency_vo = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_VO,
+       .ltr_ac_latency_timeout = WMI_10X_PDEV_PARAM_LTR_AC_LATENCY_TIMEOUT,
+       .ltr_sleep_override = WMI_10X_PDEV_PARAM_LTR_SLEEP_OVERRIDE,
+       .ltr_rx_override = WMI_10X_PDEV_PARAM_LTR_RX_OVERRIDE,
+       .ltr_tx_activity_timeout = WMI_10X_PDEV_PARAM_LTR_TX_ACTIVITY_TIMEOUT,
+       .l1ss_enable = WMI_10X_PDEV_PARAM_L1SS_ENABLE,
+       .dsleep_enable = WMI_10X_PDEV_PARAM_DSLEEP_ENABLE,
+       .pcielp_txbuf_flush = WMI_PDEV_PARAM_UNSUPPORTED,
+       .pcielp_txbuf_watermark = WMI_PDEV_PARAM_UNSUPPORTED,
+       .pcielp_txbuf_tmo_en = WMI_PDEV_PARAM_UNSUPPORTED,
+       .pcielp_txbuf_tmo_value = WMI_PDEV_PARAM_UNSUPPORTED,
+       .pdev_stats_update_period = WMI_10X_PDEV_PARAM_PDEV_STATS_UPDATE_PERIOD,
+       .vdev_stats_update_period = WMI_10X_PDEV_PARAM_VDEV_STATS_UPDATE_PERIOD,
+       .peer_stats_update_period = WMI_10X_PDEV_PARAM_PEER_STATS_UPDATE_PERIOD,
+       .bcnflt_stats_update_period =
+                               WMI_10X_PDEV_PARAM_BCNFLT_STATS_UPDATE_PERIOD,
+       .pmf_qos = WMI_10X_PDEV_PARAM_PMF_QOS,
+       .arp_ac_override = WMI_PDEV_PARAM_UNSUPPORTED,
+       .arpdhcp_ac_override = WMI_10X_PDEV_PARAM_ARPDHCP_AC_OVERRIDE,
+       .dcs = WMI_10X_PDEV_PARAM_DCS,
+       .ani_enable = WMI_10X_PDEV_PARAM_ANI_ENABLE,
+       .ani_poll_period = WMI_10X_PDEV_PARAM_ANI_POLL_PERIOD,
+       .ani_listen_period = WMI_10X_PDEV_PARAM_ANI_LISTEN_PERIOD,
+       .ani_ofdm_level = WMI_10X_PDEV_PARAM_ANI_OFDM_LEVEL,
+       .ani_cck_level = WMI_10X_PDEV_PARAM_ANI_CCK_LEVEL,
+       .dyntxchain = WMI_10X_PDEV_PARAM_DYNTXCHAIN,
+       .proxy_sta = WMI_PDEV_PARAM_UNSUPPORTED,
+       .idle_ps_config = WMI_PDEV_PARAM_UNSUPPORTED,
+       .power_gating_sleep = WMI_PDEV_PARAM_UNSUPPORTED,
+       .fast_channel_reset = WMI_10X_PDEV_PARAM_FAST_CHANNEL_RESET,
+       .burst_dur = WMI_10X_PDEV_PARAM_BURST_DUR,
+       .burst_enable = WMI_10X_PDEV_PARAM_BURST_ENABLE,
+ };
  int ath10k_wmi_wait_for_service_ready(struct ath10k *ar)
  {
        int ret;
@@@ -64,7 -529,7 +529,7 @@@ static void ath10k_wmi_htc_tx_complete(
  }
  
  static int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb,
-                                     enum wmi_cmd_id cmd_id)
+                                     u32 cmd_id)
  {
        struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
        struct wmi_cmd_hdr *cmd_hdr;
@@@ -144,9 -609,17 +609,17 @@@ static void ath10k_wmi_op_ep_tx_credits
  }
  
  static int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb,
-                              enum wmi_cmd_id cmd_id)
+                              u32 cmd_id)
  {
-       int ret = -EINVAL;
+       int ret = -EOPNOTSUPP;
+       might_sleep();
+       if (cmd_id == WMI_CMD_UNSUPPORTED) {
+               ath10k_warn("wmi command %d is not supported by firmware\n",
+                           cmd_id);
+               return ret;
+       }
  
        wait_event_timeout(ar->wmi.tx_credits_wq, ({
                /* try to send pending beacons first. they take priority */
        return ret;
  }
  
+ int ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *skb)
+ {
+       int ret = 0;
+       struct wmi_mgmt_tx_cmd *cmd;
+       struct ieee80211_hdr *hdr;
+       struct sk_buff *wmi_skb;
+       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+       int len;
+       u16 fc;
+       hdr = (struct ieee80211_hdr *)skb->data;
+       fc = le16_to_cpu(hdr->frame_control);
+       if (WARN_ON_ONCE(!ieee80211_is_mgmt(hdr->frame_control)))
+               return -EINVAL;
+       len = sizeof(cmd->hdr) + skb->len;
+       len = round_up(len, 4);
+       wmi_skb = ath10k_wmi_alloc_skb(len);
+       if (!wmi_skb)
+               return -ENOMEM;
+       cmd = (struct wmi_mgmt_tx_cmd *)wmi_skb->data;
+       cmd->hdr.vdev_id = __cpu_to_le32(ATH10K_SKB_CB(skb)->vdev_id);
+       cmd->hdr.tx_rate = 0;
+       cmd->hdr.tx_power = 0;
+       cmd->hdr.buf_len = __cpu_to_le32((u32)(skb->len));
+       memcpy(cmd->hdr.peer_macaddr.addr, ieee80211_get_DA(hdr), ETH_ALEN);
+       memcpy(cmd->buf, skb->data, skb->len);
+       ath10k_dbg(ATH10K_DBG_WMI, "wmi mgmt tx skb %p len %d ftype %02x stype %02x\n",
+                  wmi_skb, wmi_skb->len, fc & IEEE80211_FCTL_FTYPE,
+                  fc & IEEE80211_FCTL_STYPE);
+       /* Send the management frame buffer to the target */
+       ret = ath10k_wmi_cmd_send(ar, wmi_skb, ar->wmi.cmd->mgmt_tx_cmdid);
+       if (ret) {
+               dev_kfree_skb_any(skb);
+               return ret;
+       }
+       /* TODO: report tx status to mac80211 - temporary just ACK */
+       info->flags |= IEEE80211_TX_STAT_ACK;
+       ieee80211_tx_status_irqsafe(ar->hw, skb);
+       return ret;
+ }
  static int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb)
  {
        struct wmi_scan_event *event = (struct wmi_scan_event *)skb->data;
@@@ -964,6 -1488,55 +1488,55 @@@ static void ath10k_wmi_event_vdev_insta
        ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n");
  }
  
+ static void ath10k_wmi_event_inst_rssi_stats(struct ath10k *ar,
+                                            struct sk_buff *skb)
+ {
+       ath10k_dbg(ATH10K_DBG_WMI, "WMI_INST_RSSI_STATS_EVENTID\n");
+ }
+ static void ath10k_wmi_event_vdev_standby_req(struct ath10k *ar,
+                                             struct sk_buff *skb)
+ {
+       ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_STANDBY_REQ_EVENTID\n");
+ }
+ static void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar,
+                                            struct sk_buff *skb)
+ {
+       ath10k_dbg(ATH10K_DBG_WMI, "WMI_VDEV_RESUME_REQ_EVENTID\n");
+ }
+ static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id,
+                                     u32 num_units, u32 unit_len)
+ {
+       dma_addr_t paddr;
+       u32 pool_size;
+       int idx = ar->wmi.num_mem_chunks;
+       pool_size = num_units * round_up(unit_len, 4);
+       if (!pool_size)
+               return -EINVAL;
+       ar->wmi.mem_chunks[idx].vaddr = dma_alloc_coherent(ar->dev,
+                                                          pool_size,
+                                                          &paddr,
+                                                          GFP_ATOMIC);
+       if (!ar->wmi.mem_chunks[idx].vaddr) {
+               ath10k_warn("failed to allocate memory chunk\n");
+               return -ENOMEM;
+       }
+       memset(ar->wmi.mem_chunks[idx].vaddr, 0, pool_size);
+       ar->wmi.mem_chunks[idx].paddr = paddr;
+       ar->wmi.mem_chunks[idx].len = pool_size;
+       ar->wmi.mem_chunks[idx].req_id = req_id;
+       ar->wmi.num_mem_chunks++;
+       return 0;
+ }
  static void ath10k_wmi_service_ready_event_rx(struct ath10k *ar,
                                              struct sk_buff *skb)
  {
        ar->phy_capability = __le32_to_cpu(ev->phy_capability);
        ar->num_rf_chains = __le32_to_cpu(ev->num_rf_chains);
  
-       if (ar->fw_version_build > 636)
+       /* only manually set fw features when not using FW IE format */
+       if (ar->fw_api == 1 && ar->fw_version_build > 636)
                set_bit(ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX, ar->fw_features);
  
        if (ar->num_rf_chains > WMI_MAX_SPATIAL_STREAM) {
        complete(&ar->wmi.service_ready);
  }
  
+ static void ath10k_wmi_10x_service_ready_event_rx(struct ath10k *ar,
+                                                 struct sk_buff *skb)
+ {
+       u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i;
+       int ret;
+       struct wmi_service_ready_event_10x *ev = (void *)skb->data;
+       if (skb->len < sizeof(*ev)) {
+               ath10k_warn("Service ready event was %d B but expected %zu B. Wrong firmware version?\n",
+                           skb->len, sizeof(*ev));
+               return;
+       }
+       ar->hw_min_tx_power = __le32_to_cpu(ev->hw_min_tx_power);
+       ar->hw_max_tx_power = __le32_to_cpu(ev->hw_max_tx_power);
+       ar->ht_cap_info = __le32_to_cpu(ev->ht_cap_info);
+       ar->vht_cap_info = __le32_to_cpu(ev->vht_cap_info);
+       ar->fw_version_major =
+               (__le32_to_cpu(ev->sw_version) & 0xff000000) >> 24;
+       ar->fw_version_minor = (__le32_to_cpu(ev->sw_version) & 0x00ffffff);
+       ar->phy_capability = __le32_to_cpu(ev->phy_capability);
+       ar->num_rf_chains = __le32_to_cpu(ev->num_rf_chains);
+       if (ar->num_rf_chains > WMI_MAX_SPATIAL_STREAM) {
+               ath10k_warn("hardware advertises support for more spatial streams than it should (%d > %d)\n",
+                           ar->num_rf_chains, WMI_MAX_SPATIAL_STREAM);
+               ar->num_rf_chains = WMI_MAX_SPATIAL_STREAM;
+       }
+       ar->ath_common.regulatory.current_rd =
+               __le32_to_cpu(ev->hal_reg_capabilities.eeprom_rd);
+       ath10k_debug_read_service_map(ar, ev->wmi_service_bitmap,
+                                     sizeof(ev->wmi_service_bitmap));
+       if (strlen(ar->hw->wiphy->fw_version) == 0) {
+               snprintf(ar->hw->wiphy->fw_version,
+                        sizeof(ar->hw->wiphy->fw_version),
+                        "%u.%u",
+                        ar->fw_version_major,
+                        ar->fw_version_minor);
+       }
+       num_mem_reqs = __le32_to_cpu(ev->num_mem_reqs);
+       if (num_mem_reqs > ATH10K_MAX_MEM_REQS) {
+               ath10k_warn("requested memory chunks number (%d) exceeds the limit\n",
+                           num_mem_reqs);
+               return;
+       }
+       if (!num_mem_reqs)
+               goto exit;
+       ath10k_dbg(ATH10K_DBG_WMI, "firmware has requested %d memory chunks\n",
+                  num_mem_reqs);
+       for (i = 0; i < num_mem_reqs; ++i) {
+               req_id = __le32_to_cpu(ev->mem_reqs[i].req_id);
+               num_units = __le32_to_cpu(ev->mem_reqs[i].num_units);
+               unit_size = __le32_to_cpu(ev->mem_reqs[i].unit_size);
+               num_unit_info = __le32_to_cpu(ev->mem_reqs[i].num_unit_info);
+               if (num_unit_info & NUM_UNITS_IS_NUM_PEERS)
+                       /* number of units to allocate is number of
+                        * peers, 1 extra for self peer on target */
+                       /* this needs to be tied, host and target
+                        * can get out of sync */
+                       num_units = TARGET_10X_NUM_PEERS + 1;
+               else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS)
+                       num_units = TARGET_10X_NUM_VDEVS + 1;
+               ath10k_dbg(ATH10K_DBG_WMI,
+                          "wmi mem_req_id %d num_units %d num_unit_info %d unit size %d actual units %d\n",
+                          req_id,
+                          __le32_to_cpu(ev->mem_reqs[i].num_units),
+                          num_unit_info,
+                          unit_size,
+                          num_units);
+               ret = ath10k_wmi_alloc_host_mem(ar, req_id, num_units,
+                                               unit_size);
+               if (ret)
+                       return;
+       }
+ exit:
+       ath10k_dbg(ATH10K_DBG_WMI,
+                  "wmi event service ready sw_ver 0x%08x abi_ver %u phy_cap 0x%08x ht_cap 0x%08x vht_cap 0x%08x vht_supp_msc 0x%08x sys_cap_info 0x%08x mem_reqs %u num_rf_chains %u\n",
+                  __le32_to_cpu(ev->sw_version),
+                  __le32_to_cpu(ev->abi_version),
+                  __le32_to_cpu(ev->phy_capability),
+                  __le32_to_cpu(ev->ht_cap_info),
+                  __le32_to_cpu(ev->vht_cap_info),
+                  __le32_to_cpu(ev->vht_supp_mcs),
+                  __le32_to_cpu(ev->sys_cap_info),
+                  __le32_to_cpu(ev->num_mem_reqs),
+                  __le32_to_cpu(ev->num_rf_chains));
+       complete(&ar->wmi.service_ready);
+ }
  static int ath10k_wmi_ready_event_rx(struct ath10k *ar, struct sk_buff *skb)
  {
        struct wmi_ready_event *ev = (struct wmi_ready_event *)skb->data;
        return 0;
  }
  
- static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
+ static void ath10k_wmi_main_process_rx(struct ath10k *ar, struct sk_buff *skb)
  {
        struct wmi_cmd_hdr *cmd_hdr;
        enum wmi_event_id id;
        dev_kfree_skb(skb);
  }
  
+ static void ath10k_wmi_10x_process_rx(struct ath10k *ar, struct sk_buff *skb)
+ {
+       struct wmi_cmd_hdr *cmd_hdr;
+       enum wmi_10x_event_id id;
+       u16 len;
+       cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
+       id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
+       if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
+               return;
+       len = skb->len;
+       trace_ath10k_wmi_event(id, skb->data, skb->len);
+       switch (id) {
+       case WMI_10X_MGMT_RX_EVENTID:
+               ath10k_wmi_event_mgmt_rx(ar, skb);
+               /* mgmt_rx() owns the skb now! */
+               return;
+       case WMI_10X_SCAN_EVENTID:
+               ath10k_wmi_event_scan(ar, skb);
+               break;
+       case WMI_10X_CHAN_INFO_EVENTID:
+               ath10k_wmi_event_chan_info(ar, skb);
+               break;
+       case WMI_10X_ECHO_EVENTID:
+               ath10k_wmi_event_echo(ar, skb);
+               break;
+       case WMI_10X_DEBUG_MESG_EVENTID:
+               ath10k_wmi_event_debug_mesg(ar, skb);
+               break;
+       case WMI_10X_UPDATE_STATS_EVENTID:
+               ath10k_wmi_event_update_stats(ar, skb);
+               break;
+       case WMI_10X_VDEV_START_RESP_EVENTID:
+               ath10k_wmi_event_vdev_start_resp(ar, skb);
+               break;
+       case WMI_10X_VDEV_STOPPED_EVENTID:
+               ath10k_wmi_event_vdev_stopped(ar, skb);
+               break;
+       case WMI_10X_PEER_STA_KICKOUT_EVENTID:
+               ath10k_wmi_event_peer_sta_kickout(ar, skb);
+               break;
+       case WMI_10X_HOST_SWBA_EVENTID:
+               ath10k_wmi_event_host_swba(ar, skb);
+               break;
+       case WMI_10X_TBTTOFFSET_UPDATE_EVENTID:
+               ath10k_wmi_event_tbttoffset_update(ar, skb);
+               break;
+       case WMI_10X_PHYERR_EVENTID:
+               ath10k_wmi_event_phyerr(ar, skb);
+               break;
+       case WMI_10X_ROAM_EVENTID:
+               ath10k_wmi_event_roam(ar, skb);
+               break;
+       case WMI_10X_PROFILE_MATCH:
+               ath10k_wmi_event_profile_match(ar, skb);
+               break;
+       case WMI_10X_DEBUG_PRINT_EVENTID:
+               ath10k_wmi_event_debug_print(ar, skb);
+               break;
+       case WMI_10X_PDEV_QVIT_EVENTID:
+               ath10k_wmi_event_pdev_qvit(ar, skb);
+               break;
+       case WMI_10X_WLAN_PROFILE_DATA_EVENTID:
+               ath10k_wmi_event_wlan_profile_data(ar, skb);
+               break;
+       case WMI_10X_RTT_MEASUREMENT_REPORT_EVENTID:
+               ath10k_wmi_event_rtt_measurement_report(ar, skb);
+               break;
+       case WMI_10X_TSF_MEASUREMENT_REPORT_EVENTID:
+               ath10k_wmi_event_tsf_measurement_report(ar, skb);
+               break;
+       case WMI_10X_RTT_ERROR_REPORT_EVENTID:
+               ath10k_wmi_event_rtt_error_report(ar, skb);
+               break;
+       case WMI_10X_WOW_WAKEUP_HOST_EVENTID:
+               ath10k_wmi_event_wow_wakeup_host(ar, skb);
+               break;
+       case WMI_10X_DCS_INTERFERENCE_EVENTID:
+               ath10k_wmi_event_dcs_interference(ar, skb);
+               break;
+       case WMI_10X_PDEV_TPC_CONFIG_EVENTID:
+               ath10k_wmi_event_pdev_tpc_config(ar, skb);
+               break;
+       case WMI_10X_INST_RSSI_STATS_EVENTID:
+               ath10k_wmi_event_inst_rssi_stats(ar, skb);
+               break;
+       case WMI_10X_VDEV_STANDBY_REQ_EVENTID:
+               ath10k_wmi_event_vdev_standby_req(ar, skb);
+               break;
+       case WMI_10X_VDEV_RESUME_REQ_EVENTID:
+               ath10k_wmi_event_vdev_resume_req(ar, skb);
+               break;
+       case WMI_10X_SERVICE_READY_EVENTID:
+               ath10k_wmi_10x_service_ready_event_rx(ar, skb);
+               break;
+       case WMI_10X_READY_EVENTID:
+               ath10k_wmi_ready_event_rx(ar, skb);
+               break;
+       default:
+               ath10k_warn("Unknown eventid: %d\n", id);
+               break;
+       }
+       dev_kfree_skb(skb);
+ }
+ static void ath10k_wmi_process_rx(struct ath10k *ar, struct sk_buff *skb)
+ {
+       if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
+               ath10k_wmi_10x_process_rx(ar, skb);
+       else
+               ath10k_wmi_main_process_rx(ar, skb);
+ }
  /* WMI Initialization functions */
  int ath10k_wmi_attach(struct ath10k *ar)
  {
+       if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
+               ar->wmi.cmd = &wmi_10x_cmd_map;
+               ar->wmi.vdev_param = &wmi_10x_vdev_param_map;
+               ar->wmi.pdev_param = &wmi_10x_pdev_param_map;
+       } else {
+               ar->wmi.cmd = &wmi_cmd_map;
+               ar->wmi.vdev_param = &wmi_vdev_param_map;
+               ar->wmi.pdev_param = &wmi_pdev_param_map;
+       }
        init_completion(&ar->wmi.service_ready);
        init_completion(&ar->wmi.unified_ready);
        init_waitqueue_head(&ar->wmi.tx_credits_wq);
  
  void ath10k_wmi_detach(struct ath10k *ar)
  {
+       int i;
+       /* free the host memory chunks requested by firmware */
+       for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
+               dma_free_coherent(ar->dev,
+                                 ar->wmi.mem_chunks[i].len,
+                                 ar->wmi.mem_chunks[i].vaddr,
+                                 ar->wmi.mem_chunks[i].paddr);
+       }
+       ar->wmi.num_mem_chunks = 0;
  }
  
  int ath10k_wmi_connect_htc_service(struct ath10k *ar)
@@@ -1237,7 -2053,8 +2053,8 @@@ int ath10k_wmi_pdev_set_regdomain(struc
                   "wmi pdev regdomain rd %x rd2g %x rd5g %x ctl2g %x ctl5g %x\n",
                   rd, rd2g, rd5g, ctl2g, ctl5g);
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SET_REGDOMAIN_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb,
+                                  ar->wmi.cmd->pdev_set_regdomain_cmdid);
  }
  
  int ath10k_wmi_pdev_set_channel(struct ath10k *ar,
                   "wmi set channel mode %d freq %d\n",
                   arg->mode, arg->freq);
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SET_CHANNEL_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb,
+                                  ar->wmi.cmd->pdev_set_channel_cmdid);
  }
  
  int ath10k_wmi_pdev_suspend_target(struct ath10k *ar)
        cmd = (struct wmi_pdev_suspend_cmd *)skb->data;
        cmd->suspend_opt = WMI_PDEV_SUSPEND;
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SUSPEND_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_suspend_cmdid);
  }
  
  int ath10k_wmi_pdev_resume_target(struct ath10k *ar)
        if (skb == NULL)
                return -ENOMEM;
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_RESUME_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_resume_cmdid);
  }
  
- int ath10k_wmi_pdev_set_param(struct ath10k *ar, enum wmi_pdev_param id,
-                             u32 value)
+ int ath10k_wmi_pdev_set_param(struct ath10k *ar, u32 id, u32 value)
  {
        struct wmi_pdev_set_param_cmd *cmd;
        struct sk_buff *skb;
  
+       if (id == WMI_PDEV_PARAM_UNSUPPORTED) {
+               ath10k_warn("pdev param %d not supported by firmware\n", id);
+               return -EOPNOTSUPP;
+       }
        skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
        if (!skb)
                return -ENOMEM;
  
        ath10k_dbg(ATH10K_DBG_WMI, "wmi pdev set param %d value %d\n",
                   id, value);
-       return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SET_PARAM_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->pdev_set_param_cmdid);
  }
  
int ath10k_wmi_cmd_init(struct ath10k *ar)
static int ath10k_wmi_main_cmd_init(struct ath10k *ar)
  {
        struct wmi_init_cmd *cmd;
        struct sk_buff *buf;
        struct wmi_resource_config config = {};
-       u32 val;
+       u32 len, val;
+       int i;
  
        config.num_vdevs = __cpu_to_le32(TARGET_NUM_VDEVS);
        config.num_peers = __cpu_to_le32(TARGET_NUM_PEERS + TARGET_NUM_VDEVS);
        config.num_msdu_desc = __cpu_to_le32(TARGET_NUM_MSDU_DESC);
        config.max_frag_entries = __cpu_to_le32(TARGET_MAX_FRAG_ENTRIES);
  
-       buf = ath10k_wmi_alloc_skb(sizeof(*cmd));
+       len = sizeof(*cmd) +
+             (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
+       buf = ath10k_wmi_alloc_skb(len);
        if (!buf)
                return -ENOMEM;
  
        cmd = (struct wmi_init_cmd *)buf->data;
-       cmd->num_host_mem_chunks = 0;
+       if (ar->wmi.num_mem_chunks == 0) {
+               cmd->num_host_mem_chunks = 0;
+               goto out;
+       }
+       ath10k_dbg(ATH10K_DBG_WMI, "wmi sending %d memory chunks info.\n",
+                  __cpu_to_le32(ar->wmi.num_mem_chunks));
+       cmd->num_host_mem_chunks = __cpu_to_le32(ar->wmi.num_mem_chunks);
+       for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
+               cmd->host_mem_chunks[i].ptr =
+                       __cpu_to_le32(ar->wmi.mem_chunks[i].paddr);
+               cmd->host_mem_chunks[i].size =
+                       __cpu_to_le32(ar->wmi.mem_chunks[i].len);
+               cmd->host_mem_chunks[i].req_id =
+                       __cpu_to_le32(ar->wmi.mem_chunks[i].req_id);
+               ath10k_dbg(ATH10K_DBG_WMI,
+                          "wmi chunk %d len %d requested, addr 0x%x\n",
+                          i,
+                          cmd->host_mem_chunks[i].size,
+                          cmd->host_mem_chunks[i].ptr);
+       }
+ out:
        memcpy(&cmd->resource_config, &config, sizeof(config));
  
        ath10k_dbg(ATH10K_DBG_WMI, "wmi init\n");
-       return ath10k_wmi_cmd_send(ar, buf, WMI_INIT_CMDID);
+       return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->init_cmdid);
+ }
+ static int ath10k_wmi_10x_cmd_init(struct ath10k *ar)
+ {
+       struct wmi_init_cmd_10x *cmd;
+       struct sk_buff *buf;
+       struct wmi_resource_config_10x config = {};
+       u32 len, val;
+       int i;
+       config.num_vdevs = __cpu_to_le32(TARGET_10X_NUM_VDEVS);
+       config.num_peers = __cpu_to_le32(TARGET_10X_NUM_PEERS);
+       config.num_peer_keys = __cpu_to_le32(TARGET_10X_NUM_PEER_KEYS);
+       config.num_tids = __cpu_to_le32(TARGET_10X_NUM_TIDS);
+       config.ast_skid_limit = __cpu_to_le32(TARGET_10X_AST_SKID_LIMIT);
+       config.tx_chain_mask = __cpu_to_le32(TARGET_10X_TX_CHAIN_MASK);
+       config.rx_chain_mask = __cpu_to_le32(TARGET_10X_RX_CHAIN_MASK);
+       config.rx_timeout_pri_vo = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
+       config.rx_timeout_pri_vi = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
+       config.rx_timeout_pri_be = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_LO_PRI);
+       config.rx_timeout_pri_bk = __cpu_to_le32(TARGET_10X_RX_TIMEOUT_HI_PRI);
+       config.rx_decap_mode = __cpu_to_le32(TARGET_10X_RX_DECAP_MODE);
+       config.scan_max_pending_reqs =
+               __cpu_to_le32(TARGET_10X_SCAN_MAX_PENDING_REQS);
+       config.bmiss_offload_max_vdev =
+               __cpu_to_le32(TARGET_10X_BMISS_OFFLOAD_MAX_VDEV);
+       config.roam_offload_max_vdev =
+               __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_VDEV);
+       config.roam_offload_max_ap_profiles =
+               __cpu_to_le32(TARGET_10X_ROAM_OFFLOAD_MAX_AP_PROFILES);
+       config.num_mcast_groups = __cpu_to_le32(TARGET_10X_NUM_MCAST_GROUPS);
+       config.num_mcast_table_elems =
+               __cpu_to_le32(TARGET_10X_NUM_MCAST_TABLE_ELEMS);
+       config.mcast2ucast_mode = __cpu_to_le32(TARGET_10X_MCAST2UCAST_MODE);
+       config.tx_dbg_log_size = __cpu_to_le32(TARGET_10X_TX_DBG_LOG_SIZE);
+       config.num_wds_entries = __cpu_to_le32(TARGET_10X_NUM_WDS_ENTRIES);
+       config.dma_burst_size = __cpu_to_le32(TARGET_10X_DMA_BURST_SIZE);
+       config.mac_aggr_delim = __cpu_to_le32(TARGET_10X_MAC_AGGR_DELIM);
+       val = TARGET_10X_RX_SKIP_DEFRAG_TIMEOUT_DUP_DETECTION_CHECK;
+       config.rx_skip_defrag_timeout_dup_detection_check = __cpu_to_le32(val);
+       config.vow_config = __cpu_to_le32(TARGET_10X_VOW_CONFIG);
+       config.num_msdu_desc = __cpu_to_le32(TARGET_10X_NUM_MSDU_DESC);
+       config.max_frag_entries = __cpu_to_le32(TARGET_10X_MAX_FRAG_ENTRIES);
+       len = sizeof(*cmd) +
+             (sizeof(struct host_memory_chunk) * ar->wmi.num_mem_chunks);
+       buf = ath10k_wmi_alloc_skb(len);
+       if (!buf)
+               return -ENOMEM;
+       cmd = (struct wmi_init_cmd_10x *)buf->data;
+       if (ar->wmi.num_mem_chunks == 0) {
+               cmd->num_host_mem_chunks = 0;
+               goto out;
+       }
+       ath10k_dbg(ATH10K_DBG_WMI, "wmi sending %d memory chunks info.\n",
+                  __cpu_to_le32(ar->wmi.num_mem_chunks));
+       cmd->num_host_mem_chunks = __cpu_to_le32(ar->wmi.num_mem_chunks);
+       for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
+               cmd->host_mem_chunks[i].ptr =
+                       __cpu_to_le32(ar->wmi.mem_chunks[i].paddr);
+               cmd->host_mem_chunks[i].size =
+                       __cpu_to_le32(ar->wmi.mem_chunks[i].len);
+               cmd->host_mem_chunks[i].req_id =
+                       __cpu_to_le32(ar->wmi.mem_chunks[i].req_id);
+               ath10k_dbg(ATH10K_DBG_WMI,
+                          "wmi chunk %d len %d requested, addr 0x%x\n",
+                          i,
+                          cmd->host_mem_chunks[i].size,
+                          cmd->host_mem_chunks[i].ptr);
+       }
+ out:
+       memcpy(&cmd->resource_config, &config, sizeof(config));
+       ath10k_dbg(ATH10K_DBG_WMI, "wmi init 10x\n");
+       return ath10k_wmi_cmd_send(ar, buf, ar->wmi.cmd->init_cmdid);
+ }
+ int ath10k_wmi_cmd_init(struct ath10k *ar)
+ {
+       int ret;
+       if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
+               ret = ath10k_wmi_10x_cmd_init(ar);
+       else
+               ret = ath10k_wmi_main_cmd_init(ar);
+       return ret;
  }
  
- static int ath10k_wmi_start_scan_calc_len(const struct wmi_start_scan_arg *arg)
+ static int ath10k_wmi_start_scan_calc_len(struct ath10k *ar,
+                                         const struct wmi_start_scan_arg *arg)
  {
        int len;
  
-       len = sizeof(struct wmi_start_scan_cmd);
+       if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
+               len = sizeof(struct wmi_start_scan_cmd_10x);
+       else
+               len = sizeof(struct wmi_start_scan_cmd);
  
        if (arg->ie_len) {
                if (!arg->ie)
@@@ -1449,7 -2407,7 +2407,7 @@@ int ath10k_wmi_start_scan(struct ath10
        int len = 0;
        int i;
  
-       len = ath10k_wmi_start_scan_calc_len(arg);
+       len = ath10k_wmi_start_scan_calc_len(ar, arg);
        if (len < 0)
                return len; /* len contains error code here */
  
        cmd->scan_ctrl_flags    = __cpu_to_le32(arg->scan_ctrl_flags);
  
        /* TLV list starts after fields included in the struct */
-       off = sizeof(*cmd);
+       /* There's just one filed that differes the two start_scan
+        * structures - burst_duration, which we are not using btw,
+          no point to make the split here, just shift the buffer to fit with
+          given FW */
+       if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
+               off = sizeof(struct wmi_start_scan_cmd_10x);
+       else
+               off = sizeof(struct wmi_start_scan_cmd);
  
        if (arg->n_channels) {
                channels = (void *)skb->data + off;
        }
  
        ath10k_dbg(ATH10K_DBG_WMI, "wmi start scan\n");
-       return ath10k_wmi_cmd_send(ar, skb, WMI_START_SCAN_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->start_scan_cmdid);
  }
  
  void ath10k_wmi_start_scan_init(struct ath10k *ar,
        arg->repeat_probe_time = 0;
        arg->probe_spacing_time = 0;
        arg->idle_time = 0;
-       arg->max_scan_time = 5000;
+       arg->max_scan_time = 20000;
        arg->probe_delay = 5;
        arg->notify_scan_events = WMI_SCAN_EVENT_STARTED
                | WMI_SCAN_EVENT_COMPLETED
@@@ -1603,7 -2568,7 +2568,7 @@@ int ath10k_wmi_stop_scan(struct ath10k 
        ath10k_dbg(ATH10K_DBG_WMI,
                   "wmi stop scan reqid %d req_type %d vdev/scan_id %d\n",
                   arg->req_id, arg->req_type, arg->u.scan_id);
-       return ath10k_wmi_cmd_send(ar, skb, WMI_STOP_SCAN_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->stop_scan_cmdid);
  }
  
  int ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id,
                   "WMI vdev create: id %d type %d subtype %d macaddr %pM\n",
                   vdev_id, type, subtype, macaddr);
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_CREATE_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_create_cmdid);
  }
  
  int ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id)
        ath10k_dbg(ATH10K_DBG_WMI,
                   "WMI vdev delete id %d\n", vdev_id);
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_DELETE_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid);
  }
  
  static int ath10k_wmi_vdev_start_restart(struct ath10k *ar,
                                const struct wmi_vdev_start_request_arg *arg,
-                               enum wmi_cmd_id cmd_id)
+                               u32 cmd_id)
  {
        struct wmi_vdev_start_request_cmd *cmd;
        struct sk_buff *skb;
        const char *cmdname;
        u32 flags = 0;
  
-       if (cmd_id != WMI_VDEV_START_REQUEST_CMDID &&
-           cmd_id != WMI_VDEV_RESTART_REQUEST_CMDID)
+       if (cmd_id != ar->wmi.cmd->vdev_start_request_cmdid &&
+           cmd_id != ar->wmi.cmd->vdev_restart_request_cmdid)
                return -EINVAL;
        if (WARN_ON(arg->ssid && arg->ssid_len == 0))
                return -EINVAL;
        if (WARN_ON(arg->ssid_len > sizeof(cmd->ssid.ssid)))
                return -EINVAL;
  
-       if (cmd_id == WMI_VDEV_START_REQUEST_CMDID)
+       if (cmd_id == ar->wmi.cmd->vdev_start_request_cmdid)
                cmdname = "start";
-       else if (cmd_id == WMI_VDEV_RESTART_REQUEST_CMDID)
+       else if (cmd_id == ar->wmi.cmd->vdev_restart_request_cmdid)
                cmdname = "restart";
        else
                return -EINVAL; /* should not happen, we already check cmd_id */
  int ath10k_wmi_vdev_start(struct ath10k *ar,
                          const struct wmi_vdev_start_request_arg *arg)
  {
-       return ath10k_wmi_vdev_start_restart(ar, arg,
-                                            WMI_VDEV_START_REQUEST_CMDID);
+       u32 cmd_id = ar->wmi.cmd->vdev_start_request_cmdid;
+       return ath10k_wmi_vdev_start_restart(ar, arg, cmd_id);
  }
  
  int ath10k_wmi_vdev_restart(struct ath10k *ar,
                     const struct wmi_vdev_start_request_arg *arg)
  {
-       return ath10k_wmi_vdev_start_restart(ar, arg,
-                                            WMI_VDEV_RESTART_REQUEST_CMDID);
+       u32 cmd_id = ar->wmi.cmd->vdev_restart_request_cmdid;
+       return ath10k_wmi_vdev_start_restart(ar, arg, cmd_id);
  }
  
  int ath10k_wmi_vdev_stop(struct ath10k *ar, u32 vdev_id)
  
        ath10k_dbg(ATH10K_DBG_WMI, "wmi vdev stop id 0x%x\n", vdev_id);
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_STOP_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_stop_cmdid);
  }
  
  int ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
        cmd = (struct wmi_vdev_up_cmd *)skb->data;
        cmd->vdev_id       = __cpu_to_le32(vdev_id);
        cmd->vdev_assoc_id = __cpu_to_le32(aid);
 -      memcpy(&cmd->vdev_bssid.addr, bssid, 6);
 +      memcpy(&cmd->vdev_bssid.addr, bssid, ETH_ALEN);
  
        ath10k_dbg(ATH10K_DBG_WMI,
                   "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n",
                   vdev_id, aid, bssid);
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_UP_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_up_cmdid);
  }
  
  int ath10k_wmi_vdev_down(struct ath10k *ar, u32 vdev_id)
        ath10k_dbg(ATH10K_DBG_WMI,
                   "wmi mgmt vdev down id 0x%x\n", vdev_id);
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_DOWN_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_down_cmdid);
  }
  
  int ath10k_wmi_vdev_set_param(struct ath10k *ar, u32 vdev_id,
-                             enum wmi_vdev_param param_id, u32 param_value)
+                             u32 param_id, u32 param_value)
  {
        struct wmi_vdev_set_param_cmd *cmd;
        struct sk_buff *skb;
  
+       if (param_id == WMI_VDEV_PARAM_UNSUPPORTED) {
+               ath10k_dbg(ATH10K_DBG_WMI,
+                          "vdev param %d not supported by firmware\n",
+                           param_id);
+               return -EOPNOTSUPP;
+       }
        skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
        if (!skb)
                return -ENOMEM;
                   "wmi vdev id 0x%x set param %d value %d\n",
                   vdev_id, param_id, param_value);
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_SET_PARAM_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_set_param_cmdid);
  }
  
  int ath10k_wmi_vdev_install_key(struct ath10k *ar,
        ath10k_dbg(ATH10K_DBG_WMI,
                   "wmi vdev install key idx %d cipher %d len %d\n",
                   arg->key_idx, arg->key_cipher, arg->key_len);
-       return ath10k_wmi_cmd_send(ar, skb, WMI_VDEV_INSTALL_KEY_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb,
+                                  ar->wmi.cmd->vdev_install_key_cmdid);
  }
  
  int ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id,
        ath10k_dbg(ATH10K_DBG_WMI,
                   "wmi peer create vdev_id %d peer_addr %pM\n",
                   vdev_id, peer_addr);
-       return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_CREATE_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_create_cmdid);
  }
  
  int ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id,
        ath10k_dbg(ATH10K_DBG_WMI,
                   "wmi peer delete vdev_id %d peer_addr %pM\n",
                   vdev_id, peer_addr);
-       return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_DELETE_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_delete_cmdid);
  }
  
  int ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id,
        ath10k_dbg(ATH10K_DBG_WMI,
                   "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n",
                   vdev_id, peer_addr, tid_bitmap);
-       return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_FLUSH_TIDS_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_flush_tids_cmdid);
  }
  
  int ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id,
        cmd->vdev_id     = __cpu_to_le32(vdev_id);
        cmd->param_id    = __cpu_to_le32(param_id);
        cmd->param_value = __cpu_to_le32(param_value);
 -      memcpy(&cmd->peer_macaddr.addr, peer_addr, 6);
 +      memcpy(&cmd->peer_macaddr.addr, peer_addr, ETH_ALEN);
  
        ath10k_dbg(ATH10K_DBG_WMI,
                   "wmi vdev %d peer 0x%pM set param %d value %d\n",
                   vdev_id, peer_addr, param_id, param_value);
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_SET_PARAM_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_set_param_cmdid);
  }
  
  int ath10k_wmi_set_psmode(struct ath10k *ar, u32 vdev_id,
                   "wmi set powersave id 0x%x mode %d\n",
                   vdev_id, psmode);
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_STA_POWERSAVE_MODE_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb,
+                                  ar->wmi.cmd->sta_powersave_mode_cmdid);
  }
  
  int ath10k_wmi_set_sta_ps_param(struct ath10k *ar, u32 vdev_id,
        ath10k_dbg(ATH10K_DBG_WMI,
                   "wmi sta ps param vdev_id 0x%x param %d value %d\n",
                   vdev_id, param_id, value);
-       return ath10k_wmi_cmd_send(ar, skb, WMI_STA_POWERSAVE_PARAM_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb,
+                                  ar->wmi.cmd->sta_powersave_param_cmdid);
  }
  
  int ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac,
                   "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n",
                   vdev_id, param_id, value, mac);
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_AP_PS_PEER_PARAM_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb,
+                                  ar->wmi.cmd->ap_ps_peer_param_cmdid);
  }
  
  int ath10k_wmi_scan_chan_list(struct ath10k *ar,
                ci->flags            |= __cpu_to_le32(flags);
        }
  
-       return ath10k_wmi_cmd_send(ar, skb, WMI_SCAN_CHAN_LIST_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->scan_chan_list_cmdid);
  }
  
  int ath10k_wmi_peer_assoc(struct ath10k *ar,
        ath10k_dbg(ATH10K_DBG_WMI,
                   "wmi peer assoc vdev %d addr %pM\n",
                   arg->vdev_id, arg->addr);
-       return ath10k_wmi_cmd_send(ar, skb, WMI_PEER_ASSOC_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->peer_assoc_cmdid);
  }
  
  int ath10k_wmi_beacon_send_nowait(struct ath10k *ar,
        cmd->hdr.bcn_len  = __cpu_to_le32(arg->bcn_len);
        memcpy(cmd->bcn, arg->bcn, arg->bcn_len);
  
-       return ath10k_wmi_cmd_send_nowait(ar, skb, WMI_BCN_TX_CMDID);
+       return ath10k_wmi_cmd_send_nowait(ar, skb, ar->wmi.cmd->bcn_tx_cmdid);
  }
  
  static void ath10k_wmi_pdev_set_wmm_param(struct wmi_wmm_params *params,
@@@ -2159,7 -3137,8 +3137,8 @@@ int ath10k_wmi_pdev_set_wmm_params(stru
        ath10k_wmi_pdev_set_wmm_param(&cmd->ac_vo, &arg->ac_vo);
  
        ath10k_dbg(ATH10K_DBG_WMI, "wmi pdev set wmm params\n");
-       return ath10k_wmi_cmd_send(ar, skb, WMI_PDEV_SET_WMM_PARAMS_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb,
+                                  ar->wmi.cmd->pdev_set_wmm_params_cmdid);
  }
  
  int ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id)
        cmd->stats_id = __cpu_to_le32(stats_id);
  
        ath10k_dbg(ATH10K_DBG_WMI, "wmi request stats %d\n", (int)stats_id);
-       return ath10k_wmi_cmd_send(ar, skb, WMI_REQUEST_STATS_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->request_stats_cmdid);
  }
  
  int ath10k_wmi_force_fw_hang(struct ath10k *ar,
  
        ath10k_dbg(ATH10K_DBG_WMI, "wmi force fw hang %d delay %d\n",
                   type, delay_ms);
-       return ath10k_wmi_cmd_send(ar, skb, WMI_FORCE_FW_HANG_CMDID);
+       return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid);
  }
index 14ff7e9dde4c3767c38e9368025823633f825190,4c3bbe4f309533a04f4262913ac4c7c074a8d73c..e7a38d844a6a4e7a2e9ba738e56606d946fea47a
@@@ -778,6 -778,11 +778,11 @@@ struct ath_softc 
        enum spectral_mode spectral_mode;
        struct ath_spec_scan spec_config;
  
+       struct ieee80211_vif *tx99_vif;
+       struct sk_buff *tx99_skb;
+       bool tx99_state;
+       s16 tx99_power;
  #ifdef CONFIG_PM_SLEEP
        atomic_t wow_got_bmiss_intr;
        atomic_t wow_sleep_proc_intr; /* in the middle of WoW sleep ? */
@@@ -886,6 -891,7 +891,7 @@@ static inline u8 spectral_bitmap_weight
   */
  enum ath_fft_sample_type {
        ATH_FFT_SAMPLE_HT20 = 1,
+       ATH_FFT_SAMPLE_HT20_40,
  };
  
  struct fft_sample_tlv {
@@@ -912,6 -918,39 +918,39 @@@ struct fft_sample_ht20 
        u8 data[SPECTRAL_HT20_NUM_BINS];
  } __packed;
  
+ struct fft_sample_ht20_40 {
+       struct fft_sample_tlv tlv;
+       u8 channel_type;
+       __be16 freq;
+       s8 lower_rssi;
+       s8 upper_rssi;
+       __be64 tsf;
+       s8 lower_noise;
+       s8 upper_noise;
+       __be16 lower_max_magnitude;
+       __be16 upper_max_magnitude;
+       u8 lower_max_index;
+       u8 upper_max_index;
+       u8 lower_bitmap_weight;
+       u8 upper_bitmap_weight;
+       u8 max_exp;
+       u8 data[SPECTRAL_HT20_40_NUM_BINS];
+ } __packed;
+ int ath9k_tx99_init(struct ath_softc *sc);
+ void ath9k_tx99_deinit(struct ath_softc *sc);
+ int ath9k_tx99_send(struct ath_softc *sc, struct sk_buff *skb,
+                   struct ath_tx_control *txctl);
  void ath9k_tasklet(unsigned long data);
  int ath_cabq_update(struct ath_softc *);
  
@@@ -960,7 -999,7 +999,7 @@@ void ath9k_ps_restore(struct ath_softc 
  u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate);
  
  void ath_start_rfkill_poll(struct ath_softc *sc);
 -extern void ath9k_rfkill_poll_state(struct ieee80211_hw *hw);
 +void ath9k_rfkill_poll_state(struct ieee80211_hw *hw);
  void ath9k_calculate_iter_data(struct ieee80211_hw *hw,
                               struct ieee80211_vif *vif,
                               struct ath9k_vif_iter_data *iter_data);
index a55ae6494c3b6400d28c029af5a0e7a4770c6680,9c35479790b69f2621ec18e7863565818b505ef7..0d950f209dae01efd23ebe9956ac2dc68daa7063
@@@ -844,18 -844,18 +844,18 @@@ static netdev_tx_t start_tx(struct sk_b
        if (priv->wep_is_on)
                frame_ctl |= IEEE80211_FCTL_PROTECTED;
        if (priv->operating_mode == IW_MODE_ADHOC) {
 -              skb_copy_from_linear_data(skb, &header.addr1, 6);
 -              memcpy(&header.addr2, dev->dev_addr, 6);
 -              memcpy(&header.addr3, priv->BSSID, 6);
 +              skb_copy_from_linear_data(skb, &header.addr1, ETH_ALEN);
 +              memcpy(&header.addr2, dev->dev_addr, ETH_ALEN);
 +              memcpy(&header.addr3, priv->BSSID, ETH_ALEN);
        } else {
                frame_ctl |= IEEE80211_FCTL_TODS;
 -              memcpy(&header.addr1, priv->CurrentBSSID, 6);
 -              memcpy(&header.addr2, dev->dev_addr, 6);
 -              skb_copy_from_linear_data(skb, &header.addr3, 6);
 +              memcpy(&header.addr1, priv->CurrentBSSID, ETH_ALEN);
 +              memcpy(&header.addr2, dev->dev_addr, ETH_ALEN);
 +              skb_copy_from_linear_data(skb, &header.addr3, ETH_ALEN);
        }
  
        if (priv->use_wpa)
 -              memcpy(&header.addr4, SNAP_RFC1024, 6);
 +              memcpy(&header.addr4, SNAP_RFC1024, ETH_ALEN);
  
        header.frame_control = cpu_to_le16(frame_ctl);
        /* Copy the wireless header into the card */
@@@ -929,11 -929,11 +929,11 @@@ static void fast_rx_path(struct atmel_p
                }
        }
  
 -      memcpy(skbp, header->addr1, 6); /* destination address */
 +      memcpy(skbp, header->addr1, ETH_ALEN); /* destination address */
        if (le16_to_cpu(header->frame_control) & IEEE80211_FCTL_FROMDS)
 -              memcpy(&skbp[6], header->addr3, 6);
 +              memcpy(&skbp[ETH_ALEN], header->addr3, ETH_ALEN);
        else
 -              memcpy(&skbp[6], header->addr2, 6); /* source address */
 +              memcpy(&skbp[ETH_ALEN], header->addr2, ETH_ALEN); /* source address */
  
        skb->protocol = eth_type_trans(skb, priv->dev);
        skb->ip_summed = CHECKSUM_NONE;
@@@ -969,14 -969,14 +969,14 @@@ static void frag_rx_path(struct atmel_p
                         u16 msdu_size, u16 rx_packet_loc, u32 crc, u16 seq_no,
                         u8 frag_no, int more_frags)
  {
 -      u8 mac4[6];
 -      u8 source[6];
 +      u8 mac4[ETH_ALEN];
 +      u8 source[ETH_ALEN];
        struct sk_buff *skb;
  
        if (le16_to_cpu(header->frame_control) & IEEE80211_FCTL_FROMDS)
 -              memcpy(source, header->addr3, 6);
 +              memcpy(source, header->addr3, ETH_ALEN);
        else
 -              memcpy(source, header->addr2, 6);
 +              memcpy(source, header->addr2, ETH_ALEN);
  
        rx_packet_loc += 24; /* skip header */
  
                msdu_size -= 4;
  
        if (frag_no == 0) { /* first fragment */
 -              atmel_copy_to_host(priv->dev, mac4, rx_packet_loc, 6);
 -              msdu_size -= 6;
 -              rx_packet_loc += 6;
 +              atmel_copy_to_host(priv->dev, mac4, rx_packet_loc, ETH_ALEN);
 +              msdu_size -= ETH_ALEN;
 +              rx_packet_loc += ETH_ALEN;
  
                if (priv->do_rx_crc)
                        crc = crc32_le(crc, mac4, 6);
                priv->frag_seq = seq_no;
                priv->frag_no = 1;
                priv->frag_len = msdu_size;
 -              memcpy(priv->frag_source, source, 6);
 -              memcpy(&priv->rx_buf[6], source, 6);
 -              memcpy(priv->rx_buf, header->addr1, 6);
 +              memcpy(priv->frag_source, source, ETH_ALEN);
 +              memcpy(&priv->rx_buf[ETH_ALEN], source, ETH_ALEN);
 +              memcpy(priv->rx_buf, header->addr1, ETH_ALEN);
  
                atmel_copy_to_host(priv->dev, &priv->rx_buf[12], rx_packet_loc, msdu_size);
  
                        atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + msdu_size, 4);
                        if ((crc ^ 0xffffffff) != netcrc) {
                                priv->dev->stats.rx_crc_errors++;
 -                              memset(priv->frag_source, 0xff, 6);
 +                              memset(priv->frag_source, 0xff, ETH_ALEN);
                        }
                }
  
        } else if (priv->frag_no == frag_no &&
                   priv->frag_seq == seq_no &&
 -                 memcmp(priv->frag_source, source, 6) == 0) {
 +                 memcmp(priv->frag_source, source, ETH_ALEN) == 0) {
  
                atmel_copy_to_host(priv->dev, &priv->rx_buf[12 + priv->frag_len],
                                   rx_packet_loc, msdu_size);
                        atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + msdu_size, 4);
                        if ((crc ^ 0xffffffff) != netcrc) {
                                priv->dev->stats.rx_crc_errors++;
 -                              memset(priv->frag_source, 0xff, 6);
 +                              memset(priv->frag_source, 0xff, ETH_ALEN);
                                more_frags = 1; /* don't send broken assembly */
                        }
                }
                priv->frag_no++;
  
                if (!more_frags) { /* last one */
 -                      memset(priv->frag_source, 0xff, 6);
 +                      memset(priv->frag_source, 0xff, ETH_ALEN);
                        if (!(skb = dev_alloc_skb(priv->frag_len + 14))) {
                                priv->dev->stats.rx_dropped++;
                        } else {
@@@ -1129,7 -1129,7 +1129,7 @@@ static void rx_done_irq(struct atmel_pr
                        atmel_copy_to_host(priv->dev, (unsigned char *)&priv->rx_buf, rx_packet_loc + 24, msdu_size);
  
                        /* we use the same buffer for frag reassembly and control packets */
 -                      memset(priv->frag_source, 0xff, 6);
 +                      memset(priv->frag_source, 0xff, ETH_ALEN);
  
                        if (priv->do_rx_crc) {
                                /* last 4 octets is crc */
@@@ -1557,7 -1557,7 +1557,7 @@@ struct net_device *init_atmel_card(unsi
        priv->last_qual = jiffies;
        priv->last_beacon_timestamp = 0;
        memset(priv->frag_source, 0xff, sizeof(priv->frag_source));
 -      memset(priv->BSSID, 0, 6);
 +      memset(priv->BSSID, 0, ETH_ALEN);
        priv->CurrentBSSID[0] = 0xFF; /* Initialize to something invalid.... */
        priv->station_was_associated = 0;
  
@@@ -1718,7 -1718,7 +1718,7 @@@ static int atmel_get_wap(struct net_dev
                         char *extra)
  {
        struct atmel_private *priv = netdev_priv(dev);
 -      memcpy(awrq->sa_data, priv->CurrentBSSID, 6);
 +      memcpy(awrq->sa_data, priv->CurrentBSSID, ETH_ALEN);
        awrq->sa_family = ARPHRD_ETHER;
  
        return 0;
@@@ -2356,7 -2356,7 +2356,7 @@@ static int atmel_get_scan(struct net_de
        for (i = 0; i < priv->BSS_list_entries; i++) {
                iwe.cmd = SIOCGIWAP;
                iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
 -              memcpy(iwe.u.ap_addr.sa_data, priv->BSSinfo[i].BSSID, 6);
 +              memcpy(iwe.u.ap_addr.sa_data, priv->BSSinfo[i].BSSID, ETH_ALEN);
                current_ev = iwe_stream_add_event(info, current_ev,
                                                  extra + IW_SCAN_MAX_DATA,
                                                  &iwe, IW_EV_ADDR_LEN);
@@@ -2760,7 -2760,7 +2760,7 @@@ static void atmel_enter_state(struct at
  static void atmel_scan(struct atmel_private *priv, int specific_ssid)
  {
        struct {
 -              u8 BSSID[6];
 +              u8 BSSID[ETH_ALEN];
                u8 SSID[MAX_SSID_LENGTH];
                u8 scan_type;
                u8 channel;
                u8 SSID_size;
        } cmd;
  
 -      memset(cmd.BSSID, 0xff, 6);
 +      memset(cmd.BSSID, 0xff, ETH_ALEN);
  
        if (priv->fast_scan) {
                cmd.SSID_size = priv->SSID_size;
@@@ -2816,7 -2816,7 +2816,7 @@@ static void join(struct atmel_private *
  
        cmd.SSID_size = priv->SSID_size;
        memcpy(cmd.SSID, priv->SSID, priv->SSID_size);
 -      memcpy(cmd.BSSID, priv->CurrentBSSID, 6);
 +      memcpy(cmd.BSSID, priv->CurrentBSSID, ETH_ALEN);
        cmd.channel = (priv->channel & 0x7f);
        cmd.BSS_type = type;
        cmd.timeout = cpu_to_le16(2000);
@@@ -2837,7 -2837,7 +2837,7 @@@ static void start(struct atmel_private 
  
        cmd.SSID_size = priv->SSID_size;
        memcpy(cmd.SSID, priv->SSID, priv->SSID_size);
 -      memcpy(cmd.BSSID, priv->BSSID, 6);
 +      memcpy(cmd.BSSID, priv->BSSID, ETH_ALEN);
        cmd.BSS_type = type;
        cmd.channel = (priv->channel & 0x7f);
  
@@@ -2883,9 -2883,9 +2883,9 @@@ static void send_authentication_request
        header.frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_AUTH);
        header.duration_id = cpu_to_le16(0x8000);
        header.seq_ctrl = 0;
 -      memcpy(header.addr1, priv->CurrentBSSID, 6);
 -      memcpy(header.addr2, priv->dev->dev_addr, 6);
 -      memcpy(header.addr3, priv->CurrentBSSID, 6);
 +      memcpy(header.addr1, priv->CurrentBSSID, ETH_ALEN);
 +      memcpy(header.addr2, priv->dev->dev_addr, ETH_ALEN);
 +      memcpy(header.addr3, priv->CurrentBSSID, ETH_ALEN);
  
        if (priv->wep_is_on && priv->CurrentAuthentTransactionSeqNum != 1)
                /* no WEP for authentication frames with TrSeqNo 1 */
@@@ -2916,7 -2916,7 +2916,7 @@@ static void send_association_request(st
        struct ass_req_format {
                __le16 capability;
                __le16 listen_interval;
 -              u8 ap[6]; /* nothing after here directly accessible */
 +              u8 ap[ETH_ALEN]; /* nothing after here directly accessible */
                u8 ssid_el_id;
                u8 ssid_len;
                u8 ssid[MAX_SSID_LENGTH];
        header.duration_id = cpu_to_le16(0x8000);
        header.seq_ctrl = 0;
  
 -      memcpy(header.addr1, priv->CurrentBSSID, 6);
 -      memcpy(header.addr2, priv->dev->dev_addr, 6);
 -      memcpy(header.addr3, priv->CurrentBSSID, 6);
 +      memcpy(header.addr1, priv->CurrentBSSID, ETH_ALEN);
 +      memcpy(header.addr2, priv->dev->dev_addr, ETH_ALEN);
 +      memcpy(header.addr3, priv->CurrentBSSID, ETH_ALEN);
  
        body.capability = cpu_to_le16(WLAN_CAPABILITY_ESS);
        if (priv->wep_is_on)
  
        /* current AP address - only in reassoc frame */
        if (is_reassoc) {
 -              memcpy(body.ap, priv->CurrentBSSID, 6);
 +              memcpy(body.ap, priv->CurrentBSSID, ETH_ALEN);
                ssid_el_p = &body.ssid_el_id;
                bodysize = 18 + priv->SSID_size;
        } else {
@@@ -3021,7 -3021,7 +3021,7 @@@ static void store_bss_info(struct atmel
        int i, index;
  
        for (index = -1, i = 0; i < priv->BSS_list_entries; i++)
 -              if (memcmp(bss, priv->BSSinfo[i].BSSID, 6) == 0)
 +              if (memcmp(bss, priv->BSSinfo[i].BSSID, ETH_ALEN) == 0)
                        index = i;
  
        /* If we process a probe and an entry from this BSS exists
                if (priv->BSS_list_entries == MAX_BSS_ENTRIES)
                        return;
                index = priv->BSS_list_entries++;
 -              memcpy(priv->BSSinfo[index].BSSID, bss, 6);
 +              memcpy(priv->BSSinfo[index].BSSID, bss, ETH_ALEN);
                priv->BSSinfo[index].RSSI = rssi;
        } else {
                if (rssi > priv->BSSinfo[index].RSSI)
@@@ -3212,7 -3212,7 +3212,7 @@@ static void associate(struct atmel_priv
        if (subtype == IEEE80211_STYPE_REASSOC_RESP &&
            status != WLAN_STATUS_ASSOC_DENIED_RATES &&
            status != WLAN_STATUS_CAPS_UNSUPPORTED &&
-           priv->AssociationRequestRetryCnt < MAX_ASSOCIATION_RETRIES) {
+           priv->ReAssociationRequestRetryCnt < MAX_ASSOCIATION_RETRIES) {
                mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES);
                priv->ReAssociationRequestRetryCnt++;
                send_association_request(priv, 1);
@@@ -3235,7 -3235,7 +3235,7 @@@ static void atmel_join_bss(struct atmel
  {
        struct bss_info *bss =  &priv->BSSinfo[bss_index];
  
 -      memcpy(priv->CurrentBSSID, bss->BSSID, 6);
 +      memcpy(priv->CurrentBSSID, bss->BSSID, ETH_ALEN);
        memcpy(priv->SSID, bss->SSID, priv->SSID_size = bss->SSIDsize);
  
        /* The WPA stuff cares about the current AP address */
@@@ -3767,7 -3767,7 +3767,7 @@@ static int probe_atmel_card(struct net_
                                0x00, 0x04, 0x25, 0x00, 0x00, 0x00
                        };
                        printk(KERN_ALERT "%s: *** Invalid MAC address. UPGRADE Firmware ****\n", dev->name);
 -                      memcpy(dev->dev_addr, default_mac, 6);
 +                      memcpy(dev->dev_addr, default_mac, ETH_ALEN);
                }
        }
  
@@@ -3819,7 -3819,7 +3819,7 @@@ static void build_wpa_mib(struct atmel_
  
        struct { /* NB this is matched to the hardware, don't change. */
                u8 cipher_default_key_value[MAX_ENCRYPTION_KEYS][MAX_ENCRYPTION_KEY_SIZE];
 -              u8 receiver_address[6];
 +              u8 receiver_address[ETH_ALEN];
                u8 wep_is_on;
                u8 default_key; /* 0..3 */
                u8 group_key;
  
        mib.wep_is_on = priv->wep_is_on;
        mib.exclude_unencrypted = priv->exclude_unencrypted;
 -      memcpy(mib.receiver_address, priv->CurrentBSSID, 6);
 +      memcpy(mib.receiver_address, priv->CurrentBSSID, ETH_ALEN);
  
        /* zero all the keys before adding in valid ones. */
        memset(mib.cipher_default_key_value, 0, sizeof(mib.cipher_default_key_value));
index c9b06b4e71f7d5be0f88400d9da26e15cb39e9f9,1b034ea46f932ff4c8aea837b88603861b2e44c0..fc0d4f0129db269dd7d7139c286fa90063c3bab3
@@@ -178,21 -178,25 +178,25 @@@ struct brcmf_sdio_dev 
        bool irq_en;                    /* irq enable flags */
        spinlock_t irq_en_lock;
        bool irq_wake;                  /* irq wake enable flags */
+       bool sg_support;
+       uint max_request_size;
+       ushort max_segment_count;
+       uint max_segment_size;
  };
  
  /* Register/deregister interrupt handler. */
 -extern int brcmf_sdio_intr_register(struct brcmf_sdio_dev *sdiodev);
 -extern int brcmf_sdio_intr_unregister(struct brcmf_sdio_dev *sdiodev);
 +int brcmf_sdio_intr_register(struct brcmf_sdio_dev *sdiodev);
 +int brcmf_sdio_intr_unregister(struct brcmf_sdio_dev *sdiodev);
  
  /* sdio device register access interface */
 -extern u8 brcmf_sdio_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret);
 -extern u32 brcmf_sdio_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret);
 -extern void brcmf_sdio_regwb(struct brcmf_sdio_dev *sdiodev, u32 addr,
 -                           u8 data, int *ret);
 -extern void brcmf_sdio_regwl(struct brcmf_sdio_dev *sdiodev, u32 addr,
 -                           u32 data, int *ret);
 -extern int brcmf_sdio_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
 -                                 void *data, bool write);
 +u8 brcmf_sdio_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret);
 +u32 brcmf_sdio_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret);
 +void brcmf_sdio_regwb(struct brcmf_sdio_dev *sdiodev, u32 addr, u8 data,
 +                    int *ret);
 +void brcmf_sdio_regwl(struct brcmf_sdio_dev *sdiodev, u32 addr, u32 data,
 +                    int *ret);
 +int brcmf_sdio_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
 +                          void *data, bool write);
  
  /* Buffer transfer to/from device (client) core via cmd53.
   *   fn:       function number
   * Returns 0 or error code.
   * NOTE: Async operation is not currently supported.
   */
 -extern int
 -brcmf_sdcard_send_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
 -                    uint flags, struct sk_buff_head *pktq);
 -extern int
 -brcmf_sdcard_send_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
 -                    uint flags, u8 *buf, uint nbytes);
 -
 -extern int
 -brcmf_sdcard_recv_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
 -                    uint flags, struct sk_buff *pkt);
 -extern int
 -brcmf_sdcard_recv_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
 -                    uint flags, u8 *buf, uint nbytes);
 -extern int
 -brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
 -                      uint flags, struct sk_buff_head *pktq, uint totlen);
 +int brcmf_sdcard_send_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
 +                        uint flags, struct sk_buff_head *pktq);
 +int brcmf_sdcard_send_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
 +                        uint flags, u8 *buf, uint nbytes);
 +
 +int brcmf_sdcard_recv_pkt(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
 +                        uint flags, struct sk_buff *pkt);
 +int brcmf_sdcard_recv_buf(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
 +                        uint flags, u8 *buf, uint nbytes);
 +int brcmf_sdcard_recv_chain(struct brcmf_sdio_dev *sdiodev, u32 addr, uint fn,
-                           uint flags, struct sk_buff_head *pktq);
++                          uint flags, struct sk_buff_head *pktq, uint totlen);
  
  /* Flags bits */
  
   *   nbytes:   number of bytes to transfer to/from buf
   * Returns 0 or error code.
   */
 -extern int brcmf_sdcard_rwdata(struct brcmf_sdio_dev *sdiodev, uint rw,
 -                             u32 addr, u8 *buf, uint nbytes);
 -extern int brcmf_sdio_ramrw(struct brcmf_sdio_dev *sdiodev, bool write,
 -                          u32 address, u8 *data, uint size);
 +int brcmf_sdcard_rwdata(struct brcmf_sdio_dev *sdiodev, uint rw, u32 addr,
 +                      u8 *buf, uint nbytes);
 +int brcmf_sdio_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address,
 +                   u8 *data, uint size);
  
  /* Issue an abort to the specified function */
 -extern int brcmf_sdcard_abort(struct brcmf_sdio_dev *sdiodev, uint fn);
 +int brcmf_sdcard_abort(struct brcmf_sdio_dev *sdiodev, uint fn);
  
  /* platform specific/high level functions */
 -extern int brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev);
 -extern int brcmf_sdio_remove(struct brcmf_sdio_dev *sdiodev);
 +int brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev);
 +int brcmf_sdio_remove(struct brcmf_sdio_dev *sdiodev);
  
  /* attach, return handler on success, NULL if failed.
   *  The handler shall be provided by all subsequent calls. No local cache
   *  cfghdl points to the starting address of pci device mapped memory
   */
 -extern int brcmf_sdioh_attach(struct brcmf_sdio_dev *sdiodev);
 -extern void brcmf_sdioh_detach(struct brcmf_sdio_dev *sdiodev);
 +int brcmf_sdioh_attach(struct brcmf_sdio_dev *sdiodev);
 +void brcmf_sdioh_detach(struct brcmf_sdio_dev *sdiodev);
  
  /* read or write one byte using cmd52 */
 -extern int brcmf_sdioh_request_byte(struct brcmf_sdio_dev *sdiodev, uint rw,
 -                                  uint fnc, uint addr, u8 *byte);
 +int brcmf_sdioh_request_byte(struct brcmf_sdio_dev *sdiodev, uint rw, uint fnc,
 +                           uint addr, u8 *byte);
  
  /* read or write 2/4 bytes using cmd53 */
 -extern int
 -brcmf_sdioh_request_word(struct brcmf_sdio_dev *sdiodev,
 -                       uint rw, uint fnc, uint addr,
 -                       u32 *word, uint nbyte);
 +int brcmf_sdioh_request_word(struct brcmf_sdio_dev *sdiodev, uint rw, uint fnc,
 +                           uint addr, u32 *word, uint nbyte);
  
  /* Watchdog timer interface for pm ops */
 -extern void brcmf_sdio_wdtmr_enable(struct brcmf_sdio_dev *sdiodev,
 -                                  bool enable);
 +void brcmf_sdio_wdtmr_enable(struct brcmf_sdio_dev *sdiodev, bool enable);
  
 -extern void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev);
 -extern void brcmf_sdbrcm_disconnect(void *ptr);
 -extern void brcmf_sdbrcm_isr(void *arg);
 +void *brcmf_sdbrcm_probe(u32 regsva, struct brcmf_sdio_dev *sdiodev);
 +void brcmf_sdbrcm_disconnect(void *ptr);
 +void brcmf_sdbrcm_isr(void *arg);
  
 -extern void brcmf_sdbrcm_wd_timer(struct brcmf_sdio *bus, uint wdtick);
 +void brcmf_sdbrcm_wd_timer(struct brcmf_sdio *bus, uint wdtick);
  
 -extern void brcmf_pm_resume_wait(struct brcmf_sdio_dev *sdiodev,
 -                               wait_queue_head_t *wq);
 -extern bool brcmf_pm_resume_error(struct brcmf_sdio_dev *sdiodev);
 +void brcmf_pm_resume_wait(struct brcmf_sdio_dev *sdiodev,
 +                        wait_queue_head_t *wq);
 +bool brcmf_pm_resume_error(struct brcmf_sdio_dev *sdiodev);
  #endif                                /* _BRCM_SDH_H_ */
index 465d40ee176f0187cd8914cd7d4e26c86524cb3b,721e6b31b712d77d1f7b8ba1103ceaaee8658703..5d5344f7070bf5de62a4cde464c573b43d01f8db
  #include "iwl-trans.h"
  
  struct iwl_rs_rate_info {
-       u8 plcp;        /* uCode API:  IWL_RATE_6M_PLCP, etc. */
-       u8 plcp_siso;   /* uCode API:  IWL_RATE_SISO_6M_PLCP, etc. */
-       u8 plcp_mimo2;  /* uCode API:  IWL_RATE_MIMO2_6M_PLCP, etc. */
+       u8 plcp;          /* uCode API:  IWL_RATE_6M_PLCP, etc. */
+       u8 plcp_ht_siso;  /* uCode API:  IWL_RATE_SISO_6M_PLCP, etc. */
+       u8 plcp_ht_mimo2; /* uCode API:  IWL_RATE_MIMO2_6M_PLCP, etc. */
+       u8 plcp_vht_siso;
+       u8 plcp_vht_mimo2;
        u8 prev_rs;      /* previous rate used in rs algo */
        u8 next_rs;      /* next rate used in rs algo */
  };
@@@ -83,35 -85,52 +85,52 @@@ enum 
  #define       IWL_RATE_11M_MASK  (1 << IWL_RATE_11M_INDEX)
  
  
- /* uCode API values for OFDM high-throughput (HT) bit rates */
+ /* uCode API values for HT/VHT bit rates */
  enum {
-       IWL_RATE_SISO_6M_PLCP = 0,
-       IWL_RATE_SISO_12M_PLCP = 1,
-       IWL_RATE_SISO_18M_PLCP = 2,
-       IWL_RATE_SISO_24M_PLCP = 3,
-       IWL_RATE_SISO_36M_PLCP = 4,
-       IWL_RATE_SISO_48M_PLCP = 5,
-       IWL_RATE_SISO_54M_PLCP = 6,
-       IWL_RATE_SISO_60M_PLCP = 7,
-       IWL_RATE_MIMO2_6M_PLCP  = 0x8,
-       IWL_RATE_MIMO2_12M_PLCP = 0x9,
-       IWL_RATE_MIMO2_18M_PLCP = 0xa,
-       IWL_RATE_MIMO2_24M_PLCP = 0xb,
-       IWL_RATE_MIMO2_36M_PLCP = 0xc,
-       IWL_RATE_MIMO2_48M_PLCP = 0xd,
-       IWL_RATE_MIMO2_54M_PLCP = 0xe,
-       IWL_RATE_MIMO2_60M_PLCP = 0xf,
-       IWL_RATE_MIMO3_6M_PLCP  = 0x10,
-       IWL_RATE_MIMO3_12M_PLCP = 0x11,
-       IWL_RATE_MIMO3_18M_PLCP = 0x12,
-       IWL_RATE_MIMO3_24M_PLCP = 0x13,
-       IWL_RATE_MIMO3_36M_PLCP = 0x14,
-       IWL_RATE_MIMO3_48M_PLCP = 0x15,
-       IWL_RATE_MIMO3_54M_PLCP = 0x16,
-       IWL_RATE_MIMO3_60M_PLCP = 0x17,
-       IWL_RATE_SISO_INVM_PLCP,
-       IWL_RATE_MIMO2_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP,
-       IWL_RATE_MIMO3_INVM_PLCP = IWL_RATE_SISO_INVM_PLCP,
+       IWL_RATE_HT_SISO_MCS_0_PLCP = 0,
+       IWL_RATE_HT_SISO_MCS_1_PLCP = 1,
+       IWL_RATE_HT_SISO_MCS_2_PLCP = 2,
+       IWL_RATE_HT_SISO_MCS_3_PLCP = 3,
+       IWL_RATE_HT_SISO_MCS_4_PLCP = 4,
+       IWL_RATE_HT_SISO_MCS_5_PLCP = 5,
+       IWL_RATE_HT_SISO_MCS_6_PLCP = 6,
+       IWL_RATE_HT_SISO_MCS_7_PLCP = 7,
+       IWL_RATE_HT_MIMO2_MCS_0_PLCP = 0x8,
+       IWL_RATE_HT_MIMO2_MCS_1_PLCP = 0x9,
+       IWL_RATE_HT_MIMO2_MCS_2_PLCP = 0xA,
+       IWL_RATE_HT_MIMO2_MCS_3_PLCP = 0xB,
+       IWL_RATE_HT_MIMO2_MCS_4_PLCP = 0xC,
+       IWL_RATE_HT_MIMO2_MCS_5_PLCP = 0xD,
+       IWL_RATE_HT_MIMO2_MCS_6_PLCP = 0xE,
+       IWL_RATE_HT_MIMO2_MCS_7_PLCP = 0xF,
+       IWL_RATE_VHT_SISO_MCS_0_PLCP = 0,
+       IWL_RATE_VHT_SISO_MCS_1_PLCP = 1,
+       IWL_RATE_VHT_SISO_MCS_2_PLCP = 2,
+       IWL_RATE_VHT_SISO_MCS_3_PLCP = 3,
+       IWL_RATE_VHT_SISO_MCS_4_PLCP = 4,
+       IWL_RATE_VHT_SISO_MCS_5_PLCP = 5,
+       IWL_RATE_VHT_SISO_MCS_6_PLCP = 6,
+       IWL_RATE_VHT_SISO_MCS_7_PLCP = 7,
+       IWL_RATE_VHT_SISO_MCS_8_PLCP = 8,
+       IWL_RATE_VHT_SISO_MCS_9_PLCP = 9,
+       IWL_RATE_VHT_MIMO2_MCS_0_PLCP = 0x10,
+       IWL_RATE_VHT_MIMO2_MCS_1_PLCP = 0x11,
+       IWL_RATE_VHT_MIMO2_MCS_2_PLCP = 0x12,
+       IWL_RATE_VHT_MIMO2_MCS_3_PLCP = 0x13,
+       IWL_RATE_VHT_MIMO2_MCS_4_PLCP = 0x14,
+       IWL_RATE_VHT_MIMO2_MCS_5_PLCP = 0x15,
+       IWL_RATE_VHT_MIMO2_MCS_6_PLCP = 0x16,
+       IWL_RATE_VHT_MIMO2_MCS_7_PLCP = 0x17,
+       IWL_RATE_VHT_MIMO2_MCS_8_PLCP = 0x18,
+       IWL_RATE_VHT_MIMO2_MCS_9_PLCP = 0x19,
+       IWL_RATE_HT_SISO_MCS_INV_PLCP,
+       IWL_RATE_HT_MIMO2_MCS_INV_PLCP = IWL_RATE_HT_SISO_MCS_INV_PLCP,
+       IWL_RATE_VHT_SISO_MCS_INV_PLCP = IWL_RATE_HT_SISO_MCS_INV_PLCP,
+       IWL_RATE_VHT_MIMO2_MCS_INV_PLCP = IWL_RATE_HT_SISO_MCS_INV_PLCP,
+       IWL_RATE_HT_SISO_MCS_8_PLCP = IWL_RATE_HT_SISO_MCS_INV_PLCP,
+       IWL_RATE_HT_SISO_MCS_9_PLCP = IWL_RATE_HT_SISO_MCS_INV_PLCP,
+       IWL_RATE_HT_MIMO2_MCS_8_PLCP = IWL_RATE_HT_SISO_MCS_INV_PLCP,
+       IWL_RATE_HT_MIMO2_MCS_9_PLCP = IWL_RATE_HT_SISO_MCS_INV_PLCP,
  };
  
  #define IWL_RATES_MASK ((1 << IWL_RATE_COUNT) - 1)
  #define IWL_RATE_DECREASE_TH          1920    /*  15% */
  
  /* possible actions when in legacy mode */
- #define IWL_LEGACY_SWITCH_ANTENNA1      0
- #define IWL_LEGACY_SWITCH_ANTENNA2      1
- #define IWL_LEGACY_SWITCH_SISO          2
- #define IWL_LEGACY_SWITCH_MIMO2         3
+ enum {
+       IWL_LEGACY_SWITCH_ANTENNA,
+       IWL_LEGACY_SWITCH_SISO,
+       IWL_LEGACY_SWITCH_MIMO2,
+       IWL_LEGACY_FIRST_ACTION = IWL_LEGACY_SWITCH_ANTENNA,
+       IWL_LEGACY_LAST_ACTION = IWL_LEGACY_SWITCH_MIMO2,
+ };
  
  /* possible actions when in siso mode */
- #define IWL_SISO_SWITCH_ANTENNA1        0
- #define IWL_SISO_SWITCH_ANTENNA2        1
- #define IWL_SISO_SWITCH_MIMO2           2
- #define IWL_SISO_SWITCH_GI              3
+ enum {
+       IWL_SISO_SWITCH_ANTENNA,
+       IWL_SISO_SWITCH_MIMO2,
+       IWL_SISO_SWITCH_GI,
+       IWL_SISO_FIRST_ACTION = IWL_SISO_SWITCH_ANTENNA,
+       IWL_SISO_LAST_ACTION = IWL_SISO_SWITCH_GI,
+ };
  
  /* possible actions when in mimo mode */
- #define IWL_MIMO2_SWITCH_ANTENNA1       0
- #define IWL_MIMO2_SWITCH_ANTENNA2       1
- #define IWL_MIMO2_SWITCH_SISO_A         2
- #define IWL_MIMO2_SWITCH_SISO_B         3
- #define IWL_MIMO2_SWITCH_GI             4
+ enum {
+       IWL_MIMO2_SWITCH_SISO_A,
+       IWL_MIMO2_SWITCH_SISO_B,
+       IWL_MIMO2_SWITCH_GI,
+       IWL_MIMO2_FIRST_ACTION = IWL_MIMO2_SWITCH_SISO_A,
+       IWL_MIMO2_LAST_ACTION = IWL_MIMO2_SWITCH_GI,
+ };
  
- #define IWL_MAX_SEARCH IWL_MIMO2_SWITCH_GI
+ #define IWL_MAX_SEARCH IWL_MIMO2_LAST_ACTION
  
  #define IWL_ACTION_LIMIT              3       /* # possible actions */
  
  
  enum iwl_table_type {
        LQ_NONE,
-       LQ_G,           /* legacy types */
-       LQ_A,
-       LQ_SISO,        /* high-throughput types */
-       LQ_MIMO2,
+       LQ_LEGACY_G,    /* legacy types */
+       LQ_LEGACY_A,
+       LQ_HT_SISO,     /* HT types */
+       LQ_HT_MIMO2,
+       LQ_VHT_SISO,    /* VHT types */
+       LQ_VHT_MIMO2,
        LQ_MAX,
  };
  
- #define is_legacy(tbl) (((tbl) == LQ_G) || ((tbl) == LQ_A))
- #define is_siso(tbl) ((tbl) == LQ_SISO)
- #define is_mimo2(tbl) ((tbl) == LQ_MIMO2)
- #define is_mimo(tbl) is_mimo2(tbl)
- #define is_Ht(tbl) (is_siso(tbl) || is_mimo(tbl))
- #define is_a_band(tbl) ((tbl) == LQ_A)
- #define is_g_and(tbl) ((tbl) == LQ_G)
+ #define is_legacy(tbl) (((tbl) == LQ_LEGACY_G) || ((tbl) == LQ_LEGACY_A))
+ #define is_ht_siso(tbl) ((tbl) == LQ_HT_SISO)
+ #define is_ht_mimo2(tbl) ((tbl) == LQ_HT_MIMO2)
+ #define is_vht_siso(tbl) ((tbl) == LQ_VHT_SISO)
+ #define is_vht_mimo2(tbl) ((tbl) == LQ_VHT_MIMO2)
+ #define is_siso(tbl) (is_ht_siso(tbl) || is_vht_siso(tbl))
+ #define is_mimo2(tbl) (is_ht_mimo2(tbl) || is_vht_mimo2(tbl))
+ #define is_mimo(tbl) (is_mimo2(tbl))
+ #define is_ht(tbl) (is_ht_siso(tbl) || is_ht_mimo2(tbl))
+ #define is_vht(tbl) (is_vht_siso(tbl) || is_vht_mimo2(tbl))
+ #define is_a_band(tbl) ((tbl) == LQ_LEGACY_A)
+ #define is_g_band(tbl) ((tbl) == LQ_LEGACY_G)
+ #define is_ht20(tbl) (tbl->bw == RATE_MCS_CHAN_WIDTH_20)
+ #define is_ht40(tbl) (tbl->bw == RATE_MCS_CHAN_WIDTH_40)
+ #define is_ht80(tbl) (tbl->bw == RATE_MCS_CHAN_WIDTH_80)
  
  #define IWL_MAX_MCS_DISPLAY_SIZE      12
  
@@@ -232,7 -270,7 +270,7 @@@ struct iwl_scale_tbl_info 
        enum iwl_table_type lq_type;
        u8 ant_type;
        u8 is_SGI;      /* 1 = short guard interval */
-       u8 is_ht40;     /* 1 = 40 MHz channel width */
+       u32 bw;         /* channel bandwidth; RATE_MCS_CHAN_WIDTH_XX */
        u8 action;      /* change modulation; IWL_[LEGACY/SISO/MIMO]_SWITCH_* */
        u8 max_search;  /* maximun number of tables we can search */
        s32 *expected_tpt;      /* throughput metrics; expected_tpt_G, etc. */
@@@ -262,7 -300,7 +300,7 @@@ struct iwl_lq_sta 
        u64 flush_timer;        /* time staying in mode before new search */
  
        u8 action_counter;      /* # mode-switch actions tried */
-       u8 is_green;
+       bool is_vht;
        enum ieee80211_band band;
  
        /* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */
@@@ -314,8 -352,9 +352,8 @@@ static inline u8 num_of_ant(u8 mask
  }
  
  /* Initialize station's rate scaling information after adding station */
 -extern void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm,
 -                               struct ieee80211_sta *sta,
 -                               enum ieee80211_band band);
 +void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
 +                        enum ieee80211_band band);
  
  /**
   * iwl_rate_control_register - Register the rate control algorithm callbacks
   * ieee80211_register_hw
   *
   */
 -extern int iwl_mvm_rate_control_register(void);
 +int iwl_mvm_rate_control_register(void);
  
  /**
   * iwl_rate_control_unregister - Unregister the rate control callbacks
   * This should be called after calling ieee80211_unregister_hw, but before
   * the driver is unloaded.
   */
 -extern void iwl_mvm_rate_control_unregister(void);
 +void iwl_mvm_rate_control_unregister(void);
  
  struct iwl_mvm_sta;
  
index d0de412bfa437a7b695d9bf2d9f0ef1efe26c2b6,bf2ddffdae2d226d0727656cb1f98ef0eab8f94a..2cc9517fb0d5006f4b5b4f9570cf7a748d3e3518
@@@ -218,11 -218,10 +218,10 @@@ void baswap(bdaddr_t *dst, bdaddr_t *sr
  
  struct bt_sock {
        struct sock sk;
-       bdaddr_t    src;
-       bdaddr_t    dst;
        struct list_head accept_q;
        struct sock *parent;
        unsigned long flags;
+       void (*skb_msg_name)(struct sk_buff *, void *, int *);
  };
  
  enum {
@@@ -285,6 -284,8 +284,8 @@@ struct bt_skb_cb 
        __u8 force_active;
        struct l2cap_ctrl control;
        struct hci_req_ctrl req;
+       bdaddr_t bdaddr;
+       __le16 psm;
  };
  #define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
  
@@@ -332,16 -333,16 +333,16 @@@ out
  
  int bt_to_errno(__u16 code);
  
 -extern int hci_sock_init(void);
 -extern void hci_sock_cleanup(void);
 +int hci_sock_init(void);
 +void hci_sock_cleanup(void);
  
 -extern int bt_sysfs_init(void);
 -extern void bt_sysfs_cleanup(void);
 +int bt_sysfs_init(void);
 +void bt_sysfs_cleanup(void);
  
 -extern int  bt_procfs_init(struct net *net, const char *name,
 -                         struct bt_sock_list* sk_list,
 -                         int (* seq_show)(struct seq_file *, void *));
 -extern void bt_procfs_cleanup(struct net *net, const char *name);
 +int bt_procfs_init(struct net *net, const char *name,
 +                 struct bt_sock_list *sk_list,
 +                 int (*seq_show)(struct seq_file *, void *));
 +void bt_procfs_cleanup(struct net *net, const char *name);
  
  extern struct dentry *bt_debugfs;
  
index e3ea48d6c99269c6383f9bd36f9159e9d987e282,4e208420d84c6bdfbe281dcb7de981d846413bd2..2dc467939be7e9a189bef661ae96762a8eb31fe8
@@@ -159,11 -159,14 +159,14 @@@ struct hci_dev 
        __u16           manufacturer;
        __u16           lmp_subver;
        __u16           voice_setting;
+       __u8            num_iac;
        __u8            io_capability;
        __s8            inq_tx_power;
        __u16           page_scan_interval;
        __u16           page_scan_window;
        __u8            page_scan_type;
+       __u16           le_scan_interval;
+       __u16           le_scan_window;
  
        __u16           devid_source;
        __u16           devid_vendor;
        int (*close)(struct hci_dev *hdev);
        int (*flush)(struct hci_dev *hdev);
        int (*setup)(struct hci_dev *hdev);
-       int (*send)(struct sk_buff *skb);
+       int (*send)(struct hci_dev *hdev, struct sk_buff *skb);
        void (*notify)(struct hci_dev *hdev, unsigned int evt);
-       int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);
  };
  
  #define HCI_PHY_HANDLE(handle)        (handle & 0xff)
@@@ -299,6 -301,8 +301,8 @@@ struct hci_conn 
  
        bdaddr_t        dst;
        __u8            dst_type;
+       bdaddr_t        src;
+       __u8            src_type;
        __u16           handle;
        __u16           state;
        __u8            mode;
@@@ -368,17 -372,18 +372,17 @@@ extern rwlock_t hci_dev_list_lock
  extern rwlock_t hci_cb_list_lock;
  
  /* ----- HCI interface to upper protocols ----- */
 -extern int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr);
 -extern void l2cap_connect_cfm(struct hci_conn *hcon, u8 status);
 -extern int l2cap_disconn_ind(struct hci_conn *hcon);
 -extern void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason);
 -extern int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt);
 -extern int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb,
 -                            u16 flags);
 -
 -extern int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags);
 -extern void sco_connect_cfm(struct hci_conn *hcon, __u8 status);
 -extern void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason);
 -extern int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb);
 +int l2cap_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr);
 +void l2cap_connect_cfm(struct hci_conn *hcon, u8 status);
 +int l2cap_disconn_ind(struct hci_conn *hcon);
 +void l2cap_disconn_cfm(struct hci_conn *hcon, u8 reason);
 +int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt);
 +int l2cap_recv_acldata(struct hci_conn *hcon, struct sk_buff *skb, u16 flags);
 +
 +int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags);
 +void sco_connect_cfm(struct hci_conn *hcon, __u8 status);
 +void sco_disconn_cfm(struct hci_conn *hcon, __u8 reason);
 +int sco_recv_scodata(struct hci_conn *hcon, struct sk_buff *skb);
  
  /* ----- Inquiry cache ----- */
  #define INQUIRY_CACHE_AGE_MAX   (HZ*30)   /* 30 seconds */
@@@ -703,19 -708,6 +707,6 @@@ static inline void hci_set_drvdata(stru
        dev_set_drvdata(&hdev->dev, data);
  }
  
- /* hci_dev_list shall be locked */
- static inline uint8_t __hci_num_ctrl(void)
- {
-       uint8_t count = 0;
-       struct list_head *p;
-       list_for_each(p, &hci_dev_list) {
-               count++;
-       }
-       return count;
- }
  struct hci_dev *hci_dev_get(int index);
  struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src);
  
@@@ -768,7 -760,7 +759,7 @@@ int hci_remove_remote_oob_data(struct h
  
  void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
  
- int hci_recv_frame(struct sk_buff *skb);
+ int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb);
  int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count);
  int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count);
  
@@@ -807,22 -799,6 +798,6 @@@ void hci_conn_del_sysfs(struct hci_con
  #define lmp_host_le_capable(dev)   (!!((dev)->features[1][0] & LMP_HOST_LE))
  #define lmp_host_le_br_capable(dev) (!!((dev)->features[1][0] & LMP_HOST_LE_BREDR))
  
- /* returns true if at least one AMP active */
- static inline bool hci_amp_capable(void)
- {
-       struct hci_dev *hdev;
-       bool ret = false;
-       read_lock(&hci_dev_list_lock);
-       list_for_each_entry(hdev, &hci_dev_list, list)
-               if (hdev->amp_type == HCI_AMP &&
-                   test_bit(HCI_UP, &hdev->flags))
-                       ret = true;
-       read_unlock(&hci_dev_list_lock);
-       return ret;
- }
  /* ----- HCI protocols ----- */
  #define HCI_PROTO_DEFER             0x01
  
@@@ -1120,24 -1096,24 +1095,24 @@@ void hci_sock_dev_event(struct hci_dev 
  #define DISCOV_BREDR_INQUIRY_LEN      0x08
  
  int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len);
int mgmt_index_added(struct hci_dev *hdev);
int mgmt_index_removed(struct hci_dev *hdev);
int mgmt_set_powered_failed(struct hci_dev *hdev, int err);
void mgmt_index_added(struct hci_dev *hdev);
void mgmt_index_removed(struct hci_dev *hdev);
void mgmt_set_powered_failed(struct hci_dev *hdev, int err);
  int mgmt_powered(struct hci_dev *hdev, u8 powered);
  int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable);
  int mgmt_connectable(struct hci_dev *hdev, u8 connectable);
  int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status);
  int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
                      bool persistent);
int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
-                         u8 addr_type, u32 flags, u8 *name, u8 name_len,
-                         u8 *dev_class);
int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
-                            u8 link_type, u8 addr_type, u8 reason);
int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
-                          u8 link_type, u8 addr_type, u8 status);
int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
-                       u8 addr_type, u8 status);
void mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
+                          u8 addr_type, u32 flags, u8 *name, u8 name_len,
+                          u8 *dev_class);
void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
+                             u8 link_type, u8 addr_type, u8 reason);
void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
+                           u8 link_type, u8 addr_type, u8 status);
void mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
+                        u8 addr_type, u8 status);
  int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure);
  int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
                                 u8 status);
@@@ -1168,16 -1144,16 +1143,16 @@@ int mgmt_set_class_of_dev_complete(stru
  int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status);
  int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
                                            u8 *randomizer, u8 status);
int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
-                     u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name,
-                     u8 ssp, u8 *eir, u16 eir_len);
int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
-                    u8 addr_type, s8 rssi, u8 *name, u8 name_len);
int mgmt_discovering(struct hci_dev *hdev, u8 discovering);
void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
+                      u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name,
+                      u8 ssp, u8 *eir, u16 eir_len);
void mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
+                     u8 addr_type, s8 rssi, u8 *name, u8 name_len);
void mgmt_discovering(struct hci_dev *hdev, u8 discovering);
  int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
  int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type);
- bool mgmt_valid_hdev(struct hci_dev *hdev);
  int mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent);
+ void mgmt_reenable_advertising(struct hci_dev *hdev);
  
  /* HCI info for socket */
  #define hci_pi(sk) ((struct hci_pinfo *) sk)
@@@ -1214,8 -1190,6 +1189,6 @@@ void hci_le_conn_update(struct hci_con
  void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
                                                        __u8 ltk[16]);
  
- u8 bdaddr_to_le(u8 bdaddr_type);
  #define SCO_AIRMODE_MASK       0x0003
  #define SCO_AIRMODE_CVSD       0x0000
  #define SCO_AIRMODE_TRANSP     0x0003
index b7f43e76a5c5664a32d313866a72d42a11544d20,3588f48bfd354828ca6891f6306491fe83696291..486213a1aed8d07ad63aaba57957e7a651657696
@@@ -256,8 -256,8 +256,8 @@@ static inline void rfcomm_dlc_put(struc
                rfcomm_dlc_free(d);
  }
  
 -extern void __rfcomm_dlc_throttle(struct rfcomm_dlc *d);
 -extern void __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d);
 +void __rfcomm_dlc_throttle(struct rfcomm_dlc *d);
 +void __rfcomm_dlc_unthrottle(struct rfcomm_dlc *d);
  
  static inline void rfcomm_dlc_throttle(struct rfcomm_dlc *d)
  {
@@@ -300,6 -300,8 +300,8 @@@ struct rfcomm_conninfo 
  
  struct rfcomm_pinfo {
        struct bt_sock bt;
+       bdaddr_t src;
+       bdaddr_t dst;
        struct rfcomm_dlc   *dlc;
        u8     channel;
        u8     sec_level;