mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge tag 'net-7.1-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Jakub Kicinski:
"Including fixes from Netfilter, wireless and Bluetooth.
Current release - fix to a fix:
- Bluetooth: MGMT: fix backward compatibility with bluetoothd
which adds stray bytes to MGMT_OP_ADD_EXT_ADV_DATA
Previous releases - regressions:
- af_unix: fix inq_len update inaccuracy on partial read
- eth: fec: fix pinctrl default state restore order on resume
- wifi: iwlwifi:
- mvm: don't support the reset handshake for old firmwares
- pcie: simplify the resume flow if fast resume is not used,
work around NIC access failures
Previous releases - always broken:
- Bluetooth: L2CAP: reject BR/EDR signaling packets over MTUsig
- sctp: fix a couple of bugs in COOKIE_ECHO processing
- sched: fix pedit partial COW leading to page cache corruption
- wifi: nl80211: reject oversized EMA RNR lists
- netfilter:
- conntrack_irc: fix possible out-of-bounds read
- bridge: make ebt_snat ARP rewrite writable
- appletalk: zero-initialize aarp_entry to prevent heap info leak
- ipv4: restrict IPOPT_SSRR and IPOPT_LSRR options
- mptcp: fix number of bugs reported by AI scans and discovered
during NVMe over MPTCP testing"
* tag 'net-7.1-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (85 commits)
Reapply "bnxt_en: bring back rtnl_lock() in the bnxt_open() path"
udp: clear skb->dev before running a sockmap verdict
sctp: purge outqueue on stale COOKIE-ECHO handling
bonding: annotate data-races arcound churn variables
net/802/mrp: fix vector attribute parsing in mrp_pdu_parse_vecattr
rtase: Avoid sleeping in get_stats64()
ieee802154: 6lowpan: only accept IPv6 packets in lowpan_xmit()
ipv6: mcast: Fix use-after-free when processing MLD queries
selftests: net: add vxlan vnifilter notification test
vxlan: vnifilter: fix spurious notification on VNI update
vxlan: vnifilter: send notification on VNI add
rtase: Reset TX subqueue when clearing TX ring
octeontx2-af: npc: Fix CPT channel mask in npc_install_flow
dt-bindings: ethernet: eswin: fix hsp-sp-csr backward compatibility
sctp: validate cached peer INIT chunk length in COOKIE_ECHO processing
net/sched: fix pedit partial COW leading to page cache corruption
vsock/vmci: fix sk_ack_backlog leak on failed handshake
net: bonding: fix NULL pointer dereference in bond_do_ioctl()
geneve: fix length used in GRO hint UDP checksum adjustment
net: ethernet: mtk_eth_soc: Fix use-after-free in metadata dst teardown
...
This commit is contained in:
@@ -84,7 +84,8 @@ properties:
|
||||
This reference is provided for background information only.
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
items:
|
||||
- items:
|
||||
- minItems: 4
|
||||
items:
|
||||
- description: Phandle to HSP(High-Speed Peripheral) device
|
||||
- description: Offset of phy control register for internal
|
||||
or external clock selection
|
||||
|
||||
@@ -1386,8 +1386,8 @@ static void ad_churn_machine(struct port *port)
|
||||
{
|
||||
if (port->sm_vars & AD_PORT_CHURNED) {
|
||||
port->sm_vars &= ~AD_PORT_CHURNED;
|
||||
port->sm_churn_actor_state = AD_CHURN_MONITOR;
|
||||
port->sm_churn_partner_state = AD_CHURN_MONITOR;
|
||||
WRITE_ONCE(port->sm_churn_actor_state, AD_CHURN_MONITOR);
|
||||
WRITE_ONCE(port->sm_churn_partner_state, AD_CHURN_MONITOR);
|
||||
port->sm_churn_actor_timer_counter =
|
||||
__ad_timer_to_ticks(AD_ACTOR_CHURN_TIMER, 0);
|
||||
port->sm_churn_partner_timer_counter =
|
||||
@@ -1398,20 +1398,22 @@ static void ad_churn_machine(struct port *port)
|
||||
!(--port->sm_churn_actor_timer_counter) &&
|
||||
port->sm_churn_actor_state == AD_CHURN_MONITOR) {
|
||||
if (port->actor_oper_port_state & LACP_STATE_SYNCHRONIZATION) {
|
||||
port->sm_churn_actor_state = AD_NO_CHURN;
|
||||
WRITE_ONCE(port->sm_churn_actor_state, AD_NO_CHURN);
|
||||
} else {
|
||||
port->churn_actor_count++;
|
||||
port->sm_churn_actor_state = AD_CHURN;
|
||||
WRITE_ONCE(port->churn_actor_count,
|
||||
port->churn_actor_count + 1);
|
||||
WRITE_ONCE(port->sm_churn_actor_state, AD_CHURN);
|
||||
}
|
||||
}
|
||||
if (port->sm_churn_partner_timer_counter &&
|
||||
!(--port->sm_churn_partner_timer_counter) &&
|
||||
port->sm_churn_partner_state == AD_CHURN_MONITOR) {
|
||||
if (port->partner_oper.port_state & LACP_STATE_SYNCHRONIZATION) {
|
||||
port->sm_churn_partner_state = AD_NO_CHURN;
|
||||
WRITE_ONCE(port->sm_churn_partner_state, AD_NO_CHURN);
|
||||
} else {
|
||||
port->churn_partner_count++;
|
||||
port->sm_churn_partner_state = AD_CHURN;
|
||||
WRITE_ONCE(port->churn_partner_count,
|
||||
port->churn_partner_count + 1);
|
||||
WRITE_ONCE(port->sm_churn_partner_state, AD_CHURN);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4621,11 +4621,11 @@ static int bond_do_ioctl(struct net_device *bond_dev, struct ifreq *ifr, int cmd
|
||||
|
||||
slave_dev = __dev_get_by_name(net, ifr->ifr_slave);
|
||||
|
||||
slave_dbg(bond_dev, slave_dev, "slave_dev=%p:\n", slave_dev);
|
||||
|
||||
if (!slave_dev)
|
||||
return -ENODEV;
|
||||
|
||||
slave_dbg(bond_dev, slave_dev, "slave_dev=%p:\n", slave_dev);
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCBONDENSLAVE:
|
||||
res = bond_enslave(bond_dev, slave_dev, NULL);
|
||||
|
||||
@@ -82,10 +82,10 @@ static int bond_fill_slave_info(struct sk_buff *skb,
|
||||
goto nla_put_failure_rcu;
|
||||
|
||||
if (nla_put_u8(skb, IFLA_BOND_SLAVE_AD_CHURN_ACTOR_STATE,
|
||||
ad_port->sm_churn_actor_state))
|
||||
READ_ONCE(ad_port->sm_churn_actor_state)))
|
||||
goto nla_put_failure_rcu;
|
||||
if (nla_put_u8(skb, IFLA_BOND_SLAVE_AD_CHURN_PARTNER_STATE,
|
||||
ad_port->sm_churn_partner_state))
|
||||
READ_ONCE(ad_port->sm_churn_partner_state)))
|
||||
goto nla_put_failure_rcu;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
@@ -221,13 +221,13 @@ static void bond_info_show_slave(struct seq_file *seq,
|
||||
seq_printf(seq, "Aggregator ID: %d\n",
|
||||
agg->aggregator_identifier);
|
||||
seq_printf(seq, "Actor Churn State: %s\n",
|
||||
bond_3ad_churn_desc(port->sm_churn_actor_state));
|
||||
bond_3ad_churn_desc(READ_ONCE(port->sm_churn_actor_state)));
|
||||
seq_printf(seq, "Partner Churn State: %s\n",
|
||||
bond_3ad_churn_desc(port->sm_churn_partner_state));
|
||||
bond_3ad_churn_desc(READ_ONCE(port->sm_churn_partner_state)));
|
||||
seq_printf(seq, "Actor Churned Count: %d\n",
|
||||
port->churn_actor_count);
|
||||
READ_ONCE(port->churn_actor_count));
|
||||
seq_printf(seq, "Partner Churned Count: %d\n",
|
||||
port->churn_partner_count);
|
||||
READ_ONCE(port->churn_partner_count));
|
||||
|
||||
if (capable(CAP_NET_ADMIN)) {
|
||||
seq_puts(seq, "details actor lacp pdu:\n");
|
||||
|
||||
@@ -2936,7 +2936,7 @@ static void airoha_metadata_dst_free(struct airoha_gdm_port *port)
|
||||
if (!port->dsa_meta[i])
|
||||
continue;
|
||||
|
||||
metadata_dst_free(port->dsa_meta[i]);
|
||||
dst_release(&port->dsa_meta[i]->dst);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1407,8 +1407,10 @@ static int pcnet32_poll(struct napi_struct *napi, int budget)
|
||||
pcnet32_restart(dev, CSR0_START);
|
||||
netif_wake_queue(dev);
|
||||
}
|
||||
spin_unlock_irqrestore(&lp->lock, flags);
|
||||
|
||||
if (work_done < budget && napi_complete_done(napi, work_done)) {
|
||||
spin_lock_irqsave(&lp->lock, flags);
|
||||
/* clear interrupt masks */
|
||||
val = lp->a->read_csr(ioaddr, CSR3);
|
||||
val &= 0x00ff;
|
||||
@@ -1416,9 +1418,9 @@ static int pcnet32_poll(struct napi_struct *napi, int budget)
|
||||
|
||||
/* Set interrupt enable. */
|
||||
lp->a->write_csr(ioaddr, CSR0, CSR0_INTEN);
|
||||
spin_unlock_irqrestore(&lp->lock, flags);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&lp->lock, flags);
|
||||
return work_done;
|
||||
}
|
||||
|
||||
|
||||
@@ -14388,13 +14388,28 @@ static void bnxt_unlock_sp(struct bnxt *bp)
|
||||
netdev_unlock(bp->dev);
|
||||
}
|
||||
|
||||
/* Same as bnxt_lock_sp() with additional rtnl_lock */
|
||||
static void bnxt_rtnl_lock_sp(struct bnxt *bp)
|
||||
{
|
||||
clear_bit(BNXT_STATE_IN_SP_TASK, &bp->state);
|
||||
rtnl_lock();
|
||||
netdev_lock(bp->dev);
|
||||
}
|
||||
|
||||
static void bnxt_rtnl_unlock_sp(struct bnxt *bp)
|
||||
{
|
||||
set_bit(BNXT_STATE_IN_SP_TASK, &bp->state);
|
||||
netdev_unlock(bp->dev);
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
/* Only called from bnxt_sp_task() */
|
||||
static void bnxt_reset(struct bnxt *bp, bool silent)
|
||||
{
|
||||
bnxt_lock_sp(bp);
|
||||
bnxt_rtnl_lock_sp(bp);
|
||||
if (test_bit(BNXT_STATE_OPEN, &bp->state))
|
||||
bnxt_reset_task(bp, silent);
|
||||
bnxt_unlock_sp(bp);
|
||||
bnxt_rtnl_unlock_sp(bp);
|
||||
}
|
||||
|
||||
/* Only called from bnxt_sp_task() */
|
||||
@@ -14402,9 +14417,9 @@ static void bnxt_rx_ring_reset(struct bnxt *bp)
|
||||
{
|
||||
int i;
|
||||
|
||||
bnxt_lock_sp(bp);
|
||||
bnxt_rtnl_lock_sp(bp);
|
||||
if (!test_bit(BNXT_STATE_OPEN, &bp->state)) {
|
||||
bnxt_unlock_sp(bp);
|
||||
bnxt_rtnl_unlock_sp(bp);
|
||||
return;
|
||||
}
|
||||
/* Disable and flush TPA before resetting the RX ring */
|
||||
@@ -14443,7 +14458,7 @@ static void bnxt_rx_ring_reset(struct bnxt *bp)
|
||||
}
|
||||
if (bp->flags & BNXT_FLAG_TPA)
|
||||
bnxt_set_tpa(bp, true);
|
||||
bnxt_unlock_sp(bp);
|
||||
bnxt_rtnl_unlock_sp(bp);
|
||||
}
|
||||
|
||||
static void bnxt_fw_fatal_close(struct bnxt *bp)
|
||||
@@ -15358,15 +15373,17 @@ static void bnxt_fw_reset_task(struct work_struct *work)
|
||||
bp->fw_reset_state = BNXT_FW_RESET_STATE_OPENING;
|
||||
fallthrough;
|
||||
case BNXT_FW_RESET_STATE_OPENING:
|
||||
while (!netdev_trylock(bp->dev)) {
|
||||
while (!rtnl_trylock()) {
|
||||
bnxt_queue_fw_reset_work(bp, HZ / 10);
|
||||
return;
|
||||
}
|
||||
netdev_lock(bp->dev);
|
||||
rc = bnxt_open(bp->dev);
|
||||
if (rc) {
|
||||
netdev_err(bp->dev, "bnxt_open() failed during FW reset\n");
|
||||
bnxt_fw_reset_abort(bp, rc);
|
||||
netdev_unlock(bp->dev);
|
||||
rtnl_unlock();
|
||||
goto ulp_start;
|
||||
}
|
||||
|
||||
@@ -15386,6 +15403,7 @@ static void bnxt_fw_reset_task(struct work_struct *work)
|
||||
bnxt_dl_health_fw_status_update(bp, true);
|
||||
}
|
||||
netdev_unlock(bp->dev);
|
||||
rtnl_unlock();
|
||||
bnxt_ulp_start(bp);
|
||||
bnxt_reenable_sriov(bp);
|
||||
netdev_lock(bp->dev);
|
||||
@@ -16379,7 +16397,7 @@ err_reset:
|
||||
rc);
|
||||
napi_enable_locked(&bnapi->napi);
|
||||
bnxt_db_nq_arm(bp, &cpr->cp_db, cpr->cp_raw_cons);
|
||||
bnxt_reset_task(bp, true);
|
||||
netif_close(dev);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -17230,6 +17248,7 @@ static int bnxt_resume(struct device *device)
|
||||
struct bnxt *bp = netdev_priv(dev);
|
||||
int rc = 0;
|
||||
|
||||
rtnl_lock();
|
||||
netdev_lock(dev);
|
||||
rc = pci_enable_device(bp->pdev);
|
||||
if (rc) {
|
||||
@@ -17274,6 +17293,7 @@ static int bnxt_resume(struct device *device)
|
||||
|
||||
resume_exit:
|
||||
netdev_unlock(bp->dev);
|
||||
rtnl_unlock();
|
||||
if (!rc) {
|
||||
bnxt_ulp_start(bp);
|
||||
bnxt_reenable_sriov(bp);
|
||||
@@ -17445,6 +17465,7 @@ static void bnxt_io_resume(struct pci_dev *pdev)
|
||||
int err;
|
||||
|
||||
netdev_info(bp->dev, "PCI Slot Resume\n");
|
||||
rtnl_lock();
|
||||
netdev_lock(netdev);
|
||||
|
||||
err = bnxt_hwrm_func_qcaps(bp);
|
||||
@@ -17462,6 +17483,7 @@ static void bnxt_io_resume(struct pci_dev *pdev)
|
||||
netif_device_attach(netdev);
|
||||
|
||||
netdev_unlock(netdev);
|
||||
rtnl_unlock();
|
||||
if (!err) {
|
||||
bnxt_ulp_start(bp);
|
||||
bnxt_reenable_sriov(bp);
|
||||
|
||||
@@ -5594,6 +5594,7 @@ static int fec_resume(struct device *dev)
|
||||
if (fep->rpm_active)
|
||||
pm_runtime_force_resume(dev);
|
||||
|
||||
pinctrl_pm_select_default_state(&fep->pdev->dev);
|
||||
ret = fec_enet_clk_enable(ndev, true);
|
||||
if (ret) {
|
||||
rtnl_unlock();
|
||||
@@ -5610,8 +5611,6 @@ static int fec_resume(struct device *dev)
|
||||
val &= ~(FEC_ECR_MAGICEN | FEC_ECR_SLEEP);
|
||||
writel(val, fep->hwp + FEC_ECNTRL);
|
||||
fep->wol_flag &= ~FEC_WOL_FLAG_SLEEP_ON;
|
||||
} else {
|
||||
pinctrl_pm_select_default_state(&fep->pdev->dev);
|
||||
}
|
||||
fec_restart(ndev);
|
||||
netif_tx_lock_bh(ndev);
|
||||
|
||||
@@ -1145,6 +1145,7 @@ int rvu_cpt_lf_teardown(struct rvu *rvu, u16 pcifunc, int blkaddr, int lf,
|
||||
int slot);
|
||||
int rvu_cpt_ctx_flush(struct rvu *rvu, u16 pcifunc);
|
||||
int rvu_cpt_init(struct rvu *rvu);
|
||||
u32 rvu_get_cpt_chan_mask(struct rvu *rvu);
|
||||
|
||||
#define NDC_AF_BANK_MASK GENMASK_ULL(7, 0)
|
||||
#define NDC_AF_BANK_LINE_MASK GENMASK_ULL(31, 16)
|
||||
|
||||
@@ -701,6 +701,19 @@ void npc_set_mcam_action(struct rvu *rvu, struct npc_mcam *mcam,
|
||||
return rvu_write64(rvu, blkaddr, reg, cfg);
|
||||
}
|
||||
|
||||
u32 rvu_get_cpt_chan_mask(struct rvu *rvu)
|
||||
{
|
||||
/* For cn10k the upper two bits of the channel number are
|
||||
* cpt channel number. with masking out these bits in the
|
||||
* mcam entry, same entry used for NIX will allow packets
|
||||
* received from cpt for parsing.
|
||||
*/
|
||||
if (!is_rvu_otx2(rvu))
|
||||
return NIX_CHAN_CPT_X2P_MASK;
|
||||
else
|
||||
return 0xFFFu;
|
||||
}
|
||||
|
||||
void rvu_npc_install_ucast_entry(struct rvu *rvu, u16 pcifunc,
|
||||
int nixlf, u64 chan, u8 *mac_addr)
|
||||
{
|
||||
@@ -750,7 +763,7 @@ void rvu_npc_install_ucast_entry(struct rvu *rvu, u16 pcifunc,
|
||||
eth_broadcast_addr((u8 *)&req.mask.dmac);
|
||||
req.features = BIT_ULL(NPC_DMAC);
|
||||
req.channel = chan;
|
||||
req.chan_mask = 0xFFFU;
|
||||
req.chan_mask = rvu_get_cpt_chan_mask(rvu);
|
||||
req.intf = pfvf->nix_rx_intf;
|
||||
req.op = action.op;
|
||||
req.hdr.pcifunc = 0; /* AF is requester */
|
||||
@@ -845,11 +858,7 @@ void rvu_npc_install_promisc_entry(struct rvu *rvu, u16 pcifunc,
|
||||
* mcam entry, same entry used for NIX will allow packets
|
||||
* received from cpt for parsing.
|
||||
*/
|
||||
if (!is_rvu_otx2(rvu)) {
|
||||
req.chan_mask = NIX_CHAN_CPT_X2P_MASK;
|
||||
} else {
|
||||
req.chan_mask = 0xFFFU;
|
||||
}
|
||||
req.chan_mask = rvu_get_cpt_chan_mask(rvu);
|
||||
|
||||
if (chan_cnt > 1) {
|
||||
if (!is_power_of_2(chan_cnt)) {
|
||||
@@ -1053,16 +1062,7 @@ void rvu_npc_install_allmulti_entry(struct rvu *rvu, u16 pcifunc, int nixlf,
|
||||
ether_addr_copy(req.mask.dmac, mac_addr);
|
||||
req.features = BIT_ULL(NPC_DMAC);
|
||||
|
||||
/* For cn10k the upper two bits of the channel number are
|
||||
* cpt channel number. with masking out these bits in the
|
||||
* mcam entry, same entry used for NIX will allow packets
|
||||
* received from cpt for parsing.
|
||||
*/
|
||||
if (!is_rvu_otx2(rvu))
|
||||
req.chan_mask = NIX_CHAN_CPT_X2P_MASK;
|
||||
else
|
||||
req.chan_mask = 0xFFFU;
|
||||
|
||||
req.chan_mask = rvu_get_cpt_chan_mask(rvu);
|
||||
req.channel = chan;
|
||||
req.intf = pfvf->nix_rx_intf;
|
||||
req.entry = index;
|
||||
@@ -2192,8 +2192,8 @@ int npc_mcam_rsrcs_init(struct rvu *rvu, int blkaddr)
|
||||
goto free_entry_cntr_map;
|
||||
|
||||
/* Alloc memory for saving target device of mcam rule */
|
||||
mcam->entry2target_pffunc = kmalloc_array(mcam->total_entries,
|
||||
sizeof(u16), GFP_KERNEL);
|
||||
mcam->entry2target_pffunc = kcalloc(mcam->total_entries,
|
||||
sizeof(u16), GFP_KERNEL);
|
||||
if (!mcam->entry2target_pffunc)
|
||||
goto free_cntr_refcnt;
|
||||
|
||||
|
||||
@@ -1820,7 +1820,7 @@ process_flow:
|
||||
|
||||
/* ignore chan_mask in case pf func is not AF, revisit later */
|
||||
if (!is_pffunc_af(req->hdr.pcifunc))
|
||||
req->chan_mask = 0xFFF;
|
||||
req->chan_mask = rvu_get_cpt_chan_mask(rvu);
|
||||
|
||||
err = npc_check_unsupported_flows(rvu, req->features, req->intf);
|
||||
if (err) {
|
||||
|
||||
@@ -3473,7 +3473,7 @@ static void otx2_ndc_sync(struct otx2_nic *pf)
|
||||
req->nix_lf_rx_sync = 1;
|
||||
req->npa_lf_sync = 1;
|
||||
|
||||
if (!otx2_sync_mbox_msg(mbox))
|
||||
if (otx2_sync_mbox_msg(mbox))
|
||||
dev_err(pf->dev, "NDC sync operation failed\n");
|
||||
|
||||
mutex_unlock(&mbox->lock);
|
||||
|
||||
@@ -4491,7 +4491,7 @@ static int mtk_free_dev(struct mtk_eth *eth)
|
||||
for (i = 0; i < ARRAY_SIZE(eth->dsa_meta); i++) {
|
||||
if (!eth->dsa_meta[i])
|
||||
break;
|
||||
metadata_dst_free(eth->dsa_meta[i]);
|
||||
dst_release(ð->dsa_meta[i]->dst);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1002,12 +1002,13 @@ static void cmd_work_handler(struct work_struct *work)
|
||||
ent->callback(-EBUSY, ent->context);
|
||||
mlx5_free_cmd_msg(dev, ent->out);
|
||||
free_msg(dev, ent->in);
|
||||
complete(&ent->slotted);
|
||||
cmd_ent_put(ent);
|
||||
} else {
|
||||
ent->ret = -EBUSY;
|
||||
complete(&ent->done);
|
||||
complete(&ent->slotted);
|
||||
}
|
||||
complete(&ent->slotted);
|
||||
return;
|
||||
}
|
||||
alloc_ret = cmd_alloc_index(cmd, ent);
|
||||
@@ -1017,13 +1018,14 @@ static void cmd_work_handler(struct work_struct *work)
|
||||
ent->callback(-EAGAIN, ent->context);
|
||||
mlx5_free_cmd_msg(dev, ent->out);
|
||||
free_msg(dev, ent->in);
|
||||
complete(&ent->slotted);
|
||||
cmd_ent_put(ent);
|
||||
} else {
|
||||
ent->ret = -EAGAIN;
|
||||
complete(&ent->done);
|
||||
complete(&ent->slotted);
|
||||
}
|
||||
up(&cmd->vars.sem);
|
||||
complete(&ent->slotted);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -1219,6 +1219,36 @@ static void lan743x_mac_set_address(struct lan743x_adapter *adapter,
|
||||
"MAC address set to %pM\n", addr);
|
||||
}
|
||||
|
||||
static void lan743x_mac_rx_enable_fse(struct lan743x_adapter *adapter)
|
||||
{
|
||||
u32 mac_rx;
|
||||
bool rxen;
|
||||
|
||||
mac_rx = lan743x_csr_read(adapter, MAC_RX);
|
||||
if (mac_rx & MAC_RX_FSE_)
|
||||
return;
|
||||
|
||||
rxen = mac_rx & MAC_RX_RXEN_;
|
||||
if (rxen) {
|
||||
mac_rx &= ~MAC_RX_RXEN_;
|
||||
lan743x_csr_write(adapter, MAC_RX, mac_rx);
|
||||
lan743x_csr_wait_for_bit(adapter, MAC_RX, MAC_RX_RXD_,
|
||||
1, 1000, 20000, 100);
|
||||
}
|
||||
|
||||
/* Per AN2948, hardware prevents modification of the FSE bit while the
|
||||
* MAC receiver is enabled (RXEN bit set). Use separate register write
|
||||
* to assert the FSE bit before enabling the RXEN bit in MAC_RX
|
||||
*/
|
||||
mac_rx |= MAC_RX_FSE_;
|
||||
lan743x_csr_write(adapter, MAC_RX, mac_rx);
|
||||
|
||||
if (rxen) {
|
||||
mac_rx |= MAC_RX_RXEN_;
|
||||
lan743x_csr_write(adapter, MAC_RX, mac_rx);
|
||||
}
|
||||
}
|
||||
|
||||
static int lan743x_mac_init(struct lan743x_adapter *adapter)
|
||||
{
|
||||
bool mac_address_valid = true;
|
||||
@@ -1258,6 +1288,8 @@ static int lan743x_mac_init(struct lan743x_adapter *adapter)
|
||||
lan743x_mac_set_address(adapter, adapter->mac_address);
|
||||
eth_hw_addr_set(netdev, adapter->mac_address);
|
||||
|
||||
lan743x_mac_rx_enable_fse(adapter);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -182,6 +182,7 @@
|
||||
#define MAC_RX (0x104)
|
||||
#define MAC_RX_MAX_SIZE_SHIFT_ (16)
|
||||
#define MAC_RX_MAX_SIZE_MASK_ (0x3FFF0000)
|
||||
#define MAC_RX_FSE_ BIT(2)
|
||||
#define MAC_RX_RXD_ BIT(1)
|
||||
#define MAC_RX_RXEN_ BIT(0)
|
||||
|
||||
|
||||
@@ -239,6 +239,8 @@ static void rtase_tx_clear(struct rtase_private *tp)
|
||||
rtase_tx_clear_range(ring, ring->dirty_idx, RTASE_NUM_DESC);
|
||||
ring->cur_idx = 0;
|
||||
ring->dirty_idx = 0;
|
||||
|
||||
netdev_tx_reset_subqueue(tp->dev, i);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1563,8 +1565,9 @@ static void rtase_dump_tally_counter(const struct rtase_private *tp)
|
||||
rtase_w32(tp, RTASE_DTCCR0, cmd);
|
||||
rtase_w32(tp, RTASE_DTCCR0, cmd | RTASE_COUNTER_DUMP);
|
||||
|
||||
err = read_poll_timeout(rtase_r32, val, !(val & RTASE_COUNTER_DUMP),
|
||||
10, 250, false, tp, RTASE_DTCCR0);
|
||||
err = read_poll_timeout_atomic(rtase_r32, val,
|
||||
!(val & RTASE_COUNTER_DUMP),
|
||||
10, 250, false, tp, RTASE_DTCCR0);
|
||||
|
||||
if (err == -ETIMEDOUT)
|
||||
netdev_err(tp->dev, "error occurred in dump tally counter\n");
|
||||
|
||||
@@ -632,7 +632,7 @@ static int geneve_post_decap_hint(const struct sock *sk, struct sk_buff *skb,
|
||||
uh = udp_hdr(skb);
|
||||
uh->len = htons(skb->len - gro_hint->nested_tp_offset);
|
||||
if (uh->check) {
|
||||
len = skb->len - gro_hint->nested_nh_offset;
|
||||
len = skb->len - gro_hint->nested_tp_offset;
|
||||
skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL_CSUM;
|
||||
if (gro_hint->nested_is_v6)
|
||||
uh->check = ~udp_v6_check(len, &ipv6h->saddr,
|
||||
|
||||
@@ -822,6 +822,7 @@ static int sfp_i2c_configure(struct sfp *sfp, struct i2c_adapter *i2c)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
sfp->i2c_block_size = sfp->i2c_max_block_size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user