• Sebastian Andrzej Siewior's avatar
    rtlwifi: Remove in_interrupt() usage in halbtc_send_bt_mp_operation() · 50c61ae1
    Sebastian Andrzej Siewior authored
    halbtc_send_bt_mp_operation() uses in_interrupt() to determine if it is
    safe to invoke wait_for_completion().
    
    The usage of in_interrupt() in drivers is phased out and Linus clearly
    requested that code which changes behaviour depending on context should
    either be separated or the context be conveyed in an argument passed by the
    caller, which usually knows the context.
    
    Aside of that in_interrupt() is not correct as it does not catch preempt
    disabled regions which neither can sleep.
    
    halbtc_send_bt_mp_operation() is called from:
    
     rtl_watchdog_wq_callback()
       rtl_btc_periodical()
         halbtc_get()
           case BTC_GET_U4_BT_PATCH_VER:
             halbtc_get_bt_patch_version()
    
     which is preemtible context.
    
       rtl_c2h_content_parsing()
         btc_ops->btc_btinfo_notify()
           rtl_btc_btinfo_notify()
             exhalbtc_bt_info_notify()
               ex_btc8723b1ant_bt_info_notify()
    	   ex_btc8821a1ant_bt_info_notify()
    	   ex_btc8821a2ant_bt_info_notify()
                 btcoexist->btc_set_bt_reg()
                   halbtc_set_bt_reg()
    
       rtl_c2h_content_parsing() is in turn called from:
    
       rtl_c2hcmd_wq_callback()
         rtl_c2hcmd_launcher()
    
       which is preemptible context and from:
    
       _rtl_pci_rx_interrupt
         rtl_c2hcmd_enqueue()
    
       which is obviously not preemptible but limited to C2H_BT_MP commands
       which does invoke rtl_c2h_content_parsing().
    
    Aside of that it can be reached from:
    
         halbtc_get()
           case BTC_GET_U4_SUPPORTED_FEATURE:
             halbtc_get_bt_coex_supported_feature()
           case BTC_GET_U4_BT_FORBIDDEN_SLOT_VAL:
             halbtc_get_bt_forbidden_slot_val()
           case BTC_GET_U4_BT_DEVICE_INFO:
             halbtc_get_bt_device_info()
           case BTC_GET_U4_SUPPORTED_VERSION:
             halbtc_get_bt_coex_supported_version()
           case BTC_GET_U4_SUPPORTED_FEATURE:
             halbtc_get_bt_coex_supported_feature()
    
       btcoexist->btc_get_bt_afh_map_from_bt()
         halbtc_get_bt_afh_map_from_bt()
    
       btcoexist->btc_get_ble_scan_para_from_bt()
         halbtc_get_ble_scan_para_from_bt()
    
       btcoexist->btc_get_ble_scan_type_from_bt()
         halbtc_get_ble_scan_type_from_bt()
    
       btcoexist->btc_get_ant_det_val_from_bt()
         halbtc_get_ant_det_val_from_bt()
    
       btcoexist->btc_get_bt_coex_supported_version()
         halbtc_get_bt_coex_supported_version()
    
       btcoexist->btc_get_bt_coex_supported_feature()
         halbtc_get_bt_coex_supported_feature()
    
    None of these have a caller. Welcome to the wonderful world of HALs and
    onion layers.
    
    Remove in_interrupt() check.
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Cc: Ping-Ke Shih <pkshih@realtek.com>
    Cc: Kalle Valo <kvalo@codeaurora.org>
    Cc: linux-wireless@vger.kernel.org
    Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20201101211536.2966644-9-bigeasy@linutronix.de
    50c61ae1
halbtcoutsrc.c 54.1 KB