mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 21:51:40 +00:00
Including fixes from WiFi and netfilter.
Current release - regressions: - nic: intel: fix old compiler regressions - netfilter: ipset: missing gc cancellations fixed Current release - new code bugs: - netfilter: ctnetlink: fix filtering for zone 0 Previous releases - regressions: - core: fix from address in memcpy_to_iter_csum() - netfilter: nfnetlink_queue: un-break NF_REPEAT - af_unix: fix memory leak for dead unix_(sk)->oob_skb in GC. - devlink: avoid potential loop in devlink_rel_nested_in_notify_work() - iwlwifi: - mvm: fix a battery life regression - fix double-free bug - mac80211: fix waiting for beacons logic - nic: nfp: flower: prevent re-adding mac index for bonded port Previous releases - always broken: - rxrpc: fix generation of serial numbers to skip zero - tipc: check the bearer type before calling tipc_udp_nl_bearer_add() - tunnels: fix out of bounds access when building IPv6 PMTU error - nic: hv_netvsc: register VF in netvsc_probe if NET_DEVICE_REGISTER missed - nic: atlantic: fix DMA mapping for PTP hwts ring Misc: - selftests: more fixes to deal with very slow hosts Signed-off-by: Paolo Abeni <pabeni@redhat.com> -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEEg1AjqC77wbdLX2LbKSR5jcyPE6QFAmXEy4ISHHBhYmVuaUBy ZWRoYXQuY29tAAoJECkkeY3MjxOkd9EQALDZrYm67bPy7TX0+/EXS6wSBe4/ADNN 4tZ+iFnLS/HTKx/YGJmC8pW3VOTgg2+Hko9nfXXQOKXuEPmgMQO8+bYFe1a0ZpPv 1PH7+yq+OCniy16xUG66xv/+pDR5SjN6LuHvFYuCT3AZcmIr3jTXDa+XaCXCXZOu KOdXZ0RqSNe4hsJoU0lRstSwRzHL0UH1XibahQe6OJet6kI2wa9udMXhecZ4xY1i 7FqRpB7b/vEYlxPTeb/h4U0PYchm1G/z0acV1BZ0+/PjuuvULT0gcWlHJm1X4K1l IKGibpet1OobQ7MxUjA0zLjcFoybl2AKNcVaBKQty+uKCUfkUIDLMB1cmLvUiCTi vV2993fvxQrwoZD5Y+LKVaAUjmlyLfkdMwjZ6b7YCmp1ENYeI+liho8xBxGN5eFI WqbYepOeG4QSoHqHPg6ny1xW7fdVPBYpWM3zrJG3h+SkHwPEOI7j/5tDqHA2rU32 +rNpiB0r0/v54ymO3oahB3ttdA/LxWRls8OjRr8h4cUktwUnGtgW3WPmyHVCl4Q2 xV5B2PZnzxIEkU+UPPPUelZh4Q/wtqtS5oKVT92Io3U6MXRfSC37g75C67p7jCsW TLV2RdhNk7RyuaybOC5VszZxKBgenOZNdAZZ6KJotYWzM/NQ+NCIKDBpDksM7Hva hVDYTlZOP+1e =ihj+ -----END PGP SIGNATURE----- Merge tag 'net-6.8-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net Pull networking fixes from Paolo Abeni: "Including fixes from WiFi and netfilter. Current release - regressions: - nic: intel: fix old compiler regressions - netfilter: ipset: missing gc cancellations fixed Current release - new code bugs: - netfilter: ctnetlink: fix filtering for zone 0 Previous releases - regressions: - core: fix from address in memcpy_to_iter_csum() - netfilter: nfnetlink_queue: un-break NF_REPEAT - af_unix: fix memory leak for dead unix_(sk)->oob_skb in GC. - devlink: avoid potential loop in devlink_rel_nested_in_notify_work() - iwlwifi: - mvm: fix a battery life regression - fix double-free bug - mac80211: fix waiting for beacons logic - nic: nfp: flower: prevent re-adding mac index for bonded port Previous releases - always broken: - rxrpc: fix generation of serial numbers to skip zero - tipc: check the bearer type before calling tipc_udp_nl_bearer_add() - tunnels: fix out of bounds access when building IPv6 PMTU error - nic: hv_netvsc: register VF in netvsc_probe if NET_DEVICE_REGISTER missed - nic: atlantic: fix DMA mapping for PTP hwts ring Misc: - selftests: more fixes to deal with very slow hosts" * tag 'net-6.8-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (80 commits) netfilter: nft_set_pipapo: remove scratch_aligned pointer netfilter: nft_set_pipapo: add helper to release pcpu scratch area netfilter: nft_set_pipapo: store index in scratch maps netfilter: nft_set_rbtree: skip end interval element from gc netfilter: nfnetlink_queue: un-break NF_REPEAT netfilter: nf_tables: use timestamp to check for set element timeout netfilter: nft_ct: reject direction for ct id netfilter: ctnetlink: fix filtering for zone 0 s390/qeth: Fix potential loss of L3-IP@ in case of network issues netfilter: ipset: Missing gc cancellations fixed octeontx2-af: Initialize maps. net: ethernet: ti: cpsw: enable mac_managed_pm to fix mdio net: ethernet: ti: cpsw_new: enable mac_managed_pm to fix mdio netfilter: nft_set_pipapo: remove static in nft_pipapo_get() netfilter: nft_compat: restrict match/target protocol to u16 netfilter: nft_compat: reject unused compat flag netfilter: nft_compat: narrow down revision to unsigned 8-bits net: intel: fix old compiler regressions MAINTAINERS: Maintainer change for rds selftests: cmsg_ipv6: repeat the exact packet ...
This commit is contained in:
commit
1f719a2f3f
11
MAINTAINERS
11
MAINTAINERS
@ -4169,14 +4169,14 @@ F: drivers/firmware/broadcom/tee_bnxt_fw.c
|
||||
F: drivers/net/ethernet/broadcom/bnxt/
|
||||
F: include/linux/firmware/broadcom/tee_bnxt_fw.h
|
||||
|
||||
BROADCOM BRCM80211 IEEE802.11n WIRELESS DRIVER
|
||||
M: Arend van Spriel <aspriel@gmail.com>
|
||||
M: Franky Lin <franky.lin@broadcom.com>
|
||||
M: Hante Meuleman <hante.meuleman@broadcom.com>
|
||||
BROADCOM BRCM80211 IEEE802.11 WIRELESS DRIVERS
|
||||
M: Arend van Spriel <arend.vanspriel@broadcom.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: brcm80211@lists.linux.dev
|
||||
L: brcm80211-dev-list.pdl@broadcom.com
|
||||
S: Supported
|
||||
F: drivers/net/wireless/broadcom/brcm80211/
|
||||
F: include/linux/platform_data/brcmfmac.h
|
||||
|
||||
BROADCOM BRCMSTB GPIO DRIVER
|
||||
M: Doug Berger <opendmb@gmail.com>
|
||||
@ -11127,7 +11127,6 @@ S: Supported
|
||||
F: drivers/net/wireless/intel/iwlegacy/
|
||||
|
||||
INTEL WIRELESS WIFI LINK (iwlwifi)
|
||||
M: Gregory Greenman <gregory.greenman@intel.com>
|
||||
M: Miri Korenblit <miriam.rachel.korenblit@intel.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
S: Supported
|
||||
@ -18432,7 +18431,7 @@ S: Supported
|
||||
F: drivers/infiniband/sw/rdmavt
|
||||
|
||||
RDS - RELIABLE DATAGRAM SOCKETS
|
||||
M: Santosh Shilimkar <santosh.shilimkar@oracle.com>
|
||||
M: Allison Henderson <allison.henderson@oracle.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: linux-rdma@vger.kernel.org
|
||||
L: rds-devel@oss.oracle.com (moderated for non-subscribers)
|
||||
|
@ -2930,6 +2930,8 @@ open_card_ubr0(struct idt77252_dev *card)
|
||||
vc->scq = alloc_scq(card, vc->class);
|
||||
if (!vc->scq) {
|
||||
printk("%s: can't get SCQ.\n", card->name);
|
||||
kfree(card->vcs[0]);
|
||||
card->vcs[0] = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -993,7 +993,7 @@ int aq_ptp_ring_alloc(struct aq_nic_s *aq_nic)
|
||||
return 0;
|
||||
|
||||
err_exit_hwts_rx:
|
||||
aq_ring_free(&aq_ptp->hwts_rx);
|
||||
aq_ring_hwts_rx_free(&aq_ptp->hwts_rx);
|
||||
err_exit_ptp_rx:
|
||||
aq_ring_free(&aq_ptp->ptp_rx);
|
||||
err_exit_ptp_tx:
|
||||
@ -1011,7 +1011,7 @@ void aq_ptp_ring_free(struct aq_nic_s *aq_nic)
|
||||
|
||||
aq_ring_free(&aq_ptp->ptp_tx);
|
||||
aq_ring_free(&aq_ptp->ptp_rx);
|
||||
aq_ring_free(&aq_ptp->hwts_rx);
|
||||
aq_ring_hwts_rx_free(&aq_ptp->hwts_rx);
|
||||
|
||||
aq_ptp_skb_ring_release(&aq_ptp->skb_ring);
|
||||
}
|
||||
|
@ -919,6 +919,19 @@ void aq_ring_free(struct aq_ring_s *self)
|
||||
}
|
||||
}
|
||||
|
||||
void aq_ring_hwts_rx_free(struct aq_ring_s *self)
|
||||
{
|
||||
if (!self)
|
||||
return;
|
||||
|
||||
if (self->dx_ring) {
|
||||
dma_free_coherent(aq_nic_get_dev(self->aq_nic),
|
||||
self->size * self->dx_size + AQ_CFG_RXDS_DEF,
|
||||
self->dx_ring, self->dx_ring_pa);
|
||||
self->dx_ring = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int aq_ring_fill_stats_data(struct aq_ring_s *self, u64 *data)
|
||||
{
|
||||
unsigned int count;
|
||||
|
@ -210,6 +210,7 @@ int aq_ring_rx_fill(struct aq_ring_s *self);
|
||||
int aq_ring_hwts_rx_alloc(struct aq_ring_s *self,
|
||||
struct aq_nic_s *aq_nic, unsigned int idx,
|
||||
unsigned int size, unsigned int dx_size);
|
||||
void aq_ring_hwts_rx_free(struct aq_ring_s *self);
|
||||
void aq_ring_hwts_rx_clean(struct aq_ring_s *self, struct aq_nic_s *aq_nic);
|
||||
|
||||
unsigned int aq_ring_fill_stats_data(struct aq_ring_s *self, u64 *data);
|
||||
|
@ -719,17 +719,25 @@ static void tsnep_xdp_xmit_flush(struct tsnep_tx *tx)
|
||||
|
||||
static bool tsnep_xdp_xmit_back(struct tsnep_adapter *adapter,
|
||||
struct xdp_buff *xdp,
|
||||
struct netdev_queue *tx_nq, struct tsnep_tx *tx)
|
||||
struct netdev_queue *tx_nq, struct tsnep_tx *tx,
|
||||
bool zc)
|
||||
{
|
||||
struct xdp_frame *xdpf = xdp_convert_buff_to_frame(xdp);
|
||||
bool xmit;
|
||||
u32 type;
|
||||
|
||||
if (unlikely(!xdpf))
|
||||
return false;
|
||||
|
||||
/* no page pool for zero copy */
|
||||
if (zc)
|
||||
type = TSNEP_TX_TYPE_XDP_NDO;
|
||||
else
|
||||
type = TSNEP_TX_TYPE_XDP_TX;
|
||||
|
||||
__netif_tx_lock(tx_nq, smp_processor_id());
|
||||
|
||||
xmit = tsnep_xdp_xmit_frame_ring(xdpf, tx, TSNEP_TX_TYPE_XDP_TX);
|
||||
xmit = tsnep_xdp_xmit_frame_ring(xdpf, tx, type);
|
||||
|
||||
/* Avoid transmit queue timeout since we share it with the slow path */
|
||||
if (xmit)
|
||||
@ -1273,7 +1281,7 @@ static bool tsnep_xdp_run_prog(struct tsnep_rx *rx, struct bpf_prog *prog,
|
||||
case XDP_PASS:
|
||||
return false;
|
||||
case XDP_TX:
|
||||
if (!tsnep_xdp_xmit_back(rx->adapter, xdp, tx_nq, tx))
|
||||
if (!tsnep_xdp_xmit_back(rx->adapter, xdp, tx_nq, tx, false))
|
||||
goto out_failure;
|
||||
*status |= TSNEP_XDP_TX;
|
||||
return true;
|
||||
@ -1323,7 +1331,7 @@ static bool tsnep_xdp_run_prog_zc(struct tsnep_rx *rx, struct bpf_prog *prog,
|
||||
case XDP_PASS:
|
||||
return false;
|
||||
case XDP_TX:
|
||||
if (!tsnep_xdp_xmit_back(rx->adapter, xdp, tx_nq, tx))
|
||||
if (!tsnep_xdp_xmit_back(rx->adapter, xdp, tx_nq, tx, true))
|
||||
goto out_failure;
|
||||
*status |= TSNEP_XDP_TX;
|
||||
return true;
|
||||
|
@ -43,7 +43,7 @@
|
||||
#define I40E_LLDP_TLV_SUBTYPE_SHIFT 0
|
||||
#define I40E_LLDP_TLV_SUBTYPE_MASK (0xFF << I40E_LLDP_TLV_SUBTYPE_SHIFT)
|
||||
#define I40E_LLDP_TLV_OUI_SHIFT 8
|
||||
#define I40E_LLDP_TLV_OUI_MASK (0xFFFFFF << I40E_LLDP_TLV_OUI_SHIFT)
|
||||
#define I40E_LLDP_TLV_OUI_MASK (0xFFFFFFU << I40E_LLDP_TLV_OUI_SHIFT)
|
||||
|
||||
/* Defines for IEEE ETS TLV */
|
||||
#define I40E_IEEE_ETS_MAXTC_SHIFT 0
|
||||
|
@ -24,7 +24,7 @@
|
||||
#define rd64(a, reg) readq((a)->hw_addr + (reg))
|
||||
|
||||
#define ice_flush(a) rd32((a), GLGEN_STAT)
|
||||
#define ICE_M(m, s) ((m) << (s))
|
||||
#define ICE_M(m, s) ((m ## U) << (s))
|
||||
|
||||
struct ice_dma_mem {
|
||||
void *va;
|
||||
|
@ -1072,7 +1072,7 @@ struct ice_aq_get_set_rss_lut_params {
|
||||
#define ICE_OROM_VER_BUILD_SHIFT 8
|
||||
#define ICE_OROM_VER_BUILD_MASK (0xffff << ICE_OROM_VER_BUILD_SHIFT)
|
||||
#define ICE_OROM_VER_SHIFT 24
|
||||
#define ICE_OROM_VER_MASK (0xff << ICE_OROM_VER_SHIFT)
|
||||
#define ICE_OROM_VER_MASK (0xffU << ICE_OROM_VER_SHIFT)
|
||||
#define ICE_SR_PFA_PTR 0x40
|
||||
#define ICE_SR_1ST_NVM_BANK_PTR 0x42
|
||||
#define ICE_SR_NVM_BANK_SIZE 0x43
|
||||
|
@ -1850,8 +1850,8 @@ void npc_mcam_rsrcs_deinit(struct rvu *rvu)
|
||||
{
|
||||
struct npc_mcam *mcam = &rvu->hw->mcam;
|
||||
|
||||
kfree(mcam->bmap);
|
||||
kfree(mcam->bmap_reverse);
|
||||
bitmap_free(mcam->bmap);
|
||||
bitmap_free(mcam->bmap_reverse);
|
||||
kfree(mcam->entry2pfvf_map);
|
||||
kfree(mcam->cntr2pfvf_map);
|
||||
kfree(mcam->entry2cntr_map);
|
||||
@ -1904,21 +1904,20 @@ int npc_mcam_rsrcs_init(struct rvu *rvu, int blkaddr)
|
||||
mcam->pf_offset = mcam->nixlf_offset + nixlf_count;
|
||||
|
||||
/* Allocate bitmaps for managing MCAM entries */
|
||||
mcam->bmap = kmalloc_array(BITS_TO_LONGS(mcam->bmap_entries),
|
||||
sizeof(long), GFP_KERNEL);
|
||||
mcam->bmap = bitmap_zalloc(mcam->bmap_entries, GFP_KERNEL);
|
||||
if (!mcam->bmap)
|
||||
return -ENOMEM;
|
||||
|
||||
mcam->bmap_reverse = kmalloc_array(BITS_TO_LONGS(mcam->bmap_entries),
|
||||
sizeof(long), GFP_KERNEL);
|
||||
mcam->bmap_reverse = bitmap_zalloc(mcam->bmap_entries, GFP_KERNEL);
|
||||
if (!mcam->bmap_reverse)
|
||||
goto free_bmap;
|
||||
|
||||
mcam->bmap_fcnt = mcam->bmap_entries;
|
||||
|
||||
/* Alloc memory for saving entry to RVU PFFUNC allocation mapping */
|
||||
mcam->entry2pfvf_map = kmalloc_array(mcam->bmap_entries,
|
||||
sizeof(u16), GFP_KERNEL);
|
||||
mcam->entry2pfvf_map = kcalloc(mcam->bmap_entries, sizeof(u16),
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!mcam->entry2pfvf_map)
|
||||
goto free_bmap_reverse;
|
||||
|
||||
@ -1941,21 +1940,21 @@ int npc_mcam_rsrcs_init(struct rvu *rvu, int blkaddr)
|
||||
if (err)
|
||||
goto free_entry_map;
|
||||
|
||||
mcam->cntr2pfvf_map = kmalloc_array(mcam->counters.max,
|
||||
sizeof(u16), GFP_KERNEL);
|
||||
mcam->cntr2pfvf_map = kcalloc(mcam->counters.max, sizeof(u16),
|
||||
GFP_KERNEL);
|
||||
if (!mcam->cntr2pfvf_map)
|
||||
goto free_cntr_bmap;
|
||||
|
||||
/* Alloc memory for MCAM entry to counter mapping and for tracking
|
||||
* counter's reference count.
|
||||
*/
|
||||
mcam->entry2cntr_map = kmalloc_array(mcam->bmap_entries,
|
||||
sizeof(u16), GFP_KERNEL);
|
||||
mcam->entry2cntr_map = kcalloc(mcam->bmap_entries, sizeof(u16),
|
||||
GFP_KERNEL);
|
||||
if (!mcam->entry2cntr_map)
|
||||
goto free_cntr_map;
|
||||
|
||||
mcam->cntr_refcnt = kmalloc_array(mcam->counters.max,
|
||||
sizeof(u16), GFP_KERNEL);
|
||||
mcam->cntr_refcnt = kcalloc(mcam->counters.max, sizeof(u16),
|
||||
GFP_KERNEL);
|
||||
if (!mcam->cntr_refcnt)
|
||||
goto free_entry_cntr_map;
|
||||
|
||||
@ -1988,9 +1987,9 @@ free_cntr_bmap:
|
||||
free_entry_map:
|
||||
kfree(mcam->entry2pfvf_map);
|
||||
free_bmap_reverse:
|
||||
kfree(mcam->bmap_reverse);
|
||||
bitmap_free(mcam->bmap_reverse);
|
||||
free_bmap:
|
||||
kfree(mcam->bmap);
|
||||
bitmap_free(mcam->bmap);
|
||||
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -951,8 +951,11 @@ int otx2_sq_init(struct otx2_nic *pfvf, u16 qidx, u16 sqb_aura)
|
||||
if (pfvf->ptp && qidx < pfvf->hw.tx_queues) {
|
||||
err = qmem_alloc(pfvf->dev, &sq->timestamps, qset->sqe_cnt,
|
||||
sizeof(*sq->timestamps));
|
||||
if (err)
|
||||
if (err) {
|
||||
kfree(sq->sg);
|
||||
sq->sg = NULL;
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
sq->head = 0;
|
||||
@ -968,7 +971,14 @@ int otx2_sq_init(struct otx2_nic *pfvf, u16 qidx, u16 sqb_aura)
|
||||
sq->stats.bytes = 0;
|
||||
sq->stats.pkts = 0;
|
||||
|
||||
return pfvf->hw_ops->sq_aq_init(pfvf, qidx, sqb_aura);
|
||||
err = pfvf->hw_ops->sq_aq_init(pfvf, qidx, sqb_aura);
|
||||
if (err) {
|
||||
kfree(sq->sg);
|
||||
sq->sg = NULL;
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
@ -1084,7 +1084,7 @@ nfp_tunnel_add_shared_mac(struct nfp_app *app, struct net_device *netdev,
|
||||
u16 nfp_mac_idx = 0;
|
||||
|
||||
entry = nfp_tunnel_lookup_offloaded_macs(app, netdev->dev_addr);
|
||||
if (entry && nfp_tunnel_is_mac_idx_global(entry->index)) {
|
||||
if (entry && (nfp_tunnel_is_mac_idx_global(entry->index) || netif_is_lag_port(netdev))) {
|
||||
if (entry->bridge_count ||
|
||||
!nfp_flower_is_supported_bridge(netdev)) {
|
||||
nfp_tunnel_offloaded_macs_inc_ref_and_link(entry,
|
||||
|
@ -2776,6 +2776,7 @@ static void nfp_net_netdev_init(struct nfp_net *nn)
|
||||
case NFP_NFD_VER_NFD3:
|
||||
netdev->netdev_ops = &nfp_nfd3_netdev_ops;
|
||||
netdev->xdp_features |= NETDEV_XDP_ACT_XSK_ZEROCOPY;
|
||||
netdev->xdp_features |= NETDEV_XDP_ACT_REDIRECT;
|
||||
break;
|
||||
case NFP_NFD_VER_NFDK:
|
||||
netdev->netdev_ops = &nfp_nfdk_netdev_ops;
|
||||
|
@ -537,11 +537,13 @@ static int enable_bars(struct nfp6000_pcie *nfp, u16 interface)
|
||||
const u32 barcfg_msix_general =
|
||||
NFP_PCIE_BAR_PCIE2CPP_MapType(
|
||||
NFP_PCIE_BAR_PCIE2CPP_MapType_GENERAL) |
|
||||
NFP_PCIE_BAR_PCIE2CPP_LengthSelect_32BIT;
|
||||
NFP_PCIE_BAR_PCIE2CPP_LengthSelect(
|
||||
NFP_PCIE_BAR_PCIE2CPP_LengthSelect_32BIT);
|
||||
const u32 barcfg_msix_xpb =
|
||||
NFP_PCIE_BAR_PCIE2CPP_MapType(
|
||||
NFP_PCIE_BAR_PCIE2CPP_MapType_BULK) |
|
||||
NFP_PCIE_BAR_PCIE2CPP_LengthSelect_32BIT |
|
||||
NFP_PCIE_BAR_PCIE2CPP_LengthSelect(
|
||||
NFP_PCIE_BAR_PCIE2CPP_LengthSelect_32BIT) |
|
||||
NFP_PCIE_BAR_PCIE2CPP_Target_BaseAddress(
|
||||
NFP_CPP_TARGET_ISLAND_XPB);
|
||||
const u32 barcfg_explicit[4] = {
|
||||
|
@ -59,28 +59,51 @@
|
||||
#undef FRAME_FILTER_DEBUG
|
||||
/* #define FRAME_FILTER_DEBUG */
|
||||
|
||||
struct stmmac_q_tx_stats {
|
||||
u64_stats_t tx_bytes;
|
||||
u64_stats_t tx_set_ic_bit;
|
||||
u64_stats_t tx_tso_frames;
|
||||
u64_stats_t tx_tso_nfrags;
|
||||
};
|
||||
|
||||
struct stmmac_napi_tx_stats {
|
||||
u64_stats_t tx_packets;
|
||||
u64_stats_t tx_pkt_n;
|
||||
u64_stats_t poll;
|
||||
u64_stats_t tx_clean;
|
||||
u64_stats_t tx_set_ic_bit;
|
||||
};
|
||||
|
||||
struct stmmac_txq_stats {
|
||||
u64 tx_bytes;
|
||||
u64 tx_packets;
|
||||
u64 tx_pkt_n;
|
||||
u64 tx_normal_irq_n;
|
||||
u64 napi_poll;
|
||||
u64 tx_clean;
|
||||
u64 tx_set_ic_bit;
|
||||
u64 tx_tso_frames;
|
||||
u64 tx_tso_nfrags;
|
||||
struct u64_stats_sync syncp;
|
||||
/* Updates protected by tx queue lock. */
|
||||
struct u64_stats_sync q_syncp;
|
||||
struct stmmac_q_tx_stats q;
|
||||
|
||||
/* Updates protected by NAPI poll logic. */
|
||||
struct u64_stats_sync napi_syncp;
|
||||
struct stmmac_napi_tx_stats napi;
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
struct stmmac_napi_rx_stats {
|
||||
u64_stats_t rx_bytes;
|
||||
u64_stats_t rx_packets;
|
||||
u64_stats_t rx_pkt_n;
|
||||
u64_stats_t poll;
|
||||
};
|
||||
|
||||
struct stmmac_rxq_stats {
|
||||
u64 rx_bytes;
|
||||
u64 rx_packets;
|
||||
u64 rx_pkt_n;
|
||||
u64 rx_normal_irq_n;
|
||||
u64 napi_poll;
|
||||
struct u64_stats_sync syncp;
|
||||
/* Updates protected by NAPI poll logic. */
|
||||
struct u64_stats_sync napi_syncp;
|
||||
struct stmmac_napi_rx_stats napi;
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
/* Updates on each CPU protected by not allowing nested irqs. */
|
||||
struct stmmac_pcpu_stats {
|
||||
struct u64_stats_sync syncp;
|
||||
u64_stats_t rx_normal_irq_n[MTL_MAX_TX_QUEUES];
|
||||
u64_stats_t tx_normal_irq_n[MTL_MAX_RX_QUEUES];
|
||||
};
|
||||
|
||||
/* Extra statistic and debug information exposed by ethtool */
|
||||
struct stmmac_extra_stats {
|
||||
/* Transmit errors */
|
||||
@ -205,6 +228,7 @@ struct stmmac_extra_stats {
|
||||
/* per queue statistics */
|
||||
struct stmmac_txq_stats txq_stats[MTL_MAX_TX_QUEUES];
|
||||
struct stmmac_rxq_stats rxq_stats[MTL_MAX_RX_QUEUES];
|
||||
struct stmmac_pcpu_stats __percpu *pcpu_stats;
|
||||
unsigned long rx_dropped;
|
||||
unsigned long rx_errors;
|
||||
unsigned long tx_dropped;
|
||||
@ -216,6 +240,7 @@ struct stmmac_safety_stats {
|
||||
unsigned long mac_errors[32];
|
||||
unsigned long mtl_errors[32];
|
||||
unsigned long dma_errors[32];
|
||||
unsigned long dma_dpp_errors[32];
|
||||
};
|
||||
|
||||
/* Number of fields in Safety Stats */
|
||||
|
@ -441,8 +441,7 @@ static int sun8i_dwmac_dma_interrupt(struct stmmac_priv *priv,
|
||||
struct stmmac_extra_stats *x, u32 chan,
|
||||
u32 dir)
|
||||
{
|
||||
struct stmmac_rxq_stats *rxq_stats = &priv->xstats.rxq_stats[chan];
|
||||
struct stmmac_txq_stats *txq_stats = &priv->xstats.txq_stats[chan];
|
||||
struct stmmac_pcpu_stats *stats = this_cpu_ptr(priv->xstats.pcpu_stats);
|
||||
int ret = 0;
|
||||
u32 v;
|
||||
|
||||
@ -455,9 +454,9 @@ static int sun8i_dwmac_dma_interrupt(struct stmmac_priv *priv,
|
||||
|
||||
if (v & EMAC_TX_INT) {
|
||||
ret |= handle_tx;
|
||||
u64_stats_update_begin(&txq_stats->syncp);
|
||||
txq_stats->tx_normal_irq_n++;
|
||||
u64_stats_update_end(&txq_stats->syncp);
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
u64_stats_inc(&stats->tx_normal_irq_n[chan]);
|
||||
u64_stats_update_end(&stats->syncp);
|
||||
}
|
||||
|
||||
if (v & EMAC_TX_DMA_STOP_INT)
|
||||
@ -479,9 +478,9 @@ static int sun8i_dwmac_dma_interrupt(struct stmmac_priv *priv,
|
||||
|
||||
if (v & EMAC_RX_INT) {
|
||||
ret |= handle_rx;
|
||||
u64_stats_update_begin(&rxq_stats->syncp);
|
||||
rxq_stats->rx_normal_irq_n++;
|
||||
u64_stats_update_end(&rxq_stats->syncp);
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
u64_stats_inc(&stats->rx_normal_irq_n[chan]);
|
||||
u64_stats_update_end(&stats->syncp);
|
||||
}
|
||||
|
||||
if (v & EMAC_RX_BUF_UA_INT)
|
||||
|
@ -171,8 +171,7 @@ int dwmac4_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
const struct dwmac4_addrs *dwmac4_addrs = priv->plat->dwmac4_addrs;
|
||||
u32 intr_status = readl(ioaddr + DMA_CHAN_STATUS(dwmac4_addrs, chan));
|
||||
u32 intr_en = readl(ioaddr + DMA_CHAN_INTR_ENA(dwmac4_addrs, chan));
|
||||
struct stmmac_rxq_stats *rxq_stats = &priv->xstats.rxq_stats[chan];
|
||||
struct stmmac_txq_stats *txq_stats = &priv->xstats.txq_stats[chan];
|
||||
struct stmmac_pcpu_stats *stats = this_cpu_ptr(priv->xstats.pcpu_stats);
|
||||
int ret = 0;
|
||||
|
||||
if (dir == DMA_DIR_RX)
|
||||
@ -201,15 +200,15 @@ int dwmac4_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
}
|
||||
/* TX/RX NORMAL interrupts */
|
||||
if (likely(intr_status & DMA_CHAN_STATUS_RI)) {
|
||||
u64_stats_update_begin(&rxq_stats->syncp);
|
||||
rxq_stats->rx_normal_irq_n++;
|
||||
u64_stats_update_end(&rxq_stats->syncp);
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
u64_stats_inc(&stats->rx_normal_irq_n[chan]);
|
||||
u64_stats_update_end(&stats->syncp);
|
||||
ret |= handle_rx;
|
||||
}
|
||||
if (likely(intr_status & DMA_CHAN_STATUS_TI)) {
|
||||
u64_stats_update_begin(&txq_stats->syncp);
|
||||
txq_stats->tx_normal_irq_n++;
|
||||
u64_stats_update_end(&txq_stats->syncp);
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
u64_stats_inc(&stats->tx_normal_irq_n[chan]);
|
||||
u64_stats_update_end(&stats->syncp);
|
||||
ret |= handle_tx;
|
||||
}
|
||||
|
||||
|
@ -162,8 +162,7 @@ static void show_rx_process_state(unsigned int status)
|
||||
int dwmac_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
struct stmmac_extra_stats *x, u32 chan, u32 dir)
|
||||
{
|
||||
struct stmmac_rxq_stats *rxq_stats = &priv->xstats.rxq_stats[chan];
|
||||
struct stmmac_txq_stats *txq_stats = &priv->xstats.txq_stats[chan];
|
||||
struct stmmac_pcpu_stats *stats = this_cpu_ptr(priv->xstats.pcpu_stats);
|
||||
int ret = 0;
|
||||
/* read the status register (CSR5) */
|
||||
u32 intr_status = readl(ioaddr + DMA_STATUS);
|
||||
@ -215,16 +214,16 @@ int dwmac_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,
|
||||
u32 value = readl(ioaddr + DMA_INTR_ENA);
|
||||
/* to schedule NAPI on real RIE event. */
|
||||
if (likely(value & DMA_INTR_ENA_RIE)) {
|
||||
u64_stats_update_begin(&rxq_stats->syncp);
|
||||
rxq_stats->rx_normal_irq_n++;
|
||||
u64_stats_update_end(&rxq_stats->syncp);
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
u64_stats_inc(&stats->rx_normal_irq_n[chan]);
|
||||
u64_stats_update_end(&stats->syncp);
|
||||
ret |= handle_rx;
|
||||
}
|
||||
}
|
||||
if (likely(intr_status & DMA_STATUS_TI)) {
|
||||
u64_stats_update_begin(&txq_stats->syncp);
|
||||
txq_stats->tx_normal_irq_n++;
|
||||
u64_stats_update_end(&txq_stats->syncp);
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
u64_stats_inc(&stats->tx_normal_irq_n[chan]);
|
||||
u64_stats_update_end(&stats->syncp);
|
||||
ret |= handle_tx;
|
||||
}
|
||||
if (unlikely(intr_status & DMA_STATUS_ERI))
|
||||
|
@ -303,6 +303,8 @@
|
||||
#define XGMAC_RXCEIE BIT(4)
|
||||
#define XGMAC_TXCEIE BIT(0)
|
||||
#define XGMAC_MTL_ECC_INT_STATUS 0x000010cc
|
||||
#define XGMAC_MTL_DPP_CONTROL 0x000010e0
|
||||
#define XGMAC_DPP_DISABLE BIT(0)
|
||||
#define XGMAC_MTL_TXQ_OPMODE(x) (0x00001100 + (0x80 * (x)))
|
||||
#define XGMAC_TQS GENMASK(25, 16)
|
||||
#define XGMAC_TQS_SHIFT 16
|
||||
@ -385,6 +387,7 @@
|
||||
#define XGMAC_DCEIE BIT(1)
|
||||
#define XGMAC_TCEIE BIT(0)
|
||||
#define XGMAC_DMA_ECC_INT_STATUS 0x0000306c
|
||||
#define XGMAC_DMA_DPP_INT_STATUS 0x00003074
|
||||
#define XGMAC_DMA_CH_CONTROL(x) (0x00003100 + (0x80 * (x)))
|
||||
#define XGMAC_SPH BIT(24)
|
||||
#define XGMAC_PBLx8 BIT(16)
|
||||
|
@ -830,6 +830,43 @@ static const struct dwxgmac3_error_desc dwxgmac3_dma_errors[32]= {
|
||||
{ false, "UNKNOWN", "Unknown Error" }, /* 31 */
|
||||
};
|
||||
|
||||
static const char * const dpp_rx_err = "Read Rx Descriptor Parity checker Error";
|
||||
static const char * const dpp_tx_err = "Read Tx Descriptor Parity checker Error";
|
||||
static const struct dwxgmac3_error_desc dwxgmac3_dma_dpp_errors[32] = {
|
||||
{ true, "TDPES0", dpp_tx_err },
|
||||
{ true, "TDPES1", dpp_tx_err },
|
||||
{ true, "TDPES2", dpp_tx_err },
|
||||
{ true, "TDPES3", dpp_tx_err },
|
||||
{ true, "TDPES4", dpp_tx_err },
|
||||
{ true, "TDPES5", dpp_tx_err },
|
||||
{ true, "TDPES6", dpp_tx_err },
|
||||
{ true, "TDPES7", dpp_tx_err },
|
||||
{ true, "TDPES8", dpp_tx_err },
|
||||
{ true, "TDPES9", dpp_tx_err },
|
||||
{ true, "TDPES10", dpp_tx_err },
|
||||
{ true, "TDPES11", dpp_tx_err },
|
||||
{ true, "TDPES12", dpp_tx_err },
|
||||
{ true, "TDPES13", dpp_tx_err },
|
||||
{ true, "TDPES14", dpp_tx_err },
|
||||
{ true, "TDPES15", dpp_tx_err },
|
||||
{ true, "RDPES0", dpp_rx_err },
|
||||
{ true, "RDPES1", dpp_rx_err },
|
||||
{ true, "RDPES2", dpp_rx_err },
|
||||
{ true, "RDPES3", dpp_rx_err },
|
||||
{ true, "RDPES4", dpp_rx_err },
|
||||
{ true, "RDPES5", dpp_rx_err },
|
||||
{ true, "RDPES6", dpp_rx_err },
|
||||
{ true, "RDPES7", dpp_rx_err },
|
||||
{ true, "RDPES8", dpp_rx_err },
|
||||
{ true, "RDPES9", dpp_rx_err },
|
||||
{ true, "RDPES10", dpp_rx_err },
|
||||
{ true, "RDPES11", dpp_rx_err },
|
||||
{ true, "RDPES12", dpp_rx_err },
|
||||
{ true, "RDPES13", dpp_rx_err },
|
||||
{ true, "RDPES14", dpp_rx_err },
|
||||
{ true, "RDPES15", dpp_rx_err },
|
||||
};
|
||||
|
||||
static void dwxgmac3_handle_dma_err(struct net_device *ndev,
|
||||
void __iomem *ioaddr, bool correctable,
|
||||
struct stmmac_safety_stats *stats)
|
||||
@ -841,6 +878,13 @@ static void dwxgmac3_handle_dma_err(struct net_device *ndev,
|
||||
|
||||
dwxgmac3_log_error(ndev, value, correctable, "DMA",
|
||||
dwxgmac3_dma_errors, STAT_OFF(dma_errors), stats);
|
||||
|
||||
value = readl(ioaddr + XGMAC_DMA_DPP_INT_STATUS);
|
||||
writel(value, ioaddr + XGMAC_DMA_DPP_INT_STATUS);
|
||||
|
||||
dwxgmac3_log_error(ndev, value, false, "DMA_DPP",
|
||||
dwxgmac3_dma_dpp_errors,
|
||||
STAT_OFF(dma_dpp_errors), stats);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -881,6 +925,12 @@ dwxgmac3_safety_feat_config(void __iomem *ioaddr, unsigned int asp,
|
||||
value |= XGMAC_TMOUTEN; /* FSM Timeout Feature */
|
||||
writel(value, ioaddr + XGMAC_MAC_FSM_CONTROL);
|
||||
|
||||
/* 5. Enable Data Path Parity Protection */
|
||||
value = readl(ioaddr + XGMAC_MTL_DPP_CONTROL);
|
||||
/* already enabled by default, explicit enable it again */
|
||||
value &= ~XGMAC_DPP_DISABLE;
|
||||
writel(value, ioaddr + XGMAC_MTL_DPP_CONTROL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -914,7 +964,11 @@ static int dwxgmac3_safety_feat_irq_status(struct net_device *ndev,
|
||||
ret |= !corr;
|
||||
}
|
||||
|
||||
err = dma & (XGMAC_DEUIS | XGMAC_DECIS);
|
||||
/* DMA_DPP_Interrupt_Status is indicated by MCSIS bit in
|
||||
* DMA_Safety_Interrupt_Status, so we handle DMA Data Path
|
||||
* Parity Errors here
|
||||
*/
|
||||
err = dma & (XGMAC_DEUIS | XGMAC_DECIS | XGMAC_MCSIS);
|
||||
corr = dma & XGMAC_DECIS;
|
||||
if (err) {
|
||||
dwxgmac3_handle_dma_err(ndev, ioaddr, corr, stats);
|
||||
@ -930,6 +984,7 @@ static const struct dwxgmac3_error {
|
||||
{ dwxgmac3_mac_errors },
|
||||
{ dwxgmac3_mtl_errors },
|
||||
{ dwxgmac3_dma_errors },
|
||||
{ dwxgmac3_dma_dpp_errors },
|
||||
};
|
||||
|
||||
static int dwxgmac3_safety_feat_dump(struct stmmac_safety_stats *stats,
|
||||
|
@ -337,8 +337,7 @@ static int dwxgmac2_dma_interrupt(struct stmmac_priv *priv,
|
||||
struct stmmac_extra_stats *x, u32 chan,
|
||||
u32 dir)
|
||||
{
|
||||
struct stmmac_rxq_stats *rxq_stats = &priv->xstats.rxq_stats[chan];
|
||||
struct stmmac_txq_stats *txq_stats = &priv->xstats.txq_stats[chan];
|
||||
struct stmmac_pcpu_stats *stats = this_cpu_ptr(priv->xstats.pcpu_stats);
|
||||
u32 intr_status = readl(ioaddr + XGMAC_DMA_CH_STATUS(chan));
|
||||
u32 intr_en = readl(ioaddr + XGMAC_DMA_CH_INT_EN(chan));
|
||||
int ret = 0;
|
||||
@ -367,15 +366,15 @@ static int dwxgmac2_dma_interrupt(struct stmmac_priv *priv,
|
||||
/* TX/RX NORMAL interrupts */
|
||||
if (likely(intr_status & XGMAC_NIS)) {
|
||||
if (likely(intr_status & XGMAC_RI)) {
|
||||
u64_stats_update_begin(&rxq_stats->syncp);
|
||||
rxq_stats->rx_normal_irq_n++;
|
||||
u64_stats_update_end(&rxq_stats->syncp);
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
u64_stats_inc(&stats->rx_normal_irq_n[chan]);
|
||||
u64_stats_update_end(&stats->syncp);
|
||||
ret |= handle_rx;
|
||||
}
|
||||
if (likely(intr_status & (XGMAC_TI | XGMAC_TBU))) {
|
||||
u64_stats_update_begin(&txq_stats->syncp);
|
||||
txq_stats->tx_normal_irq_n++;
|
||||
u64_stats_update_end(&txq_stats->syncp);
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
u64_stats_inc(&stats->tx_normal_irq_n[chan]);
|
||||
u64_stats_update_end(&stats->syncp);
|
||||
ret |= handle_tx;
|
||||
}
|
||||
}
|
||||
|
@ -549,44 +549,79 @@ stmmac_set_pauseparam(struct net_device *netdev,
|
||||
}
|
||||
}
|
||||
|
||||
static u64 stmmac_get_rx_normal_irq_n(struct stmmac_priv *priv, int q)
|
||||
{
|
||||
u64 total;
|
||||
int cpu;
|
||||
|
||||
total = 0;
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct stmmac_pcpu_stats *pcpu;
|
||||
unsigned int start;
|
||||
u64 irq_n;
|
||||
|
||||
pcpu = per_cpu_ptr(priv->xstats.pcpu_stats, cpu);
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&pcpu->syncp);
|
||||
irq_n = u64_stats_read(&pcpu->rx_normal_irq_n[q]);
|
||||
} while (u64_stats_fetch_retry(&pcpu->syncp, start));
|
||||
total += irq_n;
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
static u64 stmmac_get_tx_normal_irq_n(struct stmmac_priv *priv, int q)
|
||||
{
|
||||
u64 total;
|
||||
int cpu;
|
||||
|
||||
total = 0;
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct stmmac_pcpu_stats *pcpu;
|
||||
unsigned int start;
|
||||
u64 irq_n;
|
||||
|
||||
pcpu = per_cpu_ptr(priv->xstats.pcpu_stats, cpu);
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&pcpu->syncp);
|
||||
irq_n = u64_stats_read(&pcpu->tx_normal_irq_n[q]);
|
||||
} while (u64_stats_fetch_retry(&pcpu->syncp, start));
|
||||
total += irq_n;
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
static void stmmac_get_per_qstats(struct stmmac_priv *priv, u64 *data)
|
||||
{
|
||||
u32 tx_cnt = priv->plat->tx_queues_to_use;
|
||||
u32 rx_cnt = priv->plat->rx_queues_to_use;
|
||||
unsigned int start;
|
||||
int q, stat;
|
||||
char *p;
|
||||
int q;
|
||||
|
||||
for (q = 0; q < tx_cnt; q++) {
|
||||
struct stmmac_txq_stats *txq_stats = &priv->xstats.txq_stats[q];
|
||||
struct stmmac_txq_stats snapshot;
|
||||
u64 pkt_n;
|
||||
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&txq_stats->syncp);
|
||||
snapshot = *txq_stats;
|
||||
} while (u64_stats_fetch_retry(&txq_stats->syncp, start));
|
||||
start = u64_stats_fetch_begin(&txq_stats->napi_syncp);
|
||||
pkt_n = u64_stats_read(&txq_stats->napi.tx_pkt_n);
|
||||
} while (u64_stats_fetch_retry(&txq_stats->napi_syncp, start));
|
||||
|
||||
p = (char *)&snapshot + offsetof(struct stmmac_txq_stats, tx_pkt_n);
|
||||
for (stat = 0; stat < STMMAC_TXQ_STATS; stat++) {
|
||||
*data++ = (*(u64 *)p);
|
||||
p += sizeof(u64);
|
||||
}
|
||||
*data++ = pkt_n;
|
||||
*data++ = stmmac_get_tx_normal_irq_n(priv, q);
|
||||
}
|
||||
|
||||
for (q = 0; q < rx_cnt; q++) {
|
||||
struct stmmac_rxq_stats *rxq_stats = &priv->xstats.rxq_stats[q];
|
||||
struct stmmac_rxq_stats snapshot;
|
||||
u64 pkt_n;
|
||||
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&rxq_stats->syncp);
|
||||
snapshot = *rxq_stats;
|
||||
} while (u64_stats_fetch_retry(&rxq_stats->syncp, start));
|
||||
start = u64_stats_fetch_begin(&rxq_stats->napi_syncp);
|
||||
pkt_n = u64_stats_read(&rxq_stats->napi.rx_pkt_n);
|
||||
} while (u64_stats_fetch_retry(&rxq_stats->napi_syncp, start));
|
||||
|
||||
p = (char *)&snapshot + offsetof(struct stmmac_rxq_stats, rx_pkt_n);
|
||||
for (stat = 0; stat < STMMAC_RXQ_STATS; stat++) {
|
||||
*data++ = (*(u64 *)p);
|
||||
p += sizeof(u64);
|
||||
}
|
||||
*data++ = pkt_n;
|
||||
*data++ = stmmac_get_rx_normal_irq_n(priv, q);
|
||||
}
|
||||
}
|
||||
|
||||
@ -645,39 +680,49 @@ static void stmmac_get_ethtool_stats(struct net_device *dev,
|
||||
pos = j;
|
||||
for (i = 0; i < rx_queues_count; i++) {
|
||||
struct stmmac_rxq_stats *rxq_stats = &priv->xstats.rxq_stats[i];
|
||||
struct stmmac_rxq_stats snapshot;
|
||||
struct stmmac_napi_rx_stats snapshot;
|
||||
u64 n_irq;
|
||||
|
||||
j = pos;
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&rxq_stats->syncp);
|
||||
snapshot = *rxq_stats;
|
||||
} while (u64_stats_fetch_retry(&rxq_stats->syncp, start));
|
||||
start = u64_stats_fetch_begin(&rxq_stats->napi_syncp);
|
||||
snapshot = rxq_stats->napi;
|
||||
} while (u64_stats_fetch_retry(&rxq_stats->napi_syncp, start));
|
||||
|
||||
data[j++] += snapshot.rx_pkt_n;
|
||||
data[j++] += snapshot.rx_normal_irq_n;
|
||||
normal_irq_n += snapshot.rx_normal_irq_n;
|
||||
napi_poll += snapshot.napi_poll;
|
||||
data[j++] += u64_stats_read(&snapshot.rx_pkt_n);
|
||||
n_irq = stmmac_get_rx_normal_irq_n(priv, i);
|
||||
data[j++] += n_irq;
|
||||
normal_irq_n += n_irq;
|
||||
napi_poll += u64_stats_read(&snapshot.poll);
|
||||
}
|
||||
|
||||
pos = j;
|
||||
for (i = 0; i < tx_queues_count; i++) {
|
||||
struct stmmac_txq_stats *txq_stats = &priv->xstats.txq_stats[i];
|
||||
struct stmmac_txq_stats snapshot;
|
||||
struct stmmac_napi_tx_stats napi_snapshot;
|
||||
struct stmmac_q_tx_stats q_snapshot;
|
||||
u64 n_irq;
|
||||
|
||||
j = pos;
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&txq_stats->syncp);
|
||||
snapshot = *txq_stats;
|
||||
} while (u64_stats_fetch_retry(&txq_stats->syncp, start));
|
||||
start = u64_stats_fetch_begin(&txq_stats->q_syncp);
|
||||
q_snapshot = txq_stats->q;
|
||||
} while (u64_stats_fetch_retry(&txq_stats->q_syncp, start));
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&txq_stats->napi_syncp);
|
||||
napi_snapshot = txq_stats->napi;
|
||||
} while (u64_stats_fetch_retry(&txq_stats->napi_syncp, start));
|
||||
|
||||
data[j++] += snapshot.tx_pkt_n;
|
||||
data[j++] += snapshot.tx_normal_irq_n;
|
||||
normal_irq_n += snapshot.tx_normal_irq_n;
|
||||
data[j++] += snapshot.tx_clean;
|
||||
data[j++] += snapshot.tx_set_ic_bit;
|
||||
data[j++] += snapshot.tx_tso_frames;
|
||||
data[j++] += snapshot.tx_tso_nfrags;
|
||||
napi_poll += snapshot.napi_poll;
|
||||
data[j++] += u64_stats_read(&napi_snapshot.tx_pkt_n);
|
||||
n_irq = stmmac_get_tx_normal_irq_n(priv, i);
|
||||
data[j++] += n_irq;
|
||||
normal_irq_n += n_irq;
|
||||
data[j++] += u64_stats_read(&napi_snapshot.tx_clean);
|
||||
data[j++] += u64_stats_read(&q_snapshot.tx_set_ic_bit) +
|
||||
u64_stats_read(&napi_snapshot.tx_set_ic_bit);
|
||||
data[j++] += u64_stats_read(&q_snapshot.tx_tso_frames);
|
||||
data[j++] += u64_stats_read(&q_snapshot.tx_tso_nfrags);
|
||||
napi_poll += u64_stats_read(&napi_snapshot.poll);
|
||||
}
|
||||
normal_irq_n += priv->xstats.rx_early_irq;
|
||||
data[j++] = normal_irq_n;
|
||||
|
@ -2482,7 +2482,6 @@ static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, u32 queue, u32 budget)
|
||||
struct xdp_desc xdp_desc;
|
||||
bool work_done = true;
|
||||
u32 tx_set_ic_bit = 0;
|
||||
unsigned long flags;
|
||||
|
||||
/* Avoids TX time-out as we are sharing with slow path */
|
||||
txq_trans_cond_update(nq);
|
||||
@ -2566,9 +2565,9 @@ static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, u32 queue, u32 budget)
|
||||
tx_q->cur_tx = STMMAC_GET_ENTRY(tx_q->cur_tx, priv->dma_conf.dma_tx_size);
|
||||
entry = tx_q->cur_tx;
|
||||
}
|
||||
flags = u64_stats_update_begin_irqsave(&txq_stats->syncp);
|
||||
txq_stats->tx_set_ic_bit += tx_set_ic_bit;
|
||||
u64_stats_update_end_irqrestore(&txq_stats->syncp, flags);
|
||||
u64_stats_update_begin(&txq_stats->napi_syncp);
|
||||
u64_stats_add(&txq_stats->napi.tx_set_ic_bit, tx_set_ic_bit);
|
||||
u64_stats_update_end(&txq_stats->napi_syncp);
|
||||
|
||||
if (tx_desc) {
|
||||
stmmac_flush_tx_descriptors(priv, queue);
|
||||
@ -2616,7 +2615,6 @@ static int stmmac_tx_clean(struct stmmac_priv *priv, int budget, u32 queue,
|
||||
unsigned int bytes_compl = 0, pkts_compl = 0;
|
||||
unsigned int entry, xmits = 0, count = 0;
|
||||
u32 tx_packets = 0, tx_errors = 0;
|
||||
unsigned long flags;
|
||||
|
||||
__netif_tx_lock_bh(netdev_get_tx_queue(priv->dev, queue));
|
||||
|
||||
@ -2782,11 +2780,11 @@ static int stmmac_tx_clean(struct stmmac_priv *priv, int budget, u32 queue,
|
||||
if (tx_q->dirty_tx != tx_q->cur_tx)
|
||||
*pending_packets = true;
|
||||
|
||||
flags = u64_stats_update_begin_irqsave(&txq_stats->syncp);
|
||||
txq_stats->tx_packets += tx_packets;
|
||||
txq_stats->tx_pkt_n += tx_packets;
|
||||
txq_stats->tx_clean++;
|
||||
u64_stats_update_end_irqrestore(&txq_stats->syncp, flags);
|
||||
u64_stats_update_begin(&txq_stats->napi_syncp);
|
||||
u64_stats_add(&txq_stats->napi.tx_packets, tx_packets);
|
||||
u64_stats_add(&txq_stats->napi.tx_pkt_n, tx_packets);
|
||||
u64_stats_inc(&txq_stats->napi.tx_clean);
|
||||
u64_stats_update_end(&txq_stats->napi_syncp);
|
||||
|
||||
priv->xstats.tx_errors += tx_errors;
|
||||
|
||||
@ -4213,7 +4211,6 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
struct stmmac_tx_queue *tx_q;
|
||||
bool has_vlan, set_ic;
|
||||
u8 proto_hdr_len, hdr;
|
||||
unsigned long flags;
|
||||
u32 pay_len, mss;
|
||||
dma_addr_t des;
|
||||
int i;
|
||||
@ -4378,13 +4375,13 @@ static netdev_tx_t stmmac_tso_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
netif_tx_stop_queue(netdev_get_tx_queue(priv->dev, queue));
|
||||
}
|
||||
|
||||
flags = u64_stats_update_begin_irqsave(&txq_stats->syncp);
|
||||
txq_stats->tx_bytes += skb->len;
|
||||
txq_stats->tx_tso_frames++;
|
||||
txq_stats->tx_tso_nfrags += nfrags;
|
||||
u64_stats_update_begin(&txq_stats->q_syncp);
|
||||
u64_stats_add(&txq_stats->q.tx_bytes, skb->len);
|
||||
u64_stats_inc(&txq_stats->q.tx_tso_frames);
|
||||
u64_stats_add(&txq_stats->q.tx_tso_nfrags, nfrags);
|
||||
if (set_ic)
|
||||
txq_stats->tx_set_ic_bit++;
|
||||
u64_stats_update_end_irqrestore(&txq_stats->syncp, flags);
|
||||
u64_stats_inc(&txq_stats->q.tx_set_ic_bit);
|
||||
u64_stats_update_end(&txq_stats->q_syncp);
|
||||
|
||||
if (priv->sarc_type)
|
||||
stmmac_set_desc_sarc(priv, first, priv->sarc_type);
|
||||
@ -4483,7 +4480,6 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
struct stmmac_tx_queue *tx_q;
|
||||
bool has_vlan, set_ic;
|
||||
int entry, first_tx;
|
||||
unsigned long flags;
|
||||
dma_addr_t des;
|
||||
|
||||
tx_q = &priv->dma_conf.tx_queue[queue];
|
||||
@ -4653,11 +4649,11 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
netif_tx_stop_queue(netdev_get_tx_queue(priv->dev, queue));
|
||||
}
|
||||
|
||||
flags = u64_stats_update_begin_irqsave(&txq_stats->syncp);
|
||||
txq_stats->tx_bytes += skb->len;
|
||||
u64_stats_update_begin(&txq_stats->q_syncp);
|
||||
u64_stats_add(&txq_stats->q.tx_bytes, skb->len);
|
||||
if (set_ic)
|
||||
txq_stats->tx_set_ic_bit++;
|
||||
u64_stats_update_end_irqrestore(&txq_stats->syncp, flags);
|
||||
u64_stats_inc(&txq_stats->q.tx_set_ic_bit);
|
||||
u64_stats_update_end(&txq_stats->q_syncp);
|
||||
|
||||
if (priv->sarc_type)
|
||||
stmmac_set_desc_sarc(priv, first, priv->sarc_type);
|
||||
@ -4921,12 +4917,11 @@ static int stmmac_xdp_xmit_xdpf(struct stmmac_priv *priv, int queue,
|
||||
set_ic = false;
|
||||
|
||||
if (set_ic) {
|
||||
unsigned long flags;
|
||||
tx_q->tx_count_frames = 0;
|
||||
stmmac_set_tx_ic(priv, tx_desc);
|
||||
flags = u64_stats_update_begin_irqsave(&txq_stats->syncp);
|
||||
txq_stats->tx_set_ic_bit++;
|
||||
u64_stats_update_end_irqrestore(&txq_stats->syncp, flags);
|
||||
u64_stats_update_begin(&txq_stats->q_syncp);
|
||||
u64_stats_inc(&txq_stats->q.tx_set_ic_bit);
|
||||
u64_stats_update_end(&txq_stats->q_syncp);
|
||||
}
|
||||
|
||||
stmmac_enable_dma_transmission(priv, priv->ioaddr);
|
||||
@ -5076,7 +5071,6 @@ static void stmmac_dispatch_skb_zc(struct stmmac_priv *priv, u32 queue,
|
||||
unsigned int len = xdp->data_end - xdp->data;
|
||||
enum pkt_hash_types hash_type;
|
||||
int coe = priv->hw->rx_csum;
|
||||
unsigned long flags;
|
||||
struct sk_buff *skb;
|
||||
u32 hash;
|
||||
|
||||
@ -5106,10 +5100,10 @@ static void stmmac_dispatch_skb_zc(struct stmmac_priv *priv, u32 queue,
|
||||
skb_record_rx_queue(skb, queue);
|
||||
napi_gro_receive(&ch->rxtx_napi, skb);
|
||||
|
||||
flags = u64_stats_update_begin_irqsave(&rxq_stats->syncp);
|
||||
rxq_stats->rx_pkt_n++;
|
||||
rxq_stats->rx_bytes += len;
|
||||
u64_stats_update_end_irqrestore(&rxq_stats->syncp, flags);
|
||||
u64_stats_update_begin(&rxq_stats->napi_syncp);
|
||||
u64_stats_inc(&rxq_stats->napi.rx_pkt_n);
|
||||
u64_stats_add(&rxq_stats->napi.rx_bytes, len);
|
||||
u64_stats_update_end(&rxq_stats->napi_syncp);
|
||||
}
|
||||
|
||||
static bool stmmac_rx_refill_zc(struct stmmac_priv *priv, u32 queue, u32 budget)
|
||||
@ -5191,7 +5185,6 @@ static int stmmac_rx_zc(struct stmmac_priv *priv, int limit, u32 queue)
|
||||
unsigned int desc_size;
|
||||
struct bpf_prog *prog;
|
||||
bool failure = false;
|
||||
unsigned long flags;
|
||||
int xdp_status = 0;
|
||||
int status = 0;
|
||||
|
||||
@ -5346,9 +5339,9 @@ read_again:
|
||||
|
||||
stmmac_finalize_xdp_rx(priv, xdp_status);
|
||||
|
||||
flags = u64_stats_update_begin_irqsave(&rxq_stats->syncp);
|
||||
rxq_stats->rx_pkt_n += count;
|
||||
u64_stats_update_end_irqrestore(&rxq_stats->syncp, flags);
|
||||
u64_stats_update_begin(&rxq_stats->napi_syncp);
|
||||
u64_stats_add(&rxq_stats->napi.rx_pkt_n, count);
|
||||
u64_stats_update_end(&rxq_stats->napi_syncp);
|
||||
|
||||
priv->xstats.rx_dropped += rx_dropped;
|
||||
priv->xstats.rx_errors += rx_errors;
|
||||
@ -5386,7 +5379,6 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue)
|
||||
unsigned int desc_size;
|
||||
struct sk_buff *skb = NULL;
|
||||
struct stmmac_xdp_buff ctx;
|
||||
unsigned long flags;
|
||||
int xdp_status = 0;
|
||||
int buf_sz;
|
||||
|
||||
@ -5646,11 +5638,11 @@ drain_data:
|
||||
|
||||
stmmac_rx_refill(priv, queue);
|
||||
|
||||
flags = u64_stats_update_begin_irqsave(&rxq_stats->syncp);
|
||||
rxq_stats->rx_packets += rx_packets;
|
||||
rxq_stats->rx_bytes += rx_bytes;
|
||||
rxq_stats->rx_pkt_n += count;
|
||||
u64_stats_update_end_irqrestore(&rxq_stats->syncp, flags);
|
||||
u64_stats_update_begin(&rxq_stats->napi_syncp);
|
||||
u64_stats_add(&rxq_stats->napi.rx_packets, rx_packets);
|
||||
u64_stats_add(&rxq_stats->napi.rx_bytes, rx_bytes);
|
||||
u64_stats_add(&rxq_stats->napi.rx_pkt_n, count);
|
||||
u64_stats_update_end(&rxq_stats->napi_syncp);
|
||||
|
||||
priv->xstats.rx_dropped += rx_dropped;
|
||||
priv->xstats.rx_errors += rx_errors;
|
||||
@ -5665,13 +5657,12 @@ static int stmmac_napi_poll_rx(struct napi_struct *napi, int budget)
|
||||
struct stmmac_priv *priv = ch->priv_data;
|
||||
struct stmmac_rxq_stats *rxq_stats;
|
||||
u32 chan = ch->index;
|
||||
unsigned long flags;
|
||||
int work_done;
|
||||
|
||||
rxq_stats = &priv->xstats.rxq_stats[chan];
|
||||
flags = u64_stats_update_begin_irqsave(&rxq_stats->syncp);
|
||||
rxq_stats->napi_poll++;
|
||||
u64_stats_update_end_irqrestore(&rxq_stats->syncp, flags);
|
||||
u64_stats_update_begin(&rxq_stats->napi_syncp);
|
||||
u64_stats_inc(&rxq_stats->napi.poll);
|
||||
u64_stats_update_end(&rxq_stats->napi_syncp);
|
||||
|
||||
work_done = stmmac_rx(priv, budget, chan);
|
||||
if (work_done < budget && napi_complete_done(napi, work_done)) {
|
||||
@ -5693,13 +5684,12 @@ static int stmmac_napi_poll_tx(struct napi_struct *napi, int budget)
|
||||
struct stmmac_txq_stats *txq_stats;
|
||||
bool pending_packets = false;
|
||||
u32 chan = ch->index;
|
||||
unsigned long flags;
|
||||
int work_done;
|
||||
|
||||
txq_stats = &priv->xstats.txq_stats[chan];
|
||||
flags = u64_stats_update_begin_irqsave(&txq_stats->syncp);
|
||||
txq_stats->napi_poll++;
|
||||
u64_stats_update_end_irqrestore(&txq_stats->syncp, flags);
|
||||
u64_stats_update_begin(&txq_stats->napi_syncp);
|
||||
u64_stats_inc(&txq_stats->napi.poll);
|
||||
u64_stats_update_end(&txq_stats->napi_syncp);
|
||||
|
||||
work_done = stmmac_tx_clean(priv, budget, chan, &pending_packets);
|
||||
work_done = min(work_done, budget);
|
||||
@ -5729,17 +5719,16 @@ static int stmmac_napi_poll_rxtx(struct napi_struct *napi, int budget)
|
||||
struct stmmac_rxq_stats *rxq_stats;
|
||||
struct stmmac_txq_stats *txq_stats;
|
||||
u32 chan = ch->index;
|
||||
unsigned long flags;
|
||||
|
||||
rxq_stats = &priv->xstats.rxq_stats[chan];
|
||||
flags = u64_stats_update_begin_irqsave(&rxq_stats->syncp);
|
||||
rxq_stats->napi_poll++;
|
||||
u64_stats_update_end_irqrestore(&rxq_stats->syncp, flags);
|
||||
u64_stats_update_begin(&rxq_stats->napi_syncp);
|
||||
u64_stats_inc(&rxq_stats->napi.poll);
|
||||
u64_stats_update_end(&rxq_stats->napi_syncp);
|
||||
|
||||
txq_stats = &priv->xstats.txq_stats[chan];
|
||||
flags = u64_stats_update_begin_irqsave(&txq_stats->syncp);
|
||||
txq_stats->napi_poll++;
|
||||
u64_stats_update_end_irqrestore(&txq_stats->syncp, flags);
|
||||
u64_stats_update_begin(&txq_stats->napi_syncp);
|
||||
u64_stats_inc(&txq_stats->napi.poll);
|
||||
u64_stats_update_end(&txq_stats->napi_syncp);
|
||||
|
||||
tx_done = stmmac_tx_clean(priv, budget, chan, &tx_pending_packets);
|
||||
tx_done = min(tx_done, budget);
|
||||
@ -7065,10 +7054,13 @@ static void stmmac_get_stats64(struct net_device *dev, struct rtnl_link_stats64
|
||||
u64 tx_bytes;
|
||||
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&txq_stats->syncp);
|
||||
tx_packets = txq_stats->tx_packets;
|
||||
tx_bytes = txq_stats->tx_bytes;
|
||||
} while (u64_stats_fetch_retry(&txq_stats->syncp, start));
|
||||
start = u64_stats_fetch_begin(&txq_stats->q_syncp);
|
||||
tx_bytes = u64_stats_read(&txq_stats->q.tx_bytes);
|
||||
} while (u64_stats_fetch_retry(&txq_stats->q_syncp, start));
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&txq_stats->napi_syncp);
|
||||
tx_packets = u64_stats_read(&txq_stats->napi.tx_packets);
|
||||
} while (u64_stats_fetch_retry(&txq_stats->napi_syncp, start));
|
||||
|
||||
stats->tx_packets += tx_packets;
|
||||
stats->tx_bytes += tx_bytes;
|
||||
@ -7080,10 +7072,10 @@ static void stmmac_get_stats64(struct net_device *dev, struct rtnl_link_stats64
|
||||
u64 rx_bytes;
|
||||
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&rxq_stats->syncp);
|
||||
rx_packets = rxq_stats->rx_packets;
|
||||
rx_bytes = rxq_stats->rx_bytes;
|
||||
} while (u64_stats_fetch_retry(&rxq_stats->syncp, start));
|
||||
start = u64_stats_fetch_begin(&rxq_stats->napi_syncp);
|
||||
rx_packets = u64_stats_read(&rxq_stats->napi.rx_packets);
|
||||
rx_bytes = u64_stats_read(&rxq_stats->napi.rx_bytes);
|
||||
} while (u64_stats_fetch_retry(&rxq_stats->napi_syncp, start));
|
||||
|
||||
stats->rx_packets += rx_packets;
|
||||
stats->rx_bytes += rx_bytes;
|
||||
@ -7477,9 +7469,16 @@ int stmmac_dvr_probe(struct device *device,
|
||||
priv->dev = ndev;
|
||||
|
||||
for (i = 0; i < MTL_MAX_RX_QUEUES; i++)
|
||||
u64_stats_init(&priv->xstats.rxq_stats[i].syncp);
|
||||
for (i = 0; i < MTL_MAX_TX_QUEUES; i++)
|
||||
u64_stats_init(&priv->xstats.txq_stats[i].syncp);
|
||||
u64_stats_init(&priv->xstats.rxq_stats[i].napi_syncp);
|
||||
for (i = 0; i < MTL_MAX_TX_QUEUES; i++) {
|
||||
u64_stats_init(&priv->xstats.txq_stats[i].q_syncp);
|
||||
u64_stats_init(&priv->xstats.txq_stats[i].napi_syncp);
|
||||
}
|
||||
|
||||
priv->xstats.pcpu_stats =
|
||||
devm_netdev_alloc_pcpu_stats(device, struct stmmac_pcpu_stats);
|
||||
if (!priv->xstats.pcpu_stats)
|
||||
return -ENOMEM;
|
||||
|
||||
stmmac_set_ethtool_ops(ndev);
|
||||
priv->pause = pause;
|
||||
|
@ -631,6 +631,8 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
|
||||
}
|
||||
}
|
||||
|
||||
phy->mac_managed_pm = true;
|
||||
|
||||
slave->phy = phy;
|
||||
|
||||
phy_attached_info(slave->phy);
|
||||
|
@ -773,6 +773,9 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
|
||||
slave->slave_num);
|
||||
return;
|
||||
}
|
||||
|
||||
phy->mac_managed_pm = true;
|
||||
|
||||
slave->phy = phy;
|
||||
|
||||
phy_attached_info(slave->phy);
|
||||
|
@ -42,6 +42,10 @@
|
||||
#define LINKCHANGE_INT (2 * HZ)
|
||||
#define VF_TAKEOVER_INT (HZ / 10)
|
||||
|
||||
/* Macros to define the context of vf registration */
|
||||
#define VF_REG_IN_PROBE 1
|
||||
#define VF_REG_IN_NOTIFIER 2
|
||||
|
||||
static unsigned int ring_size __ro_after_init = 128;
|
||||
module_param(ring_size, uint, 0444);
|
||||
MODULE_PARM_DESC(ring_size, "Ring buffer size (# of 4K pages)");
|
||||
@ -2185,7 +2189,7 @@ static rx_handler_result_t netvsc_vf_handle_frame(struct sk_buff **pskb)
|
||||
}
|
||||
|
||||
static int netvsc_vf_join(struct net_device *vf_netdev,
|
||||
struct net_device *ndev)
|
||||
struct net_device *ndev, int context)
|
||||
{
|
||||
struct net_device_context *ndev_ctx = netdev_priv(ndev);
|
||||
int ret;
|
||||
@ -2208,7 +2212,11 @@ static int netvsc_vf_join(struct net_device *vf_netdev,
|
||||
goto upper_link_failed;
|
||||
}
|
||||
|
||||
schedule_delayed_work(&ndev_ctx->vf_takeover, VF_TAKEOVER_INT);
|
||||
/* If this registration is called from probe context vf_takeover
|
||||
* is taken care of later in probe itself.
|
||||
*/
|
||||
if (context == VF_REG_IN_NOTIFIER)
|
||||
schedule_delayed_work(&ndev_ctx->vf_takeover, VF_TAKEOVER_INT);
|
||||
|
||||
call_netdevice_notifiers(NETDEV_JOIN, vf_netdev);
|
||||
|
||||
@ -2346,7 +2354,7 @@ static int netvsc_prepare_bonding(struct net_device *vf_netdev)
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static int netvsc_register_vf(struct net_device *vf_netdev)
|
||||
static int netvsc_register_vf(struct net_device *vf_netdev, int context)
|
||||
{
|
||||
struct net_device_context *net_device_ctx;
|
||||
struct netvsc_device *netvsc_dev;
|
||||
@ -2386,7 +2394,7 @@ static int netvsc_register_vf(struct net_device *vf_netdev)
|
||||
|
||||
netdev_info(ndev, "VF registering: %s\n", vf_netdev->name);
|
||||
|
||||
if (netvsc_vf_join(vf_netdev, ndev) != 0)
|
||||
if (netvsc_vf_join(vf_netdev, ndev, context) != 0)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
dev_hold(vf_netdev);
|
||||
@ -2484,10 +2492,31 @@ static int netvsc_unregister_vf(struct net_device *vf_netdev)
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static int check_dev_is_matching_vf(struct net_device *event_ndev)
|
||||
{
|
||||
/* Skip NetVSC interfaces */
|
||||
if (event_ndev->netdev_ops == &device_ops)
|
||||
return -ENODEV;
|
||||
|
||||
/* Avoid non-Ethernet type devices */
|
||||
if (event_ndev->type != ARPHRD_ETHER)
|
||||
return -ENODEV;
|
||||
|
||||
/* Avoid Vlan dev with same MAC registering as VF */
|
||||
if (is_vlan_dev(event_ndev))
|
||||
return -ENODEV;
|
||||
|
||||
/* Avoid Bonding master dev with same MAC registering as VF */
|
||||
if (netif_is_bond_master(event_ndev))
|
||||
return -ENODEV;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int netvsc_probe(struct hv_device *dev,
|
||||
const struct hv_vmbus_device_id *dev_id)
|
||||
{
|
||||
struct net_device *net = NULL;
|
||||
struct net_device *net = NULL, *vf_netdev;
|
||||
struct net_device_context *net_device_ctx;
|
||||
struct netvsc_device_info *device_info = NULL;
|
||||
struct netvsc_device *nvdev;
|
||||
@ -2599,6 +2628,30 @@ static int netvsc_probe(struct hv_device *dev,
|
||||
}
|
||||
|
||||
list_add(&net_device_ctx->list, &netvsc_dev_list);
|
||||
|
||||
/* When the hv_netvsc driver is unloaded and reloaded, the
|
||||
* NET_DEVICE_REGISTER for the vf device is replayed before probe
|
||||
* is complete. This is because register_netdevice_notifier() gets
|
||||
* registered before vmbus_driver_register() so that callback func
|
||||
* is set before probe and we don't miss events like NETDEV_POST_INIT
|
||||
* So, in this section we try to register the matching vf device that
|
||||
* is present as a netdevice, knowing that its register call is not
|
||||
* processed in the netvsc_netdev_notifier(as probing is progress and
|
||||
* get_netvsc_byslot fails).
|
||||
*/
|
||||
for_each_netdev(dev_net(net), vf_netdev) {
|
||||
ret = check_dev_is_matching_vf(vf_netdev);
|
||||
if (ret != 0)
|
||||
continue;
|
||||
|
||||
if (net != get_netvsc_byslot(vf_netdev))
|
||||
continue;
|
||||
|
||||
netvsc_prepare_bonding(vf_netdev);
|
||||
netvsc_register_vf(vf_netdev, VF_REG_IN_PROBE);
|
||||
__netvsc_vf_setup(net, vf_netdev);
|
||||
break;
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
netvsc_devinfo_put(device_info);
|
||||
@ -2754,28 +2807,17 @@ static int netvsc_netdev_event(struct notifier_block *this,
|
||||
unsigned long event, void *ptr)
|
||||
{
|
||||
struct net_device *event_dev = netdev_notifier_info_to_dev(ptr);
|
||||
int ret = 0;
|
||||
|
||||
/* Skip our own events */
|
||||
if (event_dev->netdev_ops == &device_ops)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
/* Avoid non-Ethernet type devices */
|
||||
if (event_dev->type != ARPHRD_ETHER)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
/* Avoid Vlan dev with same MAC registering as VF */
|
||||
if (is_vlan_dev(event_dev))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
/* Avoid Bonding master dev with same MAC registering as VF */
|
||||
if (netif_is_bond_master(event_dev))
|
||||
ret = check_dev_is_matching_vf(event_dev);
|
||||
if (ret != 0)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
switch (event) {
|
||||
case NETDEV_POST_INIT:
|
||||
return netvsc_prepare_bonding(event_dev);
|
||||
case NETDEV_REGISTER:
|
||||
return netvsc_register_vf(event_dev);
|
||||
return netvsc_register_vf(event_dev, VF_REG_IN_NOTIFIER);
|
||||
case NETDEV_UNREGISTER:
|
||||
return netvsc_unregister_vf(event_dev);
|
||||
case NETDEV_UP:
|
||||
|
@ -835,14 +835,14 @@ static void nsim_dev_trap_report_work(struct work_struct *work)
|
||||
trap_report_dw.work);
|
||||
nsim_dev = nsim_trap_data->nsim_dev;
|
||||
|
||||
/* For each running port and enabled packet trap, generate a UDP
|
||||
* packet with a random 5-tuple and report it.
|
||||
*/
|
||||
if (!devl_trylock(priv_to_devlink(nsim_dev))) {
|
||||
schedule_delayed_work(&nsim_dev->trap_data->trap_report_dw, 0);
|
||||
schedule_delayed_work(&nsim_dev->trap_data->trap_report_dw, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
/* For each running port and enabled packet trap, generate a UDP
|
||||
* packet with a random 5-tuple and report it.
|
||||
*/
|
||||
list_for_each_entry(nsim_dev_port, &nsim_dev->port_list, list) {
|
||||
if (!netif_running(nsim_dev_port->ns->netdev))
|
||||
continue;
|
||||
|
@ -460,6 +460,10 @@ ppp_async_ioctl(struct ppp_channel *chan, unsigned int cmd, unsigned long arg)
|
||||
case PPPIOCSMRU:
|
||||
if (get_user(val, p))
|
||||
break;
|
||||
if (val > U16_MAX) {
|
||||
err = -EINVAL;
|
||||
break;
|
||||
}
|
||||
if (val < PPP_MRU)
|
||||
val = PPP_MRU;
|
||||
ap->mru = val;
|
||||
|
@ -1803,5 +1803,6 @@ static struct usb_driver ar5523_driver = {
|
||||
|
||||
module_usb_driver(ar5523_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Atheros AR5523 wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_FIRMWARE(AR5523_FIRMWARE_FILE);
|
||||
|
@ -1685,6 +1685,7 @@ static struct platform_driver wcn36xx_driver = {
|
||||
|
||||
module_platform_driver(wcn36xx_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Qualcomm Atheros WCN3660/3680 wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Eugene Krasnikov k.eugene.e@gmail.com");
|
||||
MODULE_FIRMWARE(WLAN_NV_FILE);
|
||||
|
@ -20,6 +20,7 @@ static void __exit brcmf_bca_exit(void)
|
||||
brcmf_fwvid_unregister_vendor(BRCMF_FWVENDOR_BCA, THIS_MODULE);
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("Broadcom FullMAC WLAN driver plugin for Broadcom AP chipsets");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(BRCMFMAC);
|
||||
|
||||
|
@ -3779,8 +3779,10 @@ static int brcmf_internal_escan_add_info(struct cfg80211_scan_request *req,
|
||||
if (req->channels[i] == chan)
|
||||
break;
|
||||
}
|
||||
if (i == req->n_channels)
|
||||
req->channels[req->n_channels++] = chan;
|
||||
if (i == req->n_channels) {
|
||||
req->n_channels++;
|
||||
req->channels[i] = chan;
|
||||
}
|
||||
|
||||
for (i = 0; i < req->n_ssids; i++) {
|
||||
if (req->ssids[i].ssid_len == ssid_len &&
|
||||
|
@ -20,6 +20,7 @@ static void __exit brcmf_cyw_exit(void)
|
||||
brcmf_fwvid_unregister_vendor(BRCMF_FWVENDOR_CYW, THIS_MODULE);
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("Broadcom FullMAC WLAN driver plugin for Cypress/Infineon chipsets");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(BRCMFMAC);
|
||||
|
||||
|
@ -20,6 +20,7 @@ static void __exit brcmf_wcc_exit(void)
|
||||
brcmf_fwvid_unregister_vendor(BRCMF_FWVENDOR_WCC, THIS_MODULE);
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("Broadcom FullMAC WLAN driver plugin for Broadcom mobility chipsets");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_IMPORT_NS(BRCMFMAC);
|
||||
|
||||
|
@ -537,7 +537,7 @@ enum iwl_fw_dbg_config_cmd_type {
|
||||
}; /* LDBG_CFG_CMD_TYPE_API_E_VER_1 */
|
||||
|
||||
/* this token disables debug asserts in the firmware */
|
||||
#define IWL_FW_DBG_CONFIG_TOKEN 0x00011301
|
||||
#define IWL_FW_DBG_CONFIG_TOKEN 0x00010001
|
||||
|
||||
/**
|
||||
* struct iwl_fw_dbg_config_cmd - configure FW debug
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
/*
|
||||
* Copyright (C) 2005-2014, 2018-2023 Intel Corporation
|
||||
* Copyright (C) 2005-2014, 2018-2024 Intel Corporation
|
||||
* Copyright (C) 2013-2015 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2015-2017 Intel Deutschland GmbH
|
||||
*/
|
||||
@ -19,7 +19,6 @@
|
||||
* @fwrt_ptr: pointer to the buffer coming from fwrt
|
||||
* @trans_ptr: pointer to struct %iwl_trans_dump_data which contains the
|
||||
* transport's data.
|
||||
* @trans_len: length of the valid data in trans_ptr
|
||||
* @fwrt_len: length of the valid data in fwrt_ptr
|
||||
*/
|
||||
struct iwl_fw_dump_ptrs {
|
||||
|
@ -128,6 +128,7 @@ static void iwl_dealloc_ucode(struct iwl_drv *drv)
|
||||
kfree(drv->fw.ucode_capa.cmd_versions);
|
||||
kfree(drv->fw.phy_integration_ver);
|
||||
kfree(drv->trans->dbg.pc_data);
|
||||
drv->trans->dbg.pc_data = NULL;
|
||||
|
||||
for (i = 0; i < IWL_UCODE_TYPE_MAX; i++)
|
||||
iwl_free_fw_img(drv, drv->fw.img + i);
|
||||
|
@ -668,7 +668,6 @@ static const struct ieee80211_sband_iftype_data iwl_he_eht_capa[] = {
|
||||
.has_eht = true,
|
||||
.eht_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS |
|
||||
IEEE80211_EHT_MAC_CAP0_OM_CONTROL |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2 |
|
||||
@ -793,7 +792,6 @@ static const struct ieee80211_sband_iftype_data iwl_he_eht_capa[] = {
|
||||
.has_eht = true,
|
||||
.eht_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS |
|
||||
IEEE80211_EHT_MAC_CAP0_OM_CONTROL |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2,
|
||||
@ -1020,8 +1018,7 @@ iwl_nvm_fixup_sband_iftd(struct iwl_trans *trans,
|
||||
if (CSR_HW_REV_TYPE(trans->hw_rev) == IWL_CFG_MAC_TYPE_GL &&
|
||||
iftype_data->eht_cap.has_eht) {
|
||||
iftype_data->eht_cap.eht_cap_elem.mac_cap_info[0] &=
|
||||
~(IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
|
||||
~(IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1 |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE2);
|
||||
iftype_data->eht_cap.eht_cap_elem.phy_cap_info[3] &=
|
||||
~(IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO |
|
||||
|
@ -1600,7 +1600,8 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
|
||||
*/
|
||||
if (vif->type == NL80211_IFTYPE_AP ||
|
||||
vif->type == NL80211_IFTYPE_ADHOC) {
|
||||
iwl_mvm_vif_dbgfs_add_link(mvm, vif);
|
||||
if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
|
||||
iwl_mvm_vif_dbgfs_add_link(mvm, vif);
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
@ -1640,7 +1641,8 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
|
||||
iwl_mvm_chandef_get_primary_80(&vif->bss_conf.chandef);
|
||||
}
|
||||
|
||||
iwl_mvm_vif_dbgfs_add_link(mvm, vif);
|
||||
if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
|
||||
iwl_mvm_vif_dbgfs_add_link(mvm, vif);
|
||||
|
||||
if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) &&
|
||||
vif->type == NL80211_IFTYPE_STATION && !vif->p2p &&
|
||||
|
@ -81,7 +81,8 @@ static int iwl_mvm_mld_mac_add_interface(struct ieee80211_hw *hw,
|
||||
ieee80211_hw_set(mvm->hw, RX_INCLUDES_FCS);
|
||||
}
|
||||
|
||||
iwl_mvm_vif_dbgfs_add_link(mvm, vif);
|
||||
if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
|
||||
iwl_mvm_vif_dbgfs_add_link(mvm, vif);
|
||||
|
||||
if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) &&
|
||||
vif->type == NL80211_IFTYPE_STATION && !vif->p2p &&
|
||||
@ -437,6 +438,9 @@ __iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
mvmvif->ap_ibss_active = false;
|
||||
}
|
||||
|
||||
iwl_mvm_link_changed(mvm, vif, link_conf,
|
||||
LINK_CONTEXT_MODIFY_ACTIVE, false);
|
||||
|
||||
if (iwl_mvm_is_esr_supported(mvm->fwrt.trans) && n_active > 1) {
|
||||
int ret = iwl_mvm_esr_mode_inactive(mvm, vif);
|
||||
|
||||
@ -448,9 +452,6 @@ __iwl_mvm_mld_unassign_vif_chanctx(struct iwl_mvm *mvm,
|
||||
if (vif->type == NL80211_IFTYPE_MONITOR)
|
||||
iwl_mvm_mld_rm_snif_sta(mvm, vif);
|
||||
|
||||
iwl_mvm_link_changed(mvm, vif, link_conf,
|
||||
LINK_CONTEXT_MODIFY_ACTIVE, false);
|
||||
|
||||
if (switching_chanctx)
|
||||
return;
|
||||
mvmvif->link[link_id]->phy_ctxt = NULL;
|
||||
|
@ -700,6 +700,7 @@ static struct spi_driver p54spi_driver = {
|
||||
|
||||
module_spi_driver(p54spi_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Prism54 SPI wireless driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Christian Lamparter <chunkeey@web.de>");
|
||||
MODULE_ALIAS("spi:cx3110x");
|
||||
|
@ -728,6 +728,7 @@ const struct ieee80211_ops mt7603_ops = {
|
||||
.set_sar_specs = mt7603_set_sar_specs,
|
||||
};
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT7603E and MT76x8 wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
static int __init mt7603_init(void)
|
||||
|
@ -1375,4 +1375,5 @@ const struct ieee80211_ops mt7615_ops = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(mt7615_ops);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT7615E and MT7663E wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -270,4 +270,5 @@ static void __exit mt7615_exit(void)
|
||||
|
||||
module_init(mt7615_init);
|
||||
module_exit(mt7615_exit);
|
||||
MODULE_DESCRIPTION("MediaTek MT7615E MMIO helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -253,4 +253,5 @@ module_sdio_driver(mt7663s_driver);
|
||||
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7663S (SDIO) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -281,4 +281,5 @@ module_usb_driver(mt7663u_driver);
|
||||
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7663U (USB) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -349,4 +349,5 @@ EXPORT_SYMBOL_GPL(mt7663_usb_sdio_register_device);
|
||||
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7663 SDIO/USB helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -3160,4 +3160,5 @@ exit:
|
||||
EXPORT_SYMBOL_GPL(mt76_connac2_mcu_fill_message);
|
||||
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT76x connac layer helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -342,4 +342,5 @@ int mt76x0_eeprom_init(struct mt76x02_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT76x EEPROM helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -302,6 +302,7 @@ static const struct pci_device_id mt76x0e_device_table[] = {
|
||||
MODULE_DEVICE_TABLE(pci, mt76x0e_device_table);
|
||||
MODULE_FIRMWARE(MT7610E_FIRMWARE);
|
||||
MODULE_FIRMWARE(MT7650E_FIRMWARE);
|
||||
MODULE_DESCRIPTION("MediaTek MT76x0E (PCIe) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
static struct pci_driver mt76x0e_driver = {
|
||||
|
@ -336,6 +336,7 @@ err:
|
||||
MODULE_DEVICE_TABLE(usb, mt76x0_device_table);
|
||||
MODULE_FIRMWARE(MT7610E_FIRMWARE);
|
||||
MODULE_FIRMWARE(MT7610U_FIRMWARE);
|
||||
MODULE_DESCRIPTION("MediaTek MT76x0U (USB) wireless driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static struct usb_driver mt76x0_driver = {
|
||||
|
@ -293,4 +293,5 @@ void mt76x02u_init_mcu(struct mt76_dev *dev)
|
||||
EXPORT_SYMBOL_GPL(mt76x02u_init_mcu);
|
||||
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>");
|
||||
MODULE_DESCRIPTION("MediaTek MT76x02 MCU helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -696,4 +696,5 @@ void mt76x02_config_mac_addr_list(struct mt76x02_dev *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76x02_config_mac_addr_list);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT76x02 helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -506,4 +506,5 @@ int mt76x2_eeprom_init(struct mt76x02_dev *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt76x2_eeprom_init);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT76x2 EEPROM helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -165,6 +165,7 @@ mt76x2e_resume(struct pci_dev *pdev)
|
||||
MODULE_DEVICE_TABLE(pci, mt76x2e_device_table);
|
||||
MODULE_FIRMWARE(MT7662_FIRMWARE);
|
||||
MODULE_FIRMWARE(MT7662_ROM_PATCH);
|
||||
MODULE_DESCRIPTION("MediaTek MT76x2E (PCIe) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
static struct pci_driver mt76pci_driver = {
|
||||
|
@ -147,4 +147,5 @@ static struct usb_driver mt76x2u_driver = {
|
||||
module_usb_driver(mt76x2u_driver);
|
||||
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>");
|
||||
MODULE_DESCRIPTION("MediaTek MT76x2U (USB) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -958,4 +958,5 @@ static void __exit mt7915_exit(void)
|
||||
|
||||
module_init(mt7915_init);
|
||||
module_exit(mt7915_exit);
|
||||
MODULE_DESCRIPTION("MediaTek MT7915E MMIO helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -1418,5 +1418,6 @@ const struct ieee80211_ops mt7921_ops = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(mt7921_ops);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT7921 core driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
|
@ -544,4 +544,5 @@ MODULE_FIRMWARE(MT7922_FIRMWARE_WM);
|
||||
MODULE_FIRMWARE(MT7922_ROM_PATCH);
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7921E (PCIe) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -323,5 +323,6 @@ static struct sdio_driver mt7921s_driver = {
|
||||
.drv.pm = pm_sleep_ptr(&mt7921s_pm_ops),
|
||||
};
|
||||
module_sdio_driver(mt7921s_driver);
|
||||
MODULE_DESCRIPTION("MediaTek MT7921S (SDIO) wireless driver");
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -336,5 +336,6 @@ static struct usb_driver mt7921u_driver = {
|
||||
};
|
||||
module_usb_driver(mt7921u_driver);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT7921U (USB) wireless driver");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -1450,4 +1450,5 @@ const struct ieee80211_ops mt7925_ops = {
|
||||
EXPORT_SYMBOL_GPL(mt7925_ops);
|
||||
|
||||
MODULE_AUTHOR("Deren Wu <deren.wu@mediatek.com>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7925 core driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -583,4 +583,5 @@ MODULE_FIRMWARE(MT7925_FIRMWARE_WM);
|
||||
MODULE_FIRMWARE(MT7925_ROM_PATCH);
|
||||
MODULE_AUTHOR("Deren Wu <deren.wu@mediatek.com>");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7925E (PCIe) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -329,4 +329,5 @@ static struct usb_driver mt7925u_driver = {
|
||||
module_usb_driver(mt7925u_driver);
|
||||
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT7925U (USB) wireless driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -862,5 +862,6 @@ int mt792x_load_firmware(struct mt792x_dev *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt792x_load_firmware);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT792x core driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
|
@ -314,5 +314,6 @@ void mt792xu_disconnect(struct usb_interface *usb_intf)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt792xu_disconnect);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT792x USB helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
|
@ -4477,7 +4477,8 @@ int mt7996_mcu_set_txpower_sku(struct mt7996_phy *phy)
|
||||
|
||||
skb_put_data(skb, &req, sizeof(req));
|
||||
/* cck and ofdm */
|
||||
skb_put_data(skb, &la.cck, sizeof(la.cck) + sizeof(la.ofdm));
|
||||
skb_put_data(skb, &la.cck, sizeof(la.cck));
|
||||
skb_put_data(skb, &la.ofdm, sizeof(la.ofdm));
|
||||
/* ht20 */
|
||||
skb_put_data(skb, &la.mcs[0], 8);
|
||||
/* ht40 */
|
||||
|
@ -650,4 +650,5 @@ static void __exit mt7996_exit(void)
|
||||
|
||||
module_init(mt7996_init);
|
||||
module_exit(mt7996_exit);
|
||||
MODULE_DESCRIPTION("MediaTek MT7996 MMIO helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -672,4 +672,5 @@ EXPORT_SYMBOL_GPL(mt76s_init);
|
||||
|
||||
MODULE_AUTHOR("Sean Wang <sean.wang@mediatek.com>");
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo@kernel.org>");
|
||||
MODULE_DESCRIPTION("MediaTek MT76x SDIO helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -1128,4 +1128,5 @@ int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf)
|
||||
EXPORT_SYMBOL_GPL(mt76u_init);
|
||||
|
||||
MODULE_AUTHOR("Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>");
|
||||
MODULE_DESCRIPTION("MediaTek MT76x USB helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -138,4 +138,5 @@ int __mt76_worker_fn(void *ptr)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__mt76_worker_fn);
|
||||
|
||||
MODULE_DESCRIPTION("MediaTek MT76x helpers");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -1018,5 +1018,6 @@ unregister_netdev:
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
MODULE_DESCRIPTION("Atmel WILC1000 core wireless driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_FIRMWARE(WILC1000_FW(WILC1000_API_VER));
|
||||
|
@ -984,4 +984,5 @@ static struct sdio_driver wilc_sdio_driver = {
|
||||
module_driver(wilc_sdio_driver,
|
||||
sdio_register_driver,
|
||||
sdio_unregister_driver);
|
||||
MODULE_DESCRIPTION("Atmel WILC1000 SDIO wireless driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -273,6 +273,7 @@ static struct spi_driver wilc_spi_driver = {
|
||||
.remove = wilc_bus_remove,
|
||||
};
|
||||
module_spi_driver(wilc_spi_driver);
|
||||
MODULE_DESCRIPTION("Atmel WILC1000 SPI wireless driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int wilc_spi_tx(struct wilc *wilc, u8 *b, u32 len)
|
||||
|
@ -343,5 +343,6 @@ static void __exit wl1251_sdio_exit(void)
|
||||
module_init(wl1251_sdio_init);
|
||||
module_exit(wl1251_sdio_exit);
|
||||
|
||||
MODULE_DESCRIPTION("TI WL1251 SDIO helpers");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Kalle Valo <kvalo@adurom.com>");
|
||||
|
@ -342,6 +342,7 @@ static struct spi_driver wl1251_spi_driver = {
|
||||
|
||||
module_spi_driver(wl1251_spi_driver);
|
||||
|
||||
MODULE_DESCRIPTION("TI WL1251 SPI helpers");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Kalle Valo <kvalo@adurom.com>");
|
||||
MODULE_ALIAS("spi:wl1251");
|
||||
|
@ -1955,6 +1955,7 @@ module_param_named(tcxo, tcxo_param, charp, 0);
|
||||
MODULE_PARM_DESC(tcxo,
|
||||
"TCXO clock: 19.2, 26, 38.4, 52, 16.368, 32.736, 16.8, 33.6");
|
||||
|
||||
MODULE_DESCRIPTION("TI WL12xx wireless driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
|
||||
MODULE_FIRMWARE(WL127X_FW_NAME_SINGLE);
|
||||
|
@ -2086,6 +2086,7 @@ module_param_named(num_rx_desc, num_rx_desc_param, int, 0400);
|
||||
MODULE_PARM_DESC(num_rx_desc_param,
|
||||
"Number of Rx descriptors: u8 (default is 32)");
|
||||
|
||||
MODULE_DESCRIPTION("TI WiLink 8 wireless driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
|
||||
MODULE_FIRMWARE(WL18XX_FW_NAME);
|
||||
|
@ -6793,6 +6793,7 @@ MODULE_PARM_DESC(bug_on_recovery, "BUG() on fw recovery");
|
||||
module_param(no_recovery, int, 0600);
|
||||
MODULE_PARM_DESC(no_recovery, "Prevent HW recovery. FW will remain stuck.");
|
||||
|
||||
MODULE_DESCRIPTION("TI WLAN core driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
|
||||
MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
|
||||
|
@ -447,6 +447,7 @@ module_sdio_driver(wl1271_sdio_driver);
|
||||
module_param(dump, bool, 0600);
|
||||
MODULE_PARM_DESC(dump, "Enable sdio read/write dumps.");
|
||||
|
||||
MODULE_DESCRIPTION("TI WLAN SDIO helpers");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
|
||||
MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
|
||||
|
@ -562,6 +562,7 @@ static struct spi_driver wl1271_spi_driver = {
|
||||
};
|
||||
|
||||
module_spi_driver(wl1271_spi_driver);
|
||||
MODULE_DESCRIPTION("TI WLAN SPI helpers");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
|
||||
MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
|
||||
|
@ -255,9 +255,10 @@ static void qeth_l3_clear_ip_htable(struct qeth_card *card, int recover)
|
||||
if (!recover) {
|
||||
hash_del(&addr->hnode);
|
||||
kfree(addr);
|
||||
continue;
|
||||
} else {
|
||||
/* prepare for recovery */
|
||||
addr->disp_flag = QETH_DISP_ADDR_ADD;
|
||||
}
|
||||
addr->disp_flag = QETH_DISP_ADDR_ADD;
|
||||
}
|
||||
|
||||
mutex_unlock(&card->ip_lock);
|
||||
@ -278,9 +279,11 @@ static void qeth_l3_recover_ip(struct qeth_card *card)
|
||||
if (addr->disp_flag == QETH_DISP_ADDR_ADD) {
|
||||
rc = qeth_l3_register_addr_entry(card, addr);
|
||||
|
||||
if (!rc) {
|
||||
if (!rc || rc == -EADDRINUSE || rc == -ENETDOWN) {
|
||||
/* keep it in the records */
|
||||
addr->disp_flag = QETH_DISP_ADDR_DO_NOTHING;
|
||||
} else {
|
||||
/* bad address */
|
||||
hash_del(&addr->hnode);
|
||||
kfree(addr);
|
||||
}
|
||||
|
@ -2910,6 +2910,8 @@ struct cfg80211_bss_ies {
|
||||
* own the beacon_ies, but they're just pointers to the ones from the
|
||||
* @hidden_beacon_bss struct)
|
||||
* @proberesp_ies: the information elements from the last Probe Response frame
|
||||
* @proberesp_ecsa_stuck: ECSA element is stuck in the Probe Response frame,
|
||||
* cannot rely on it having valid data
|
||||
* @hidden_beacon_bss: in case this BSS struct represents a probe response from
|
||||
* a BSS that hides the SSID in its beacon, this points to the BSS struct
|
||||
* that holds the beacon data. @beacon_ies is still valid, of course, and
|
||||
@ -2950,6 +2952,8 @@ struct cfg80211_bss {
|
||||
u8 chains;
|
||||
s8 chain_signal[IEEE80211_MAX_CHAINS];
|
||||
|
||||
u8 proberesp_ecsa_stuck:1;
|
||||
|
||||
u8 bssid_index;
|
||||
u8 max_bssid_indicator;
|
||||
|
||||
|
@ -808,10 +808,16 @@ static inline struct nft_set_elem_expr *nft_set_ext_expr(const struct nft_set_ex
|
||||
return nft_set_ext(ext, NFT_SET_EXT_EXPRESSIONS);
|
||||
}
|
||||
|
||||
static inline bool nft_set_elem_expired(const struct nft_set_ext *ext)
|
||||
static inline bool __nft_set_elem_expired(const struct nft_set_ext *ext,
|
||||
u64 tstamp)
|
||||
{
|
||||
return nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION) &&
|
||||
time_is_before_eq_jiffies64(*nft_set_ext_expiration(ext));
|
||||
time_after_eq64(tstamp, *nft_set_ext_expiration(ext));
|
||||
}
|
||||
|
||||
static inline bool nft_set_elem_expired(const struct nft_set_ext *ext)
|
||||
{
|
||||
return __nft_set_elem_expired(ext, get_jiffies_64());
|
||||
}
|
||||
|
||||
static inline struct nft_set_ext *nft_set_elem_ext(const struct nft_set *set,
|
||||
@ -1779,6 +1785,7 @@ struct nftables_pernet {
|
||||
struct list_head notify_list;
|
||||
struct mutex commit_mutex;
|
||||
u64 table_handle;
|
||||
u64 tstamp;
|
||||
unsigned int base_seq;
|
||||
unsigned int gc_seq;
|
||||
u8 validate_state;
|
||||
@ -1791,6 +1798,11 @@ static inline struct nftables_pernet *nft_pernet(const struct net *net)
|
||||
return net_generic(net, nf_tables_net_id);
|
||||
}
|
||||
|
||||
static inline u64 nft_net_tstamp(const struct net *net)
|
||||
{
|
||||
return nft_pernet(net)->tstamp;
|
||||
}
|
||||
|
||||
#define __NFT_REDUCE_READONLY 1UL
|
||||
#define NFT_REDUCE_READONLY (void *)__NFT_REDUCE_READONLY
|
||||
|
||||
|
@ -128,6 +128,7 @@
|
||||
EM(rxrpc_skb_eaten_by_unshare_nomem, "ETN unshar-nm") \
|
||||
EM(rxrpc_skb_get_conn_secured, "GET conn-secd") \
|
||||
EM(rxrpc_skb_get_conn_work, "GET conn-work") \
|
||||
EM(rxrpc_skb_get_last_nack, "GET last-nack") \
|
||||
EM(rxrpc_skb_get_local_work, "GET locl-work") \
|
||||
EM(rxrpc_skb_get_reject_work, "GET rej-work ") \
|
||||
EM(rxrpc_skb_get_to_recvmsg, "GET to-recv ") \
|
||||
@ -141,6 +142,7 @@
|
||||
EM(rxrpc_skb_put_error_report, "PUT error-rep") \
|
||||
EM(rxrpc_skb_put_input, "PUT input ") \
|
||||
EM(rxrpc_skb_put_jumbo_subpacket, "PUT jumbo-sub") \
|
||||
EM(rxrpc_skb_put_last_nack, "PUT last-nack") \
|
||||
EM(rxrpc_skb_put_purge, "PUT purge ") \
|
||||
EM(rxrpc_skb_put_rotate, "PUT rotate ") \
|
||||
EM(rxrpc_skb_put_unknown, "PUT unknown ") \
|
||||
@ -1552,7 +1554,7 @@ TRACE_EVENT(rxrpc_congest,
|
||||
memcpy(&__entry->sum, summary, sizeof(__entry->sum));
|
||||
),
|
||||
|
||||
TP_printk("c=%08x r=%08x %s q=%08x %s cw=%u ss=%u nA=%u,%u+%u r=%u b=%u u=%u d=%u l=%x%s%s%s",
|
||||
TP_printk("c=%08x r=%08x %s q=%08x %s cw=%u ss=%u nA=%u,%u+%u,%u b=%u u=%u d=%u l=%x%s%s%s",
|
||||
__entry->call,
|
||||
__entry->ack_serial,
|
||||
__print_symbolic(__entry->sum.ack_reason, rxrpc_ack_names),
|
||||
@ -1560,9 +1562,9 @@ TRACE_EVENT(rxrpc_congest,
|
||||
__print_symbolic(__entry->sum.mode, rxrpc_congest_modes),
|
||||
__entry->sum.cwnd,
|
||||
__entry->sum.ssthresh,
|
||||
__entry->sum.nr_acks, __entry->sum.saw_nacks,
|
||||
__entry->sum.nr_acks, __entry->sum.nr_retained_nacks,
|
||||
__entry->sum.nr_new_acks,
|
||||
__entry->sum.nr_rot_new_acks,
|
||||
__entry->sum.nr_new_nacks,
|
||||
__entry->top - __entry->hard_ack,
|
||||
__entry->sum.cumulative_acks,
|
||||
__entry->sum.dup_acks,
|
||||
|
@ -285,9 +285,11 @@ enum nft_rule_attributes {
|
||||
/**
|
||||
* enum nft_rule_compat_flags - nf_tables rule compat flags
|
||||
*
|
||||
* @NFT_RULE_COMPAT_F_UNUSED: unused
|
||||
* @NFT_RULE_COMPAT_F_INV: invert the check result
|
||||
*/
|
||||
enum nft_rule_compat_flags {
|
||||
NFT_RULE_COMPAT_F_UNUSED = (1 << 0),
|
||||
NFT_RULE_COMPAT_F_INV = (1 << 1),
|
||||
NFT_RULE_COMPAT_F_MASK = NFT_RULE_COMPAT_F_INV,
|
||||
};
|
||||
|
@ -751,7 +751,7 @@ size_t memcpy_to_iter_csum(void *iter_to, size_t progress,
|
||||
size_t len, void *from, void *priv2)
|
||||
{
|
||||
__wsum *csum = priv2;
|
||||
__wsum next = csum_partial_copy_nocheck(from, iter_to, len);
|
||||
__wsum next = csum_partial_copy_nocheck(from + progress, iter_to, len);
|
||||
|
||||
*csum = csum_block_add(*csum, next, progress);
|
||||
return 0;
|
||||
|
@ -46,7 +46,7 @@ struct devlink_rel {
|
||||
u32 obj_index;
|
||||
devlink_rel_notify_cb_t *notify_cb;
|
||||
devlink_rel_cleanup_cb_t *cleanup_cb;
|
||||
struct work_struct notify_work;
|
||||
struct delayed_work notify_work;
|
||||
} nested_in;
|
||||
};
|
||||
|
||||
@ -70,7 +70,7 @@ static void __devlink_rel_put(struct devlink_rel *rel)
|
||||
static void devlink_rel_nested_in_notify_work(struct work_struct *work)
|
||||
{
|
||||
struct devlink_rel *rel = container_of(work, struct devlink_rel,
|
||||
nested_in.notify_work);
|
||||
nested_in.notify_work.work);
|
||||
struct devlink *devlink;
|
||||
|
||||
devlink = devlinks_xa_get(rel->nested_in.devlink_index);
|
||||
@ -96,13 +96,13 @@ rel_put:
|
||||
return;
|
||||
|
||||
reschedule_work:
|
||||
schedule_work(&rel->nested_in.notify_work);
|
||||
schedule_delayed_work(&rel->nested_in.notify_work, 1);
|
||||
}
|
||||
|
||||
static void devlink_rel_nested_in_notify_work_schedule(struct devlink_rel *rel)
|
||||
{
|
||||
__devlink_rel_get(rel);
|
||||
schedule_work(&rel->nested_in.notify_work);
|
||||
schedule_delayed_work(&rel->nested_in.notify_work, 0);
|
||||
}
|
||||
|
||||
static struct devlink_rel *devlink_rel_alloc(void)
|
||||
@ -123,8 +123,8 @@ static struct devlink_rel *devlink_rel_alloc(void)
|
||||
}
|
||||
|
||||
refcount_set(&rel->refcount, 1);
|
||||
INIT_WORK(&rel->nested_in.notify_work,
|
||||
&devlink_rel_nested_in_notify_work);
|
||||
INIT_DELAYED_WORK(&rel->nested_in.notify_work,
|
||||
&devlink_rel_nested_in_notify_work);
|
||||
return rel;
|
||||
}
|
||||
|
||||
|
@ -1628,10 +1628,12 @@ EXPORT_SYMBOL(inet_current_timestamp);
|
||||
|
||||
int inet_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
||||
{
|
||||
if (sk->sk_family == AF_INET)
|
||||
unsigned int family = READ_ONCE(sk->sk_family);
|
||||
|
||||
if (family == AF_INET)
|
||||
return ip_recv_error(sk, msg, len, addr_len);
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
if (sk->sk_family == AF_INET6)
|
||||
if (family == AF_INET6)
|
||||
return pingv6_ops.ipv6_recv_error(sk, msg, len, addr_len);
|
||||
#endif
|
||||
return -EINVAL;
|
||||
|
@ -332,7 +332,7 @@ static int iptunnel_pmtud_build_icmpv6(struct sk_buff *skb, int mtu)
|
||||
};
|
||||
skb_reset_network_header(skb);
|
||||
|
||||
csum = csum_partial(icmp6h, len, 0);
|
||||
csum = skb_checksum(skb, skb_transport_offset(skb), len, 0);
|
||||
icmp6h->icmp6_cksum = csum_ipv6_magic(&nip6h->saddr, &nip6h->daddr, len,
|
||||
IPPROTO_ICMPV6, csum);
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
* Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
|
||||
* Copyright 2013-2015 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2015-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018-2022 Intel Corporation
|
||||
* Copyright (C) 2018-2024 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/ieee80211.h>
|
||||
@ -987,7 +987,8 @@ static int
|
||||
ieee80211_set_unsol_bcast_probe_resp(struct ieee80211_sub_if_data *sdata,
|
||||
struct cfg80211_unsol_bcast_probe_resp *params,
|
||||
struct ieee80211_link_data *link,
|
||||
struct ieee80211_bss_conf *link_conf)
|
||||
struct ieee80211_bss_conf *link_conf,
|
||||
u64 *changed)
|
||||
{
|
||||
struct unsol_bcast_probe_resp_data *new, *old = NULL;
|
||||
|
||||
@ -1011,7 +1012,8 @@ ieee80211_set_unsol_bcast_probe_resp(struct ieee80211_sub_if_data *sdata,
|
||||
RCU_INIT_POINTER(link->u.ap.unsol_bcast_probe_resp, NULL);
|
||||
}
|
||||
|
||||
return BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
|
||||
*changed |= BSS_CHANGED_UNSOL_BCAST_PROBE_RESP;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ieee80211_set_ftm_responder_params(
|
||||
@ -1450,10 +1452,9 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
err = ieee80211_set_unsol_bcast_probe_resp(sdata,
|
||||
¶ms->unsol_bcast_probe_resp,
|
||||
link, link_conf);
|
||||
link, link_conf, &changed);
|
||||
if (err < 0)
|
||||
goto error;
|
||||
changed |= err;
|
||||
|
||||
err = drv_start_ap(sdata->local, sdata, link_conf);
|
||||
if (err) {
|
||||
@ -1525,10 +1526,9 @@ static int ieee80211_change_beacon(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
err = ieee80211_set_unsol_bcast_probe_resp(sdata,
|
||||
¶ms->unsol_bcast_probe_resp,
|
||||
link, link_conf);
|
||||
link, link_conf, &changed);
|
||||
if (err < 0)
|
||||
return err;
|
||||
changed |= err;
|
||||
|
||||
if (beacon->he_bss_color_valid &&
|
||||
beacon->he_bss_color.enabled != link_conf->he_bss_color.enabled) {
|
||||
@ -1869,6 +1869,8 @@ static int sta_link_apply_parameters(struct ieee80211_local *local,
|
||||
sband->band);
|
||||
}
|
||||
|
||||
ieee80211_sta_set_rx_nss(link_sta);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -997,8 +997,8 @@ static void add_link_files(struct ieee80211_link_data *link,
|
||||
}
|
||||
}
|
||||
|
||||
void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata,
|
||||
bool mld_vif)
|
||||
static void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata,
|
||||
bool mld_vif)
|
||||
{
|
||||
char buf[10+IFNAMSIZ];
|
||||
|
||||
|
@ -11,8 +11,6 @@
|
||||
#include "ieee80211_i.h"
|
||||
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
void ieee80211_debugfs_add_netdev(struct ieee80211_sub_if_data *sdata,
|
||||
bool mld_vif);
|
||||
void ieee80211_debugfs_remove_netdev(struct ieee80211_sub_if_data *sdata);
|
||||
void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata);
|
||||
void ieee80211_debugfs_recreate_netdev(struct ieee80211_sub_if_data *sdata,
|
||||
@ -24,9 +22,6 @@ void ieee80211_link_debugfs_remove(struct ieee80211_link_data *link);
|
||||
void ieee80211_link_debugfs_drv_add(struct ieee80211_link_data *link);
|
||||
void ieee80211_link_debugfs_drv_remove(struct ieee80211_link_data *link);
|
||||
#else
|
||||
static inline void ieee80211_debugfs_add_netdev(
|
||||
struct ieee80211_sub_if_data *sdata, bool mld_vif)
|
||||
{}
|
||||
static inline void ieee80211_debugfs_remove_netdev(
|
||||
struct ieee80211_sub_if_data *sdata)
|
||||
{}
|
||||
|
@ -1783,7 +1783,7 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
|
||||
/* need to do this after the switch so vif.type is correct */
|
||||
ieee80211_link_setup(&sdata->deflink);
|
||||
|
||||
ieee80211_debugfs_add_netdev(sdata, false);
|
||||
ieee80211_debugfs_recreate_netdev(sdata, false);
|
||||
}
|
||||
|
||||
static int ieee80211_runtime_change_iftype(struct ieee80211_sub_if_data *sdata,
|
||||
|
@ -8,7 +8,7 @@
|
||||
* Copyright 2007, Michael Wu <flamingice@sourmilk.net>
|
||||
* Copyright 2013-2014 Intel Mobile Communications GmbH
|
||||
* Copyright (C) 2015 - 2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018 - 2023 Intel Corporation
|
||||
* Copyright (C) 2018 - 2024 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
@ -2918,6 +2918,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
/* other links will be destroyed */
|
||||
sdata->deflink.u.mgd.bss = NULL;
|
||||
sdata->deflink.smps_mode = IEEE80211_SMPS_OFF;
|
||||
|
||||
netif_carrier_off(sdata->dev);
|
||||
|
||||
@ -5045,9 +5046,6 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
|
||||
if (!link)
|
||||
return 0;
|
||||
|
||||
/* will change later if needed */
|
||||
link->smps_mode = IEEE80211_SMPS_OFF;
|
||||
|
||||
/*
|
||||
* If this fails (possibly due to channel context sharing
|
||||
* on incompatible channels, e.g. 80+80 and 160 sharing the
|
||||
@ -7096,6 +7094,7 @@ void ieee80211_mgd_setup_link(struct ieee80211_link_data *link)
|
||||
link->u.mgd.p2p_noa_index = -1;
|
||||
link->u.mgd.conn_flags = 0;
|
||||
link->conf->bssid = link->u.mgd.bssid;
|
||||
link->smps_mode = IEEE80211_SMPS_OFF;
|
||||
|
||||
wiphy_work_init(&link->u.mgd.request_smps_work,
|
||||
ieee80211_request_smps_mgd_work);
|
||||
@ -7309,6 +7308,75 @@ out_err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static bool ieee80211_mgd_csa_present(struct ieee80211_sub_if_data *sdata,
|
||||
const struct cfg80211_bss_ies *ies,
|
||||
u8 cur_channel, bool ignore_ecsa)
|
||||
{
|
||||
const struct element *csa_elem, *ecsa_elem;
|
||||
struct ieee80211_channel_sw_ie *csa = NULL;
|
||||
struct ieee80211_ext_chansw_ie *ecsa = NULL;
|
||||
|
||||
if (!ies)
|
||||
return false;
|
||||
|
||||
csa_elem = cfg80211_find_elem(WLAN_EID_CHANNEL_SWITCH,
|
||||
ies->data, ies->len);
|
||||
if (csa_elem && csa_elem->datalen == sizeof(*csa))
|
||||
csa = (void *)csa_elem->data;
|
||||
|
||||
ecsa_elem = cfg80211_find_elem(WLAN_EID_EXT_CHANSWITCH_ANN,
|
||||
ies->data, ies->len);
|
||||
if (ecsa_elem && ecsa_elem->datalen == sizeof(*ecsa))
|
||||
ecsa = (void *)ecsa_elem->data;
|
||||
|
||||
if (csa && csa->count == 0)
|
||||
csa = NULL;
|
||||
if (csa && !csa->mode && csa->new_ch_num == cur_channel)
|
||||
csa = NULL;
|
||||
|
||||
if (ecsa && ecsa->count == 0)
|
||||
ecsa = NULL;
|
||||
if (ecsa && !ecsa->mode && ecsa->new_ch_num == cur_channel)
|
||||
ecsa = NULL;
|
||||
|
||||
if (ignore_ecsa && ecsa) {
|
||||
sdata_info(sdata,
|
||||
"Ignoring ECSA in probe response - was considered stuck!\n");
|
||||
return csa;
|
||||
}
|
||||
|
||||
return csa || ecsa;
|
||||
}
|
||||
|
||||
static bool ieee80211_mgd_csa_in_process(struct ieee80211_sub_if_data *sdata,
|
||||
struct cfg80211_bss *bss)
|
||||
{
|
||||
u8 cur_channel;
|
||||
bool ret;
|
||||
|
||||
cur_channel = ieee80211_frequency_to_channel(bss->channel->center_freq);
|
||||
|
||||
rcu_read_lock();
|
||||
if (ieee80211_mgd_csa_present(sdata,
|
||||
rcu_dereference(bss->beacon_ies),
|
||||
cur_channel, false)) {
|
||||
ret = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (ieee80211_mgd_csa_present(sdata,
|
||||
rcu_dereference(bss->proberesp_ies),
|
||||
cur_channel, bss->proberesp_ecsa_stuck)) {
|
||||
ret = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = false;
|
||||
out:
|
||||
rcu_read_unlock();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* config hooks */
|
||||
int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
||||
struct cfg80211_auth_request *req)
|
||||
@ -7317,7 +7385,6 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
struct ieee80211_mgd_auth_data *auth_data;
|
||||
struct ieee80211_link_data *link;
|
||||
const struct element *csa_elem, *ecsa_elem;
|
||||
u16 auth_alg;
|
||||
int err;
|
||||
bool cont_auth;
|
||||
@ -7360,21 +7427,10 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
||||
if (ifmgd->assoc_data)
|
||||
return -EBUSY;
|
||||
|
||||
rcu_read_lock();
|
||||
csa_elem = ieee80211_bss_get_elem(req->bss, WLAN_EID_CHANNEL_SWITCH);
|
||||
ecsa_elem = ieee80211_bss_get_elem(req->bss,
|
||||
WLAN_EID_EXT_CHANSWITCH_ANN);
|
||||
if ((csa_elem &&
|
||||
csa_elem->datalen == sizeof(struct ieee80211_channel_sw_ie) &&
|
||||
((struct ieee80211_channel_sw_ie *)csa_elem->data)->count != 0) ||
|
||||
(ecsa_elem &&
|
||||
ecsa_elem->datalen == sizeof(struct ieee80211_ext_chansw_ie) &&
|
||||
((struct ieee80211_ext_chansw_ie *)ecsa_elem->data)->count != 0)) {
|
||||
rcu_read_unlock();
|
||||
if (ieee80211_mgd_csa_in_process(sdata, req->bss)) {
|
||||
sdata_info(sdata, "AP is in CSA process, reject auth\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
auth_data = kzalloc(sizeof(*auth_data) + req->auth_data_len +
|
||||
req->ie_len, GFP_KERNEL);
|
||||
@ -7684,7 +7740,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
struct ieee80211_mgd_assoc_data *assoc_data;
|
||||
const struct element *ssid_elem, *csa_elem, *ecsa_elem;
|
||||
const struct element *ssid_elem;
|
||||
struct ieee80211_vif_cfg *vif_cfg = &sdata->vif.cfg;
|
||||
ieee80211_conn_flags_t conn_flags = 0;
|
||||
struct ieee80211_link_data *link;
|
||||
@ -7707,23 +7763,15 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
cbss = req->link_id < 0 ? req->bss : req->links[req->link_id].bss;
|
||||
|
||||
rcu_read_lock();
|
||||
ssid_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_SSID);
|
||||
if (!ssid_elem || ssid_elem->datalen > sizeof(assoc_data->ssid)) {
|
||||
rcu_read_unlock();
|
||||
if (ieee80211_mgd_csa_in_process(sdata, cbss)) {
|
||||
sdata_info(sdata, "AP is in CSA process, reject assoc\n");
|
||||
kfree(assoc_data);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
csa_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_CHANNEL_SWITCH);
|
||||
ecsa_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_EXT_CHANSWITCH_ANN);
|
||||
if ((csa_elem &&
|
||||
csa_elem->datalen == sizeof(struct ieee80211_channel_sw_ie) &&
|
||||
((struct ieee80211_channel_sw_ie *)csa_elem->data)->count != 0) ||
|
||||
(ecsa_elem &&
|
||||
ecsa_elem->datalen == sizeof(struct ieee80211_ext_chansw_ie) &&
|
||||
((struct ieee80211_ext_chansw_ie *)ecsa_elem->data)->count != 0)) {
|
||||
sdata_info(sdata, "AP is in CSA process, reject assoc\n");
|
||||
rcu_read_lock();
|
||||
ssid_elem = ieee80211_bss_get_elem(cbss, WLAN_EID_SSID);
|
||||
if (!ssid_elem || ssid_elem->datalen > sizeof(assoc_data->ssid)) {
|
||||
rcu_read_unlock();
|
||||
kfree(assoc_data);
|
||||
return -EINVAL;
|
||||
@ -7998,8 +8046,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
rcu_read_lock();
|
||||
beacon_ies = rcu_dereference(req->bss->beacon_ies);
|
||||
|
||||
if (beacon_ies) {
|
||||
if (!beacon_ies) {
|
||||
/*
|
||||
* Wait up to one beacon interval ...
|
||||
* should this be more if we miss one?
|
||||
@ -8080,6 +8127,7 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
||||
ieee80211_report_disconnect(sdata, frame_buf,
|
||||
sizeof(frame_buf), true,
|
||||
req->reason_code, false);
|
||||
drv_mgd_complete_tx(sdata->local, sdata, &info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
* Copyright 2007, Michael Wu <flamingice@sourmilk.net>
|
||||
* Copyright 2013-2015 Intel Mobile Communications GmbH
|
||||
* Copyright 2016-2017 Intel Deutschland GmbH
|
||||
* Copyright (C) 2018-2023 Intel Corporation
|
||||
* Copyright (C) 2018-2024 Intel Corporation
|
||||
*/
|
||||
|
||||
#include <linux/if_arp.h>
|
||||
@ -237,14 +237,18 @@ ieee80211_bss_info_update(struct ieee80211_local *local,
|
||||
}
|
||||
|
||||
static bool ieee80211_scan_accept_presp(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_channel *channel,
|
||||
u32 scan_flags, const u8 *da)
|
||||
{
|
||||
if (!sdata)
|
||||
return false;
|
||||
/* accept broadcast for OCE */
|
||||
if (scan_flags & NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP &&
|
||||
is_broadcast_ether_addr(da))
|
||||
|
||||
/* accept broadcast on 6 GHz and for OCE */
|
||||
if (is_broadcast_ether_addr(da) &&
|
||||
(channel->band == NL80211_BAND_6GHZ ||
|
||||
scan_flags & NL80211_SCAN_FLAG_ACCEPT_BCAST_PROBE_RESP))
|
||||
return true;
|
||||
|
||||
if (scan_flags & NL80211_SCAN_FLAG_RANDOM_ADDR)
|
||||
return true;
|
||||
return ether_addr_equal(da, sdata->vif.addr);
|
||||
@ -293,6 +297,12 @@ void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb)
|
||||
wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work, 0);
|
||||
}
|
||||
|
||||
channel = ieee80211_get_channel_khz(local->hw.wiphy,
|
||||
ieee80211_rx_status_to_khz(rx_status));
|
||||
|
||||
if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
|
||||
return;
|
||||
|
||||
if (ieee80211_is_probe_resp(mgmt->frame_control)) {
|
||||
struct cfg80211_scan_request *scan_req;
|
||||
struct cfg80211_sched_scan_request *sched_scan_req;
|
||||
@ -310,19 +320,15 @@ void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb)
|
||||
/* ignore ProbeResp to foreign address or non-bcast (OCE)
|
||||
* unless scanning with randomised address
|
||||
*/
|
||||
if (!ieee80211_scan_accept_presp(sdata1, scan_req_flags,
|
||||
if (!ieee80211_scan_accept_presp(sdata1, channel,
|
||||
scan_req_flags,
|
||||
mgmt->da) &&
|
||||
!ieee80211_scan_accept_presp(sdata2, sched_scan_req_flags,
|
||||
!ieee80211_scan_accept_presp(sdata2, channel,
|
||||
sched_scan_req_flags,
|
||||
mgmt->da))
|
||||
return;
|
||||
}
|
||||
|
||||
channel = ieee80211_get_channel_khz(local->hw.wiphy,
|
||||
ieee80211_rx_status_to_khz(rx_status));
|
||||
|
||||
if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
|
||||
return;
|
||||
|
||||
bss = ieee80211_bss_info_update(local, rx_status,
|
||||
mgmt, skb->len,
|
||||
channel);
|
||||
|
@ -3100,10 +3100,11 @@ void ieee80211_check_fast_xmit(struct sta_info *sta)
|
||||
/* DA SA BSSID */
|
||||
build.da_offs = offsetof(struct ieee80211_hdr, addr1);
|
||||
build.sa_offs = offsetof(struct ieee80211_hdr, addr2);
|
||||
rcu_read_lock();
|
||||
link = rcu_dereference(sdata->link[tdls_link_id]);
|
||||
if (WARN_ON_ONCE(!link))
|
||||
break;
|
||||
memcpy(hdr->addr3, link->u.mgd.bssid, ETH_ALEN);
|
||||
if (!WARN_ON_ONCE(!link))
|
||||
memcpy(hdr->addr3, link->u.mgd.bssid, ETH_ALEN);
|
||||
rcu_read_unlock();
|
||||
build.hdr_len = 24;
|
||||
break;
|
||||
}
|
||||
|
@ -23,8 +23,6 @@ void ieee80211_check_wbrf_support(struct ieee80211_local *local)
|
||||
return;
|
||||
|
||||
local->wbrf_supported = acpi_amd_wbrf_supported_producer(dev);
|
||||
dev_dbg(dev, "WBRF is %s supported\n",
|
||||
local->wbrf_supported ? "" : "not");
|
||||
}
|
||||
|
||||
static void get_chan_freq_boundary(u32 center_freq, u32 bandwidth, u64 *start, u64 *end)
|
||||
|
@ -1154,6 +1154,7 @@ static int ip_set_create(struct sk_buff *skb, const struct nfnl_info *info,
|
||||
return ret;
|
||||
|
||||
cleanup:
|
||||
set->variant->cancel_gc(set);
|
||||
set->variant->destroy(set);
|
||||
put_out:
|
||||
module_put(set->type->me);
|
||||
@ -2378,6 +2379,7 @@ ip_set_net_exit(struct net *net)
|
||||
set = ip_set(inst, i);
|
||||
if (set) {
|
||||
ip_set(inst, i) = NULL;
|
||||
set->variant->cancel_gc(set);
|
||||
ip_set_destroy_set(set);
|
||||
}
|
||||
}
|
||||
|
@ -432,7 +432,7 @@ mtype_ahash_destroy(struct ip_set *set, struct htable *t, bool ext_destroy)
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < jhash_size(t->htable_bits); i++) {
|
||||
n = __ipset_dereference(hbucket(t, i));
|
||||
n = (__force struct hbucket *)hbucket(t, i);
|
||||
if (!n)
|
||||
continue;
|
||||
if (set->extensions & IPSET_EXT_DESTROY && ext_destroy)
|
||||
@ -452,7 +452,7 @@ mtype_destroy(struct ip_set *set)
|
||||
struct htype *h = set->data;
|
||||
struct list_head *l, *lt;
|
||||
|
||||
mtype_ahash_destroy(set, ipset_dereference_nfnl(h->table), true);
|
||||
mtype_ahash_destroy(set, (__force struct htable *)h->table, true);
|
||||
list_for_each_safe(l, lt, &h->ad) {
|
||||
list_del(l);
|
||||
kfree(l);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user