diff options
Diffstat (limited to 'bcmdhd/wifi_hal/wifi_hal.cpp')
-rwxr-xr-x | bcmdhd/wifi_hal/wifi_hal.cpp | 69 |
1 files changed, 62 insertions, 7 deletions
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(); +} |