diff options
author | Ajay <ajay.davanageri@broadcom.com> | 2022-03-08 19:44:55 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-03-08 19:44:55 +0000 |
commit | 03d03da25dcda7beabca9af2d18d7a9f9c5cdebb (patch) | |
tree | 637f44d8b847425e6b7061a4205c55f4f27b2495 | |
parent | acbd866625aecf2cc0ecb2acdefcc9041283d999 (diff) | |
parent | 5a788305461b58915da0eba93c0ad72d666ef24f (diff) | |
download | wlan-03d03da25dcda7beabca9af2d18d7a9f9c5cdebb.tar.gz |
Support for HAL API to get the simultaneous Radio Capability of the Chip am: 5a78830546
Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/broadcom/wlan/+/17106967
Change-Id: I0960dbf2ba9b1338ae35fed6888432eda50d94f7
-rwxr-xr-x | bcmdhd/wifi_hal/common.h | 2 | ||||
-rwxr-xr-x | bcmdhd/wifi_hal/wifi_hal.cpp | 118 |
2 files changed, 119 insertions, 1 deletions
diff --git a/bcmdhd/wifi_hal/common.h b/bcmdhd/wifi_hal/common.h index 21f0cef..debb279 100755 --- a/bcmdhd/wifi_hal/common.h +++ b/bcmdhd/wifi_hal/common.h @@ -232,7 +232,7 @@ typedef enum { WIFI_SUBCMD_OTA_UPDATE, WIFI_SUBCMD_USABLE_CHANNEL = ANDROID_NL80211_SUBCMD_USABLE_CHANNEL_START, WIFI_SUBCMD_TRIGGER_SSR = ANDROID_NL80211_SUBCMD_INIT_DEINIT_RANGE_START, - + WIFI_SUBCMD_GET_RADIO_COMBO_MATRIX, } WIFI_SUB_COMMAND; typedef enum { diff --git a/bcmdhd/wifi_hal/wifi_hal.cpp b/bcmdhd/wifi_hal/wifi_hal.cpp index 83c65c3..318b5ea 100755 --- a/bcmdhd/wifi_hal/wifi_hal.cpp +++ b/bcmdhd/wifi_hal/wifi_hal.cpp @@ -94,6 +94,8 @@ static wifi_error wifi_get_packet_filter_capabilities(wifi_interface_handle hand static wifi_error wifi_configure_nd_offload(wifi_interface_handle iface, u8 enable); static wifi_error wifi_get_usable_channels(wifi_handle handle, u32 band_mask, u32 iface_mode_mask, u32 filter_mask, u32 max_size, u32* size, wifi_usable_channel* channels); +static wifi_error wifi_get_supported_radio_combinations_matrix(wifi_handle handle, + u32 max_size, u32* size, wifi_radio_combination_matrix *radio_combination_matrix); static void wifi_cleanup_dynamic_ifaces(wifi_handle handle); typedef enum wifi_attr { @@ -116,6 +118,13 @@ typedef enum wifi_attr { ANDR_WIFI_ATTRIBUTE_MAX } wifi_attr_t; +enum wifi_radio_combo_attributes { + ANDR_WIFI_ATTRIBUTE_RADIO_COMBO_INVALID = 0, + ANDR_WIFI_ATTRIBUTE_RADIO_COMBO_MATRIX = 1, + // Add more attribute here + ANDR_WIFI_ATTRIBUTE_RADIO_COMBO_MAX +}; + enum wifi_rssi_monitor_attr { RSSI_MONITOR_ATTRIBUTE_INVALID = 0, RSSI_MONITOR_ATTRIBUTE_MAX_RSSI = 1, @@ -331,6 +340,7 @@ wifi_error init_wifi_vendor_hal_func_table(wifi_hal_fn *fn) fn->wifi_set_dtim_config = wifi_set_dtim_config; fn->wifi_get_usable_channels = wifi_get_usable_channels; fn->wifi_trigger_subsystem_restart = wifi_trigger_subsystem_restart; + fn->wifi_get_supported_radio_combinations_matrix = wifi_get_supported_radio_combinations_matrix; return WIFI_SUCCESS; } @@ -1478,6 +1488,93 @@ protected: } }; +///////////////////////////////////////////////////////////////////// +class GetRadioComboCommand : public WifiCommand { +private: + wifi_radio_combination_matrix *rcmatrix; + u32* rc_size; + u32 set_size_max; + int ret = 0; + +public: + GetRadioComboCommand(wifi_interface_handle handle, u32 max_size, u32* size, + wifi_radio_combination_matrix *radio_combination_matrix) + : WifiCommand("GetRadioComboCommand", handle, 0), rcmatrix(radio_combination_matrix), + rc_size(size), set_size_max(max_size) + { + } + + virtual int createRequest(WifiRequest& mMsg) { + ret = mMsg.create(GOOGLE_OUI, WIFI_SUBCMD_GET_RADIO_COMBO_MATRIX); + if (ret < 0) { + ALOGE("Can't create message to send to driver - %d", ret); + } + nlattr *data = mMsg.attr_start(NL80211_ATTR_VENDOR_DATA); + mMsg.attr_end(data); + + return ret; + } + + int start() { + WifiRequest request(familyId(), ifaceId()); + ret = createRequest(request); + if (ret < 0) { + ALOGE("Request failed for radio_combo_matrix, result = %d", ret); + return ret; + } + ret = requestResponse(request); + if (ret < 0) { + ALOGE("Request Response failed for radio_combo_matrix, result = %d", ret); + return ret; + } + ALOGD("Done! %s", __FUNCTION__); + return ret; + } + +protected: + virtual int handleResponse(WifiEvent& reply) { + ALOGD("In GetRadioComboCommand::handleResponse"); + if (reply.get_cmd() != NL80211_CMD_VENDOR) { + ALOGD("Ignoring reply with cmd = %d", reply.get_cmd()); + return NL_SKIP; + } + + int id = reply.get_vendor_id(); + int subcmd = reply.get_vendor_subcmd(); + + nlattr *vendor_data = reply.get_attribute(NL80211_ATTR_VENDOR_DATA); + int len = reply.get_vendor_data_len(); + + ALOGV("Id = %0x, subcmd = %d, len = %d", id, subcmd, len); + if (vendor_data == NULL || len == 0) { + ALOGE("no vendor data in GetRadioComboCommand response; ignoring it"); + return NL_SKIP; + } + + for (nl_iterator it(vendor_data); it.has_next(); it.next()) { + if (it.get_type() == ANDR_WIFI_ATTRIBUTE_RADIO_COMBO_MATRIX) { + void *data = it.get_data(); + *rc_size = it.get_len(); + if (!data || !*rc_size) { + ALOGE("Buffers pointers not set"); + return NL_SKIP; + } + if (set_size_max < *rc_size) { + ALOGE("Unexpected buffers size"); + return NL_SKIP; + } + memcpy(rcmatrix, data, min(len, *rc_size)); + } else { + ALOGW("Ignoring invalid attribute type = %d, size = %d", + it.get_type(), it.get_len()); + } + } + + ALOGD("GetRadioComboCommand::Success"); + return NL_OK; + } +}; +///////////////////////////////////////////////////////////////////// class SetLatencyModeCommand : public WifiCommand { private: @@ -1759,6 +1856,27 @@ wifi_error wifi_get_concurrency_matrix(wifi_interface_handle handle, int set_siz return (wifi_error) command.requestResponse(); } +wifi_error wifi_get_supported_radio_combinations_matrix(wifi_handle handle, + u32 max_size, u32* size, wifi_radio_combination_matrix *radio_combination_matrix) +{ + int numIfaceHandles = 0; + wifi_interface_handle *ifaceHandles = NULL; + wifi_interface_handle wlan0Handle; + + wlan0Handle = wifi_get_wlan_interface((wifi_handle)handle, ifaceHandles, numIfaceHandles); + GetRadioComboCommand *cmd = new GetRadioComboCommand(wlan0Handle, max_size, + size, radio_combination_matrix); + NULL_CHECK_RETURN(cmd, "memory allocation failure", WIFI_ERROR_OUT_OF_MEMORY); + wifi_error result = (wifi_error)cmd->start(); + if (result == WIFI_SUCCESS) { + ALOGD("Get radio combo matrix success"); + } else { + ALOGE("Get radio combo matrix failed\n"); + } + cmd->releaseRef(); + return result; +} + wifi_error wifi_set_scanning_mac_oui(wifi_interface_handle handle, oui scan_oui) { SetPnoMacAddrOuiCommand command(handle, scan_oui); |