|
@@ -73,20 +73,51 @@ static u16 ixgbe_get_pcie_msix_count_82598(struct ixgbe_hw *hw)
|
|
|
/**
|
|
|
*/
|
|
|
static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw)
|
|
|
+{
|
|
|
+ struct ixgbe_mac_info *mac = &hw->mac;
|
|
|
+
|
|
|
+ /* Call PHY identify routine to get the phy type */
|
|
|
+ ixgbe_identify_phy_generic(hw);
|
|
|
+
|
|
|
+ mac->mcft_size = IXGBE_82598_MC_TBL_SIZE;
|
|
|
+ mac->vft_size = IXGBE_82598_VFT_TBL_SIZE;
|
|
|
+ mac->num_rar_entries = IXGBE_82598_RAR_ENTRIES;
|
|
|
+ mac->max_rx_queues = IXGBE_82598_MAX_RX_QUEUES;
|
|
|
+ mac->max_tx_queues = IXGBE_82598_MAX_TX_QUEUES;
|
|
|
+ mac->max_msix_vectors = ixgbe_get_pcie_msix_count_82598(hw);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * ixgbe_init_phy_ops_82598 - PHY/SFP specific init
|
|
|
+ * @hw: pointer to hardware structure
|
|
|
+ *
|
|
|
+ * Initialize any function pointers that were not able to be
|
|
|
+ * set during get_invariants because the PHY/SFP type was
|
|
|
+ * not known. Perform the SFP init if necessary.
|
|
|
+ *
|
|
|
+ **/
|
|
|
+s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)
|
|
|
{
|
|
|
struct ixgbe_mac_info *mac = &hw->mac;
|
|
|
struct ixgbe_phy_info *phy = &hw->phy;
|
|
|
s32 ret_val = 0;
|
|
|
u16 list_offset, data_offset;
|
|
|
|
|
|
- /* Set the bus information prior to PHY identification */
|
|
|
- mac->ops.get_bus_info(hw);
|
|
|
+ /* Identify the PHY */
|
|
|
+ phy->ops.identify(hw);
|
|
|
|
|
|
- /* Call PHY identify routine to get the phy type */
|
|
|
- ixgbe_identify_phy_generic(hw);
|
|
|
+ /* Overwrite the link function pointers if copper PHY */
|
|
|
+ if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) {
|
|
|
+ mac->ops.setup_link = &ixgbe_setup_copper_link_82598;
|
|
|
+ mac->ops.setup_link_speed =
|
|
|
+ &ixgbe_setup_copper_link_speed_82598;
|
|
|
+ mac->ops.get_link_capabilities =
|
|
|
+ &ixgbe_get_copper_link_capabilities_82598;
|
|
|
+ }
|
|
|
|
|
|
- /* PHY Init */
|
|
|
- switch (phy->type) {
|
|
|
+ switch (hw->phy.type) {
|
|
|
case ixgbe_phy_tn:
|
|
|
phy->ops.check_link = &ixgbe_check_phy_link_tnx;
|
|
|
phy->ops.get_firmware_version =
|
|
@@ -106,8 +137,8 @@ static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw)
|
|
|
|
|
|
/* Check to see if SFP+ module is supported */
|
|
|
ret_val = ixgbe_get_sfp_init_sequence_offsets(hw,
|
|
|
- &list_offset,
|
|
|
- &data_offset);
|
|
|
+ &list_offset,
|
|
|
+ &data_offset);
|
|
|
if (ret_val != 0) {
|
|
|
ret_val = IXGBE_ERR_SFP_NOT_SUPPORTED;
|
|
|
goto out;
|
|
@@ -117,21 +148,6 @@ static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) {
|
|
|
- mac->ops.setup_link = &ixgbe_setup_copper_link_82598;
|
|
|
- mac->ops.setup_link_speed =
|
|
|
- &ixgbe_setup_copper_link_speed_82598;
|
|
|
- mac->ops.get_link_capabilities =
|
|
|
- &ixgbe_get_copper_link_capabilities_82598;
|
|
|
- }
|
|
|
-
|
|
|
- mac->mcft_size = IXGBE_82598_MC_TBL_SIZE;
|
|
|
- mac->vft_size = IXGBE_82598_VFT_TBL_SIZE;
|
|
|
- mac->num_rar_entries = IXGBE_82598_RAR_ENTRIES;
|
|
|
- mac->max_rx_queues = IXGBE_82598_MAX_RX_QUEUES;
|
|
|
- mac->max_tx_queues = IXGBE_82598_MAX_TX_QUEUES;
|
|
|
- mac->max_msix_vectors = ixgbe_get_pcie_msix_count_82598(hw);
|
|
|
-
|
|
|
out:
|
|
|
return ret_val;
|
|
|
}
|
|
@@ -719,14 +735,23 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
|
|
|
}
|
|
|
|
|
|
/* Reset PHY */
|
|
|
- if (hw->phy.reset_disable == false)
|
|
|
+ if (hw->phy.reset_disable == false) {
|
|
|
+ /* PHY ops must be identified and initialized prior to reset */
|
|
|
+
|
|
|
+ /* Init PHY and function pointers, perform SFP setup */
|
|
|
+ status = hw->phy.ops.init(hw);
|
|
|
+ if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
|
|
|
+ goto reset_hw_out;
|
|
|
+
|
|
|
hw->phy.ops.reset(hw);
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Prevent the PCI-E bus from from hanging by disabling PCI-E master
|
|
|
* access and verify no pending requests before reset
|
|
|
*/
|
|
|
- if (ixgbe_disable_pcie_master(hw) != 0) {
|
|
|
+ status = ixgbe_disable_pcie_master(hw);
|
|
|
+ if (status != 0) {
|
|
|
status = IXGBE_ERR_MASTER_REQUESTS_PENDING;
|
|
|
hw_dbg(hw, "PCI-E Master disable polling has failed.\n");
|
|
|
}
|
|
@@ -773,6 +798,7 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
|
|
|
/* Store the permanent mac address */
|
|
|
hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
|
|
|
|
|
|
+reset_hw_out:
|
|
|
return status;
|
|
|
}
|
|
|
|
|
@@ -1157,6 +1183,7 @@ static struct ixgbe_eeprom_operations eeprom_ops_82598 = {
|
|
|
static struct ixgbe_phy_operations phy_ops_82598 = {
|
|
|
.identify = &ixgbe_identify_phy_generic,
|
|
|
.identify_sfp = &ixgbe_identify_sfp_module_generic,
|
|
|
+ .init = &ixgbe_init_phy_ops_82598,
|
|
|
.reset = &ixgbe_reset_phy_generic,
|
|
|
.read_reg = &ixgbe_read_phy_reg_generic,
|
|
|
.write_reg = &ixgbe_write_phy_reg_generic,
|