|
@@ -536,18 +536,24 @@ s32 igb_setup_link(struct e1000_hw *hw)
|
|
|
if (igb_check_reset_block(hw))
|
|
|
goto out;
|
|
|
|
|
|
- ret_val = igb_set_default_fc(hw);
|
|
|
- if (ret_val)
|
|
|
- goto out;
|
|
|
+ /*
|
|
|
+ * If requested flow control is set to default, set flow control
|
|
|
+ * based on the EEPROM flow control settings.
|
|
|
+ */
|
|
|
+ if (hw->fc.requested_mode == e1000_fc_default) {
|
|
|
+ ret_val = igb_set_default_fc(hw);
|
|
|
+ if (ret_val)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* We want to save off the original Flow Control configuration just
|
|
|
* in case we get disconnected and then reconnected into a different
|
|
|
* hub or switch with different Flow Control capabilities.
|
|
|
*/
|
|
|
- hw->fc.original_type = hw->fc.type;
|
|
|
+ hw->fc.current_mode = hw->fc.requested_mode;
|
|
|
|
|
|
- hw_dbg("After fix-ups FlowControl is now = %x\n", hw->fc.type);
|
|
|
+ hw_dbg("After fix-ups FlowControl is now = %x\n", hw->fc.current_mode);
|
|
|
|
|
|
/* Call the necessary media_type subroutine to configure the link. */
|
|
|
ret_val = hw->mac.ops.setup_physical_interface(hw);
|
|
@@ -614,7 +620,7 @@ static s32 igb_set_fc_watermarks(struct e1000_hw *hw)
|
|
|
* ability to transmit pause frames is not enabled, then these
|
|
|
* registers will be set to 0.
|
|
|
*/
|
|
|
- if (hw->fc.type & e1000_fc_tx_pause) {
|
|
|
+ if (hw->fc.current_mode & e1000_fc_tx_pause) {
|
|
|
/*
|
|
|
* We need to set up the Receive Threshold high and low water
|
|
|
* marks as well as (optionally) enabling the transmission of
|
|
@@ -661,12 +667,12 @@ static s32 igb_set_default_fc(struct e1000_hw *hw)
|
|
|
}
|
|
|
|
|
|
if ((nvm_data & NVM_WORD0F_PAUSE_MASK) == 0)
|
|
|
- hw->fc.type = e1000_fc_none;
|
|
|
+ hw->fc.requested_mode = e1000_fc_none;
|
|
|
else if ((nvm_data & NVM_WORD0F_PAUSE_MASK) ==
|
|
|
NVM_WORD0F_ASM_DIR)
|
|
|
- hw->fc.type = e1000_fc_tx_pause;
|
|
|
+ hw->fc.requested_mode = e1000_fc_tx_pause;
|
|
|
else
|
|
|
- hw->fc.type = e1000_fc_full;
|
|
|
+ hw->fc.requested_mode = e1000_fc_full;
|
|
|
|
|
|
out:
|
|
|
return ret_val;
|
|
@@ -696,7 +702,7 @@ s32 igb_force_mac_fc(struct e1000_hw *hw)
|
|
|
* receive flow control.
|
|
|
*
|
|
|
* The "Case" statement below enables/disable flow control
|
|
|
- * according to the "hw->fc.type" parameter.
|
|
|
+ * according to the "hw->fc.current_mode" parameter.
|
|
|
*
|
|
|
* The possible values of the "fc" parameter are:
|
|
|
* 0: Flow control is completely disabled
|
|
@@ -707,9 +713,9 @@ s32 igb_force_mac_fc(struct e1000_hw *hw)
|
|
|
* 3: Both Rx and TX flow control (symmetric) is enabled.
|
|
|
* other: No other values should be possible at this point.
|
|
|
*/
|
|
|
- hw_dbg("hw->fc.type = %u\n", hw->fc.type);
|
|
|
+ hw_dbg("hw->fc.current_mode = %u\n", hw->fc.current_mode);
|
|
|
|
|
|
- switch (hw->fc.type) {
|
|
|
+ switch (hw->fc.current_mode) {
|
|
|
case e1000_fc_none:
|
|
|
ctrl &= (~(E1000_CTRL_TFCE | E1000_CTRL_RFCE));
|
|
|
break;
|
|
@@ -857,11 +863,11 @@ s32 igb_config_fc_after_link_up(struct e1000_hw *hw)
|
|
|
* ONLY. Hence, we must now check to see if we need to
|
|
|
* turn OFF the TRANSMISSION of PAUSE frames.
|
|
|
*/
|
|
|
- if (hw->fc.original_type == e1000_fc_full) {
|
|
|
- hw->fc.type = e1000_fc_full;
|
|
|
+ if (hw->fc.requested_mode == e1000_fc_full) {
|
|
|
+ hw->fc.current_mode = e1000_fc_full;
|
|
|
hw_dbg("Flow Control = FULL.\r\n");
|
|
|
} else {
|
|
|
- hw->fc.type = e1000_fc_rx_pause;
|
|
|
+ hw->fc.current_mode = e1000_fc_rx_pause;
|
|
|
hw_dbg("Flow Control = "
|
|
|
"RX PAUSE frames only.\r\n");
|
|
|
}
|
|
@@ -878,7 +884,7 @@ s32 igb_config_fc_after_link_up(struct e1000_hw *hw)
|
|
|
(mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
|
|
|
(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
|
|
|
(mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
|
|
|
- hw->fc.type = e1000_fc_tx_pause;
|
|
|
+ hw->fc.current_mode = e1000_fc_tx_pause;
|
|
|
hw_dbg("Flow Control = TX PAUSE frames only.\r\n");
|
|
|
}
|
|
|
/*
|
|
@@ -893,7 +899,7 @@ s32 igb_config_fc_after_link_up(struct e1000_hw *hw)
|
|
|
(mii_nway_adv_reg & NWAY_AR_ASM_DIR) &&
|
|
|
!(mii_nway_lp_ability_reg & NWAY_LPAR_PAUSE) &&
|
|
|
(mii_nway_lp_ability_reg & NWAY_LPAR_ASM_DIR)) {
|
|
|
- hw->fc.type = e1000_fc_rx_pause;
|
|
|
+ hw->fc.current_mode = e1000_fc_rx_pause;
|
|
|
hw_dbg("Flow Control = RX PAUSE frames only.\r\n");
|
|
|
}
|
|
|
/*
|
|
@@ -917,13 +923,13 @@ s32 igb_config_fc_after_link_up(struct e1000_hw *hw)
|
|
|
* be asked to delay transmission of packets than asking
|
|
|
* our link partner to pause transmission of frames.
|
|
|
*/
|
|
|
- else if ((hw->fc.original_type == e1000_fc_none ||
|
|
|
- hw->fc.original_type == e1000_fc_tx_pause) ||
|
|
|
+ else if ((hw->fc.requested_mode == e1000_fc_none ||
|
|
|
+ hw->fc.requested_mode == e1000_fc_tx_pause) ||
|
|
|
hw->fc.strict_ieee) {
|
|
|
- hw->fc.type = e1000_fc_none;
|
|
|
+ hw->fc.current_mode = e1000_fc_none;
|
|
|
hw_dbg("Flow Control = NONE.\r\n");
|
|
|
} else {
|
|
|
- hw->fc.type = e1000_fc_rx_pause;
|
|
|
+ hw->fc.current_mode = e1000_fc_rx_pause;
|
|
|
hw_dbg("Flow Control = RX PAUSE frames only.\r\n");
|
|
|
}
|
|
|
|
|
@@ -939,7 +945,7 @@ s32 igb_config_fc_after_link_up(struct e1000_hw *hw)
|
|
|
}
|
|
|
|
|
|
if (duplex == HALF_DUPLEX)
|
|
|
- hw->fc.type = e1000_fc_none;
|
|
|
+ hw->fc.current_mode = e1000_fc_none;
|
|
|
|
|
|
/*
|
|
|
* Now we call a subroutine to actually force the MAC
|