diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index ef5e2e86d56c..1075ec566ab6 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -146,6 +146,9 @@ /* Scan Req Timeout */ #define WLAN_WAIT_TIME_SCAN_REQ 100 +#define WLAN_WAIT_TIME_ANTENNA_MODE_REQ 3000 +#define WLAN_WAIT_TIME_SET_DUAL_MAC_CFG 1500 + #define MAX_NUMBER_OF_ADAPTERS 4 #define MAX_CFG_STRING_LEN 255 @@ -1112,6 +1115,36 @@ typedef struct { } fw_log_info; +/** + * enum antenna_mode - number of TX/RX chains + * @HDD_ANTENNA_MODE_INVALID: Invalid mode place holder + * @HDD_ANTENNA_MODE_1X1: Number of TX/RX chains equals 1 + * @HDD_ANTENNA_MODE_2X2: Number of TX/RX chains equals 2 + * @HDD_ANTENNA_MODE_MAX: Place holder for max mode + */ +enum antenna_mode { + HDD_ANTENNA_MODE_INVALID, + HDD_ANTENNA_MODE_1X1, + HDD_ANTENNA_MODE_2X2, + HDD_ANTENNA_MODE_MAX +}; + +/** + * enum smps_mode - SM power save mode + * @HDD_SMPS_MODE_STATIC: Static power save + * @HDD_SMPS_MODE_DYNAMIC: Dynamic power save + * @HDD_SMPS_MODE_RESERVED: Reserved + * @HDD_SMPS_MODE_DISABLED: Disable power save + * @HDD_SMPS_MODE_MAX: Place holder for max mode + */ +enum smps_mode { + HDD_SMPS_MODE_STATIC, + HDD_SMPS_MODE_DYNAMIC, + HDD_SMPS_MODE_RESERVED, + HDD_SMPS_MODE_DISABLED, + HDD_SMPS_MODE_MAX +}; + #ifdef WLAN_FEATURE_OFFLOAD_PACKETS /** * struct hdd_offloaded_packets - request id to pattern id mapping @@ -1372,6 +1405,10 @@ struct hdd_context_s { * at runtime and intersecting it with target capab before updating. */ uint32_t fine_time_meas_cap_target; + /* completion variable to indicate set antenna mode complete*/ + struct completion set_antenna_mode_cmpl; + /* Current number of TX X RX chains being used */ + enum antenna_mode current_antenna_mode; }; /*--------------------------------------------------------------------------- @@ -1566,6 +1603,8 @@ static inline void wlan_hdd_stop_sap(hdd_adapter_t *ap_adapter) {} static inline void wlan_hdd_start_sap(hdd_adapter_t *ap_adapter) {} #endif +void wlan_hdd_soc_set_antenna_mode_cb(enum set_antenna_mode_status status); + #ifdef QCA_CONFIG_SMP int wlan_hdd_get_cpu(void); #else diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index ee72d48841ca..98247c6567ec 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -452,6 +452,31 @@ struct sir_set_dual_mac_cfg { struct sir_dual_mac_config set_dual_mac; }; +/** + * struct sir_antenna_mode_param - antenna mode param + * @num_tx_chains: Number of TX chains + * @num_rx_chains: Number of RX chains + * @reason: Reason for setting antenna mode + * @set_antenna_mode_resp: callback to set antenna mode command + */ +struct sir_antenna_mode_param { + uint32_t num_tx_chains; + uint32_t num_rx_chains; + void *set_antenna_mode_resp; +}; + +/** + * struct sir_set_antenna_mode - Set antenna mode request + * @message_type: Message type + * @length: Length of the message + * @set_antenna_mode: Params containing antenna mode params + */ +struct sir_set_antenna_mode { + uint16_t message_type; + uint16_t length; + struct sir_antenna_mode_param set_antenna_mode; +}; + /* / BSS type enum used in while scanning/joining etc */ typedef enum eSirBssType { eSIR_INFRASTRUCTURE_MODE, @@ -3258,6 +3283,29 @@ struct sir_dual_mac_config_resp { uint32_t status; }; +/** + * enum set_antenna_mode_status - Status of set antenna mode + * command + * @SET_ANTENNA_MODE_STATUS_OK: command successful + * @SET_ANTENNA_MODE_STATUS_EINVAL: invalid antenna mode + * @SET_ANTENNA_MODE_STATUS_ECANCELED: mode change cancelled + * @SET_ANTENNA_MODE_STATUS_ENOTSUP: mode not supported + */ +enum set_antenna_mode_status { + SET_ANTENNA_MODE_STATUS_OK, + SET_ANTENNA_MODE_STATUS_EINVAL, + SET_ANTENNA_MODE_STATUS_ECANCELED, + SET_ANTENNA_MODE_STATUS_ENOTSUP, +}; + +/** + * struct sir_antenna_mode_resp - set antenna mode response + * @status: Status of setting the antenna mode + */ +struct sir_antenna_mode_resp { + enum set_antenna_mode_status status; +}; + #ifdef WLAN_WAKEUP_EVENTS /*--------------------------------------------------------------------------- tSirWakeReasonInd @@ -5157,6 +5205,7 @@ typedef void (*hw_mode_transition_cb)(uint32_t old_hw_mode_index, struct sir_vdev_mac_map *vdev_mac_map); typedef void (*dual_mac_cb)(uint32_t status, uint32_t scan_config, uint32_t fw_mode_config); +typedef void (*antenna_mode_cb)(uint32_t status); /** * struct sir_nss_update_request diff --git a/core/mac/inc/wni_api.h b/core/mac/inc/wni_api.h index 103cb278d3f2..23ab4d2dffe1 100644 --- a/core/mac/inc/wni_api.h +++ b/core/mac/inc/wni_api.h @@ -246,6 +246,8 @@ enum eWniMsgTypes { eWNI_SME_EXT_CHANGE_CHANNEL_IND, eWNI_SME_REGISTER_MGMT_FRAME_CB, eWNI_SME_HT40_OBSS_SCAN_IND, /* START and UPDATE OBSS SCAN Indication*/ + eWNI_SME_SET_ANTENNA_MODE_REQ, + eWNI_SME_SET_ANTENNA_MODE_RESP, eWNI_SME_MSG_TYPES_END }; diff --git a/core/mac/src/include/sir_params.h b/core/mac/src/include/sir_params.h index 46e20cd29d25..89a0505f9785 100644 --- a/core/mac/src/include/sir_params.h +++ b/core/mac/src/include/sir_params.h @@ -358,9 +358,11 @@ typedef struct sSirMbMsgP2p { #ifdef FEATURE_WLAN_SCAN_PNO #define SIR_HAL_SET_PNO_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 119) -/* (SIR_HAL_ITC_MSG_TYPES_BEGIN + 120) is unused */ #endif /* FEATURE_WLAN_SCAN_PNO */ +#define SIR_HAL_SOC_ANTENNA_MODE_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 120) +#define SIR_HAL_SOC_ANTENNA_MODE_RESP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 121) + /* (SIR_HAL_ITC_MSG_TYPES_BEGIN + 122) is unused */ #ifdef WLAN_FEATURE_PACKET_FILTERING diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index 95af7d96b6c6..616beae018c5 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -1003,6 +1003,8 @@ QDF_STATUS sme_set_peer_authorized(uint8_t *peer_addr, uint32_t vdev_id); QDF_STATUS sme_soc_set_dual_mac_config(tHalHandle hal, struct sir_dual_mac_config msg); +QDF_STATUS sme_soc_set_antenna_mode(tHalHandle hal, + struct sir_antenna_mode_param *msg); void sme_set_scan_disable(tHalHandle h_hal, int value); void sme_setdef_dot11mode(tHalHandle hal); diff --git a/core/sme/inc/sme_inside.h b/core/sme/inc/sme_inside.h index f6fb7a6f0fa7..9ab29e53398c 100644 --- a/core/sme/inc/sme_inside.h +++ b/core/sme/inc/sme_inside.h @@ -191,6 +191,7 @@ typedef struct tagSmeCmd { struct sir_hw_mode set_hw_mode_cmd; struct s_nss_update_cmd nss_update_cmd; struct sir_dual_mac_config set_dual_mac_cmd; + struct sir_antenna_mode_param set_antenna_mode_cmd; } u; } tSmeCmd; @@ -282,6 +283,7 @@ QDF_STATUS csr_create_roam_scan_channel_list(tpAniSirGlobal pMac, ePhyChanBondState csr_convert_cb_ini_value_to_phy_cb_state(uint32_t cbIniValue); void active_list_cmd_timeout_handle(void *userData); void csr_process_set_dual_mac_config(tpAniSirGlobal mac, tSmeCmd *command); +void csr_process_set_antenna_mode(tpAniSirGlobal mac, tSmeCmd *command); void csr_process_set_hw_mode(tpAniSirGlobal mac, tSmeCmd *command); void csr_process_nss_update_req(tpAniSirGlobal mac, tSmeCmd *command); diff --git a/core/sme/inc/sme_internal.h b/core/sme/inc/sme_internal.h index 994fd53b2065..cca91d596243 100644 --- a/core/sme/inc/sme_internal.h +++ b/core/sme/inc/sme_internal.h @@ -92,6 +92,7 @@ typedef enum eSmeCommandType { e_sme_command_set_hw_mode, e_sme_command_nss_update, e_sme_command_set_dual_mac_config, + e_sme_command_set_antenna_mode, } eSmeCommandType; typedef enum eSmeState { diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index 9b2ccdef514c..5b9ba1f34b7e 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -1972,6 +1972,8 @@ QDF_STATUS wma_get_scan_id(uint32_t *scan_id); QDF_STATUS wma_send_soc_set_dual_mac_config(tp_wma_handle wma_handle, struct sir_dual_mac_config *msg); +QDF_STATUS wma_send_pdev_set_antenna_mode(tp_wma_handle wma_handle, + struct sir_antenna_mode_param *msg); QDF_STATUS wma_crash_inject(tp_wma_handle wma_handle, uint32_t type, uint32_t delay_time_ms);