请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: CC3351
TI 团队大家好、
我来自 BSH、在 CVTE 团队工作、使用以下版本测试 WiFi
我来自 BSH、在 CVTE 团队工作、使用以下版本测试 WiFi

我们注意到 cc33xx 驱动程序恢复路径中存在一个潜在问题:cc33xx_op_resume 返回 一个 未初始化的值、该值可被上层解释为恢复失败、并可能出现恢复失败
导致所有无线接口关闭。
以下是补丁“0001-cc33xx_kernel.patch"的“的代码
+static int __ themy_unused cc33xx_op_restore(结构 ieee80211_hw *hw)
+{
+ struct cc33xx *wl = hw->priv;
+ 结构 cc33xx_VIF *wlvif;
+ 无符号长标志;
+ bool run_irq_work = false、pending_recovery;
+ int ret;
+
+ cc33xx_debug (debug_mac80211、“mac80211 resume wow=%d“、
+ wl->keep_device_power);
+ warn_on(!wl->keep_device_power);
+
+/*
+ *重新启用 IRQ_Work 排队、并在以下情况下直接调用 IRQ_Work
+ *有一个待处理的工作。
+ */
+ spin_loc_irqsave(&wl->wl_lock, flags);
+ CLEAR_BIT (CC33XX_FLAG_SUSPENED、&WL->FLAGS);
+ RUN_IRQ_WORK = TEST_AND_CLEAR_BIT (CC33XX_FLAG_PEND_WORK、&WL->FLAGS);
+ SPIN_UNLOCK_irqrestore (&WL->WL_LOCK、flags);
+
+ mutex_lock(&wl->mutex);
+
+ /*在调用任何 SDIO 函数之前测试恢复标志*/
+ PENDING_RECOVERY = TEST_BIT (CC33XX_FLAG_RECOVERY_IN_PROGRESS、
+ &WL->flags);
+
+ if (run_IRQ_work){
+ cc33xx_debug (debug_mac80211、“直接运行延迟的 IRQ_work);
+
+ /*如果恢复挂起、请勿与硬件通信*/
+ if(!pending_recovery){
+ RET = wlcore_irq_locked (WL);
+ IF (RET)
+ cc33xx_queue_recovery_work (wl);
+ }
+
+ wlcore_enable_interrupts (wl);
+ }
+
+ if (pending_recovery){
+ cc33xx_warning (“恢复时忘记恢复队列“);
+ ieee80211_queue_work(WL->HW,&WL->recovery_work);
+ 转到外;
+ }
+
+ cc33xx_for_each_wlvif (wl、wlvif){
+ if (wlcore_is_p2p_mgmt (wlvif))
+ 继续;
+
+ cc33xx_configure_reume (wl、wlvif);
+ }
+
+输出:
+ wl->keep_device_power = false;
+
+/*
+ *设置一个标志以在恢复后的第一个 Tx 上重新初始化看门狗。
+ *这样我们就避免了 Tx 完成中断的可能情况
+ *到达失败、我们执行虚假恢复。
+ */
+ SET_BIT (CC33XX_FLAG_REINIT_TX_WDOG、&WL->flags);
+ mutex_unlock (&wl->mutex);
+
+ 返回 ret;
+}