mirror of
https://github.com/torvalds/linux.git
synced 2024-12-18 00:53:40 +00:00
igb: move the generic copper link setup code into e1000_phy.c
This patch moves the generic portion of the copper link setup into a seperate function in e1000_phy.c. This helps to reduce the size of copper_link_setup_82575 and make it a bit more readable. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
285b416745
commit
81fadd81a5
@ -907,7 +907,6 @@ static s32 igb_setup_copper_link_82575(struct e1000_hw *hw)
|
|||||||
{
|
{
|
||||||
u32 ctrl;
|
u32 ctrl;
|
||||||
s32 ret_val;
|
s32 ret_val;
|
||||||
bool link;
|
|
||||||
|
|
||||||
ctrl = rd32(E1000_CTRL);
|
ctrl = rd32(E1000_CTRL);
|
||||||
ctrl |= E1000_CTRL_SLU;
|
ctrl |= E1000_CTRL_SLU;
|
||||||
@ -940,44 +939,7 @@ static s32 igb_setup_copper_link_82575(struct e1000_hw *hw)
|
|||||||
if (ret_val)
|
if (ret_val)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (hw->mac.autoneg) {
|
ret_val = igb_setup_copper_link(hw);
|
||||||
/*
|
|
||||||
* Setup autoneg and flow control advertisement
|
|
||||||
* and perform autonegotiation.
|
|
||||||
*/
|
|
||||||
ret_val = igb_copper_link_autoneg(hw);
|
|
||||||
if (ret_val)
|
|
||||||
goto out;
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* PHY will be set to 10H, 10F, 100H or 100F
|
|
||||||
* depending on user settings.
|
|
||||||
*/
|
|
||||||
hw_dbg("Forcing Speed and Duplex\n");
|
|
||||||
ret_val = hw->phy.ops.force_speed_duplex(hw);
|
|
||||||
if (ret_val) {
|
|
||||||
hw_dbg("Error Forcing Speed and Duplex\n");
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check link status. Wait up to 100 microseconds for link to become
|
|
||||||
* valid.
|
|
||||||
*/
|
|
||||||
ret_val = igb_phy_has_link(hw, COPPER_LINK_UP_LIMIT, 10, &link);
|
|
||||||
if (ret_val)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (link) {
|
|
||||||
hw_dbg("Valid link established!!!\n");
|
|
||||||
/* Config the MAC and PHY after link is up */
|
|
||||||
igb_config_collision_dist(hw);
|
|
||||||
ret_val = igb_config_fc_after_link_up(hw);
|
|
||||||
} else {
|
|
||||||
hw_dbg("Unable to establish link!!!\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
|
@ -669,7 +669,7 @@ out:
|
|||||||
* and restart the negotiation process between the link partner. If
|
* and restart the negotiation process between the link partner. If
|
||||||
* autoneg_wait_to_complete, then wait for autoneg to complete before exiting.
|
* autoneg_wait_to_complete, then wait for autoneg to complete before exiting.
|
||||||
**/
|
**/
|
||||||
s32 igb_copper_link_autoneg(struct e1000_hw *hw)
|
static s32 igb_copper_link_autoneg(struct e1000_hw *hw)
|
||||||
{
|
{
|
||||||
struct e1000_phy_info *phy = &hw->phy;
|
struct e1000_phy_info *phy = &hw->phy;
|
||||||
s32 ret_val;
|
s32 ret_val;
|
||||||
@ -892,6 +892,65 @@ out:
|
|||||||
return ret_val;
|
return ret_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* igb_setup_copper_link - Configure copper link settings
|
||||||
|
* @hw: pointer to the HW structure
|
||||||
|
*
|
||||||
|
* Calls the appropriate function to configure the link for auto-neg or forced
|
||||||
|
* speed and duplex. Then we check for link, once link is established calls
|
||||||
|
* to configure collision distance and flow control are called. If link is
|
||||||
|
* not established, we return -E1000_ERR_PHY (-2).
|
||||||
|
**/
|
||||||
|
s32 igb_setup_copper_link(struct e1000_hw *hw)
|
||||||
|
{
|
||||||
|
s32 ret_val;
|
||||||
|
bool link;
|
||||||
|
|
||||||
|
|
||||||
|
if (hw->mac.autoneg) {
|
||||||
|
/*
|
||||||
|
* Setup autoneg and flow control advertisement and perform
|
||||||
|
* autonegotiation.
|
||||||
|
*/
|
||||||
|
ret_val = igb_copper_link_autoneg(hw);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* PHY will be set to 10H, 10F, 100H or 100F
|
||||||
|
* depending on user settings.
|
||||||
|
*/
|
||||||
|
hw_dbg("Forcing Speed and Duplex\n");
|
||||||
|
ret_val = hw->phy.ops.force_speed_duplex(hw);
|
||||||
|
if (ret_val) {
|
||||||
|
hw_dbg("Error Forcing Speed and Duplex\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check link status. Wait up to 100 microseconds for link to become
|
||||||
|
* valid.
|
||||||
|
*/
|
||||||
|
ret_val = igb_phy_has_link(hw,
|
||||||
|
COPPER_LINK_UP_LIMIT,
|
||||||
|
10,
|
||||||
|
&link);
|
||||||
|
if (ret_val)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (link) {
|
||||||
|
hw_dbg("Valid link established!!!\n");
|
||||||
|
igb_config_collision_dist(hw);
|
||||||
|
ret_val = igb_config_fc_after_link_up(hw);
|
||||||
|
} else {
|
||||||
|
hw_dbg("Unable to establish link!!!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* igb_phy_force_speed_duplex_igp - Force speed/duplex for igp PHY
|
* igb_phy_force_speed_duplex_igp - Force speed/duplex for igp PHY
|
||||||
* @hw: pointer to the HW structure
|
* @hw: pointer to the HW structure
|
||||||
|
@ -43,7 +43,6 @@ enum e1000_smart_speed {
|
|||||||
|
|
||||||
s32 igb_check_downshift(struct e1000_hw *hw);
|
s32 igb_check_downshift(struct e1000_hw *hw);
|
||||||
s32 igb_check_reset_block(struct e1000_hw *hw);
|
s32 igb_check_reset_block(struct e1000_hw *hw);
|
||||||
s32 igb_copper_link_autoneg(struct e1000_hw *hw);
|
|
||||||
s32 igb_copper_link_setup_igp(struct e1000_hw *hw);
|
s32 igb_copper_link_setup_igp(struct e1000_hw *hw);
|
||||||
s32 igb_copper_link_setup_m88(struct e1000_hw *hw);
|
s32 igb_copper_link_setup_m88(struct e1000_hw *hw);
|
||||||
s32 igb_phy_force_speed_duplex_igp(struct e1000_hw *hw);
|
s32 igb_phy_force_speed_duplex_igp(struct e1000_hw *hw);
|
||||||
@ -57,6 +56,7 @@ s32 igb_phy_sw_reset(struct e1000_hw *hw);
|
|||||||
s32 igb_phy_hw_reset(struct e1000_hw *hw);
|
s32 igb_phy_hw_reset(struct e1000_hw *hw);
|
||||||
s32 igb_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data);
|
s32 igb_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data);
|
||||||
s32 igb_set_d3_lplu_state(struct e1000_hw *hw, bool active);
|
s32 igb_set_d3_lplu_state(struct e1000_hw *hw, bool active);
|
||||||
|
s32 igb_setup_copper_link(struct e1000_hw *hw);
|
||||||
s32 igb_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data);
|
s32 igb_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data);
|
||||||
s32 igb_phy_has_link(struct e1000_hw *hw, u32 iterations,
|
s32 igb_phy_has_link(struct e1000_hw *hw, u32 iterations,
|
||||||
u32 usec_interval, bool *success);
|
u32 usec_interval, bool *success);
|
||||||
|
Loading…
Reference in New Issue
Block a user