diff options
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_82598.c')
| -rw-r--r-- | drivers/net/ixgbe/ixgbe_82598.c | 67 |
1 files changed, 66 insertions, 1 deletions
diff --git a/drivers/net/ixgbe/ixgbe_82598.c b/drivers/net/ixgbe/ixgbe_82598.c index b9923047ce11..522c03bc1dad 100644 --- a/drivers/net/ixgbe/ixgbe_82598.c +++ b/drivers/net/ixgbe/ixgbe_82598.c | |||
| @@ -50,6 +50,51 @@ static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, | |||
| 50 | u8 *eeprom_data); | 50 | u8 *eeprom_data); |
| 51 | 51 | ||
| 52 | /** | 52 | /** |
| 53 | * ixgbe_set_pcie_completion_timeout - set pci-e completion timeout | ||
| 54 | * @hw: pointer to the HW structure | ||
| 55 | * | ||
| 56 | * The defaults for 82598 should be in the range of 50us to 50ms, | ||
| 57 | * however the hardware default for these parts is 500us to 1ms which is less | ||
| 58 | * than the 10ms recommended by the pci-e spec. To address this we need to | ||
| 59 | * increase the value to either 10ms to 250ms for capability version 1 config, | ||
| 60 | * or 16ms to 55ms for version 2. | ||
| 61 | **/ | ||
| 62 | void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw) | ||
| 63 | { | ||
| 64 | struct ixgbe_adapter *adapter = hw->back; | ||
| 65 | u32 gcr = IXGBE_READ_REG(hw, IXGBE_GCR); | ||
| 66 | u16 pcie_devctl2; | ||
| 67 | |||
| 68 | /* only take action if timeout value is defaulted to 0 */ | ||
| 69 | if (gcr & IXGBE_GCR_CMPL_TMOUT_MASK) | ||
| 70 | goto out; | ||
| 71 | |||
| 72 | /* | ||
| 73 | * if capababilities version is type 1 we can write the | ||
| 74 | * timeout of 10ms to 250ms through the GCR register | ||
| 75 | */ | ||
| 76 | if (!(gcr & IXGBE_GCR_CAP_VER2)) { | ||
| 77 | gcr |= IXGBE_GCR_CMPL_TMOUT_10ms; | ||
| 78 | goto out; | ||
| 79 | } | ||
| 80 | |||
| 81 | /* | ||
| 82 | * for version 2 capabilities we need to write the config space | ||
| 83 | * directly in order to set the completion timeout value for | ||
| 84 | * 16ms to 55ms | ||
| 85 | */ | ||
| 86 | pci_read_config_word(adapter->pdev, | ||
| 87 | IXGBE_PCI_DEVICE_CONTROL2, &pcie_devctl2); | ||
| 88 | pcie_devctl2 |= IXGBE_PCI_DEVICE_CONTROL2_16ms; | ||
| 89 | pci_write_config_word(adapter->pdev, | ||
| 90 | IXGBE_PCI_DEVICE_CONTROL2, pcie_devctl2); | ||
| 91 | out: | ||
| 92 | /* disable completion timeout resend */ | ||
| 93 | gcr &= ~IXGBE_GCR_CMPL_TMOUT_RESEND; | ||
| 94 | IXGBE_WRITE_REG(hw, IXGBE_GCR, gcr); | ||
| 95 | } | ||
| 96 | |||
| 97 | /** | ||
| 53 | * ixgbe_get_pcie_msix_count_82598 - Gets MSI-X vector count | 98 | * ixgbe_get_pcie_msix_count_82598 - Gets MSI-X vector count |
| 54 | * @hw: pointer to hardware structure | 99 | * @hw: pointer to hardware structure |
| 55 | * | 100 | * |
| @@ -153,6 +198,26 @@ out: | |||
| 153 | } | 198 | } |
| 154 | 199 | ||
| 155 | /** | 200 | /** |
| 201 | * ixgbe_start_hw_82598 - Prepare hardware for Tx/Rx | ||
| 202 | * @hw: pointer to hardware structure | ||
| 203 | * | ||
| 204 | * Starts the hardware using the generic start_hw function. | ||
| 205 | * Then set pcie completion timeout | ||
| 206 | **/ | ||
| 207 | s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw) | ||
| 208 | { | ||
| 209 | s32 ret_val = 0; | ||
| 210 | |||
| 211 | ret_val = ixgbe_start_hw_generic(hw); | ||
| 212 | |||
| 213 | /* set the completion timeout for interface */ | ||
| 214 | if (ret_val == 0) | ||
| 215 | ixgbe_set_pcie_completion_timeout(hw); | ||
| 216 | |||
| 217 | return ret_val; | ||
| 218 | } | ||
| 219 | |||
| 220 | /** | ||
| 156 | * ixgbe_get_link_capabilities_82598 - Determines link capabilities | 221 | * ixgbe_get_link_capabilities_82598 - Determines link capabilities |
| 157 | * @hw: pointer to hardware structure | 222 | * @hw: pointer to hardware structure |
| 158 | * @speed: pointer to link speed | 223 | * @speed: pointer to link speed |
| @@ -1085,7 +1150,7 @@ out: | |||
| 1085 | static struct ixgbe_mac_operations mac_ops_82598 = { | 1150 | static struct ixgbe_mac_operations mac_ops_82598 = { |
| 1086 | .init_hw = &ixgbe_init_hw_generic, | 1151 | .init_hw = &ixgbe_init_hw_generic, |
| 1087 | .reset_hw = &ixgbe_reset_hw_82598, | 1152 | .reset_hw = &ixgbe_reset_hw_82598, |
| 1088 | .start_hw = &ixgbe_start_hw_generic, | 1153 | .start_hw = &ixgbe_start_hw_82598, |
| 1089 | .clear_hw_cntrs = &ixgbe_clear_hw_cntrs_generic, | 1154 | .clear_hw_cntrs = &ixgbe_clear_hw_cntrs_generic, |
| 1090 | .get_media_type = &ixgbe_get_media_type_82598, | 1155 | .get_media_type = &ixgbe_get_media_type_82598, |
| 1091 | .get_supported_physical_layer = &ixgbe_get_supported_physical_layer_82598, | 1156 | .get_supported_physical_layer = &ixgbe_get_supported_physical_layer_82598, |
