Loading drivers/net/wireless/ath/wil6210/cfg80211.c +98 −6 Original line number Diff line number Diff line Loading @@ -54,6 +54,19 @@ static struct ieee80211_channel wil_60ghz_channels[] = { CHAN60G(4, 0), }; static void wil_memdup_ie(u8 **pdst, size_t *pdst_len, const u8 *src, size_t src_len) { kfree(*pdst); *pdst = NULL; *pdst_len = 0; if (src_len > 0) { *pdst = kmemdup(src, src_len, GFP_KERNEL); if (*pdst) *pdst_len = src_len; } } struct wil_regd_2_brd_suffix { const char regdomain[3]; /* alpha2 */ const char *brd_suffix; Loading Loading @@ -1723,11 +1736,19 @@ static int wil_cfg80211_add_key(struct wiphy *wiphy, rc = wmi_add_cipher_key(vif, key_index, mac_addr, params->key_len, params->key, key_usage); if (!rc && !IS_ERR(cs)) if (!rc && !IS_ERR(cs)) { /* update local storage used for AP recovery */ if (key_usage == WMI_KEY_USE_TX_GROUP && params->key && params->key_len <= WMI_MAX_KEY_LEN) { vif->gtk_index = key_index; memcpy(vif->gtk, params->key, params->key_len); vif->gtk_len = params->key_len; } /* in FT set crypto will take place upon receiving * WMI_RING_EN_EVENTID event */ wil_set_crypto_rx(key_index, key_usage, cs, params); } return rc; } Loading Loading @@ -1860,7 +1881,7 @@ static int _wil_cfg80211_merge_extra_ies(const u8 *ies1, u16 ies1_len, memcpy(buf, ies1, ies1_len); dpos = buf + ies1_len; spos = ies2; while (spos + 1 < ies2 + ies2_len) { while (spos && (spos + 1 < ies2 + ies2_len)) { /* IE tag at offset 0, length at offset 1 */ u16 ielen = 2 + spos[1]; Loading Loading @@ -1924,6 +1945,14 @@ static int _wil_cfg80211_set_ies(struct wil6210_vif *vif, u16 len = 0, proberesp_len = 0; u8 *ies = NULL, *proberesp; /* update local storage used for AP recovery */ wil_memdup_ie(&vif->proberesp, &vif->proberesp_len, bcon->probe_resp, bcon->probe_resp_len); wil_memdup_ie(&vif->proberesp_ies, &vif->proberesp_ies_len, bcon->proberesp_ies, bcon->proberesp_ies_len); wil_memdup_ie(&vif->assocresp_ies, &vif->assocresp_ies_len, bcon->assocresp_ies, bcon->assocresp_ies_len); proberesp = _wil_cfg80211_get_proberesp_ies(bcon->probe_resp, bcon->probe_resp_len, &proberesp_len); Loading Loading @@ -2025,6 +2054,9 @@ static int _wil_cfg80211_start_ap(struct wiphy *wiphy, vif->channel = chan; vif->hidden_ssid = hidden_ssid; vif->pbss = pbss; vif->bi = bi; memcpy(vif->ssid, ssid, ssid_len); vif->ssid_len = ssid_len; netif_carrier_on(ndev); if (!wil_has_other_active_ifaces(wil, ndev, false, true)) Loading @@ -2051,11 +2083,64 @@ static int _wil_cfg80211_start_ap(struct wiphy *wiphy, return rc; } void wil_cfg80211_ap_recovery(struct wil6210_priv *wil) { int rc, i; struct wiphy *wiphy = wil_to_wiphy(wil); for (i = 0; i < wil->max_vifs; i++) { struct wil6210_vif *vif = wil->vifs[i]; struct net_device *ndev; struct cfg80211_beacon_data bcon = {}; struct key_params key_params = {}; if (!vif || vif->ssid_len == 0) continue; ndev = vif_to_ndev(vif); bcon.proberesp_ies = vif->proberesp_ies; bcon.assocresp_ies = vif->assocresp_ies; bcon.probe_resp = vif->proberesp; bcon.proberesp_ies_len = vif->proberesp_ies_len; bcon.assocresp_ies_len = vif->assocresp_ies_len; bcon.probe_resp_len = vif->proberesp_len; wil_info(wil, "AP (vif %d) recovery: privacy %d, bi %d, channel %d, hidden %d, pbss %d\n", i, vif->privacy, vif->bi, vif->channel, vif->hidden_ssid, vif->pbss); wil_hex_dump_misc("SSID ", DUMP_PREFIX_OFFSET, 16, 1, vif->ssid, vif->ssid_len, true); rc = _wil_cfg80211_start_ap(wiphy, ndev, vif->ssid, vif->ssid_len, vif->privacy, vif->bi, vif->channel, &bcon, vif->hidden_ssid, vif->pbss); if (rc) { wil_err(wil, "vif %d recovery failed (%d)\n", i, rc); continue; } if (!vif->privacy || vif->gtk_len == 0) continue; key_params.key = vif->gtk; key_params.key_len = vif->gtk_len; key_params.seq_len = IEEE80211_GCMP_PN_LEN; rc = wil_cfg80211_add_key(wiphy, ndev, vif->gtk_index, false, NULL, &key_params); if (rc) wil_err(wil, "vif %d recovery add key failed (%d)\n", i, rc); } } static int wil_cfg80211_change_beacon(struct wiphy *wiphy, struct net_device *ndev, struct cfg80211_beacon_data *bcon) { struct wil6210_priv *wil = wiphy_to_wil(wiphy); struct wireless_dev *wdev = ndev->ieee80211_ptr; struct wil6210_vif *vif = ndev_to_vif(ndev); int rc; u32 privacy = 0; Loading @@ -2068,15 +2153,16 @@ static int wil_cfg80211_change_beacon(struct wiphy *wiphy, bcon->tail_len)) privacy = 1; memcpy(vif->ssid, wdev->ssid, wdev->ssid_len); vif->ssid_len = wdev->ssid_len; /* in case privacy has changed, need to restart the AP */ if (vif->privacy != privacy) { struct wireless_dev *wdev = ndev->ieee80211_ptr; wil_dbg_misc(wil, "privacy changed %d=>%d. Restarting AP\n", vif->privacy, privacy); rc = _wil_cfg80211_start_ap(wiphy, ndev, wdev->ssid, wdev->ssid_len, privacy, rc = _wil_cfg80211_start_ap(wiphy, ndev, vif->ssid, vif->ssid_len, privacy, wdev->beacon_interval, vif->channel, bcon, vif->hidden_ssid, Loading Loading @@ -2166,6 +2252,12 @@ static int wil_cfg80211_stop_ap(struct wiphy *wiphy, wmi_pcp_stop(vif); clear_bit(wil_vif_ft_roam, vif->status); vif->ssid_len = 0; wil_memdup_ie(&vif->proberesp, &vif->proberesp_len, NULL, 0); wil_memdup_ie(&vif->proberesp_ies, &vif->proberesp_ies_len, NULL, 0); wil_memdup_ie(&vif->assocresp_ies, &vif->assocresp_ies_len, NULL, 0); memset(vif->gtk, 0, WMI_MAX_KEY_LEN); vif->gtk_len = 0; if (last) __wil_down(wil); Loading drivers/net/wireless/ath/wil6210/main.c +22 −8 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ #include <linux/moduleparam.h> #include <linux/if_arp.h> #include <linux/etherdevice.h> #include <linux/rtnetlink.h> #include "wil6210.h" #include "txrx.h" Loading Loading @@ -475,10 +476,11 @@ static void wil_fw_error_worker(struct work_struct *work) if (wil_wait_for_recovery(wil) != 0) return; rtnl_lock(); mutex_lock(&wil->mutex); /* Needs adaptation for multiple VIFs * need to go over all VIFs and consider the appropriate * recovery. * recovery because each one can have different iftype. */ switch (wdev->iftype) { case NL80211_IFTYPE_STATION: Loading @@ -490,15 +492,24 @@ static void wil_fw_error_worker(struct work_struct *work) break; case NL80211_IFTYPE_AP: case NL80211_IFTYPE_P2P_GO: wil_info(wil, "No recovery for AP-like interface\n"); /* recovery in these modes is done by upper layers */ if (no_fw_recovery) /* upper layers do recovery */ break; /* silent recovery, upper layers will see disconnect */ __wil_down(wil); __wil_up(wil); mutex_unlock(&wil->mutex); wil_cfg80211_ap_recovery(wil); mutex_lock(&wil->mutex); wil_info(wil, "... completed\n"); break; default: wil_err(wil, "No recovery - unknown interface type %d\n", wdev->iftype); break; } mutex_unlock(&wil->mutex); rtnl_unlock(); } static int wil_find_free_ring(struct wil6210_priv *wil) Loading Loading @@ -989,10 +1000,13 @@ static int wil_target_reset(struct wil6210_priv *wil, int no_flash) wil_dbg_misc(wil, "Resetting \"%s\"...\n", wil->hw_name); if (wil->hw_version < HW_VER_TALYN) { /* Clear MAC link up */ wil_s(wil, RGF_HP_CTRL, BIT(15)); wil_s(wil, RGF_USER_CLKS_CTL_SW_RST_MASK_0, BIT_HPAL_PERST_FROM_PAD); wil_s(wil, RGF_USER_CLKS_CTL_SW_RST_MASK_0, BIT_HPAL_PERST_FROM_PAD); wil_s(wil, RGF_USER_CLKS_CTL_SW_RST_MASK_0, BIT_CAR_PERST_RST); } wil_halt_cpu(wil); Loading Loading @@ -1715,7 +1729,7 @@ int __wil_up(struct wil6210_priv *wil) WIL_RX_RING_SIZE_ORDER_DEFAULT : WIL_RX_RING_SIZE_ORDER_TALYN_DEFAULT; rc = wil->txrx_ops.rx_init(wil, 1 << rx_ring_order); rc = wil->txrx_ops.rx_init(wil, rx_ring_order); if (rc) return rc; Loading drivers/net/wireless/ath/wil6210/netdev.c +1 −2 Original line number Diff line number Diff line Loading @@ -342,8 +342,7 @@ wil_vif_alloc(struct wil6210_priv *wil, const char *name, ndev->ieee80211_ptr = wdev; ndev->hw_features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_RXHASH; NETIF_F_TSO | NETIF_F_TSO6; ndev->features |= ndev->hw_features; SET_NETDEV_DEV(ndev, wiphy_dev(wdev->wiphy)); Loading drivers/net/wireless/ath/wil6210/txrx.c +4 −10 Original line number Diff line number Diff line Loading @@ -732,14 +732,6 @@ void wil_netif_rx_any(struct sk_buff *skb, struct net_device *ndev) stats = &wil->sta[cid].stats; if (ndev->features & NETIF_F_RXHASH) /* fake L4 to ensure it won't be re-calculated later * set hash to any non-zero value to activate rps * mechanism, core will be chosen according * to user-level rps configuration. */ skb_set_hash(skb, 1, PKT_HASH_TYPE_L4); skb_orphan(skb); if (security && (wil->txrx_ops.rx_crypto_check(wil, skb) != 0)) { Loading Loading @@ -869,7 +861,7 @@ static void wil_rx_buf_len_init(struct wil6210_priv *wil) } } static int wil_rx_init(struct wil6210_priv *wil, u16 size) static int wil_rx_init(struct wil6210_priv *wil, uint order) { struct wil_ring *vring = &wil->ring_rx; int rc; Loading @@ -883,7 +875,7 @@ static int wil_rx_init(struct wil6210_priv *wil, u16 size) wil_rx_buf_len_init(wil); vring->size = size; vring->size = 1 << order; vring->is_rx = true; rc = wil_vring_alloc(wil, vring); if (rc) Loading Loading @@ -1392,6 +1384,8 @@ static struct wil_ring *wil_find_tx_bcast_2(struct wil6210_priv *wil, wil_dbg_txrx(wil, "BCAST DUP -> ring %d\n", i); wil_set_da_for_vring(wil, skb2, i); wil_tx_ring(wil, vif, v2, skb2); /* successful call to wil_tx_ring takes skb2 ref */ dev_kfree_skb_any(skb2); } else { wil_err(wil, "skb_copy failed\n"); } Loading drivers/net/wireless/ath/wil6210/txrx_edma.c +8 −3 Original line number Diff line number Diff line Loading @@ -606,9 +606,9 @@ static void wil_rx_buf_len_init_edma(struct wil6210_priv *wil) WIL_MAX_ETH_MTU : WIL_EDMA_RX_BUF_LEN_DEFAULT; } static int wil_rx_init_edma(struct wil6210_priv *wil, u16 desc_ring_size) static int wil_rx_init_edma(struct wil6210_priv *wil, uint desc_ring_order) { u16 status_ring_size; u16 status_ring_size, desc_ring_size = 1 << desc_ring_order; struct wil_ring *ring = &wil->ring_rx; int rc; size_t elem_size = wil->use_compressed_rx_status ? Loading @@ -623,7 +623,12 @@ static int wil_rx_init_edma(struct wil6210_priv *wil, u16 desc_ring_size) "compressed RX status cannot be used with SW reorder\n"); return -EINVAL; } if (wil->rx_status_ring_order <= desc_ring_order) /* make sure sring is larger than desc ring */ wil->rx_status_ring_order = desc_ring_order + 1; if (wil->rx_buff_id_count <= desc_ring_size) /* make sure we will not run out of buff_ids */ wil->rx_buff_id_count = desc_ring_size + 512; if (wil->rx_status_ring_order < WIL_SRING_SIZE_ORDER_MIN || wil->rx_status_ring_order > WIL_SRING_SIZE_ORDER_MAX) wil->rx_status_ring_order = WIL_RX_SRING_SIZE_ORDER_DEFAULT; Loading Loading
drivers/net/wireless/ath/wil6210/cfg80211.c +98 −6 Original line number Diff line number Diff line Loading @@ -54,6 +54,19 @@ static struct ieee80211_channel wil_60ghz_channels[] = { CHAN60G(4, 0), }; static void wil_memdup_ie(u8 **pdst, size_t *pdst_len, const u8 *src, size_t src_len) { kfree(*pdst); *pdst = NULL; *pdst_len = 0; if (src_len > 0) { *pdst = kmemdup(src, src_len, GFP_KERNEL); if (*pdst) *pdst_len = src_len; } } struct wil_regd_2_brd_suffix { const char regdomain[3]; /* alpha2 */ const char *brd_suffix; Loading Loading @@ -1723,11 +1736,19 @@ static int wil_cfg80211_add_key(struct wiphy *wiphy, rc = wmi_add_cipher_key(vif, key_index, mac_addr, params->key_len, params->key, key_usage); if (!rc && !IS_ERR(cs)) if (!rc && !IS_ERR(cs)) { /* update local storage used for AP recovery */ if (key_usage == WMI_KEY_USE_TX_GROUP && params->key && params->key_len <= WMI_MAX_KEY_LEN) { vif->gtk_index = key_index; memcpy(vif->gtk, params->key, params->key_len); vif->gtk_len = params->key_len; } /* in FT set crypto will take place upon receiving * WMI_RING_EN_EVENTID event */ wil_set_crypto_rx(key_index, key_usage, cs, params); } return rc; } Loading Loading @@ -1860,7 +1881,7 @@ static int _wil_cfg80211_merge_extra_ies(const u8 *ies1, u16 ies1_len, memcpy(buf, ies1, ies1_len); dpos = buf + ies1_len; spos = ies2; while (spos + 1 < ies2 + ies2_len) { while (spos && (spos + 1 < ies2 + ies2_len)) { /* IE tag at offset 0, length at offset 1 */ u16 ielen = 2 + spos[1]; Loading Loading @@ -1924,6 +1945,14 @@ static int _wil_cfg80211_set_ies(struct wil6210_vif *vif, u16 len = 0, proberesp_len = 0; u8 *ies = NULL, *proberesp; /* update local storage used for AP recovery */ wil_memdup_ie(&vif->proberesp, &vif->proberesp_len, bcon->probe_resp, bcon->probe_resp_len); wil_memdup_ie(&vif->proberesp_ies, &vif->proberesp_ies_len, bcon->proberesp_ies, bcon->proberesp_ies_len); wil_memdup_ie(&vif->assocresp_ies, &vif->assocresp_ies_len, bcon->assocresp_ies, bcon->assocresp_ies_len); proberesp = _wil_cfg80211_get_proberesp_ies(bcon->probe_resp, bcon->probe_resp_len, &proberesp_len); Loading Loading @@ -2025,6 +2054,9 @@ static int _wil_cfg80211_start_ap(struct wiphy *wiphy, vif->channel = chan; vif->hidden_ssid = hidden_ssid; vif->pbss = pbss; vif->bi = bi; memcpy(vif->ssid, ssid, ssid_len); vif->ssid_len = ssid_len; netif_carrier_on(ndev); if (!wil_has_other_active_ifaces(wil, ndev, false, true)) Loading @@ -2051,11 +2083,64 @@ static int _wil_cfg80211_start_ap(struct wiphy *wiphy, return rc; } void wil_cfg80211_ap_recovery(struct wil6210_priv *wil) { int rc, i; struct wiphy *wiphy = wil_to_wiphy(wil); for (i = 0; i < wil->max_vifs; i++) { struct wil6210_vif *vif = wil->vifs[i]; struct net_device *ndev; struct cfg80211_beacon_data bcon = {}; struct key_params key_params = {}; if (!vif || vif->ssid_len == 0) continue; ndev = vif_to_ndev(vif); bcon.proberesp_ies = vif->proberesp_ies; bcon.assocresp_ies = vif->assocresp_ies; bcon.probe_resp = vif->proberesp; bcon.proberesp_ies_len = vif->proberesp_ies_len; bcon.assocresp_ies_len = vif->assocresp_ies_len; bcon.probe_resp_len = vif->proberesp_len; wil_info(wil, "AP (vif %d) recovery: privacy %d, bi %d, channel %d, hidden %d, pbss %d\n", i, vif->privacy, vif->bi, vif->channel, vif->hidden_ssid, vif->pbss); wil_hex_dump_misc("SSID ", DUMP_PREFIX_OFFSET, 16, 1, vif->ssid, vif->ssid_len, true); rc = _wil_cfg80211_start_ap(wiphy, ndev, vif->ssid, vif->ssid_len, vif->privacy, vif->bi, vif->channel, &bcon, vif->hidden_ssid, vif->pbss); if (rc) { wil_err(wil, "vif %d recovery failed (%d)\n", i, rc); continue; } if (!vif->privacy || vif->gtk_len == 0) continue; key_params.key = vif->gtk; key_params.key_len = vif->gtk_len; key_params.seq_len = IEEE80211_GCMP_PN_LEN; rc = wil_cfg80211_add_key(wiphy, ndev, vif->gtk_index, false, NULL, &key_params); if (rc) wil_err(wil, "vif %d recovery add key failed (%d)\n", i, rc); } } static int wil_cfg80211_change_beacon(struct wiphy *wiphy, struct net_device *ndev, struct cfg80211_beacon_data *bcon) { struct wil6210_priv *wil = wiphy_to_wil(wiphy); struct wireless_dev *wdev = ndev->ieee80211_ptr; struct wil6210_vif *vif = ndev_to_vif(ndev); int rc; u32 privacy = 0; Loading @@ -2068,15 +2153,16 @@ static int wil_cfg80211_change_beacon(struct wiphy *wiphy, bcon->tail_len)) privacy = 1; memcpy(vif->ssid, wdev->ssid, wdev->ssid_len); vif->ssid_len = wdev->ssid_len; /* in case privacy has changed, need to restart the AP */ if (vif->privacy != privacy) { struct wireless_dev *wdev = ndev->ieee80211_ptr; wil_dbg_misc(wil, "privacy changed %d=>%d. Restarting AP\n", vif->privacy, privacy); rc = _wil_cfg80211_start_ap(wiphy, ndev, wdev->ssid, wdev->ssid_len, privacy, rc = _wil_cfg80211_start_ap(wiphy, ndev, vif->ssid, vif->ssid_len, privacy, wdev->beacon_interval, vif->channel, bcon, vif->hidden_ssid, Loading Loading @@ -2166,6 +2252,12 @@ static int wil_cfg80211_stop_ap(struct wiphy *wiphy, wmi_pcp_stop(vif); clear_bit(wil_vif_ft_roam, vif->status); vif->ssid_len = 0; wil_memdup_ie(&vif->proberesp, &vif->proberesp_len, NULL, 0); wil_memdup_ie(&vif->proberesp_ies, &vif->proberesp_ies_len, NULL, 0); wil_memdup_ie(&vif->assocresp_ies, &vif->assocresp_ies_len, NULL, 0); memset(vif->gtk, 0, WMI_MAX_KEY_LEN); vif->gtk_len = 0; if (last) __wil_down(wil); Loading
drivers/net/wireless/ath/wil6210/main.c +22 −8 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ #include <linux/moduleparam.h> #include <linux/if_arp.h> #include <linux/etherdevice.h> #include <linux/rtnetlink.h> #include "wil6210.h" #include "txrx.h" Loading Loading @@ -475,10 +476,11 @@ static void wil_fw_error_worker(struct work_struct *work) if (wil_wait_for_recovery(wil) != 0) return; rtnl_lock(); mutex_lock(&wil->mutex); /* Needs adaptation for multiple VIFs * need to go over all VIFs and consider the appropriate * recovery. * recovery because each one can have different iftype. */ switch (wdev->iftype) { case NL80211_IFTYPE_STATION: Loading @@ -490,15 +492,24 @@ static void wil_fw_error_worker(struct work_struct *work) break; case NL80211_IFTYPE_AP: case NL80211_IFTYPE_P2P_GO: wil_info(wil, "No recovery for AP-like interface\n"); /* recovery in these modes is done by upper layers */ if (no_fw_recovery) /* upper layers do recovery */ break; /* silent recovery, upper layers will see disconnect */ __wil_down(wil); __wil_up(wil); mutex_unlock(&wil->mutex); wil_cfg80211_ap_recovery(wil); mutex_lock(&wil->mutex); wil_info(wil, "... completed\n"); break; default: wil_err(wil, "No recovery - unknown interface type %d\n", wdev->iftype); break; } mutex_unlock(&wil->mutex); rtnl_unlock(); } static int wil_find_free_ring(struct wil6210_priv *wil) Loading Loading @@ -989,10 +1000,13 @@ static int wil_target_reset(struct wil6210_priv *wil, int no_flash) wil_dbg_misc(wil, "Resetting \"%s\"...\n", wil->hw_name); if (wil->hw_version < HW_VER_TALYN) { /* Clear MAC link up */ wil_s(wil, RGF_HP_CTRL, BIT(15)); wil_s(wil, RGF_USER_CLKS_CTL_SW_RST_MASK_0, BIT_HPAL_PERST_FROM_PAD); wil_s(wil, RGF_USER_CLKS_CTL_SW_RST_MASK_0, BIT_HPAL_PERST_FROM_PAD); wil_s(wil, RGF_USER_CLKS_CTL_SW_RST_MASK_0, BIT_CAR_PERST_RST); } wil_halt_cpu(wil); Loading Loading @@ -1715,7 +1729,7 @@ int __wil_up(struct wil6210_priv *wil) WIL_RX_RING_SIZE_ORDER_DEFAULT : WIL_RX_RING_SIZE_ORDER_TALYN_DEFAULT; rc = wil->txrx_ops.rx_init(wil, 1 << rx_ring_order); rc = wil->txrx_ops.rx_init(wil, rx_ring_order); if (rc) return rc; Loading
drivers/net/wireless/ath/wil6210/netdev.c +1 −2 Original line number Diff line number Diff line Loading @@ -342,8 +342,7 @@ wil_vif_alloc(struct wil6210_priv *wil, const char *name, ndev->ieee80211_ptr = wdev; ndev->hw_features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_RXHASH; NETIF_F_TSO | NETIF_F_TSO6; ndev->features |= ndev->hw_features; SET_NETDEV_DEV(ndev, wiphy_dev(wdev->wiphy)); Loading
drivers/net/wireless/ath/wil6210/txrx.c +4 −10 Original line number Diff line number Diff line Loading @@ -732,14 +732,6 @@ void wil_netif_rx_any(struct sk_buff *skb, struct net_device *ndev) stats = &wil->sta[cid].stats; if (ndev->features & NETIF_F_RXHASH) /* fake L4 to ensure it won't be re-calculated later * set hash to any non-zero value to activate rps * mechanism, core will be chosen according * to user-level rps configuration. */ skb_set_hash(skb, 1, PKT_HASH_TYPE_L4); skb_orphan(skb); if (security && (wil->txrx_ops.rx_crypto_check(wil, skb) != 0)) { Loading Loading @@ -869,7 +861,7 @@ static void wil_rx_buf_len_init(struct wil6210_priv *wil) } } static int wil_rx_init(struct wil6210_priv *wil, u16 size) static int wil_rx_init(struct wil6210_priv *wil, uint order) { struct wil_ring *vring = &wil->ring_rx; int rc; Loading @@ -883,7 +875,7 @@ static int wil_rx_init(struct wil6210_priv *wil, u16 size) wil_rx_buf_len_init(wil); vring->size = size; vring->size = 1 << order; vring->is_rx = true; rc = wil_vring_alloc(wil, vring); if (rc) Loading Loading @@ -1392,6 +1384,8 @@ static struct wil_ring *wil_find_tx_bcast_2(struct wil6210_priv *wil, wil_dbg_txrx(wil, "BCAST DUP -> ring %d\n", i); wil_set_da_for_vring(wil, skb2, i); wil_tx_ring(wil, vif, v2, skb2); /* successful call to wil_tx_ring takes skb2 ref */ dev_kfree_skb_any(skb2); } else { wil_err(wil, "skb_copy failed\n"); } Loading
drivers/net/wireless/ath/wil6210/txrx_edma.c +8 −3 Original line number Diff line number Diff line Loading @@ -606,9 +606,9 @@ static void wil_rx_buf_len_init_edma(struct wil6210_priv *wil) WIL_MAX_ETH_MTU : WIL_EDMA_RX_BUF_LEN_DEFAULT; } static int wil_rx_init_edma(struct wil6210_priv *wil, u16 desc_ring_size) static int wil_rx_init_edma(struct wil6210_priv *wil, uint desc_ring_order) { u16 status_ring_size; u16 status_ring_size, desc_ring_size = 1 << desc_ring_order; struct wil_ring *ring = &wil->ring_rx; int rc; size_t elem_size = wil->use_compressed_rx_status ? Loading @@ -623,7 +623,12 @@ static int wil_rx_init_edma(struct wil6210_priv *wil, u16 desc_ring_size) "compressed RX status cannot be used with SW reorder\n"); return -EINVAL; } if (wil->rx_status_ring_order <= desc_ring_order) /* make sure sring is larger than desc ring */ wil->rx_status_ring_order = desc_ring_order + 1; if (wil->rx_buff_id_count <= desc_ring_size) /* make sure we will not run out of buff_ids */ wil->rx_buff_id_count = desc_ring_size + 512; if (wil->rx_status_ring_order < WIL_SRING_SIZE_ORDER_MIN || wil->rx_status_ring_order > WIL_SRING_SIZE_ORDER_MAX) wil->rx_status_ring_order = WIL_RX_SRING_SIZE_ORDER_DEFAULT; Loading