|
@@ -159,13 +159,30 @@ static void fm10k_reinit(struct fm10k_intfc *interface)
|
|
|
|
|
|
fm10k_mbx_free_irq(interface);
|
|
|
|
|
|
+ /* free interrupts */
|
|
|
+ fm10k_clear_queueing_scheme(interface);
|
|
|
+
|
|
|
/* delay any future reset requests */
|
|
|
interface->last_reset = jiffies + (10 * HZ);
|
|
|
|
|
|
/* reset and initialize the hardware so it is in a known state */
|
|
|
- err = hw->mac.ops.reset_hw(hw) ? : hw->mac.ops.init_hw(hw);
|
|
|
- if (err)
|
|
|
+ err = hw->mac.ops.reset_hw(hw);
|
|
|
+ if (err) {
|
|
|
+ dev_err(&interface->pdev->dev, "reset_hw failed: %d\n", err);
|
|
|
+ goto reinit_err;
|
|
|
+ }
|
|
|
+
|
|
|
+ err = hw->mac.ops.init_hw(hw);
|
|
|
+ if (err) {
|
|
|
dev_err(&interface->pdev->dev, "init_hw failed: %d\n", err);
|
|
|
+ goto reinit_err;
|
|
|
+ }
|
|
|
+
|
|
|
+ err = fm10k_init_queueing_scheme(interface);
|
|
|
+ if (err) {
|
|
|
+ dev_err(&interface->pdev->dev, "init_queueing_scheme failed: %d\n", err);
|
|
|
+ goto reinit_err;
|
|
|
+ }
|
|
|
|
|
|
/* reassociate interrupts */
|
|
|
fm10k_mbx_request_irq(interface);
|
|
@@ -193,6 +210,10 @@ static void fm10k_reinit(struct fm10k_intfc *interface)
|
|
|
|
|
|
fm10k_iov_resume(interface->pdev);
|
|
|
|
|
|
+reinit_err:
|
|
|
+ if (err)
|
|
|
+ netif_device_detach(netdev);
|
|
|
+
|
|
|
rtnl_unlock();
|
|
|
|
|
|
clear_bit(__FM10K_RESETTING, &interface->state);
|
|
@@ -563,7 +584,7 @@ static void fm10k_configure_tx_ring(struct fm10k_intfc *interface,
|
|
|
/* store tail pointer */
|
|
|
ring->tail = &interface->uc_addr[FM10K_TDT(reg_idx)];
|
|
|
|
|
|
- /* reset ntu and ntc to place SW in sync with hardwdare */
|
|
|
+ /* reset ntu and ntc to place SW in sync with hardware */
|
|
|
ring->next_to_clean = 0;
|
|
|
ring->next_to_use = 0;
|
|
|
|
|
@@ -669,7 +690,7 @@ static void fm10k_configure_rx_ring(struct fm10k_intfc *interface,
|
|
|
/* store tail pointer */
|
|
|
ring->tail = &interface->uc_addr[FM10K_RDT(reg_idx)];
|
|
|
|
|
|
- /* reset ntu and ntc to place SW in sync with hardwdare */
|
|
|
+ /* reset ntu and ntc to place SW in sync with hardware */
|
|
|
ring->next_to_clean = 0;
|
|
|
ring->next_to_use = 0;
|
|
|
ring->next_to_alloc = 0;
|
|
@@ -859,7 +880,8 @@ static irqreturn_t fm10k_msix_mbx_vf(int __always_unused irq, void *data)
|
|
|
|
|
|
/* re-enable mailbox interrupt and indicate 20us delay */
|
|
|
fm10k_write_reg(hw, FM10K_VFITR(FM10K_MBX_VECTOR),
|
|
|
- FM10K_ITR_ENABLE | FM10K_MBX_INT_DELAY);
|
|
|
+ FM10K_ITR_ENABLE | (FM10K_MBX_INT_DELAY >>
|
|
|
+ hw->mac.itr_scale));
|
|
|
|
|
|
/* service upstream mailbox */
|
|
|
if (fm10k_mbx_trylock(interface)) {
|
|
@@ -1090,7 +1112,8 @@ static irqreturn_t fm10k_msix_mbx_pf(int __always_unused irq, void *data)
|
|
|
|
|
|
/* re-enable mailbox interrupt and indicate 20us delay */
|
|
|
fm10k_write_reg(hw, FM10K_ITR(FM10K_MBX_VECTOR),
|
|
|
- FM10K_ITR_ENABLE | FM10K_MBX_INT_DELAY);
|
|
|
+ FM10K_ITR_ENABLE | (FM10K_MBX_INT_DELAY >>
|
|
|
+ hw->mac.itr_scale));
|
|
|
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
@@ -1684,7 +1707,13 @@ static int fm10k_sw_init(struct fm10k_intfc *interface,
|
|
|
interface->last_reset = jiffies + (10 * HZ);
|
|
|
|
|
|
/* reset and initialize the hardware so it is in a known state */
|
|
|
- err = hw->mac.ops.reset_hw(hw) ? : hw->mac.ops.init_hw(hw);
|
|
|
+ err = hw->mac.ops.reset_hw(hw);
|
|
|
+ if (err) {
|
|
|
+ dev_err(&pdev->dev, "reset_hw failed: %d\n", err);
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ err = hw->mac.ops.init_hw(hw);
|
|
|
if (err) {
|
|
|
dev_err(&pdev->dev, "init_hw failed: %d\n", err);
|
|
|
return err;
|
|
@@ -1722,13 +1751,6 @@ static int fm10k_sw_init(struct fm10k_intfc *interface,
|
|
|
pci_resource_len(pdev, 4));
|
|
|
hw->sw_addr = interface->sw_addr;
|
|
|
|
|
|
- /* Only the PF can support VXLAN and NVGRE offloads */
|
|
|
- if (hw->mac.type != fm10k_mac_pf) {
|
|
|
- netdev->hw_enc_features = 0;
|
|
|
- netdev->features &= ~NETIF_F_GSO_UDP_TUNNEL;
|
|
|
- netdev->hw_features &= ~NETIF_F_GSO_UDP_TUNNEL;
|
|
|
- }
|
|
|
-
|
|
|
/* initialize DCBNL interface */
|
|
|
fm10k_dcbnl_set_ops(netdev);
|
|
|
|
|
@@ -1749,8 +1771,8 @@ static int fm10k_sw_init(struct fm10k_intfc *interface,
|
|
|
interface->rx_ring_count = FM10K_DEFAULT_RXD;
|
|
|
|
|
|
/* set default interrupt moderation */
|
|
|
- interface->tx_itr = FM10K_ITR_10K;
|
|
|
- interface->rx_itr = FM10K_ITR_ADAPTIVE | FM10K_ITR_20K;
|
|
|
+ interface->tx_itr = FM10K_TX_ITR_DEFAULT;
|
|
|
+ interface->rx_itr = FM10K_ITR_ADAPTIVE | FM10K_RX_ITR_DEFAULT;
|
|
|
|
|
|
/* initialize vxlan_port list */
|
|
|
INIT_LIST_HEAD(&interface->vxlan_port);
|
|
@@ -1894,7 +1916,7 @@ static int fm10k_probe(struct pci_dev *pdev,
|
|
|
pci_set_master(pdev);
|
|
|
pci_save_state(pdev);
|
|
|
|
|
|
- netdev = fm10k_alloc_netdev();
|
|
|
+ netdev = fm10k_alloc_netdev(fm10k_info_tbl[ent->driver_data]);
|
|
|
if (!netdev) {
|
|
|
err = -ENOMEM;
|
|
|
goto err_alloc_netdev;
|
|
@@ -2071,8 +2093,10 @@ static int fm10k_resume(struct pci_dev *pdev)
|
|
|
|
|
|
/* reset hardware to known state */
|
|
|
err = hw->mac.ops.init_hw(&interface->hw);
|
|
|
- if (err)
|
|
|
+ if (err) {
|
|
|
+ dev_err(&pdev->dev, "init_hw failed: %d\n", err);
|
|
|
return err;
|
|
|
+ }
|
|
|
|
|
|
/* reset statistics starting values */
|
|
|
hw->mac.ops.rebind_hw_stats(hw, &interface->stats);
|
|
@@ -2185,6 +2209,9 @@ static pci_ers_result_t fm10k_io_error_detected(struct pci_dev *pdev,
|
|
|
if (netif_running(netdev))
|
|
|
fm10k_close(netdev);
|
|
|
|
|
|
+ /* free interrupts */
|
|
|
+ fm10k_clear_queueing_scheme(interface);
|
|
|
+
|
|
|
fm10k_mbx_free_irq(interface);
|
|
|
|
|
|
pci_disable_device(pdev);
|
|
@@ -2248,11 +2275,21 @@ static void fm10k_io_resume(struct pci_dev *pdev)
|
|
|
int err = 0;
|
|
|
|
|
|
/* reset hardware to known state */
|
|
|
- hw->mac.ops.init_hw(&interface->hw);
|
|
|
+ err = hw->mac.ops.init_hw(&interface->hw);
|
|
|
+ if (err) {
|
|
|
+ dev_err(&pdev->dev, "init_hw failed: %d\n", err);
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
/* reset statistics starting values */
|
|
|
hw->mac.ops.rebind_hw_stats(hw, &interface->stats);
|
|
|
|
|
|
+ err = fm10k_init_queueing_scheme(interface);
|
|
|
+ if (err) {
|
|
|
+ dev_err(&interface->pdev->dev, "init_queueing_scheme failed: %d\n", err);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
/* reassociate interrupts */
|
|
|
fm10k_mbx_request_irq(interface);
|
|
|
|