diff options
Diffstat (limited to 'drivers')
32 files changed, 342 insertions, 177 deletions
diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c index a969a7e443be..85aaf2222587 100644 --- a/drivers/atm/firestream.c +++ b/drivers/atm/firestream.c | |||
@@ -181,13 +181,17 @@ static char *res_strings[] = { | |||
181 | "reserved 27", | 181 | "reserved 27", |
182 | "reserved 28", | 182 | "reserved 28", |
183 | "reserved 29", | 183 | "reserved 29", |
184 | "reserved 30", | 184 | "reserved 30", /* FIXME: The strings between 30-40 might be wrong. */ |
185 | "reassembly abort: no buffers", | 185 | "reassembly abort: no buffers", |
186 | "receive buffer overflow", | 186 | "receive buffer overflow", |
187 | "change in GFC", | 187 | "change in GFC", |
188 | "receive buffer full", | 188 | "receive buffer full", |
189 | "low priority discard - no receive descriptor", | 189 | "low priority discard - no receive descriptor", |
190 | "low priority discard - missing end of packet", | 190 | "low priority discard - missing end of packet", |
191 | "reserved 37", | ||
192 | "reserved 38", | ||
193 | "reserved 39", | ||
194 | "reseverd 40", | ||
191 | "reserved 41", | 195 | "reserved 41", |
192 | "reserved 42", | 196 | "reserved 42", |
193 | "reserved 43", | 197 | "reserved 43", |
diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c index 7d00f2994738..809dd1e02091 100644 --- a/drivers/atm/iphase.c +++ b/drivers/atm/iphase.c | |||
@@ -1128,7 +1128,7 @@ static int rx_pkt(struct atm_dev *dev) | |||
1128 | /* make the ptr point to the corresponding buffer desc entry */ | 1128 | /* make the ptr point to the corresponding buffer desc entry */ |
1129 | buf_desc_ptr += desc; | 1129 | buf_desc_ptr += desc; |
1130 | if (!desc || (desc > iadev->num_rx_desc) || | 1130 | if (!desc || (desc > iadev->num_rx_desc) || |
1131 | ((buf_desc_ptr->vc_index & 0xffff) > iadev->num_vc)) { | 1131 | ((buf_desc_ptr->vc_index & 0xffff) >= iadev->num_vc)) { |
1132 | free_desc(dev, desc); | 1132 | free_desc(dev, desc); |
1133 | IF_ERR(printk("IA: bad descriptor desc = %d \n", desc);) | 1133 | IF_ERR(printk("IA: bad descriptor desc = %d \n", desc);) |
1134 | return -1; | 1134 | return -1; |
diff --git a/drivers/net/ethernet/arc/emac_mdio.c b/drivers/net/ethernet/arc/emac_mdio.c index 16419f550eff..058460bdd5a6 100644 --- a/drivers/net/ethernet/arc/emac_mdio.c +++ b/drivers/net/ethernet/arc/emac_mdio.c | |||
@@ -141,7 +141,7 @@ int arc_mdio_probe(struct arc_emac_priv *priv) | |||
141 | priv->bus = bus; | 141 | priv->bus = bus; |
142 | bus->priv = priv; | 142 | bus->priv = priv; |
143 | bus->parent = priv->dev; | 143 | bus->parent = priv->dev; |
144 | bus->name = "Synopsys MII Bus", | 144 | bus->name = "Synopsys MII Bus"; |
145 | bus->read = &arc_mdio_read; | 145 | bus->read = &arc_mdio_read; |
146 | bus->write = &arc_mdio_write; | 146 | bus->write = &arc_mdio_write; |
147 | bus->reset = &arc_mdio_reset; | 147 | bus->reset = &arc_mdio_reset; |
diff --git a/drivers/net/ethernet/atheros/alx/alx.h b/drivers/net/ethernet/atheros/alx/alx.h index 8fc93c5f6abc..d02c4240b7df 100644 --- a/drivers/net/ethernet/atheros/alx/alx.h +++ b/drivers/net/ethernet/atheros/alx/alx.h | |||
@@ -96,6 +96,10 @@ struct alx_priv { | |||
96 | unsigned int rx_ringsz; | 96 | unsigned int rx_ringsz; |
97 | unsigned int rxbuf_size; | 97 | unsigned int rxbuf_size; |
98 | 98 | ||
99 | struct page *rx_page; | ||
100 | unsigned int rx_page_offset; | ||
101 | unsigned int rx_frag_size; | ||
102 | |||
99 | struct napi_struct napi; | 103 | struct napi_struct napi; |
100 | struct alx_tx_queue txq; | 104 | struct alx_tx_queue txq; |
101 | struct alx_rx_queue rxq; | 105 | struct alx_rx_queue rxq; |
diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c index 9fe8b5e310d1..c98acdc0d14f 100644 --- a/drivers/net/ethernet/atheros/alx/main.c +++ b/drivers/net/ethernet/atheros/alx/main.c | |||
@@ -70,6 +70,35 @@ static void alx_free_txbuf(struct alx_priv *alx, int entry) | |||
70 | } | 70 | } |
71 | } | 71 | } |
72 | 72 | ||
73 | static struct sk_buff *alx_alloc_skb(struct alx_priv *alx, gfp_t gfp) | ||
74 | { | ||
75 | struct sk_buff *skb; | ||
76 | struct page *page; | ||
77 | |||
78 | if (alx->rx_frag_size > PAGE_SIZE) | ||
79 | return __netdev_alloc_skb(alx->dev, alx->rxbuf_size, gfp); | ||
80 | |||
81 | page = alx->rx_page; | ||
82 | if (!page) { | ||
83 | alx->rx_page = page = alloc_page(gfp); | ||
84 | if (unlikely(!page)) | ||
85 | return NULL; | ||
86 | alx->rx_page_offset = 0; | ||
87 | } | ||
88 | |||
89 | skb = build_skb(page_address(page) + alx->rx_page_offset, | ||
90 | alx->rx_frag_size); | ||
91 | if (likely(skb)) { | ||
92 | alx->rx_page_offset += alx->rx_frag_size; | ||
93 | if (alx->rx_page_offset >= PAGE_SIZE) | ||
94 | alx->rx_page = NULL; | ||
95 | else | ||
96 | get_page(page); | ||
97 | } | ||
98 | return skb; | ||
99 | } | ||
100 | |||
101 | |||
73 | static int alx_refill_rx_ring(struct alx_priv *alx, gfp_t gfp) | 102 | static int alx_refill_rx_ring(struct alx_priv *alx, gfp_t gfp) |
74 | { | 103 | { |
75 | struct alx_rx_queue *rxq = &alx->rxq; | 104 | struct alx_rx_queue *rxq = &alx->rxq; |
@@ -86,7 +115,7 @@ static int alx_refill_rx_ring(struct alx_priv *alx, gfp_t gfp) | |||
86 | while (!cur_buf->skb && next != rxq->read_idx) { | 115 | while (!cur_buf->skb && next != rxq->read_idx) { |
87 | struct alx_rfd *rfd = &rxq->rfd[cur]; | 116 | struct alx_rfd *rfd = &rxq->rfd[cur]; |
88 | 117 | ||
89 | skb = __netdev_alloc_skb(alx->dev, alx->rxbuf_size, gfp); | 118 | skb = alx_alloc_skb(alx, gfp); |
90 | if (!skb) | 119 | if (!skb) |
91 | break; | 120 | break; |
92 | dma = dma_map_single(&alx->hw.pdev->dev, | 121 | dma = dma_map_single(&alx->hw.pdev->dev, |
@@ -124,6 +153,7 @@ static int alx_refill_rx_ring(struct alx_priv *alx, gfp_t gfp) | |||
124 | alx_write_mem16(&alx->hw, ALX_RFD_PIDX, cur); | 153 | alx_write_mem16(&alx->hw, ALX_RFD_PIDX, cur); |
125 | } | 154 | } |
126 | 155 | ||
156 | |||
127 | return count; | 157 | return count; |
128 | } | 158 | } |
129 | 159 | ||
@@ -592,6 +622,11 @@ static void alx_free_rings(struct alx_priv *alx) | |||
592 | kfree(alx->txq.bufs); | 622 | kfree(alx->txq.bufs); |
593 | kfree(alx->rxq.bufs); | 623 | kfree(alx->rxq.bufs); |
594 | 624 | ||
625 | if (alx->rx_page) { | ||
626 | put_page(alx->rx_page); | ||
627 | alx->rx_page = NULL; | ||
628 | } | ||
629 | |||
595 | dma_free_coherent(&alx->hw.pdev->dev, | 630 | dma_free_coherent(&alx->hw.pdev->dev, |
596 | alx->descmem.size, | 631 | alx->descmem.size, |
597 | alx->descmem.virt, | 632 | alx->descmem.virt, |
@@ -646,6 +681,7 @@ static int alx_request_irq(struct alx_priv *alx) | |||
646 | alx->dev->name, alx); | 681 | alx->dev->name, alx); |
647 | if (!err) | 682 | if (!err) |
648 | goto out; | 683 | goto out; |
684 | |||
649 | /* fall back to legacy interrupt */ | 685 | /* fall back to legacy interrupt */ |
650 | pci_disable_msi(alx->hw.pdev); | 686 | pci_disable_msi(alx->hw.pdev); |
651 | } | 687 | } |
@@ -689,6 +725,7 @@ static int alx_init_sw(struct alx_priv *alx) | |||
689 | struct pci_dev *pdev = alx->hw.pdev; | 725 | struct pci_dev *pdev = alx->hw.pdev; |
690 | struct alx_hw *hw = &alx->hw; | 726 | struct alx_hw *hw = &alx->hw; |
691 | int err; | 727 | int err; |
728 | unsigned int head_size; | ||
692 | 729 | ||
693 | err = alx_identify_hw(alx); | 730 | err = alx_identify_hw(alx); |
694 | if (err) { | 731 | if (err) { |
@@ -704,7 +741,12 @@ static int alx_init_sw(struct alx_priv *alx) | |||
704 | 741 | ||
705 | hw->smb_timer = 400; | 742 | hw->smb_timer = 400; |
706 | hw->mtu = alx->dev->mtu; | 743 | hw->mtu = alx->dev->mtu; |
744 | |||
707 | alx->rxbuf_size = ALX_MAX_FRAME_LEN(hw->mtu); | 745 | alx->rxbuf_size = ALX_MAX_FRAME_LEN(hw->mtu); |
746 | head_size = SKB_DATA_ALIGN(alx->rxbuf_size + NET_SKB_PAD) + | ||
747 | SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | ||
748 | alx->rx_frag_size = roundup_pow_of_two(head_size); | ||
749 | |||
708 | alx->tx_ringsz = 256; | 750 | alx->tx_ringsz = 256; |
709 | alx->rx_ringsz = 512; | 751 | alx->rx_ringsz = 512; |
710 | hw->imt = 200; | 752 | hw->imt = 200; |
@@ -806,6 +848,7 @@ static int alx_change_mtu(struct net_device *netdev, int mtu) | |||
806 | { | 848 | { |
807 | struct alx_priv *alx = netdev_priv(netdev); | 849 | struct alx_priv *alx = netdev_priv(netdev); |
808 | int max_frame = ALX_MAX_FRAME_LEN(mtu); | 850 | int max_frame = ALX_MAX_FRAME_LEN(mtu); |
851 | unsigned int head_size; | ||
809 | 852 | ||
810 | if ((max_frame < ALX_MIN_FRAME_SIZE) || | 853 | if ((max_frame < ALX_MIN_FRAME_SIZE) || |
811 | (max_frame > ALX_MAX_FRAME_SIZE)) | 854 | (max_frame > ALX_MAX_FRAME_SIZE)) |
@@ -817,6 +860,9 @@ static int alx_change_mtu(struct net_device *netdev, int mtu) | |||
817 | netdev->mtu = mtu; | 860 | netdev->mtu = mtu; |
818 | alx->hw.mtu = mtu; | 861 | alx->hw.mtu = mtu; |
819 | alx->rxbuf_size = max(max_frame, ALX_DEF_RXBUF_SIZE); | 862 | alx->rxbuf_size = max(max_frame, ALX_DEF_RXBUF_SIZE); |
863 | head_size = SKB_DATA_ALIGN(alx->rxbuf_size + NET_SKB_PAD) + | ||
864 | SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | ||
865 | alx->rx_frag_size = roundup_pow_of_two(head_size); | ||
820 | netdev_update_features(netdev); | 866 | netdev_update_features(netdev); |
821 | if (netif_running(netdev)) | 867 | if (netif_running(netdev)) |
822 | alx_reinit(alx); | 868 | alx_reinit(alx); |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 0a5b770cefaa..c5fe915870ad 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
@@ -13941,14 +13941,14 @@ static int bnx2x_init_one(struct pci_dev *pdev, | |||
13941 | bp->doorbells = bnx2x_vf_doorbells(bp); | 13941 | bp->doorbells = bnx2x_vf_doorbells(bp); |
13942 | rc = bnx2x_vf_pci_alloc(bp); | 13942 | rc = bnx2x_vf_pci_alloc(bp); |
13943 | if (rc) | 13943 | if (rc) |
13944 | goto init_one_exit; | 13944 | goto init_one_freemem; |
13945 | } else { | 13945 | } else { |
13946 | doorbell_size = BNX2X_L2_MAX_CID(bp) * (1 << BNX2X_DB_SHIFT); | 13946 | doorbell_size = BNX2X_L2_MAX_CID(bp) * (1 << BNX2X_DB_SHIFT); |
13947 | if (doorbell_size > pci_resource_len(pdev, 2)) { | 13947 | if (doorbell_size > pci_resource_len(pdev, 2)) { |
13948 | dev_err(&bp->pdev->dev, | 13948 | dev_err(&bp->pdev->dev, |
13949 | "Cannot map doorbells, bar size too small, aborting\n"); | 13949 | "Cannot map doorbells, bar size too small, aborting\n"); |
13950 | rc = -ENOMEM; | 13950 | rc = -ENOMEM; |
13951 | goto init_one_exit; | 13951 | goto init_one_freemem; |
13952 | } | 13952 | } |
13953 | bp->doorbells = ioremap_nocache(pci_resource_start(pdev, 2), | 13953 | bp->doorbells = ioremap_nocache(pci_resource_start(pdev, 2), |
13954 | doorbell_size); | 13954 | doorbell_size); |
@@ -13957,19 +13957,19 @@ static int bnx2x_init_one(struct pci_dev *pdev, | |||
13957 | dev_err(&bp->pdev->dev, | 13957 | dev_err(&bp->pdev->dev, |
13958 | "Cannot map doorbell space, aborting\n"); | 13958 | "Cannot map doorbell space, aborting\n"); |
13959 | rc = -ENOMEM; | 13959 | rc = -ENOMEM; |
13960 | goto init_one_exit; | 13960 | goto init_one_freemem; |
13961 | } | 13961 | } |
13962 | 13962 | ||
13963 | if (IS_VF(bp)) { | 13963 | if (IS_VF(bp)) { |
13964 | rc = bnx2x_vfpf_acquire(bp, tx_count, rx_count); | 13964 | rc = bnx2x_vfpf_acquire(bp, tx_count, rx_count); |
13965 | if (rc) | 13965 | if (rc) |
13966 | goto init_one_exit; | 13966 | goto init_one_freemem; |
13967 | } | 13967 | } |
13968 | 13968 | ||
13969 | /* Enable SRIOV if capability found in configuration space */ | 13969 | /* Enable SRIOV if capability found in configuration space */ |
13970 | rc = bnx2x_iov_init_one(bp, int_mode, BNX2X_MAX_NUM_OF_VFS); | 13970 | rc = bnx2x_iov_init_one(bp, int_mode, BNX2X_MAX_NUM_OF_VFS); |
13971 | if (rc) | 13971 | if (rc) |
13972 | goto init_one_exit; | 13972 | goto init_one_freemem; |
13973 | 13973 | ||
13974 | /* calc qm_cid_count */ | 13974 | /* calc qm_cid_count */ |
13975 | bp->qm_cid_count = bnx2x_set_qm_cid_count(bp); | 13975 | bp->qm_cid_count = bnx2x_set_qm_cid_count(bp); |
@@ -13988,7 +13988,7 @@ static int bnx2x_init_one(struct pci_dev *pdev, | |||
13988 | rc = bnx2x_set_int_mode(bp); | 13988 | rc = bnx2x_set_int_mode(bp); |
13989 | if (rc) { | 13989 | if (rc) { |
13990 | dev_err(&pdev->dev, "Cannot set interrupts\n"); | 13990 | dev_err(&pdev->dev, "Cannot set interrupts\n"); |
13991 | goto init_one_exit; | 13991 | goto init_one_freemem; |
13992 | } | 13992 | } |
13993 | BNX2X_DEV_INFO("set interrupts successfully\n"); | 13993 | BNX2X_DEV_INFO("set interrupts successfully\n"); |
13994 | 13994 | ||
@@ -13996,7 +13996,7 @@ static int bnx2x_init_one(struct pci_dev *pdev, | |||
13996 | rc = register_netdev(dev); | 13996 | rc = register_netdev(dev); |
13997 | if (rc) { | 13997 | if (rc) { |
13998 | dev_err(&pdev->dev, "Cannot register net device\n"); | 13998 | dev_err(&pdev->dev, "Cannot register net device\n"); |
13999 | goto init_one_exit; | 13999 | goto init_one_freemem; |
14000 | } | 14000 | } |
14001 | BNX2X_DEV_INFO("device name after netdev register %s\n", dev->name); | 14001 | BNX2X_DEV_INFO("device name after netdev register %s\n", dev->name); |
14002 | 14002 | ||
@@ -14029,6 +14029,9 @@ static int bnx2x_init_one(struct pci_dev *pdev, | |||
14029 | 14029 | ||
14030 | return 0; | 14030 | return 0; |
14031 | 14031 | ||
14032 | init_one_freemem: | ||
14033 | bnx2x_free_mem_bp(bp); | ||
14034 | |||
14032 | init_one_exit: | 14035 | init_one_exit: |
14033 | bnx2x_disable_pcie_error_reporting(bp); | 14036 | bnx2x_disable_pcie_error_reporting(bp); |
14034 | 14037 | ||
diff --git a/drivers/net/ethernet/ezchip/nps_enet.c b/drivers/net/ethernet/ezchip/nps_enet.c index 085f9125cf42..06f031715b57 100644 --- a/drivers/net/ethernet/ezchip/nps_enet.c +++ b/drivers/net/ethernet/ezchip/nps_enet.c | |||
@@ -205,8 +205,10 @@ static int nps_enet_poll(struct napi_struct *napi, int budget) | |||
205 | * re-adding ourselves to the poll list. | 205 | * re-adding ourselves to the poll list. |
206 | */ | 206 | */ |
207 | 207 | ||
208 | if (priv->tx_skb && !tx_ctrl_ct) | 208 | if (priv->tx_skb && !tx_ctrl_ct) { |
209 | nps_enet_reg_set(priv, NPS_ENET_REG_BUF_INT_ENABLE, 0); | ||
209 | napi_reschedule(napi); | 210 | napi_reschedule(napi); |
211 | } | ||
210 | } | 212 | } |
211 | 213 | ||
212 | return work_done; | 214 | return work_done; |
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index ca2cccc594fd..3c0255e98535 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
@@ -1197,10 +1197,8 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id) | |||
1197 | fec16_to_cpu(bdp->cbd_datlen), | 1197 | fec16_to_cpu(bdp->cbd_datlen), |
1198 | DMA_TO_DEVICE); | 1198 | DMA_TO_DEVICE); |
1199 | bdp->cbd_bufaddr = cpu_to_fec32(0); | 1199 | bdp->cbd_bufaddr = cpu_to_fec32(0); |
1200 | if (!skb) { | 1200 | if (!skb) |
1201 | bdp = fec_enet_get_nextdesc(bdp, &txq->bd); | 1201 | goto skb_done; |
1202 | continue; | ||
1203 | } | ||
1204 | 1202 | ||
1205 | /* Check for errors. */ | 1203 | /* Check for errors. */ |
1206 | if (status & (BD_ENET_TX_HB | BD_ENET_TX_LC | | 1204 | if (status & (BD_ENET_TX_HB | BD_ENET_TX_LC | |
@@ -1239,7 +1237,7 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id) | |||
1239 | 1237 | ||
1240 | /* Free the sk buffer associated with this last transmit */ | 1238 | /* Free the sk buffer associated with this last transmit */ |
1241 | dev_kfree_skb_any(skb); | 1239 | dev_kfree_skb_any(skb); |
1242 | 1240 | skb_done: | |
1243 | /* Make sure the update to bdp and tx_skbuff are performed | 1241 | /* Make sure the update to bdp and tx_skbuff are performed |
1244 | * before dirty_tx | 1242 | * before dirty_tx |
1245 | */ | 1243 | */ |
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c index 3d746c887873..67a648c7d3a9 100644 --- a/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c +++ b/drivers/net/ethernet/hisilicon/hns/hns_ethtool.c | |||
@@ -46,7 +46,6 @@ static u32 hns_nic_get_link(struct net_device *net_dev) | |||
46 | u32 link_stat = priv->link; | 46 | u32 link_stat = priv->link; |
47 | struct hnae_handle *h; | 47 | struct hnae_handle *h; |
48 | 48 | ||
49 | assert(priv && priv->ae_handle); | ||
50 | h = priv->ae_handle; | 49 | h = priv->ae_handle; |
51 | 50 | ||
52 | if (priv->phy) { | 51 | if (priv->phy) { |
@@ -646,8 +645,6 @@ static void hns_nic_get_drvinfo(struct net_device *net_dev, | |||
646 | { | 645 | { |
647 | struct hns_nic_priv *priv = netdev_priv(net_dev); | 646 | struct hns_nic_priv *priv = netdev_priv(net_dev); |
648 | 647 | ||
649 | assert(priv); | ||
650 | |||
651 | strncpy(drvinfo->version, HNAE_DRIVER_VERSION, | 648 | strncpy(drvinfo->version, HNAE_DRIVER_VERSION, |
652 | sizeof(drvinfo->version)); | 649 | sizeof(drvinfo->version)); |
653 | drvinfo->version[sizeof(drvinfo->version) - 1] = '\0'; | 650 | drvinfo->version[sizeof(drvinfo->version) - 1] = '\0'; |
@@ -720,8 +717,6 @@ static int hns_set_pauseparam(struct net_device *net_dev, | |||
720 | struct hnae_handle *h; | 717 | struct hnae_handle *h; |
721 | struct hnae_ae_ops *ops; | 718 | struct hnae_ae_ops *ops; |
722 | 719 | ||
723 | assert(priv || priv->ae_handle); | ||
724 | |||
725 | h = priv->ae_handle; | 720 | h = priv->ae_handle; |
726 | ops = h->dev->ops; | 721 | ops = h->dev->ops; |
727 | 722 | ||
@@ -780,8 +775,6 @@ static int hns_set_coalesce(struct net_device *net_dev, | |||
780 | struct hnae_ae_ops *ops; | 775 | struct hnae_ae_ops *ops; |
781 | int ret; | 776 | int ret; |
782 | 777 | ||
783 | assert(priv || priv->ae_handle); | ||
784 | |||
785 | ops = priv->ae_handle->dev->ops; | 778 | ops = priv->ae_handle->dev->ops; |
786 | 779 | ||
787 | if (ec->tx_coalesce_usecs != ec->rx_coalesce_usecs) | 780 | if (ec->tx_coalesce_usecs != ec->rx_coalesce_usecs) |
@@ -1111,8 +1104,6 @@ void hns_get_regs(struct net_device *net_dev, struct ethtool_regs *cmd, | |||
1111 | struct hns_nic_priv *priv = netdev_priv(net_dev); | 1104 | struct hns_nic_priv *priv = netdev_priv(net_dev); |
1112 | struct hnae_ae_ops *ops; | 1105 | struct hnae_ae_ops *ops; |
1113 | 1106 | ||
1114 | assert(priv || priv->ae_handle); | ||
1115 | |||
1116 | ops = priv->ae_handle->dev->ops; | 1107 | ops = priv->ae_handle->dev->ops; |
1117 | 1108 | ||
1118 | cmd->version = HNS_CHIP_VERSION; | 1109 | cmd->version = HNS_CHIP_VERSION; |
@@ -1135,8 +1126,6 @@ static int hns_get_regs_len(struct net_device *net_dev) | |||
1135 | struct hns_nic_priv *priv = netdev_priv(net_dev); | 1126 | struct hns_nic_priv *priv = netdev_priv(net_dev); |
1136 | struct hnae_ae_ops *ops; | 1127 | struct hnae_ae_ops *ops; |
1137 | 1128 | ||
1138 | assert(priv || priv->ae_handle); | ||
1139 | |||
1140 | ops = priv->ae_handle->dev->ops; | 1129 | ops = priv->ae_handle->dev->ops; |
1141 | if (!ops->get_regs_len) { | 1130 | if (!ops->get_regs_len) { |
1142 | netdev_err(net_dev, "ops->get_regs_len is null!\n"); | 1131 | netdev_err(net_dev, "ops->get_regs_len is null!\n"); |
diff --git a/drivers/net/ethernet/marvell/mvneta_bm.c b/drivers/net/ethernet/marvell/mvneta_bm.c index 01fccec632ec..466939f8f0cf 100644 --- a/drivers/net/ethernet/marvell/mvneta_bm.c +++ b/drivers/net/ethernet/marvell/mvneta_bm.c | |||
@@ -189,6 +189,7 @@ struct mvneta_bm_pool *mvneta_bm_pool_use(struct mvneta_bm *priv, u8 pool_id, | |||
189 | SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); | 189 | SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); |
190 | hwbm_pool->construct = mvneta_bm_construct; | 190 | hwbm_pool->construct = mvneta_bm_construct; |
191 | hwbm_pool->priv = new_pool; | 191 | hwbm_pool->priv = new_pool; |
192 | spin_lock_init(&hwbm_pool->lock); | ||
192 | 193 | ||
193 | /* Create new pool */ | 194 | /* Create new pool */ |
194 | err = mvneta_bm_pool_create(priv, new_pool); | 195 | err = mvneta_bm_pool_create(priv, new_pool); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c index c761194bb323..fc95affaf76b 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | |||
@@ -362,7 +362,7 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev, | |||
362 | 362 | ||
363 | for (i = 0; i < NUM_MAIN_STATS; i++, bitmap_iterator_inc(&it)) | 363 | for (i = 0; i < NUM_MAIN_STATS; i++, bitmap_iterator_inc(&it)) |
364 | if (bitmap_iterator_test(&it)) | 364 | if (bitmap_iterator_test(&it)) |
365 | data[index++] = ((unsigned long *)&priv->stats)[i]; | 365 | data[index++] = ((unsigned long *)&dev->stats)[i]; |
366 | 366 | ||
367 | for (i = 0; i < NUM_PORT_STATS; i++, bitmap_iterator_inc(&it)) | 367 | for (i = 0; i < NUM_PORT_STATS; i++, bitmap_iterator_inc(&it)) |
368 | if (bitmap_iterator_test(&it)) | 368 | if (bitmap_iterator_test(&it)) |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index 92e0624f4cf0..19ceced6736c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
@@ -1296,15 +1296,16 @@ static void mlx4_en_tx_timeout(struct net_device *dev) | |||
1296 | } | 1296 | } |
1297 | 1297 | ||
1298 | 1298 | ||
1299 | static struct net_device_stats *mlx4_en_get_stats(struct net_device *dev) | 1299 | static struct rtnl_link_stats64 * |
1300 | mlx4_en_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) | ||
1300 | { | 1301 | { |
1301 | struct mlx4_en_priv *priv = netdev_priv(dev); | 1302 | struct mlx4_en_priv *priv = netdev_priv(dev); |
1302 | 1303 | ||
1303 | spin_lock_bh(&priv->stats_lock); | 1304 | spin_lock_bh(&priv->stats_lock); |
1304 | memcpy(&priv->ret_stats, &priv->stats, sizeof(priv->stats)); | 1305 | netdev_stats_to_stats64(stats, &dev->stats); |
1305 | spin_unlock_bh(&priv->stats_lock); | 1306 | spin_unlock_bh(&priv->stats_lock); |
1306 | 1307 | ||
1307 | return &priv->ret_stats; | 1308 | return stats; |
1308 | } | 1309 | } |
1309 | 1310 | ||
1310 | static void mlx4_en_set_default_moderation(struct mlx4_en_priv *priv) | 1311 | static void mlx4_en_set_default_moderation(struct mlx4_en_priv *priv) |
@@ -1876,7 +1877,6 @@ static void mlx4_en_clear_stats(struct net_device *dev) | |||
1876 | if (mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 1)) | 1877 | if (mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 1)) |
1877 | en_dbg(HW, priv, "Failed dumping statistics\n"); | 1878 | en_dbg(HW, priv, "Failed dumping statistics\n"); |
1878 | 1879 | ||
1879 | memset(&priv->stats, 0, sizeof(priv->stats)); | ||
1880 | memset(&priv->pstats, 0, sizeof(priv->pstats)); | 1880 | memset(&priv->pstats, 0, sizeof(priv->pstats)); |
1881 | memset(&priv->pkstats, 0, sizeof(priv->pkstats)); | 1881 | memset(&priv->pkstats, 0, sizeof(priv->pkstats)); |
1882 | memset(&priv->port_stats, 0, sizeof(priv->port_stats)); | 1882 | memset(&priv->port_stats, 0, sizeof(priv->port_stats)); |
@@ -1892,6 +1892,11 @@ static void mlx4_en_clear_stats(struct net_device *dev) | |||
1892 | priv->tx_ring[i]->bytes = 0; | 1892 | priv->tx_ring[i]->bytes = 0; |
1893 | priv->tx_ring[i]->packets = 0; | 1893 | priv->tx_ring[i]->packets = 0; |
1894 | priv->tx_ring[i]->tx_csum = 0; | 1894 | priv->tx_ring[i]->tx_csum = 0; |
1895 | priv->tx_ring[i]->tx_dropped = 0; | ||
1896 | priv->tx_ring[i]->queue_stopped = 0; | ||
1897 | priv->tx_ring[i]->wake_queue = 0; | ||
1898 | priv->tx_ring[i]->tso_packets = 0; | ||
1899 | priv->tx_ring[i]->xmit_more = 0; | ||
1895 | } | 1900 | } |
1896 | for (i = 0; i < priv->rx_ring_num; i++) { | 1901 | for (i = 0; i < priv->rx_ring_num; i++) { |
1897 | priv->rx_ring[i]->bytes = 0; | 1902 | priv->rx_ring[i]->bytes = 0; |
@@ -2482,7 +2487,7 @@ static const struct net_device_ops mlx4_netdev_ops = { | |||
2482 | .ndo_stop = mlx4_en_close, | 2487 | .ndo_stop = mlx4_en_close, |
2483 | .ndo_start_xmit = mlx4_en_xmit, | 2488 | .ndo_start_xmit = mlx4_en_xmit, |
2484 | .ndo_select_queue = mlx4_en_select_queue, | 2489 | .ndo_select_queue = mlx4_en_select_queue, |
2485 | .ndo_get_stats = mlx4_en_get_stats, | 2490 | .ndo_get_stats64 = mlx4_en_get_stats64, |
2486 | .ndo_set_rx_mode = mlx4_en_set_rx_mode, | 2491 | .ndo_set_rx_mode = mlx4_en_set_rx_mode, |
2487 | .ndo_set_mac_address = mlx4_en_set_mac, | 2492 | .ndo_set_mac_address = mlx4_en_set_mac, |
2488 | .ndo_validate_addr = eth_validate_addr, | 2493 | .ndo_validate_addr = eth_validate_addr, |
@@ -2514,7 +2519,7 @@ static const struct net_device_ops mlx4_netdev_ops_master = { | |||
2514 | .ndo_stop = mlx4_en_close, | 2519 | .ndo_stop = mlx4_en_close, |
2515 | .ndo_start_xmit = mlx4_en_xmit, | 2520 | .ndo_start_xmit = mlx4_en_xmit, |
2516 | .ndo_select_queue = mlx4_en_select_queue, | 2521 | .ndo_select_queue = mlx4_en_select_queue, |
2517 | .ndo_get_stats = mlx4_en_get_stats, | 2522 | .ndo_get_stats64 = mlx4_en_get_stats64, |
2518 | .ndo_set_rx_mode = mlx4_en_set_rx_mode, | 2523 | .ndo_set_rx_mode = mlx4_en_set_rx_mode, |
2519 | .ndo_set_mac_address = mlx4_en_set_mac, | 2524 | .ndo_set_mac_address = mlx4_en_set_mac, |
2520 | .ndo_validate_addr = eth_validate_addr, | 2525 | .ndo_validate_addr = eth_validate_addr, |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_port.c b/drivers/net/ethernet/mellanox/mlx4/en_port.c index 20b6c2e678b8..5aa8b751f417 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_port.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_port.c | |||
@@ -152,8 +152,9 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset) | |||
152 | struct mlx4_counter tmp_counter_stats; | 152 | struct mlx4_counter tmp_counter_stats; |
153 | struct mlx4_en_stat_out_mbox *mlx4_en_stats; | 153 | struct mlx4_en_stat_out_mbox *mlx4_en_stats; |
154 | struct mlx4_en_stat_out_flow_control_mbox *flowstats; | 154 | struct mlx4_en_stat_out_flow_control_mbox *flowstats; |
155 | struct mlx4_en_priv *priv = netdev_priv(mdev->pndev[port]); | 155 | struct net_device *dev = mdev->pndev[port]; |
156 | struct net_device_stats *stats = &priv->stats; | 156 | struct mlx4_en_priv *priv = netdev_priv(dev); |
157 | struct net_device_stats *stats = &dev->stats; | ||
157 | struct mlx4_cmd_mailbox *mailbox; | 158 | struct mlx4_cmd_mailbox *mailbox; |
158 | u64 in_mod = reset << 8 | port; | 159 | u64 in_mod = reset << 8 | port; |
159 | int err; | 160 | int err; |
@@ -188,6 +189,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset) | |||
188 | } | 189 | } |
189 | stats->tx_packets = 0; | 190 | stats->tx_packets = 0; |
190 | stats->tx_bytes = 0; | 191 | stats->tx_bytes = 0; |
192 | stats->tx_dropped = 0; | ||
191 | priv->port_stats.tx_chksum_offload = 0; | 193 | priv->port_stats.tx_chksum_offload = 0; |
192 | priv->port_stats.queue_stopped = 0; | 194 | priv->port_stats.queue_stopped = 0; |
193 | priv->port_stats.wake_queue = 0; | 195 | priv->port_stats.wake_queue = 0; |
@@ -199,6 +201,7 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset) | |||
199 | 201 | ||
200 | stats->tx_packets += ring->packets; | 202 | stats->tx_packets += ring->packets; |
201 | stats->tx_bytes += ring->bytes; | 203 | stats->tx_bytes += ring->bytes; |
204 | stats->tx_dropped += ring->tx_dropped; | ||
202 | priv->port_stats.tx_chksum_offload += ring->tx_csum; | 205 | priv->port_stats.tx_chksum_offload += ring->tx_csum; |
203 | priv->port_stats.queue_stopped += ring->queue_stopped; | 206 | priv->port_stats.queue_stopped += ring->queue_stopped; |
204 | priv->port_stats.wake_queue += ring->wake_queue; | 207 | priv->port_stats.wake_queue += ring->wake_queue; |
@@ -237,21 +240,12 @@ int mlx4_en_DUMP_ETH_STATS(struct mlx4_en_dev *mdev, u8 port, u8 reset) | |||
237 | stats->multicast = en_stats_adder(&mlx4_en_stats->MCAST_prio_0, | 240 | stats->multicast = en_stats_adder(&mlx4_en_stats->MCAST_prio_0, |
238 | &mlx4_en_stats->MCAST_prio_1, | 241 | &mlx4_en_stats->MCAST_prio_1, |
239 | NUM_PRIORITIES); | 242 | NUM_PRIORITIES); |
240 | stats->collisions = 0; | ||
241 | stats->rx_dropped = be32_to_cpu(mlx4_en_stats->RDROP) + | 243 | stats->rx_dropped = be32_to_cpu(mlx4_en_stats->RDROP) + |
242 | sw_rx_dropped; | 244 | sw_rx_dropped; |
243 | stats->rx_length_errors = be32_to_cpu(mlx4_en_stats->RdropLength); | 245 | stats->rx_length_errors = be32_to_cpu(mlx4_en_stats->RdropLength); |
244 | stats->rx_over_errors = 0; | ||
245 | stats->rx_crc_errors = be32_to_cpu(mlx4_en_stats->RCRC); | 246 | stats->rx_crc_errors = be32_to_cpu(mlx4_en_stats->RCRC); |
246 | stats->rx_frame_errors = 0; | ||
247 | stats->rx_fifo_errors = be32_to_cpu(mlx4_en_stats->RdropOvflw); | 247 | stats->rx_fifo_errors = be32_to_cpu(mlx4_en_stats->RdropOvflw); |
248 | stats->rx_missed_errors = 0; | 248 | stats->tx_dropped += be32_to_cpu(mlx4_en_stats->TDROP); |
249 | stats->tx_aborted_errors = 0; | ||
250 | stats->tx_carrier_errors = 0; | ||
251 | stats->tx_fifo_errors = 0; | ||
252 | stats->tx_heartbeat_errors = 0; | ||
253 | stats->tx_window_errors = 0; | ||
254 | stats->tx_dropped = be32_to_cpu(mlx4_en_stats->TDROP); | ||
255 | 249 | ||
256 | /* RX stats */ | 250 | /* RX stats */ |
257 | priv->pkstats.rx_multicast_packets = stats->multicast; | 251 | priv->pkstats.rx_multicast_packets = stats->multicast; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index f6e61570cb2c..76aa4d27183c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | |||
@@ -726,12 +726,12 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) | |||
726 | bool inline_ok; | 726 | bool inline_ok; |
727 | u32 ring_cons; | 727 | u32 ring_cons; |
728 | 728 | ||
729 | if (!priv->port_up) | ||
730 | goto tx_drop; | ||
731 | |||
732 | tx_ind = skb_get_queue_mapping(skb); | 729 | tx_ind = skb_get_queue_mapping(skb); |
733 | ring = priv->tx_ring[tx_ind]; | 730 | ring = priv->tx_ring[tx_ind]; |
734 | 731 | ||
732 | if (!priv->port_up) | ||
733 | goto tx_drop; | ||
734 | |||
735 | /* fetch ring->cons far ahead before needing it to avoid stall */ | 735 | /* fetch ring->cons far ahead before needing it to avoid stall */ |
736 | ring_cons = ACCESS_ONCE(ring->cons); | 736 | ring_cons = ACCESS_ONCE(ring->cons); |
737 | 737 | ||
@@ -1030,7 +1030,7 @@ tx_drop_unmap: | |||
1030 | 1030 | ||
1031 | tx_drop: | 1031 | tx_drop: |
1032 | dev_kfree_skb_any(skb); | 1032 | dev_kfree_skb_any(skb); |
1033 | priv->stats.tx_dropped++; | 1033 | ring->tx_dropped++; |
1034 | return NETDEV_TX_OK; | 1034 | return NETDEV_TX_OK; |
1035 | } | 1035 | } |
1036 | 1036 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index cc84e09f324a..467d47ed2c39 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | |||
@@ -270,6 +270,7 @@ struct mlx4_en_tx_ring { | |||
270 | unsigned long tx_csum; | 270 | unsigned long tx_csum; |
271 | unsigned long tso_packets; | 271 | unsigned long tso_packets; |
272 | unsigned long xmit_more; | 272 | unsigned long xmit_more; |
273 | unsigned int tx_dropped; | ||
273 | struct mlx4_bf bf; | 274 | struct mlx4_bf bf; |
274 | unsigned long queue_stopped; | 275 | unsigned long queue_stopped; |
275 | 276 | ||
@@ -482,8 +483,6 @@ struct mlx4_en_priv { | |||
482 | struct mlx4_en_port_profile *prof; | 483 | struct mlx4_en_port_profile *prof; |
483 | struct net_device *dev; | 484 | struct net_device *dev; |
484 | unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; | 485 | unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; |
485 | struct net_device_stats stats; | ||
486 | struct net_device_stats ret_stats; | ||
487 | struct mlx4_en_port_state port_state; | 486 | struct mlx4_en_port_state port_state; |
488 | spinlock_t stats_lock; | 487 | spinlock_t stats_lock; |
489 | struct ethtool_flow_id ethtool_rules[MAX_NUM_OF_FS_RULES]; | 488 | struct ethtool_flow_id ethtool_rules[MAX_NUM_OF_FS_RULES]; |
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dcbx.c b/drivers/net/ethernet/qlogic/qed/qed_dcbx.c index cbf58e1f9333..21ec1c2df2c7 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_dcbx.c +++ b/drivers/net/ethernet/qlogic/qed/qed_dcbx.c | |||
@@ -192,9 +192,10 @@ qed_dcbx_process_tlv(struct qed_hwfn *p_hwfn, | |||
192 | struct dcbx_app_priority_entry *p_tbl, | 192 | struct dcbx_app_priority_entry *p_tbl, |
193 | u32 pri_tc_tbl, int count, bool dcbx_enabled) | 193 | u32 pri_tc_tbl, int count, bool dcbx_enabled) |
194 | { | 194 | { |
195 | u8 tc, priority, priority_map; | 195 | u8 tc, priority_map; |
196 | enum dcbx_protocol_type type; | 196 | enum dcbx_protocol_type type; |
197 | u16 protocol_id; | 197 | u16 protocol_id; |
198 | int priority; | ||
198 | bool enable; | 199 | bool enable; |
199 | int i; | 200 | int i; |
200 | 201 | ||
@@ -221,7 +222,7 @@ qed_dcbx_process_tlv(struct qed_hwfn *p_hwfn, | |||
221 | * indication, but we only got here if there was an | 222 | * indication, but we only got here if there was an |
222 | * app tlv for the protocol, so dcbx must be enabled. | 223 | * app tlv for the protocol, so dcbx must be enabled. |
223 | */ | 224 | */ |
224 | enable = !!(type == DCBX_PROTOCOL_ETH); | 225 | enable = !(type == DCBX_PROTOCOL_ETH); |
225 | 226 | ||
226 | qed_dcbx_update_app_info(p_data, p_hwfn, enable, true, | 227 | qed_dcbx_update_app_info(p_data, p_hwfn, enable, true, |
227 | priority, tc, type); | 228 | priority, tc, type); |
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c index 089016f46f26..2d89e8c16b32 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_dev.c +++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c | |||
@@ -155,12 +155,14 @@ void qed_resc_free(struct qed_dev *cdev) | |||
155 | } | 155 | } |
156 | } | 156 | } |
157 | 157 | ||
158 | static int qed_init_qm_info(struct qed_hwfn *p_hwfn) | 158 | static int qed_init_qm_info(struct qed_hwfn *p_hwfn, bool b_sleepable) |
159 | { | 159 | { |
160 | u8 num_vports, vf_offset = 0, i, vport_id, num_ports, curr_queue = 0; | 160 | u8 num_vports, vf_offset = 0, i, vport_id, num_ports, curr_queue = 0; |
161 | struct qed_qm_info *qm_info = &p_hwfn->qm_info; | 161 | struct qed_qm_info *qm_info = &p_hwfn->qm_info; |
162 | struct init_qm_port_params *p_qm_port; | 162 | struct init_qm_port_params *p_qm_port; |
163 | u16 num_pqs, multi_cos_tcs = 1; | 163 | u16 num_pqs, multi_cos_tcs = 1; |
164 | u8 pf_wfq = qm_info->pf_wfq; | ||
165 | u32 pf_rl = qm_info->pf_rl; | ||
164 | u16 num_vfs = 0; | 166 | u16 num_vfs = 0; |
165 | 167 | ||
166 | #ifdef CONFIG_QED_SRIOV | 168 | #ifdef CONFIG_QED_SRIOV |
@@ -182,23 +184,28 @@ static int qed_init_qm_info(struct qed_hwfn *p_hwfn) | |||
182 | 184 | ||
183 | /* PQs will be arranged as follows: First per-TC PQ then pure-LB quete. | 185 | /* PQs will be arranged as follows: First per-TC PQ then pure-LB quete. |
184 | */ | 186 | */ |
185 | qm_info->qm_pq_params = kzalloc(sizeof(*qm_info->qm_pq_params) * | 187 | qm_info->qm_pq_params = kcalloc(num_pqs, |
186 | num_pqs, GFP_KERNEL); | 188 | sizeof(struct init_qm_pq_params), |
189 | b_sleepable ? GFP_KERNEL : GFP_ATOMIC); | ||
187 | if (!qm_info->qm_pq_params) | 190 | if (!qm_info->qm_pq_params) |
188 | goto alloc_err; | 191 | goto alloc_err; |
189 | 192 | ||
190 | qm_info->qm_vport_params = kzalloc(sizeof(*qm_info->qm_vport_params) * | 193 | qm_info->qm_vport_params = kcalloc(num_vports, |
191 | num_vports, GFP_KERNEL); | 194 | sizeof(struct init_qm_vport_params), |
195 | b_sleepable ? GFP_KERNEL | ||
196 | : GFP_ATOMIC); | ||
192 | if (!qm_info->qm_vport_params) | 197 | if (!qm_info->qm_vport_params) |
193 | goto alloc_err; | 198 | goto alloc_err; |
194 | 199 | ||
195 | qm_info->qm_port_params = kzalloc(sizeof(*qm_info->qm_port_params) * | 200 | qm_info->qm_port_params = kcalloc(MAX_NUM_PORTS, |
196 | MAX_NUM_PORTS, GFP_KERNEL); | 201 | sizeof(struct init_qm_port_params), |
202 | b_sleepable ? GFP_KERNEL | ||
203 | : GFP_ATOMIC); | ||
197 | if (!qm_info->qm_port_params) | 204 | if (!qm_info->qm_port_params) |
198 | goto alloc_err; | 205 | goto alloc_err; |
199 | 206 | ||
200 | qm_info->wfq_data = kcalloc(num_vports, sizeof(*qm_info->wfq_data), | 207 | qm_info->wfq_data = kcalloc(num_vports, sizeof(struct qed_wfq_data), |
201 | GFP_KERNEL); | 208 | b_sleepable ? GFP_KERNEL : GFP_ATOMIC); |
202 | if (!qm_info->wfq_data) | 209 | if (!qm_info->wfq_data) |
203 | goto alloc_err; | 210 | goto alloc_err; |
204 | 211 | ||
@@ -264,10 +271,10 @@ static int qed_init_qm_info(struct qed_hwfn *p_hwfn) | |||
264 | for (i = 0; i < qm_info->num_vports; i++) | 271 | for (i = 0; i < qm_info->num_vports; i++) |
265 | qm_info->qm_vport_params[i].vport_wfq = 1; | 272 | qm_info->qm_vport_params[i].vport_wfq = 1; |
266 | 273 | ||
267 | qm_info->pf_wfq = 0; | ||
268 | qm_info->pf_rl = 0; | ||
269 | qm_info->vport_rl_en = 1; | 274 | qm_info->vport_rl_en = 1; |
270 | qm_info->vport_wfq_en = 1; | 275 | qm_info->vport_wfq_en = 1; |
276 | qm_info->pf_rl = pf_rl; | ||
277 | qm_info->pf_wfq = pf_wfq; | ||
271 | 278 | ||
272 | return 0; | 279 | return 0; |
273 | 280 | ||
@@ -299,7 +306,7 @@ int qed_qm_reconf(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt) | |||
299 | qed_qm_info_free(p_hwfn); | 306 | qed_qm_info_free(p_hwfn); |
300 | 307 | ||
301 | /* initialize qed's qm data structure */ | 308 | /* initialize qed's qm data structure */ |
302 | rc = qed_init_qm_info(p_hwfn); | 309 | rc = qed_init_qm_info(p_hwfn, false); |
303 | if (rc) | 310 | if (rc) |
304 | return rc; | 311 | return rc; |
305 | 312 | ||
@@ -388,7 +395,7 @@ int qed_resc_alloc(struct qed_dev *cdev) | |||
388 | goto alloc_err; | 395 | goto alloc_err; |
389 | 396 | ||
390 | /* Prepare and process QM requirements */ | 397 | /* Prepare and process QM requirements */ |
391 | rc = qed_init_qm_info(p_hwfn); | 398 | rc = qed_init_qm_info(p_hwfn, true); |
392 | if (rc) | 399 | if (rc) |
393 | goto alloc_err; | 400 | goto alloc_err; |
394 | 401 | ||
@@ -581,7 +588,14 @@ static void qed_calc_hw_mode(struct qed_hwfn *p_hwfn) | |||
581 | 588 | ||
582 | hw_mode |= 1 << MODE_ASIC; | 589 | hw_mode |= 1 << MODE_ASIC; |
583 | 590 | ||
591 | if (p_hwfn->cdev->num_hwfns > 1) | ||
592 | hw_mode |= 1 << MODE_100G; | ||
593 | |||
584 | p_hwfn->hw_info.hw_mode = hw_mode; | 594 | p_hwfn->hw_info.hw_mode = hw_mode; |
595 | |||
596 | DP_VERBOSE(p_hwfn, (NETIF_MSG_PROBE | NETIF_MSG_IFUP), | ||
597 | "Configuring function for hw_mode: 0x%08x\n", | ||
598 | p_hwfn->hw_info.hw_mode); | ||
585 | } | 599 | } |
586 | 600 | ||
587 | /* Init run time data for all PFs on an engine. */ | 601 | /* Init run time data for all PFs on an engine. */ |
@@ -821,6 +835,11 @@ int qed_hw_init(struct qed_dev *cdev, | |||
821 | u32 load_code, param; | 835 | u32 load_code, param; |
822 | int rc, mfw_rc, i; | 836 | int rc, mfw_rc, i; |
823 | 837 | ||
838 | if ((int_mode == QED_INT_MODE_MSI) && (cdev->num_hwfns > 1)) { | ||
839 | DP_NOTICE(cdev, "MSI mode is not supported for CMT devices\n"); | ||
840 | return -EINVAL; | ||
841 | } | ||
842 | |||
824 | if (IS_PF(cdev)) { | 843 | if (IS_PF(cdev)) { |
825 | rc = qed_init_fw_data(cdev, bin_fw_data); | 844 | rc = qed_init_fw_data(cdev, bin_fw_data); |
826 | if (rc != 0) | 845 | if (rc != 0) |
@@ -2086,6 +2105,13 @@ void qed_configure_vp_wfq_on_link_change(struct qed_dev *cdev, u32 min_pf_rate) | |||
2086 | { | 2105 | { |
2087 | int i; | 2106 | int i; |
2088 | 2107 | ||
2108 | if (cdev->num_hwfns > 1) { | ||
2109 | DP_VERBOSE(cdev, | ||
2110 | NETIF_MSG_LINK, | ||
2111 | "WFQ configuration is not supported for this device\n"); | ||
2112 | return; | ||
2113 | } | ||
2114 | |||
2089 | for_each_hwfn(cdev, i) { | 2115 | for_each_hwfn(cdev, i) { |
2090 | struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; | 2116 | struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; |
2091 | 2117 | ||
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c index 8b22f87033ce..753064679bde 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_main.c +++ b/drivers/net/ethernet/qlogic/qed/qed_main.c | |||
@@ -413,15 +413,17 @@ static int qed_set_int_mode(struct qed_dev *cdev, bool force_mode) | |||
413 | /* Fallthrough */ | 413 | /* Fallthrough */ |
414 | 414 | ||
415 | case QED_INT_MODE_MSI: | 415 | case QED_INT_MODE_MSI: |
416 | rc = pci_enable_msi(cdev->pdev); | 416 | if (cdev->num_hwfns == 1) { |
417 | if (!rc) { | 417 | rc = pci_enable_msi(cdev->pdev); |
418 | int_params->out.int_mode = QED_INT_MODE_MSI; | 418 | if (!rc) { |
419 | goto out; | 419 | int_params->out.int_mode = QED_INT_MODE_MSI; |
420 | } | 420 | goto out; |
421 | } | ||
421 | 422 | ||
422 | DP_NOTICE(cdev, "Failed to enable MSI\n"); | 423 | DP_NOTICE(cdev, "Failed to enable MSI\n"); |
423 | if (force_mode) | 424 | if (force_mode) |
424 | goto out; | 425 | goto out; |
426 | } | ||
425 | /* Fallthrough */ | 427 | /* Fallthrough */ |
426 | 428 | ||
427 | case QED_INT_MODE_INTA: | 429 | case QED_INT_MODE_INTA: |
diff --git a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c index 1bc75358cbc4..ad3cae3b7243 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c +++ b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c | |||
@@ -230,7 +230,10 @@ static int qede_get_sset_count(struct net_device *dev, int stringset) | |||
230 | case ETH_SS_PRIV_FLAGS: | 230 | case ETH_SS_PRIV_FLAGS: |
231 | return QEDE_PRI_FLAG_LEN; | 231 | return QEDE_PRI_FLAG_LEN; |
232 | case ETH_SS_TEST: | 232 | case ETH_SS_TEST: |
233 | return QEDE_ETHTOOL_TEST_MAX; | 233 | if (!IS_VF(edev)) |
234 | return QEDE_ETHTOOL_TEST_MAX; | ||
235 | else | ||
236 | return 0; | ||
234 | default: | 237 | default: |
235 | DP_VERBOSE(edev, QED_MSG_DEBUG, | 238 | DP_VERBOSE(edev, QED_MSG_DEBUG, |
236 | "Unsupported stringset 0x%08x\n", stringset); | 239 | "Unsupported stringset 0x%08x\n", stringset); |
diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c index 337e839ca586..5d00d1404bfc 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_main.c +++ b/drivers/net/ethernet/qlogic/qede/qede_main.c | |||
@@ -1824,7 +1824,7 @@ static int qede_set_vf_rate(struct net_device *dev, int vfidx, | |||
1824 | { | 1824 | { |
1825 | struct qede_dev *edev = netdev_priv(dev); | 1825 | struct qede_dev *edev = netdev_priv(dev); |
1826 | 1826 | ||
1827 | return edev->ops->iov->set_rate(edev->cdev, vfidx, max_tx_rate, | 1827 | return edev->ops->iov->set_rate(edev->cdev, vfidx, min_tx_rate, |
1828 | max_tx_rate); | 1828 | max_tx_rate); |
1829 | } | 1829 | } |
1830 | 1830 | ||
@@ -2091,6 +2091,29 @@ static void qede_vlan_mark_nonconfigured(struct qede_dev *edev) | |||
2091 | edev->accept_any_vlan = false; | 2091 | edev->accept_any_vlan = false; |
2092 | } | 2092 | } |
2093 | 2093 | ||
2094 | int qede_set_features(struct net_device *dev, netdev_features_t features) | ||
2095 | { | ||
2096 | struct qede_dev *edev = netdev_priv(dev); | ||
2097 | netdev_features_t changes = features ^ dev->features; | ||
2098 | bool need_reload = false; | ||
2099 | |||
2100 | /* No action needed if hardware GRO is disabled during driver load */ | ||
2101 | if (changes & NETIF_F_GRO) { | ||
2102 | if (dev->features & NETIF_F_GRO) | ||
2103 | need_reload = !edev->gro_disable; | ||
2104 | else | ||
2105 | need_reload = edev->gro_disable; | ||
2106 | } | ||
2107 | |||
2108 | if (need_reload && netif_running(edev->ndev)) { | ||
2109 | dev->features = features; | ||
2110 | qede_reload(edev, NULL, NULL); | ||
2111 | return 1; | ||
2112 | } | ||
2113 | |||
2114 | return 0; | ||
2115 | } | ||
2116 | |||
2094 | #ifdef CONFIG_QEDE_VXLAN | 2117 | #ifdef CONFIG_QEDE_VXLAN |
2095 | static void qede_add_vxlan_port(struct net_device *dev, | 2118 | static void qede_add_vxlan_port(struct net_device *dev, |
2096 | sa_family_t sa_family, __be16 port) | 2119 | sa_family_t sa_family, __be16 port) |
@@ -2175,6 +2198,7 @@ static const struct net_device_ops qede_netdev_ops = { | |||
2175 | #endif | 2198 | #endif |
2176 | .ndo_vlan_rx_add_vid = qede_vlan_rx_add_vid, | 2199 | .ndo_vlan_rx_add_vid = qede_vlan_rx_add_vid, |
2177 | .ndo_vlan_rx_kill_vid = qede_vlan_rx_kill_vid, | 2200 | .ndo_vlan_rx_kill_vid = qede_vlan_rx_kill_vid, |
2201 | .ndo_set_features = qede_set_features, | ||
2178 | .ndo_get_stats64 = qede_get_stats64, | 2202 | .ndo_get_stats64 = qede_get_stats64, |
2179 | #ifdef CONFIG_QED_SRIOV | 2203 | #ifdef CONFIG_QED_SRIOV |
2180 | .ndo_set_vf_link_state = qede_set_vf_link_state, | 2204 | .ndo_set_vf_link_state = qede_set_vf_link_state, |
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/net/ethernet/qlogic/qlge/qlge_main.c index 83d72106471c..fd5d1c93b55b 100644 --- a/drivers/net/ethernet/qlogic/qlge/qlge_main.c +++ b/drivers/net/ethernet/qlogic/qlge/qlge_main.c | |||
@@ -4846,7 +4846,6 @@ static void ql_eeh_close(struct net_device *ndev) | |||
4846 | } | 4846 | } |
4847 | 4847 | ||
4848 | /* Disabling the timer */ | 4848 | /* Disabling the timer */ |
4849 | del_timer_sync(&qdev->timer); | ||
4850 | ql_cancel_all_work_sync(qdev); | 4849 | ql_cancel_all_work_sync(qdev); |
4851 | 4850 | ||
4852 | for (i = 0; i < qdev->rss_ring_count; i++) | 4851 | for (i = 0; i < qdev->rss_ring_count; i++) |
@@ -4873,6 +4872,7 @@ static pci_ers_result_t qlge_io_error_detected(struct pci_dev *pdev, | |||
4873 | return PCI_ERS_RESULT_CAN_RECOVER; | 4872 | return PCI_ERS_RESULT_CAN_RECOVER; |
4874 | case pci_channel_io_frozen: | 4873 | case pci_channel_io_frozen: |
4875 | netif_device_detach(ndev); | 4874 | netif_device_detach(ndev); |
4875 | del_timer_sync(&qdev->timer); | ||
4876 | if (netif_running(ndev)) | 4876 | if (netif_running(ndev)) |
4877 | ql_eeh_close(ndev); | 4877 | ql_eeh_close(ndev); |
4878 | pci_disable_device(pdev); | 4878 | pci_disable_device(pdev); |
@@ -4880,6 +4880,7 @@ static pci_ers_result_t qlge_io_error_detected(struct pci_dev *pdev, | |||
4880 | case pci_channel_io_perm_failure: | 4880 | case pci_channel_io_perm_failure: |
4881 | dev_err(&pdev->dev, | 4881 | dev_err(&pdev->dev, |
4882 | "%s: pci_channel_io_perm_failure.\n", __func__); | 4882 | "%s: pci_channel_io_perm_failure.\n", __func__); |
4883 | del_timer_sync(&qdev->timer); | ||
4883 | ql_eeh_close(ndev); | 4884 | ql_eeh_close(ndev); |
4884 | set_bit(QL_EEH_FATAL, &qdev->flags); | 4885 | set_bit(QL_EEH_FATAL, &qdev->flags); |
4885 | return PCI_ERS_RESULT_DISCONNECT; | 4886 | return PCI_ERS_RESULT_DISCONNECT; |
diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c index 1681084cc96f..1f309127457d 100644 --- a/drivers/net/ethernet/sfc/ef10.c +++ b/drivers/net/ethernet/sfc/ef10.c | |||
@@ -619,6 +619,17 @@ fail: | |||
619 | return rc; | 619 | return rc; |
620 | } | 620 | } |
621 | 621 | ||
622 | static void efx_ef10_forget_old_piobufs(struct efx_nic *efx) | ||
623 | { | ||
624 | struct efx_channel *channel; | ||
625 | struct efx_tx_queue *tx_queue; | ||
626 | |||
627 | /* All our existing PIO buffers went away */ | ||
628 | efx_for_each_channel(channel, efx) | ||
629 | efx_for_each_channel_tx_queue(tx_queue, channel) | ||
630 | tx_queue->piobuf = NULL; | ||
631 | } | ||
632 | |||
622 | #else /* !EFX_USE_PIO */ | 633 | #else /* !EFX_USE_PIO */ |
623 | 634 | ||
624 | static int efx_ef10_alloc_piobufs(struct efx_nic *efx, unsigned int n) | 635 | static int efx_ef10_alloc_piobufs(struct efx_nic *efx, unsigned int n) |
@@ -635,6 +646,10 @@ static void efx_ef10_free_piobufs(struct efx_nic *efx) | |||
635 | { | 646 | { |
636 | } | 647 | } |
637 | 648 | ||
649 | static void efx_ef10_forget_old_piobufs(struct efx_nic *efx) | ||
650 | { | ||
651 | } | ||
652 | |||
638 | #endif /* EFX_USE_PIO */ | 653 | #endif /* EFX_USE_PIO */ |
639 | 654 | ||
640 | static void efx_ef10_remove(struct efx_nic *efx) | 655 | static void efx_ef10_remove(struct efx_nic *efx) |
@@ -1018,6 +1033,7 @@ static void efx_ef10_reset_mc_allocations(struct efx_nic *efx) | |||
1018 | nic_data->must_realloc_vis = true; | 1033 | nic_data->must_realloc_vis = true; |
1019 | nic_data->must_restore_filters = true; | 1034 | nic_data->must_restore_filters = true; |
1020 | nic_data->must_restore_piobufs = true; | 1035 | nic_data->must_restore_piobufs = true; |
1036 | efx_ef10_forget_old_piobufs(efx); | ||
1021 | nic_data->rx_rss_context = EFX_EF10_RSS_CONTEXT_INVALID; | 1037 | nic_data->rx_rss_context = EFX_EF10_RSS_CONTEXT_INVALID; |
1022 | 1038 | ||
1023 | /* Driver-created vswitches and vports must be re-created */ | 1039 | /* Driver-created vswitches and vports must be re-created */ |
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c index 0705ec869487..097f363f1630 100644 --- a/drivers/net/ethernet/sfc/efx.c +++ b/drivers/net/ethernet/sfc/efx.c | |||
@@ -1726,14 +1726,33 @@ static int efx_probe_filters(struct efx_nic *efx) | |||
1726 | 1726 | ||
1727 | #ifdef CONFIG_RFS_ACCEL | 1727 | #ifdef CONFIG_RFS_ACCEL |
1728 | if (efx->type->offload_features & NETIF_F_NTUPLE) { | 1728 | if (efx->type->offload_features & NETIF_F_NTUPLE) { |
1729 | efx->rps_flow_id = kcalloc(efx->type->max_rx_ip_filters, | 1729 | struct efx_channel *channel; |
1730 | sizeof(*efx->rps_flow_id), | 1730 | int i, success = 1; |
1731 | GFP_KERNEL); | 1731 | |
1732 | if (!efx->rps_flow_id) { | 1732 | efx_for_each_channel(channel, efx) { |
1733 | channel->rps_flow_id = | ||
1734 | kcalloc(efx->type->max_rx_ip_filters, | ||
1735 | sizeof(*channel->rps_flow_id), | ||
1736 | GFP_KERNEL); | ||
1737 | if (!channel->rps_flow_id) | ||
1738 | success = 0; | ||
1739 | else | ||
1740 | for (i = 0; | ||
1741 | i < efx->type->max_rx_ip_filters; | ||
1742 | ++i) | ||
1743 | channel->rps_flow_id[i] = | ||
1744 | RPS_FLOW_ID_INVALID; | ||
1745 | } | ||
1746 | |||
1747 | if (!success) { | ||
1748 | efx_for_each_channel(channel, efx) | ||
1749 | kfree(channel->rps_flow_id); | ||
1733 | efx->type->filter_table_remove(efx); | 1750 | efx->type->filter_table_remove(efx); |
1734 | rc = -ENOMEM; | 1751 | rc = -ENOMEM; |
1735 | goto out_unlock; | 1752 | goto out_unlock; |
1736 | } | 1753 | } |
1754 | |||
1755 | efx->rps_expire_index = efx->rps_expire_channel = 0; | ||
1737 | } | 1756 | } |
1738 | #endif | 1757 | #endif |
1739 | out_unlock: | 1758 | out_unlock: |
@@ -1744,7 +1763,10 @@ out_unlock: | |||
1744 | static void efx_remove_filters(struct efx_nic *efx) | 1763 | static void efx_remove_filters(struct efx_nic *efx) |
1745 | { | 1764 | { |
1746 | #ifdef CONFIG_RFS_ACCEL | 1765 | #ifdef CONFIG_RFS_ACCEL |
1747 | kfree(efx->rps_flow_id); | 1766 | struct efx_channel *channel; |
1767 | |||
1768 | efx_for_each_channel(channel, efx) | ||
1769 | kfree(channel->rps_flow_id); | ||
1748 | #endif | 1770 | #endif |
1749 | down_write(&efx->filter_sem); | 1771 | down_write(&efx->filter_sem); |
1750 | efx->type->filter_table_remove(efx); | 1772 | efx->type->filter_table_remove(efx); |
diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h index 38c422321cda..d13ddf9703ff 100644 --- a/drivers/net/ethernet/sfc/net_driver.h +++ b/drivers/net/ethernet/sfc/net_driver.h | |||
@@ -403,6 +403,8 @@ enum efx_sync_events_state { | |||
403 | * @event_test_cpu: Last CPU to handle interrupt or test event for this channel | 403 | * @event_test_cpu: Last CPU to handle interrupt or test event for this channel |
404 | * @irq_count: Number of IRQs since last adaptive moderation decision | 404 | * @irq_count: Number of IRQs since last adaptive moderation decision |
405 | * @irq_mod_score: IRQ moderation score | 405 | * @irq_mod_score: IRQ moderation score |
406 | * @rps_flow_id: Flow IDs of filters allocated for accelerated RFS, | ||
407 | * indexed by filter ID | ||
406 | * @n_rx_tobe_disc: Count of RX_TOBE_DISC errors | 408 | * @n_rx_tobe_disc: Count of RX_TOBE_DISC errors |
407 | * @n_rx_ip_hdr_chksum_err: Count of RX IP header checksum errors | 409 | * @n_rx_ip_hdr_chksum_err: Count of RX IP header checksum errors |
408 | * @n_rx_tcp_udp_chksum_err: Count of RX TCP and UDP checksum errors | 410 | * @n_rx_tcp_udp_chksum_err: Count of RX TCP and UDP checksum errors |
@@ -446,6 +448,8 @@ struct efx_channel { | |||
446 | unsigned int irq_mod_score; | 448 | unsigned int irq_mod_score; |
447 | #ifdef CONFIG_RFS_ACCEL | 449 | #ifdef CONFIG_RFS_ACCEL |
448 | unsigned int rfs_filters_added; | 450 | unsigned int rfs_filters_added; |
451 | #define RPS_FLOW_ID_INVALID 0xFFFFFFFF | ||
452 | u32 *rps_flow_id; | ||
449 | #endif | 453 | #endif |
450 | 454 | ||
451 | unsigned n_rx_tobe_disc; | 455 | unsigned n_rx_tobe_disc; |
@@ -889,9 +893,9 @@ struct vfdi_status; | |||
889 | * @filter_sem: Filter table rw_semaphore, for freeing the table | 893 | * @filter_sem: Filter table rw_semaphore, for freeing the table |
890 | * @filter_lock: Filter table lock, for mere content changes | 894 | * @filter_lock: Filter table lock, for mere content changes |
891 | * @filter_state: Architecture-dependent filter table state | 895 | * @filter_state: Architecture-dependent filter table state |
892 | * @rps_flow_id: Flow IDs of filters allocated for accelerated RFS, | 896 | * @rps_expire_channel: Next channel to check for expiry |
893 | * indexed by filter ID | 897 | * @rps_expire_index: Next index to check for expiry in |
894 | * @rps_expire_index: Next index to check for expiry in @rps_flow_id | 898 | * @rps_expire_channel's @rps_flow_id |
895 | * @active_queues: Count of RX and TX queues that haven't been flushed and drained. | 899 | * @active_queues: Count of RX and TX queues that haven't been flushed and drained. |
896 | * @rxq_flush_pending: Count of number of receive queues that need to be flushed. | 900 | * @rxq_flush_pending: Count of number of receive queues that need to be flushed. |
897 | * Decremented when the efx_flush_rx_queue() is called. | 901 | * Decremented when the efx_flush_rx_queue() is called. |
@@ -1035,7 +1039,7 @@ struct efx_nic { | |||
1035 | spinlock_t filter_lock; | 1039 | spinlock_t filter_lock; |
1036 | void *filter_state; | 1040 | void *filter_state; |
1037 | #ifdef CONFIG_RFS_ACCEL | 1041 | #ifdef CONFIG_RFS_ACCEL |
1038 | u32 *rps_flow_id; | 1042 | unsigned int rps_expire_channel; |
1039 | unsigned int rps_expire_index; | 1043 | unsigned int rps_expire_index; |
1040 | #endif | 1044 | #endif |
1041 | 1045 | ||
diff --git a/drivers/net/ethernet/sfc/rx.c b/drivers/net/ethernet/sfc/rx.c index 8956995b2fe7..02b0b5272c14 100644 --- a/drivers/net/ethernet/sfc/rx.c +++ b/drivers/net/ethernet/sfc/rx.c | |||
@@ -842,33 +842,18 @@ int efx_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb, | |||
842 | struct efx_nic *efx = netdev_priv(net_dev); | 842 | struct efx_nic *efx = netdev_priv(net_dev); |
843 | struct efx_channel *channel; | 843 | struct efx_channel *channel; |
844 | struct efx_filter_spec spec; | 844 | struct efx_filter_spec spec; |
845 | const __be16 *ports; | 845 | struct flow_keys fk; |
846 | __be16 ether_type; | ||
847 | int nhoff; | ||
848 | int rc; | 846 | int rc; |
849 | 847 | ||
850 | /* The core RPS/RFS code has already parsed and validated | 848 | if (flow_id == RPS_FLOW_ID_INVALID) |
851 | * VLAN, IP and transport headers. We assume they are in the | 849 | return -EINVAL; |
852 | * header area. | ||
853 | */ | ||
854 | |||
855 | if (skb->protocol == htons(ETH_P_8021Q)) { | ||
856 | const struct vlan_hdr *vh = | ||
857 | (const struct vlan_hdr *)skb->data; | ||
858 | 850 | ||
859 | /* We can't filter on the IP 5-tuple and the vlan | 851 | if (!skb_flow_dissect_flow_keys(skb, &fk, 0)) |
860 | * together, so just strip the vlan header and filter | 852 | return -EPROTONOSUPPORT; |
861 | * on the IP part. | ||
862 | */ | ||
863 | EFX_BUG_ON_PARANOID(skb_headlen(skb) < sizeof(*vh)); | ||
864 | ether_type = vh->h_vlan_encapsulated_proto; | ||
865 | nhoff = sizeof(struct vlan_hdr); | ||
866 | } else { | ||
867 | ether_type = skb->protocol; | ||
868 | nhoff = 0; | ||
869 | } | ||
870 | 853 | ||
871 | if (ether_type != htons(ETH_P_IP) && ether_type != htons(ETH_P_IPV6)) | 854 | if (fk.basic.n_proto != htons(ETH_P_IP) && fk.basic.n_proto != htons(ETH_P_IPV6)) |
855 | return -EPROTONOSUPPORT; | ||
856 | if (fk.control.flags & FLOW_DIS_IS_FRAGMENT) | ||
872 | return -EPROTONOSUPPORT; | 857 | return -EPROTONOSUPPORT; |
873 | 858 | ||
874 | efx_filter_init_rx(&spec, EFX_FILTER_PRI_HINT, | 859 | efx_filter_init_rx(&spec, EFX_FILTER_PRI_HINT, |
@@ -878,56 +863,41 @@ int efx_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb, | |||
878 | EFX_FILTER_MATCH_ETHER_TYPE | EFX_FILTER_MATCH_IP_PROTO | | 863 | EFX_FILTER_MATCH_ETHER_TYPE | EFX_FILTER_MATCH_IP_PROTO | |
879 | EFX_FILTER_MATCH_LOC_HOST | EFX_FILTER_MATCH_LOC_PORT | | 864 | EFX_FILTER_MATCH_LOC_HOST | EFX_FILTER_MATCH_LOC_PORT | |
880 | EFX_FILTER_MATCH_REM_HOST | EFX_FILTER_MATCH_REM_PORT; | 865 | EFX_FILTER_MATCH_REM_HOST | EFX_FILTER_MATCH_REM_PORT; |
881 | spec.ether_type = ether_type; | 866 | spec.ether_type = fk.basic.n_proto; |
882 | 867 | spec.ip_proto = fk.basic.ip_proto; | |
883 | if (ether_type == htons(ETH_P_IP)) { | 868 | |
884 | const struct iphdr *ip = | 869 | if (fk.basic.n_proto == htons(ETH_P_IP)) { |
885 | (const struct iphdr *)(skb->data + nhoff); | 870 | spec.rem_host[0] = fk.addrs.v4addrs.src; |
886 | 871 | spec.loc_host[0] = fk.addrs.v4addrs.dst; | |
887 | EFX_BUG_ON_PARANOID(skb_headlen(skb) < nhoff + sizeof(*ip)); | ||
888 | if (ip_is_fragment(ip)) | ||
889 | return -EPROTONOSUPPORT; | ||
890 | spec.ip_proto = ip->protocol; | ||
891 | spec.rem_host[0] = ip->saddr; | ||
892 | spec.loc_host[0] = ip->daddr; | ||
893 | EFX_BUG_ON_PARANOID(skb_headlen(skb) < nhoff + 4 * ip->ihl + 4); | ||
894 | ports = (const __be16 *)(skb->data + nhoff + 4 * ip->ihl); | ||
895 | } else { | 872 | } else { |
896 | const struct ipv6hdr *ip6 = | 873 | memcpy(spec.rem_host, &fk.addrs.v6addrs.src, sizeof(struct in6_addr)); |
897 | (const struct ipv6hdr *)(skb->data + nhoff); | 874 | memcpy(spec.loc_host, &fk.addrs.v6addrs.dst, sizeof(struct in6_addr)); |
898 | |||
899 | EFX_BUG_ON_PARANOID(skb_headlen(skb) < | ||
900 | nhoff + sizeof(*ip6) + 4); | ||
901 | spec.ip_proto = ip6->nexthdr; | ||
902 | memcpy(spec.rem_host, &ip6->saddr, sizeof(ip6->saddr)); | ||
903 | memcpy(spec.loc_host, &ip6->daddr, sizeof(ip6->daddr)); | ||
904 | ports = (const __be16 *)(ip6 + 1); | ||
905 | } | 875 | } |
906 | 876 | ||
907 | spec.rem_port = ports[0]; | 877 | spec.rem_port = fk.ports.src; |
908 | spec.loc_port = ports[1]; | 878 | spec.loc_port = fk.ports.dst; |
909 | 879 | ||
910 | rc = efx->type->filter_rfs_insert(efx, &spec); | 880 | rc = efx->type->filter_rfs_insert(efx, &spec); |
911 | if (rc < 0) | 881 | if (rc < 0) |
912 | return rc; | 882 | return rc; |
913 | 883 | ||
914 | /* Remember this so we can check whether to expire the filter later */ | 884 | /* Remember this so we can check whether to expire the filter later */ |
915 | efx->rps_flow_id[rc] = flow_id; | 885 | channel = efx_get_channel(efx, rxq_index); |
916 | channel = efx_get_channel(efx, skb_get_rx_queue(skb)); | 886 | channel->rps_flow_id[rc] = flow_id; |
917 | ++channel->rfs_filters_added; | 887 | ++channel->rfs_filters_added; |
918 | 888 | ||
919 | if (ether_type == htons(ETH_P_IP)) | 889 | if (spec.ether_type == htons(ETH_P_IP)) |
920 | netif_info(efx, rx_status, efx->net_dev, | 890 | netif_info(efx, rx_status, efx->net_dev, |
921 | "steering %s %pI4:%u:%pI4:%u to queue %u [flow %u filter %d]\n", | 891 | "steering %s %pI4:%u:%pI4:%u to queue %u [flow %u filter %d]\n", |
922 | (spec.ip_proto == IPPROTO_TCP) ? "TCP" : "UDP", | 892 | (spec.ip_proto == IPPROTO_TCP) ? "TCP" : "UDP", |
923 | spec.rem_host, ntohs(ports[0]), spec.loc_host, | 893 | spec.rem_host, ntohs(spec.rem_port), spec.loc_host, |
924 | ntohs(ports[1]), rxq_index, flow_id, rc); | 894 | ntohs(spec.loc_port), rxq_index, flow_id, rc); |
925 | else | 895 | else |
926 | netif_info(efx, rx_status, efx->net_dev, | 896 | netif_info(efx, rx_status, efx->net_dev, |
927 | "steering %s [%pI6]:%u:[%pI6]:%u to queue %u [flow %u filter %d]\n", | 897 | "steering %s [%pI6]:%u:[%pI6]:%u to queue %u [flow %u filter %d]\n", |
928 | (spec.ip_proto == IPPROTO_TCP) ? "TCP" : "UDP", | 898 | (spec.ip_proto == IPPROTO_TCP) ? "TCP" : "UDP", |
929 | spec.rem_host, ntohs(ports[0]), spec.loc_host, | 899 | spec.rem_host, ntohs(spec.rem_port), spec.loc_host, |
930 | ntohs(ports[1]), rxq_index, flow_id, rc); | 900 | ntohs(spec.loc_port), rxq_index, flow_id, rc); |
931 | 901 | ||
932 | return rc; | 902 | return rc; |
933 | } | 903 | } |
@@ -935,24 +905,34 @@ int efx_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb, | |||
935 | bool __efx_filter_rfs_expire(struct efx_nic *efx, unsigned int quota) | 905 | bool __efx_filter_rfs_expire(struct efx_nic *efx, unsigned int quota) |
936 | { | 906 | { |
937 | bool (*expire_one)(struct efx_nic *efx, u32 flow_id, unsigned int index); | 907 | bool (*expire_one)(struct efx_nic *efx, u32 flow_id, unsigned int index); |
938 | unsigned int index, size; | 908 | unsigned int channel_idx, index, size; |
939 | u32 flow_id; | 909 | u32 flow_id; |
940 | 910 | ||
941 | if (!spin_trylock_bh(&efx->filter_lock)) | 911 | if (!spin_trylock_bh(&efx->filter_lock)) |
942 | return false; | 912 | return false; |
943 | 913 | ||
944 | expire_one = efx->type->filter_rfs_expire_one; | 914 | expire_one = efx->type->filter_rfs_expire_one; |
915 | channel_idx = efx->rps_expire_channel; | ||
945 | index = efx->rps_expire_index; | 916 | index = efx->rps_expire_index; |
946 | size = efx->type->max_rx_ip_filters; | 917 | size = efx->type->max_rx_ip_filters; |
947 | while (quota--) { | 918 | while (quota--) { |
948 | flow_id = efx->rps_flow_id[index]; | 919 | struct efx_channel *channel = efx_get_channel(efx, channel_idx); |
949 | if (expire_one(efx, flow_id, index)) | 920 | flow_id = channel->rps_flow_id[index]; |
921 | |||
922 | if (flow_id != RPS_FLOW_ID_INVALID && | ||
923 | expire_one(efx, flow_id, index)) { | ||
950 | netif_info(efx, rx_status, efx->net_dev, | 924 | netif_info(efx, rx_status, efx->net_dev, |
951 | "expired filter %d [flow %u]\n", | 925 | "expired filter %d [queue %u flow %u]\n", |
952 | index, flow_id); | 926 | index, channel_idx, flow_id); |
953 | if (++index == size) | 927 | channel->rps_flow_id[index] = RPS_FLOW_ID_INVALID; |
928 | } | ||
929 | if (++index == size) { | ||
930 | if (++channel_idx == efx->n_channels) | ||
931 | channel_idx = 0; | ||
954 | index = 0; | 932 | index = 0; |
933 | } | ||
955 | } | 934 | } |
935 | efx->rps_expire_channel = channel_idx; | ||
956 | efx->rps_expire_index = index; | 936 | efx->rps_expire_index = index; |
957 | 937 | ||
958 | spin_unlock_bh(&efx->filter_lock); | 938 | spin_unlock_bh(&efx->filter_lock); |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c index 3f83c369f56c..ec295851812b 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c | |||
@@ -297,7 +297,7 @@ int stmmac_mdio_register(struct net_device *ndev) | |||
297 | return -ENOMEM; | 297 | return -ENOMEM; |
298 | 298 | ||
299 | if (mdio_bus_data->irqs) | 299 | if (mdio_bus_data->irqs) |
300 | memcpy(new_bus->irq, mdio_bus_data, sizeof(new_bus->irq)); | 300 | memcpy(new_bus->irq, mdio_bus_data->irqs, sizeof(new_bus->irq)); |
301 | 301 | ||
302 | #ifdef CONFIG_OF | 302 | #ifdef CONFIG_OF |
303 | if (priv->device->of_node) | 303 | if (priv->device->of_node) |
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index a0f64cba86ba..2ace126533cd 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
@@ -990,7 +990,7 @@ static void team_port_disable(struct team *team, | |||
990 | #define TEAM_ENC_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \ | 990 | #define TEAM_ENC_FEATURES (NETIF_F_HW_CSUM | NETIF_F_SG | \ |
991 | NETIF_F_RXCSUM | NETIF_F_ALL_TSO) | 991 | NETIF_F_RXCSUM | NETIF_F_ALL_TSO) |
992 | 992 | ||
993 | static void __team_compute_features(struct team *team) | 993 | static void ___team_compute_features(struct team *team) |
994 | { | 994 | { |
995 | struct team_port *port; | 995 | struct team_port *port; |
996 | u32 vlan_features = TEAM_VLAN_FEATURES & NETIF_F_ALL_FOR_ALL; | 996 | u32 vlan_features = TEAM_VLAN_FEATURES & NETIF_F_ALL_FOR_ALL; |
@@ -1021,15 +1021,20 @@ static void __team_compute_features(struct team *team) | |||
1021 | team->dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; | 1021 | team->dev->priv_flags &= ~IFF_XMIT_DST_RELEASE; |
1022 | if (dst_release_flag == (IFF_XMIT_DST_RELEASE | IFF_XMIT_DST_RELEASE_PERM)) | 1022 | if (dst_release_flag == (IFF_XMIT_DST_RELEASE | IFF_XMIT_DST_RELEASE_PERM)) |
1023 | team->dev->priv_flags |= IFF_XMIT_DST_RELEASE; | 1023 | team->dev->priv_flags |= IFF_XMIT_DST_RELEASE; |
1024 | } | ||
1024 | 1025 | ||
1026 | static void __team_compute_features(struct team *team) | ||
1027 | { | ||
1028 | ___team_compute_features(team); | ||
1025 | netdev_change_features(team->dev); | 1029 | netdev_change_features(team->dev); |
1026 | } | 1030 | } |
1027 | 1031 | ||
1028 | static void team_compute_features(struct team *team) | 1032 | static void team_compute_features(struct team *team) |
1029 | { | 1033 | { |
1030 | mutex_lock(&team->lock); | 1034 | mutex_lock(&team->lock); |
1031 | __team_compute_features(team); | 1035 | ___team_compute_features(team); |
1032 | mutex_unlock(&team->lock); | 1036 | mutex_unlock(&team->lock); |
1037 | netdev_change_features(team->dev); | ||
1033 | } | 1038 | } |
1034 | 1039 | ||
1035 | static int team_port_enter(struct team *team, struct team_port *port) | 1040 | static int team_port_enter(struct team *team, struct team_port *port) |
diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c index 36cd7f016a8d..9bbe0161a2f4 100644 --- a/drivers/net/usb/pegasus.c +++ b/drivers/net/usb/pegasus.c | |||
@@ -473,7 +473,7 @@ static void read_bulk_callback(struct urb *urb) | |||
473 | goto goon; | 473 | goto goon; |
474 | } | 474 | } |
475 | 475 | ||
476 | if (!count || count < 4) | 476 | if (count < 4) |
477 | goto goon; | 477 | goto goon; |
478 | 478 | ||
479 | rx_status = buf[count - 2]; | 479 | rx_status = buf[count - 2]; |
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index d9d2806a47b1..dc989a8b5afb 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c | |||
@@ -61,6 +61,8 @@ | |||
61 | #define SUSPEND_ALLMODES (SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \ | 61 | #define SUSPEND_ALLMODES (SUSPEND_SUSPEND0 | SUSPEND_SUSPEND1 | \ |
62 | SUSPEND_SUSPEND2 | SUSPEND_SUSPEND3) | 62 | SUSPEND_SUSPEND2 | SUSPEND_SUSPEND3) |
63 | 63 | ||
64 | #define CARRIER_CHECK_DELAY (2 * HZ) | ||
65 | |||
64 | struct smsc95xx_priv { | 66 | struct smsc95xx_priv { |
65 | u32 mac_cr; | 67 | u32 mac_cr; |
66 | u32 hash_hi; | 68 | u32 hash_hi; |
@@ -69,6 +71,9 @@ struct smsc95xx_priv { | |||
69 | spinlock_t mac_cr_lock; | 71 | spinlock_t mac_cr_lock; |
70 | u8 features; | 72 | u8 features; |
71 | u8 suspend_flags; | 73 | u8 suspend_flags; |
74 | bool link_ok; | ||
75 | struct delayed_work carrier_check; | ||
76 | struct usbnet *dev; | ||
72 | }; | 77 | }; |
73 | 78 | ||
74 | static bool turbo_mode = true; | 79 | static bool turbo_mode = true; |
@@ -624,6 +629,44 @@ static void smsc95xx_status(struct usbnet *dev, struct urb *urb) | |||
624 | intdata); | 629 | intdata); |
625 | } | 630 | } |
626 | 631 | ||
632 | static void set_carrier(struct usbnet *dev, bool link) | ||
633 | { | ||
634 | struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); | ||
635 | |||
636 | if (pdata->link_ok == link) | ||
637 | return; | ||
638 | |||
639 | pdata->link_ok = link; | ||
640 | |||
641 | if (link) | ||
642 | usbnet_link_change(dev, 1, 0); | ||
643 | else | ||
644 | usbnet_link_change(dev, 0, 0); | ||
645 | } | ||
646 | |||
647 | static void check_carrier(struct work_struct *work) | ||
648 | { | ||
649 | struct smsc95xx_priv *pdata = container_of(work, struct smsc95xx_priv, | ||
650 | carrier_check.work); | ||
651 | struct usbnet *dev = pdata->dev; | ||
652 | int ret; | ||
653 | |||
654 | if (pdata->suspend_flags != 0) | ||
655 | return; | ||
656 | |||
657 | ret = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMSR); | ||
658 | if (ret < 0) { | ||
659 | netdev_warn(dev->net, "Failed to read MII_BMSR\n"); | ||
660 | return; | ||
661 | } | ||
662 | if (ret & BMSR_LSTATUS) | ||
663 | set_carrier(dev, 1); | ||
664 | else | ||
665 | set_carrier(dev, 0); | ||
666 | |||
667 | schedule_delayed_work(&pdata->carrier_check, CARRIER_CHECK_DELAY); | ||
668 | } | ||
669 | |||
627 | /* Enable or disable Tx & Rx checksum offload engines */ | 670 | /* Enable or disable Tx & Rx checksum offload engines */ |
628 | static int smsc95xx_set_features(struct net_device *netdev, | 671 | static int smsc95xx_set_features(struct net_device *netdev, |
629 | netdev_features_t features) | 672 | netdev_features_t features) |
@@ -1165,13 +1208,20 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf) | |||
1165 | dev->net->flags |= IFF_MULTICAST; | 1208 | dev->net->flags |= IFF_MULTICAST; |
1166 | dev->net->hard_header_len += SMSC95XX_TX_OVERHEAD_CSUM; | 1209 | dev->net->hard_header_len += SMSC95XX_TX_OVERHEAD_CSUM; |
1167 | dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len; | 1210 | dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len; |
1211 | |||
1212 | pdata->dev = dev; | ||
1213 | INIT_DELAYED_WORK(&pdata->carrier_check, check_carrier); | ||
1214 | schedule_delayed_work(&pdata->carrier_check, CARRIER_CHECK_DELAY); | ||
1215 | |||
1168 | return 0; | 1216 | return 0; |
1169 | } | 1217 | } |
1170 | 1218 | ||
1171 | static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf) | 1219 | static void smsc95xx_unbind(struct usbnet *dev, struct usb_interface *intf) |
1172 | { | 1220 | { |
1173 | struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); | 1221 | struct smsc95xx_priv *pdata = (struct smsc95xx_priv *)(dev->data[0]); |
1222 | |||
1174 | if (pdata) { | 1223 | if (pdata) { |
1224 | cancel_delayed_work(&pdata->carrier_check); | ||
1175 | netif_dbg(dev, ifdown, dev->net, "free pdata\n"); | 1225 | netif_dbg(dev, ifdown, dev->net, "free pdata\n"); |
1176 | kfree(pdata); | 1226 | kfree(pdata); |
1177 | pdata = NULL; | 1227 | pdata = NULL; |
@@ -1695,6 +1745,7 @@ static int smsc95xx_resume(struct usb_interface *intf) | |||
1695 | 1745 | ||
1696 | /* do this first to ensure it's cleared even in error case */ | 1746 | /* do this first to ensure it's cleared even in error case */ |
1697 | pdata->suspend_flags = 0; | 1747 | pdata->suspend_flags = 0; |
1748 | schedule_delayed_work(&pdata->carrier_check, CARRIER_CHECK_DELAY); | ||
1698 | 1749 | ||
1699 | if (suspend_flags & SUSPEND_ALLMODES) { | 1750 | if (suspend_flags & SUSPEND_ALLMODES) { |
1700 | /* clear wake-up sources */ | 1751 | /* clear wake-up sources */ |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 49d84e540343..e0638e556fe7 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -1925,24 +1925,11 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
1925 | 1925 | ||
1926 | virtio_device_ready(vdev); | 1926 | virtio_device_ready(vdev); |
1927 | 1927 | ||
1928 | /* Last of all, set up some receive buffers. */ | ||
1929 | for (i = 0; i < vi->curr_queue_pairs; i++) { | ||
1930 | try_fill_recv(vi, &vi->rq[i], GFP_KERNEL); | ||
1931 | |||
1932 | /* If we didn't even get one input buffer, we're useless. */ | ||
1933 | if (vi->rq[i].vq->num_free == | ||
1934 | virtqueue_get_vring_size(vi->rq[i].vq)) { | ||
1935 | free_unused_bufs(vi); | ||
1936 | err = -ENOMEM; | ||
1937 | goto free_recv_bufs; | ||
1938 | } | ||
1939 | } | ||
1940 | |||
1941 | vi->nb.notifier_call = &virtnet_cpu_callback; | 1928 | vi->nb.notifier_call = &virtnet_cpu_callback; |
1942 | err = register_hotcpu_notifier(&vi->nb); | 1929 | err = register_hotcpu_notifier(&vi->nb); |
1943 | if (err) { | 1930 | if (err) { |
1944 | pr_debug("virtio_net: registering cpu notifier failed\n"); | 1931 | pr_debug("virtio_net: registering cpu notifier failed\n"); |
1945 | goto free_recv_bufs; | 1932 | goto free_unregister_netdev; |
1946 | } | 1933 | } |
1947 | 1934 | ||
1948 | /* Assume link up if device can't report link status, | 1935 | /* Assume link up if device can't report link status, |
@@ -1960,10 +1947,9 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
1960 | 1947 | ||
1961 | return 0; | 1948 | return 0; |
1962 | 1949 | ||
1963 | free_recv_bufs: | 1950 | free_unregister_netdev: |
1964 | vi->vdev->config->reset(vdev); | 1951 | vi->vdev->config->reset(vdev); |
1965 | 1952 | ||
1966 | free_receive_bufs(vi); | ||
1967 | unregister_netdev(dev); | 1953 | unregister_netdev(dev); |
1968 | free_vqs: | 1954 | free_vqs: |
1969 | cancel_delayed_work_sync(&vi->refill); | 1955 | cancel_delayed_work_sync(&vi->refill); |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 8ff30c3bdfce..f999db2f97b4 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -3086,6 +3086,9 @@ static int vxlan_newlink(struct net *src_net, struct net_device *dev, | |||
3086 | if (data[IFLA_VXLAN_REMCSUM_NOPARTIAL]) | 3086 | if (data[IFLA_VXLAN_REMCSUM_NOPARTIAL]) |
3087 | conf.flags |= VXLAN_F_REMCSUM_NOPARTIAL; | 3087 | conf.flags |= VXLAN_F_REMCSUM_NOPARTIAL; |
3088 | 3088 | ||
3089 | if (tb[IFLA_MTU]) | ||
3090 | conf.mtu = nla_get_u32(tb[IFLA_MTU]); | ||
3091 | |||
3089 | err = vxlan_dev_configure(src_net, dev, &conf); | 3092 | err = vxlan_dev_configure(src_net, dev, &conf); |
3090 | switch (err) { | 3093 | switch (err) { |
3091 | case -ENODEV: | 3094 | case -ENODEV: |
diff --git a/drivers/ptp/ptp_chardev.c b/drivers/ptp/ptp_chardev.c index 579fd65299a0..d637c933c8a9 100644 --- a/drivers/ptp/ptp_chardev.c +++ b/drivers/ptp/ptp_chardev.c | |||
@@ -208,14 +208,10 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg) | |||
208 | break; | 208 | break; |
209 | 209 | ||
210 | case PTP_SYS_OFFSET: | 210 | case PTP_SYS_OFFSET: |
211 | sysoff = kmalloc(sizeof(*sysoff), GFP_KERNEL); | 211 | sysoff = memdup_user((void __user *)arg, sizeof(*sysoff)); |
212 | if (!sysoff) { | 212 | if (IS_ERR(sysoff)) { |
213 | err = -ENOMEM; | 213 | err = PTR_ERR(sysoff); |
214 | break; | 214 | sysoff = NULL; |
215 | } | ||
216 | if (copy_from_user(sysoff, (void __user *)arg, | ||
217 | sizeof(*sysoff))) { | ||
218 | err = -EFAULT; | ||
219 | break; | 215 | break; |
220 | } | 216 | } |
221 | if (sysoff->n_samples > PTP_MAX_SAMPLES) { | 217 | if (sysoff->n_samples > PTP_MAX_SAMPLES) { |