|
|
@@ -180,7 +180,8 @@ static void fm10k_reinit(struct fm10k_intfc *interface)
|
|
|
|
|
|
err = fm10k_init_queueing_scheme(interface);
|
|
|
if (err) {
|
|
|
- dev_err(&interface->pdev->dev, "init_queueing_scheme failed: %d\n", err);
|
|
|
+ dev_err(&interface->pdev->dev,
|
|
|
+ "init_queueing_scheme failed: %d\n", err);
|
|
|
goto reinit_err;
|
|
|
}
|
|
|
|
|
|
@@ -600,6 +601,13 @@ static void fm10k_configure_tx_ring(struct fm10k_intfc *interface,
|
|
|
fm10k_write_reg(hw, FM10K_PFVTCTL(reg_idx),
|
|
|
FM10K_PFVTCTL_FTAG_DESC_ENABLE);
|
|
|
|
|
|
+ /* Initialize XPS */
|
|
|
+ if (!test_and_set_bit(__FM10K_TX_XPS_INIT_DONE, &ring->state) &&
|
|
|
+ ring->q_vector)
|
|
|
+ netif_set_xps_queue(ring->netdev,
|
|
|
+ &ring->q_vector->affinity_mask,
|
|
|
+ ring->queue_index);
|
|
|
+
|
|
|
/* enable queue */
|
|
|
fm10k_write_reg(hw, FM10K_TXDCTL(reg_idx), txdctl);
|
|
|
}
|
|
|
@@ -715,7 +723,7 @@ static void fm10k_configure_rx_ring(struct fm10k_intfc *interface,
|
|
|
/* assign default VLAN to queue */
|
|
|
ring->vid = hw->mac.default_vid;
|
|
|
|
|
|
- /* if we have an active VLAN, disable default VID */
|
|
|
+ /* if we have an active VLAN, disable default VLAN ID */
|
|
|
if (test_bit(hw->mac.default_vid, interface->active_vlans))
|
|
|
ring->vid |= FM10K_VLAN_CLEAR;
|
|
|
|
|
|
@@ -919,7 +927,7 @@ void fm10k_netpoll(struct net_device *netdev)
|
|
|
#endif
|
|
|
#define FM10K_ERR_MSG(type) case (type): error = #type; break
|
|
|
static void fm10k_handle_fault(struct fm10k_intfc *interface, int type,
|
|
|
- struct fm10k_fault *fault)
|
|
|
+ struct fm10k_fault *fault)
|
|
|
{
|
|
|
struct pci_dev *pdev = interface->pdev;
|
|
|
struct fm10k_hw *hw = &interface->hw;
|
|
|
@@ -1124,6 +1132,10 @@ void fm10k_mbx_free_irq(struct fm10k_intfc *interface)
|
|
|
struct fm10k_hw *hw = &interface->hw;
|
|
|
int itr_reg;
|
|
|
|
|
|
+ /* no mailbox IRQ to free if MSI-X is not enabled */
|
|
|
+ if (!interface->msix_entries)
|
|
|
+ return;
|
|
|
+
|
|
|
/* disconnect the mailbox */
|
|
|
hw->mbx.ops.disconnect(hw, &hw->mbx);
|
|
|
|
|
|
@@ -1292,7 +1304,7 @@ static s32 fm10k_update_pvid(struct fm10k_hw *hw, u32 **results,
|
|
|
if (!fm10k_glort_valid_pf(hw, glort))
|
|
|
return FM10K_ERR_PARAM;
|
|
|
|
|
|
- /* verify VID is valid */
|
|
|
+ /* verify VLAN ID is valid */
|
|
|
if (pvid >= FM10K_VLAN_TABLE_VID_MAX)
|
|
|
return FM10K_ERR_PARAM;
|
|
|
|
|
|
@@ -1411,14 +1423,14 @@ static int fm10k_mbx_request_irq_pf(struct fm10k_intfc *interface)
|
|
|
}
|
|
|
|
|
|
/* Enable interrupts w/ no moderation for "other" interrupts */
|
|
|
- fm10k_write_reg(hw, FM10K_INT_MAP(fm10k_int_PCIeFault), other_itr);
|
|
|
- fm10k_write_reg(hw, FM10K_INT_MAP(fm10k_int_SwitchUpDown), other_itr);
|
|
|
- fm10k_write_reg(hw, FM10K_INT_MAP(fm10k_int_SRAM), other_itr);
|
|
|
- fm10k_write_reg(hw, FM10K_INT_MAP(fm10k_int_MaxHoldTime), other_itr);
|
|
|
- fm10k_write_reg(hw, FM10K_INT_MAP(fm10k_int_VFLR), other_itr);
|
|
|
+ fm10k_write_reg(hw, FM10K_INT_MAP(fm10k_int_pcie_fault), other_itr);
|
|
|
+ fm10k_write_reg(hw, FM10K_INT_MAP(fm10k_int_switch_up_down), other_itr);
|
|
|
+ fm10k_write_reg(hw, FM10K_INT_MAP(fm10k_int_sram), other_itr);
|
|
|
+ fm10k_write_reg(hw, FM10K_INT_MAP(fm10k_int_max_hold_time), other_itr);
|
|
|
+ fm10k_write_reg(hw, FM10K_INT_MAP(fm10k_int_vflr), other_itr);
|
|
|
|
|
|
/* Enable interrupts w/ moderation for mailbox */
|
|
|
- fm10k_write_reg(hw, FM10K_INT_MAP(fm10k_int_Mailbox), mbx_itr);
|
|
|
+ fm10k_write_reg(hw, FM10K_INT_MAP(fm10k_int_mailbox), mbx_itr);
|
|
|
|
|
|
/* Enable individual interrupt causes */
|
|
|
fm10k_write_reg(hw, FM10K_EIMR, FM10K_EIMR_ENABLE(PCA_FAULT) |
|
|
|
@@ -1446,10 +1458,15 @@ int fm10k_mbx_request_irq(struct fm10k_intfc *interface)
|
|
|
err = fm10k_mbx_request_irq_pf(interface);
|
|
|
else
|
|
|
err = fm10k_mbx_request_irq_vf(interface);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
|
|
|
/* connect mailbox */
|
|
|
- if (!err)
|
|
|
- err = hw->mbx.ops.connect(hw, &hw->mbx);
|
|
|
+ err = hw->mbx.ops.connect(hw, &hw->mbx);
|
|
|
+
|
|
|
+ /* if the mailbox failed to connect, then free IRQ */
|
|
|
+ if (err)
|
|
|
+ fm10k_mbx_free_irq(interface);
|
|
|
|
|
|
return err;
|
|
|
}
|
|
|
@@ -1478,8 +1495,10 @@ void fm10k_qv_free_irq(struct fm10k_intfc *interface)
|
|
|
if (!q_vector->tx.count && !q_vector->rx.count)
|
|
|
continue;
|
|
|
|
|
|
- /* disable interrupts */
|
|
|
+ /* clear the affinity_mask in the IRQ descriptor */
|
|
|
+ irq_set_affinity_hint(entry->vector, NULL);
|
|
|
|
|
|
+ /* disable interrupts */
|
|
|
writel(FM10K_ITR_MASK_SET, q_vector->itr);
|
|
|
|
|
|
free_irq(entry->vector, q_vector);
|
|
|
@@ -1537,6 +1556,9 @@ int fm10k_qv_request_irq(struct fm10k_intfc *interface)
|
|
|
goto err_out;
|
|
|
}
|
|
|
|
|
|
+ /* assign the mask for this irq */
|
|
|
+ irq_set_affinity_hint(entry->vector, &q_vector->affinity_mask);
|
|
|
+
|
|
|
/* Enable q_vector */
|
|
|
writel(FM10K_ITR_ENABLE, q_vector->itr);
|
|
|
|
|
|
@@ -1557,8 +1579,10 @@ err_out:
|
|
|
if (!q_vector->tx.count && !q_vector->rx.count)
|
|
|
continue;
|
|
|
|
|
|
- /* disable interrupts */
|
|
|
+ /* clear the affinity_mask in the IRQ descriptor */
|
|
|
+ irq_set_affinity_hint(entry->vector, NULL);
|
|
|
|
|
|
+ /* disable interrupts */
|
|
|
writel(FM10K_ITR_MASK_SET, q_vector->itr);
|
|
|
|
|
|
free_irq(entry->vector, q_vector);
|
|
|
@@ -1857,17 +1881,18 @@ static void fm10k_slot_warn(struct fm10k_intfc *interface)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (max_gts < expected_gts) {
|
|
|
- dev_warn(&interface->pdev->dev,
|
|
|
- "This device requires %dGT/s of bandwidth for optimal performance.\n",
|
|
|
- expected_gts);
|
|
|
- dev_warn(&interface->pdev->dev,
|
|
|
- "A %sslot with x%d lanes is suggested.\n",
|
|
|
- (hw->bus_caps.speed == fm10k_bus_speed_2500 ? "2.5GT/s " :
|
|
|
- hw->bus_caps.speed == fm10k_bus_speed_5000 ? "5.0GT/s " :
|
|
|
- hw->bus_caps.speed == fm10k_bus_speed_8000 ? "8.0GT/s " : ""),
|
|
|
- hw->bus_caps.width);
|
|
|
- }
|
|
|
+ if (max_gts >= expected_gts)
|
|
|
+ return;
|
|
|
+
|
|
|
+ dev_warn(&interface->pdev->dev,
|
|
|
+ "This device requires %dGT/s of bandwidth for optimal performance.\n",
|
|
|
+ expected_gts);
|
|
|
+ dev_warn(&interface->pdev->dev,
|
|
|
+ "A %sslot with x%d lanes is suggested.\n",
|
|
|
+ (hw->bus_caps.speed == fm10k_bus_speed_2500 ? "2.5GT/s " :
|
|
|
+ hw->bus_caps.speed == fm10k_bus_speed_5000 ? "5.0GT/s " :
|
|
|
+ hw->bus_caps.speed == fm10k_bus_speed_8000 ? "8.0GT/s " : ""),
|
|
|
+ hw->bus_caps.width);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1881,8 +1906,7 @@ static void fm10k_slot_warn(struct fm10k_intfc *interface)
|
|
|
* The OS initialization, configuring of the interface private structure,
|
|
|
* and a hardware reset occur.
|
|
|
**/
|
|
|
-static int fm10k_probe(struct pci_dev *pdev,
|
|
|
- const struct pci_device_id *ent)
|
|
|
+static int fm10k_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
{
|
|
|
struct net_device *netdev;
|
|
|
struct fm10k_intfc *interface;
|
|
|
@@ -2286,7 +2310,8 @@ static void fm10k_io_resume(struct pci_dev *pdev)
|
|
|
|
|
|
err = fm10k_init_queueing_scheme(interface);
|
|
|
if (err) {
|
|
|
- dev_err(&interface->pdev->dev, "init_queueing_scheme failed: %d\n", err);
|
|
|
+ dev_err(&interface->pdev->dev,
|
|
|
+ "init_queueing_scheme failed: %d\n", err);
|
|
|
return;
|
|
|
}
|
|
|
|