summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin Li <delphij@google.com>2022-12-09 21:51:11 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2022-12-09 21:51:11 +0000
commit9ff33a68670a393ee2bc6b22b6fc4663714f0871 (patch)
treed6f02f58c0607b2957c0601f11d2fe0451e6c8a3
parent5b819ee4ec00564efbf3ce69924933c515977a65 (diff)
parenta7d394b31d68bcce9821cdb9c53443dbe3977494 (diff)
downloadwlan-main-16k-with-phones.tar.gz
Merge "Merge Android 13 QPR1"main-16k-with-phones
-rwxr-xr-xbcmdhd/wifi_hal/common.h1
-rw-r--r--bcmdhd/wifi_hal/link_layer_stats.cpp62
-rwxr-xr-xbcmdhd/wifi_hal/nan.cpp3
-rwxr-xr-xbcmdhd/wifi_hal/wifi_hal.cpp69
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();
+}