diff options
Diffstat (limited to 'drivers/net/e1000.c')
| -rw-r--r-- | drivers/net/e1000.c | 66 | 
1 files changed, 33 insertions, 33 deletions
| diff --git a/drivers/net/e1000.c b/drivers/net/e1000.c index 01bdf814f..7c0f2bf71 100644 --- a/drivers/net/e1000.c +++ b/drivers/net/e1000.c @@ -1099,6 +1099,20 @@ e1000_swfw_sync_acquire(struct e1000_hw *hw, uint16_t mask)  	return E1000_SUCCESS;  } +static boolean_t e1000_is_second_port(struct e1000_hw *hw) +{ +	switch (hw->mac_type) { +	case e1000_80003es2lan: +	case e1000_82546: +	case e1000_82571: +		if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) +			return TRUE; +		/* Fallthrough */ +	default: +		return FALSE; +	} +} +  /******************************************************************************   * Reads the adapter's MAC address from the EEPROM and inverts the LSB for the   * second function of dual function devices @@ -1125,11 +1139,11 @@ e1000_read_mac_addr(struct eth_device *nic)  		nic->enetaddr[i] = eeprom_data & 0xff;  		nic->enetaddr[i + 1] = (eeprom_data >> 8) & 0xff;  	} -	if ((hw->mac_type == e1000_82546) && -	    (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { -		/* Invert the last bit if this is the second device */ -		nic->enetaddr[5] += 1; -	} + +	/* Invert the last bit if this is the second device */ +	if (e1000_is_second_port(hw)) +		nic->enetaddr[5] ^= 1; +  #ifdef CONFIG_E1000_FALLBACK_MAC  	if ( *(u32*)(nic->enetaddr) == 0 || *(u32*)(nic->enetaddr) == ~0 ) {  		unsigned char fb_mac[NODE_ADDRESS_SIZE] = CONFIG_E1000_FALLBACK_MAC; @@ -2535,16 +2549,13 @@ e1000_check_mng_mode(struct e1000_hw *hw)  static int32_t  e1000_write_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t data)  { +	uint16_t swfw = E1000_SWFW_PHY0_SM;  	uint32_t reg_val; -	uint16_t swfw;  	DEBUGFUNC(); -	if ((hw->mac_type == e1000_80003es2lan) && -		(E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { +	if (e1000_is_second_port(hw))  		swfw = E1000_SWFW_PHY1_SM; -	} else { -		swfw = E1000_SWFW_PHY0_SM; -	} +  	if (e1000_swfw_sync_acquire(hw, swfw))  		return -E1000_ERR_SWFW_SYNC; @@ -2559,16 +2570,13 @@ e1000_write_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t data)  static int32_t  e1000_read_kmrn_reg(struct e1000_hw *hw, uint32_t reg_addr, uint16_t *data)  { +	uint16_t swfw = E1000_SWFW_PHY0_SM;  	uint32_t reg_val; -	uint16_t swfw;  	DEBUGFUNC(); -	if ((hw->mac_type == e1000_80003es2lan) && -	    (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { +	if (e1000_is_second_port(hw))  		swfw = E1000_SWFW_PHY1_SM; -	} else { -		swfw = E1000_SWFW_PHY0_SM; -	} +  	if (e1000_swfw_sync_acquire(hw, swfw))  		return -E1000_ERR_SWFW_SYNC; @@ -4266,11 +4274,13 @@ e1000_get_phy_cfg_done(struct e1000_hw *hw)  	default:  		mdelay(10);  		break; +  	case e1000_80003es2lan:  		/* Separate *_CFG_DONE_* bit for each port */ -		if (E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1) +		if (e1000_is_second_port(hw))  			cfg_mask = E1000_EEPROM_CFG_DONE_PORT_1; -	/* Fall Through */ +		/* Fall Through */ +  	case e1000_82571:  	case e1000_82572:  		while (timeout) { @@ -4299,10 +4309,10 @@ e1000_get_phy_cfg_done(struct e1000_hw *hw)  int32_t  e1000_phy_hw_reset(struct e1000_hw *hw)  { +	uint16_t swfw = E1000_SWFW_PHY0_SM;  	uint32_t ctrl, ctrl_ext;  	uint32_t led_ctrl;  	int32_t ret_val; -	uint16_t swfw;  	DEBUGFUNC(); @@ -4315,16 +4325,14 @@ e1000_phy_hw_reset(struct e1000_hw *hw)  	DEBUGOUT("Resetting Phy...\n");  	if (hw->mac_type > e1000_82543) { -		if ((hw->mac_type == e1000_80003es2lan) && -			(E1000_READ_REG(hw, STATUS) & E1000_STATUS_FUNC_1)) { +		if (e1000_is_second_port(hw))  			swfw = E1000_SWFW_PHY1_SM; -		} else { -			swfw = E1000_SWFW_PHY0_SM; -		} +  		if (e1000_swfw_sync_acquire(hw, swfw)) {  			DEBUGOUT("Unable to acquire swfw sync\n");  			return -E1000_ERR_SWFW_SYNC;  		} +  		/* Read the device control register and assert the E1000_CTRL_PHY_RST  		 * bit. Then, take it out of reset.  		 */ @@ -4786,14 +4794,6 @@ e1000_sw_init(struct eth_device *nic, int cardnum)  		break;  	} -	/* lan a vs. lan b settings */ -	if (hw->mac_type == e1000_82546) -		/*this also works w/ multiple 82546 cards */ -		/*but not if they're intermingled /w other e1000s */ -		hw->lan_loc = (cardnum % 2) ? e1000_lan_b : e1000_lan_a; -	else -		hw->lan_loc = e1000_lan_a; -  	/* flow control settings */  	hw->fc_high_water = E1000_FC_HIGH_THRESH;  	hw->fc_low_water = E1000_FC_LOW_THRESH; |