mwifiex: optimize driver initialization code
[pandora-kernel.git] / drivers / net / wireless / mwifiex / main.c
index 2c376dd..c597188 100644 (file)
@@ -40,14 +40,10 @@ static char fw_name[32] = DEFAULT_FW_NAME;
 /* Supported drv_mode table */
 static struct mwifiex_drv_mode mwifiex_drv_mode_tbl[] = {
        {
-        /* drv_mode */
-        .drv_mode = DRV_MODE_STA,
-        /* intf number */
-        .intf_num = ARRAY_SIZE(mwifiex_bss_sta),
-        /* bss_attr */
-        .bss_attr = mwifiex_bss_sta,
-        }
-       ,
+               .drv_mode = DRV_MODE_STA,
+               .intf_num = ARRAY_SIZE(mwifiex_bss_sta),
+               .bss_attr = mwifiex_bss_sta,
+       },
 };
 
 /*
@@ -66,13 +62,12 @@ static struct mwifiex_drv_mode mwifiex_drv_mode_tbl[] = {
  * proper cleanup before exiting.
  */
 static int mwifiex_register(void *card, struct mwifiex_if_ops *if_ops,
-                           struct mwifiex_device *mdevice, void **padapter)
+                           struct mwifiex_drv_mode *drv_mode_ptr)
 {
-       struct mwifiex_adapter *adapter = NULL;
-       u8 i = 0;
+       struct mwifiex_adapter *adapter;
+       int i;
 
        adapter = kzalloc(sizeof(struct mwifiex_adapter), GFP_KERNEL);
-       /* Allocate memory for adapter structure */
        if (!adapter)
                return -1;
 
@@ -87,14 +82,13 @@ static int mwifiex_register(void *card, struct mwifiex_if_ops *if_ops,
                goto error;
 
        adapter->priv_num = 0;
-       for (i = 0; i < MWIFIEX_MAX_BSS_NUM; i++) {
+       for (i = 0; i < drv_mode_ptr->intf_num; i++) {
                adapter->priv[i] = NULL;
 
-               if (!mdevice->bss_attr[i].active)
+               if (!drv_mode_ptr->bss_attr[i].active)
                        continue;
 
-               /* For valid bss_attr,
-                  allocate memory for private structure */
+               /* Allocate memory for private structure */
                adapter->priv[i] = kzalloc(sizeof(struct mwifiex_private),
                                GFP_KERNEL);
                if (!adapter->priv[i]) {
@@ -104,26 +98,26 @@ static int mwifiex_register(void *card, struct mwifiex_if_ops *if_ops,
                }
 
                adapter->priv_num++;
-               memset(adapter->priv[i], 0,
-                      sizeof(struct mwifiex_private));
                adapter->priv[i]->adapter = adapter;
                /* Save bss_type, frame_type & bss_priority */
-               adapter->priv[i]->bss_type = (u8) mdevice->bss_attr[i].bss_type;
+               adapter->priv[i]->bss_type = drv_mode_ptr->bss_attr[i].bss_type;
                adapter->priv[i]->frame_type =
-                       (u8) mdevice->bss_attr[i].frame_type;
+                                       drv_mode_ptr->bss_attr[i].frame_type;
                adapter->priv[i]->bss_priority =
-                       (u8) mdevice->bss_attr[i].bss_priority;
-               if (mdevice->bss_attr[i].bss_type == MWIFIEX_BSS_TYPE_STA)
+                                       drv_mode_ptr->bss_attr[i].bss_priority;
+
+               if (drv_mode_ptr->bss_attr[i].bss_type == MWIFIEX_BSS_TYPE_STA)
                        adapter->priv[i]->bss_role = MWIFIEX_BSS_ROLE_STA;
-               else if (mdevice->bss_attr[i].bss_type == MWIFIEX_BSS_TYPE_UAP)
+               else if (drv_mode_ptr->bss_attr[i].bss_type ==
+                                                       MWIFIEX_BSS_TYPE_UAP)
                        adapter->priv[i]->bss_role = MWIFIEX_BSS_ROLE_UAP;
 
                /* Save bss_index & bss_num */
                adapter->priv[i]->bss_index = i;
-               adapter->priv[i]->bss_num = mdevice->bss_attr[i].bss_num;
+               adapter->priv[i]->bss_num = drv_mode_ptr->bss_attr[i].bss_num;
        }
+       adapter->drv_mode = drv_mode_ptr;
 
-       /* Initialize lock variables */
        if (mwifiex_init_lock_list(adapter))
                goto error;
 
@@ -131,16 +125,13 @@ static int mwifiex_register(void *card, struct mwifiex_if_ops *if_ops,
        adapter->cmd_timer.function = mwifiex_cmd_timeout_func;
        adapter->cmd_timer.data = (unsigned long) adapter;
 
-       /* Return pointer of struct mwifiex_adapter */
-       *padapter = adapter;
        return 0;
 
 error:
        dev_dbg(adapter->dev, "info: leave mwifiex_register with error\n");
 
-       /* Free lock variables */
        mwifiex_free_lock_list(adapter);
-       for (i = 0; i < MWIFIEX_MAX_BSS_NUM; i++)
+       for (i = 0; i < drv_mode_ptr->intf_num; i++)
                kfree(adapter->priv[i]);
        kfree(adapter);
 
@@ -335,10 +326,9 @@ exit_main_proc:
  * and initializing the private structures.
  */
 static int
-mwifiex_init_sw(void *card, struct mwifiex_if_ops *if_ops, void **pmwifiex)
+mwifiex_init_sw(void *card, struct mwifiex_if_ops *if_ops)
 {
        int i;
-       struct mwifiex_device device;
        struct mwifiex_drv_mode *drv_mode_ptr;
 
        /* find mwifiex_drv_mode entry from mwifiex_drv_mode_tbl */
@@ -355,20 +345,7 @@ mwifiex_init_sw(void *card, struct mwifiex_if_ops *if_ops, void **pmwifiex)
                return -1;
        }
 
-       memset(&device, 0, sizeof(struct mwifiex_device));
-
-       for (i = 0; i < drv_mode_ptr->intf_num; i++) {
-               device.bss_attr[i].bss_type =
-                       drv_mode_ptr->bss_attr[i].bss_type;
-               device.bss_attr[i].frame_type =
-                       drv_mode_ptr->bss_attr[i].frame_type;
-               device.bss_attr[i].active = drv_mode_ptr->bss_attr[i].active;
-               device.bss_attr[i].bss_priority =
-                       drv_mode_ptr->bss_attr[i].bss_priority;
-               device.bss_attr[i].bss_num = drv_mode_ptr->bss_attr[i].bss_num;
-       }
-
-       if (mwifiex_register(card, if_ops, &device, pmwifiex))
+       if (mwifiex_register(card, if_ops, drv_mode_ptr))
                return -1;
 
        return 0;
@@ -892,21 +869,19 @@ mwifiex_add_card(void *card, struct semaphore *sem,
                 struct mwifiex_if_ops *if_ops)
 {
        int i;
-       struct mwifiex_adapter *adapter = NULL;
-       struct mwifiex_drv_mode *drv_mode_info = &mwifiex_drv_mode_tbl[0];
+       struct mwifiex_adapter *adapter;
 
        if (down_interruptible(sem))
                goto exit_sem_err;
 
-       if (mwifiex_init_sw(card, if_ops, (void **) &adapter)) {
+       if (mwifiex_init_sw(card, if_ops)) {
                pr_err("%s: software init failed\n", __func__);
                goto err_init_sw;
        }
 
-       adapter->drv_mode = drv_mode_info;
+       adapter = g_adapter;
 
        adapter->hw_status = MWIFIEX_HW_STATUS_INITIALIZING;
-       /* PnP and power profile */
        adapter->surprise_removed = false;
        init_waitqueue_head(&adapter->init_wait_q);
        adapter->is_suspended = false;
@@ -917,7 +892,6 @@ mwifiex_add_card(void *card, struct semaphore *sem,
        adapter->cmd_wait_q.condition = false;
        adapter->cmd_wait_q.status = 0;
 
-       /* Create workqueue */
        adapter->workqueue = create_workqueue("MWIFIEX_WORK_QUEUE");
        if (!adapter->workqueue)
                goto err_kmalloc;
@@ -931,13 +905,13 @@ mwifiex_add_card(void *card, struct semaphore *sem,
                goto err_registerdev;
        }
 
-       /* Init FW and HW */
        if (mwifiex_init_hw_fw(adapter)) {
                pr_err("%s: firmware init failed\n", __func__);
                goto err_init_fw;
        }
+
        /* Add interfaces */
-       for (i = 0; i < drv_mode_info->intf_num; i++) {
+       for (i = 0; i < adapter->drv_mode->intf_num; i++) {
                if (!mwifiex_add_interface(adapter, i,
                                adapter->drv_mode->bss_attr[i].bss_type)) {
                        goto err_add_intf;
@@ -952,7 +926,6 @@ err_add_intf:
        for (i = 0; i < adapter->priv_num; i++)
                mwifiex_remove_interface(adapter, i);
 err_init_fw:
-       /* Unregister device */
        pr_debug("info: %s: unregister device\n", __func__);
        adapter->if_ops.unregister_dev(adapter);
 err_registerdev: