|
@@ -3081,10 +3081,36 @@ static int reset_intel_generic_dev(struct pci_dev *dev, int probe)
|
|
|
|
|
|
static int reset_intel_82599_sfp_virtfn(struct pci_dev *dev, int probe)
|
|
|
{
|
|
|
+ int i;
|
|
|
+ u16 status;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * http://www.intel.com/content/dam/doc/datasheet/82599-10-gbe-controller-datasheet.pdf
|
|
|
+ *
|
|
|
+ * The 82599 supports FLR on VFs, but FLR support is reported only
|
|
|
+ * in the PF DEVCAP (sec 9.3.10.4), not in the VF DEVCAP (sec 9.5).
|
|
|
+ * Therefore, we can't use pcie_flr(), which checks the VF DEVCAP.
|
|
|
+ */
|
|
|
+
|
|
|
if (probe)
|
|
|
return 0;
|
|
|
|
|
|
- pcie_capability_write_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_BCR_FLR);
|
|
|
+ /* Wait for Transaction Pending bit clean */
|
|
|
+ for (i = 0; i < 4; i++) {
|
|
|
+ if (i)
|
|
|
+ msleep((1 << (i - 1)) * 100);
|
|
|
+
|
|
|
+ pcie_capability_read_word(dev, PCI_EXP_DEVSTA, &status);
|
|
|
+ if (!(status & PCI_EXP_DEVSTA_TRPND))
|
|
|
+ goto clear;
|
|
|
+ }
|
|
|
+
|
|
|
+ dev_err(&dev->dev, "transaction is not cleared; "
|
|
|
+ "proceeding with reset anyway\n");
|
|
|
+
|
|
|
+clear:
|
|
|
+ pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_BCR_FLR);
|
|
|
+
|
|
|
msleep(100);
|
|
|
|
|
|
return 0;
|