From 2f1b1cd31508125914994e16425656be72180856 Mon Sep 17 00:00:00 2001 From: Tsubajashi Date: Tue, 25 Nov 2025 16:58:12 +0100 Subject: [PATCH] Refactor timer management functions to use rwnx_timer_delete and rwnx_timer_delete_sync for better compatibility with kernel version 6.17.0 and above. This change ensures consistent timer handling across various components in the AIC8800 driver. --- .../drivers/aic8800/aic8800_fdrv/aicwf_sdio.c | 4 +- .../aic8800/aic8800_fdrv/aicwf_tcp_ack.c | 8 +-- .../drivers/aic8800/aic8800_fdrv/rwnx_defs.h | 42 ++++++++++++++++ .../drivers/aic8800/aic8800_fdrv/rwnx_main.c | 49 ++++++++++++++++--- .../drivers/aic8800/aic8800_fdrv/rwnx_rx.c | 14 +++--- .../aic8800/aic8800_fdrv/rwnx_wakelock.c | 17 ++++++- 6 files changed, 113 insertions(+), 21 deletions(-) diff --git a/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/aicwf_sdio.c b/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/aicwf_sdio.c index f8e79cc..970adf7 100644 --- a/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/aicwf_sdio.c +++ b/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/aicwf_sdio.c @@ -527,7 +527,7 @@ static void aicwf_sdio_bus_stop(struct device *dev) aicwf_sdio_pwrctl_timer(sdiodev, 0); if(timer_pending(&sdiodev->rwnx_hw->p2p_alive_timer)){ - ret = del_timer(&sdiodev->rwnx_hw->p2p_alive_timer);} + ret = rwnx_timer_delete(&sdiodev->rwnx_hw->p2p_alive_timer);} sdio_dbg("%s\n",__func__); if (sdiodev->pwrctl_tsk) { complete(&sdiodev->pwrctrl_trgg); @@ -1080,7 +1080,7 @@ void aicwf_sdio_pwrctl_timer(struct aic_sdio_dev *sdiodev, uint duration) spin_lock_bh(&sdiodev->pwrctl_lock); if (!duration) { if (timer_pending(&sdiodev->timer)) - del_timer_sync(&sdiodev->timer); + rwnx_timer_delete_sync(&sdiodev->timer); } else { sdiodev->active_duration = duration; timeout = msecs_to_jiffies(sdiodev->active_duration); diff --git a/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/aicwf_tcp_ack.c b/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/aicwf_tcp_ack.c index 480fd07..9667281 100644 --- a/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/aicwf_tcp_ack.c +++ b/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/aicwf_tcp_ack.c @@ -106,7 +106,7 @@ void tcp_ack_deinit(struct rwnx_hw *priv) drop_msg = NULL; write_seqlock_bh(&ack_m->ack_info[i].seqlock); - del_timer(&ack_m->ack_info[i].timer); + rwnx_timer_delete(&ack_m->ack_info[i].timer); drop_msg = ack_m->ack_info[i].msgbuf; ack_m->ack_info[i].msgbuf = NULL; write_sequnlock_bh(&ack_m->ack_info[i].seqlock); @@ -375,7 +375,7 @@ int tcp_ack_handle(struct msg_buf *new_msgbuf, //printk("%lx \n",ack_info->msgbuf); drop_msg = ack_info->msgbuf; ack_info->msgbuf = NULL; - del_timer(&ack_info->timer); + rwnx_timer_delete(&ack_info->timer); }else{ //printk("msgbuf is NULL \n"); } @@ -409,7 +409,7 @@ int tcp_ack_handle(struct msg_buf *new_msgbuf, atomic_read(&ack_m->max_drop_cnt)))) { ack_info->drop_cnt = 0; ack_info->in_send_msg = new_msgbuf; - del_timer(&ack_info->timer); + rwnx_timer_delete(&ack_info->timer); } else { ret = 1; ack_info->msgbuf = new_msgbuf; @@ -472,7 +472,7 @@ int tcp_ack_handle_new(struct msg_buf *new_msgbuf, ack_info->drop_cnt = 0; //send_msg = new_msgbuf; ack_info->in_send_msg = new_msgbuf; - del_timer(&ack_info->timer); + rwnx_timer_delete(&ack_info->timer); }else{ ret = 1; ack_info->msgbuf = new_msgbuf; diff --git a/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_defs.h b/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_defs.h index 04dc8f3..d7e4613 100644 --- a/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_defs.h +++ b/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_defs.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,47 @@ #include "aic_br_ext.h" #endif /* CONFIG_BR_SUPPORT */ +#ifndef from_timer +#define from_timer(var, timer, field) timer_container_of(var, timer, field) +#endif + +static inline int rwnx_timer_delete(struct timer_list *timer) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 17, 0) + return timer_delete(timer); +#else + return del_timer(timer); +#endif +} + +static inline int rwnx_timer_delete_sync(struct timer_list *timer) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 17, 0) + return timer_delete_sync(timer); +#else + return del_timer_sync(timer); +#endif +} + +static inline bool rwnx_rx_spurious_frame(struct net_device *dev, const u8 *addr, gfp_t gfp) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 17, 0) + return cfg80211_rx_spurious_frame(dev, addr, -1, gfp); +#else + return cfg80211_rx_spurious_frame(dev, addr, gfp); +#endif +} + +static inline bool rwnx_rx_unexpected_4addr_frame(struct net_device *dev, const u8 *addr, + gfp_t gfp) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 17, 0) + return cfg80211_rx_unexpected_4addr_frame(dev, addr, -1, gfp); +#else + return cfg80211_rx_unexpected_4addr_frame(dev, addr, gfp); +#endif +} + #define WPI_HDR_LEN 18 #define WPI_PN_LEN 16 #define WPI_PN_OFST 2 diff --git a/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_main.c b/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_main.c index fe3d4eb..5e7d4c7 100755 --- a/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_main.c +++ b/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_main.c @@ -18,6 +18,7 @@ #include #include #include + #include #include #include @@ -2434,7 +2435,7 @@ static int rwnx_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wde #if 0 if (rwnx_vif == rwnx_hw->p2p_dev_vif) { if (timer_pending(&rwnx_hw->p2p_alive_timer)) { - del_timer_sync(&rwnx_hw->p2p_alive_timer); + rwnx_timer_delete_sync(&rwnx_hw->p2p_alive_timer); } } #endif @@ -2677,7 +2678,7 @@ static void rwnx_cfgp2p_stop_p2p_device(struct wiphy *wiphy, struct wireless_dev if (rwnx_vif == rwnx_hw->p2p_dev_vif) { rwnx_hw->is_p2p_alive = 0; if (timer_pending(&rwnx_hw->p2p_alive_timer)) { - del_timer_sync(&rwnx_hw->p2p_alive_timer); + rwnx_timer_delete_sync(&rwnx_hw->p2p_alive_timer); } if (rwnx_vif->up) { rwnx_send_remove_if(rwnx_hw, rwnx_vif->vif_index, true); @@ -4084,7 +4085,7 @@ static int rwnx_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) rwnx_vif->ap.start = false; aicwf_nl_hook_deinit(rwnx_vif->ap.band, rwnx_vif->rwnx_hw->iface_idx); if (timer_pending(&rwnx_vif->steer_timer)) - del_timer_sync(&rwnx_vif->steer_timer); + rwnx_timer_delete_sync(&rwnx_vif->steer_timer); cancel_work_sync(&rwnx_vif->steer_work); flush_workqueue(rwnx_vif->rsp_wq); destroy_workqueue(rwnx_vif->rsp_wq); @@ -4312,6 +4313,30 @@ static int rwnx_cfg80211_set_tx_power(struct wiphy *wiphy, return res; } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 17, 0) +static int rwnx_cfg80211_set_wiphy_params_mlo(struct wiphy *wiphy, int radio_idx, u32 changed) +{ + (void)radio_idx; + return rwnx_cfg80211_set_wiphy_params(wiphy, changed); +} + +static int rwnx_cfg80211_set_tx_power_mlo(struct wiphy *wiphy, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) + struct wireless_dev *wdev, +#endif + int radio_idx, + enum nl80211_tx_power_setting type, + int mbm) +{ + (void)radio_idx; + return rwnx_cfg80211_set_tx_power(wiphy, +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) + wdev, +#endif + type, mbm); +} +#endif + /** * @set_power_mgmt: set the power save to one of those two modes: @@ -6207,9 +6232,19 @@ static struct cfg80211_ops rwnx_cfg80211_ops = { .set_monitor_channel = rwnx_cfg80211_set_monitor_channel, .probe_client = rwnx_cfg80211_probe_client, // .mgmt_frame_register = rwnx_cfg80211_mgmt_frame_register, - .set_wiphy_params = rwnx_cfg80211_set_wiphy_params, + .set_wiphy_params = +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 17, 0) + rwnx_cfg80211_set_wiphy_params_mlo, +#else + rwnx_cfg80211_set_wiphy_params, +#endif .set_txq_params = rwnx_cfg80211_set_txq_params, - .set_tx_power = rwnx_cfg80211_set_tx_power, + .set_tx_power = +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 17, 0) + rwnx_cfg80211_set_tx_power_mlo, +#else + rwnx_cfg80211_set_tx_power, +#endif // .get_tx_power = rwnx_cfg80211_get_tx_power, .set_power_mgmt = rwnx_cfg80211_set_power_mgmt, .get_station = rwnx_cfg80211_get_station, @@ -9011,7 +9046,7 @@ void rwnx_cfg80211_deinit(struct rwnx_hw *rwnx_hw) #ifdef CONFIG_DYNAMIC_PWR if(timer_pending(&rwnx_hw->pwrloss_timer)){ - del_timer_sync(&rwnx_hw->pwrloss_timer);} + rwnx_timer_delete_sync(&rwnx_hw->pwrloss_timer);} cancel_work_sync(&rwnx_hw->pwrloss_work); #endif @@ -9020,7 +9055,7 @@ void rwnx_cfg80211_deinit(struct rwnx_hw *rwnx_hw) list_for_each_entry(defrag_ctrl, &rwnx_hw->defrag_list, list) { list_del_init(&defrag_ctrl->list); if (timer_pending(&defrag_ctrl->defrag_timer)) - del_timer_sync(&defrag_ctrl->defrag_timer); + rwnx_timer_delete_sync(&defrag_ctrl->defrag_timer); dev_kfree_skb(defrag_ctrl->skb); kfree(defrag_ctrl); } diff --git a/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_rx.c b/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_rx.c index eb6d60a..f11cd13 100755 --- a/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_rx.c +++ b/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_rx.c @@ -1585,7 +1585,7 @@ int reord_flush_tid(struct aicwf_rx_priv *rx_priv, struct sk_buff *skb, u8 tid) preorder_ctrl->enable = false; spin_unlock_irqrestore(&preorder_ctrl->reord_list_lock, flags); if (timer_pending(&preorder_ctrl->reord_timer)) - ret = del_timer_sync(&preorder_ctrl->reord_timer); + ret = rwnx_timer_delete_sync(&preorder_ctrl->reord_timer); cancel_work_sync(&preorder_ctrl->reord_timer_work); return 0; @@ -1611,7 +1611,7 @@ void reord_deinit_sta(struct aicwf_rx_priv* rx_priv, struct reord_ctrl_info *reo if(preorder_ctrl->enable){ preorder_ctrl->enable = false; if (timer_pending(&preorder_ctrl->reord_timer)) { - ret = del_timer_sync(&preorder_ctrl->reord_timer); + ret = rwnx_timer_delete_sync(&preorder_ctrl->reord_timer); } cancel_work_sync(&preorder_ctrl->reord_timer_work); } @@ -2021,7 +2021,7 @@ int reord_process_unit(struct recv_msdu *pframe, struct aicwf_rx_priv *rx_priv, } } else { if(timer_pending(&preorder_ctrl->reord_timer)) { - ret = del_timer(&preorder_ctrl->reord_timer); + ret = rwnx_timer_delete(&preorder_ctrl->reord_timer); } } @@ -2352,7 +2352,7 @@ check_len_update: hdr = (struct ieee80211_hdr *)(skb->data + msdu_offset); rwnx_vif = rwnx_rx_get_vif(rwnx_hw, hw_rxhdr->flags_vif_idx); if (rwnx_vif) { - cfg80211_rx_spurious_frame(rwnx_vif->ndev, hdr->addr2, GFP_ATOMIC); + rwnx_rx_spurious_frame(rwnx_vif->ndev, hdr->addr2, GFP_ATOMIC); } goto end; } @@ -2547,7 +2547,7 @@ check_len_update: skb_tmp = defrag_info->skb; list_del_init(&defrag_info->list); if (timer_pending(&defrag_info->defrag_timer)) { - ret = del_timer(&defrag_info->defrag_timer); + ret = rwnx_timer_delete(&defrag_info->defrag_timer); } kfree(defrag_info); spin_unlock_bh(&rwnx_hw->defrag_lock); @@ -2598,8 +2598,8 @@ check_len_update: } if (hw_rxhdr->flags_is_4addr && !rwnx_vif->use_4addr) { - cfg80211_rx_unexpected_4addr_frame(rwnx_vif->ndev, - sta->mac_addr, GFP_ATOMIC); + rwnx_rx_unexpected_4addr_frame(rwnx_vif->ndev, + sta->mac_addr, GFP_ATOMIC); } } diff --git a/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_wakelock.c b/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_wakelock.c index 90e7ad8..25ce7dc 100644 --- a/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_wakelock.c +++ b/usr/src/AIC8800/drivers/aic8800/aic8800_fdrv/rwnx_wakelock.c @@ -11,18 +11,33 @@ struct wakeup_source *rwnx_wakeup_init(const char *name) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0) + return wakeup_source_register(NULL, name); +#else struct wakeup_source *ws; + ws = wakeup_source_create(name); + if (!ws) + return NULL; wakeup_source_add(ws); return ws; +#endif } void rwnx_wakeup_deinit(struct wakeup_source *ws) { - if (ws && ws->active) + if (!ws) + return; + + if (ws->active) __pm_relax(ws); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0) + wakeup_source_unregister(ws); +#else wakeup_source_remove(ws); wakeup_source_destroy(ws); +#endif } struct wakeup_source *rwnx_wakeup_register(struct device *dev, const char *name)