@@ -1048,9 +1048,11 @@ static void iwl_bg_restart(struct work_struct *data)
1048
1048
*
1049
1049
*****************************************************************************/
1050
1050
1051
- static void iwl_setup_deferred_work (struct iwl_priv * priv )
1051
+ static int iwl_setup_deferred_work (struct iwl_priv * priv )
1052
1052
{
1053
1053
priv -> workqueue = alloc_ordered_workqueue (DRV_NAME , 0 );
1054
+ if (!priv -> workqueue )
1055
+ return - ENOMEM ;
1054
1056
1055
1057
INIT_WORK (& priv -> restart , iwl_bg_restart );
1056
1058
INIT_WORK (& priv -> beacon_update , iwl_bg_beacon_update );
@@ -1067,6 +1069,8 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv)
1067
1069
timer_setup (& priv -> statistics_periodic , iwl_bg_statistics_periodic , 0 );
1068
1070
1069
1071
timer_setup (& priv -> ucode_trace , iwl_bg_ucode_trace , 0 );
1072
+
1073
+ return 0 ;
1070
1074
}
1071
1075
1072
1076
void iwl_cancel_deferred_work (struct iwl_priv * priv )
@@ -1456,7 +1460,9 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1456
1460
/********************
1457
1461
* 6. Setup services
1458
1462
********************/
1459
- iwl_setup_deferred_work (priv );
1463
+ if (iwl_setup_deferred_work (priv ))
1464
+ goto out_uninit_drv ;
1465
+
1460
1466
iwl_setup_rx_handlers (priv );
1461
1467
1462
1468
iwl_power_initialize (priv );
@@ -1494,6 +1500,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
1494
1500
iwl_cancel_deferred_work (priv );
1495
1501
destroy_workqueue (priv -> workqueue );
1496
1502
priv -> workqueue = NULL ;
1503
+ out_uninit_drv :
1497
1504
iwl_uninit_drv (priv );
1498
1505
out_free_eeprom_blob :
1499
1506
kfree (priv -> eeprom_blob );
0 commit comments