1: 958c667dcf4d ! 1: 9d61753fe26a wifi: rtw88: sdio: Handle allocation and read errors in rtw_sdio_rxfifo_recv @@ Commit message Cc: stable@vger.kernel.org Assisted-by: LLM Acked-by: Ping-Ke Shih  + Reviewed-by: Luka Gejak  Signed-off-by: Alastair D'Silva   ## drivers/net/wireless/realtek/rtw88/sdio.c ## 2: 94d131f86bca ! 2: d4854e18c586 wifi: rtw88: sdio: Track running state and cancel TX worker on stop @@ drivers/net/wireless/realtek/rtw88/sdio.c: static void rtw_sdio_init(struct rtw_ if (rtw_is_8723bs(rtwdev)) rtwsdio->irq_mask = REG_SDIO_HIMR_RX_REQUEST; else -@@ drivers/net/wireless/realtek/rtw88/sdio.c: static void rtw_sdio_init(struct rtw_dev *rtwdev) - REG_SDIO_HIMR_CPWM1; - } -  -+static void rtw_sdio_deinit(struct rtw_dev *rtwdev) -+{ -+ struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv; -+ -+ mutex_destroy(&rtwsdio->irq_lock); -+} -+ - static void rtw_sdio_enable_rx_aggregation(struct rtw_dev *rtwdev) - { - u8 size, timeout;  @@ drivers/net/wireless/realtek/rtw88/sdio.c: static int rtw_sdio_8723bs_check_rqpn(struct rtw_dev *rtwdev)  static int rtw_sdio_start(struct rtw_dev *rtwdev) @@ drivers/net/wireless/realtek/rtw88/sdio.c: static void rtw_sdio_tx_handler(struc if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_TX_WAKE)) rtw_sdio_deep_ps_leave(rtwdev);  -@@ drivers/net/wireless/realtek/rtw88/sdio.c: int rtw_sdio_probe(struct sdio_func *sdio_func, - ret = rtw_sdio_init_tx(rtwdev); - if (ret) { - rtw_err(rtwdev, "failed to init SDIO TX queue\n"); -- goto err_sdio_declaim; -+ goto err_deinit; - } -  - ret = rtw_chip_info_setup(rtwdev); -@@ drivers/net/wireless/realtek/rtw88/sdio.c: int rtw_sdio_probe(struct sdio_func *sdio_func, - rtw_sdio_free_irq(rtwdev, sdio_func); - err_destroy_txwq: - rtw_sdio_deinit_tx(rtwdev); --err_sdio_declaim: -+err_deinit: -+ rtw_sdio_deinit(rtwdev); - rtw_sdio_declaim(rtwdev, sdio_func); - err_deinit_core: - rtw_core_deinit(rtwdev); -@@ drivers/net/wireless/realtek/rtw88/sdio.c: void rtw_sdio_remove(struct sdio_func *sdio_func) - rtw_sdio_free_irq(rtwdev, sdio_func); - rtw_sdio_declaim(rtwdev, sdio_func); - rtw_sdio_deinit_tx(rtwdev); -+ rtw_sdio_deinit(rtwdev); - rtw_core_deinit(rtwdev); - ieee80211_free_hw(hw); - }  ## drivers/net/wireless/realtek/rtw88/sdio.h ##  @@ drivers/net/wireless/realtek/rtw88/sdio.h: struct rtw_sdio { @@ drivers/net/wireless/realtek/rtw88/sdio.h: struct rtw_sdio {  void *irq_thread;  + bool running; -+ /* protect running state and interrupt mask */ ++ /* protect running state and enabling interrupts */  + struct mutex irq_lock;  struct workqueue_struct *txwq; 3: 5543b4c96c93 < -: ------------ wifi: rtw88: sdio: Fix unhandled RX request interrupt storm -: ------------ > 3: e068bfea6332 wifi: rtw88: sdio: Fix unhandled RX request interrupt storm 4: d774798f92bb ! 4: 12b781872120 wifi: rtw88: sdio: Split rtw_sdio_rx_isr into 8051 and 3081 variants @@ Commit message  Assisted-by: LLM Acked-by: Ping-Ke Shih  + Reviewed-by: Luka Gejak  Signed-off-by: Alastair D'Silva   ## drivers/net/wireless/realtek/rtw88/sdio.c ## @@ drivers/net/wireless/realtek/rtw88/sdio.c: static void rtw_sdio_handle_interrupt  - rtw_sdio_rx_isr(rtwdev);  + rtw_sdio_rx_isr_3081(rtwdev);  - /* Unmasking HIMR re-asserts the IRQ line if new packets arrived */ - scoped_guard(mutex, &rtwsdio->irq_lock) { + /* + * Unmasking HIMR re-asserts the IRQ line if new packets arrived or if