|
@@ -4654,11 +4654,6 @@ static void print_port_info(const struct net_device *dev)
|
|
|
dev->name, adap->params.vpd.id, adap->name, buf);
|
|
|
}
|
|
|
|
|
|
-static void enable_pcie_relaxed_ordering(struct pci_dev *dev)
|
|
|
-{
|
|
|
- pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_RELAX_EN);
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Free the following resources:
|
|
|
* - memory used for tables
|
|
@@ -4908,7 +4903,6 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
}
|
|
|
|
|
|
pci_enable_pcie_error_reporting(pdev);
|
|
|
- enable_pcie_relaxed_ordering(pdev);
|
|
|
pci_set_master(pdev);
|
|
|
pci_save_state(pdev);
|
|
|
|
|
@@ -4947,6 +4941,23 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
adapter->msg_enable = DFLT_MSG_ENABLE;
|
|
|
memset(adapter->chan_map, 0xff, sizeof(adapter->chan_map));
|
|
|
|
|
|
+ /* If possible, we use PCIe Relaxed Ordering Attribute to deliver
|
|
|
+ * Ingress Packet Data to Free List Buffers in order to allow for
|
|
|
+ * chipset performance optimizations between the Root Complex and
|
|
|
+ * Memory Controllers. (Messages to the associated Ingress Queue
|
|
|
+ * notifying new Packet Placement in the Free Lists Buffers will be
|
|
|
+ * send without the Relaxed Ordering Attribute thus guaranteeing that
|
|
|
+ * all preceding PCIe Transaction Layer Packets will be processed
|
|
|
+ * first.) But some Root Complexes have various issues with Upstream
|
|
|
+ * Transaction Layer Packets with the Relaxed Ordering Attribute set.
|
|
|
+ * The PCIe devices which under the Root Complexes will be cleared the
|
|
|
+ * Relaxed Ordering bit in the configuration space, So we check our
|
|
|
+ * PCIe configuration space to see if it's flagged with advice against
|
|
|
+ * using Relaxed Ordering.
|
|
|
+ */
|
|
|
+ if (!pcie_relaxed_ordering_enabled(pdev))
|
|
|
+ adapter->flags |= ROOT_NO_RELAXED_ORDERING;
|
|
|
+
|
|
|
spin_lock_init(&adapter->stats_lock);
|
|
|
spin_lock_init(&adapter->tid_release_lock);
|
|
|
spin_lock_init(&adapter->win0_lock);
|