aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Weinberger <richard@nod.at>2014-03-20 19:42:54 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-04-15 14:39:09 -0400
commit29d1e7209e1866a1b6b686107cce9f5a9b886a53 (patch)
treecb1c0bc67dad329586550cbf97d3e88113eea018
parentc9eaa447e77efe77b7fa4c953bd62de8297fd6c5 (diff)
staging/rtl8821ae: Fix OOM handling in _rtl_init_deferred_work()
alloc_workqueue() can fail, handle this case. Signed-off-by: Richard Weinberger <richard@nod.at> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/staging/rtl8821ae/base.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/staging/rtl8821ae/base.c b/drivers/staging/rtl8821ae/base.c
index e5073fe24770..a4c9cc437bc6 100644
--- a/drivers/staging/rtl8821ae/base.c
+++ b/drivers/staging/rtl8821ae/base.c
@@ -388,7 +388,7 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
388 388
389} 389}
390 390
391static void _rtl_init_deferred_work(struct ieee80211_hw *hw) 391static int _rtl_init_deferred_work(struct ieee80211_hw *hw)
392{ 392{
393 struct rtl_priv *rtlpriv = rtl_priv(hw); 393 struct rtl_priv *rtlpriv = rtl_priv(hw);
394 394
@@ -410,6 +410,9 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
410 rtlpriv->works.rtl_wq = create_workqueue(rtlpriv->cfg->name); 410 rtlpriv->works.rtl_wq = create_workqueue(rtlpriv->cfg->name);
411#endif 411#endif
412/*<delete in kernel end>*/ 412/*<delete in kernel end>*/
413 if (!rtlpriv->works.rtl_wq)
414 return -ENOMEM;
415
413 INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq, 416 INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq,
414 (void *)rtl_watchdog_wq_callback); 417 (void *)rtl_watchdog_wq_callback);
415 INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq, 418 INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq,
@@ -421,6 +424,8 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
421 INIT_DELAYED_WORK(&rtlpriv->works.fwevt_wq, 424 INIT_DELAYED_WORK(&rtlpriv->works.fwevt_wq,
422 (void *)rtl_fwevt_wq_callback); 425 (void *)rtl_fwevt_wq_callback);
423 426
427 return 0;
428
424} 429}
425 430
426void rtl_deinit_deferred_work(struct ieee80211_hw *hw) 431void rtl_deinit_deferred_work(struct ieee80211_hw *hw)
@@ -519,7 +524,8 @@ int rtl_init_core(struct ieee80211_hw *hw)
519 INIT_LIST_HEAD(&rtlpriv->entry_list); 524 INIT_LIST_HEAD(&rtlpriv->entry_list);
520 525
521 /* <6> init deferred work */ 526 /* <6> init deferred work */
522 _rtl_init_deferred_work(hw); 527 if (_rtl_init_deferred_work(hw))
528 return 1;
523 529
524 /* <7> */ 530 /* <7> */
525#ifdef VIF_TODO 531#ifdef VIF_TODO