|
@@ -49,6 +49,51 @@ static s32 ixgbe_setup_copper_link_speed_82598(struct ixgbe_hw *hw,
|
|
|
static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
|
|
|
u8 *eeprom_data);
|
|
|
|
|
|
+/**
|
|
|
+ * ixgbe_set_pcie_completion_timeout - set pci-e completion timeout
|
|
|
+ * @hw: pointer to the HW structure
|
|
|
+ *
|
|
|
+ * The defaults for 82598 should be in the range of 50us to 50ms,
|
|
|
+ * however the hardware default for these parts is 500us to 1ms which is less
|
|
|
+ * than the 10ms recommended by the pci-e spec. To address this we need to
|
|
|
+ * increase the value to either 10ms to 250ms for capability version 1 config,
|
|
|
+ * or 16ms to 55ms for version 2.
|
|
|
+ **/
|
|
|
+void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw)
|
|
|
+{
|
|
|
+ struct ixgbe_adapter *adapter = hw->back;
|
|
|
+ u32 gcr = IXGBE_READ_REG(hw, IXGBE_GCR);
|
|
|
+ u16 pcie_devctl2;
|
|
|
+
|
|
|
+ /* only take action if timeout value is defaulted to 0 */
|
|
|
+ if (gcr & IXGBE_GCR_CMPL_TMOUT_MASK)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * if capababilities version is type 1 we can write the
|
|
|
+ * timeout of 10ms to 250ms through the GCR register
|
|
|
+ */
|
|
|
+ if (!(gcr & IXGBE_GCR_CAP_VER2)) {
|
|
|
+ gcr |= IXGBE_GCR_CMPL_TMOUT_10ms;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * for version 2 capabilities we need to write the config space
|
|
|
+ * directly in order to set the completion timeout value for
|
|
|
+ * 16ms to 55ms
|
|
|
+ */
|
|
|
+ pci_read_config_word(adapter->pdev,
|
|
|
+ IXGBE_PCI_DEVICE_CONTROL2, &pcie_devctl2);
|
|
|
+ pcie_devctl2 |= IXGBE_PCI_DEVICE_CONTROL2_16ms;
|
|
|
+ pci_write_config_word(adapter->pdev,
|
|
|
+ IXGBE_PCI_DEVICE_CONTROL2, pcie_devctl2);
|
|
|
+out:
|
|
|
+ /* disable completion timeout resend */
|
|
|
+ gcr &= ~IXGBE_GCR_CMPL_TMOUT_RESEND;
|
|
|
+ IXGBE_WRITE_REG(hw, IXGBE_GCR, gcr);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* ixgbe_get_pcie_msix_count_82598 - Gets MSI-X vector count
|
|
|
* @hw: pointer to hardware structure
|
|
@@ -152,6 +197,26 @@ out:
|
|
|
return ret_val;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * ixgbe_start_hw_82598 - Prepare hardware for Tx/Rx
|
|
|
+ * @hw: pointer to hardware structure
|
|
|
+ *
|
|
|
+ * Starts the hardware using the generic start_hw function.
|
|
|
+ * Then set pcie completion timeout
|
|
|
+ **/
|
|
|
+s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw)
|
|
|
+{
|
|
|
+ s32 ret_val = 0;
|
|
|
+
|
|
|
+ ret_val = ixgbe_start_hw_generic(hw);
|
|
|
+
|
|
|
+ /* set the completion timeout for interface */
|
|
|
+ if (ret_val == 0)
|
|
|
+ ixgbe_set_pcie_completion_timeout(hw);
|
|
|
+
|
|
|
+ return ret_val;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* ixgbe_get_link_capabilities_82598 - Determines link capabilities
|
|
|
* @hw: pointer to hardware structure
|
|
@@ -1085,7 +1150,7 @@ out:
|
|
|
static struct ixgbe_mac_operations mac_ops_82598 = {
|
|
|
.init_hw = &ixgbe_init_hw_generic,
|
|
|
.reset_hw = &ixgbe_reset_hw_82598,
|
|
|
- .start_hw = &ixgbe_start_hw_generic,
|
|
|
+ .start_hw = &ixgbe_start_hw_82598,
|
|
|
.clear_hw_cntrs = &ixgbe_clear_hw_cntrs_generic,
|
|
|
.get_media_type = &ixgbe_get_media_type_82598,
|
|
|
.get_supported_physical_layer = &ixgbe_get_supported_physical_layer_82598,
|