diff options
Diffstat (limited to 'drivers')
54 files changed, 377 insertions, 287 deletions
diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c index 648f91b58d1e..9b6ce7c3f6c3 100644 --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c | |||
| @@ -1048,6 +1048,7 @@ struct bcm_sf2_of_data { | |||
| 1048 | u32 type; | 1048 | u32 type; |
| 1049 | const u16 *reg_offsets; | 1049 | const u16 *reg_offsets; |
| 1050 | unsigned int core_reg_align; | 1050 | unsigned int core_reg_align; |
| 1051 | unsigned int num_cfp_rules; | ||
| 1051 | }; | 1052 | }; |
| 1052 | 1053 | ||
| 1053 | /* Register offsets for the SWITCH_REG_* block */ | 1054 | /* Register offsets for the SWITCH_REG_* block */ |
| @@ -1071,6 +1072,7 @@ static const struct bcm_sf2_of_data bcm_sf2_7445_data = { | |||
| 1071 | .type = BCM7445_DEVICE_ID, | 1072 | .type = BCM7445_DEVICE_ID, |
| 1072 | .core_reg_align = 0, | 1073 | .core_reg_align = 0, |
| 1073 | .reg_offsets = bcm_sf2_7445_reg_offsets, | 1074 | .reg_offsets = bcm_sf2_7445_reg_offsets, |
| 1075 | .num_cfp_rules = 256, | ||
| 1074 | }; | 1076 | }; |
| 1075 | 1077 | ||
| 1076 | static const u16 bcm_sf2_7278_reg_offsets[] = { | 1078 | static const u16 bcm_sf2_7278_reg_offsets[] = { |
| @@ -1093,6 +1095,7 @@ static const struct bcm_sf2_of_data bcm_sf2_7278_data = { | |||
| 1093 | .type = BCM7278_DEVICE_ID, | 1095 | .type = BCM7278_DEVICE_ID, |
| 1094 | .core_reg_align = 1, | 1096 | .core_reg_align = 1, |
| 1095 | .reg_offsets = bcm_sf2_7278_reg_offsets, | 1097 | .reg_offsets = bcm_sf2_7278_reg_offsets, |
| 1098 | .num_cfp_rules = 128, | ||
| 1096 | }; | 1099 | }; |
| 1097 | 1100 | ||
| 1098 | static const struct of_device_id bcm_sf2_of_match[] = { | 1101 | static const struct of_device_id bcm_sf2_of_match[] = { |
| @@ -1149,6 +1152,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev) | |||
| 1149 | priv->type = data->type; | 1152 | priv->type = data->type; |
| 1150 | priv->reg_offsets = data->reg_offsets; | 1153 | priv->reg_offsets = data->reg_offsets; |
| 1151 | priv->core_reg_align = data->core_reg_align; | 1154 | priv->core_reg_align = data->core_reg_align; |
| 1155 | priv->num_cfp_rules = data->num_cfp_rules; | ||
| 1152 | 1156 | ||
| 1153 | /* Auto-detection using standard registers will not work, so | 1157 | /* Auto-detection using standard registers will not work, so |
| 1154 | * provide an indication of what kind of device we are for | 1158 | * provide an indication of what kind of device we are for |
diff --git a/drivers/net/dsa/bcm_sf2.h b/drivers/net/dsa/bcm_sf2.h index 7d3030e04f11..7f9125eef3df 100644 --- a/drivers/net/dsa/bcm_sf2.h +++ b/drivers/net/dsa/bcm_sf2.h | |||
| @@ -72,6 +72,7 @@ struct bcm_sf2_priv { | |||
| 72 | u32 type; | 72 | u32 type; |
| 73 | const u16 *reg_offsets; | 73 | const u16 *reg_offsets; |
| 74 | unsigned int core_reg_align; | 74 | unsigned int core_reg_align; |
| 75 | unsigned int num_cfp_rules; | ||
| 75 | 76 | ||
| 76 | /* spinlock protecting access to the indirect registers */ | 77 | /* spinlock protecting access to the indirect registers */ |
| 77 | spinlock_t indir_lock; | 78 | spinlock_t indir_lock; |
diff --git a/drivers/net/dsa/bcm_sf2_cfp.c b/drivers/net/dsa/bcm_sf2_cfp.c index 2fb32d67065f..8a1da7e67707 100644 --- a/drivers/net/dsa/bcm_sf2_cfp.c +++ b/drivers/net/dsa/bcm_sf2_cfp.c | |||
| @@ -98,7 +98,7 @@ static inline void bcm_sf2_cfp_rule_addr_set(struct bcm_sf2_priv *priv, | |||
| 98 | { | 98 | { |
| 99 | u32 reg; | 99 | u32 reg; |
| 100 | 100 | ||
| 101 | WARN_ON(addr >= CFP_NUM_RULES); | 101 | WARN_ON(addr >= priv->num_cfp_rules); |
| 102 | 102 | ||
| 103 | reg = core_readl(priv, CORE_CFP_ACC); | 103 | reg = core_readl(priv, CORE_CFP_ACC); |
| 104 | reg &= ~(XCESS_ADDR_MASK << XCESS_ADDR_SHIFT); | 104 | reg &= ~(XCESS_ADDR_MASK << XCESS_ADDR_SHIFT); |
| @@ -109,7 +109,7 @@ static inline void bcm_sf2_cfp_rule_addr_set(struct bcm_sf2_priv *priv, | |||
| 109 | static inline unsigned int bcm_sf2_cfp_rule_size(struct bcm_sf2_priv *priv) | 109 | static inline unsigned int bcm_sf2_cfp_rule_size(struct bcm_sf2_priv *priv) |
| 110 | { | 110 | { |
| 111 | /* Entry #0 is reserved */ | 111 | /* Entry #0 is reserved */ |
| 112 | return CFP_NUM_RULES - 1; | 112 | return priv->num_cfp_rules - 1; |
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | static int bcm_sf2_cfp_rule_set(struct dsa_switch *ds, int port, | 115 | static int bcm_sf2_cfp_rule_set(struct dsa_switch *ds, int port, |
| @@ -523,7 +523,7 @@ static int bcm_sf2_cfp_rule_get_all(struct bcm_sf2_priv *priv, | |||
| 523 | if (!(reg & OP_STR_DONE)) | 523 | if (!(reg & OP_STR_DONE)) |
| 524 | break; | 524 | break; |
| 525 | 525 | ||
| 526 | } while (index < CFP_NUM_RULES); | 526 | } while (index < priv->num_cfp_rules); |
| 527 | 527 | ||
| 528 | /* Put the TCAM size here */ | 528 | /* Put the TCAM size here */ |
| 529 | nfc->data = bcm_sf2_cfp_rule_size(priv); | 529 | nfc->data = bcm_sf2_cfp_rule_size(priv); |
| @@ -544,7 +544,7 @@ int bcm_sf2_get_rxnfc(struct dsa_switch *ds, int port, | |||
| 544 | case ETHTOOL_GRXCLSRLCNT: | 544 | case ETHTOOL_GRXCLSRLCNT: |
| 545 | /* Subtract the default, unusable rule */ | 545 | /* Subtract the default, unusable rule */ |
| 546 | nfc->rule_cnt = bitmap_weight(priv->cfp.used, | 546 | nfc->rule_cnt = bitmap_weight(priv->cfp.used, |
| 547 | CFP_NUM_RULES) - 1; | 547 | priv->num_cfp_rules) - 1; |
| 548 | /* We support specifying rule locations */ | 548 | /* We support specifying rule locations */ |
| 549 | nfc->data |= RX_CLS_LOC_SPECIAL; | 549 | nfc->data |= RX_CLS_LOC_SPECIAL; |
| 550 | break; | 550 | break; |
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c index 1d307f2def2d..6e253d913fe2 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c | |||
| @@ -1661,21 +1661,21 @@ static int xgene_enet_get_irqs(struct xgene_enet_pdata *pdata) | |||
| 1661 | return 0; | 1661 | return 0; |
| 1662 | } | 1662 | } |
| 1663 | 1663 | ||
| 1664 | static int xgene_enet_check_phy_handle(struct xgene_enet_pdata *pdata) | 1664 | static void xgene_enet_check_phy_handle(struct xgene_enet_pdata *pdata) |
| 1665 | { | 1665 | { |
| 1666 | int ret; | 1666 | int ret; |
| 1667 | 1667 | ||
| 1668 | if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) | 1668 | if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) |
| 1669 | return 0; | 1669 | return; |
| 1670 | 1670 | ||
| 1671 | if (!IS_ENABLED(CONFIG_MDIO_XGENE)) | 1671 | if (!IS_ENABLED(CONFIG_MDIO_XGENE)) |
| 1672 | return 0; | 1672 | return; |
| 1673 | 1673 | ||
| 1674 | ret = xgene_enet_phy_connect(pdata->ndev); | 1674 | ret = xgene_enet_phy_connect(pdata->ndev); |
| 1675 | if (!ret) | 1675 | if (!ret) |
| 1676 | pdata->mdio_driver = true; | 1676 | pdata->mdio_driver = true; |
| 1677 | 1677 | ||
| 1678 | return 0; | 1678 | return; |
| 1679 | } | 1679 | } |
| 1680 | 1680 | ||
| 1681 | static void xgene_enet_gpiod_get(struct xgene_enet_pdata *pdata) | 1681 | static void xgene_enet_gpiod_get(struct xgene_enet_pdata *pdata) |
| @@ -1779,10 +1779,6 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata) | |||
| 1779 | if (ret) | 1779 | if (ret) |
| 1780 | return ret; | 1780 | return ret; |
| 1781 | 1781 | ||
| 1782 | ret = xgene_enet_check_phy_handle(pdata); | ||
| 1783 | if (ret) | ||
| 1784 | return ret; | ||
| 1785 | |||
| 1786 | xgene_enet_gpiod_get(pdata); | 1782 | xgene_enet_gpiod_get(pdata); |
| 1787 | 1783 | ||
| 1788 | pdata->clk = devm_clk_get(&pdev->dev, NULL); | 1784 | pdata->clk = devm_clk_get(&pdev->dev, NULL); |
| @@ -2097,9 +2093,11 @@ static int xgene_enet_probe(struct platform_device *pdev) | |||
| 2097 | goto err; | 2093 | goto err; |
| 2098 | } | 2094 | } |
| 2099 | 2095 | ||
| 2096 | xgene_enet_check_phy_handle(pdata); | ||
| 2097 | |||
| 2100 | ret = xgene_enet_init_hw(pdata); | 2098 | ret = xgene_enet_init_hw(pdata); |
| 2101 | if (ret) | 2099 | if (ret) |
| 2102 | goto err; | 2100 | goto err2; |
| 2103 | 2101 | ||
| 2104 | link_state = pdata->mac_ops->link_state; | 2102 | link_state = pdata->mac_ops->link_state; |
| 2105 | if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) { | 2103 | if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) { |
| @@ -2117,29 +2115,30 @@ static int xgene_enet_probe(struct platform_device *pdev) | |||
| 2117 | spin_lock_init(&pdata->stats_lock); | 2115 | spin_lock_init(&pdata->stats_lock); |
| 2118 | ret = xgene_extd_stats_init(pdata); | 2116 | ret = xgene_extd_stats_init(pdata); |
| 2119 | if (ret) | 2117 | if (ret) |
| 2120 | goto err2; | 2118 | goto err1; |
| 2121 | 2119 | ||
| 2122 | xgene_enet_napi_add(pdata); | 2120 | xgene_enet_napi_add(pdata); |
| 2123 | ret = register_netdev(ndev); | 2121 | ret = register_netdev(ndev); |
| 2124 | if (ret) { | 2122 | if (ret) { |
| 2125 | netdev_err(ndev, "Failed to register netdev\n"); | 2123 | netdev_err(ndev, "Failed to register netdev\n"); |
| 2126 | goto err2; | 2124 | goto err1; |
| 2127 | } | 2125 | } |
| 2128 | 2126 | ||
| 2129 | return 0; | 2127 | return 0; |
| 2130 | 2128 | ||
| 2131 | err2: | 2129 | err1: |
| 2132 | /* | 2130 | /* |
| 2133 | * If necessary, free_netdev() will call netif_napi_del() and undo | 2131 | * If necessary, free_netdev() will call netif_napi_del() and undo |
| 2134 | * the effects of xgene_enet_napi_add()'s calls to netif_napi_add(). | 2132 | * the effects of xgene_enet_napi_add()'s calls to netif_napi_add(). |
| 2135 | */ | 2133 | */ |
| 2136 | 2134 | ||
| 2135 | xgene_enet_delete_desc_rings(pdata); | ||
| 2136 | |||
| 2137 | err2: | ||
| 2137 | if (pdata->mdio_driver) | 2138 | if (pdata->mdio_driver) |
| 2138 | xgene_enet_phy_disconnect(pdata); | 2139 | xgene_enet_phy_disconnect(pdata); |
| 2139 | else if (phy_interface_mode_is_rgmii(pdata->phy_mode)) | 2140 | else if (phy_interface_mode_is_rgmii(pdata->phy_mode)) |
| 2140 | xgene_enet_mdio_remove(pdata); | 2141 | xgene_enet_mdio_remove(pdata); |
| 2141 | err1: | ||
| 2142 | xgene_enet_delete_desc_rings(pdata); | ||
| 2143 | err: | 2142 | err: |
| 2144 | free_netdev(ndev); | 2143 | free_netdev(ndev); |
| 2145 | return ret; | 2144 | return ret; |
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_hw.h b/drivers/net/ethernet/aquantia/atlantic/aq_hw.h index fce0fd3f23ff..bf9b3f020e10 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_hw.h +++ b/drivers/net/ethernet/aquantia/atlantic/aq_hw.h | |||
| @@ -105,8 +105,7 @@ struct aq_hw_ops { | |||
| 105 | 105 | ||
| 106 | int (*hw_set_mac_address)(struct aq_hw_s *self, u8 *mac_addr); | 106 | int (*hw_set_mac_address)(struct aq_hw_s *self, u8 *mac_addr); |
| 107 | 107 | ||
| 108 | int (*hw_get_link_status)(struct aq_hw_s *self, | 108 | int (*hw_get_link_status)(struct aq_hw_s *self); |
| 109 | struct aq_hw_link_status_s *link_status); | ||
| 110 | 109 | ||
| 111 | int (*hw_set_link_speed)(struct aq_hw_s *self, u32 speed); | 110 | int (*hw_set_link_speed)(struct aq_hw_s *self, u32 speed); |
| 112 | 111 | ||
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c index 9ee1c5016784..6ac9e2602d6d 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c | |||
| @@ -103,6 +103,8 @@ int aq_nic_cfg_start(struct aq_nic_s *self) | |||
| 103 | else | 103 | else |
| 104 | cfg->vecs = 1U; | 104 | cfg->vecs = 1U; |
| 105 | 105 | ||
| 106 | cfg->num_rss_queues = min(cfg->vecs, AQ_CFG_NUM_RSS_QUEUES_DEF); | ||
| 107 | |||
| 106 | cfg->irq_type = aq_pci_func_get_irq_type(self->aq_pci_func); | 108 | cfg->irq_type = aq_pci_func_get_irq_type(self->aq_pci_func); |
| 107 | 109 | ||
| 108 | if ((cfg->irq_type == AQ_HW_IRQ_LEGACY) || | 110 | if ((cfg->irq_type == AQ_HW_IRQ_LEGACY) || |
| @@ -123,33 +125,30 @@ static void aq_nic_service_timer_cb(unsigned long param) | |||
| 123 | struct net_device *ndev = aq_nic_get_ndev(self); | 125 | struct net_device *ndev = aq_nic_get_ndev(self); |
| 124 | int err = 0; | 126 | int err = 0; |
| 125 | unsigned int i = 0U; | 127 | unsigned int i = 0U; |
| 126 | struct aq_hw_link_status_s link_status; | ||
| 127 | struct aq_ring_stats_rx_s stats_rx; | 128 | struct aq_ring_stats_rx_s stats_rx; |
| 128 | struct aq_ring_stats_tx_s stats_tx; | 129 | struct aq_ring_stats_tx_s stats_tx; |
| 129 | 130 | ||
| 130 | if (aq_utils_obj_test(&self->header.flags, AQ_NIC_FLAGS_IS_NOT_READY)) | 131 | if (aq_utils_obj_test(&self->header.flags, AQ_NIC_FLAGS_IS_NOT_READY)) |
| 131 | goto err_exit; | 132 | goto err_exit; |
| 132 | 133 | ||
| 133 | err = self->aq_hw_ops.hw_get_link_status(self->aq_hw, &link_status); | 134 | err = self->aq_hw_ops.hw_get_link_status(self->aq_hw); |
| 134 | if (err < 0) | 135 | if (err < 0) |
| 135 | goto err_exit; | 136 | goto err_exit; |
| 136 | 137 | ||
| 137 | self->aq_hw_ops.hw_interrupt_moderation_set(self->aq_hw, | 138 | self->link_status = self->aq_hw->aq_link_status; |
| 138 | self->aq_nic_cfg.is_interrupt_moderation); | ||
| 139 | |||
| 140 | if (memcmp(&link_status, &self->link_status, sizeof(link_status))) { | ||
| 141 | if (link_status.mbps) { | ||
| 142 | aq_utils_obj_set(&self->header.flags, | ||
| 143 | AQ_NIC_FLAG_STARTED); | ||
| 144 | aq_utils_obj_clear(&self->header.flags, | ||
| 145 | AQ_NIC_LINK_DOWN); | ||
| 146 | netif_carrier_on(self->ndev); | ||
| 147 | } else { | ||
| 148 | netif_carrier_off(self->ndev); | ||
| 149 | aq_utils_obj_set(&self->header.flags, AQ_NIC_LINK_DOWN); | ||
| 150 | } | ||
| 151 | 139 | ||
| 152 | self->link_status = link_status; | 140 | self->aq_hw_ops.hw_interrupt_moderation_set(self->aq_hw, |
| 141 | self->aq_nic_cfg.is_interrupt_moderation); | ||
| 142 | |||
| 143 | if (self->link_status.mbps) { | ||
| 144 | aq_utils_obj_set(&self->header.flags, | ||
| 145 | AQ_NIC_FLAG_STARTED); | ||
| 146 | aq_utils_obj_clear(&self->header.flags, | ||
| 147 | AQ_NIC_LINK_DOWN); | ||
| 148 | netif_carrier_on(self->ndev); | ||
| 149 | } else { | ||
| 150 | netif_carrier_off(self->ndev); | ||
| 151 | aq_utils_obj_set(&self->header.flags, AQ_NIC_LINK_DOWN); | ||
| 153 | } | 152 | } |
| 154 | 153 | ||
| 155 | memset(&stats_rx, 0U, sizeof(struct aq_ring_stats_rx_s)); | 154 | memset(&stats_rx, 0U, sizeof(struct aq_ring_stats_rx_s)); |
| @@ -597,14 +596,11 @@ exit: | |||
| 597 | } | 596 | } |
| 598 | 597 | ||
| 599 | int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb) | 598 | int aq_nic_xmit(struct aq_nic_s *self, struct sk_buff *skb) |
| 600 | __releases(&ring->lock) | ||
| 601 | __acquires(&ring->lock) | ||
| 602 | { | 599 | { |
| 603 | struct aq_ring_s *ring = NULL; | 600 | struct aq_ring_s *ring = NULL; |
| 604 | unsigned int frags = 0U; | 601 | unsigned int frags = 0U; |
| 605 | unsigned int vec = skb->queue_mapping % self->aq_nic_cfg.vecs; | 602 | unsigned int vec = skb->queue_mapping % self->aq_nic_cfg.vecs; |
| 606 | unsigned int tc = 0U; | 603 | unsigned int tc = 0U; |
| 607 | unsigned int trys = AQ_CFG_LOCK_TRYS; | ||
| 608 | int err = NETDEV_TX_OK; | 604 | int err = NETDEV_TX_OK; |
| 609 | bool is_nic_in_bad_state; | 605 | bool is_nic_in_bad_state; |
| 610 | 606 | ||
| @@ -628,36 +624,21 @@ __acquires(&ring->lock) | |||
| 628 | goto err_exit; | 624 | goto err_exit; |
| 629 | } | 625 | } |
| 630 | 626 | ||
| 631 | do { | 627 | frags = aq_nic_map_skb(self, skb, ring); |
| 632 | if (spin_trylock(&ring->header.lock)) { | ||
| 633 | frags = aq_nic_map_skb(self, skb, ring); | ||
| 634 | |||
| 635 | if (likely(frags)) { | ||
| 636 | err = self->aq_hw_ops.hw_ring_tx_xmit( | ||
| 637 | self->aq_hw, | ||
| 638 | ring, frags); | ||
| 639 | if (err >= 0) { | ||
| 640 | if (aq_ring_avail_dx(ring) < | ||
| 641 | AQ_CFG_SKB_FRAGS_MAX + 1) | ||
| 642 | aq_nic_ndev_queue_stop( | ||
| 643 | self, | ||
| 644 | ring->idx); | ||
| 645 | |||
| 646 | ++ring->stats.tx.packets; | ||
| 647 | ring->stats.tx.bytes += skb->len; | ||
| 648 | } | ||
| 649 | } else { | ||
| 650 | err = NETDEV_TX_BUSY; | ||
| 651 | } | ||
| 652 | 628 | ||
| 653 | spin_unlock(&ring->header.lock); | 629 | if (likely(frags)) { |
| 654 | break; | 630 | err = self->aq_hw_ops.hw_ring_tx_xmit(self->aq_hw, |
| 655 | } | 631 | ring, |
| 656 | } while (--trys); | 632 | frags); |
| 633 | if (err >= 0) { | ||
| 634 | if (aq_ring_avail_dx(ring) < AQ_CFG_SKB_FRAGS_MAX + 1) | ||
| 635 | aq_nic_ndev_queue_stop(self, ring->idx); | ||
| 657 | 636 | ||
| 658 | if (!trys) { | 637 | ++ring->stats.tx.packets; |
| 638 | ring->stats.tx.bytes += skb->len; | ||
| 639 | } | ||
| 640 | } else { | ||
| 659 | err = NETDEV_TX_BUSY; | 641 | err = NETDEV_TX_BUSY; |
| 660 | goto err_exit; | ||
| 661 | } | 642 | } |
| 662 | 643 | ||
| 663 | err_exit: | 644 | err_exit: |
| @@ -688,11 +669,26 @@ int aq_nic_set_multicast_list(struct aq_nic_s *self, struct net_device *ndev) | |||
| 688 | netdev_for_each_mc_addr(ha, ndev) { | 669 | netdev_for_each_mc_addr(ha, ndev) { |
| 689 | ether_addr_copy(self->mc_list.ar[i++], ha->addr); | 670 | ether_addr_copy(self->mc_list.ar[i++], ha->addr); |
| 690 | ++self->mc_list.count; | 671 | ++self->mc_list.count; |
| 672 | |||
| 673 | if (i >= AQ_CFG_MULTICAST_ADDRESS_MAX) | ||
| 674 | break; | ||
| 691 | } | 675 | } |
| 692 | 676 | ||
| 693 | return self->aq_hw_ops.hw_multicast_list_set(self->aq_hw, | 677 | if (i >= AQ_CFG_MULTICAST_ADDRESS_MAX) { |
| 678 | /* Number of filters is too big: atlantic does not support this. | ||
| 679 | * Force all multi filter to support this. | ||
| 680 | * With this we disable all UC filters and setup "all pass" | ||
| 681 | * multicast mask | ||
| 682 | */ | ||
| 683 | self->packet_filter |= IFF_ALLMULTI; | ||
| 684 | self->aq_hw->aq_nic_cfg->mc_list_count = 0; | ||
| 685 | return self->aq_hw_ops.hw_packet_filter_set(self->aq_hw, | ||
| 686 | self->packet_filter); | ||
| 687 | } else { | ||
| 688 | return self->aq_hw_ops.hw_multicast_list_set(self->aq_hw, | ||
| 694 | self->mc_list.ar, | 689 | self->mc_list.ar, |
| 695 | self->mc_list.count); | 690 | self->mc_list.count); |
| 691 | } | ||
| 696 | } | 692 | } |
| 697 | 693 | ||
| 698 | int aq_nic_set_mtu(struct aq_nic_s *self, int new_mtu) | 694 | int aq_nic_set_mtu(struct aq_nic_s *self, int new_mtu) |
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c index 9a0817938eca..ec5579fb8268 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_ring.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_ring.c | |||
| @@ -101,7 +101,6 @@ int aq_ring_init(struct aq_ring_s *self) | |||
| 101 | self->hw_head = 0; | 101 | self->hw_head = 0; |
| 102 | self->sw_head = 0; | 102 | self->sw_head = 0; |
| 103 | self->sw_tail = 0; | 103 | self->sw_tail = 0; |
| 104 | spin_lock_init(&self->header.lock); | ||
| 105 | return 0; | 104 | return 0; |
| 106 | } | 105 | } |
| 107 | 106 | ||
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_utils.h b/drivers/net/ethernet/aquantia/atlantic/aq_utils.h index f6012b34abe6..e12bcdfb874a 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_utils.h +++ b/drivers/net/ethernet/aquantia/atlantic/aq_utils.h | |||
| @@ -17,7 +17,6 @@ | |||
| 17 | #define AQ_DIMOF(_ARY_) ARRAY_SIZE(_ARY_) | 17 | #define AQ_DIMOF(_ARY_) ARRAY_SIZE(_ARY_) |
| 18 | 18 | ||
| 19 | struct aq_obj_s { | 19 | struct aq_obj_s { |
| 20 | spinlock_t lock; /* spinlock for nic/rings processing */ | ||
| 21 | atomic_t flags; | 20 | atomic_t flags; |
| 22 | }; | 21 | }; |
| 23 | 22 | ||
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c index ad5b4d4dac7f..fee446af748f 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_vec.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_vec.c | |||
| @@ -34,8 +34,6 @@ struct aq_vec_s { | |||
| 34 | #define AQ_VEC_RX_ID 1 | 34 | #define AQ_VEC_RX_ID 1 |
| 35 | 35 | ||
| 36 | static int aq_vec_poll(struct napi_struct *napi, int budget) | 36 | static int aq_vec_poll(struct napi_struct *napi, int budget) |
| 37 | __releases(&self->lock) | ||
| 38 | __acquires(&self->lock) | ||
| 39 | { | 37 | { |
| 40 | struct aq_vec_s *self = container_of(napi, struct aq_vec_s, napi); | 38 | struct aq_vec_s *self = container_of(napi, struct aq_vec_s, napi); |
| 41 | struct aq_ring_s *ring = NULL; | 39 | struct aq_ring_s *ring = NULL; |
| @@ -47,7 +45,7 @@ __acquires(&self->lock) | |||
| 47 | 45 | ||
| 48 | if (!self) { | 46 | if (!self) { |
| 49 | err = -EINVAL; | 47 | err = -EINVAL; |
| 50 | } else if (spin_trylock(&self->header.lock)) { | 48 | } else { |
| 51 | for (i = 0U, ring = self->ring[0]; | 49 | for (i = 0U, ring = self->ring[0]; |
| 52 | self->tx_rings > i; ++i, ring = self->ring[i]) { | 50 | self->tx_rings > i; ++i, ring = self->ring[i]) { |
| 53 | if (self->aq_hw_ops->hw_ring_tx_head_update) { | 51 | if (self->aq_hw_ops->hw_ring_tx_head_update) { |
| @@ -105,11 +103,8 @@ __acquires(&self->lock) | |||
| 105 | self->aq_hw_ops->hw_irq_enable(self->aq_hw, | 103 | self->aq_hw_ops->hw_irq_enable(self->aq_hw, |
| 106 | 1U << self->aq_ring_param.vec_idx); | 104 | 1U << self->aq_ring_param.vec_idx); |
| 107 | } | 105 | } |
| 108 | |||
| 109 | err_exit: | ||
| 110 | spin_unlock(&self->header.lock); | ||
| 111 | } | 106 | } |
| 112 | 107 | err_exit: | |
| 113 | return work_done; | 108 | return work_done; |
| 114 | } | 109 | } |
| 115 | 110 | ||
| @@ -185,8 +180,6 @@ int aq_vec_init(struct aq_vec_s *self, struct aq_hw_ops *aq_hw_ops, | |||
| 185 | self->aq_hw_ops = aq_hw_ops; | 180 | self->aq_hw_ops = aq_hw_ops; |
| 186 | self->aq_hw = aq_hw; | 181 | self->aq_hw = aq_hw; |
| 187 | 182 | ||
| 188 | spin_lock_init(&self->header.lock); | ||
| 189 | |||
| 190 | for (i = 0U, ring = self->ring[0]; | 183 | for (i = 0U, ring = self->ring[0]; |
| 191 | self->tx_rings > i; ++i, ring = self->ring[i]) { | 184 | self->tx_rings > i; ++i, ring = self->ring[i]) { |
| 192 | err = aq_ring_init(&ring[AQ_VEC_TX_ID]); | 185 | err = aq_ring_init(&ring[AQ_VEC_TX_ID]); |
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c index faeb4935ef3e..c5a02df7a48b 100644 --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_a0.c | |||
| @@ -629,6 +629,12 @@ static int hw_atl_a0_hw_ring_rx_receive(struct aq_hw_s *self, | |||
| 629 | buff->is_udp_cso = (is_err & 0x10U) ? 0 : 1; | 629 | buff->is_udp_cso = (is_err & 0x10U) ? 0 : 1; |
| 630 | else if (0x0U == (pkt_type & 0x1CU)) | 630 | else if (0x0U == (pkt_type & 0x1CU)) |
| 631 | buff->is_tcp_cso = (is_err & 0x10U) ? 0 : 1; | 631 | buff->is_tcp_cso = (is_err & 0x10U) ? 0 : 1; |
| 632 | |||
| 633 | /* Checksum offload workaround for small packets */ | ||
| 634 | if (rxd_wb->pkt_len <= 60) { | ||
| 635 | buff->is_ip_cso = 0U; | ||
| 636 | buff->is_cso_err = 0U; | ||
| 637 | } | ||
| 632 | } | 638 | } |
| 633 | 639 | ||
| 634 | is_err &= ~0x18U; | 640 | is_err &= ~0x18U; |
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c index 1bceb7358e5c..21784cc39dab 100644 --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_b0.c | |||
| @@ -645,6 +645,12 @@ static int hw_atl_b0_hw_ring_rx_receive(struct aq_hw_s *self, | |||
| 645 | buff->is_udp_cso = buff->is_cso_err ? 0U : 1U; | 645 | buff->is_udp_cso = buff->is_cso_err ? 0U : 1U; |
| 646 | else if (0x0U == (pkt_type & 0x1CU)) | 646 | else if (0x0U == (pkt_type & 0x1CU)) |
| 647 | buff->is_tcp_cso = buff->is_cso_err ? 0U : 1U; | 647 | buff->is_tcp_cso = buff->is_cso_err ? 0U : 1U; |
| 648 | |||
| 649 | /* Checksum offload workaround for small packets */ | ||
| 650 | if (rxd_wb->pkt_len <= 60) { | ||
| 651 | buff->is_ip_cso = 0U; | ||
| 652 | buff->is_cso_err = 0U; | ||
| 653 | } | ||
| 648 | } | 654 | } |
| 649 | 655 | ||
| 650 | is_err &= ~0x18U; | 656 | is_err &= ~0x18U; |
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c index 8d6d8f5804da..4f5ec9a0fbfb 100644 --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.c | |||
| @@ -141,6 +141,12 @@ static int hw_atl_utils_init_ucp(struct aq_hw_s *self, | |||
| 141 | 141 | ||
| 142 | err = hw_atl_utils_ver_match(aq_hw_caps->fw_ver_expected, | 142 | err = hw_atl_utils_ver_match(aq_hw_caps->fw_ver_expected, |
| 143 | aq_hw_read_reg(self, 0x18U)); | 143 | aq_hw_read_reg(self, 0x18U)); |
| 144 | |||
| 145 | if (err < 0) | ||
| 146 | pr_err("%s: Bad FW version detected: expected=%x, actual=%x\n", | ||
| 147 | AQ_CFG_DRV_NAME, | ||
| 148 | aq_hw_caps->fw_ver_expected, | ||
| 149 | aq_hw_read_reg(self, 0x18U)); | ||
| 144 | return err; | 150 | return err; |
| 145 | } | 151 | } |
| 146 | 152 | ||
| @@ -313,11 +319,11 @@ void hw_atl_utils_mpi_set(struct aq_hw_s *self, | |||
| 313 | err_exit:; | 319 | err_exit:; |
| 314 | } | 320 | } |
| 315 | 321 | ||
| 316 | int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self, | 322 | int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self) |
| 317 | struct aq_hw_link_status_s *link_status) | ||
| 318 | { | 323 | { |
| 319 | u32 cp0x036C = aq_hw_read_reg(self, HW_ATL_MPI_STATE_ADR); | 324 | u32 cp0x036C = aq_hw_read_reg(self, HW_ATL_MPI_STATE_ADR); |
| 320 | u32 link_speed_mask = cp0x036C >> HW_ATL_MPI_SPEED_SHIFT; | 325 | u32 link_speed_mask = cp0x036C >> HW_ATL_MPI_SPEED_SHIFT; |
| 326 | struct aq_hw_link_status_s *link_status = &self->aq_link_status; | ||
| 321 | 327 | ||
| 322 | if (!link_speed_mask) { | 328 | if (!link_speed_mask) { |
| 323 | link_status->mbps = 0U; | 329 | link_status->mbps = 0U; |
diff --git a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h index a66aee51ab5b..e0360a6b2202 100644 --- a/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h +++ b/drivers/net/ethernet/aquantia/atlantic/hw_atl/hw_atl_utils.h | |||
| @@ -180,8 +180,7 @@ void hw_atl_utils_mpi_set(struct aq_hw_s *self, | |||
| 180 | int hw_atl_utils_mpi_set_speed(struct aq_hw_s *self, u32 speed, | 180 | int hw_atl_utils_mpi_set_speed(struct aq_hw_s *self, u32 speed, |
| 181 | enum hal_atl_utils_fw_state_e state); | 181 | enum hal_atl_utils_fw_state_e state); |
| 182 | 182 | ||
| 183 | int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self, | 183 | int hw_atl_utils_mpi_get_link_status(struct aq_hw_s *self); |
| 184 | struct aq_hw_link_status_s *link_status); | ||
| 185 | 184 | ||
| 186 | int hw_atl_utils_get_mac_permanent(struct aq_hw_s *self, | 185 | int hw_atl_utils_get_mac_permanent(struct aq_hw_s *self, |
| 187 | struct aq_hw_caps_s *aq_hw_caps, | 186 | struct aq_hw_caps_s *aq_hw_caps, |
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c index dc3052751bc1..c28fa5a8734c 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.c +++ b/drivers/net/ethernet/broadcom/bcmsysport.c | |||
| @@ -597,7 +597,7 @@ static int bcm_sysport_set_coalesce(struct net_device *dev, | |||
| 597 | 597 | ||
| 598 | static void bcm_sysport_free_cb(struct bcm_sysport_cb *cb) | 598 | static void bcm_sysport_free_cb(struct bcm_sysport_cb *cb) |
| 599 | { | 599 | { |
| 600 | dev_kfree_skb_any(cb->skb); | 600 | dev_consume_skb_any(cb->skb); |
| 601 | cb->skb = NULL; | 601 | cb->skb = NULL; |
| 602 | dma_unmap_addr_set(cb, dma_addr, 0); | 602 | dma_unmap_addr_set(cb, dma_addr, 0); |
| 603 | } | 603 | } |
| @@ -1346,6 +1346,8 @@ static int bcm_sysport_init_tx_ring(struct bcm_sysport_priv *priv, | |||
| 1346 | 1346 | ||
| 1347 | ring->cbs = kcalloc(size, sizeof(struct bcm_sysport_cb), GFP_KERNEL); | 1347 | ring->cbs = kcalloc(size, sizeof(struct bcm_sysport_cb), GFP_KERNEL); |
| 1348 | if (!ring->cbs) { | 1348 | if (!ring->cbs) { |
| 1349 | dma_free_coherent(kdev, sizeof(struct dma_desc), | ||
| 1350 | ring->desc_cpu, ring->desc_dma); | ||
| 1349 | netif_err(priv, hw, priv->netdev, "CB allocation failed\n"); | 1351 | netif_err(priv, hw, priv->netdev, "CB allocation failed\n"); |
| 1350 | return -ENOMEM; | 1352 | return -ENOMEM; |
| 1351 | } | 1353 | } |
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index e7c8539cbddf..f20b3d2a4c23 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | |||
| @@ -4647,7 +4647,6 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp) | |||
| 4647 | pf->port_id = le16_to_cpu(resp->port_id); | 4647 | pf->port_id = le16_to_cpu(resp->port_id); |
| 4648 | bp->dev->dev_port = pf->port_id; | 4648 | bp->dev->dev_port = pf->port_id; |
| 4649 | memcpy(pf->mac_addr, resp->mac_address, ETH_ALEN); | 4649 | memcpy(pf->mac_addr, resp->mac_address, ETH_ALEN); |
| 4650 | memcpy(bp->dev->dev_addr, pf->mac_addr, ETH_ALEN); | ||
| 4651 | pf->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx); | 4650 | pf->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx); |
| 4652 | pf->max_cp_rings = le16_to_cpu(resp->max_cmpl_rings); | 4651 | pf->max_cp_rings = le16_to_cpu(resp->max_cmpl_rings); |
| 4653 | pf->max_tx_rings = le16_to_cpu(resp->max_tx_rings); | 4652 | pf->max_tx_rings = le16_to_cpu(resp->max_tx_rings); |
| @@ -4687,16 +4686,6 @@ static int bnxt_hwrm_func_qcaps(struct bnxt *bp) | |||
| 4687 | vf->max_stat_ctxs = le16_to_cpu(resp->max_stat_ctx); | 4686 | vf->max_stat_ctxs = le16_to_cpu(resp->max_stat_ctx); |
| 4688 | 4687 | ||
| 4689 | memcpy(vf->mac_addr, resp->mac_address, ETH_ALEN); | 4688 | memcpy(vf->mac_addr, resp->mac_address, ETH_ALEN); |
| 4690 | mutex_unlock(&bp->hwrm_cmd_lock); | ||
| 4691 | |||
| 4692 | if (is_valid_ether_addr(vf->mac_addr)) { | ||
| 4693 | /* overwrite netdev dev_adr with admin VF MAC */ | ||
| 4694 | memcpy(bp->dev->dev_addr, vf->mac_addr, ETH_ALEN); | ||
| 4695 | } else { | ||
| 4696 | eth_hw_addr_random(bp->dev); | ||
| 4697 | rc = bnxt_approve_mac(bp, bp->dev->dev_addr); | ||
| 4698 | } | ||
| 4699 | return rc; | ||
| 4700 | #endif | 4689 | #endif |
| 4701 | } | 4690 | } |
| 4702 | 4691 | ||
| @@ -7152,6 +7141,7 @@ int bnxt_setup_mq_tc(struct net_device *dev, u8 tc) | |||
| 7152 | bp->tx_nr_rings = bp->tx_nr_rings_per_tc; | 7141 | bp->tx_nr_rings = bp->tx_nr_rings_per_tc; |
| 7153 | netdev_reset_tc(dev); | 7142 | netdev_reset_tc(dev); |
| 7154 | } | 7143 | } |
| 7144 | bp->tx_nr_rings += bp->tx_nr_rings_xdp; | ||
| 7155 | bp->cp_nr_rings = sh ? max_t(int, bp->tx_nr_rings, bp->rx_nr_rings) : | 7145 | bp->cp_nr_rings = sh ? max_t(int, bp->tx_nr_rings, bp->rx_nr_rings) : |
| 7156 | bp->tx_nr_rings + bp->rx_nr_rings; | 7146 | bp->tx_nr_rings + bp->rx_nr_rings; |
| 7157 | bp->num_stat_ctxs = bp->cp_nr_rings; | 7147 | bp->num_stat_ctxs = bp->cp_nr_rings; |
| @@ -7661,6 +7651,28 @@ void bnxt_restore_pf_fw_resources(struct bnxt *bp) | |||
| 7661 | bnxt_subtract_ulp_resources(bp, BNXT_ROCE_ULP); | 7651 | bnxt_subtract_ulp_resources(bp, BNXT_ROCE_ULP); |
| 7662 | } | 7652 | } |
| 7663 | 7653 | ||
| 7654 | static int bnxt_init_mac_addr(struct bnxt *bp) | ||
| 7655 | { | ||
| 7656 | int rc = 0; | ||
| 7657 | |||
| 7658 | if (BNXT_PF(bp)) { | ||
| 7659 | memcpy(bp->dev->dev_addr, bp->pf.mac_addr, ETH_ALEN); | ||
| 7660 | } else { | ||
| 7661 | #ifdef CONFIG_BNXT_SRIOV | ||
| 7662 | struct bnxt_vf_info *vf = &bp->vf; | ||
| 7663 | |||
| 7664 | if (is_valid_ether_addr(vf->mac_addr)) { | ||
| 7665 | /* overwrite netdev dev_adr with admin VF MAC */ | ||
| 7666 | memcpy(bp->dev->dev_addr, vf->mac_addr, ETH_ALEN); | ||
| 7667 | } else { | ||
| 7668 | eth_hw_addr_random(bp->dev); | ||
| 7669 | rc = bnxt_approve_mac(bp, bp->dev->dev_addr); | ||
| 7670 | } | ||
| 7671 | #endif | ||
| 7672 | } | ||
| 7673 | return rc; | ||
| 7674 | } | ||
| 7675 | |||
| 7664 | static void bnxt_parse_log_pcie_link(struct bnxt *bp) | 7676 | static void bnxt_parse_log_pcie_link(struct bnxt *bp) |
| 7665 | { | 7677 | { |
| 7666 | enum pcie_link_width width = PCIE_LNK_WIDTH_UNKNOWN; | 7678 | enum pcie_link_width width = PCIE_LNK_WIDTH_UNKNOWN; |
| @@ -7789,7 +7801,12 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 7789 | rc = -1; | 7801 | rc = -1; |
| 7790 | goto init_err_pci_clean; | 7802 | goto init_err_pci_clean; |
| 7791 | } | 7803 | } |
| 7792 | 7804 | rc = bnxt_init_mac_addr(bp); | |
| 7805 | if (rc) { | ||
| 7806 | dev_err(&pdev->dev, "Unable to initialize mac address.\n"); | ||
| 7807 | rc = -EADDRNOTAVAIL; | ||
| 7808 | goto init_err_pci_clean; | ||
| 7809 | } | ||
| 7793 | rc = bnxt_hwrm_queue_qportcfg(bp); | 7810 | rc = bnxt_hwrm_queue_qportcfg(bp); |
| 7794 | if (rc) { | 7811 | if (rc) { |
| 7795 | netdev_err(bp->dev, "hwrm query qportcfg failure rc: %x\n", | 7812 | netdev_err(bp->dev, "hwrm query qportcfg failure rc: %x\n", |
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c index 77da75a55c02..997e10e8b863 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | |||
| @@ -84,6 +84,8 @@ static int bnxt_unregister_dev(struct bnxt_en_dev *edev, int ulp_id) | |||
| 84 | 84 | ||
| 85 | max_stat_ctxs = bnxt_get_max_func_stat_ctxs(bp); | 85 | max_stat_ctxs = bnxt_get_max_func_stat_ctxs(bp); |
| 86 | bnxt_set_max_func_stat_ctxs(bp, max_stat_ctxs + 1); | 86 | bnxt_set_max_func_stat_ctxs(bp, max_stat_ctxs + 1); |
| 87 | if (ulp->msix_requested) | ||
| 88 | edev->en_ops->bnxt_free_msix(edev, ulp_id); | ||
| 87 | } | 89 | } |
| 88 | if (ulp->max_async_event_id) | 90 | if (ulp->max_async_event_id) |
| 89 | bnxt_hwrm_func_rgtr_async_events(bp, NULL, 0); | 91 | bnxt_hwrm_func_rgtr_async_events(bp, NULL, 0); |
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index a981c4ee9d72..fea3f9a5fb2d 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c | |||
| @@ -1360,7 +1360,7 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev, | |||
| 1360 | if (skb) { | 1360 | if (skb) { |
| 1361 | pkts_compl++; | 1361 | pkts_compl++; |
| 1362 | bytes_compl += GENET_CB(skb)->bytes_sent; | 1362 | bytes_compl += GENET_CB(skb)->bytes_sent; |
| 1363 | dev_kfree_skb_any(skb); | 1363 | dev_consume_skb_any(skb); |
| 1364 | } | 1364 | } |
| 1365 | 1365 | ||
| 1366 | txbds_processed++; | 1366 | txbds_processed++; |
| @@ -1875,7 +1875,7 @@ static int bcmgenet_alloc_rx_buffers(struct bcmgenet_priv *priv, | |||
| 1875 | cb = ring->cbs + i; | 1875 | cb = ring->cbs + i; |
| 1876 | skb = bcmgenet_rx_refill(priv, cb); | 1876 | skb = bcmgenet_rx_refill(priv, cb); |
| 1877 | if (skb) | 1877 | if (skb) |
| 1878 | dev_kfree_skb_any(skb); | 1878 | dev_consume_skb_any(skb); |
| 1879 | if (!cb->skb) | 1879 | if (!cb->skb) |
| 1880 | return -ENOMEM; | 1880 | return -ENOMEM; |
| 1881 | } | 1881 | } |
| @@ -1894,7 +1894,7 @@ static void bcmgenet_free_rx_buffers(struct bcmgenet_priv *priv) | |||
| 1894 | 1894 | ||
| 1895 | skb = bcmgenet_free_rx_cb(&priv->pdev->dev, cb); | 1895 | skb = bcmgenet_free_rx_cb(&priv->pdev->dev, cb); |
| 1896 | if (skb) | 1896 | if (skb) |
| 1897 | dev_kfree_skb_any(skb); | 1897 | dev_consume_skb_any(skb); |
| 1898 | } | 1898 | } |
| 1899 | } | 1899 | } |
| 1900 | 1900 | ||
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c index 82bf7aac6cdb..0293b41171a5 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | |||
| @@ -369,12 +369,12 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, const void *cmd, | |||
| 369 | list_del(&entry.list); | 369 | list_del(&entry.list); |
| 370 | spin_unlock(&adap->mbox_lock); | 370 | spin_unlock(&adap->mbox_lock); |
| 371 | ret = (v == MBOX_OWNER_FW) ? -EBUSY : -ETIMEDOUT; | 371 | ret = (v == MBOX_OWNER_FW) ? -EBUSY : -ETIMEDOUT; |
| 372 | t4_record_mbox(adap, cmd, MBOX_LEN, access, ret); | 372 | t4_record_mbox(adap, cmd, size, access, ret); |
| 373 | return ret; | 373 | return ret; |
| 374 | } | 374 | } |
| 375 | 375 | ||
| 376 | /* Copy in the new mailbox command and send it on its way ... */ | 376 | /* Copy in the new mailbox command and send it on its way ... */ |
| 377 | t4_record_mbox(adap, cmd, MBOX_LEN, access, 0); | 377 | t4_record_mbox(adap, cmd, size, access, 0); |
| 378 | for (i = 0; i < size; i += 8) | 378 | for (i = 0; i < size; i += 8) |
| 379 | t4_write_reg64(adap, data_reg + i, be64_to_cpu(*p++)); | 379 | t4_write_reg64(adap, data_reg + i, be64_to_cpu(*p++)); |
| 380 | 380 | ||
| @@ -426,7 +426,7 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, const void *cmd, | |||
| 426 | } | 426 | } |
| 427 | 427 | ||
| 428 | ret = (pcie_fw & PCIE_FW_ERR_F) ? -ENXIO : -ETIMEDOUT; | 428 | ret = (pcie_fw & PCIE_FW_ERR_F) ? -ENXIO : -ETIMEDOUT; |
| 429 | t4_record_mbox(adap, cmd, MBOX_LEN, access, ret); | 429 | t4_record_mbox(adap, cmd, size, access, ret); |
| 430 | dev_err(adap->pdev_dev, "command %#x in mailbox %d timed out\n", | 430 | dev_err(adap->pdev_dev, "command %#x in mailbox %d timed out\n", |
| 431 | *(const u8 *)cmd, mbox); | 431 | *(const u8 *)cmd, mbox); |
| 432 | t4_report_fw_error(adap); | 432 | t4_report_fw_error(adap); |
diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c index 34dae51effd4..59da7ac3c108 100644 --- a/drivers/net/ethernet/faraday/ftgmac100.c +++ b/drivers/net/ethernet/faraday/ftgmac100.c | |||
| @@ -1863,7 +1863,6 @@ err_setup_mdio: | |||
| 1863 | err_ioremap: | 1863 | err_ioremap: |
| 1864 | release_resource(priv->res); | 1864 | release_resource(priv->res); |
| 1865 | err_req_mem: | 1865 | err_req_mem: |
| 1866 | netif_napi_del(&priv->napi); | ||
| 1867 | free_netdev(netdev); | 1866 | free_netdev(netdev); |
| 1868 | err_alloc_etherdev: | 1867 | err_alloc_etherdev: |
| 1869 | return err; | 1868 | return err; |
diff --git a/drivers/net/ethernet/freescale/fman/mac.c b/drivers/net/ethernet/freescale/fman/mac.c index 6e67d22fd0d5..1c7da16ad0ff 100644 --- a/drivers/net/ethernet/freescale/fman/mac.c +++ b/drivers/net/ethernet/freescale/fman/mac.c | |||
| @@ -623,6 +623,8 @@ static struct platform_device *dpaa_eth_add_device(int fman_id, | |||
| 623 | goto no_mem; | 623 | goto no_mem; |
| 624 | } | 624 | } |
| 625 | 625 | ||
| 626 | pdev->dev.of_node = node; | ||
| 627 | pdev->dev.parent = priv->dev; | ||
| 626 | set_dma_ops(&pdev->dev, get_dma_ops(priv->dev)); | 628 | set_dma_ops(&pdev->dev, get_dma_ops(priv->dev)); |
| 627 | 629 | ||
| 628 | ret = platform_device_add_data(pdev, &data, sizeof(data)); | 630 | ret = platform_device_add_data(pdev, &data, sizeof(data)); |
diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c index 48d21c1e09f2..4d598ca8503a 100644 --- a/drivers/net/ethernet/marvell/mvpp2.c +++ b/drivers/net/ethernet/marvell/mvpp2.c | |||
| @@ -6504,7 +6504,7 @@ static int mvpp2_port_probe(struct platform_device *pdev, | |||
| 6504 | struct resource *res; | 6504 | struct resource *res; |
| 6505 | const char *dt_mac_addr; | 6505 | const char *dt_mac_addr; |
| 6506 | const char *mac_from; | 6506 | const char *mac_from; |
| 6507 | char hw_mac_addr[ETH_ALEN]; | 6507 | char hw_mac_addr[ETH_ALEN] = {0}; |
| 6508 | u32 id; | 6508 | u32 id; |
| 6509 | int features; | 6509 | int features; |
| 6510 | int phy_mode; | 6510 | int phy_mode; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h index 0039b4725405..2f26fb34d741 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h | |||
| @@ -263,6 +263,7 @@ struct mlx5e_dcbx { | |||
| 263 | 263 | ||
| 264 | /* The only setting that cannot be read from FW */ | 264 | /* The only setting that cannot be read from FW */ |
| 265 | u8 tc_tsa[IEEE_8021QAZ_MAX_TCS]; | 265 | u8 tc_tsa[IEEE_8021QAZ_MAX_TCS]; |
| 266 | u8 cap; | ||
| 266 | }; | 267 | }; |
| 267 | #endif | 268 | #endif |
| 268 | 269 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c index 2eb54d36e16e..c1d384fca4dc 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | |||
| @@ -288,13 +288,8 @@ static int mlx5e_dcbnl_ieee_setpfc(struct net_device *dev, | |||
| 288 | static u8 mlx5e_dcbnl_getdcbx(struct net_device *dev) | 288 | static u8 mlx5e_dcbnl_getdcbx(struct net_device *dev) |
| 289 | { | 289 | { |
| 290 | struct mlx5e_priv *priv = netdev_priv(dev); | 290 | struct mlx5e_priv *priv = netdev_priv(dev); |
| 291 | struct mlx5e_dcbx *dcbx = &priv->dcbx; | ||
| 292 | u8 mode = DCB_CAP_DCBX_VER_IEEE | DCB_CAP_DCBX_VER_CEE; | ||
| 293 | |||
| 294 | if (dcbx->mode == MLX5E_DCBX_PARAM_VER_OPER_HOST) | ||
| 295 | mode |= DCB_CAP_DCBX_HOST; | ||
| 296 | 291 | ||
| 297 | return mode; | 292 | return priv->dcbx.cap; |
| 298 | } | 293 | } |
| 299 | 294 | ||
| 300 | static u8 mlx5e_dcbnl_setdcbx(struct net_device *dev, u8 mode) | 295 | static u8 mlx5e_dcbnl_setdcbx(struct net_device *dev, u8 mode) |
| @@ -312,6 +307,7 @@ static u8 mlx5e_dcbnl_setdcbx(struct net_device *dev, u8 mode) | |||
| 312 | /* set dcbx to fw controlled */ | 307 | /* set dcbx to fw controlled */ |
| 313 | if (!mlx5e_dcbnl_set_dcbx_mode(priv, MLX5E_DCBX_PARAM_VER_OPER_AUTO)) { | 308 | if (!mlx5e_dcbnl_set_dcbx_mode(priv, MLX5E_DCBX_PARAM_VER_OPER_AUTO)) { |
| 314 | dcbx->mode = MLX5E_DCBX_PARAM_VER_OPER_AUTO; | 309 | dcbx->mode = MLX5E_DCBX_PARAM_VER_OPER_AUTO; |
| 310 | dcbx->cap &= ~DCB_CAP_DCBX_HOST; | ||
| 315 | return 0; | 311 | return 0; |
| 316 | } | 312 | } |
| 317 | 313 | ||
| @@ -324,6 +320,8 @@ static u8 mlx5e_dcbnl_setdcbx(struct net_device *dev, u8 mode) | |||
| 324 | if (mlx5e_dcbnl_switch_to_host_mode(netdev_priv(dev))) | 320 | if (mlx5e_dcbnl_switch_to_host_mode(netdev_priv(dev))) |
| 325 | return 1; | 321 | return 1; |
| 326 | 322 | ||
| 323 | dcbx->cap = mode; | ||
| 324 | |||
| 327 | return 0; | 325 | return 0; |
| 328 | } | 326 | } |
| 329 | 327 | ||
| @@ -628,9 +626,9 @@ static u8 mlx5e_dcbnl_getcap(struct net_device *netdev, | |||
| 628 | *cap = false; | 626 | *cap = false; |
| 629 | break; | 627 | break; |
| 630 | case DCB_CAP_ATTR_DCBX: | 628 | case DCB_CAP_ATTR_DCBX: |
| 631 | *cap = (DCB_CAP_DCBX_LLD_MANAGED | | 629 | *cap = priv->dcbx.cap | |
| 632 | DCB_CAP_DCBX_VER_CEE | | 630 | DCB_CAP_DCBX_VER_CEE | |
| 633 | DCB_CAP_DCBX_STATIC); | 631 | DCB_CAP_DCBX_VER_IEEE; |
| 634 | break; | 632 | break; |
| 635 | default: | 633 | default: |
| 636 | *cap = 0; | 634 | *cap = 0; |
| @@ -754,8 +752,16 @@ void mlx5e_dcbnl_initialize(struct mlx5e_priv *priv) | |||
| 754 | { | 752 | { |
| 755 | struct mlx5e_dcbx *dcbx = &priv->dcbx; | 753 | struct mlx5e_dcbx *dcbx = &priv->dcbx; |
| 756 | 754 | ||
| 755 | if (!MLX5_CAP_GEN(priv->mdev, qos)) | ||
| 756 | return; | ||
| 757 | |||
| 757 | if (MLX5_CAP_GEN(priv->mdev, dcbx)) | 758 | if (MLX5_CAP_GEN(priv->mdev, dcbx)) |
| 758 | mlx5e_dcbnl_query_dcbx_mode(priv, &dcbx->mode); | 759 | mlx5e_dcbnl_query_dcbx_mode(priv, &dcbx->mode); |
| 759 | 760 | ||
| 761 | priv->dcbx.cap = DCB_CAP_DCBX_VER_CEE | | ||
| 762 | DCB_CAP_DCBX_VER_IEEE; | ||
| 763 | if (priv->dcbx.mode == MLX5E_DCBX_PARAM_VER_OPER_HOST) | ||
| 764 | priv->dcbx.cap |= DCB_CAP_DCBX_HOST; | ||
| 765 | |||
| 760 | mlx5e_ets_init(priv); | 766 | mlx5e_ets_init(priv); |
| 761 | } | 767 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c index 917fade5f5d5..f5594014715b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c | |||
| @@ -641,8 +641,10 @@ int mlx5e_ethtool_set_channels(struct mlx5e_priv *priv, | |||
| 641 | 641 | ||
| 642 | new_channels.params = priv->channels.params; | 642 | new_channels.params = priv->channels.params; |
| 643 | new_channels.params.num_channels = count; | 643 | new_channels.params.num_channels = count; |
| 644 | mlx5e_build_default_indir_rqt(priv->mdev, new_channels.params.indirection_rqt, | 644 | if (!netif_is_rxfh_configured(priv->netdev)) |
| 645 | MLX5E_INDIR_RQT_SIZE, count); | 645 | mlx5e_build_default_indir_rqt(priv->mdev, |
| 646 | new_channels.params.indirection_rqt, | ||
| 647 | MLX5E_INDIR_RQT_SIZE, count); | ||
| 646 | 648 | ||
| 647 | if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) { | 649 | if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) { |
| 648 | priv->channels.params = new_channels.params; | 650 | priv->channels.params = new_channels.params; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 57f31fa478ce..6ad7f07e7861 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | |||
| @@ -1969,6 +1969,7 @@ static void mlx5e_build_rx_cq_param(struct mlx5e_priv *priv, | |||
| 1969 | } | 1969 | } |
| 1970 | 1970 | ||
| 1971 | mlx5e_build_common_cq_param(priv, param); | 1971 | mlx5e_build_common_cq_param(priv, param); |
| 1972 | param->cq_period_mode = params->rx_cq_period_mode; | ||
| 1972 | } | 1973 | } |
| 1973 | 1974 | ||
| 1974 | static void mlx5e_build_tx_cq_param(struct mlx5e_priv *priv, | 1975 | static void mlx5e_build_tx_cq_param(struct mlx5e_priv *priv, |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c index 325b2c8c1c6d..7344433259fc 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | |||
| @@ -222,13 +222,13 @@ static inline int mlx5e_page_alloc_mapped(struct mlx5e_rq *rq, | |||
| 222 | if (unlikely(!page)) | 222 | if (unlikely(!page)) |
| 223 | return -ENOMEM; | 223 | return -ENOMEM; |
| 224 | 224 | ||
| 225 | dma_info->page = page; | ||
| 226 | dma_info->addr = dma_map_page(rq->pdev, page, 0, | 225 | dma_info->addr = dma_map_page(rq->pdev, page, 0, |
| 227 | RQ_PAGE_SIZE(rq), rq->buff.map_dir); | 226 | RQ_PAGE_SIZE(rq), rq->buff.map_dir); |
| 228 | if (unlikely(dma_mapping_error(rq->pdev, dma_info->addr))) { | 227 | if (unlikely(dma_mapping_error(rq->pdev, dma_info->addr))) { |
| 229 | put_page(page); | 228 | put_page(page); |
| 230 | return -ENOMEM; | 229 | return -ENOMEM; |
| 231 | } | 230 | } |
| 231 | dma_info->page = page; | ||
| 232 | 232 | ||
| 233 | return 0; | 233 | return 0; |
| 234 | } | 234 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index 3c536f560dd2..7f282e8f4e7f 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | |||
| @@ -1443,12 +1443,10 @@ static int mlx5e_route_lookup_ipv6(struct mlx5e_priv *priv, | |||
| 1443 | struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; | 1443 | struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; |
| 1444 | int ret; | 1444 | int ret; |
| 1445 | 1445 | ||
| 1446 | dst = ip6_route_output(dev_net(mirred_dev), NULL, fl6); | 1446 | ret = ipv6_stub->ipv6_dst_lookup(dev_net(mirred_dev), NULL, &dst, |
| 1447 | ret = dst->error; | 1447 | fl6); |
| 1448 | if (ret) { | 1448 | if (ret < 0) |
| 1449 | dst_release(dst); | ||
| 1450 | return ret; | 1449 | return ret; |
| 1451 | } | ||
| 1452 | 1450 | ||
| 1453 | *out_ttl = ip6_dst_hoplimit(dst); | 1451 | *out_ttl = ip6_dst_hoplimit(dst); |
| 1454 | 1452 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c index aaa0f4ebba9a..31353e5c3c78 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | |||
| @@ -128,10 +128,10 @@ static inline int mlx5e_skb_l3_header_offset(struct sk_buff *skb) | |||
| 128 | return mlx5e_skb_l2_header_offset(skb); | 128 | return mlx5e_skb_l2_header_offset(skb); |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | static inline unsigned int mlx5e_calc_min_inline(enum mlx5_inline_modes mode, | 131 | static inline u16 mlx5e_calc_min_inline(enum mlx5_inline_modes mode, |
| 132 | struct sk_buff *skb) | 132 | struct sk_buff *skb) |
| 133 | { | 133 | { |
| 134 | int hlen; | 134 | u16 hlen; |
| 135 | 135 | ||
| 136 | switch (mode) { | 136 | switch (mode) { |
| 137 | case MLX5_INLINE_MODE_NONE: | 137 | case MLX5_INLINE_MODE_NONE: |
| @@ -140,19 +140,22 @@ static inline unsigned int mlx5e_calc_min_inline(enum mlx5_inline_modes mode, | |||
| 140 | hlen = eth_get_headlen(skb->data, skb_headlen(skb)); | 140 | hlen = eth_get_headlen(skb->data, skb_headlen(skb)); |
| 141 | if (hlen == ETH_HLEN && !skb_vlan_tag_present(skb)) | 141 | if (hlen == ETH_HLEN && !skb_vlan_tag_present(skb)) |
| 142 | hlen += VLAN_HLEN; | 142 | hlen += VLAN_HLEN; |
| 143 | return hlen; | 143 | break; |
| 144 | case MLX5_INLINE_MODE_IP: | 144 | case MLX5_INLINE_MODE_IP: |
| 145 | /* When transport header is set to zero, it means no transport | 145 | /* When transport header is set to zero, it means no transport |
| 146 | * header. When transport header is set to 0xff's, it means | 146 | * header. When transport header is set to 0xff's, it means |
| 147 | * transport header wasn't set. | 147 | * transport header wasn't set. |
| 148 | */ | 148 | */ |
| 149 | if (skb_transport_offset(skb)) | 149 | if (skb_transport_offset(skb)) { |
| 150 | return mlx5e_skb_l3_header_offset(skb); | 150 | hlen = mlx5e_skb_l3_header_offset(skb); |
| 151 | break; | ||
| 152 | } | ||
| 151 | /* fall through */ | 153 | /* fall through */ |
| 152 | case MLX5_INLINE_MODE_L2: | 154 | case MLX5_INLINE_MODE_L2: |
| 153 | default: | 155 | default: |
| 154 | return mlx5e_skb_l2_header_offset(skb); | 156 | hlen = mlx5e_skb_l2_header_offset(skb); |
| 155 | } | 157 | } |
| 158 | return min_t(u16, hlen, skb->len); | ||
| 156 | } | 159 | } |
| 157 | 160 | ||
| 158 | static inline void mlx5e_tx_skb_pull_inline(unsigned char **skb_data, | 161 | static inline void mlx5e_tx_skb_pull_inline(unsigned char **skb_data, |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c index 95b64025ce36..5bc0593bd76e 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c | |||
| @@ -815,7 +815,7 @@ void esw_offloads_cleanup(struct mlx5_eswitch *esw, int nvports) | |||
| 815 | struct mlx5_eswitch_rep *rep; | 815 | struct mlx5_eswitch_rep *rep; |
| 816 | int vport; | 816 | int vport; |
| 817 | 817 | ||
| 818 | for (vport = 0; vport < nvports; vport++) { | 818 | for (vport = nvports - 1; vport >= 0; vport--) { |
| 819 | rep = &esw->offloads.vport_reps[vport]; | 819 | rep = &esw->offloads.vport_reps[vport]; |
| 820 | if (!rep->valid) | 820 | if (!rep->valid) |
| 821 | continue; | 821 | continue; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c index c065132b956d..16885827367b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | |||
| @@ -1186,7 +1186,6 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv, | |||
| 1186 | } | 1186 | } |
| 1187 | } | 1187 | } |
| 1188 | 1188 | ||
| 1189 | clear_bit(MLX5_INTERFACE_STATE_DOWN, &dev->intf_state); | ||
| 1190 | set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state); | 1189 | set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state); |
| 1191 | out: | 1190 | out: |
| 1192 | mutex_unlock(&dev->intf_state_mutex); | 1191 | mutex_unlock(&dev->intf_state_mutex); |
| @@ -1261,7 +1260,7 @@ static int mlx5_unload_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv, | |||
| 1261 | mlx5_drain_health_recovery(dev); | 1260 | mlx5_drain_health_recovery(dev); |
| 1262 | 1261 | ||
| 1263 | mutex_lock(&dev->intf_state_mutex); | 1262 | mutex_lock(&dev->intf_state_mutex); |
| 1264 | if (test_bit(MLX5_INTERFACE_STATE_DOWN, &dev->intf_state)) { | 1263 | if (!test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) { |
| 1265 | dev_warn(&dev->pdev->dev, "%s: interface is down, NOP\n", | 1264 | dev_warn(&dev->pdev->dev, "%s: interface is down, NOP\n", |
| 1266 | __func__); | 1265 | __func__); |
| 1267 | if (cleanup) | 1266 | if (cleanup) |
| @@ -1270,7 +1269,6 @@ static int mlx5_unload_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv, | |||
| 1270 | } | 1269 | } |
| 1271 | 1270 | ||
| 1272 | clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state); | 1271 | clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state); |
| 1273 | set_bit(MLX5_INTERFACE_STATE_DOWN, &dev->intf_state); | ||
| 1274 | 1272 | ||
| 1275 | if (mlx5_device_registered(dev)) | 1273 | if (mlx5_device_registered(dev)) |
| 1276 | mlx5_detach_device(dev); | 1274 | mlx5_detach_device(dev); |
| @@ -1565,8 +1563,6 @@ static void shutdown(struct pci_dev *pdev) | |||
| 1565 | int err; | 1563 | int err; |
| 1566 | 1564 | ||
| 1567 | dev_info(&pdev->dev, "Shutdown was called\n"); | 1565 | dev_info(&pdev->dev, "Shutdown was called\n"); |
| 1568 | /* Notify mlx5 clients that the kernel is being shut down */ | ||
| 1569 | set_bit(MLX5_INTERFACE_STATE_SHUTDOWN, &dev->intf_state); | ||
| 1570 | err = mlx5_try_fast_unload(dev); | 1566 | err = mlx5_try_fast_unload(dev); |
| 1571 | if (err) | 1567 | if (err) |
| 1572 | mlx5_unload_one(dev, priv, false); | 1568 | mlx5_unload_one(dev, priv, false); |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/srq.c b/drivers/net/ethernet/mellanox/mlx5/core/srq.c index f774de6f5fcb..520f6382dfde 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/srq.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/srq.c | |||
| @@ -201,13 +201,13 @@ static int destroy_srq_cmd(struct mlx5_core_dev *dev, | |||
| 201 | static int arm_srq_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq, | 201 | static int arm_srq_cmd(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq, |
| 202 | u16 lwm, int is_srq) | 202 | u16 lwm, int is_srq) |
| 203 | { | 203 | { |
| 204 | /* arm_srq structs missing using identical xrc ones */ | 204 | u32 srq_in[MLX5_ST_SZ_DW(arm_rq_in)] = {0}; |
| 205 | u32 srq_in[MLX5_ST_SZ_DW(arm_xrc_srq_in)] = {0}; | 205 | u32 srq_out[MLX5_ST_SZ_DW(arm_rq_out)] = {0}; |
| 206 | u32 srq_out[MLX5_ST_SZ_DW(arm_xrc_srq_out)] = {0}; | ||
| 207 | 206 | ||
| 208 | MLX5_SET(arm_xrc_srq_in, srq_in, opcode, MLX5_CMD_OP_ARM_XRC_SRQ); | 207 | MLX5_SET(arm_rq_in, srq_in, opcode, MLX5_CMD_OP_ARM_RQ); |
| 209 | MLX5_SET(arm_xrc_srq_in, srq_in, xrc_srqn, srq->srqn); | 208 | MLX5_SET(arm_rq_in, srq_in, op_mod, MLX5_ARM_RQ_IN_OP_MOD_SRQ); |
| 210 | MLX5_SET(arm_xrc_srq_in, srq_in, lwm, lwm); | 209 | MLX5_SET(arm_rq_in, srq_in, srq_number, srq->srqn); |
| 210 | MLX5_SET(arm_rq_in, srq_in, lwm, lwm); | ||
| 211 | 211 | ||
| 212 | return mlx5_cmd_exec(dev, srq_in, sizeof(srq_in), | 212 | return mlx5_cmd_exec(dev, srq_in, sizeof(srq_in), |
| 213 | srq_out, sizeof(srq_out)); | 213 | srq_out, sizeof(srq_out)); |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index 60bf8f27cc00..c6a3e61b53bd 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c | |||
| @@ -4139,6 +4139,8 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev, | |||
| 4139 | return -EINVAL; | 4139 | return -EINVAL; |
| 4140 | if (!info->linking) | 4140 | if (!info->linking) |
| 4141 | break; | 4141 | break; |
| 4142 | if (netdev_has_any_upper_dev(upper_dev)) | ||
| 4143 | return -EINVAL; | ||
| 4142 | if (netif_is_lag_master(upper_dev) && | 4144 | if (netif_is_lag_master(upper_dev) && |
| 4143 | !mlxsw_sp_master_lag_check(mlxsw_sp, upper_dev, | 4145 | !mlxsw_sp_master_lag_check(mlxsw_sp, upper_dev, |
| 4144 | info->upper_info)) | 4146 | info->upper_info)) |
| @@ -4258,6 +4260,10 @@ static int mlxsw_sp_netdevice_port_vlan_event(struct net_device *vlan_dev, | |||
| 4258 | upper_dev = info->upper_dev; | 4260 | upper_dev = info->upper_dev; |
| 4259 | if (!netif_is_bridge_master(upper_dev)) | 4261 | if (!netif_is_bridge_master(upper_dev)) |
| 4260 | return -EINVAL; | 4262 | return -EINVAL; |
| 4263 | if (!info->linking) | ||
| 4264 | break; | ||
| 4265 | if (netdev_has_any_upper_dev(upper_dev)) | ||
| 4266 | return -EINVAL; | ||
| 4261 | break; | 4267 | break; |
| 4262 | case NETDEV_CHANGEUPPER: | 4268 | case NETDEV_CHANGEUPPER: |
| 4263 | upper_dev = info->upper_dev; | 4269 | upper_dev = info->upper_dev; |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c index 5eb1606765c5..d39ffbfcc436 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c | |||
| @@ -705,6 +705,7 @@ static int mlxsw_sp_port_attr_mc_router_set(struct mlxsw_sp_port *mlxsw_sp_port, | |||
| 705 | bool is_port_mc_router) | 705 | bool is_port_mc_router) |
| 706 | { | 706 | { |
| 707 | struct mlxsw_sp_bridge_port *bridge_port; | 707 | struct mlxsw_sp_bridge_port *bridge_port; |
| 708 | int err; | ||
| 708 | 709 | ||
| 709 | if (switchdev_trans_ph_prepare(trans)) | 710 | if (switchdev_trans_ph_prepare(trans)) |
| 710 | return 0; | 711 | return 0; |
| @@ -715,11 +716,17 @@ static int mlxsw_sp_port_attr_mc_router_set(struct mlxsw_sp_port *mlxsw_sp_port, | |||
| 715 | return 0; | 716 | return 0; |
| 716 | 717 | ||
| 717 | if (!bridge_port->bridge_device->multicast_enabled) | 718 | if (!bridge_port->bridge_device->multicast_enabled) |
| 718 | return 0; | 719 | goto out; |
| 719 | 720 | ||
| 720 | return mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port, bridge_port, | 721 | err = mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port, bridge_port, |
| 721 | MLXSW_SP_FLOOD_TYPE_MC, | 722 | MLXSW_SP_FLOOD_TYPE_MC, |
| 722 | is_port_mc_router); | 723 | is_port_mc_router); |
| 724 | if (err) | ||
| 725 | return err; | ||
| 726 | |||
| 727 | out: | ||
| 728 | bridge_port->mrouter = is_port_mc_router; | ||
| 729 | return 0; | ||
| 723 | } | 730 | } |
| 724 | 731 | ||
| 725 | static int mlxsw_sp_port_mc_disabled_set(struct mlxsw_sp_port *mlxsw_sp_port, | 732 | static int mlxsw_sp_port_mc_disabled_set(struct mlxsw_sp_port *mlxsw_sp_port, |
diff --git a/drivers/net/ethernet/netronome/nfp/flower/match.c b/drivers/net/ethernet/netronome/nfp/flower/match.c index 0e08404480ef..d25b5038c3a2 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/match.c +++ b/drivers/net/ethernet/netronome/nfp/flower/match.c | |||
| @@ -42,33 +42,29 @@ nfp_flower_compile_meta_tci(struct nfp_flower_meta_two *frame, | |||
| 42 | struct tc_cls_flower_offload *flow, u8 key_type, | 42 | struct tc_cls_flower_offload *flow, u8 key_type, |
| 43 | bool mask_version) | 43 | bool mask_version) |
| 44 | { | 44 | { |
| 45 | struct fl_flow_key *target = mask_version ? flow->mask : flow->key; | ||
| 45 | struct flow_dissector_key_vlan *flow_vlan; | 46 | struct flow_dissector_key_vlan *flow_vlan; |
| 46 | u16 tmp_tci; | 47 | u16 tmp_tci; |
| 47 | 48 | ||
| 49 | memset(frame, 0, sizeof(struct nfp_flower_meta_two)); | ||
| 48 | /* Populate the metadata frame. */ | 50 | /* Populate the metadata frame. */ |
| 49 | frame->nfp_flow_key_layer = key_type; | 51 | frame->nfp_flow_key_layer = key_type; |
| 50 | frame->mask_id = ~0; | 52 | frame->mask_id = ~0; |
| 51 | 53 | ||
| 52 | if (mask_version) { | 54 | if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_VLAN)) { |
| 53 | frame->tci = cpu_to_be16(~0); | 55 | flow_vlan = skb_flow_dissector_target(flow->dissector, |
| 54 | return; | 56 | FLOW_DISSECTOR_KEY_VLAN, |
| 55 | } | 57 | target); |
| 56 | 58 | /* Populate the tci field. */ | |
| 57 | flow_vlan = skb_flow_dissector_target(flow->dissector, | 59 | if (flow_vlan->vlan_id) { |
| 58 | FLOW_DISSECTOR_KEY_VLAN, | 60 | tmp_tci = FIELD_PREP(NFP_FLOWER_MASK_VLAN_PRIO, |
| 59 | flow->key); | 61 | flow_vlan->vlan_priority) | |
| 60 | 62 | FIELD_PREP(NFP_FLOWER_MASK_VLAN_VID, | |
| 61 | /* Populate the tci field. */ | 63 | flow_vlan->vlan_id) | |
| 62 | if (!flow_vlan->vlan_id) { | 64 | NFP_FLOWER_MASK_VLAN_CFI; |
| 63 | tmp_tci = 0; | 65 | frame->tci = cpu_to_be16(tmp_tci); |
| 64 | } else { | 66 | } |
| 65 | tmp_tci = FIELD_PREP(NFP_FLOWER_MASK_VLAN_PRIO, | ||
| 66 | flow_vlan->vlan_priority) | | ||
| 67 | FIELD_PREP(NFP_FLOWER_MASK_VLAN_VID, | ||
| 68 | flow_vlan->vlan_id) | | ||
| 69 | NFP_FLOWER_MASK_VLAN_CFI; | ||
| 70 | } | 67 | } |
| 71 | frame->tci = cpu_to_be16(tmp_tci); | ||
| 72 | } | 68 | } |
| 73 | 69 | ||
| 74 | static void | 70 | static void |
| @@ -99,17 +95,18 @@ nfp_flower_compile_mac(struct nfp_flower_mac_mpls *frame, | |||
| 99 | bool mask_version) | 95 | bool mask_version) |
| 100 | { | 96 | { |
| 101 | struct fl_flow_key *target = mask_version ? flow->mask : flow->key; | 97 | struct fl_flow_key *target = mask_version ? flow->mask : flow->key; |
| 102 | struct flow_dissector_key_eth_addrs *flow_mac; | 98 | struct flow_dissector_key_eth_addrs *addr; |
| 103 | |||
| 104 | flow_mac = skb_flow_dissector_target(flow->dissector, | ||
| 105 | FLOW_DISSECTOR_KEY_ETH_ADDRS, | ||
| 106 | target); | ||
| 107 | 99 | ||
| 108 | memset(frame, 0, sizeof(struct nfp_flower_mac_mpls)); | 100 | memset(frame, 0, sizeof(struct nfp_flower_mac_mpls)); |
| 109 | 101 | ||
| 110 | /* Populate mac frame. */ | 102 | if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_ETH_ADDRS)) { |
| 111 | ether_addr_copy(frame->mac_dst, &flow_mac->dst[0]); | 103 | addr = skb_flow_dissector_target(flow->dissector, |
| 112 | ether_addr_copy(frame->mac_src, &flow_mac->src[0]); | 104 | FLOW_DISSECTOR_KEY_ETH_ADDRS, |
| 105 | target); | ||
| 106 | /* Populate mac frame. */ | ||
| 107 | ether_addr_copy(frame->mac_dst, &addr->dst[0]); | ||
| 108 | ether_addr_copy(frame->mac_src, &addr->src[0]); | ||
| 109 | } | ||
| 113 | 110 | ||
| 114 | if (mask_version) | 111 | if (mask_version) |
| 115 | frame->mpls_lse = cpu_to_be32(~0); | 112 | frame->mpls_lse = cpu_to_be32(~0); |
| @@ -121,14 +118,17 @@ nfp_flower_compile_tport(struct nfp_flower_tp_ports *frame, | |||
| 121 | bool mask_version) | 118 | bool mask_version) |
| 122 | { | 119 | { |
| 123 | struct fl_flow_key *target = mask_version ? flow->mask : flow->key; | 120 | struct fl_flow_key *target = mask_version ? flow->mask : flow->key; |
| 124 | struct flow_dissector_key_ports *flow_tp; | 121 | struct flow_dissector_key_ports *tp; |
| 125 | 122 | ||
| 126 | flow_tp = skb_flow_dissector_target(flow->dissector, | 123 | memset(frame, 0, sizeof(struct nfp_flower_tp_ports)); |
| 127 | FLOW_DISSECTOR_KEY_PORTS, | ||
| 128 | target); | ||
| 129 | 124 | ||
| 130 | frame->port_src = flow_tp->src; | 125 | if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_PORTS)) { |
| 131 | frame->port_dst = flow_tp->dst; | 126 | tp = skb_flow_dissector_target(flow->dissector, |
| 127 | FLOW_DISSECTOR_KEY_PORTS, | ||
| 128 | target); | ||
| 129 | frame->port_src = tp->src; | ||
| 130 | frame->port_dst = tp->dst; | ||
| 131 | } | ||
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | static void | 134 | static void |
| @@ -137,25 +137,27 @@ nfp_flower_compile_ipv4(struct nfp_flower_ipv4 *frame, | |||
| 137 | bool mask_version) | 137 | bool mask_version) |
| 138 | { | 138 | { |
| 139 | struct fl_flow_key *target = mask_version ? flow->mask : flow->key; | 139 | struct fl_flow_key *target = mask_version ? flow->mask : flow->key; |
| 140 | struct flow_dissector_key_ipv4_addrs *flow_ipv4; | 140 | struct flow_dissector_key_ipv4_addrs *addr; |
| 141 | struct flow_dissector_key_basic *flow_basic; | 141 | struct flow_dissector_key_basic *basic; |
| 142 | |||
| 143 | flow_ipv4 = skb_flow_dissector_target(flow->dissector, | ||
| 144 | FLOW_DISSECTOR_KEY_IPV4_ADDRS, | ||
| 145 | target); | ||
| 146 | |||
| 147 | flow_basic = skb_flow_dissector_target(flow->dissector, | ||
| 148 | FLOW_DISSECTOR_KEY_BASIC, | ||
| 149 | target); | ||
| 150 | 142 | ||
| 151 | /* Populate IPv4 frame. */ | ||
| 152 | frame->reserved = 0; | ||
| 153 | frame->ipv4_src = flow_ipv4->src; | ||
| 154 | frame->ipv4_dst = flow_ipv4->dst; | ||
| 155 | frame->proto = flow_basic->ip_proto; | ||
| 156 | /* Wildcard TOS/TTL for now. */ | 143 | /* Wildcard TOS/TTL for now. */ |
| 157 | frame->tos = 0; | 144 | memset(frame, 0, sizeof(struct nfp_flower_ipv4)); |
| 158 | frame->ttl = 0; | 145 | |
| 146 | if (dissector_uses_key(flow->dissector, | ||
| 147 | FLOW_DISSECTOR_KEY_IPV4_ADDRS)) { | ||
| 148 | addr = skb_flow_dissector_target(flow->dissector, | ||
| 149 | FLOW_DISSECTOR_KEY_IPV4_ADDRS, | ||
| 150 | target); | ||
| 151 | frame->ipv4_src = addr->src; | ||
| 152 | frame->ipv4_dst = addr->dst; | ||
| 153 | } | ||
| 154 | |||
| 155 | if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_BASIC)) { | ||
| 156 | basic = skb_flow_dissector_target(flow->dissector, | ||
| 157 | FLOW_DISSECTOR_KEY_BASIC, | ||
| 158 | target); | ||
| 159 | frame->proto = basic->ip_proto; | ||
| 160 | } | ||
| 159 | } | 161 | } |
| 160 | 162 | ||
| 161 | static void | 163 | static void |
| @@ -164,26 +166,27 @@ nfp_flower_compile_ipv6(struct nfp_flower_ipv6 *frame, | |||
| 164 | bool mask_version) | 166 | bool mask_version) |
| 165 | { | 167 | { |
| 166 | struct fl_flow_key *target = mask_version ? flow->mask : flow->key; | 168 | struct fl_flow_key *target = mask_version ? flow->mask : flow->key; |
| 167 | struct flow_dissector_key_ipv6_addrs *flow_ipv6; | 169 | struct flow_dissector_key_ipv6_addrs *addr; |
| 168 | struct flow_dissector_key_basic *flow_basic; | 170 | struct flow_dissector_key_basic *basic; |
| 169 | |||
| 170 | flow_ipv6 = skb_flow_dissector_target(flow->dissector, | ||
| 171 | FLOW_DISSECTOR_KEY_IPV6_ADDRS, | ||
| 172 | target); | ||
| 173 | 171 | ||
| 174 | flow_basic = skb_flow_dissector_target(flow->dissector, | ||
| 175 | FLOW_DISSECTOR_KEY_BASIC, | ||
| 176 | target); | ||
| 177 | |||
| 178 | /* Populate IPv6 frame. */ | ||
| 179 | frame->reserved = 0; | ||
| 180 | frame->ipv6_src = flow_ipv6->src; | ||
| 181 | frame->ipv6_dst = flow_ipv6->dst; | ||
| 182 | frame->proto = flow_basic->ip_proto; | ||
| 183 | /* Wildcard LABEL/TOS/TTL for now. */ | 172 | /* Wildcard LABEL/TOS/TTL for now. */ |
| 184 | frame->ipv6_flow_label_exthdr = 0; | 173 | memset(frame, 0, sizeof(struct nfp_flower_ipv6)); |
| 185 | frame->tos = 0; | 174 | |
| 186 | frame->ttl = 0; | 175 | if (dissector_uses_key(flow->dissector, |
| 176 | FLOW_DISSECTOR_KEY_IPV6_ADDRS)) { | ||
| 177 | addr = skb_flow_dissector_target(flow->dissector, | ||
| 178 | FLOW_DISSECTOR_KEY_IPV6_ADDRS, | ||
| 179 | target); | ||
| 180 | frame->ipv6_src = addr->src; | ||
| 181 | frame->ipv6_dst = addr->dst; | ||
| 182 | } | ||
| 183 | |||
| 184 | if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_BASIC)) { | ||
| 185 | basic = skb_flow_dissector_target(flow->dissector, | ||
| 186 | FLOW_DISSECTOR_KEY_BASIC, | ||
| 187 | target); | ||
| 188 | frame->proto = basic->ip_proto; | ||
| 189 | } | ||
| 187 | } | 190 | } |
| 188 | 191 | ||
| 189 | int nfp_flower_compile_flow_match(struct tc_cls_flower_offload *flow, | 192 | int nfp_flower_compile_flow_match(struct tc_cls_flower_offload *flow, |
diff --git a/drivers/net/ethernet/netronome/nfp/flower/offload.c b/drivers/net/ethernet/netronome/nfp/flower/offload.c index 4ad10bd5e139..74a96d6bb05c 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/offload.c +++ b/drivers/net/ethernet/netronome/nfp/flower/offload.c | |||
| @@ -105,43 +105,62 @@ static int | |||
| 105 | nfp_flower_calculate_key_layers(struct nfp_fl_key_ls *ret_key_ls, | 105 | nfp_flower_calculate_key_layers(struct nfp_fl_key_ls *ret_key_ls, |
| 106 | struct tc_cls_flower_offload *flow) | 106 | struct tc_cls_flower_offload *flow) |
| 107 | { | 107 | { |
| 108 | struct flow_dissector_key_control *mask_enc_ctl; | 108 | struct flow_dissector_key_basic *mask_basic = NULL; |
| 109 | struct flow_dissector_key_basic *mask_basic; | 109 | struct flow_dissector_key_basic *key_basic = NULL; |
| 110 | struct flow_dissector_key_basic *key_basic; | 110 | struct flow_dissector_key_ip *mask_ip = NULL; |
| 111 | u32 key_layer_two; | 111 | u32 key_layer_two; |
| 112 | u8 key_layer; | 112 | u8 key_layer; |
| 113 | int key_size; | 113 | int key_size; |
| 114 | 114 | ||
| 115 | mask_enc_ctl = skb_flow_dissector_target(flow->dissector, | 115 | if (dissector_uses_key(flow->dissector, |
| 116 | FLOW_DISSECTOR_KEY_ENC_CONTROL, | 116 | FLOW_DISSECTOR_KEY_ENC_CONTROL)) { |
| 117 | flow->mask); | 117 | struct flow_dissector_key_control *mask_enc_ctl = |
| 118 | skb_flow_dissector_target(flow->dissector, | ||
| 119 | FLOW_DISSECTOR_KEY_ENC_CONTROL, | ||
| 120 | flow->mask); | ||
| 121 | /* We are expecting a tunnel. For now we ignore offloading. */ | ||
| 122 | if (mask_enc_ctl->addr_type) | ||
| 123 | return -EOPNOTSUPP; | ||
| 124 | } | ||
| 118 | 125 | ||
| 119 | mask_basic = skb_flow_dissector_target(flow->dissector, | 126 | if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_BASIC)) { |
| 120 | FLOW_DISSECTOR_KEY_BASIC, | 127 | mask_basic = skb_flow_dissector_target(flow->dissector, |
| 121 | flow->mask); | 128 | FLOW_DISSECTOR_KEY_BASIC, |
| 129 | flow->mask); | ||
| 130 | |||
| 131 | key_basic = skb_flow_dissector_target(flow->dissector, | ||
| 132 | FLOW_DISSECTOR_KEY_BASIC, | ||
| 133 | flow->key); | ||
| 134 | } | ||
| 135 | |||
| 136 | if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_IP)) | ||
| 137 | mask_ip = skb_flow_dissector_target(flow->dissector, | ||
| 138 | FLOW_DISSECTOR_KEY_IP, | ||
| 139 | flow->mask); | ||
| 122 | 140 | ||
| 123 | key_basic = skb_flow_dissector_target(flow->dissector, | ||
| 124 | FLOW_DISSECTOR_KEY_BASIC, | ||
| 125 | flow->key); | ||
| 126 | key_layer_two = 0; | 141 | key_layer_two = 0; |
| 127 | key_layer = NFP_FLOWER_LAYER_PORT | NFP_FLOWER_LAYER_MAC; | 142 | key_layer = NFP_FLOWER_LAYER_PORT | NFP_FLOWER_LAYER_MAC; |
| 128 | key_size = sizeof(struct nfp_flower_meta_one) + | 143 | key_size = sizeof(struct nfp_flower_meta_one) + |
| 129 | sizeof(struct nfp_flower_in_port) + | 144 | sizeof(struct nfp_flower_in_port) + |
| 130 | sizeof(struct nfp_flower_mac_mpls); | 145 | sizeof(struct nfp_flower_mac_mpls); |
| 131 | 146 | ||
| 132 | /* We are expecting a tunnel. For now we ignore offloading. */ | 147 | if (mask_basic && mask_basic->n_proto) { |
| 133 | if (mask_enc_ctl->addr_type) | ||
| 134 | return -EOPNOTSUPP; | ||
| 135 | |||
| 136 | if (mask_basic->n_proto) { | ||
| 137 | /* Ethernet type is present in the key. */ | 148 | /* Ethernet type is present in the key. */ |
| 138 | switch (key_basic->n_proto) { | 149 | switch (key_basic->n_proto) { |
| 139 | case cpu_to_be16(ETH_P_IP): | 150 | case cpu_to_be16(ETH_P_IP): |
| 151 | if (mask_ip && mask_ip->tos) | ||
| 152 | return -EOPNOTSUPP; | ||
| 153 | if (mask_ip && mask_ip->ttl) | ||
| 154 | return -EOPNOTSUPP; | ||
| 140 | key_layer |= NFP_FLOWER_LAYER_IPV4; | 155 | key_layer |= NFP_FLOWER_LAYER_IPV4; |
| 141 | key_size += sizeof(struct nfp_flower_ipv4); | 156 | key_size += sizeof(struct nfp_flower_ipv4); |
| 142 | break; | 157 | break; |
| 143 | 158 | ||
| 144 | case cpu_to_be16(ETH_P_IPV6): | 159 | case cpu_to_be16(ETH_P_IPV6): |
| 160 | if (mask_ip && mask_ip->tos) | ||
| 161 | return -EOPNOTSUPP; | ||
| 162 | if (mask_ip && mask_ip->ttl) | ||
| 163 | return -EOPNOTSUPP; | ||
| 145 | key_layer |= NFP_FLOWER_LAYER_IPV6; | 164 | key_layer |= NFP_FLOWER_LAYER_IPV6; |
| 146 | key_size += sizeof(struct nfp_flower_ipv6); | 165 | key_size += sizeof(struct nfp_flower_ipv6); |
| 147 | break; | 166 | break; |
| @@ -152,6 +171,11 @@ nfp_flower_calculate_key_layers(struct nfp_fl_key_ls *ret_key_ls, | |||
| 152 | case cpu_to_be16(ETH_P_ARP): | 171 | case cpu_to_be16(ETH_P_ARP): |
| 153 | return -EOPNOTSUPP; | 172 | return -EOPNOTSUPP; |
| 154 | 173 | ||
| 174 | /* Currently we do not offload MPLS. */ | ||
| 175 | case cpu_to_be16(ETH_P_MPLS_UC): | ||
| 176 | case cpu_to_be16(ETH_P_MPLS_MC): | ||
| 177 | return -EOPNOTSUPP; | ||
| 178 | |||
| 155 | /* Will be included in layer 2. */ | 179 | /* Will be included in layer 2. */ |
| 156 | case cpu_to_be16(ETH_P_8021Q): | 180 | case cpu_to_be16(ETH_P_8021Q): |
| 157 | break; | 181 | break; |
| @@ -166,7 +190,7 @@ nfp_flower_calculate_key_layers(struct nfp_fl_key_ls *ret_key_ls, | |||
| 166 | } | 190 | } |
| 167 | } | 191 | } |
| 168 | 192 | ||
| 169 | if (mask_basic->ip_proto) { | 193 | if (mask_basic && mask_basic->ip_proto) { |
| 170 | /* Ethernet type is present in the key. */ | 194 | /* Ethernet type is present in the key. */ |
| 171 | switch (key_basic->ip_proto) { | 195 | switch (key_basic->ip_proto) { |
| 172 | case IPPROTO_TCP: | 196 | case IPPROTO_TCP: |
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.c b/drivers/net/ethernet/netronome/nfp/nfp_main.c index d67969d3e484..3f199db2002e 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_main.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_main.c | |||
| @@ -98,21 +98,20 @@ static int nfp_pcie_sriov_enable(struct pci_dev *pdev, int num_vfs) | |||
| 98 | struct nfp_pf *pf = pci_get_drvdata(pdev); | 98 | struct nfp_pf *pf = pci_get_drvdata(pdev); |
| 99 | int err; | 99 | int err; |
| 100 | 100 | ||
| 101 | mutex_lock(&pf->lock); | ||
| 102 | |||
| 103 | if (num_vfs > pf->limit_vfs) { | 101 | if (num_vfs > pf->limit_vfs) { |
| 104 | nfp_info(pf->cpp, "Firmware limits number of VFs to %u\n", | 102 | nfp_info(pf->cpp, "Firmware limits number of VFs to %u\n", |
| 105 | pf->limit_vfs); | 103 | pf->limit_vfs); |
| 106 | err = -EINVAL; | 104 | return -EINVAL; |
| 107 | goto err_unlock; | ||
| 108 | } | 105 | } |
| 109 | 106 | ||
| 110 | err = pci_enable_sriov(pdev, num_vfs); | 107 | err = pci_enable_sriov(pdev, num_vfs); |
| 111 | if (err) { | 108 | if (err) { |
| 112 | dev_warn(&pdev->dev, "Failed to enable PCI SR-IOV: %d\n", err); | 109 | dev_warn(&pdev->dev, "Failed to enable PCI SR-IOV: %d\n", err); |
| 113 | goto err_unlock; | 110 | return err; |
| 114 | } | 111 | } |
| 115 | 112 | ||
| 113 | mutex_lock(&pf->lock); | ||
| 114 | |||
| 116 | err = nfp_app_sriov_enable(pf->app, num_vfs); | 115 | err = nfp_app_sriov_enable(pf->app, num_vfs); |
| 117 | if (err) { | 116 | if (err) { |
| 118 | dev_warn(&pdev->dev, | 117 | dev_warn(&pdev->dev, |
| @@ -129,9 +128,8 @@ static int nfp_pcie_sriov_enable(struct pci_dev *pdev, int num_vfs) | |||
| 129 | return num_vfs; | 128 | return num_vfs; |
| 130 | 129 | ||
| 131 | err_sriov_disable: | 130 | err_sriov_disable: |
| 132 | pci_disable_sriov(pdev); | ||
| 133 | err_unlock: | ||
| 134 | mutex_unlock(&pf->lock); | 131 | mutex_unlock(&pf->lock); |
| 132 | pci_disable_sriov(pdev); | ||
| 135 | return err; | 133 | return err; |
| 136 | #endif | 134 | #endif |
| 137 | return 0; | 135 | return 0; |
| @@ -158,10 +156,10 @@ static int nfp_pcie_sriov_disable(struct pci_dev *pdev) | |||
| 158 | 156 | ||
| 159 | pf->num_vfs = 0; | 157 | pf->num_vfs = 0; |
| 160 | 158 | ||
| 159 | mutex_unlock(&pf->lock); | ||
| 160 | |||
| 161 | pci_disable_sriov(pdev); | 161 | pci_disable_sriov(pdev); |
| 162 | dev_dbg(&pdev->dev, "Removed VFs.\n"); | 162 | dev_dbg(&pdev->dev, "Removed VFs.\n"); |
| 163 | |||
| 164 | mutex_unlock(&pf->lock); | ||
| 165 | #endif | 163 | #endif |
| 166 | return 0; | 164 | return 0; |
| 167 | } | 165 | } |
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c index 9f77ce038a4a..66a09e490cf5 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c | |||
| @@ -895,6 +895,8 @@ static int nfp_net_tx(struct sk_buff *skb, struct net_device *netdev) | |||
| 895 | 895 | ||
| 896 | netdev_tx_sent_queue(nd_q, txbuf->real_len); | 896 | netdev_tx_sent_queue(nd_q, txbuf->real_len); |
| 897 | 897 | ||
| 898 | skb_tx_timestamp(skb); | ||
| 899 | |||
| 898 | tx_ring->wr_p += nr_frags + 1; | 900 | tx_ring->wr_p += nr_frags + 1; |
| 899 | if (nfp_net_tx_ring_should_stop(tx_ring)) | 901 | if (nfp_net_tx_ring_should_stop(tx_ring)) |
| 900 | nfp_net_tx_ring_stop(nd_q, tx_ring); | 902 | nfp_net_tx_ring_stop(nd_q, tx_ring); |
| @@ -903,8 +905,6 @@ static int nfp_net_tx(struct sk_buff *skb, struct net_device *netdev) | |||
| 903 | if (!skb->xmit_more || netif_xmit_stopped(nd_q)) | 905 | if (!skb->xmit_more || netif_xmit_stopped(nd_q)) |
| 904 | nfp_net_tx_xmit_more_flush(tx_ring); | 906 | nfp_net_tx_xmit_more_flush(tx_ring); |
| 905 | 907 | ||
| 906 | skb_tx_timestamp(skb); | ||
| 907 | |||
| 908 | return NETDEV_TX_OK; | 908 | return NETDEV_TX_OK; |
| 909 | 909 | ||
| 910 | err_unmap: | 910 | err_unmap: |
| @@ -1751,6 +1751,10 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget) | |||
| 1751 | continue; | 1751 | continue; |
| 1752 | } | 1752 | } |
| 1753 | 1753 | ||
| 1754 | nfp_net_dma_unmap_rx(dp, rxbuf->dma_addr); | ||
| 1755 | |||
| 1756 | nfp_net_rx_give_one(dp, rx_ring, new_frag, new_dma_addr); | ||
| 1757 | |||
| 1754 | if (likely(!meta.portid)) { | 1758 | if (likely(!meta.portid)) { |
| 1755 | netdev = dp->netdev; | 1759 | netdev = dp->netdev; |
| 1756 | } else { | 1760 | } else { |
| @@ -1759,16 +1763,12 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget) | |||
| 1759 | nn = netdev_priv(dp->netdev); | 1763 | nn = netdev_priv(dp->netdev); |
| 1760 | netdev = nfp_app_repr_get(nn->app, meta.portid); | 1764 | netdev = nfp_app_repr_get(nn->app, meta.portid); |
| 1761 | if (unlikely(!netdev)) { | 1765 | if (unlikely(!netdev)) { |
| 1762 | nfp_net_rx_drop(dp, r_vec, rx_ring, rxbuf, skb); | 1766 | nfp_net_rx_drop(dp, r_vec, rx_ring, NULL, skb); |
| 1763 | continue; | 1767 | continue; |
| 1764 | } | 1768 | } |
| 1765 | nfp_repr_inc_rx_stats(netdev, pkt_len); | 1769 | nfp_repr_inc_rx_stats(netdev, pkt_len); |
| 1766 | } | 1770 | } |
| 1767 | 1771 | ||
| 1768 | nfp_net_dma_unmap_rx(dp, rxbuf->dma_addr); | ||
| 1769 | |||
| 1770 | nfp_net_rx_give_one(dp, rx_ring, new_frag, new_dma_addr); | ||
| 1771 | |||
| 1772 | skb_reserve(skb, pkt_off); | 1772 | skb_reserve(skb, pkt_off); |
| 1773 | skb_put(skb, pkt_len); | 1773 | skb_put(skb, pkt_len); |
| 1774 | 1774 | ||
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c index 5797dbf2b507..34b985384d26 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c | |||
| @@ -456,13 +456,9 @@ static int nfp_net_pf_app_start(struct nfp_pf *pf) | |||
| 456 | { | 456 | { |
| 457 | int err; | 457 | int err; |
| 458 | 458 | ||
| 459 | err = nfp_net_pf_app_start_ctrl(pf); | ||
| 460 | if (err) | ||
| 461 | return err; | ||
| 462 | |||
| 463 | err = nfp_app_start(pf->app, pf->ctrl_vnic); | 459 | err = nfp_app_start(pf->app, pf->ctrl_vnic); |
| 464 | if (err) | 460 | if (err) |
| 465 | goto err_ctrl_stop; | 461 | return err; |
| 466 | 462 | ||
| 467 | if (pf->num_vfs) { | 463 | if (pf->num_vfs) { |
| 468 | err = nfp_app_sriov_enable(pf->app, pf->num_vfs); | 464 | err = nfp_app_sriov_enable(pf->app, pf->num_vfs); |
| @@ -474,8 +470,6 @@ static int nfp_net_pf_app_start(struct nfp_pf *pf) | |||
| 474 | 470 | ||
| 475 | err_app_stop: | 471 | err_app_stop: |
| 476 | nfp_app_stop(pf->app); | 472 | nfp_app_stop(pf->app); |
| 477 | err_ctrl_stop: | ||
| 478 | nfp_net_pf_app_stop_ctrl(pf); | ||
| 479 | return err; | 473 | return err; |
| 480 | } | 474 | } |
| 481 | 475 | ||
| @@ -484,7 +478,6 @@ static void nfp_net_pf_app_stop(struct nfp_pf *pf) | |||
| 484 | if (pf->num_vfs) | 478 | if (pf->num_vfs) |
| 485 | nfp_app_sriov_disable(pf->app); | 479 | nfp_app_sriov_disable(pf->app); |
| 486 | nfp_app_stop(pf->app); | 480 | nfp_app_stop(pf->app); |
| 487 | nfp_net_pf_app_stop_ctrl(pf); | ||
| 488 | } | 481 | } |
| 489 | 482 | ||
| 490 | static void nfp_net_pci_unmap_mem(struct nfp_pf *pf) | 483 | static void nfp_net_pci_unmap_mem(struct nfp_pf *pf) |
| @@ -559,7 +552,7 @@ err_unmap_ctrl: | |||
| 559 | 552 | ||
| 560 | static void nfp_net_pci_remove_finish(struct nfp_pf *pf) | 553 | static void nfp_net_pci_remove_finish(struct nfp_pf *pf) |
| 561 | { | 554 | { |
| 562 | nfp_net_pf_app_stop(pf); | 555 | nfp_net_pf_app_stop_ctrl(pf); |
| 563 | /* stop app first, to avoid double free of ctrl vNIC's ddir */ | 556 | /* stop app first, to avoid double free of ctrl vNIC's ddir */ |
| 564 | nfp_net_debugfs_dir_clean(&pf->ddir); | 557 | nfp_net_debugfs_dir_clean(&pf->ddir); |
| 565 | 558 | ||
| @@ -690,6 +683,7 @@ int nfp_net_pci_probe(struct nfp_pf *pf) | |||
| 690 | { | 683 | { |
| 691 | struct nfp_net_fw_version fw_ver; | 684 | struct nfp_net_fw_version fw_ver; |
| 692 | u8 __iomem *ctrl_bar, *qc_bar; | 685 | u8 __iomem *ctrl_bar, *qc_bar; |
| 686 | struct nfp_net *nn; | ||
| 693 | int stride; | 687 | int stride; |
| 694 | int err; | 688 | int err; |
| 695 | 689 | ||
| @@ -766,7 +760,7 @@ int nfp_net_pci_probe(struct nfp_pf *pf) | |||
| 766 | if (err) | 760 | if (err) |
| 767 | goto err_free_vnics; | 761 | goto err_free_vnics; |
| 768 | 762 | ||
| 769 | err = nfp_net_pf_app_start(pf); | 763 | err = nfp_net_pf_app_start_ctrl(pf); |
| 770 | if (err) | 764 | if (err) |
| 771 | goto err_free_irqs; | 765 | goto err_free_irqs; |
| 772 | 766 | ||
| @@ -774,12 +768,20 @@ int nfp_net_pci_probe(struct nfp_pf *pf) | |||
| 774 | if (err) | 768 | if (err) |
| 775 | goto err_stop_app; | 769 | goto err_stop_app; |
| 776 | 770 | ||
| 771 | err = nfp_net_pf_app_start(pf); | ||
| 772 | if (err) | ||
| 773 | goto err_clean_vnics; | ||
| 774 | |||
| 777 | mutex_unlock(&pf->lock); | 775 | mutex_unlock(&pf->lock); |
| 778 | 776 | ||
| 779 | return 0; | 777 | return 0; |
| 780 | 778 | ||
| 779 | err_clean_vnics: | ||
| 780 | list_for_each_entry(nn, &pf->vnics, vnic_list) | ||
| 781 | if (nfp_net_is_data_vnic(nn)) | ||
| 782 | nfp_net_pf_clean_vnic(pf, nn); | ||
| 781 | err_stop_app: | 783 | err_stop_app: |
| 782 | nfp_net_pf_app_stop(pf); | 784 | nfp_net_pf_app_stop_ctrl(pf); |
| 783 | err_free_irqs: | 785 | err_free_irqs: |
| 784 | nfp_net_pf_free_irqs(pf); | 786 | nfp_net_pf_free_irqs(pf); |
| 785 | err_free_vnics: | 787 | err_free_vnics: |
| @@ -803,6 +805,8 @@ void nfp_net_pci_remove(struct nfp_pf *pf) | |||
| 803 | if (list_empty(&pf->vnics)) | 805 | if (list_empty(&pf->vnics)) |
| 804 | goto out; | 806 | goto out; |
| 805 | 807 | ||
| 808 | nfp_net_pf_app_stop(pf); | ||
| 809 | |||
| 806 | list_for_each_entry(nn, &pf->vnics, vnic_list) | 810 | list_for_each_entry(nn, &pf->vnics, vnic_list) |
| 807 | if (nfp_net_is_data_vnic(nn)) | 811 | if (nfp_net_is_data_vnic(nn)) |
| 808 | nfp_net_pf_clean_vnic(pf, nn); | 812 | nfp_net_pf_clean_vnic(pf, nn); |
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c b/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c index 28ea0af89aef..e3223f2fe2ff 100644 --- a/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c +++ b/drivers/net/ethernet/qlogic/qlge/qlge_dbg.c | |||
| @@ -724,7 +724,7 @@ static void ql_build_coredump_seg_header( | |||
| 724 | seg_hdr->cookie = MPI_COREDUMP_COOKIE; | 724 | seg_hdr->cookie = MPI_COREDUMP_COOKIE; |
| 725 | seg_hdr->segNum = seg_number; | 725 | seg_hdr->segNum = seg_number; |
| 726 | seg_hdr->segSize = seg_size; | 726 | seg_hdr->segSize = seg_size; |
| 727 | memcpy(seg_hdr->description, desc, (sizeof(seg_hdr->description)) - 1); | 727 | strncpy(seg_hdr->description, desc, (sizeof(seg_hdr->description)) - 1); |
| 728 | } | 728 | } |
| 729 | 729 | ||
| 730 | /* | 730 | /* |
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index bd07a15d3b7c..e03fcf914690 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
| @@ -6863,8 +6863,7 @@ static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start, | |||
| 6863 | rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb, | 6863 | rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb, |
| 6864 | tp->TxDescArray + entry); | 6864 | tp->TxDescArray + entry); |
| 6865 | if (skb) { | 6865 | if (skb) { |
| 6866 | tp->dev->stats.tx_dropped++; | 6866 | dev_consume_skb_any(skb); |
| 6867 | dev_kfree_skb_any(skb); | ||
| 6868 | tx_skb->skb = NULL; | 6867 | tx_skb->skb = NULL; |
| 6869 | } | 6868 | } |
| 6870 | } | 6869 | } |
| @@ -7319,7 +7318,7 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp) | |||
| 7319 | tp->tx_stats.packets++; | 7318 | tp->tx_stats.packets++; |
| 7320 | tp->tx_stats.bytes += tx_skb->skb->len; | 7319 | tp->tx_stats.bytes += tx_skb->skb->len; |
| 7321 | u64_stats_update_end(&tp->tx_stats.syncp); | 7320 | u64_stats_update_end(&tp->tx_stats.syncp); |
| 7322 | dev_kfree_skb_any(tx_skb->skb); | 7321 | dev_consume_skb_any(tx_skb->skb); |
| 7323 | tx_skb->skb = NULL; | 7322 | tx_skb->skb = NULL; |
| 7324 | } | 7323 | } |
| 7325 | dirty_tx++; | 7324 | dirty_tx++; |
diff --git a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c index 73427e29df2a..fbd00cb0cb7d 100644 --- a/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c +++ b/drivers/net/ethernet/samsung/sxgbe/sxgbe_platform.c | |||
| @@ -47,6 +47,8 @@ static int sxgbe_probe_config_dt(struct platform_device *pdev, | |||
| 47 | plat->mdio_bus_data = devm_kzalloc(&pdev->dev, | 47 | plat->mdio_bus_data = devm_kzalloc(&pdev->dev, |
| 48 | sizeof(*plat->mdio_bus_data), | 48 | sizeof(*plat->mdio_bus_data), |
| 49 | GFP_KERNEL); | 49 | GFP_KERNEL); |
| 50 | if (!plat->mdio_bus_data) | ||
| 51 | return -ENOMEM; | ||
| 50 | 52 | ||
| 51 | dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*dma_cfg), GFP_KERNEL); | 53 | dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*dma_cfg), GFP_KERNEL); |
| 52 | if (!dma_cfg) | 54 | if (!dma_cfg) |
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c index 17d4bbaeb65c..6e359572b9f0 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c | |||
| @@ -269,7 +269,10 @@ static int socfpga_dwmac_set_phy_mode(struct socfpga_dwmac *dwmac) | |||
| 269 | ctrl &= ~(SYSMGR_EMACGRP_CTRL_PHYSEL_MASK << reg_shift); | 269 | ctrl &= ~(SYSMGR_EMACGRP_CTRL_PHYSEL_MASK << reg_shift); |
| 270 | ctrl |= val << reg_shift; | 270 | ctrl |= val << reg_shift; |
| 271 | 271 | ||
| 272 | if (dwmac->f2h_ptp_ref_clk) { | 272 | if (dwmac->f2h_ptp_ref_clk || |
| 273 | phymode == PHY_INTERFACE_MODE_MII || | ||
| 274 | phymode == PHY_INTERFACE_MODE_GMII || | ||
| 275 | phymode == PHY_INTERFACE_MODE_SGMII) { | ||
| 273 | ctrl |= SYSMGR_EMACGRP_CTRL_PTP_REF_CLK_MASK << (reg_shift / 2); | 276 | ctrl |= SYSMGR_EMACGRP_CTRL_PTP_REF_CLK_MASK << (reg_shift / 2); |
| 274 | regmap_read(sys_mgr_base_addr, SYSMGR_FPGAGRP_MODULE_REG, | 277 | regmap_read(sys_mgr_base_addr, SYSMGR_FPGAGRP_MODULE_REG, |
| 275 | &module); | 278 | &module); |
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c index fffd6d5fc907..39c2122a4f26 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c | |||
| @@ -979,14 +979,6 @@ static int sun8i_dwmac_probe(struct platform_device *pdev) | |||
| 979 | } | 979 | } |
| 980 | 980 | ||
| 981 | static const struct of_device_id sun8i_dwmac_match[] = { | 981 | static const struct of_device_id sun8i_dwmac_match[] = { |
| 982 | { .compatible = "allwinner,sun8i-h3-emac", | ||
| 983 | .data = &emac_variant_h3 }, | ||
| 984 | { .compatible = "allwinner,sun8i-v3s-emac", | ||
| 985 | .data = &emac_variant_v3s }, | ||
| 986 | { .compatible = "allwinner,sun8i-a83t-emac", | ||
| 987 | .data = &emac_variant_a83t }, | ||
| 988 | { .compatible = "allwinner,sun50i-a64-emac", | ||
| 989 | .data = &emac_variant_a64 }, | ||
| 990 | { } | 982 | { } |
| 991 | }; | 983 | }; |
| 992 | MODULE_DEVICE_TABLE(of, sun8i_dwmac_match); | 984 | MODULE_DEVICE_TABLE(of, sun8i_dwmac_match); |
diff --git a/drivers/net/ethernet/ti/cpsw-common.c b/drivers/net/ethernet/ti/cpsw-common.c index 56ba411421f0..38d1cc557c11 100644 --- a/drivers/net/ethernet/ti/cpsw-common.c +++ b/drivers/net/ethernet/ti/cpsw-common.c | |||
| @@ -96,7 +96,7 @@ int ti_cm_get_macid(struct device *dev, int slave, u8 *mac_addr) | |||
| 96 | if (of_machine_is_compatible("ti,dra7")) | 96 | if (of_machine_is_compatible("ti,dra7")) |
| 97 | return davinci_emac_3517_get_macid(dev, 0x514, slave, mac_addr); | 97 | return davinci_emac_3517_get_macid(dev, 0x514, slave, mac_addr); |
| 98 | 98 | ||
| 99 | dev_err(dev, "incompatible machine/device type for reading mac address\n"); | 99 | dev_info(dev, "incompatible machine/device type for reading mac address\n"); |
| 100 | return -ENOENT; | 100 | return -ENOENT; |
| 101 | } | 101 | } |
| 102 | EXPORT_SYMBOL_GPL(ti_cm_get_macid); | 102 | EXPORT_SYMBOL_GPL(ti_cm_get_macid); |
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 0d78727f1a14..d91cbc6c3ca4 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c | |||
| @@ -1269,7 +1269,12 @@ static void netvsc_link_change(struct work_struct *w) | |||
| 1269 | bool notify = false, reschedule = false; | 1269 | bool notify = false, reschedule = false; |
| 1270 | unsigned long flags, next_reconfig, delay; | 1270 | unsigned long flags, next_reconfig, delay; |
| 1271 | 1271 | ||
| 1272 | rtnl_lock(); | 1272 | /* if changes are happening, comeback later */ |
| 1273 | if (!rtnl_trylock()) { | ||
| 1274 | schedule_delayed_work(&ndev_ctx->dwork, LINKCHANGE_INT); | ||
| 1275 | return; | ||
| 1276 | } | ||
| 1277 | |||
| 1273 | net_device = rtnl_dereference(ndev_ctx->nvdev); | 1278 | net_device = rtnl_dereference(ndev_ctx->nvdev); |
| 1274 | if (!net_device) | 1279 | if (!net_device) |
| 1275 | goto out_unlock; | 1280 | goto out_unlock; |
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index 5e1ab1160856..98e4deaa3a6a 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c | |||
| @@ -3521,6 +3521,7 @@ module_init(macsec_init); | |||
| 3521 | module_exit(macsec_exit); | 3521 | module_exit(macsec_exit); |
| 3522 | 3522 | ||
| 3523 | MODULE_ALIAS_RTNL_LINK("macsec"); | 3523 | MODULE_ALIAS_RTNL_LINK("macsec"); |
| 3524 | MODULE_ALIAS_GENL_FAMILY("macsec"); | ||
| 3524 | 3525 | ||
| 3525 | MODULE_DESCRIPTION("MACsec IEEE 802.1AE"); | 3526 | MODULE_DESCRIPTION("MACsec IEEE 802.1AE"); |
| 3526 | MODULE_LICENSE("GPL v2"); | 3527 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 5068c582d502..d0626bf5c540 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c | |||
| @@ -749,9 +749,6 @@ void phy_stop_machine(struct phy_device *phydev) | |||
| 749 | if (phydev->state > PHY_UP && phydev->state != PHY_HALTED) | 749 | if (phydev->state > PHY_UP && phydev->state != PHY_HALTED) |
| 750 | phydev->state = PHY_UP; | 750 | phydev->state = PHY_UP; |
| 751 | mutex_unlock(&phydev->lock); | 751 | mutex_unlock(&phydev->lock); |
| 752 | |||
| 753 | /* Now we can run the state machine synchronously */ | ||
| 754 | phy_state_machine(&phydev->state_queue.work); | ||
| 755 | } | 752 | } |
| 756 | 753 | ||
| 757 | /** | 754 | /** |
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 1790f7fec125..2f742ae5b92e 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
| @@ -864,15 +864,17 @@ EXPORT_SYMBOL(phy_attached_info); | |||
| 864 | #define ATTACHED_FMT "attached PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)" | 864 | #define ATTACHED_FMT "attached PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)" |
| 865 | void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) | 865 | void phy_attached_print(struct phy_device *phydev, const char *fmt, ...) |
| 866 | { | 866 | { |
| 867 | const char *drv_name = phydev->drv ? phydev->drv->name : "unbound"; | ||
| 868 | |||
| 867 | if (!fmt) { | 869 | if (!fmt) { |
| 868 | dev_info(&phydev->mdio.dev, ATTACHED_FMT "\n", | 870 | dev_info(&phydev->mdio.dev, ATTACHED_FMT "\n", |
| 869 | phydev->drv->name, phydev_name(phydev), | 871 | drv_name, phydev_name(phydev), |
| 870 | phydev->irq); | 872 | phydev->irq); |
| 871 | } else { | 873 | } else { |
| 872 | va_list ap; | 874 | va_list ap; |
| 873 | 875 | ||
| 874 | dev_info(&phydev->mdio.dev, ATTACHED_FMT, | 876 | dev_info(&phydev->mdio.dev, ATTACHED_FMT, |
| 875 | phydev->drv->name, phydev_name(phydev), | 877 | drv_name, phydev_name(phydev), |
| 876 | phydev->irq); | 878 | phydev->irq); |
| 877 | 879 | ||
| 878 | va_start(ap, fmt); | 880 | va_start(ap, fmt); |
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index 8f572b9f3625..9c80e80c5493 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c | |||
| @@ -1758,6 +1758,13 @@ static const struct usb_device_id cdc_devs[] = { | |||
| 1758 | .driver_info = (unsigned long)&wwan_noarp_info, | 1758 | .driver_info = (unsigned long)&wwan_noarp_info, |
| 1759 | }, | 1759 | }, |
| 1760 | 1760 | ||
| 1761 | /* u-blox TOBY-L4 */ | ||
| 1762 | { USB_DEVICE_AND_INTERFACE_INFO(0x1546, 0x1010, | ||
| 1763 | USB_CLASS_COMM, | ||
| 1764 | USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE), | ||
| 1765 | .driver_info = (unsigned long)&wwan_info, | ||
| 1766 | }, | ||
| 1767 | |||
| 1761 | /* Generic CDC-NCM devices */ | 1768 | /* Generic CDC-NCM devices */ |
| 1762 | { USB_INTERFACE_INFO(USB_CLASS_COMM, | 1769 | { USB_INTERFACE_INFO(USB_CLASS_COMM, |
| 1763 | USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE), | 1770 | USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE), |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 98f17b05c68b..b06169ea60dc 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
| @@ -1058,7 +1058,7 @@ static void free_old_xmit_skbs(struct send_queue *sq) | |||
| 1058 | bytes += skb->len; | 1058 | bytes += skb->len; |
| 1059 | packets++; | 1059 | packets++; |
| 1060 | 1060 | ||
| 1061 | dev_kfree_skb_any(skb); | 1061 | dev_consume_skb_any(skb); |
| 1062 | } | 1062 | } |
| 1063 | 1063 | ||
| 1064 | /* Avoid overhead when no packets have been processed | 1064 | /* Avoid overhead when no packets have been processed |
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h index fa315d84e98e..a1ea9ef97ed9 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h +++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h | |||
| @@ -787,6 +787,8 @@ int iwl_pci_fw_enter_d0i3(struct iwl_trans *trans); | |||
| 787 | 787 | ||
| 788 | void iwl_pcie_enable_rx_wake(struct iwl_trans *trans, bool enable); | 788 | void iwl_pcie_enable_rx_wake(struct iwl_trans *trans, bool enable); |
| 789 | 789 | ||
| 790 | void iwl_pcie_rx_allocator_work(struct work_struct *data); | ||
| 791 | |||
| 790 | /* common functions that are used by gen2 transport */ | 792 | /* common functions that are used by gen2 transport */ |
| 791 | void iwl_pcie_apm_config(struct iwl_trans *trans); | 793 | void iwl_pcie_apm_config(struct iwl_trans *trans); |
| 792 | int iwl_pcie_prepare_card_hw(struct iwl_trans *trans); | 794 | int iwl_pcie_prepare_card_hw(struct iwl_trans *trans); |
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c index 351c4423125a..942736d3fa75 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c | |||
| @@ -597,7 +597,7 @@ static void iwl_pcie_rx_allocator_get(struct iwl_trans *trans, | |||
| 597 | rxq->free_count += RX_CLAIM_REQ_ALLOC; | 597 | rxq->free_count += RX_CLAIM_REQ_ALLOC; |
| 598 | } | 598 | } |
| 599 | 599 | ||
| 600 | static void iwl_pcie_rx_allocator_work(struct work_struct *data) | 600 | void iwl_pcie_rx_allocator_work(struct work_struct *data) |
| 601 | { | 601 | { |
| 602 | struct iwl_rb_allocator *rba_p = | 602 | struct iwl_rb_allocator *rba_p = |
| 603 | container_of(data, struct iwl_rb_allocator, rx_alloc); | 603 | container_of(data, struct iwl_rb_allocator, rx_alloc); |
| @@ -900,10 +900,6 @@ static int _iwl_pcie_rx_init(struct iwl_trans *trans) | |||
| 900 | return err; | 900 | return err; |
| 901 | } | 901 | } |
| 902 | def_rxq = trans_pcie->rxq; | 902 | def_rxq = trans_pcie->rxq; |
| 903 | if (!rba->alloc_wq) | ||
| 904 | rba->alloc_wq = alloc_workqueue("rb_allocator", | ||
| 905 | WQ_HIGHPRI | WQ_UNBOUND, 1); | ||
| 906 | INIT_WORK(&rba->rx_alloc, iwl_pcie_rx_allocator_work); | ||
| 907 | 903 | ||
| 908 | spin_lock(&rba->lock); | 904 | spin_lock(&rba->lock); |
| 909 | atomic_set(&rba->req_pending, 0); | 905 | atomic_set(&rba->req_pending, 0); |
| @@ -1017,10 +1013,6 @@ void iwl_pcie_rx_free(struct iwl_trans *trans) | |||
| 1017 | } | 1013 | } |
| 1018 | 1014 | ||
| 1019 | cancel_work_sync(&rba->rx_alloc); | 1015 | cancel_work_sync(&rba->rx_alloc); |
| 1020 | if (rba->alloc_wq) { | ||
| 1021 | destroy_workqueue(rba->alloc_wq); | ||
| 1022 | rba->alloc_wq = NULL; | ||
| 1023 | } | ||
| 1024 | 1016 | ||
| 1025 | iwl_pcie_free_rbs_pool(trans); | 1017 | iwl_pcie_free_rbs_pool(trans); |
| 1026 | 1018 | ||
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c index f95eec52508e..3927bbf04f72 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c | |||
| @@ -1786,6 +1786,11 @@ void iwl_trans_pcie_free(struct iwl_trans *trans) | |||
| 1786 | iwl_pcie_tx_free(trans); | 1786 | iwl_pcie_tx_free(trans); |
| 1787 | iwl_pcie_rx_free(trans); | 1787 | iwl_pcie_rx_free(trans); |
| 1788 | 1788 | ||
| 1789 | if (trans_pcie->rba.alloc_wq) { | ||
| 1790 | destroy_workqueue(trans_pcie->rba.alloc_wq); | ||
| 1791 | trans_pcie->rba.alloc_wq = NULL; | ||
| 1792 | } | ||
| 1793 | |||
| 1789 | if (trans_pcie->msix_enabled) { | 1794 | if (trans_pcie->msix_enabled) { |
| 1790 | for (i = 0; i < trans_pcie->alloc_vecs; i++) { | 1795 | for (i = 0; i < trans_pcie->alloc_vecs; i++) { |
| 1791 | irq_set_affinity_hint( | 1796 | irq_set_affinity_hint( |
| @@ -3169,6 +3174,10 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, | |||
| 3169 | trans_pcie->inta_mask = CSR_INI_SET_MASK; | 3174 | trans_pcie->inta_mask = CSR_INI_SET_MASK; |
| 3170 | } | 3175 | } |
| 3171 | 3176 | ||
| 3177 | trans_pcie->rba.alloc_wq = alloc_workqueue("rb_allocator", | ||
| 3178 | WQ_HIGHPRI | WQ_UNBOUND, 1); | ||
| 3179 | INIT_WORK(&trans_pcie->rba.rx_alloc, iwl_pcie_rx_allocator_work); | ||
| 3180 | |||
| 3172 | #ifdef CONFIG_IWLWIFI_PCIE_RTPM | 3181 | #ifdef CONFIG_IWLWIFI_PCIE_RTPM |
| 3173 | trans->runtime_pm_mode = IWL_PLAT_PM_MODE_D0I3; | 3182 | trans->runtime_pm_mode = IWL_PLAT_PM_MODE_D0I3; |
| 3174 | #else | 3183 | #else |
diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c index 08f0477f78d9..9915d83a4a30 100644 --- a/drivers/net/wireless/ti/wl1251/main.c +++ b/drivers/net/wireless/ti/wl1251/main.c | |||
| @@ -1571,6 +1571,7 @@ struct ieee80211_hw *wl1251_alloc_hw(void) | |||
| 1571 | 1571 | ||
| 1572 | wl->state = WL1251_STATE_OFF; | 1572 | wl->state = WL1251_STATE_OFF; |
| 1573 | mutex_init(&wl->mutex); | 1573 | mutex_init(&wl->mutex); |
| 1574 | spin_lock_init(&wl->wl_lock); | ||
| 1574 | 1575 | ||
| 1575 | wl->tx_mgmt_frm_rate = DEFAULT_HW_GEN_TX_RATE; | 1576 | wl->tx_mgmt_frm_rate = DEFAULT_HW_GEN_TX_RATE; |
| 1576 | wl->tx_mgmt_frm_mod = DEFAULT_HW_GEN_MODULATION_TYPE; | 1577 | wl->tx_mgmt_frm_mod = DEFAULT_HW_GEN_MODULATION_TYPE; |
