X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fwifi-firmware.c;h=60a7abe1366d32aa00a4031cc8fd9996d8acec19;hb=80d17fd983ce5ab9b6aa7cd3cbfda529ef46dcf9;hp=85838658b7a7b183e4a1b00ddcbb3fd297f7f4f5;hpb=697f0ce9d4c7c6258cb121b435984bb5faada013;p=platform%2Fcore%2Fconnectivity%2Fnet-config.git diff --git a/src/wifi-firmware.c b/src/wifi-firmware.c index 8583865..60a7abe 100755 --- a/src/wifi-firmware.c +++ b/src/wifi-firmware.c @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include "log.h" #include "util.h" @@ -29,13 +31,16 @@ #include "netsupplicant.h" #include "wifi-firmware.h" #include "network-statistics.h" -#if defined WLAN_CHECK_POWERSAVE -#include "wifi-powersave.h" -#endif #define WLAN_DRIVER_SCRIPT "/usr/bin/wlan.sh" #define WLAN_IFACE_NAME "wlan0" -#define WLAN_P2P_IFACE_NAME "p2p0" + +#define WLAN_P2P_IFACE_NAME_TV "p2p0" +#define WLAN_P2P_IFACE_NAME_COMMON "wlan0" +#define WLAN_P2P_IFACE_NAME ((TIZEN_TV) ? (WLAN_P2P_IFACE_NAME_TV) : (WLAN_P2P_IFACE_NAME_COMMON)) +#define QUAD_CPUS_COUNT 4 +#define TEMP_BUFFER_LEN 100 +#define WIFI_MAC_ADD_PATH "/sys/class/net/wlan0/address" static int __netconfig_sta_firmware_start(void) { @@ -80,7 +85,9 @@ static int __netconfig_sta_firmware_stop(void) static int __netconfig_p2p_firmware_start(void) { -#if defined TIZEN_P2P_ENABLE + if (!netconfig_check_feature_supported(NETCONFIG_SUPPORTED_FEATURE_WIFI_DIRECT)) + return -ENODEV; + int rv = 0; const char *path = WLAN_DRIVER_SCRIPT; char *const args[] = { "/usr/bin/wlan.sh", "p2p", NULL }; @@ -90,10 +97,6 @@ static int __netconfig_p2p_firmware_start(void) if (rv < 0) return -EIO; - rv = netconfig_interface_up(WLAN_IFACE_NAME); - if (rv != TRUE) - return -EIO; - #if defined TIZEN_WLAN_USE_P2P_INTERFACE rv = netconfig_interface_up(WLAN_P2P_IFACE_NAME); if (rv != TRUE) @@ -102,14 +105,13 @@ static int __netconfig_p2p_firmware_start(void) DBG("Successfully loaded p2p device driver"); return 0; -#else - return -ENODEV; -#endif } static int __netconfig_p2p_firmware_stop(void) { -#if defined TIZEN_P2P_ENABLE + if (!netconfig_check_feature_supported(NETCONFIG_SUPPORTED_FEATURE_WIFI_DIRECT)) + return -ENODEV; + int rv = 0; const char *path = WLAN_DRIVER_SCRIPT; char *const args[] = { "/usr/bin/wlan.sh", "stop", NULL }; @@ -125,14 +127,13 @@ static int __netconfig_p2p_firmware_stop(void) DBG("Successfully removed p2p device driver"); return 0; -#else - return -ENODEV; -#endif } static int __netconfig_softap_firmware_start(void) { -#if defined TIZEN_TETHERING_ENABLE + if (!netconfig_check_feature_supported(NETCONFIG_SUPPORTED_FEATURE_TETHERING)) + return -ENODEV; + int rv = 0; const char *path = WLAN_DRIVER_SCRIPT; char *const args[] = { "/usr/bin/wlan.sh", "softap", NULL }; @@ -147,14 +148,13 @@ static int __netconfig_softap_firmware_start(void) DBG("Successfully loaded softap device driver"); return 0; -#else - return -ENODEV; -#endif } static int __netconfig_softap_firmware_stop(void) { -#if defined TIZEN_TETHERING_ENABLE + if (!netconfig_check_feature_supported(NETCONFIG_SUPPORTED_FEATURE_TETHERING)) + return -ENODEV; + int rv = 0; const char *path = WLAN_DRIVER_SCRIPT; char *const args[] = { "/usr/bin/wlan.sh", "stop", NULL }; @@ -170,14 +170,11 @@ static int __netconfig_softap_firmware_stop(void) DBG("Successfully removed softap device driver"); return 0; -#else - return -ENODEV; -#endif } static int __netconfig_wifi_firmware_start(enum netconfig_wifi_firmware type) { - if (netconfig_emulator_is_emulated() == TRUE) + if (emulator_is_emulated() == TRUE) return -EIO; switch (type) { @@ -196,7 +193,7 @@ static int __netconfig_wifi_firmware_start(enum netconfig_wifi_firmware type) static int __netconfig_wifi_firmware_stop(enum netconfig_wifi_firmware type) { - if (netconfig_emulator_is_emulated() == TRUE) + if (emulator_is_emulated() == TRUE) return -EIO; switch (type) { @@ -213,19 +210,75 @@ static int __netconfig_wifi_firmware_stop(enum netconfig_wifi_firmware type) return -ENXIO; } +static int __netconfig_set_rps_cpus(void) +{ + int fd, i; + ssize_t count; + char t_buf[TEMP_BUFFER_LEN]; + char r_buf[TEMP_BUFFER_LEN]; + + if (access(WIFI_MAC_ADD_PATH, F_OK) != 0) { + DBG("WiFi driver is not loaded... "); + return -1; + } else { + DBG("WiFi driver loaded... "); + } + + for (i = 0; i < QUAD_CPUS_COUNT; i++) { + snprintf(t_buf, TEMP_BUFFER_LEN, "/sys/class/net/wlan0/queues/rx-%d/rps_cpus", i); + DBG("Command : [%s]", t_buf); + fd = open(t_buf, O_RDWR | O_CLOEXEC); + + if (fd < 0) { + DBG("failed to open rps file"); + return -1; + } else { + count = read(fd, r_buf, 1); + + if (count < 0) { + DBG("read failed"); + close(fd); + return -1; + } else { + DBG("read size = %d", count); + } + + if (r_buf[0] == 'e') { + close(fd); + continue; + } else { + DBG("e is already written"); + } + + if (lseek(fd, 0, SEEK_SET) < 0) { + DBG("lseek failed"); + close(fd); + return -1; + } + + count = write(fd, "e", 1); + + if (count < 0) { + DBG("write failed"); + close(fd); + return -1; + } else { + DBG("write size = %d", count); + } + + close(fd); + } + } + + return 0; +} + int netconfig_wifi_firmware(enum netconfig_wifi_firmware type, gboolean enable) { int err; static enum netconfig_wifi_firmware current_driver = NETCONFIG_WIFI_OFF; enum netconfig_wifi_firmware alias = type; -#if defined WLAN_CONCURRENT_MODE - int flight_mode = 0; - - if (type == NETCONFIG_WIFI_P2P) - alias = NETCONFIG_WIFI_STA; -#endif - DBG("Wi-Fi current firmware %d (type: %d %s)", current_driver, type, enable == TRUE ? "enable" : "disable"); @@ -233,34 +286,7 @@ int netconfig_wifi_firmware(enum netconfig_wifi_firmware type, gboolean enable) if (current_driver == NETCONFIG_WIFI_OFF) { return -EALREADY; } else if (current_driver == alias) { -#if defined WLAN_CHECK_POWERSAVE - if (type == NETCONFIG_WIFI_STA && - netconfig_wifi_is_powersave_mode() == TRUE) { - netconfig_interface_down(WIFI_IFNAME); - - return -EALREADY; - } -#endif - -#if defined WLAN_CONCURRENT_MODE -#if defined TIZEN_TELEPHONY_ENABLE - vconf_get_bool(VCONFKEY_TELEPHONY_FLIGHT_MODE, &flight_mode); -#endif - if (flight_mode == 0 && type == NETCONFIG_WIFI_STA && - netconfig_is_wifi_direct_on() == TRUE) { - netconfig_interface_down(WIFI_IFNAME); - - return -EALREADY; - } - if (type == NETCONFIG_WIFI_P2P && - netconfig_wifi_state_get_technology_state() > - NETCONFIG_WIFI_TECH_OFF) { - netconfig_interface_down(WLAN_P2P_IFACE_NAME); - - return -EALREADY; - } -#endif err = __netconfig_wifi_firmware_stop(type); if (err < 0 && err != -EALREADY) return err; @@ -274,26 +300,8 @@ int netconfig_wifi_firmware(enum netconfig_wifi_firmware type, gboolean enable) } if (current_driver > NETCONFIG_WIFI_OFF) { - if (current_driver == alias) { -#if defined WLAN_CHECK_POWERSAVE - if (type == NETCONFIG_WIFI_STA && - netconfig_wifi_is_powersave_mode() == TRUE) { - netconfig_interface_up(WIFI_IFNAME); - - return -EALREADY; - } -#endif - -#if defined WLAN_CONCURRENT_MODE - if (type == NETCONFIG_WIFI_STA) - netconfig_interface_up(WIFI_IFNAME); -#if defined TIZEN_P2P_ENABLE - else if (type == NETCONFIG_WIFI_P2P) - netconfig_interface_up(WLAN_P2P_IFACE_NAME); -#endif -#endif + if (current_driver == alias) return -EALREADY; - } return -EIO; } @@ -304,6 +312,9 @@ int netconfig_wifi_firmware(enum netconfig_wifi_firmware type, gboolean enable) else current_driver = alias; + if (__netconfig_set_rps_cpus() < 0) + DBG("Failed to set rps_cpus"); + return err; } @@ -311,7 +322,7 @@ gboolean handle_start(WifiFirmware *firmware, GDBusMethodInvocation *context, co { int err; - g_return_val_if_fail(firmware != NULL, FALSE); + g_return_val_if_fail(firmware != NULL, TRUE); DBG("Wi-Fi firmware start %s", device != NULL ? device : "null"); @@ -325,11 +336,16 @@ gboolean handle_start(WifiFirmware *firmware, GDBusMethodInvocation *context, co if (err < 0) { if (err == -EALREADY) netconfig_error_already_exists(context); - else + else if (g_strcmp0("softap", device) == 0 && err == -EIO && netconfig_is_wifi_direct_on() == FALSE) { + if (netconfig_wifi_firmware(NETCONFIG_WIFI_P2P, FALSE) == 0 && netconfig_wifi_firmware(NETCONFIG_WIFI_SOFTAP, TRUE) == 0) { + wifi_firmware_complete_start(firmware, context); + return TRUE; + } else + netconfig_error_wifi_driver_failed(context); + } else netconfig_error_wifi_driver_failed(context); - wifi_firmware_complete_start(firmware, context); - return FALSE; + return TRUE; } wifi_firmware_complete_start(firmware, context); @@ -340,7 +356,7 @@ gboolean handle_stop(WifiFirmware *firmware, GDBusMethodInvocation *context, con { int err; - g_return_val_if_fail(firmware != NULL, FALSE); + g_return_val_if_fail(firmware != NULL, TRUE); DBG("Wi-Fi firmware stop %s", device != NULL ? device : "null"); @@ -357,10 +373,9 @@ gboolean handle_stop(WifiFirmware *firmware, GDBusMethodInvocation *context, con else netconfig_error_wifi_driver_failed(context); - wifi_firmware_complete_start(firmware, context); - return FALSE; + return TRUE; } - wifi_firmware_complete_start(firmware, context); + wifi_firmware_complete_stop(firmware, context); return TRUE; }