Networking fixes for 5.14-rc7, including fixes from bpf, wireless and
mac80211 trees. Current release - regressions: - tipc: call tipc_wait_for_connect only when dlen is not 0 - mac80211: fix locking in ieee80211_restart_work() Current release - new code bugs: - bpf: add rcu_read_lock in bpf_get_current_[ancestor_]cgroup_id() - ethernet: ice: fix perout start time rounding - wwan: iosm: prevent underflow in ipc_chnl_cfg_get() Previous releases - regressions: - bpf: clear zext_dst of dead insns - sch_cake: fix srchost/dsthost hashing mode - vrf: reset skb conntrack connection on VRF rcv - net/rds: dma_map_sg is entitled to merge entries Previous releases - always broken: - ethernet: bnxt: fix Tx path locking and races, add Rx path barriers Signed-off-by: Jakub Kicinski <kuba@kernel.org> -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEE6jPA+I1ugmIBA4hXMUZtbf5SIrsFAmEepAYACgkQMUZtbf5S IrugdhAAo6/T9A8MmxU711gwq9BKcubOr2BQC0GYGjhM6Pnhign44kDGdBbl1fmL lt4LTgOwIKZ4bpLYJuwXnq0KpwWG8YKpgdgjvXsc0jXYtDHJvFjzL42vjGGGvAc4 rwIe784dNt3LYppEsADAad2ZdQO25tB+jhQO8MttipNGq8Qvkjib2ttvmLri/hEl hKRHnyQMEZCXbMV4zn+ILjlqLxZ5a2ZPk97qGL9fAafi1O3cjfv5ZDwvOjM3TGE3 DPLdEvYFRDTECGJO3QOK7SzC1NoQA49Bj1hqwbWRUi9tm8A0lPXEUjNleCbC2i7n qi6JBexmme6ZiimJJPeKacn8BcgorPDWm6friL9jiWpndvrWycBmqw5LurgdLVHC nFHjnbji885P6DBZLx8tDbTSXGSpcLoHuv7M3aQbD2DZqQKk/9irKaJMUZ6XwOYm EXM6oqQ13vaSjFH1GOsK0wx/XjcL5t42uRAtG9INlYusaU+ZvFu12TzEt1+PcWpO nF7VUQWQatcidSYdYolciw383siKRiSV1F8d6IEon907GHVrod9ty+yii33CamBf /aUyFULMEf/vaXjmJzhzWABV9vu3QVWd0IxL9oqbbRqNTwFr86hnnRhntqUCje/c vY0VFWQ4CuaTvohKl0I+IhyvUPLUp1iTD51qSbOSKybG6IZ77+U= =ofv+ -----END PGP SIGNATURE----- Merge tag 'net-5.14-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net Pull networking fixes from Jakub Kicinski: "Networking fixes, including fixes from bpf, wireless and mac80211 trees. Current release - regressions: - tipc: call tipc_wait_for_connect only when dlen is not 0 - mac80211: fix locking in ieee80211_restart_work() Current release - new code bugs: - bpf: add rcu_read_lock in bpf_get_current_[ancestor_]cgroup_id() - ethernet: ice: fix perout start time rounding - wwan: iosm: prevent underflow in ipc_chnl_cfg_get() Previous releases - regressions: - bpf: clear zext_dst of dead insns - sch_cake: fix srchost/dsthost hashing mode - vrf: reset skb conntrack connection on VRF rcv - net/rds: dma_map_sg is entitled to merge entries Previous releases - always broken: - ethernet: bnxt: fix Tx path locking and races, add Rx path barriers" * tag 'net-5.14-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (42 commits) net: dpaa2-switch: disable the control interface on error path Revert "flow_offload: action should not be NULL when it is referenced" iavf: Fix ping is lost after untrusted VF had tried to change MAC i40e: Fix ATR queue selection r8152: fix the maximum number of PLA bp for RTL8153C r8152: fix writing USB_BP2_EN mptcp: full fully established support after ADD_ADDR mptcp: fix memory leak on address flush net/rds: dma_map_sg is entitled to merge entries net: mscc: ocelot: allow forwarding from bridge ports to the tag_8021q CPU port net: asix: fix uninit value bugs ovs: clear skb->tstamp in forwarding path net: mdio-mux: Handle -EPROBE_DEFER correctly net: mdio-mux: Don't ignore memory allocation errors net: mdio-mux: Delete unnecessary devm_kfree net: dsa: sja1105: fix use-after-free after calling of_find_compatible_node, or worse sch_cake: fix srchost/dsthost hashing mode ixgbe, xsk: clean up the resources in ixgbe_xsk_pool_enable error path net: qlcnic: add missed unlock in qlcnic_83xx_flash_read32 mac80211: fix locking in ieee80211_restart_work() ...
This commit is contained in:
commit
f87d64319e
@ -284,8 +284,7 @@ static int sja1105_mdiobus_base_tx_register(struct sja1105_private *priv,
|
||||
struct mii_bus *bus;
|
||||
int rc = 0;
|
||||
|
||||
np = of_find_compatible_node(mdio_node, NULL,
|
||||
"nxp,sja1110-base-tx-mdio");
|
||||
np = of_get_compatible_child(mdio_node, "nxp,sja1110-base-tx-mdio");
|
||||
if (!np)
|
||||
return 0;
|
||||
|
||||
@ -339,8 +338,7 @@ static int sja1105_mdiobus_base_t1_register(struct sja1105_private *priv,
|
||||
struct mii_bus *bus;
|
||||
int rc = 0;
|
||||
|
||||
np = of_find_compatible_node(mdio_node, NULL,
|
||||
"nxp,sja1110-base-t1-mdio");
|
||||
np = of_get_compatible_child(mdio_node, "nxp,sja1110-base-t1-mdio");
|
||||
if (!np)
|
||||
return 0;
|
||||
|
||||
|
@ -72,7 +72,8 @@
|
||||
#include "bnxt_debugfs.h"
|
||||
|
||||
#define BNXT_TX_TIMEOUT (5 * HZ)
|
||||
#define BNXT_DEF_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_HW)
|
||||
#define BNXT_DEF_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_HW | \
|
||||
NETIF_MSG_TX_ERR)
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Broadcom BCM573xx network driver");
|
||||
@ -365,6 +366,33 @@ static u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb)
|
||||
return md_dst->u.port_info.port_id;
|
||||
}
|
||||
|
||||
static void bnxt_txr_db_kick(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
|
||||
u16 prod)
|
||||
{
|
||||
bnxt_db_write(bp, &txr->tx_db, prod);
|
||||
txr->kick_pending = 0;
|
||||
}
|
||||
|
||||
static bool bnxt_txr_netif_try_stop_queue(struct bnxt *bp,
|
||||
struct bnxt_tx_ring_info *txr,
|
||||
struct netdev_queue *txq)
|
||||
{
|
||||
netif_tx_stop_queue(txq);
|
||||
|
||||
/* netif_tx_stop_queue() must be done before checking
|
||||
* tx index in bnxt_tx_avail() below, because in
|
||||
* bnxt_tx_int(), we update tx index before checking for
|
||||
* netif_tx_queue_stopped().
|
||||
*/
|
||||
smp_mb();
|
||||
if (bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh) {
|
||||
netif_tx_wake_queue(txq);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
{
|
||||
struct bnxt *bp = netdev_priv(dev);
|
||||
@ -384,6 +412,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
i = skb_get_queue_mapping(skb);
|
||||
if (unlikely(i >= bp->tx_nr_rings)) {
|
||||
dev_kfree_skb_any(skb);
|
||||
atomic_long_inc(&dev->tx_dropped);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
@ -393,8 +422,12 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
|
||||
free_size = bnxt_tx_avail(bp, txr);
|
||||
if (unlikely(free_size < skb_shinfo(skb)->nr_frags + 2)) {
|
||||
netif_tx_stop_queue(txq);
|
||||
return NETDEV_TX_BUSY;
|
||||
/* We must have raced with NAPI cleanup */
|
||||
if (net_ratelimit() && txr->kick_pending)
|
||||
netif_warn(bp, tx_err, dev,
|
||||
"bnxt: ring busy w/ flush pending!\n");
|
||||
if (bnxt_txr_netif_try_stop_queue(bp, txr, txq))
|
||||
return NETDEV_TX_BUSY;
|
||||
}
|
||||
|
||||
length = skb->len;
|
||||
@ -517,21 +550,16 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
||||
normal_tx:
|
||||
if (length < BNXT_MIN_PKT_SIZE) {
|
||||
pad = BNXT_MIN_PKT_SIZE - length;
|
||||
if (skb_pad(skb, pad)) {
|
||||
if (skb_pad(skb, pad))
|
||||
/* SKB already freed. */
|
||||
tx_buf->skb = NULL;
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
goto tx_kick_pending;
|
||||
length = BNXT_MIN_PKT_SIZE;
|
||||
}
|
||||
|
||||
mapping = dma_map_single(&pdev->dev, skb->data, len, DMA_TO_DEVICE);
|
||||
|
||||
if (unlikely(dma_mapping_error(&pdev->dev, mapping))) {
|
||||
dev_kfree_skb_any(skb);
|
||||
tx_buf->skb = NULL;
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
if (unlikely(dma_mapping_error(&pdev->dev, mapping)))
|
||||
goto tx_free;
|
||||
|
||||
dma_unmap_addr_set(tx_buf, mapping, mapping);
|
||||
flags = (len << TX_BD_LEN_SHIFT) | TX_BD_TYPE_LONG_TX_BD |
|
||||
@ -618,24 +646,17 @@ normal_tx:
|
||||
txr->tx_prod = prod;
|
||||
|
||||
if (!netdev_xmit_more() || netif_xmit_stopped(txq))
|
||||
bnxt_db_write(bp, &txr->tx_db, prod);
|
||||
bnxt_txr_db_kick(bp, txr, prod);
|
||||
else
|
||||
txr->kick_pending = 1;
|
||||
|
||||
tx_done:
|
||||
|
||||
if (unlikely(bnxt_tx_avail(bp, txr) <= MAX_SKB_FRAGS + 1)) {
|
||||
if (netdev_xmit_more() && !tx_buf->is_push)
|
||||
bnxt_db_write(bp, &txr->tx_db, prod);
|
||||
bnxt_txr_db_kick(bp, txr, prod);
|
||||
|
||||
netif_tx_stop_queue(txq);
|
||||
|
||||
/* netif_tx_stop_queue() must be done before checking
|
||||
* tx index in bnxt_tx_avail() below, because in
|
||||
* bnxt_tx_int(), we update tx index before checking for
|
||||
* netif_tx_queue_stopped().
|
||||
*/
|
||||
smp_mb();
|
||||
if (bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh)
|
||||
netif_tx_wake_queue(txq);
|
||||
bnxt_txr_netif_try_stop_queue(bp, txr, txq);
|
||||
}
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
@ -648,7 +669,6 @@ tx_dma_error:
|
||||
/* start back at beginning and unmap skb */
|
||||
prod = txr->tx_prod;
|
||||
tx_buf = &txr->tx_buf_ring[prod];
|
||||
tx_buf->skb = NULL;
|
||||
dma_unmap_single(&pdev->dev, dma_unmap_addr(tx_buf, mapping),
|
||||
skb_headlen(skb), PCI_DMA_TODEVICE);
|
||||
prod = NEXT_TX(prod);
|
||||
@ -662,7 +682,13 @@ tx_dma_error:
|
||||
PCI_DMA_TODEVICE);
|
||||
}
|
||||
|
||||
tx_free:
|
||||
dev_kfree_skb_any(skb);
|
||||
tx_kick_pending:
|
||||
if (txr->kick_pending)
|
||||
bnxt_txr_db_kick(bp, txr, txr->tx_prod);
|
||||
txr->tx_buf_ring[txr->tx_prod].skb = NULL;
|
||||
atomic_long_inc(&dev->tx_dropped);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
@ -732,14 +758,9 @@ next_tx_int:
|
||||
smp_mb();
|
||||
|
||||
if (unlikely(netif_tx_queue_stopped(txq)) &&
|
||||
(bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh)) {
|
||||
__netif_tx_lock(txq, smp_processor_id());
|
||||
if (netif_tx_queue_stopped(txq) &&
|
||||
bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh &&
|
||||
txr->dev_state != BNXT_DEV_STATE_CLOSING)
|
||||
netif_tx_wake_queue(txq);
|
||||
__netif_tx_unlock(txq);
|
||||
}
|
||||
bnxt_tx_avail(bp, txr) > bp->tx_wake_thresh &&
|
||||
READ_ONCE(txr->dev_state) != BNXT_DEV_STATE_CLOSING)
|
||||
netif_tx_wake_queue(txq);
|
||||
}
|
||||
|
||||
static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping,
|
||||
@ -1767,6 +1788,10 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
|
||||
if (!RX_CMP_VALID(rxcmp1, tmp_raw_cons))
|
||||
return -EBUSY;
|
||||
|
||||
/* The valid test of the entry must be done first before
|
||||
* reading any further.
|
||||
*/
|
||||
dma_rmb();
|
||||
prod = rxr->rx_prod;
|
||||
|
||||
if (cmp_type == CMP_TYPE_RX_L2_TPA_START_CMP) {
|
||||
@ -1989,6 +2014,10 @@ static int bnxt_force_rx_discard(struct bnxt *bp,
|
||||
if (!RX_CMP_VALID(rxcmp1, tmp_raw_cons))
|
||||
return -EBUSY;
|
||||
|
||||
/* The valid test of the entry must be done first before
|
||||
* reading any further.
|
||||
*/
|
||||
dma_rmb();
|
||||
cmp_type = RX_CMP_TYPE(rxcmp);
|
||||
if (cmp_type == CMP_TYPE_RX_L2_CMP) {
|
||||
rxcmp1->rx_cmp_cfa_code_errors_v2 |=
|
||||
@ -2454,6 +2483,10 @@ static int bnxt_poll_nitroa0(struct napi_struct *napi, int budget)
|
||||
if (!TX_CMP_VALID(txcmp, raw_cons))
|
||||
break;
|
||||
|
||||
/* The valid test of the entry must be done first before
|
||||
* reading any further.
|
||||
*/
|
||||
dma_rmb();
|
||||
if ((TX_CMP_TYPE(txcmp) & 0x30) == 0x10) {
|
||||
tmp_raw_cons = NEXT_RAW_CMP(raw_cons);
|
||||
cp_cons = RING_CMP(tmp_raw_cons);
|
||||
@ -9128,10 +9161,9 @@ static void bnxt_disable_napi(struct bnxt *bp)
|
||||
for (i = 0; i < bp->cp_nr_rings; i++) {
|
||||
struct bnxt_cp_ring_info *cpr = &bp->bnapi[i]->cp_ring;
|
||||
|
||||
napi_disable(&bp->bnapi[i]->napi);
|
||||
if (bp->bnapi[i]->rx_ring)
|
||||
cancel_work_sync(&cpr->dim.work);
|
||||
|
||||
napi_disable(&bp->bnapi[i]->napi);
|
||||
}
|
||||
}
|
||||
|
||||
@ -9165,9 +9197,11 @@ void bnxt_tx_disable(struct bnxt *bp)
|
||||
if (bp->tx_ring) {
|
||||
for (i = 0; i < bp->tx_nr_rings; i++) {
|
||||
txr = &bp->tx_ring[i];
|
||||
txr->dev_state = BNXT_DEV_STATE_CLOSING;
|
||||
WRITE_ONCE(txr->dev_state, BNXT_DEV_STATE_CLOSING);
|
||||
}
|
||||
}
|
||||
/* Make sure napi polls see @dev_state change */
|
||||
synchronize_net();
|
||||
/* Drop carrier first to prevent TX timeout */
|
||||
netif_carrier_off(bp->dev);
|
||||
/* Stop all TX queues */
|
||||
@ -9181,8 +9215,10 @@ void bnxt_tx_enable(struct bnxt *bp)
|
||||
|
||||
for (i = 0; i < bp->tx_nr_rings; i++) {
|
||||
txr = &bp->tx_ring[i];
|
||||
txr->dev_state = 0;
|
||||
WRITE_ONCE(txr->dev_state, 0);
|
||||
}
|
||||
/* Make sure napi polls see @dev_state change */
|
||||
synchronize_net();
|
||||
netif_tx_wake_all_queues(bp->dev);
|
||||
if (bp->link_info.link_up)
|
||||
netif_carrier_on(bp->dev);
|
||||
@ -10768,6 +10804,9 @@ static bool bnxt_rfs_supported(struct bnxt *bp)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
/* 212 firmware is broken for aRFS */
|
||||
if (BNXT_FW_MAJ(bp) == 212)
|
||||
return false;
|
||||
if (BNXT_PF(bp) && !BNXT_CHIP_TYPE_NITRO_A0(bp))
|
||||
return true;
|
||||
if (bp->flags & BNXT_FLAG_NEW_RSS_CAP)
|
||||
|
@ -786,6 +786,7 @@ struct bnxt_tx_ring_info {
|
||||
u16 tx_prod;
|
||||
u16 tx_cons;
|
||||
u16 txq_index;
|
||||
u8 kick_pending;
|
||||
struct bnxt_db_info tx_db;
|
||||
|
||||
struct tx_bd *tx_desc_ring[MAX_TX_PAGES];
|
||||
|
@ -3038,17 +3038,6 @@ static int dpaa2_switch_port_init(struct ethsw_port_priv *port_priv, u16 port)
|
||||
return err;
|
||||
}
|
||||
|
||||
static void dpaa2_switch_takedown(struct fsl_mc_device *sw_dev)
|
||||
{
|
||||
struct device *dev = &sw_dev->dev;
|
||||
struct ethsw_core *ethsw = dev_get_drvdata(dev);
|
||||
int err;
|
||||
|
||||
err = dpsw_close(ethsw->mc_io, 0, ethsw->dpsw_handle);
|
||||
if (err)
|
||||
dev_warn(dev, "dpsw_close err %d\n", err);
|
||||
}
|
||||
|
||||
static void dpaa2_switch_ctrl_if_teardown(struct ethsw_core *ethsw)
|
||||
{
|
||||
dpsw_ctrl_if_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
|
||||
@ -3058,6 +3047,21 @@ static void dpaa2_switch_ctrl_if_teardown(struct ethsw_core *ethsw)
|
||||
dpaa2_switch_free_dpbp(ethsw);
|
||||
}
|
||||
|
||||
static void dpaa2_switch_teardown(struct fsl_mc_device *sw_dev)
|
||||
{
|
||||
struct device *dev = &sw_dev->dev;
|
||||
struct ethsw_core *ethsw = dev_get_drvdata(dev);
|
||||
int err;
|
||||
|
||||
dpaa2_switch_ctrl_if_teardown(ethsw);
|
||||
|
||||
destroy_workqueue(ethsw->workqueue);
|
||||
|
||||
err = dpsw_close(ethsw->mc_io, 0, ethsw->dpsw_handle);
|
||||
if (err)
|
||||
dev_warn(dev, "dpsw_close err %d\n", err);
|
||||
}
|
||||
|
||||
static int dpaa2_switch_remove(struct fsl_mc_device *sw_dev)
|
||||
{
|
||||
struct ethsw_port_priv *port_priv;
|
||||
@ -3068,8 +3072,6 @@ static int dpaa2_switch_remove(struct fsl_mc_device *sw_dev)
|
||||
dev = &sw_dev->dev;
|
||||
ethsw = dev_get_drvdata(dev);
|
||||
|
||||
dpaa2_switch_ctrl_if_teardown(ethsw);
|
||||
|
||||
dpaa2_switch_teardown_irqs(sw_dev);
|
||||
|
||||
dpsw_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
|
||||
@ -3084,9 +3086,7 @@ static int dpaa2_switch_remove(struct fsl_mc_device *sw_dev)
|
||||
kfree(ethsw->acls);
|
||||
kfree(ethsw->ports);
|
||||
|
||||
dpaa2_switch_takedown(sw_dev);
|
||||
|
||||
destroy_workqueue(ethsw->workqueue);
|
||||
dpaa2_switch_teardown(sw_dev);
|
||||
|
||||
fsl_mc_portal_free(ethsw->mc_io);
|
||||
|
||||
@ -3199,7 +3199,7 @@ static int dpaa2_switch_probe(struct fsl_mc_device *sw_dev)
|
||||
GFP_KERNEL);
|
||||
if (!(ethsw->ports)) {
|
||||
err = -ENOMEM;
|
||||
goto err_takedown;
|
||||
goto err_teardown;
|
||||
}
|
||||
|
||||
ethsw->fdbs = kcalloc(ethsw->sw_attr.num_ifs, sizeof(*ethsw->fdbs),
|
||||
@ -3270,8 +3270,8 @@ err_free_fdbs:
|
||||
err_free_ports:
|
||||
kfree(ethsw->ports);
|
||||
|
||||
err_takedown:
|
||||
dpaa2_switch_takedown(sw_dev);
|
||||
err_teardown:
|
||||
dpaa2_switch_teardown(sw_dev);
|
||||
|
||||
err_free_cmdport:
|
||||
fsl_mc_portal_free(ethsw->mc_io);
|
||||
|
@ -3663,8 +3663,7 @@ u16 i40e_lan_select_queue(struct net_device *netdev,
|
||||
|
||||
/* is DCB enabled at all? */
|
||||
if (vsi->tc_config.numtc == 1)
|
||||
return i40e_swdcb_skb_tx_hash(netdev, skb,
|
||||
netdev->real_num_tx_queues);
|
||||
return netdev_pick_tx(netdev, skb, sb_dev);
|
||||
|
||||
prio = skb->priority;
|
||||
hw = &vsi->back->hw;
|
||||
|
@ -136,6 +136,7 @@ struct iavf_q_vector {
|
||||
struct iavf_mac_filter {
|
||||
struct list_head list;
|
||||
u8 macaddr[ETH_ALEN];
|
||||
bool is_new_mac; /* filter is new, wait for PF decision */
|
||||
bool remove; /* filter needs to be removed */
|
||||
bool add; /* filter needs to be added */
|
||||
};
|
||||
|
@ -751,6 +751,7 @@ struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter,
|
||||
|
||||
list_add_tail(&f->list, &adapter->mac_filter_list);
|
||||
f->add = true;
|
||||
f->is_new_mac = true;
|
||||
adapter->aq_required |= IAVF_FLAG_AQ_ADD_MAC_FILTER;
|
||||
} else {
|
||||
f->remove = false;
|
||||
|
@ -540,6 +540,47 @@ void iavf_del_ether_addrs(struct iavf_adapter *adapter)
|
||||
kfree(veal);
|
||||
}
|
||||
|
||||
/**
|
||||
* iavf_mac_add_ok
|
||||
* @adapter: adapter structure
|
||||
*
|
||||
* Submit list of filters based on PF response.
|
||||
**/
|
||||
static void iavf_mac_add_ok(struct iavf_adapter *adapter)
|
||||
{
|
||||
struct iavf_mac_filter *f, *ftmp;
|
||||
|
||||
spin_lock_bh(&adapter->mac_vlan_list_lock);
|
||||
list_for_each_entry_safe(f, ftmp, &adapter->mac_filter_list, list) {
|
||||
f->is_new_mac = false;
|
||||
}
|
||||
spin_unlock_bh(&adapter->mac_vlan_list_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* iavf_mac_add_reject
|
||||
* @adapter: adapter structure
|
||||
*
|
||||
* Remove filters from list based on PF response.
|
||||
**/
|
||||
static void iavf_mac_add_reject(struct iavf_adapter *adapter)
|
||||
{
|
||||
struct net_device *netdev = adapter->netdev;
|
||||
struct iavf_mac_filter *f, *ftmp;
|
||||
|
||||
spin_lock_bh(&adapter->mac_vlan_list_lock);
|
||||
list_for_each_entry_safe(f, ftmp, &adapter->mac_filter_list, list) {
|
||||
if (f->remove && ether_addr_equal(f->macaddr, netdev->dev_addr))
|
||||
f->remove = false;
|
||||
|
||||
if (f->is_new_mac) {
|
||||
list_del(&f->list);
|
||||
kfree(f);
|
||||
}
|
||||
}
|
||||
spin_unlock_bh(&adapter->mac_vlan_list_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* iavf_add_vlans
|
||||
* @adapter: adapter structure
|
||||
@ -1492,6 +1533,7 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,
|
||||
case VIRTCHNL_OP_ADD_ETH_ADDR:
|
||||
dev_err(&adapter->pdev->dev, "Failed to add MAC filter, error %s\n",
|
||||
iavf_stat_str(&adapter->hw, v_retval));
|
||||
iavf_mac_add_reject(adapter);
|
||||
/* restore administratively set MAC address */
|
||||
ether_addr_copy(adapter->hw.mac.addr, netdev->dev_addr);
|
||||
break;
|
||||
@ -1639,10 +1681,11 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,
|
||||
}
|
||||
}
|
||||
switch (v_opcode) {
|
||||
case VIRTCHNL_OP_ADD_ETH_ADDR: {
|
||||
case VIRTCHNL_OP_ADD_ETH_ADDR:
|
||||
if (!v_retval)
|
||||
iavf_mac_add_ok(adapter);
|
||||
if (!ether_addr_equal(netdev->dev_addr, adapter->hw.mac.addr))
|
||||
ether_addr_copy(netdev->dev_addr, adapter->hw.mac.addr);
|
||||
}
|
||||
break;
|
||||
case VIRTCHNL_OP_GET_STATS: {
|
||||
struct iavf_eth_stats *stats =
|
||||
|
@ -656,7 +656,7 @@ static int ice_ptp_cfg_clkout(struct ice_pf *pf, unsigned int chan,
|
||||
* maintaining phase
|
||||
*/
|
||||
if (start_time < current_time)
|
||||
start_time = div64_u64(current_time + NSEC_PER_MSEC - 1,
|
||||
start_time = div64_u64(current_time + NSEC_PER_SEC - 1,
|
||||
NSEC_PER_SEC) * NSEC_PER_SEC + phase;
|
||||
|
||||
start_time -= E810_OUT_PROP_DELAY_NS;
|
||||
|
@ -52,8 +52,11 @@ static int ixgbe_xsk_pool_enable(struct ixgbe_adapter *adapter,
|
||||
|
||||
/* Kick start the NAPI context so that receiving will start */
|
||||
err = ixgbe_xsk_wakeup(adapter->netdev, qid, XDP_WAKEUP_RX);
|
||||
if (err)
|
||||
if (err) {
|
||||
clear_bit(qid, adapter->af_xdp_zc_qps);
|
||||
xsk_pool_dma_unmap(pool, IXGBE_RX_DMA_ATTR);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1334,6 +1334,7 @@ void ocelot_apply_bridge_fwd_mask(struct ocelot *ocelot)
|
||||
struct net_device *bond = ocelot_port->bond;
|
||||
|
||||
mask = ocelot_get_bridge_fwd_mask(ocelot, bridge);
|
||||
mask |= cpu_fwd_mask;
|
||||
mask &= ~BIT(port);
|
||||
if (bond) {
|
||||
mask &= ~ocelot_get_bond_mask(ocelot, bond,
|
||||
|
@ -327,6 +327,9 @@ static int qed_ll2_txq_completion(struct qed_hwfn *p_hwfn, void *p_cookie)
|
||||
unsigned long flags;
|
||||
int rc = -EINVAL;
|
||||
|
||||
if (!p_ll2_conn)
|
||||
return rc;
|
||||
|
||||
spin_lock_irqsave(&p_tx->lock, flags);
|
||||
if (p_tx->b_completing_packet) {
|
||||
rc = -EBUSY;
|
||||
@ -500,7 +503,16 @@ static int qed_ll2_rxq_completion(struct qed_hwfn *p_hwfn, void *cookie)
|
||||
unsigned long flags = 0;
|
||||
int rc = 0;
|
||||
|
||||
if (!p_ll2_conn)
|
||||
return rc;
|
||||
|
||||
spin_lock_irqsave(&p_rx->lock, flags);
|
||||
|
||||
if (!QED_LL2_RX_REGISTERED(p_ll2_conn)) {
|
||||
spin_unlock_irqrestore(&p_rx->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
cq_new_idx = le16_to_cpu(*p_rx->p_fw_cons);
|
||||
cq_old_idx = qed_chain_get_cons_idx(&p_rx->rcq_chain);
|
||||
|
||||
@ -821,6 +833,9 @@ static int qed_ll2_lb_rxq_completion(struct qed_hwfn *p_hwfn, void *p_cookie)
|
||||
struct qed_ll2_info *p_ll2_conn = (struct qed_ll2_info *)p_cookie;
|
||||
int rc;
|
||||
|
||||
if (!p_ll2_conn)
|
||||
return 0;
|
||||
|
||||
if (!QED_LL2_RX_REGISTERED(p_ll2_conn))
|
||||
return 0;
|
||||
|
||||
@ -844,6 +859,9 @@ static int qed_ll2_lb_txq_completion(struct qed_hwfn *p_hwfn, void *p_cookie)
|
||||
u16 new_idx = 0, num_bds = 0;
|
||||
int rc;
|
||||
|
||||
if (!p_ll2_conn)
|
||||
return 0;
|
||||
|
||||
if (!QED_LL2_TX_REGISTERED(p_ll2_conn))
|
||||
return 0;
|
||||
|
||||
@ -1728,6 +1746,8 @@ int qed_ll2_post_rx_buffer(void *cxt,
|
||||
if (!p_ll2_conn)
|
||||
return -EINVAL;
|
||||
p_rx = &p_ll2_conn->rx_queue;
|
||||
if (!p_rx->set_prod_addr)
|
||||
return -EIO;
|
||||
|
||||
spin_lock_irqsave(&p_rx->lock, flags);
|
||||
if (!list_empty(&p_rx->free_descq))
|
||||
|
@ -1285,8 +1285,7 @@ qed_rdma_create_qp(void *rdma_cxt,
|
||||
|
||||
if (!rdma_cxt || !in_params || !out_params ||
|
||||
!p_hwfn->p_rdma_info->active) {
|
||||
DP_ERR(p_hwfn->cdev,
|
||||
"qed roce create qp failed due to NULL entry (rdma_cxt=%p, in=%p, out=%p, roce_info=?\n",
|
||||
pr_err("qed roce create qp failed due to NULL entry (rdma_cxt=%p, in=%p, out=%p, roce_info=?\n",
|
||||
rdma_cxt, in_params, out_params);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -3156,8 +3156,10 @@ int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr,
|
||||
|
||||
indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr);
|
||||
ret = QLCRD32(adapter, indirect_addr, &err);
|
||||
if (err == -EIO)
|
||||
if (err == -EIO) {
|
||||
qlcnic_83xx_unlock_flash(adapter);
|
||||
return err;
|
||||
}
|
||||
|
||||
word = ret;
|
||||
*(u32 *)p_data = word;
|
||||
|
@ -827,6 +827,12 @@ static void decode_data(struct sixpack *sp, unsigned char inbyte)
|
||||
return;
|
||||
}
|
||||
|
||||
if (sp->rx_count_cooked + 2 >= sizeof(sp->cooked_buf)) {
|
||||
pr_err("6pack: cooked buffer overrun, data loss\n");
|
||||
sp->rx_count = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
buf = sp->raw_buf;
|
||||
sp->cooked_buf[sp->rx_count_cooked++] =
|
||||
buf[0] | ((buf[1] << 2) & 0xc0);
|
||||
|
@ -82,6 +82,17 @@ out:
|
||||
|
||||
static int parent_count;
|
||||
|
||||
static void mdio_mux_uninit_children(struct mdio_mux_parent_bus *pb)
|
||||
{
|
||||
struct mdio_mux_child_bus *cb = pb->children;
|
||||
|
||||
while (cb) {
|
||||
mdiobus_unregister(cb->mii_bus);
|
||||
mdiobus_free(cb->mii_bus);
|
||||
cb = cb->next;
|
||||
}
|
||||
}
|
||||
|
||||
int mdio_mux_init(struct device *dev,
|
||||
struct device_node *mux_node,
|
||||
int (*switch_fn)(int cur, int desired, void *data),
|
||||
@ -144,7 +155,7 @@ int mdio_mux_init(struct device *dev,
|
||||
cb = devm_kzalloc(dev, sizeof(*cb), GFP_KERNEL);
|
||||
if (!cb) {
|
||||
ret_val = -ENOMEM;
|
||||
continue;
|
||||
goto err_loop;
|
||||
}
|
||||
cb->bus_number = v;
|
||||
cb->parent = pb;
|
||||
@ -152,8 +163,7 @@ int mdio_mux_init(struct device *dev,
|
||||
cb->mii_bus = mdiobus_alloc();
|
||||
if (!cb->mii_bus) {
|
||||
ret_val = -ENOMEM;
|
||||
devm_kfree(dev, cb);
|
||||
continue;
|
||||
goto err_loop;
|
||||
}
|
||||
cb->mii_bus->priv = cb;
|
||||
|
||||
@ -165,11 +175,15 @@ int mdio_mux_init(struct device *dev,
|
||||
cb->mii_bus->write = mdio_mux_write;
|
||||
r = of_mdiobus_register(cb->mii_bus, child_bus_node);
|
||||
if (r) {
|
||||
mdiobus_free(cb->mii_bus);
|
||||
if (r == -EPROBE_DEFER) {
|
||||
ret_val = r;
|
||||
goto err_loop;
|
||||
}
|
||||
devm_kfree(dev, cb);
|
||||
dev_err(dev,
|
||||
"Error: Failed to register MDIO bus for child %pOF\n",
|
||||
child_bus_node);
|
||||
mdiobus_free(cb->mii_bus);
|
||||
devm_kfree(dev, cb);
|
||||
} else {
|
||||
cb->next = pb->children;
|
||||
pb->children = cb;
|
||||
@ -181,7 +195,10 @@ int mdio_mux_init(struct device *dev,
|
||||
}
|
||||
|
||||
dev_err(dev, "Error: No acceptable child buses found\n");
|
||||
devm_kfree(dev, pb);
|
||||
|
||||
err_loop:
|
||||
mdio_mux_uninit_children(pb);
|
||||
of_node_put(child_bus_node);
|
||||
err_pb_kz:
|
||||
put_device(&parent_bus->dev);
|
||||
err_parent_bus:
|
||||
@ -193,14 +210,8 @@ EXPORT_SYMBOL_GPL(mdio_mux_init);
|
||||
void mdio_mux_uninit(void *mux_handle)
|
||||
{
|
||||
struct mdio_mux_parent_bus *pb = mux_handle;
|
||||
struct mdio_mux_child_bus *cb = pb->children;
|
||||
|
||||
while (cb) {
|
||||
mdiobus_unregister(cb->mii_bus);
|
||||
mdiobus_free(cb->mii_bus);
|
||||
cb = cb->next;
|
||||
}
|
||||
|
||||
mdio_mux_uninit_children(pb);
|
||||
put_device(&pb->mii_bus->dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mdio_mux_uninit);
|
||||
|
@ -63,6 +63,29 @@ void asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index,
|
||||
value, index, data, size);
|
||||
}
|
||||
|
||||
static int asix_check_host_enable(struct usbnet *dev, int in_pm)
|
||||
{
|
||||
int i, ret;
|
||||
u8 smsr;
|
||||
|
||||
for (i = 0; i < 30; ++i) {
|
||||
ret = asix_set_sw_mii(dev, in_pm);
|
||||
if (ret == -ENODEV || ret == -ETIMEDOUT)
|
||||
break;
|
||||
usleep_range(1000, 1100);
|
||||
ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG,
|
||||
0, 0, 1, &smsr, in_pm);
|
||||
if (ret == -ENODEV)
|
||||
break;
|
||||
else if (ret < 0)
|
||||
continue;
|
||||
else if (smsr & AX_HOST_EN)
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void reset_asix_rx_fixup_info(struct asix_rx_fixup_info *rx)
|
||||
{
|
||||
/* Reset the variables that have a lifetime outside of
|
||||
@ -467,19 +490,11 @@ int asix_mdio_read(struct net_device *netdev, int phy_id, int loc)
|
||||
{
|
||||
struct usbnet *dev = netdev_priv(netdev);
|
||||
__le16 res;
|
||||
u8 smsr;
|
||||
int i = 0;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&dev->phy_mutex);
|
||||
do {
|
||||
ret = asix_set_sw_mii(dev, 0);
|
||||
if (ret == -ENODEV || ret == -ETIMEDOUT)
|
||||
break;
|
||||
usleep_range(1000, 1100);
|
||||
ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG,
|
||||
0, 0, 1, &smsr, 0);
|
||||
} while (!(smsr & AX_HOST_EN) && (i++ < 30) && (ret != -ENODEV));
|
||||
|
||||
ret = asix_check_host_enable(dev, 0);
|
||||
if (ret == -ENODEV || ret == -ETIMEDOUT) {
|
||||
mutex_unlock(&dev->phy_mutex);
|
||||
return ret;
|
||||
@ -505,23 +520,14 @@ static int __asix_mdio_write(struct net_device *netdev, int phy_id, int loc,
|
||||
{
|
||||
struct usbnet *dev = netdev_priv(netdev);
|
||||
__le16 res = cpu_to_le16(val);
|
||||
u8 smsr;
|
||||
int i = 0;
|
||||
int ret;
|
||||
|
||||
netdev_dbg(dev->net, "asix_mdio_write() phy_id=0x%02x, loc=0x%02x, val=0x%04x\n",
|
||||
phy_id, loc, val);
|
||||
|
||||
mutex_lock(&dev->phy_mutex);
|
||||
do {
|
||||
ret = asix_set_sw_mii(dev, 0);
|
||||
if (ret == -ENODEV)
|
||||
break;
|
||||
usleep_range(1000, 1100);
|
||||
ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG,
|
||||
0, 0, 1, &smsr, 0);
|
||||
} while (!(smsr & AX_HOST_EN) && (i++ < 30) && (ret != -ENODEV));
|
||||
|
||||
ret = asix_check_host_enable(dev, 0);
|
||||
if (ret == -ENODEV)
|
||||
goto out;
|
||||
|
||||
@ -561,19 +567,11 @@ int asix_mdio_read_nopm(struct net_device *netdev, int phy_id, int loc)
|
||||
{
|
||||
struct usbnet *dev = netdev_priv(netdev);
|
||||
__le16 res;
|
||||
u8 smsr;
|
||||
int i = 0;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&dev->phy_mutex);
|
||||
do {
|
||||
ret = asix_set_sw_mii(dev, 1);
|
||||
if (ret == -ENODEV || ret == -ETIMEDOUT)
|
||||
break;
|
||||
usleep_range(1000, 1100);
|
||||
ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG,
|
||||
0, 0, 1, &smsr, 1);
|
||||
} while (!(smsr & AX_HOST_EN) && (i++ < 30) && (ret != -ENODEV));
|
||||
|
||||
ret = asix_check_host_enable(dev, 1);
|
||||
if (ret == -ENODEV || ret == -ETIMEDOUT) {
|
||||
mutex_unlock(&dev->phy_mutex);
|
||||
return ret;
|
||||
@ -595,22 +593,14 @@ asix_mdio_write_nopm(struct net_device *netdev, int phy_id, int loc, int val)
|
||||
{
|
||||
struct usbnet *dev = netdev_priv(netdev);
|
||||
__le16 res = cpu_to_le16(val);
|
||||
u8 smsr;
|
||||
int i = 0;
|
||||
int ret;
|
||||
|
||||
netdev_dbg(dev->net, "asix_mdio_write() phy_id=0x%02x, loc=0x%02x, val=0x%04x\n",
|
||||
phy_id, loc, val);
|
||||
|
||||
mutex_lock(&dev->phy_mutex);
|
||||
do {
|
||||
ret = asix_set_sw_mii(dev, 1);
|
||||
if (ret == -ENODEV)
|
||||
break;
|
||||
usleep_range(1000, 1100);
|
||||
ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG,
|
||||
0, 0, 1, &smsr, 1);
|
||||
} while (!(smsr & AX_HOST_EN) && (i++ < 30) && (ret != -ENODEV));
|
||||
|
||||
ret = asix_check_host_enable(dev, 1);
|
||||
if (ret == -ENODEV) {
|
||||
mutex_unlock(&dev->phy_mutex);
|
||||
return;
|
||||
|
@ -3955,17 +3955,28 @@ static void rtl_clear_bp(struct r8152 *tp, u16 type)
|
||||
case RTL_VER_06:
|
||||
ocp_write_byte(tp, type, PLA_BP_EN, 0);
|
||||
break;
|
||||
case RTL_VER_14:
|
||||
ocp_write_word(tp, type, USB_BP2_EN, 0);
|
||||
|
||||
ocp_write_word(tp, type, USB_BP_8, 0);
|
||||
ocp_write_word(tp, type, USB_BP_9, 0);
|
||||
ocp_write_word(tp, type, USB_BP_10, 0);
|
||||
ocp_write_word(tp, type, USB_BP_11, 0);
|
||||
ocp_write_word(tp, type, USB_BP_12, 0);
|
||||
ocp_write_word(tp, type, USB_BP_13, 0);
|
||||
ocp_write_word(tp, type, USB_BP_14, 0);
|
||||
ocp_write_word(tp, type, USB_BP_15, 0);
|
||||
break;
|
||||
case RTL_VER_08:
|
||||
case RTL_VER_09:
|
||||
case RTL_VER_10:
|
||||
case RTL_VER_11:
|
||||
case RTL_VER_12:
|
||||
case RTL_VER_13:
|
||||
case RTL_VER_14:
|
||||
case RTL_VER_15:
|
||||
default:
|
||||
if (type == MCU_TYPE_USB) {
|
||||
ocp_write_byte(tp, MCU_TYPE_USB, USB_BP2_EN, 0);
|
||||
ocp_write_word(tp, MCU_TYPE_USB, USB_BP2_EN, 0);
|
||||
|
||||
ocp_write_word(tp, MCU_TYPE_USB, USB_BP_8, 0);
|
||||
ocp_write_word(tp, MCU_TYPE_USB, USB_BP_9, 0);
|
||||
@ -4331,7 +4342,6 @@ static bool rtl8152_is_fw_mac_ok(struct r8152 *tp, struct fw_mac *mac)
|
||||
case RTL_VER_11:
|
||||
case RTL_VER_12:
|
||||
case RTL_VER_13:
|
||||
case RTL_VER_14:
|
||||
case RTL_VER_15:
|
||||
fw_reg = 0xf800;
|
||||
bp_ba_addr = PLA_BP_BA;
|
||||
@ -4339,6 +4349,13 @@ static bool rtl8152_is_fw_mac_ok(struct r8152 *tp, struct fw_mac *mac)
|
||||
bp_start = PLA_BP_0;
|
||||
max_bp = 8;
|
||||
break;
|
||||
case RTL_VER_14:
|
||||
fw_reg = 0xf800;
|
||||
bp_ba_addr = PLA_BP_BA;
|
||||
bp_en_addr = USB_BP2_EN;
|
||||
bp_start = PLA_BP_0;
|
||||
max_bp = 16;
|
||||
break;
|
||||
default:
|
||||
goto out;
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ static const unsigned long guest_offloads[] = {
|
||||
VIRTIO_NET_F_GUEST_CSUM
|
||||
};
|
||||
|
||||
#define GUEST_OFFLOAD_LRO_MASK ((1ULL << VIRTIO_NET_F_GUEST_TSO4) | \
|
||||
#define GUEST_OFFLOAD_GRO_HW_MASK ((1ULL << VIRTIO_NET_F_GUEST_TSO4) | \
|
||||
(1ULL << VIRTIO_NET_F_GUEST_TSO6) | \
|
||||
(1ULL << VIRTIO_NET_F_GUEST_ECN) | \
|
||||
(1ULL << VIRTIO_NET_F_GUEST_UFO))
|
||||
@ -2515,7 +2515,7 @@ static int virtnet_xdp_set(struct net_device *dev, struct bpf_prog *prog,
|
||||
virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_ECN) ||
|
||||
virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_UFO) ||
|
||||
virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_CSUM))) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Can't set XDP while host is implementing LRO/CSUM, disable LRO/CSUM first");
|
||||
NL_SET_ERR_MSG_MOD(extack, "Can't set XDP while host is implementing GRO_HW/CSUM, disable GRO_HW/CSUM first");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
@ -2646,15 +2646,15 @@ static int virtnet_set_features(struct net_device *dev,
|
||||
u64 offloads;
|
||||
int err;
|
||||
|
||||
if ((dev->features ^ features) & NETIF_F_LRO) {
|
||||
if ((dev->features ^ features) & NETIF_F_GRO_HW) {
|
||||
if (vi->xdp_enabled)
|
||||
return -EBUSY;
|
||||
|
||||
if (features & NETIF_F_LRO)
|
||||
if (features & NETIF_F_GRO_HW)
|
||||
offloads = vi->guest_offloads_capable;
|
||||
else
|
||||
offloads = vi->guest_offloads_capable &
|
||||
~GUEST_OFFLOAD_LRO_MASK;
|
||||
~GUEST_OFFLOAD_GRO_HW_MASK;
|
||||
|
||||
err = virtnet_set_guest_offloads(vi, offloads);
|
||||
if (err)
|
||||
@ -3134,9 +3134,9 @@ static int virtnet_probe(struct virtio_device *vdev)
|
||||
dev->features |= NETIF_F_RXCSUM;
|
||||
if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) ||
|
||||
virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6))
|
||||
dev->features |= NETIF_F_LRO;
|
||||
dev->features |= NETIF_F_GRO_HW;
|
||||
if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS))
|
||||
dev->hw_features |= NETIF_F_LRO;
|
||||
dev->hw_features |= NETIF_F_GRO_HW;
|
||||
|
||||
dev->vlan_features = dev->features;
|
||||
|
||||
|
@ -1367,6 +1367,8 @@ static struct sk_buff *vrf_ip6_rcv(struct net_device *vrf_dev,
|
||||
bool need_strict = rt6_need_strict(&ipv6_hdr(skb)->daddr);
|
||||
bool is_ndisc = ipv6_ndisc_frame(skb);
|
||||
|
||||
nf_reset_ct(skb);
|
||||
|
||||
/* loopback, multicast & non-ND link-local traffic; do not push through
|
||||
* packet taps again. Reset pkt_type for upper layers to process skb.
|
||||
* For strict packets with a source LLA, determine the dst using the
|
||||
@ -1429,6 +1431,8 @@ static struct sk_buff *vrf_ip_rcv(struct net_device *vrf_dev,
|
||||
skb->skb_iif = vrf_dev->ifindex;
|
||||
IPCB(skb)->flags |= IPSKB_L3SLAVE;
|
||||
|
||||
nf_reset_ct(skb);
|
||||
|
||||
if (ipv4_is_multicast(ip_hdr(skb)->daddr))
|
||||
goto out;
|
||||
|
||||
|
@ -37,6 +37,7 @@ static int iwl_pnvm_handle_section(struct iwl_trans *trans, const u8 *data,
|
||||
u32 sha1 = 0;
|
||||
u16 mac_type = 0, rf_id = 0;
|
||||
u8 *pnvm_data = NULL, *tmp;
|
||||
bool hw_match = false;
|
||||
u32 size = 0;
|
||||
int ret;
|
||||
|
||||
@ -83,6 +84,9 @@ static int iwl_pnvm_handle_section(struct iwl_trans *trans, const u8 *data,
|
||||
break;
|
||||
}
|
||||
|
||||
if (hw_match)
|
||||
break;
|
||||
|
||||
mac_type = le16_to_cpup((__le16 *)data);
|
||||
rf_id = le16_to_cpup((__le16 *)(data + sizeof(__le16)));
|
||||
|
||||
@ -90,15 +94,9 @@ static int iwl_pnvm_handle_section(struct iwl_trans *trans, const u8 *data,
|
||||
"Got IWL_UCODE_TLV_HW_TYPE mac_type 0x%0x rf_id 0x%0x\n",
|
||||
mac_type, rf_id);
|
||||
|
||||
if (mac_type != CSR_HW_REV_TYPE(trans->hw_rev) ||
|
||||
rf_id != CSR_HW_RFID_TYPE(trans->hw_rf_id)) {
|
||||
IWL_DEBUG_FW(trans,
|
||||
"HW mismatch, skipping PNVM section, mac_type 0x%0x, rf_id 0x%0x.\n",
|
||||
CSR_HW_REV_TYPE(trans->hw_rev), trans->hw_rf_id);
|
||||
ret = -ENOENT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (mac_type == CSR_HW_REV_TYPE(trans->hw_rev) &&
|
||||
rf_id == CSR_HW_RFID_TYPE(trans->hw_rf_id))
|
||||
hw_match = true;
|
||||
break;
|
||||
case IWL_UCODE_TLV_SEC_RT: {
|
||||
struct iwl_pnvm_section *section = (void *)data;
|
||||
@ -149,6 +147,15 @@ static int iwl_pnvm_handle_section(struct iwl_trans *trans, const u8 *data,
|
||||
}
|
||||
|
||||
done:
|
||||
if (!hw_match) {
|
||||
IWL_DEBUG_FW(trans,
|
||||
"HW mismatch, skipping PNVM section (need mac_type 0x%x rf_id 0x%x)\n",
|
||||
CSR_HW_REV_TYPE(trans->hw_rev),
|
||||
CSR_HW_RFID_TYPE(trans->hw_rf_id));
|
||||
ret = -ENOENT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!size) {
|
||||
IWL_DEBUG_FW(trans, "Empty PNVM, skipping.\n");
|
||||
ret = -ENOENT;
|
||||
|
@ -1110,12 +1110,80 @@ static const struct iwl_dev_info iwl_dev_info_table[] = {
|
||||
IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_NO_CDB,
|
||||
iwl_cfg_bz_a0_mr_a0, iwl_ax211_name),
|
||||
|
||||
/* SoF with JF2 */
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SOF, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT, IWL_CFG_NO_CDB,
|
||||
iwlax210_2ax_cfg_so_jf_b0, iwl9560_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SOF, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT, IWL_CFG_NO_CDB,
|
||||
iwlax210_2ax_cfg_so_jf_b0, iwl9560_name),
|
||||
|
||||
/* SoF with JF */
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SOF, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT, IWL_CFG_NO_CDB,
|
||||
iwlax210_2ax_cfg_so_jf_b0, iwl9461_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SOF, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT, IWL_CFG_NO_CDB,
|
||||
iwlax210_2ax_cfg_so_jf_b0, iwl9462_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SOF, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT, IWL_CFG_NO_CDB,
|
||||
iwlax210_2ax_cfg_so_jf_b0, iwl9461_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SOF, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT, IWL_CFG_NO_CDB,
|
||||
iwlax210_2ax_cfg_so_jf_b0, iwl9462_name),
|
||||
|
||||
/* So with GF */
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SO, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_GF, IWL_CFG_ANY,
|
||||
IWL_CFG_160, IWL_CFG_ANY, IWL_CFG_NO_CDB,
|
||||
iwlax211_2ax_cfg_so_gf_a0, iwl_ax211_name)
|
||||
iwlax211_2ax_cfg_so_gf_a0, iwl_ax211_name),
|
||||
|
||||
/* So with JF2 */
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SO, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT, IWL_CFG_NO_CDB,
|
||||
iwlax210_2ax_cfg_so_jf_b0, iwl9560_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SO, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF2, IWL_CFG_RF_ID_JF,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT, IWL_CFG_NO_CDB,
|
||||
iwlax210_2ax_cfg_so_jf_b0, iwl9560_name),
|
||||
|
||||
/* So with JF */
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SO, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT, IWL_CFG_NO_CDB,
|
||||
iwlax210_2ax_cfg_so_jf_b0, iwl9461_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SO, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_160, IWL_CFG_CORES_BT, IWL_CFG_NO_CDB,
|
||||
iwlax210_2ax_cfg_so_jf_b0, iwl9462_160_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SO, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT, IWL_CFG_NO_CDB,
|
||||
iwlax210_2ax_cfg_so_jf_b0, iwl9461_name),
|
||||
_IWL_DEV_INFO(IWL_CFG_ANY, IWL_CFG_ANY,
|
||||
IWL_CFG_MAC_TYPE_SO, IWL_CFG_ANY,
|
||||
IWL_CFG_RF_TYPE_JF1, IWL_CFG_RF_ID_JF1_DIV,
|
||||
IWL_CFG_NO_160, IWL_CFG_CORES_BT, IWL_CFG_NO_CDB,
|
||||
iwlax210_2ax_cfg_so_jf_b0, iwl9462_name)
|
||||
|
||||
#endif /* CONFIG_IWLMVM */
|
||||
};
|
||||
|
@ -111,7 +111,7 @@ mt7915_mcu_get_cipher(int cipher)
|
||||
case WLAN_CIPHER_SUITE_SMS4:
|
||||
return MCU_CIPHER_WAPI;
|
||||
default:
|
||||
return MT_CIPHER_NONE;
|
||||
return MCU_CIPHER_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1073,7 +1073,8 @@ enum {
|
||||
};
|
||||
|
||||
enum mcu_cipher_type {
|
||||
MCU_CIPHER_WEP40 = 1,
|
||||
MCU_CIPHER_NONE = 0,
|
||||
MCU_CIPHER_WEP40,
|
||||
MCU_CIPHER_WEP104,
|
||||
MCU_CIPHER_WEP128,
|
||||
MCU_CIPHER_TKIP,
|
||||
|
@ -111,7 +111,7 @@ mt7921_mcu_get_cipher(int cipher)
|
||||
case WLAN_CIPHER_SUITE_SMS4:
|
||||
return MCU_CIPHER_WAPI;
|
||||
default:
|
||||
return MT_CIPHER_NONE;
|
||||
return MCU_CIPHER_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -199,7 +199,8 @@ struct sta_rec_sec {
|
||||
} __packed;
|
||||
|
||||
enum mcu_cipher_type {
|
||||
MCU_CIPHER_WEP40 = 1,
|
||||
MCU_CIPHER_NONE = 0,
|
||||
MCU_CIPHER_WEP40,
|
||||
MCU_CIPHER_WEP104,
|
||||
MCU_CIPHER_WEP128,
|
||||
MCU_CIPHER_TKIP,
|
||||
|
@ -64,10 +64,9 @@ static struct ipc_chnl_cfg modem_cfg[] = {
|
||||
|
||||
int ipc_chnl_cfg_get(struct ipc_chnl_cfg *chnl_cfg, int index)
|
||||
{
|
||||
int array_size = ARRAY_SIZE(modem_cfg);
|
||||
|
||||
if (index >= array_size) {
|
||||
pr_err("index: %d and array_size %d", index, array_size);
|
||||
if (index >= ARRAY_SIZE(modem_cfg)) {
|
||||
pr_err("index: %d and array size %zu", index,
|
||||
ARRAY_SIZE(modem_cfg));
|
||||
return -ECHRNG;
|
||||
}
|
||||
|
||||
|
@ -90,7 +90,8 @@ config PTP_1588_CLOCK_INES
|
||||
config PTP_1588_CLOCK_PCH
|
||||
tristate "Intel PCH EG20T as PTP clock"
|
||||
depends on X86_32 || COMPILE_TEST
|
||||
depends on HAS_IOMEM && NET
|
||||
depends on HAS_IOMEM && PCI
|
||||
depends on NET
|
||||
imply PTP_1588_CLOCK
|
||||
help
|
||||
This driver adds support for using the PCH EG20T as a PTP
|
||||
|
@ -319,14 +319,12 @@ flow_action_mixed_hw_stats_check(const struct flow_action *action,
|
||||
if (flow_offload_has_one_action(action))
|
||||
return true;
|
||||
|
||||
if (action) {
|
||||
flow_action_for_each(i, action_entry, action) {
|
||||
if (i && action_entry->hw_stats != last_hw_stats) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Mixing HW stats types for actions is not supported");
|
||||
return false;
|
||||
}
|
||||
last_hw_stats = action_entry->hw_stats;
|
||||
flow_action_for_each(i, action_entry, action) {
|
||||
if (i && action_entry->hw_stats != last_hw_stats) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Mixing HW stats types for actions is not supported");
|
||||
return false;
|
||||
}
|
||||
last_hw_stats = action_entry->hw_stats;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -353,9 +353,15 @@ const struct bpf_func_proto bpf_jiffies64_proto = {
|
||||
#ifdef CONFIG_CGROUPS
|
||||
BPF_CALL_0(bpf_get_current_cgroup_id)
|
||||
{
|
||||
struct cgroup *cgrp = task_dfl_cgroup(current);
|
||||
struct cgroup *cgrp;
|
||||
u64 cgrp_id;
|
||||
|
||||
return cgroup_id(cgrp);
|
||||
rcu_read_lock();
|
||||
cgrp = task_dfl_cgroup(current);
|
||||
cgrp_id = cgroup_id(cgrp);
|
||||
rcu_read_unlock();
|
||||
|
||||
return cgrp_id;
|
||||
}
|
||||
|
||||
const struct bpf_func_proto bpf_get_current_cgroup_id_proto = {
|
||||
@ -366,13 +372,17 @@ const struct bpf_func_proto bpf_get_current_cgroup_id_proto = {
|
||||
|
||||
BPF_CALL_1(bpf_get_current_ancestor_cgroup_id, int, ancestor_level)
|
||||
{
|
||||
struct cgroup *cgrp = task_dfl_cgroup(current);
|
||||
struct cgroup *cgrp;
|
||||
struct cgroup *ancestor;
|
||||
u64 cgrp_id;
|
||||
|
||||
rcu_read_lock();
|
||||
cgrp = task_dfl_cgroup(current);
|
||||
ancestor = cgroup_ancestor(cgrp, ancestor_level);
|
||||
if (!ancestor)
|
||||
return 0;
|
||||
return cgroup_id(ancestor);
|
||||
cgrp_id = ancestor ? cgroup_id(ancestor) : 0;
|
||||
rcu_read_unlock();
|
||||
|
||||
return cgrp_id;
|
||||
}
|
||||
|
||||
const struct bpf_func_proto bpf_get_current_ancestor_cgroup_id_proto = {
|
||||
|
@ -11663,6 +11663,7 @@ static void sanitize_dead_code(struct bpf_verifier_env *env)
|
||||
if (aux_data[i].seen)
|
||||
continue;
|
||||
memcpy(insn + i, &trap, sizeof(trap));
|
||||
aux_data[i].zext_dst = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -260,6 +260,8 @@ static void ieee80211_restart_work(struct work_struct *work)
|
||||
flush_work(&local->radar_detected_work);
|
||||
|
||||
rtnl_lock();
|
||||
/* we might do interface manipulations, so need both */
|
||||
wiphy_lock(local->hw.wiphy);
|
||||
|
||||
WARN(test_bit(SCAN_HW_SCANNING, &local->scanning),
|
||||
"%s called with hardware scan in progress\n", __func__);
|
||||
|
@ -885,20 +885,16 @@ static bool check_fully_established(struct mptcp_sock *msk, struct sock *ssk,
|
||||
return subflow->mp_capable;
|
||||
}
|
||||
|
||||
if (mp_opt->dss && mp_opt->use_ack) {
|
||||
if ((mp_opt->dss && mp_opt->use_ack) ||
|
||||
(mp_opt->add_addr && !mp_opt->echo)) {
|
||||
/* subflows are fully established as soon as we get any
|
||||
* additional ack.
|
||||
* additional ack, including ADD_ADDR.
|
||||
*/
|
||||
subflow->fully_established = 1;
|
||||
WRITE_ONCE(msk->fully_established, true);
|
||||
goto fully_established;
|
||||
}
|
||||
|
||||
if (mp_opt->add_addr) {
|
||||
WRITE_ONCE(msk->fully_established, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* If the first established packet does not contain MP_CAPABLE + data
|
||||
* then fallback to TCP. Fallback scenarios requires a reset for
|
||||
* MP_JOIN subflows.
|
||||
|
@ -1135,36 +1135,12 @@ next:
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct addr_entry_release_work {
|
||||
struct rcu_work rwork;
|
||||
struct mptcp_pm_addr_entry *entry;
|
||||
};
|
||||
|
||||
static void mptcp_pm_release_addr_entry(struct work_struct *work)
|
||||
/* caller must ensure the RCU grace period is already elapsed */
|
||||
static void __mptcp_pm_release_addr_entry(struct mptcp_pm_addr_entry *entry)
|
||||
{
|
||||
struct addr_entry_release_work *w;
|
||||
struct mptcp_pm_addr_entry *entry;
|
||||
|
||||
w = container_of(to_rcu_work(work), struct addr_entry_release_work, rwork);
|
||||
entry = w->entry;
|
||||
if (entry) {
|
||||
if (entry->lsk)
|
||||
sock_release(entry->lsk);
|
||||
kfree(entry);
|
||||
}
|
||||
kfree(w);
|
||||
}
|
||||
|
||||
static void mptcp_pm_free_addr_entry(struct mptcp_pm_addr_entry *entry)
|
||||
{
|
||||
struct addr_entry_release_work *w;
|
||||
|
||||
w = kmalloc(sizeof(*w), GFP_ATOMIC);
|
||||
if (w) {
|
||||
INIT_RCU_WORK(&w->rwork, mptcp_pm_release_addr_entry);
|
||||
w->entry = entry;
|
||||
queue_rcu_work(system_wq, &w->rwork);
|
||||
}
|
||||
if (entry->lsk)
|
||||
sock_release(entry->lsk);
|
||||
kfree(entry);
|
||||
}
|
||||
|
||||
static int mptcp_nl_remove_id_zero_address(struct net *net,
|
||||
@ -1244,7 +1220,8 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb, struct genl_info *info)
|
||||
spin_unlock_bh(&pernet->lock);
|
||||
|
||||
mptcp_nl_remove_subflow_and_signal_addr(sock_net(skb->sk), &entry->addr);
|
||||
mptcp_pm_free_addr_entry(entry);
|
||||
synchronize_rcu();
|
||||
__mptcp_pm_release_addr_entry(entry);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -1297,6 +1274,7 @@ static void mptcp_nl_remove_addrs_list(struct net *net,
|
||||
}
|
||||
}
|
||||
|
||||
/* caller must ensure the RCU grace period is already elapsed */
|
||||
static void __flush_addrs(struct list_head *list)
|
||||
{
|
||||
while (!list_empty(list)) {
|
||||
@ -1305,7 +1283,7 @@ static void __flush_addrs(struct list_head *list)
|
||||
cur = list_entry(list->next,
|
||||
struct mptcp_pm_addr_entry, list);
|
||||
list_del_rcu(&cur->list);
|
||||
mptcp_pm_free_addr_entry(cur);
|
||||
__mptcp_pm_release_addr_entry(cur);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1329,6 +1307,7 @@ static int mptcp_nl_cmd_flush_addrs(struct sk_buff *skb, struct genl_info *info)
|
||||
bitmap_zero(pernet->id_bitmap, MAX_ADDR_ID + 1);
|
||||
spin_unlock_bh(&pernet->lock);
|
||||
mptcp_nl_remove_addrs_list(sock_net(skb->sk), &free_list);
|
||||
synchronize_rcu();
|
||||
__flush_addrs(&free_list);
|
||||
return 0;
|
||||
}
|
||||
@ -1939,7 +1918,8 @@ static void __net_exit pm_nl_exit_net(struct list_head *net_list)
|
||||
struct pm_nl_pernet *pernet = net_generic(net, pm_nl_pernet_id);
|
||||
|
||||
/* net is removed from namespace list, can't race with
|
||||
* other modifiers
|
||||
* other modifiers, also netns core already waited for a
|
||||
* RCU grace period.
|
||||
*/
|
||||
__flush_addrs(&pernet->local_addr_list);
|
||||
}
|
||||
|
@ -507,6 +507,7 @@ void ovs_vport_send(struct vport *vport, struct sk_buff *skb, u8 mac_proto)
|
||||
}
|
||||
|
||||
skb->dev = vport->dev;
|
||||
skb->tstamp = 0;
|
||||
vport->ops->send(skb);
|
||||
return;
|
||||
|
||||
|
@ -131,9 +131,9 @@ static int rds_ib_post_reg_frmr(struct rds_ib_mr *ibmr)
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
ret = ib_map_mr_sg_zbva(frmr->mr, ibmr->sg, ibmr->sg_len,
|
||||
ret = ib_map_mr_sg_zbva(frmr->mr, ibmr->sg, ibmr->sg_dma_len,
|
||||
&off, PAGE_SIZE);
|
||||
if (unlikely(ret != ibmr->sg_len))
|
||||
if (unlikely(ret != ibmr->sg_dma_len))
|
||||
return ret < 0 ? ret : -EINVAL;
|
||||
|
||||
if (cmpxchg(&frmr->fr_state,
|
||||
|
@ -720,7 +720,7 @@ static u32 cake_hash(struct cake_tin_data *q, const struct sk_buff *skb,
|
||||
skip_hash:
|
||||
if (flow_override)
|
||||
flow_hash = flow_override - 1;
|
||||
else if (use_skbhash)
|
||||
else if (use_skbhash && (flow_mode & CAKE_FLOW_FLOWS))
|
||||
flow_hash = skb->hash;
|
||||
if (host_override) {
|
||||
dsthost_hash = host_override - 1;
|
||||
|
@ -1518,7 +1518,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen)
|
||||
|
||||
if (unlikely(syn && !rc)) {
|
||||
tipc_set_sk_state(sk, TIPC_CONNECTING);
|
||||
if (timeout) {
|
||||
if (dlen && timeout) {
|
||||
timeout = msecs_to_jiffies(timeout);
|
||||
tipc_wait_for_connect(sock, &timeout);
|
||||
}
|
||||
|
@ -159,3 +159,15 @@
|
||||
.result = ACCEPT,
|
||||
.retval = 2,
|
||||
},
|
||||
{
|
||||
"dead code: zero extension",
|
||||
.insns = {
|
||||
BPF_MOV64_IMM(BPF_REG_0, 0),
|
||||
BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -4),
|
||||
BPF_JMP_IMM(BPF_JGE, BPF_REG_0, 0, 1),
|
||||
BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -4),
|
||||
BPF_EXIT_INSN(),
|
||||
},
|
||||
.result = ACCEPT,
|
||||
.retval = 0,
|
||||
},
|
||||
|
Loading…
x
Reference in New Issue
Block a user