Merge branch '10GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
authorDavid S. Miller <davem@davemloft.net>
Mon, 28 Nov 2022 09:23:10 +0000 (09:23 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Nov 2022 09:23:10 +0000 (09:23 +0000)
Tony Nguyen says:

====================
Intel Wired LAN Driver Updates 2022-11-23 (ixgbevf, i40e, fm10k, iavf, e100)

This series contains updates to various Intel drivers.

Shang XiaoJing fixes init module error path stop to resource leaks for
ixgbevf and i40e.

Yuan Can also does the same for fm10k and iavf.

Wang Hai stops freeing of skb as it was causing use after free error for
e100.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
42 files changed:
Documentation/networking/generic_netlink.rst
drivers/net/can/can327.c
drivers/net/can/cc770/cc770_isa.c
drivers/net/can/m_can/m_can.c
drivers/net/can/m_can/m_can_pci.c
drivers/net/can/sja1000/sja1000_isa.c
drivers/net/can/usb/etas_es58x/es58x_core.c
drivers/net/can/usb/mcba_usb.c
drivers/net/ethernet/altera/altera_tse_main.c
drivers/net/ethernet/aquantia/atlantic/aq_ethtool.c
drivers/net/ethernet/aquantia/atlantic/aq_main.c
drivers/net/ethernet/aquantia/atlantic/aq_main.h
drivers/net/ethernet/cavium/thunder/thunder_bgx.c
drivers/net/ethernet/freescale/enetc/enetc.c
drivers/net/ethernet/freescale/enetc/enetc.h
drivers/net/ethernet/freescale/enetc/enetc_qos.c
drivers/net/ethernet/freescale/fec_main.c
drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c
drivers/net/ethernet/marvell/octeontx2/af/rvu_sdp.c
drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h
drivers/net/ethernet/marvell/prestera/prestera_main.c
drivers/net/ethernet/qlogic/qed/qed_mcp.c
drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/loopback.c
drivers/net/phy/phy_device.c
drivers/net/virtio_net.c
drivers/net/wwan/t7xx/t7xx_modem_ops.c
drivers/nfc/st-nci/se.c
include/linux/can/platform/sja1000.h
net/core/lwtunnel.c
net/ipv4/esp4_offload.c
net/ipv4/ip_input.c
net/ipv6/esp6_offload.c
net/ipv6/xfrm6_policy.c
net/key/af_key.c
net/netfilter/ipset/ip_set_hash_gen.h
net/netfilter/ipset/ip_set_hash_ip.c
net/netfilter/nf_flow_table_offload.c
net/xfrm/xfrm_device.c
net/xfrm/xfrm_replay.c

index 59e04cc..d960dbd 100644 (file)
@@ -6,4 +6,4 @@ Generic Netlink
 
 A wiki document on how to use Generic Netlink can be found here:
 
- * http://www.linuxfoundation.org/collaborate/workgroups/networking/generic_netlink_howto
+ * https://wiki.linuxfoundation.org/networking/generic_netlink_howto
index 0941977..ed3d0b8 100644 (file)
@@ -263,8 +263,10 @@ static void can327_feed_frame_to_netdev(struct can327 *elm, struct sk_buff *skb)
 {
        lockdep_assert_held(&elm->lock);
 
-       if (!netif_running(elm->dev))
+       if (!netif_running(elm->dev)) {
+               kfree_skb(skb);
                return;
+       }
 
        /* Queue for NAPI pickup.
         * rx-offload will update stats and LEDs for us.
index 194c86e..8f6dccd 100644 (file)
@@ -264,22 +264,24 @@ static int cc770_isa_probe(struct platform_device *pdev)
        if (err) {
                dev_err(&pdev->dev,
                        "couldn't register device (err=%d)\n", err);
-               goto exit_unmap;
+               goto exit_free;
        }
 
        dev_info(&pdev->dev, "device registered (reg_base=0x%p, irq=%d)\n",
                 priv->reg_base, dev->irq);
        return 0;
 
- exit_unmap:
+exit_free:
+       free_cc770dev(dev);
+exit_unmap:
        if (mem[idx])
                iounmap(base);
- exit_release:
+exit_release:
        if (mem[idx])
                release_mem_region(mem[idx], iosize);
        else
                release_region(port[idx], iosize);
- exit:
+exit:
        return err;
 }
 
index 00d11e9..e5575d2 100644 (file)
@@ -1909,7 +1909,7 @@ int m_can_class_get_clocks(struct m_can_classdev *cdev)
        cdev->hclk = devm_clk_get(cdev->dev, "hclk");
        cdev->cclk = devm_clk_get(cdev->dev, "cclk");
 
-       if (IS_ERR(cdev->cclk)) {
+       if (IS_ERR(cdev->hclk) || IS_ERR(cdev->cclk)) {
                dev_err(cdev->dev, "no clock found\n");
                ret = -ENODEV;
        }
index 8f184a8..f2219aa 100644 (file)
@@ -120,7 +120,7 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
 
        ret = pci_alloc_irq_vectors(pci, 1, 1, PCI_IRQ_ALL_TYPES);
        if (ret < 0)
-               return ret;
+               goto err_free_dev;
 
        mcan_class->dev = &pci->dev;
        mcan_class->net->irq = pci_irq_vector(pci, 0);
@@ -132,7 +132,7 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
 
        ret = m_can_class_register(mcan_class);
        if (ret)
-               goto err;
+               goto err_free_irq;
 
        /* Enable interrupt control at CAN wrapper IP */
        writel(0x1, base + CTL_CSR_INT_CTL_OFFSET);
@@ -144,8 +144,10 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
 
        return 0;
 
-err:
+err_free_irq:
        pci_free_irq_vectors(pci);
+err_free_dev:
+       m_can_class_free_dev(mcan_class->net);
        return ret;
 }
 
@@ -161,6 +163,7 @@ static void m_can_pci_remove(struct pci_dev *pci)
        writel(0x0, priv->base + CTL_CSR_INT_CTL_OFFSET);
 
        m_can_class_unregister(mcan_class);
+       m_can_class_free_dev(mcan_class->net);
        pci_free_irq_vectors(pci);
 }
 
index d513fac..db3e767 100644 (file)
@@ -202,22 +202,24 @@ static int sja1000_isa_probe(struct platform_device *pdev)
        if (err) {
                dev_err(&pdev->dev, "registering %s failed (err=%d)\n",
                        DRV_NAME, err);
-               goto exit_unmap;
+               goto exit_free;
        }
 
        dev_info(&pdev->dev, "%s device registered (reg_base=0x%p, irq=%d)\n",
                 DRV_NAME, priv->reg_base, dev->irq);
        return 0;
 
- exit_unmap:
+exit_free:
+       free_sja1000dev(dev);
+exit_unmap:
        if (mem[idx])
                iounmap(base);
- exit_release:
+exit_release:
        if (mem[idx])
                release_mem_region(mem[idx], iosize);
        else
                release_region(port[idx], iosize);
- exit:
+exit:
        return err;
 }
 
index 25f863b..ddb7c57 100644 (file)
@@ -2091,8 +2091,11 @@ static int es58x_init_netdev(struct es58x_device *es58x_dev, int channel_idx)
        netdev->dev_port = channel_idx;
 
        ret = register_candev(netdev);
-       if (ret)
+       if (ret) {
+               es58x_dev->netdev[channel_idx] = NULL;
+               free_candev(netdev);
                return ret;
+       }
 
        netdev_queue_set_dql_min_limit(netdev_get_tx_queue(netdev, 0),
                                       es58x_dev->param->dql_min_limit);
index 218b098..47619e9 100644 (file)
 #define MCBA_VER_REQ_USB 1
 #define MCBA_VER_REQ_CAN 2
 
+/* Drive the CAN_RES signal LOW "0" to activate R24 and R25 */
+#define MCBA_VER_TERMINATION_ON 0
+#define MCBA_VER_TERMINATION_OFF 1
+
 #define MCBA_SIDL_EXID_MASK 0x8
 #define MCBA_DLC_MASK 0xf
 #define MCBA_DLC_RTR_MASK 0x40
@@ -463,7 +467,7 @@ static void mcba_usb_process_ka_usb(struct mcba_priv *priv,
                priv->usb_ka_first_pass = false;
        }
 
-       if (msg->termination_state)
+       if (msg->termination_state == MCBA_VER_TERMINATION_ON)
                priv->can.termination = MCBA_TERMINATION_ENABLED;
        else
                priv->can.termination = MCBA_TERMINATION_DISABLED;
@@ -785,9 +789,9 @@ static int mcba_set_termination(struct net_device *netdev, u16 term)
        };
 
        if (term == MCBA_TERMINATION_ENABLED)
-               usb_msg.termination = 1;
+               usb_msg.termination = MCBA_VER_TERMINATION_ON;
        else
-               usb_msg.termination = 0;
+               usb_msg.termination = MCBA_VER_TERMINATION_OFF;
 
        mcba_usb_xmit_cmd(priv, (struct mcba_usb_msg *)&usb_msg);
 
index 7633b22..711d5b5 100644 (file)
@@ -990,6 +990,7 @@ static int tse_shutdown(struct net_device *dev)
        int ret;
 
        phylink_stop(priv->phylink);
+       phylink_disconnect_phy(priv->phylink);
        netif_stop_queue(dev);
        napi_disable(&priv->napi);
 
index a08f221..ac4ea93 100644 (file)
@@ -13,6 +13,7 @@
 #include "aq_ptp.h"
 #include "aq_filters.h"
 #include "aq_macsec.h"
+#include "aq_main.h"
 
 #include <linux/ptp_clock_kernel.h>
 
@@ -858,7 +859,7 @@ static int aq_set_ringparam(struct net_device *ndev,
 
        if (netif_running(ndev)) {
                ndev_running = true;
-               dev_close(ndev);
+               aq_ndev_close(ndev);
        }
 
        cfg->rxds = max(ring->rx_pending, hw_caps->rxds_min);
@@ -874,7 +875,7 @@ static int aq_set_ringparam(struct net_device *ndev,
                goto err_exit;
 
        if (ndev_running)
-               err = dev_open(ndev, NULL);
+               err = aq_ndev_open(ndev);
 
 err_exit:
        return err;
index 8a0af37..77609dc 100644 (file)
@@ -58,7 +58,7 @@ struct net_device *aq_ndev_alloc(void)
        return ndev;
 }
 
-static int aq_ndev_open(struct net_device *ndev)
+int aq_ndev_open(struct net_device *ndev)
 {
        struct aq_nic_s *aq_nic = netdev_priv(ndev);
        int err = 0;
@@ -88,7 +88,7 @@ err_exit:
        return err;
 }
 
-static int aq_ndev_close(struct net_device *ndev)
+int aq_ndev_close(struct net_device *ndev)
 {
        struct aq_nic_s *aq_nic = netdev_priv(ndev);
        int err = 0;
index 9987086..a78c1a1 100644 (file)
@@ -16,5 +16,7 @@ DECLARE_STATIC_KEY_FALSE(aq_xdp_locking_key);
 
 void aq_ndev_schedule_work(struct work_struct *work);
 struct net_device *aq_ndev_alloc(void);
+int aq_ndev_open(struct net_device *ndev);
+int aq_ndev_close(struct net_device *ndev);
 
 #endif /* AQ_MAIN_H */
index 2f6484d..7eb2ddb 100644 (file)
@@ -1436,8 +1436,10 @@ static acpi_status bgx_acpi_match_id(acpi_handle handle, u32 lvl,
                return AE_OK;
        }
 
-       if (strncmp(string.pointer, bgx_sel, 4))
+       if (strncmp(string.pointer, bgx_sel, 4)) {
+               kfree(string.pointer);
                return AE_OK;
+       }
 
        acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, 1,
                            bgx_acpi_register_phy, NULL, bgx, NULL);
index f8c06c3..8671591 100644 (file)
@@ -2058,7 +2058,7 @@ static void enetc_setup_txbdr(struct enetc_hw *hw, struct enetc_bdr *tx_ring)
        /* enable Tx ints by setting pkt thr to 1 */
        enetc_txbdr_wr(hw, idx, ENETC_TBICR0, ENETC_TBICR0_ICEN | 0x1);
 
-       tbmr = ENETC_TBMR_EN;
+       tbmr = ENETC_TBMR_EN | ENETC_TBMR_SET_PRIO(tx_ring->prio);
        if (tx_ring->ndev->features & NETIF_F_HW_VLAN_CTAG_TX)
                tbmr |= ENETC_TBMR_VIH;
 
@@ -2461,7 +2461,8 @@ int enetc_setup_tc_mqprio(struct net_device *ndev, void *type_data)
                /* Reset all ring priorities to 0 */
                for (i = 0; i < priv->num_tx_rings; i++) {
                        tx_ring = priv->tx_ring[i];
-                       enetc_set_bdr_prio(hw, tx_ring->index, 0);
+                       tx_ring->prio = 0;
+                       enetc_set_bdr_prio(hw, tx_ring->index, tx_ring->prio);
                }
 
                return 0;
@@ -2480,7 +2481,8 @@ int enetc_setup_tc_mqprio(struct net_device *ndev, void *type_data)
         */
        for (i = 0; i < num_tc; i++) {
                tx_ring = priv->tx_ring[i];
-               enetc_set_bdr_prio(hw, tx_ring->index, i);
+               tx_ring->prio = i;
+               enetc_set_bdr_prio(hw, tx_ring->index, tx_ring->prio);
        }
 
        /* Reset the number of netdev queues based on the TC count */
index 161930a..c6d8cc1 100644 (file)
@@ -95,6 +95,7 @@ struct enetc_bdr {
                void __iomem *rcir;
        };
        u16 index;
+       u16 prio;
        int bd_count; /* # of BDs */
        int next_to_use;
        int next_to_clean;
index a842e19..fcebb54 100644 (file)
@@ -137,6 +137,7 @@ int enetc_setup_tc_taprio(struct net_device *ndev, void *type_data)
        struct tc_taprio_qopt_offload *taprio = type_data;
        struct enetc_ndev_priv *priv = netdev_priv(ndev);
        struct enetc_hw *hw = &priv->si->hw;
+       struct enetc_bdr *tx_ring;
        int err;
        int i;
 
@@ -145,16 +146,20 @@ int enetc_setup_tc_taprio(struct net_device *ndev, void *type_data)
                if (priv->tx_ring[i]->tsd_enable)
                        return -EBUSY;
 
-       for (i = 0; i < priv->num_tx_rings; i++)
-               enetc_set_bdr_prio(hw, priv->tx_ring[i]->index,
-                                  taprio->enable ? i : 0);
+       for (i = 0; i < priv->num_tx_rings; i++) {
+               tx_ring = priv->tx_ring[i];
+               tx_ring->prio = taprio->enable ? i : 0;
+               enetc_set_bdr_prio(hw, tx_ring->index, tx_ring->prio);
+       }
 
        err = enetc_setup_taprio(ndev, taprio);
-
-       if (err)
-               for (i = 0; i < priv->num_tx_rings; i++)
-                       enetc_set_bdr_prio(hw, priv->tx_ring[i]->index,
-                                          taprio->enable ? 0 : i);
+       if (err) {
+               for (i = 0; i < priv->num_tx_rings; i++) {
+                       tx_ring = priv->tx_ring[i];
+                       tx_ring->prio = taprio->enable ? 0 : i;
+                       enetc_set_bdr_prio(hw, tx_ring->index, tx_ring->prio);
+               }
+       }
 
        return err;
 }
index f623c12..2ca2b61 100644 (file)
@@ -74,7 +74,7 @@
 #include "fec.h"
 
 static void set_multicast_list(struct net_device *ndev);
-static void fec_enet_itr_coal_init(struct net_device *ndev);
+static void fec_enet_itr_coal_set(struct net_device *ndev);
 
 #define DRIVER_NAME    "fec"
 
@@ -1220,8 +1220,7 @@ fec_restart(struct net_device *ndev)
                writel(0, fep->hwp + FEC_IMASK);
 
        /* Init the interrupt coalescing */
-       fec_enet_itr_coal_init(ndev);
-
+       fec_enet_itr_coal_set(ndev);
 }
 
 static int fec_enet_ipc_handle_init(struct fec_enet_private *fep)
@@ -2856,19 +2855,6 @@ static int fec_enet_set_coalesce(struct net_device *ndev,
        return 0;
 }
 
-static void fec_enet_itr_coal_init(struct net_device *ndev)
-{
-       struct ethtool_coalesce ec;
-
-       ec.rx_coalesce_usecs = FEC_ITR_ICTT_DEFAULT;
-       ec.rx_max_coalesced_frames = FEC_ITR_ICFT_DEFAULT;
-
-       ec.tx_coalesce_usecs = FEC_ITR_ICTT_DEFAULT;
-       ec.tx_max_coalesced_frames = FEC_ITR_ICFT_DEFAULT;
-
-       fec_enet_set_coalesce(ndev, &ec, NULL, NULL);
-}
-
 static int fec_enet_get_tunable(struct net_device *netdev,
                                const struct ethtool_tunable *tuna,
                                void *data)
@@ -3623,6 +3609,10 @@ static int fec_enet_init(struct net_device *ndev)
        fep->rx_align = 0x3;
        fep->tx_align = 0x3;
 #endif
+       fep->rx_pkts_itr = FEC_ITR_ICFT_DEFAULT;
+       fep->tx_pkts_itr = FEC_ITR_ICFT_DEFAULT;
+       fep->rx_time_itr = FEC_ITR_ICTT_DEFAULT;
+       fep->tx_time_itr = FEC_ITR_ICTT_DEFAULT;
 
        /* Check mask of the streaming and coherent API */
        ret = dma_set_mask_and_coherent(&fep->pdev->dev, DMA_BIT_MASK(32));
index 7646bb2..a62c1b3 100644 (file)
@@ -4985,6 +4985,8 @@ static int nix_setup_ipolicers(struct rvu *rvu,
                ipolicer->ref_count = devm_kcalloc(rvu->dev,
                                                   ipolicer->band_prof.max,
                                                   sizeof(u16), GFP_KERNEL);
+               if (!ipolicer->ref_count)
+                       return -ENOMEM;
        }
 
        /* Set policer timeunit to 2us ie  (19 + 1) * 100 nsec = 2us */
index b04fb22..ae50d56 100644 (file)
@@ -62,15 +62,18 @@ int rvu_sdp_init(struct rvu *rvu)
                pfvf->sdp_info = devm_kzalloc(rvu->dev,
                                              sizeof(struct sdp_node_info),
                                              GFP_KERNEL);
-               if (!pfvf->sdp_info)
+               if (!pfvf->sdp_info) {
+                       pci_dev_put(pdev);
                        return -ENOMEM;
+               }
 
                dev_info(rvu->dev, "SDP PF number:%d\n", sdp_pf_num[i]);
 
-               put_device(&pdev->dev);
                i++;
        }
 
+       pci_dev_put(pdev);
+
        return 0;
 }
 
index 282db6f..67aa02b 100644 (file)
@@ -884,7 +884,7 @@ static inline void otx2_dma_unmap_page(struct otx2_nic *pfvf,
 static inline u16 otx2_get_smq_idx(struct otx2_nic *pfvf, u16 qidx)
 {
 #ifdef CONFIG_DCB
-       if (pfvf->pfc_alloc_status[qidx])
+       if (qidx < NIX_PF_PFC_PRIO_MAX && pfvf->pfc_alloc_status[qidx])
                return pfvf->pfc_schq_list[NIX_TXSCH_LVL_SMQ][qidx];
 #endif
 
index 24f9d60..47796e4 100644 (file)
@@ -746,6 +746,7 @@ static int prestera_port_create(struct prestera_switch *sw, u32 id)
        return 0;
 
 err_sfp_bind:
+       unregister_netdev(dev);
 err_register_netdev:
        prestera_port_list_del(port);
 err_port_init:
index 9fb1fa4..16e6bd4 100644 (file)
@@ -767,34 +767,34 @@ static int qed_mcp_cancel_load_req(struct qed_hwfn *p_hwfn,
        return rc;
 }
 
-#define CONFIG_QEDE_BITMAP_IDX         BIT(0)
-#define CONFIG_QED_SRIOV_BITMAP_IDX    BIT(1)
-#define CONFIG_QEDR_BITMAP_IDX         BIT(2)
-#define CONFIG_QEDF_BITMAP_IDX         BIT(4)
-#define CONFIG_QEDI_BITMAP_IDX         BIT(5)
-#define CONFIG_QED_LL2_BITMAP_IDX      BIT(6)
+#define BITMAP_IDX_FOR_CONFIG_QEDE     BIT(0)
+#define BITMAP_IDX_FOR_CONFIG_QED_SRIOV        BIT(1)
+#define BITMAP_IDX_FOR_CONFIG_QEDR     BIT(2)
+#define BITMAP_IDX_FOR_CONFIG_QEDF     BIT(4)
+#define BITMAP_IDX_FOR_CONFIG_QEDI     BIT(5)
+#define BITMAP_IDX_FOR_CONFIG_QED_LL2  BIT(6)
 
 static u32 qed_get_config_bitmap(void)
 {
        u32 config_bitmap = 0x0;
 
        if (IS_ENABLED(CONFIG_QEDE))
-               config_bitmap |= CONFIG_QEDE_BITMAP_IDX;
+               config_bitmap |= BITMAP_IDX_FOR_CONFIG_QEDE;
 
        if (IS_ENABLED(CONFIG_QED_SRIOV))
-               config_bitmap |= CONFIG_QED_SRIOV_BITMAP_IDX;
+               config_bitmap |= BITMAP_IDX_FOR_CONFIG_QED_SRIOV;
 
        if (IS_ENABLED(CONFIG_QED_RDMA))
-               config_bitmap |= CONFIG_QEDR_BITMAP_IDX;
+               config_bitmap |= BITMAP_IDX_FOR_CONFIG_QEDR;
 
        if (IS_ENABLED(CONFIG_QED_FCOE))
-               config_bitmap |= CONFIG_QEDF_BITMAP_IDX;
+               config_bitmap |= BITMAP_IDX_FOR_CONFIG_QEDF;
 
        if (IS_ENABLED(CONFIG_QED_ISCSI))
-               config_bitmap |= CONFIG_QEDI_BITMAP_IDX;
+               config_bitmap |= BITMAP_IDX_FOR_CONFIG_QEDI;
 
        if (IS_ENABLED(CONFIG_QED_LL2))
-               config_bitmap |= CONFIG_QED_LL2_BITMAP_IDX;
+               config_bitmap |= BITMAP_IDX_FOR_CONFIG_QED_LL2;
 
        return config_bitmap;
 }
index bd06076..2fd5c6f 100644 (file)
@@ -2991,7 +2991,7 @@ static void qlcnic_83xx_recover_driver_lock(struct qlcnic_adapter *adapter)
                QLCWRX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK, val);
                dev_info(&adapter->pdev->dev,
                         "%s: lock recovery initiated\n", __func__);
-               msleep(QLC_83XX_DRV_LOCK_RECOVERY_DELAY);
+               mdelay(QLC_83XX_DRV_LOCK_RECOVERY_DELAY);
                val = QLCRDX(adapter->ahw, QLC_83XX_RECOVER_DRV_LOCK);
                id = ((val >> 2) & 0xF);
                if (id == adapter->portnum) {
@@ -3027,7 +3027,7 @@ int qlcnic_83xx_lock_driver(struct qlcnic_adapter *adapter)
                if (status)
                        break;
 
-               msleep(QLC_83XX_DRV_LOCK_WAIT_DELAY);
+               mdelay(QLC_83XX_DRV_LOCK_WAIT_DELAY);
                i++;
 
                if (i == 1)
index c25bfec..e5cfde1 100644 (file)
@@ -748,6 +748,8 @@ static void dwmac4_flow_ctrl(struct mac_device_info *hw, unsigned int duplex,
        if (fc & FLOW_RX) {
                pr_debug("\tReceive Flow-Control ON\n");
                flow |= GMAC_RX_FLOW_CTRL_RFE;
+       } else {
+               pr_debug("\tReceive Flow-Control OFF\n");
        }
        writel(flow, ioaddr + GMAC_RX_FLOW_CTRL);
 
index 6b43da7..23ec0a9 100644 (file)
@@ -1061,8 +1061,16 @@ static void stmmac_mac_link_up(struct phylink_config *config,
                ctrl |= priv->hw->link.duplex;
 
        /* Flow Control operation */
-       if (tx_pause && rx_pause)
-               stmmac_mac_flow_ctrl(priv, duplex);
+       if (rx_pause && tx_pause)
+               priv->flow_ctrl = FLOW_AUTO;
+       else if (rx_pause && !tx_pause)
+               priv->flow_ctrl = FLOW_RX;
+       else if (!rx_pause && tx_pause)
+               priv->flow_ctrl = FLOW_TX;
+       else
+               priv->flow_ctrl = FLOW_OFF;
+
+       stmmac_mac_flow_ctrl(priv, duplex);
 
        if (ctrl != old_ctrl)
                writel(ctrl, priv->ioaddr + MAC_CTRL_REG);
index 14e8d04..2e97429 100644 (file)
@@ -211,7 +211,7 @@ static __net_init int loopback_net_init(struct net *net)
        int err;
 
        err = -ENOMEM;
-       dev = alloc_netdev(0, "lo", NET_NAME_UNKNOWN, loopback_setup);
+       dev = alloc_netdev(0, "lo", NET_NAME_PREDICTABLE, loopback_setup);
        if (!dev)
                goto out;
 
index 57849ac..a72adab 100644 (file)
@@ -1520,6 +1520,7 @@ error:
 
 error_module_put:
        module_put(d->driver->owner);
+       d->driver = NULL;
 error_put_device:
        put_device(d);
        if (ndev_owner != bus->owner)
index 7106932..86e5245 100644 (file)
@@ -3949,12 +3949,11 @@ static int virtnet_probe(struct virtio_device *vdev)
        return 0;
 
 free_unregister_netdev:
-       virtio_reset_device(vdev);
-
        unregister_netdev(dev);
 free_failover:
        net_failover_destroy(vi->failover);
 free_vqs:
+       virtio_reset_device(vdev);
        cancel_delayed_work_sync(&vi->refill);
        free_receive_page_frags(vi);
        virtnet_del_vqs(vi);
index 3458af3..7d0f5e4 100644 (file)
@@ -165,6 +165,8 @@ static int t7xx_acpi_reset(struct t7xx_pci_dev *t7xx_dev, char *fn_name)
                return -EFAULT;
        }
 
+       kfree(buffer.pointer);
+
 #endif
        return 0;
 }
index 7764b1a..ec87dd2 100644 (file)
@@ -312,6 +312,8 @@ static int st_nci_hci_connectivity_event_received(struct nci_dev *ndev,
        int r = 0;
        struct device *dev = &ndev->nfc_dev->dev;
        struct nfc_evt_transaction *transaction;
+       u32 aid_len;
+       u8 params_len;
 
        pr_debug("connectivity gate event: %x\n", event);
 
@@ -325,26 +327,47 @@ static int st_nci_hci_connectivity_event_received(struct nci_dev *ndev,
                 * Description  Tag     Length
                 * AID          81      5 to 16
                 * PARAMETERS   82      0 to 255
+                *
+                * The key differences are aid storage length is variably sized
+                * in the packet, but fixed in nfc_evt_transaction, and that
+                * the aid_len is u8 in the packet, but u32 in the structure,
+                * and the tags in the packet are not included in
+                * nfc_evt_transaction.
+                *
+                * size(b):  1          1       5-16 1             1           0-255
+                * offset:   0          1       2    aid_len + 2   aid_len + 3 aid_len + 4
+                * mem name: aid_tag(M) aid_len aid  params_tag(M) params_len  params
+                * example:  0x81       5-16    X    0x82          0-255       X
                 */
-               if (skb->len < NFC_MIN_AID_LENGTH + 2 &&
-                   skb->data[0] != NFC_EVT_TRANSACTION_AID_TAG)
+               if (skb->len < 2 || skb->data[0] != NFC_EVT_TRANSACTION_AID_TAG)
                        return -EPROTO;
 
-               transaction = devm_kzalloc(dev, skb->len - 2, GFP_KERNEL);
-               if (!transaction)
-                       return -ENOMEM;
+               aid_len = skb->data[1];
 
-               transaction->aid_len = skb->data[1];
-               memcpy(transaction->aid, &skb->data[2], transaction->aid_len);
+               if (skb->len < aid_len + 4 ||
+                   aid_len > sizeof(transaction->aid))
+                       return -EPROTO;
 
-               /* Check next byte is PARAMETERS tag (82) */
-               if (skb->data[transaction->aid_len + 2] !=
-                   NFC_EVT_TRANSACTION_PARAMS_TAG)
+               params_len = skb->data[aid_len + 3];
+
+               /* Verify PARAMETERS tag is (82), and final check that there is
+                * enough space in the packet to read everything.
+                */
+               if (skb->data[aid_len + 2] != NFC_EVT_TRANSACTION_PARAMS_TAG ||
+                   skb->len < aid_len + 4 + params_len)
                        return -EPROTO;
 
-               transaction->params_len = skb->data[transaction->aid_len + 3];
-               memcpy(transaction->params, skb->data +
-                      transaction->aid_len + 4, transaction->params_len);
+               transaction = devm_kzalloc(dev, sizeof(*transaction) +
+                                          params_len, GFP_KERNEL);
+               if (!transaction)
+                       return -ENOMEM;
+
+               transaction->aid_len = aid_len;
+               transaction->params_len = params_len;
+
+               memcpy(transaction->aid, &skb->data[2], aid_len);
+               memcpy(transaction->params, &skb->data[aid_len + 4],
+                      params_len);
 
                r = nfc_se_transaction(ndev->nfc_dev, host, transaction);
                break;
index 5755ae5..6a86968 100644 (file)
@@ -14,7 +14,7 @@
 #define OCR_MODE_TEST     0x01
 #define OCR_MODE_NORMAL   0x02
 #define OCR_MODE_CLOCK    0x03
-#define OCR_MODE_MASK     0x07
+#define OCR_MODE_MASK     0x03
 #define OCR_TX0_INVERT    0x04
 #define OCR_TX0_PULLDOWN  0x08
 #define OCR_TX0_PULLUP    0x10
index 6fac2f0..711cd3b 100644 (file)
@@ -48,9 +48,11 @@ static const char *lwtunnel_encap_str(enum lwtunnel_encap_types encap_type)
                return "RPL";
        case LWTUNNEL_ENCAP_IOAM6:
                return "IOAM6";
+       case LWTUNNEL_ENCAP_XFRM:
+               /* module autoload not supported for encap type */
+               return NULL;
        case LWTUNNEL_ENCAP_IP6:
        case LWTUNNEL_ENCAP_IP:
-       case LWTUNNEL_ENCAP_XFRM:
        case LWTUNNEL_ENCAP_NONE:
        case __LWTUNNEL_ENCAP_MAX:
                /* should not have got here */
index 1701527..3969fa8 100644 (file)
@@ -314,6 +314,9 @@ static int esp_xmit(struct xfrm_state *x, struct sk_buff *skb,  netdev_features_
                        xo->seq.low += skb_shinfo(skb)->gso_segs;
        }
 
+       if (xo->seq.low < seq)
+               xo->seq.hi++;
+
        esp.seqno = cpu_to_be64(seq + ((u64)xo->seq.hi << 32));
 
        ip_hdr(skb)->tot_len = htons(skb->len);
index 1b51239..e880ce7 100644 (file)
@@ -366,6 +366,11 @@ static int ip_rcv_finish_core(struct net *net, struct sock *sk,
                                           iph->tos, dev);
                if (unlikely(err))
                        goto drop_error;
+       } else {
+               struct in_device *in_dev = __in_dev_get_rcu(dev);
+
+               if (in_dev && IN_DEV_ORCONF(in_dev, NOPOLICY))
+                       IPCB(skb)->flags |= IPSKB_NOPOLICY;
        }
 
 #ifdef CONFIG_IP_ROUTE_CLASSID
index 79d4354..242f429 100644 (file)
@@ -346,6 +346,9 @@ static int esp6_xmit(struct xfrm_state *x, struct sk_buff *skb,  netdev_features
                        xo->seq.low += skb_shinfo(skb)->gso_segs;
        }
 
+       if (xo->seq.low < seq)
+               xo->seq.hi++;
+
        esp.seqno = cpu_to_be64(xo->seq.low + ((u64)xo->seq.hi << 32));
 
        len = skb->len - sizeof(struct ipv6hdr);
index 4a4b0e4..ea435eb 100644 (file)
@@ -287,9 +287,13 @@ int __init xfrm6_init(void)
        if (ret)
                goto out_state;
 
-       register_pernet_subsys(&xfrm6_net_ops);
+       ret = register_pernet_subsys(&xfrm6_net_ops);
+       if (ret)
+               goto out_protocol;
 out:
        return ret;
+out_protocol:
+       xfrm6_protocol_fini();
 out_state:
        xfrm6_state_fini();
 out_policy:
index c85df5b..95edcbe 100644 (file)
@@ -2905,7 +2905,7 @@ static int count_ah_combs(const struct xfrm_tmpl *t)
                        break;
                if (!aalg->pfkey_supported)
                        continue;
-               if (aalg_tmpl_set(t, aalg) && aalg->available)
+               if (aalg_tmpl_set(t, aalg))
                        sz += sizeof(struct sadb_comb);
        }
        return sz + sizeof(struct sadb_prop);
@@ -2923,7 +2923,7 @@ static int count_esp_combs(const struct xfrm_tmpl *t)
                if (!ealg->pfkey_supported)
                        continue;
 
-               if (!(ealg_tmpl_set(t, ealg) && ealg->available))
+               if (!(ealg_tmpl_set(t, ealg)))
                        continue;
 
                for (k = 1; ; k++) {
@@ -2934,16 +2934,17 @@ static int count_esp_combs(const struct xfrm_tmpl *t)
                        if (!aalg->pfkey_supported)
                                continue;
 
-                       if (aalg_tmpl_set(t, aalg) && aalg->available)
+                       if (aalg_tmpl_set(t, aalg))
                                sz += sizeof(struct sadb_comb);
                }
        }
        return sz + sizeof(struct sadb_prop);
 }
 
-static void dump_ah_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
+static int dump_ah_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
 {
        struct sadb_prop *p;
+       int sz = 0;
        int i;
 
        p = skb_put(skb, sizeof(struct sadb_prop));
@@ -2971,13 +2972,17 @@ static void dump_ah_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
                        c->sadb_comb_soft_addtime = 20*60*60;
                        c->sadb_comb_hard_usetime = 8*60*60;
                        c->sadb_comb_soft_usetime = 7*60*60;
+                       sz += sizeof(*c);
                }
        }
+
+       return sz + sizeof(*p);
 }
 
-static void dump_esp_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
+static int dump_esp_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
 {
        struct sadb_prop *p;
+       int sz = 0;
        int i, k;
 
        p = skb_put(skb, sizeof(struct sadb_prop));
@@ -3019,8 +3024,11 @@ static void dump_esp_combs(struct sk_buff *skb, const struct xfrm_tmpl *t)
                        c->sadb_comb_soft_addtime = 20*60*60;
                        c->sadb_comb_hard_usetime = 8*60*60;
                        c->sadb_comb_soft_usetime = 7*60*60;
+                       sz += sizeof(*c);
                }
        }
+
+       return sz + sizeof(*p);
 }
 
 static int key_notify_policy_expire(struct xfrm_policy *xp, const struct km_event *c)
@@ -3150,6 +3158,7 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
        struct sadb_x_sec_ctx *sec_ctx;
        struct xfrm_sec_ctx *xfrm_ctx;
        int ctx_size = 0;
+       int alg_size = 0;
 
        sockaddr_size = pfkey_sockaddr_size(x->props.family);
        if (!sockaddr_size)
@@ -3161,16 +3170,16 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
                sizeof(struct sadb_x_policy);
 
        if (x->id.proto == IPPROTO_AH)
-               size += count_ah_combs(t);
+               alg_size = count_ah_combs(t);
        else if (x->id.proto == IPPROTO_ESP)
-               size += count_esp_combs(t);
+               alg_size = count_esp_combs(t);
 
        if ((xfrm_ctx = x->security)) {
                ctx_size = PFKEY_ALIGN8(xfrm_ctx->ctx_len);
                size +=  sizeof(struct sadb_x_sec_ctx) + ctx_size;
        }
 
-       skb =  alloc_skb(size + 16, GFP_ATOMIC);
+       skb =  alloc_skb(size + alg_size + 16, GFP_ATOMIC);
        if (skb == NULL)
                return -ENOMEM;
 
@@ -3224,10 +3233,13 @@ static int pfkey_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *t, struct
        pol->sadb_x_policy_priority = xp->priority;
 
        /* Set sadb_comb's. */
+       alg_size = 0;
        if (x->id.proto == IPPROTO_AH)
-               dump_ah_combs(skb, t);
+               alg_size = dump_ah_combs(skb, t);
        else if (x->id.proto == IPPROTO_ESP)
-               dump_esp_combs(skb, t);
+               alg_size = dump_esp_combs(skb, t);
+
+       hdr->sadb_msg_len += alg_size / 8;
 
        /* security context */
        if (xfrm_ctx) {
@@ -3382,7 +3394,7 @@ static int pfkey_send_new_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr,
        hdr->sadb_msg_len = size / sizeof(uint64_t);
        hdr->sadb_msg_errno = 0;
        hdr->sadb_msg_reserved = 0;
-       hdr->sadb_msg_seq = x->km.seq = get_acqseq();
+       hdr->sadb_msg_seq = x->km.seq;
        hdr->sadb_msg_pid = 0;
 
        /* SA */
index 3adc291..7499192 100644 (file)
@@ -916,7 +916,7 @@ mtype_add(struct ip_set *set, void *value, const struct ip_set_ext *ext,
 #ifdef IP_SET_HASH_WITH_MULTI
                if (h->bucketsize >= AHASH_MAX_TUNED)
                        goto set_full;
-               else if (h->bucketsize < multi)
+               else if (h->bucketsize <= multi)
                        h->bucketsize += AHASH_INIT_SIZE;
 #endif
                if (n->size >= AHASH_MAX(h)) {
index dd30c03..75d556d 100644 (file)
@@ -151,18 +151,16 @@ hash_ip4_uadt(struct ip_set *set, struct nlattr *tb[],
        if (((u64)ip_to - ip + 1) >> (32 - h->netmask) > IPSET_MAX_RANGE)
                return -ERANGE;
 
-       if (retried) {
+       if (retried)
                ip = ntohl(h->next.ip);
-               e.ip = htonl(ip);
-       }
        for (; ip <= ip_to;) {
+               e.ip = htonl(ip);
                ret = adtfn(set, &e, &ext, &ext, flags);
                if (ret && !ip_set_eexist(ret, flags))
                        return ret;
 
                ip += hosts;
-               e.ip = htonl(ip);
-               if (e.ip == 0)
+               if (ip == 0)
                        return 0;
 
                ret = 0;
index b04645c..00b5228 100644 (file)
@@ -1098,6 +1098,7 @@ static int nf_flow_table_block_setup(struct nf_flowtable *flowtable,
        struct flow_block_cb *block_cb, *next;
        int err = 0;
 
+       down_write(&flowtable->flow_block_lock);
        switch (cmd) {
        case FLOW_BLOCK_BIND:
                list_splice(&bo->cb_list, &flowtable->flow_block.cb_list);
@@ -1112,6 +1113,7 @@ static int nf_flow_table_block_setup(struct nf_flowtable *flowtable,
                WARN_ON_ONCE(1);
                err = -EOPNOTSUPP;
        }
+       up_write(&flowtable->flow_block_lock);
 
        return err;
 }
@@ -1168,7 +1170,9 @@ static int nf_flow_table_offload_cmd(struct flow_block_offload *bo,
 
        nf_flow_table_block_offload_init(bo, dev_net(dev), cmd, flowtable,
                                         extack);
+       down_write(&flowtable->flow_block_lock);
        err = dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_FT, bo);
+       up_write(&flowtable->flow_block_lock);
        if (err < 0)
                return err;
 
index 5f5aafd..21269e8 100644 (file)
@@ -97,6 +97,18 @@ static void xfrm_outer_mode_prep(struct xfrm_state *x, struct sk_buff *skb)
        }
 }
 
+static inline bool xmit_xfrm_check_overflow(struct sk_buff *skb)
+{
+       struct xfrm_offload *xo = xfrm_offload(skb);
+       __u32 seq = xo->seq.low;
+
+       seq += skb_shinfo(skb)->gso_segs;
+       if (unlikely(seq < xo->seq.low))
+               return true;
+
+       return false;
+}
+
 struct sk_buff *validate_xmit_xfrm(struct sk_buff *skb, netdev_features_t features, bool *again)
 {
        int err;
@@ -134,7 +146,8 @@ struct sk_buff *validate_xmit_xfrm(struct sk_buff *skb, netdev_features_t featur
                return skb;
        }
 
-       if (skb_is_gso(skb) && unlikely(x->xso.dev != dev)) {
+       if (skb_is_gso(skb) && (unlikely(x->xso.dev != dev) ||
+                               unlikely(xmit_xfrm_check_overflow(skb)))) {
                struct sk_buff *segs;
 
                /* Packet got rerouted, fixup features and segment it. */
index 9f4d42e..ce56d65 100644 (file)
@@ -714,7 +714,7 @@ static int xfrm_replay_overflow_offload_esn(struct xfrm_state *x, struct sk_buff
                        oseq += skb_shinfo(skb)->gso_segs;
                }
 
-               if (unlikely(oseq < replay_esn->oseq)) {
+               if (unlikely(xo->seq.low < replay_esn->oseq)) {
                        XFRM_SKB_CB(skb)->seq.output.hi = ++oseq_hi;
                        xo->seq.hi = oseq_hi;
                        replay_esn->oseq_hi = oseq_hi;