diff options
author | Xin Li <delphij@google.com> | 2022-12-09 21:51:11 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2022-12-09 21:51:11 +0000 |
commit | 9ff33a68670a393ee2bc6b22b6fc4663714f0871 (patch) | |
tree | d6f02f58c0607b2957c0601f11d2fe0451e6c8a3 | |
parent | 5b819ee4ec00564efbf3ce69924933c515977a65 (diff) | |
parent | a7d394b31d68bcce9821cdb9c53443dbe3977494 (diff) | |
download | wlan-main-16k-with-phones.tar.gz |
Merge "Merge Android 13 QPR1"main-16k-with-phones
-rwxr-xr-x | bcmdhd/wifi_hal/common.h | 1 | ||||
-rw-r--r-- | bcmdhd/wifi_hal/link_layer_stats.cpp | 62 | ||||
-rwxr-xr-x | bcmdhd/wifi_hal/nan.cpp | 3 | ||||
-rwxr-xr-x | bcmdhd/wifi_hal/wifi_hal.cpp | 69 |
4 files changed, 68 insertions, 67 deletions
diff --git a/bcmdhd/wifi_hal/common.h b/bcmdhd/wifi_hal/common.h index e9df748..f1a541f 100755 --- a/bcmdhd/wifi_hal/common.h +++ b/bcmdhd/wifi_hal/common.h @@ -233,6 +233,7 @@ typedef enum { 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_SUBCMD_ENABLE_TX_POWER_LIMIT, } WIFI_SUB_COMMAND; typedef enum { diff --git a/bcmdhd/wifi_hal/link_layer_stats.cpp b/bcmdhd/wifi_hal/link_layer_stats.cpp index 850b8fd..04b89b5 100644 --- a/bcmdhd/wifi_hal/link_layer_stats.cpp +++ b/bcmdhd/wifi_hal/link_layer_stats.cpp @@ -79,7 +79,7 @@ public: { } virtual int create() { - // ALOGI("Creating message to get link statistics; iface = %d", mIfaceInfo->id); + ALOGI("Creating message to get link statistics; iface = %d", mIfaceInfo->id); int ret = mMsg.create(GOOGLE_OUI, LSTATS_SUBCMD_GET_INFO); if (ret < 0) { @@ -99,7 +99,7 @@ protected: uint32_t total_size = 0, per_radio_size = 0, data_len = 0, rem_len = 0; int num_radios = 0, id = 0, subcmd = 0, len = 0; - // ALOGI("In GetLinkStatsCommand::handleResponse"); + ALOGI("In GetLinkStatsCommand::handleResponse"); if (reply.get_cmd() != NL80211_CMD_VENDOR) { ALOGD("Ignoring reply with cmd = %d", reply.get_cmd()); @@ -126,6 +126,7 @@ protected: } else { ALOGW("Ignoring invalid attribute type = %d, size = %d\n", it.get_type(), it.get_len()); + return NL_SKIP; } } @@ -176,32 +177,6 @@ protected: } (*mHandler.on_link_stats_results)(id, (wifi_iface_stat *)iface_stat, num_radios, (wifi_radio_stat *)radioStatsBuf); - } else { - /* To be deprecated, adding it to keep it backward compatible */ - ALOGD("GetLinkStatCommand: zero radio case\n"); - data = reply.get_vendor_data(); - if (!data) { - ALOGE("Invalid vendor data received\n"); - return NL_SKIP; - } - - num_radios = 1; - data = reply.get_vendor_data(); - len = reply.get_vendor_data_len(); - if (!data || !len) { - ALOGE("Invalid vendor data received\n"); - return NL_SKIP; - } - radio_stat_ptr = - convertToExternalRadioStatStructureLegacy((wifi_radio_stat_internal *)data); - if (!radio_stat_ptr) { - ALOGE("Invalid stats pointer received\n"); - return NL_SKIP; - } - wifi_iface_stat *iface_stat = - (wifi_iface_stat *)((char *)&((wifi_radio_stat_internal *)data)->channels - + radio_stat_ptr->num_channels * sizeof(wifi_channel_stat)); - (*mHandler.on_link_stats_results)(id, iface_stat, num_radios, radio_stat_ptr); } exit: if (radio_stat_ptr) { @@ -247,37 +222,6 @@ private: } return external_stat_ptr; } - - wifi_radio_stat *convertToExternalRadioStatStructureLegacy(wifi_radio_stat_internal *internal_stat_ptr) { - wifi_radio_stat *external_stat_ptr = NULL; - if (!internal_stat_ptr) { - ALOGE("Sta_ptr is null\n"); - } else { - uint32_t channel_size = internal_stat_ptr->num_channels * sizeof(wifi_channel_stat); - uint32_t total_size = sizeof(wifi_radio_stat) + channel_size; - external_stat_ptr = (wifi_radio_stat *)malloc(total_size); - if (external_stat_ptr) { - external_stat_ptr->radio = internal_stat_ptr->radio; - external_stat_ptr->on_time = internal_stat_ptr->on_time; - external_stat_ptr->tx_time = internal_stat_ptr->tx_time; - external_stat_ptr->rx_time = internal_stat_ptr->rx_time; - external_stat_ptr->tx_time_per_levels = NULL; - external_stat_ptr->num_tx_levels = 0; - external_stat_ptr->on_time_scan = internal_stat_ptr->on_time_scan; - external_stat_ptr->on_time_nbd = internal_stat_ptr->on_time_nbd; - external_stat_ptr->on_time_gscan = internal_stat_ptr->on_time_gscan; - external_stat_ptr->on_time_roam_scan = internal_stat_ptr->on_time_roam_scan; - external_stat_ptr->on_time_pno_scan = internal_stat_ptr->on_time_pno_scan; - external_stat_ptr->on_time_hs20 = internal_stat_ptr->on_time_hs20; - external_stat_ptr->num_channels = internal_stat_ptr->num_channels; - if (internal_stat_ptr->num_channels) { - memcpy(&(external_stat_ptr->channels), &(internal_stat_ptr->channels), - channel_size); - } - } - } - return external_stat_ptr; - } }; wifi_error wifi_get_link_stats(wifi_request_id id, diff --git a/bcmdhd/wifi_hal/nan.cpp b/bcmdhd/wifi_hal/nan.cpp index e74d9a1..b83f10a 100755 --- a/bcmdhd/wifi_hal/nan.cpp +++ b/bcmdhd/wifi_hal/nan.cpp @@ -4413,7 +4413,8 @@ wifi_error nan_disable_request(transaction_id id, ALOGE("Disable NAN MAC transId= %d\n", id); mac_prim->setId(id); } else { - ALOGE("Invalid transId= %d cur= %d\n", id, mac_prim->getId()); + ALOGE("Invalid transId= %d cur= %d\n", id, + mac_prim ? mac_prim->getId() : -1); } cmd->setChreNan(0); diff --git a/bcmdhd/wifi_hal/wifi_hal.cpp b/bcmdhd/wifi_hal/wifi_hal.cpp index e250b6d..e6a14e7 100755 --- a/bcmdhd/wifi_hal/wifi_hal.cpp +++ b/bcmdhd/wifi_hal/wifi_hal.cpp @@ -98,6 +98,9 @@ static wifi_error wifi_get_supported_radio_combinations_matrix(wifi_handle handl u32 max_size, u32* size, wifi_radio_combination_matrix *radio_combination_matrix); static void wifi_cleanup_dynamic_ifaces(wifi_handle handle); +static wifi_error wifi_enable_tx_power_limits(wifi_interface_handle iface, + bool isEnable); + typedef enum wifi_attr { ANDR_WIFI_ATTRIBUTE_INVALID = 0, ANDR_WIFI_ATTRIBUTE_NUM_FEATURE_SET = 1, @@ -196,6 +199,13 @@ enum multista_request_type { SET_USE_CASE }; +enum wifi_tx_power_limits { + TX_POWER_CAP_ATTRIBUTE_INVALID = 0, + TX_POWER_CAP_ENABLE_ATTRIBUTE = 1, + /* Add more attributes here */ + TX_POWER_ATTRIBUTE_MAX +}; + /* Initialize/Cleanup */ void wifi_socket_set_local_port(struct nl_sock *sock, uint32_t port) @@ -344,6 +354,7 @@ wifi_error init_wifi_vendor_hal_func_table(wifi_hal_fn *fn) fn->wifi_nan_rtt_chre_enable_request = nan_chre_enable_request; fn->wifi_nan_rtt_chre_disable_request = nan_chre_disable_request; fn->wifi_chre_register_handler = nan_chre_register_handler; + fn->wifi_enable_tx_power_limits = wifi_enable_tx_power_limits; return WIFI_SUCCESS; } @@ -554,12 +565,13 @@ wifi_error wifi_wait_for_driver_ready(void) // Function times out after 10 seconds int count = (POLL_DRIVER_MAX_TIME_MS * 1000) / POLL_DRIVER_DURATION_US; FILE *fd; + wifi_error status = WIFI_SUCCESS; do { if ((fd = fopen("/sys/class/net/wlan0", "r")) != NULL) { fclose(fd); - wifi_pre_initialize(); - return WIFI_SUCCESS; + status = wifi_pre_initialize(); + return status; } usleep(POLL_DRIVER_DURATION_US); } while(--count > 0); @@ -644,10 +656,13 @@ void wifi_cleanup(wifi_handle handle, wifi_cleaned_up_handler handler) if (wlan0Handle != NULL) { ALOGE("Calling hal cleanup"); if (!get_halutil_mode()) { + wifi_cleanup_dynamic_ifaces(handle); + ALOGI("Cleaned dynamic virtual ifaces\n"); result = wifi_stop_hal(wlan0Handle); if (result != WIFI_SUCCESS) { ALOGE("wifi_stop_hal failed"); } + ALOGI("wifi_stop_hal success"); } } else { @@ -703,9 +718,6 @@ void wifi_cleanup(wifi_handle handle, wifi_cleaned_up_handler handler) WifiCommand *cmd = (WifiCommand *)cbi->cb_arg; ALOGE("Leaked command %p", cmd); } - if (!get_halutil_mode()) { - wifi_cleanup_dynamic_ifaces(handle); - } pthread_mutex_unlock(&info->cb_lock); info->clean_up = true; @@ -2506,7 +2518,7 @@ public: } int createIface() { - ALOGE("Creating virtual interface"); + ALOGD("Creating virtual interface"); WifiRequest request(familyId(), ifaceId()); int result = createRequest(request, mIfname, mType, mwlan0_id); if (result != WIFI_SUCCESS) { @@ -2519,7 +2531,7 @@ public: ALOGE("failed to get the virtual iface create response; result = %d\n", result); return result; } - ALOGE("Created virtual interface"); + ALOGD("Created virtual interface"); return WIFI_SUCCESS; } @@ -2537,6 +2549,7 @@ public: ALOGE("failed to get response of delete virtual interface; result = %d\n", result); return result; } + ALOGD("Deleted virtual interface"); return WIFI_SUCCESS; } protected: @@ -2552,8 +2565,11 @@ static std::vector<std::string> added_ifaces; static void wifi_cleanup_dynamic_ifaces(wifi_handle handle) { int len = added_ifaces.size(); + ALOGI("%s: virtual iface size %d\n", __FUNCTION__, len); while (len--) { wifi_virtual_interface_delete(handle, added_ifaces.front().c_str()); + ALOGI("%s: deleted virtual iface %s\n", + __FUNCTION__, added_ifaces.front().c_str()); } added_ifaces.clear(); } @@ -3001,3 +3017,42 @@ wifi_error wifi_get_usable_channels(wifi_handle handle, u32 band_mask, u32 iface filter_mask, max_size, size, channels); return (wifi_error)command.start(); } + +///////////////////////////////////////////////////////////////////////////////////////////////// +class EnableTxPowerLimit : public WifiCommand { +private: + bool mEnableTxLimits; +public: + EnableTxPowerLimit(wifi_interface_handle handle, bool enable_tx_pwr_limits) + : WifiCommand("EnableTxPowerLimit", handle, 0) + { + mEnableTxLimits = enable_tx_pwr_limits; + } + + virtual int create() { + int ret; + + ret = mMsg.create(GOOGLE_OUI, WIFI_SUBCMD_ENABLE_TX_POWER_LIMIT); + if (ret < 0) { + ALOGE("Can't create message to send to driver - %d", ret); + return ret; + } + + nlattr *data = mMsg.attr_start(NL80211_ATTR_VENDOR_DATA); + ret = mMsg.put_u8(TX_POWER_CAP_ENABLE_ATTRIBUTE, mEnableTxLimits); + if (ret < 0) { + ALOGE("Failed to put enable tx power limit param %d\n", mEnableTxLimits); + return ret; + } + mMsg.attr_end(data); + return WIFI_SUCCESS; + } +}; + +wifi_error wifi_enable_tx_power_limits(wifi_interface_handle handle, bool isEnable) +{ + ALOGD("Configuring the tx power limits , halHandle = %p\n", handle); + + EnableTxPowerLimit command(handle, isEnable); + return (wifi_error) command.requestResponse(); +} |