#define TEMP_BUFFER_LEN 100
#define WIFI_MAC_ADD_PATH "/sys/class/net/wlan0/address"
+typedef struct {
+ char *interface_name;
+ enum netconfig_wifi_firmware type;
+} wifi_driver_s;
+
+static GSList *wifi_driver_list;
+
+static void __netconfig_wifi_driver_free(gpointer data)
+{
+ wifi_driver_s *driver = (wifi_driver_s *) data;
+
+ DBG("Remove wifi driver [%d:%s]", driver->type, driver->interface_name);
+
+ g_free(driver->interface_name);
+ g_free(driver);
+}
+
+static gint __netconfig_cmp_wifi_driver(gconstpointer a, gconstpointer b)
+{
+ wifi_driver_s *drv_a = (wifi_driver_s *)a;
+ wifi_driver_s *drv_b = (wifi_driver_s *)b;
+
+ if (g_strcmp0(drv_a->interface_name, drv_b->interface_name))
+ return -1;
+
+ return 0;
+}
+
+static GSList * __netconfig_is_wifi_driver_in_list(
+ enum netconfig_wifi_firmware type, const char *interface_name)
+{
+ wifi_driver_s driver = { .type = type, .interface_name = (char *)interface_name };
+ GSList *found = g_slist_find_custom(wifi_driver_list, &driver,
+ __netconfig_cmp_wifi_driver);
+
+ return found;
+}
+
+static gboolean __netconfig_add_wifi_driver_to_list(
+ enum netconfig_wifi_firmware type, const char *interface_name)
+{
+ GSList *found;
+ wifi_driver_s *driver;
+
+ found = __netconfig_is_wifi_driver_in_list(type, interface_name);
+ if (found)
+ return FALSE;
+
+ driver = g_try_new0(wifi_driver_s, 1);
+ if (!driver) {
+ ERR("g_try_new0 failed!!!");
+ return FALSE;
+ }
+
+ driver->interface_name = g_strdup(interface_name);
+ if (!driver->interface_name) {
+ ERR("g_strdup failed!!!");
+ g_free(driver);
+ return FALSE;
+ }
+
+ driver->type = type;
+
+ wifi_driver_list = g_slist_prepend(wifi_driver_list, driver);
+ return TRUE;
+}
+
+static gboolean __netconfig_remove_wifi_driver_from_list(
+ enum netconfig_wifi_firmware type, const char *interface_name)
+{
+ GSList *found;
+
+ found = __netconfig_is_wifi_driver_in_list(type, interface_name);
+ if (!found)
+ return FALSE;
+
+ __netconfig_wifi_driver_free(found->data);
+ wifi_driver_list = g_slist_delete_link(wifi_driver_list, found);
+
+ return TRUE;
+}
+
static int __netconfig_sta_firmware_start(const char *interface_name)
{
int rv = 0;
const char *interface_name, gboolean enable)
{
int err;
- static enum netconfig_wifi_firmware current_driver = NETCONFIG_WIFI_OFF;
- enum netconfig_wifi_firmware alias = type;
- DBG("Wi-Fi current firmware %d (type: %d %s)", current_driver, type,
- enable == TRUE ? "enable" : "disable");
+ DBG("Wi-Fi firmware (type: %d %s) for %s", type, enable == TRUE ? "enable" : "disable",
+ interface_name ? interface_name : "");
+
+ GSList *found = __netconfig_is_wifi_driver_in_list(type, interface_name);
if (enable == FALSE) {
- if (current_driver == NETCONFIG_WIFI_OFF) {
+ wifi_driver_s *driver;
+
+ if (!found)
return -EALREADY;
- } else if (current_driver == alias) {
- err = __netconfig_wifi_firmware_stop(type, interface_name);
- if (err < 0 && err != -EALREADY)
- return err;
+ driver = (wifi_driver_s *) found->data;
- current_driver = NETCONFIG_WIFI_OFF;
+ if (type != driver->type)
+ return -EIO;
+ err = __netconfig_wifi_firmware_stop(type, interface_name);
+ if (err < 0 && err != -EALREADY)
return err;
- }
- return -EIO;
+ __netconfig_remove_wifi_driver_from_list(type, interface_name);
+
+ return err;
}
- if (current_driver > NETCONFIG_WIFI_OFF) {
- if (current_driver == alias)
+ if (found) {
+ wifi_driver_s *driver = (wifi_driver_s *) found->data;
+
+ DBG("Wi-Fi interface (%s) already in use", interface_name);
+
+ if (type == driver->type)
return -EALREADY;
return -EIO;
if (err < 0)
DBG("Failed to execute script file");
else
- current_driver = alias;
+ __netconfig_add_wifi_driver_to_list(type, interface_name);
if (__netconfig_set_rps_cpus(interface_name) < 0)
DBG("Failed to set rps_cpus");