Loading drivers/net/wireless/ath/wil6210/cfg80211.c +4 −0 Original line number Diff line number Diff line Loading @@ -2527,6 +2527,10 @@ static int wil_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct wil6210_priv *wil = wiphy_to_wil(wiphy); enum wmi_ps_profile_type ps_profile; if (wil->vr_profile != WMI_VR_PROFILE_DISABLED) /* disallow in VR mode */ return -EINVAL; wil_dbg_misc(wil, "enabled=%d, timeout=%d\n", enabled, timeout); Loading drivers/net/wireless/ath/wil6210/main.c +38 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ #define WAIT_FOR_SCAN_ABORT_MS 1000 #define WIL_DEFAULT_NUM_RX_STATUS_RINGS 1 #define WIL_BOARD_FILE_MAX_NAMELEN 128 #define WIL6210_ITR_VR_RX_MAX_BURST_DURATION (5) /* usec */ #define WIL6210_VR_TX_RING_ORDER 10 bool debug_fw; /* = false; */ module_param(debug_fw, bool, 0444); Loading Loading @@ -1563,6 +1565,38 @@ int wil_ps_update(struct wil6210_priv *wil, enum wmi_ps_profile_type ps_profile) return rc; } int wil_vr_update_profile(struct wil6210_priv *wil, u8 profile) { int rc; if (profile == WMI_VR_PROFILE_DISABLED) { /* Switch from VR mode to normal (non-VR) mode is not * supported at runtime - it requires FW re-loading. * It is assumed here that FW is not running when VR disable * is requested */ wil->ps_profile = WMI_PS_PROFILE_TYPE_DEFAULT; tx_ring_order = WIL_TX_RING_SIZE_ORDER_DEFAULT; drop_if_ring_full = false; wil->rx_max_burst_duration = WIL6210_ITR_RX_MAX_BURST_DURATION_DEFAULT; return 0; } rc = wmi_set_vr_profile(wil, profile); if (rc) return rc; /* VR default configuration */ wil->ps_profile = WMI_PS_PROFILE_TYPE_PS_DISABLED; tx_ring_order = WIL6210_VR_TX_RING_ORDER; drop_if_ring_full = true; wil->rx_max_burst_duration = WIL6210_ITR_VR_RX_MAX_BURST_DURATION; return 0; } static void wil_pre_fw_config(struct wil6210_priv *wil) { /* Mark FW as loaded from host */ Loading Loading @@ -1794,6 +1828,10 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw) return rc; } /* Update VR mode before configuring interrupt moderation */ if (wil->vr_profile != WMI_VR_PROFILE_DISABLED) wil_vr_update_profile(wil, wil->vr_profile); wil->txrx_ops.configure_interrupt_moderation(wil); /* Enable OFU rdy valid bug fix, to prevent hang in oful34_rx Loading drivers/net/wireless/ath/wil6210/pm.c +7 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,13 @@ wil_can_suspend_vif(struct wil6210_priv *wil, struct wil6210_vif *vif, /* for STA-like interface, don't runtime suspend */ case NL80211_IFTYPE_STATION: if (test_bit(wil_vif_fwconnected, vif->status) && wil->vr_profile != WMI_VR_PROFILE_DISABLED) { wil_dbg_pm(wil, "Reject suspend in VR mode when connected\n"); return false; } /* fallthrough */ case NL80211_IFTYPE_P2P_CLIENT: if (test_bit(wil_vif_fwconnecting, vif->status)) { wil_dbg_pm(wil, "Delay suspend when connecting\n"); Loading drivers/net/wireless/ath/wil6210/sysfs.c +54 −0 Original line number Diff line number Diff line Loading @@ -297,6 +297,59 @@ fst_link_loss_store(struct device *dev, struct device_attribute *attr, static DEVICE_ATTR_RW(fst_link_loss); static ssize_t vr_profile_show(struct device *dev, struct device_attribute *attr, char *buf) { struct wil6210_priv *wil = dev_get_drvdata(dev); ssize_t len; len = snprintf(buf, PAGE_SIZE, "%s\n", wil_get_vr_profile_name(wil->vr_profile)); return len; } static ssize_t vr_profile_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct wil6210_priv *wil = dev_get_drvdata(dev); u8 profile; int rc = 0; if (kstrtou8(buf, 0, &profile)) return -EINVAL; if (test_bit(wil_status_fwready, wil->status)) { wil_err(wil, "Cannot set VR while interface is up\n"); return -EIO; } if (profile == wil->vr_profile) { wil_info(wil, "Ignore same VR profile %s\n", wil_get_vr_profile_name(wil->vr_profile)); return count; } wil_info(wil, "Sysfs: set VR profile to %s\n", wil_get_vr_profile_name(profile)); /* Enabling of VR mode is done from wil_reset after FW is ready. * Disabling is done from here. */ if (profile == WMI_VR_PROFILE_DISABLED) { rc = wil_vr_update_profile(wil, profile); if (rc) return rc; } wil->vr_profile = profile; return count; } static DEVICE_ATTR_RW(vr_profile); static ssize_t snr_thresh_show(struct device *dev, struct device_attribute *attr, char *buf) Loading Loading @@ -339,6 +392,7 @@ static struct attribute *wil6210_sysfs_entries[] = { &dev_attr_thermal_throttling.attr, &dev_attr_fst_link_loss.attr, &dev_attr_snr_thresh.attr, &dev_attr_vr_profile.attr, NULL }; Loading drivers/net/wireless/ath/wil6210/wil6210.h +8 −0 Original line number Diff line number Diff line Loading @@ -1045,6 +1045,9 @@ struct wil6210_priv { short direct; } snr_thresh; /* VR profile, VR is disabled on profile 0 */ u8 vr_profile; /* current reg domain configured in kernel */ char regdomain[3]; /* alpha2 */ Loading Loading @@ -1239,6 +1242,7 @@ void wil_refresh_fw_capabilities(struct wil6210_priv *wil); void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r); int wil_find_cid(struct wil6210_priv *wil, u8 mid, const u8 *mac); void wil_set_ethtoolops(struct net_device *ndev); int wil_vr_update_profile(struct wil6210_priv *wil, u8 profile); struct fw_map *wil_find_fw_mapping(const char *section); void __iomem *wmi_buffer_block(struct wil6210_priv *wil, __le32 ptr, u32 size); Loading Loading @@ -1429,6 +1433,10 @@ void wil_halp_unvote(struct wil6210_priv *wil); void wil6210_set_halp(struct wil6210_priv *wil); void wil6210_clear_halp(struct wil6210_priv *wil); int wmi_set_vr_profile(struct wil6210_priv *wil, u8 profile); const char * wil_get_vr_profile_name(enum wmi_vr_profile profile); void wil_ftm_init(struct wil6210_vif *vif); void wil_ftm_deinit(struct wil6210_vif *vif); void wil_ftm_stop_operations(struct wil6210_priv *wil); Loading Loading
drivers/net/wireless/ath/wil6210/cfg80211.c +4 −0 Original line number Diff line number Diff line Loading @@ -2527,6 +2527,10 @@ static int wil_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct wil6210_priv *wil = wiphy_to_wil(wiphy); enum wmi_ps_profile_type ps_profile; if (wil->vr_profile != WMI_VR_PROFILE_DISABLED) /* disallow in VR mode */ return -EINVAL; wil_dbg_misc(wil, "enabled=%d, timeout=%d\n", enabled, timeout); Loading
drivers/net/wireless/ath/wil6210/main.c +38 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,8 @@ #define WAIT_FOR_SCAN_ABORT_MS 1000 #define WIL_DEFAULT_NUM_RX_STATUS_RINGS 1 #define WIL_BOARD_FILE_MAX_NAMELEN 128 #define WIL6210_ITR_VR_RX_MAX_BURST_DURATION (5) /* usec */ #define WIL6210_VR_TX_RING_ORDER 10 bool debug_fw; /* = false; */ module_param(debug_fw, bool, 0444); Loading Loading @@ -1563,6 +1565,38 @@ int wil_ps_update(struct wil6210_priv *wil, enum wmi_ps_profile_type ps_profile) return rc; } int wil_vr_update_profile(struct wil6210_priv *wil, u8 profile) { int rc; if (profile == WMI_VR_PROFILE_DISABLED) { /* Switch from VR mode to normal (non-VR) mode is not * supported at runtime - it requires FW re-loading. * It is assumed here that FW is not running when VR disable * is requested */ wil->ps_profile = WMI_PS_PROFILE_TYPE_DEFAULT; tx_ring_order = WIL_TX_RING_SIZE_ORDER_DEFAULT; drop_if_ring_full = false; wil->rx_max_burst_duration = WIL6210_ITR_RX_MAX_BURST_DURATION_DEFAULT; return 0; } rc = wmi_set_vr_profile(wil, profile); if (rc) return rc; /* VR default configuration */ wil->ps_profile = WMI_PS_PROFILE_TYPE_PS_DISABLED; tx_ring_order = WIL6210_VR_TX_RING_ORDER; drop_if_ring_full = true; wil->rx_max_burst_duration = WIL6210_ITR_VR_RX_MAX_BURST_DURATION; return 0; } static void wil_pre_fw_config(struct wil6210_priv *wil) { /* Mark FW as loaded from host */ Loading Loading @@ -1794,6 +1828,10 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw) return rc; } /* Update VR mode before configuring interrupt moderation */ if (wil->vr_profile != WMI_VR_PROFILE_DISABLED) wil_vr_update_profile(wil, wil->vr_profile); wil->txrx_ops.configure_interrupt_moderation(wil); /* Enable OFU rdy valid bug fix, to prevent hang in oful34_rx Loading
drivers/net/wireless/ath/wil6210/pm.c +7 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,13 @@ wil_can_suspend_vif(struct wil6210_priv *wil, struct wil6210_vif *vif, /* for STA-like interface, don't runtime suspend */ case NL80211_IFTYPE_STATION: if (test_bit(wil_vif_fwconnected, vif->status) && wil->vr_profile != WMI_VR_PROFILE_DISABLED) { wil_dbg_pm(wil, "Reject suspend in VR mode when connected\n"); return false; } /* fallthrough */ case NL80211_IFTYPE_P2P_CLIENT: if (test_bit(wil_vif_fwconnecting, vif->status)) { wil_dbg_pm(wil, "Delay suspend when connecting\n"); Loading
drivers/net/wireless/ath/wil6210/sysfs.c +54 −0 Original line number Diff line number Diff line Loading @@ -297,6 +297,59 @@ fst_link_loss_store(struct device *dev, struct device_attribute *attr, static DEVICE_ATTR_RW(fst_link_loss); static ssize_t vr_profile_show(struct device *dev, struct device_attribute *attr, char *buf) { struct wil6210_priv *wil = dev_get_drvdata(dev); ssize_t len; len = snprintf(buf, PAGE_SIZE, "%s\n", wil_get_vr_profile_name(wil->vr_profile)); return len; } static ssize_t vr_profile_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct wil6210_priv *wil = dev_get_drvdata(dev); u8 profile; int rc = 0; if (kstrtou8(buf, 0, &profile)) return -EINVAL; if (test_bit(wil_status_fwready, wil->status)) { wil_err(wil, "Cannot set VR while interface is up\n"); return -EIO; } if (profile == wil->vr_profile) { wil_info(wil, "Ignore same VR profile %s\n", wil_get_vr_profile_name(wil->vr_profile)); return count; } wil_info(wil, "Sysfs: set VR profile to %s\n", wil_get_vr_profile_name(profile)); /* Enabling of VR mode is done from wil_reset after FW is ready. * Disabling is done from here. */ if (profile == WMI_VR_PROFILE_DISABLED) { rc = wil_vr_update_profile(wil, profile); if (rc) return rc; } wil->vr_profile = profile; return count; } static DEVICE_ATTR_RW(vr_profile); static ssize_t snr_thresh_show(struct device *dev, struct device_attribute *attr, char *buf) Loading Loading @@ -339,6 +392,7 @@ static struct attribute *wil6210_sysfs_entries[] = { &dev_attr_thermal_throttling.attr, &dev_attr_fst_link_loss.attr, &dev_attr_snr_thresh.attr, &dev_attr_vr_profile.attr, NULL }; Loading
drivers/net/wireless/ath/wil6210/wil6210.h +8 −0 Original line number Diff line number Diff line Loading @@ -1045,6 +1045,9 @@ struct wil6210_priv { short direct; } snr_thresh; /* VR profile, VR is disabled on profile 0 */ u8 vr_profile; /* current reg domain configured in kernel */ char regdomain[3]; /* alpha2 */ Loading Loading @@ -1239,6 +1242,7 @@ void wil_refresh_fw_capabilities(struct wil6210_priv *wil); void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r); int wil_find_cid(struct wil6210_priv *wil, u8 mid, const u8 *mac); void wil_set_ethtoolops(struct net_device *ndev); int wil_vr_update_profile(struct wil6210_priv *wil, u8 profile); struct fw_map *wil_find_fw_mapping(const char *section); void __iomem *wmi_buffer_block(struct wil6210_priv *wil, __le32 ptr, u32 size); Loading Loading @@ -1429,6 +1433,10 @@ void wil_halp_unvote(struct wil6210_priv *wil); void wil6210_set_halp(struct wil6210_priv *wil); void wil6210_clear_halp(struct wil6210_priv *wil); int wmi_set_vr_profile(struct wil6210_priv *wil, u8 profile); const char * wil_get_vr_profile_name(enum wmi_vr_profile profile); void wil_ftm_init(struct wil6210_vif *vif); void wil_ftm_deinit(struct wil6210_vif *vif); void wil_ftm_stop_operations(struct wil6210_priv *wil); Loading