From 88a062f74b504202f65b636c6d0332629639958f Mon Sep 17 00:00:00 2001 From: Mayank Haarit Date: Mon, 21 May 2018 18:23:36 +0530 Subject: [PATCH] Set the RPS configuration on Wi-Fi activate. This patch enable RPS (Received packet steering) and specific CPUs to process the packet for the receive queues of the wlan0 interface. Change-Id: Ide73358ac99f49eb2c7254fe1a7026f491e58cfd Signed-off-by: Mayank Haarit --- src/wifi-firmware.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/src/wifi-firmware.c b/src/wifi-firmware.c index 2195913..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" @@ -36,6 +38,9 @@ #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) { @@ -205,6 +210,69 @@ 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; @@ -244,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; } -- 2.7.4