Skip to content

Commit 739cb49

Browse files
committed
Merge branch '1GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
Tony Nguyen says: ==================== Intel Wired LAN Driver Updates 2023-03-16 (igb, igbvf, igc) This series contains updates to igb, igbvf, and igc drivers. Lin Ma removes rtnl_lock() when disabling SRIOV on remove which was causing deadlock on igb. Akihiko Odaki delays enabling of SRIOV on igb to prevent early messages that could get ignored and clears MAC address when PF returns nack on reset; indicating no MAC address was assigned for igbvf. Gaosheng Cui frees IRQs in error path for igbvf. Akashi Takahiro fixes logic on checking TAPRIO gate support for igc. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents e8d20c3 + 2b4cc3d commit 739cb49

File tree

4 files changed

+84
-94
lines changed

4 files changed

+84
-94
lines changed

drivers/net/ethernet/intel/igb/igb_main.c

Lines changed: 58 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ static void igb_free_all_rx_resources(struct igb_adapter *);
109109
static void igb_setup_mrqc(struct igb_adapter *);
110110
static int igb_probe(struct pci_dev *, const struct pci_device_id *);
111111
static void igb_remove(struct pci_dev *pdev);
112+
static void igb_init_queue_configuration(struct igb_adapter *adapter);
112113
static int igb_sw_init(struct igb_adapter *);
113114
int igb_open(struct net_device *);
114115
int igb_close(struct net_device *);
@@ -175,9 +176,7 @@ static void igb_nfc_filter_restore(struct igb_adapter *adapter);
175176

176177
#ifdef CONFIG_PCI_IOV
177178
static int igb_vf_configure(struct igb_adapter *adapter, int vf);
178-
static int igb_pci_enable_sriov(struct pci_dev *dev, int num_vfs);
179-
static int igb_disable_sriov(struct pci_dev *dev);
180-
static int igb_pci_disable_sriov(struct pci_dev *dev);
179+
static int igb_disable_sriov(struct pci_dev *dev, bool reinit);
181180
#endif
182181

183182
static int igb_suspend(struct device *);
@@ -3665,7 +3664,7 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
36653664
kfree(adapter->shadow_vfta);
36663665
igb_clear_interrupt_scheme(adapter);
36673666
#ifdef CONFIG_PCI_IOV
3668-
igb_disable_sriov(pdev);
3667+
igb_disable_sriov(pdev, false);
36693668
#endif
36703669
pci_iounmap(pdev, adapter->io_addr);
36713670
err_ioremap:
@@ -3679,7 +3678,38 @@ static int igb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
36793678
}
36803679

36813680
#ifdef CONFIG_PCI_IOV
3682-
static int igb_disable_sriov(struct pci_dev *pdev)
3681+
static int igb_sriov_reinit(struct pci_dev *dev)
3682+
{
3683+
struct net_device *netdev = pci_get_drvdata(dev);
3684+
struct igb_adapter *adapter = netdev_priv(netdev);
3685+
struct pci_dev *pdev = adapter->pdev;
3686+
3687+
rtnl_lock();
3688+
3689+
if (netif_running(netdev))
3690+
igb_close(netdev);
3691+
else
3692+
igb_reset(adapter);
3693+
3694+
igb_clear_interrupt_scheme(adapter);
3695+
3696+
igb_init_queue_configuration(adapter);
3697+
3698+
if (igb_init_interrupt_scheme(adapter, true)) {
3699+
rtnl_unlock();
3700+
dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
3701+
return -ENOMEM;
3702+
}
3703+
3704+
if (netif_running(netdev))
3705+
igb_open(netdev);
3706+
3707+
rtnl_unlock();
3708+
3709+
return 0;
3710+
}
3711+
3712+
static int igb_disable_sriov(struct pci_dev *pdev, bool reinit)
36833713
{
36843714
struct net_device *netdev = pci_get_drvdata(pdev);
36853715
struct igb_adapter *adapter = netdev_priv(netdev);
@@ -3713,10 +3743,10 @@ static int igb_disable_sriov(struct pci_dev *pdev)
37133743
adapter->flags |= IGB_FLAG_DMAC;
37143744
}
37153745

3716-
return 0;
3746+
return reinit ? igb_sriov_reinit(pdev) : 0;
37173747
}
37183748

3719-
static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)
3749+
static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs, bool reinit)
37203750
{
37213751
struct net_device *netdev = pci_get_drvdata(pdev);
37223752
struct igb_adapter *adapter = netdev_priv(netdev);
@@ -3781,19 +3811,24 @@ static int igb_enable_sriov(struct pci_dev *pdev, int num_vfs)
37813811
"Unable to allocate memory for VF MAC filter list\n");
37823812
}
37833813

3784-
/* only call pci_enable_sriov() if no VFs are allocated already */
3785-
if (!old_vfs) {
3786-
err = pci_enable_sriov(pdev, adapter->vfs_allocated_count);
3787-
if (err)
3788-
goto err_out;
3789-
}
37903814
dev_info(&pdev->dev, "%d VFs allocated\n",
37913815
adapter->vfs_allocated_count);
37923816
for (i = 0; i < adapter->vfs_allocated_count; i++)
37933817
igb_vf_configure(adapter, i);
37943818

37953819
/* DMA Coalescing is not supported in IOV mode. */
37963820
adapter->flags &= ~IGB_FLAG_DMAC;
3821+
3822+
if (reinit) {
3823+
err = igb_sriov_reinit(pdev);
3824+
if (err)
3825+
goto err_out;
3826+
}
3827+
3828+
/* only call pci_enable_sriov() if no VFs are allocated already */
3829+
if (!old_vfs)
3830+
err = pci_enable_sriov(pdev, adapter->vfs_allocated_count);
3831+
37973832
goto out;
37983833

37993834
err_out:
@@ -3863,9 +3898,7 @@ static void igb_remove(struct pci_dev *pdev)
38633898
igb_release_hw_control(adapter);
38643899

38653900
#ifdef CONFIG_PCI_IOV
3866-
rtnl_lock();
3867-
igb_disable_sriov(pdev);
3868-
rtnl_unlock();
3901+
igb_disable_sriov(pdev, false);
38693902
#endif
38703903

38713904
unregister_netdev(netdev);
@@ -3911,7 +3944,7 @@ static void igb_probe_vfs(struct igb_adapter *adapter)
39113944
igb_reset_interrupt_capability(adapter);
39123945

39133946
pci_sriov_set_totalvfs(pdev, 7);
3914-
igb_enable_sriov(pdev, max_vfs);
3947+
igb_enable_sriov(pdev, max_vfs, false);
39153948

39163949
#endif /* CONFIG_PCI_IOV */
39173950
}
@@ -9520,71 +9553,17 @@ static void igb_shutdown(struct pci_dev *pdev)
95209553
}
95219554
}
95229555

9523-
#ifdef CONFIG_PCI_IOV
9524-
static int igb_sriov_reinit(struct pci_dev *dev)
9525-
{
9526-
struct net_device *netdev = pci_get_drvdata(dev);
9527-
struct igb_adapter *adapter = netdev_priv(netdev);
9528-
struct pci_dev *pdev = adapter->pdev;
9529-
9530-
rtnl_lock();
9531-
9532-
if (netif_running(netdev))
9533-
igb_close(netdev);
9534-
else
9535-
igb_reset(adapter);
9536-
9537-
igb_clear_interrupt_scheme(adapter);
9538-
9539-
igb_init_queue_configuration(adapter);
9540-
9541-
if (igb_init_interrupt_scheme(adapter, true)) {
9542-
rtnl_unlock();
9543-
dev_err(&pdev->dev, "Unable to allocate memory for queues\n");
9544-
return -ENOMEM;
9545-
}
9546-
9547-
if (netif_running(netdev))
9548-
igb_open(netdev);
9549-
9550-
rtnl_unlock();
9551-
9552-
return 0;
9553-
}
9554-
9555-
static int igb_pci_disable_sriov(struct pci_dev *dev)
9556-
{
9557-
int err = igb_disable_sriov(dev);
9558-
9559-
if (!err)
9560-
err = igb_sriov_reinit(dev);
9561-
9562-
return err;
9563-
}
9564-
9565-
static int igb_pci_enable_sriov(struct pci_dev *dev, int num_vfs)
9566-
{
9567-
int err = igb_enable_sriov(dev, num_vfs);
9568-
9569-
if (err)
9570-
goto out;
9571-
9572-
err = igb_sriov_reinit(dev);
9573-
if (!err)
9574-
return num_vfs;
9575-
9576-
out:
9577-
return err;
9578-
}
9579-
9580-
#endif
95819556
static int igb_pci_sriov_configure(struct pci_dev *dev, int num_vfs)
95829557
{
95839558
#ifdef CONFIG_PCI_IOV
9584-
if (num_vfs == 0)
9585-
return igb_pci_disable_sriov(dev);
9586-
else
9587-
return igb_pci_enable_sriov(dev, num_vfs);
9559+
int err;
9560+
9561+
if (num_vfs == 0) {
9562+
return igb_disable_sriov(dev, true);
9563+
} else {
9564+
err = igb_enable_sriov(dev, num_vfs, true);
9565+
return err ? err : num_vfs;
9566+
}
95889567
#endif
95899568
return 0;
95909569
}

drivers/net/ethernet/intel/igbvf/netdev.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,7 +1074,7 @@ static int igbvf_request_msix(struct igbvf_adapter *adapter)
10741074
igbvf_intr_msix_rx, 0, adapter->rx_ring->name,
10751075
netdev);
10761076
if (err)
1077-
goto out;
1077+
goto free_irq_tx;
10781078

10791079
adapter->rx_ring->itr_register = E1000_EITR(vector);
10801080
adapter->rx_ring->itr_val = adapter->current_itr;
@@ -1083,10 +1083,14 @@ static int igbvf_request_msix(struct igbvf_adapter *adapter)
10831083
err = request_irq(adapter->msix_entries[vector].vector,
10841084
igbvf_msix_other, 0, netdev->name, netdev);
10851085
if (err)
1086-
goto out;
1086+
goto free_irq_rx;
10871087

10881088
igbvf_configure_msix(adapter);
10891089
return 0;
1090+
free_irq_rx:
1091+
free_irq(adapter->msix_entries[--vector].vector, netdev);
1092+
free_irq_tx:
1093+
free_irq(adapter->msix_entries[--vector].vector, netdev);
10901094
out:
10911095
return err;
10921096
}

drivers/net/ethernet/intel/igbvf/vf.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// SPDX-License-Identifier: GPL-2.0
22
/* Copyright(c) 2009 - 2018 Intel Corporation. */
33

4+
#include <linux/etherdevice.h>
5+
46
#include "vf.h"
57

68
static s32 e1000_check_for_link_vf(struct e1000_hw *hw);
@@ -131,11 +133,16 @@ static s32 e1000_reset_hw_vf(struct e1000_hw *hw)
131133
/* set our "perm_addr" based on info provided by PF */
132134
ret_val = mbx->ops.read_posted(hw, msgbuf, 3);
133135
if (!ret_val) {
134-
if (msgbuf[0] == (E1000_VF_RESET |
135-
E1000_VT_MSGTYPE_ACK))
136+
switch (msgbuf[0]) {
137+
case E1000_VF_RESET | E1000_VT_MSGTYPE_ACK:
136138
memcpy(hw->mac.perm_addr, addr, ETH_ALEN);
137-
else
139+
break;
140+
case E1000_VF_RESET | E1000_VT_MSGTYPE_NACK:
141+
eth_zero_addr(hw->mac.perm_addr);
142+
break;
143+
default:
138144
ret_val = -E1000_ERR_MAC_INIT;
145+
}
139146
}
140147
}
141148

drivers/net/ethernet/intel/igc/igc_main.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6010,18 +6010,18 @@ static bool validate_schedule(struct igc_adapter *adapter,
60106010
if (e->command != TC_TAPRIO_CMD_SET_GATES)
60116011
return false;
60126012

6013-
for (i = 0; i < adapter->num_tx_queues; i++) {
6014-
if (e->gate_mask & BIT(i))
6013+
for (i = 0; i < adapter->num_tx_queues; i++)
6014+
if (e->gate_mask & BIT(i)) {
60156015
queue_uses[i]++;
60166016

6017-
/* There are limitations: A single queue cannot be
6018-
* opened and closed multiple times per cycle unless the
6019-
* gate stays open. Check for it.
6020-
*/
6021-
if (queue_uses[i] > 1 &&
6022-
!(prev->gate_mask & BIT(i)))
6023-
return false;
6024-
}
6017+
/* There are limitations: A single queue cannot
6018+
* be opened and closed multiple times per cycle
6019+
* unless the gate stays open. Check for it.
6020+
*/
6021+
if (queue_uses[i] > 1 &&
6022+
!(prev->gate_mask & BIT(i)))
6023+
return false;
6024+
}
60256025
}
60266026

60276027
return true;

0 commit comments

Comments
 (0)