2 * Network Configuration Module
4 * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
22 #include <vconf-keys.h>
31 #include "netsupplicant.h"
32 #include "wifi-firmware.h"
33 #include "network-statistics.h"
35 #define WLAN_DRIVER_SCRIPT "/usr/bin/wlan.sh"
36 #define WLAN_IFACE_NAME "wlan0"
38 #define WLAN_P2P_IFACE_NAME_TV "p2p0"
39 #define WLAN_P2P_IFACE_NAME_COMMON "wlan0"
40 #define WLAN_P2P_IFACE_NAME ((TIZEN_TV) ? (WLAN_P2P_IFACE_NAME_TV) : (WLAN_P2P_IFACE_NAME_COMMON))
41 #define QUAD_CPUS_COUNT 4
42 #define TEMP_BUFFER_LEN 100
43 #define WIFI_MAC_ADD_PATH "/sys/class/net/wlan0/address"
45 static int __netconfig_sta_firmware_start(void)
48 const char *path = WLAN_DRIVER_SCRIPT;
49 char *const args[] = { "/usr/bin/wlan.sh", "start", NULL };
50 char *const envs[] = { NULL };
52 rv = netconfig_execute_file(path, args, envs);
56 rv = netconfig_interface_up(WLAN_IFACE_NAME);
60 DBG("Successfully loaded wireless device driver");
64 static int __netconfig_sta_firmware_stop(void)
67 const char *path = WLAN_DRIVER_SCRIPT;
68 char *const args[] = { "/usr/bin/wlan.sh", "stop", NULL };
69 char *const envs[] = { NULL };
71 /* Update statistics before driver remove */
72 netconfig_wifi_statistics_update_powered_off();
74 rv = netconfig_interface_down(WLAN_IFACE_NAME);
78 rv = netconfig_execute_file(path, args, envs);
82 DBG("Successfully removed wireless device driver");
86 static int __netconfig_p2p_firmware_start(void)
88 if (!netconfig_check_feature_supported(NETCONFIG_SUPPORTED_FEATURE_WIFI_DIRECT))
92 const char *path = WLAN_DRIVER_SCRIPT;
93 char *const args[] = { "/usr/bin/wlan.sh", "p2p", NULL };
94 char *const envs[] = { NULL };
96 rv = netconfig_execute_file(path, args, envs);
100 #if defined TIZEN_WLAN_USE_P2P_INTERFACE
101 rv = netconfig_interface_up(WLAN_P2P_IFACE_NAME);
106 DBG("Successfully loaded p2p device driver");
110 static int __netconfig_p2p_firmware_stop(void)
112 if (!netconfig_check_feature_supported(NETCONFIG_SUPPORTED_FEATURE_WIFI_DIRECT))
116 const char *path = WLAN_DRIVER_SCRIPT;
117 char *const args[] = { "/usr/bin/wlan.sh", "stop", NULL };
118 char *const envs[] = { NULL };
120 rv = netconfig_interface_down(WLAN_IFACE_NAME);
124 rv = netconfig_execute_file(path, args, envs);
128 DBG("Successfully removed p2p device driver");
132 static int __netconfig_softap_firmware_start(void)
134 if (!netconfig_check_feature_supported(NETCONFIG_SUPPORTED_FEATURE_TETHERING)
135 && !netconfig_check_feature_supported(NETCONFIG_SUPPORTED_FEATURE_WIFI_SOFTAP))
139 const char *path = WLAN_DRIVER_SCRIPT;
140 char *const args[] = { "/usr/bin/wlan.sh", "softap", NULL };
141 char *const envs[] = { NULL };
143 rv = netconfig_execute_file(path, args, envs);
147 if (netconfig_interface_up(WLAN_IFACE_NAME) == FALSE)
150 DBG("Successfully loaded softap device driver");
154 static int __netconfig_softap_firmware_stop(void)
156 if (!netconfig_check_feature_supported(NETCONFIG_SUPPORTED_FEATURE_TETHERING)
157 && !netconfig_check_feature_supported(NETCONFIG_SUPPORTED_FEATURE_WIFI_SOFTAP))
161 const char *path = WLAN_DRIVER_SCRIPT;
162 char *const args[] = { "/usr/bin/wlan.sh", "stop", NULL };
163 char *const envs[] = { NULL };
165 rv = netconfig_interface_down(WLAN_IFACE_NAME);
169 rv = netconfig_execute_file(path, args, envs);
173 DBG("Successfully removed softap device driver");
177 static int __netconfig_wifi_firmware_start(enum netconfig_wifi_firmware type)
179 if (emulator_is_emulated() == TRUE)
183 case NETCONFIG_WIFI_STA:
184 return __netconfig_sta_firmware_start();
185 case NETCONFIG_WIFI_P2P:
186 return __netconfig_p2p_firmware_start();
187 case NETCONFIG_WIFI_SOFTAP:
188 return __netconfig_softap_firmware_start();
196 static int __netconfig_wifi_firmware_stop(enum netconfig_wifi_firmware type)
198 if (emulator_is_emulated() == TRUE)
202 case NETCONFIG_WIFI_STA:
203 return __netconfig_sta_firmware_stop();
204 case NETCONFIG_WIFI_P2P:
205 return __netconfig_p2p_firmware_stop();
206 case NETCONFIG_WIFI_SOFTAP:
207 return __netconfig_softap_firmware_stop();
215 static int __netconfig_set_rps_cpus(void)
219 char t_buf[TEMP_BUFFER_LEN];
220 char r_buf[TEMP_BUFFER_LEN];
222 if (access(WIFI_MAC_ADD_PATH, F_OK) != 0) {
223 DBG("WiFi driver is not loaded... ");
226 DBG("WiFi driver loaded... ");
229 snprintf(t_buf, TEMP_BUFFER_LEN, "/sys/class/net/wlan0/queues/rx-0/rps_cpus");
230 DBG("Command : [%s]", t_buf);
233 while ((fd = open(t_buf, O_RDWR | O_CLOEXEC)) >= 0) {
235 count = read(fd, r_buf, 1);
242 DBG("read size = %d", count);
245 if (r_buf[0] == 'e') {
247 DBG("e is already written");
248 snprintf(t_buf, TEMP_BUFFER_LEN, "/sys/class/net/wlan0/queues/rx-%d/rps_cpus", curr);
249 DBG("Command : [%s]", t_buf);
255 if (lseek(fd, 0, SEEK_SET) < 0) {
261 count = write(fd, "e", 1);
268 DBG("write size = %d", count);
272 snprintf(t_buf, TEMP_BUFFER_LEN, "/sys/class/net/wlan0/queues/rx-%d/rps_cpus", curr);
273 DBG("Command : [%s]", t_buf);
279 int netconfig_wifi_firmware(enum netconfig_wifi_firmware type, gboolean enable)
282 static enum netconfig_wifi_firmware current_driver = NETCONFIG_WIFI_OFF;
283 enum netconfig_wifi_firmware alias = type;
285 DBG("Wi-Fi current firmware %d (type: %d %s)", current_driver, type,
286 enable == TRUE ? "enable" : "disable");
288 if (enable == FALSE) {
289 if (current_driver == NETCONFIG_WIFI_OFF) {
291 } else if (current_driver == alias) {
293 err = __netconfig_wifi_firmware_stop(type);
294 if (err < 0 && err != -EALREADY)
297 current_driver = NETCONFIG_WIFI_OFF;
305 if (current_driver > NETCONFIG_WIFI_OFF) {
306 if (current_driver == alias)
312 err = __netconfig_wifi_firmware_start(type);
314 DBG("Failed to execute script file");
316 current_driver = alias;
318 if (__netconfig_set_rps_cpus() < 0)
319 DBG("Failed to set rps_cpus");
324 gboolean handle_start(WifiFirmware *firmware, GDBusMethodInvocation *context, const gchar *device)
328 g_return_val_if_fail(firmware != NULL, TRUE);
330 DBG("Wi-Fi firmware start %s", device != NULL ? device : "null");
332 if (g_strcmp0("p2p", device) == 0)
333 err = netconfig_wifi_firmware(NETCONFIG_WIFI_P2P, TRUE);
334 else if (g_strcmp0("softap", device) == 0)
335 err = netconfig_wifi_firmware(NETCONFIG_WIFI_SOFTAP, TRUE);
340 if (err == -EALREADY)
341 netconfig_error_already_exists(context);
342 else if (g_strcmp0("softap", device) == 0 && err == -EIO && netconfig_is_wifi_direct_on() == FALSE) {
343 if (netconfig_wifi_firmware(NETCONFIG_WIFI_P2P, FALSE) == 0 && netconfig_wifi_firmware(NETCONFIG_WIFI_SOFTAP, TRUE) == 0) {
344 wifi_firmware_complete_start(firmware, context);
347 netconfig_error_wifi_driver_failed(context);
349 netconfig_error_wifi_driver_failed(context);
354 wifi_firmware_complete_start(firmware, context);
358 gboolean handle_stop(WifiFirmware *firmware, GDBusMethodInvocation *context, const gchar *device)
362 g_return_val_if_fail(firmware != NULL, TRUE);
364 DBG("Wi-Fi firmware stop %s", device != NULL ? device : "null");
366 if (g_strcmp0("p2p", device) == 0)
367 err = netconfig_wifi_firmware(NETCONFIG_WIFI_P2P, FALSE);
368 else if (g_strcmp0("softap", device) == 0)
369 err = netconfig_wifi_firmware(NETCONFIG_WIFI_SOFTAP, FALSE);
374 if (err == -EALREADY)
375 netconfig_error_already_exists(context);
377 netconfig_error_wifi_driver_failed(context);
382 wifi_firmware_complete_stop(firmware, context);