diff options
Diffstat (limited to 'drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c')
| -rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c | 80 | 
1 files changed, 14 insertions, 66 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c index 09096b43a6e..1663e0b6b5a 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c @@ -1,4 +1,4 @@ -/* Copyright 2008-2012 Broadcom Corporation +/* Copyright 2008-2013 Broadcom Corporation   *   * Unless you and Broadcom execute a separate written software license   * agreement governing use of this software, this software is licensed to you @@ -3659,7 +3659,7 @@ static void bnx2x_warpcore_enable_AN_KR2(struct bnx2x_phy *phy,  	bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,  				 MDIO_WC_REG_CL49_USERB0_CTRL, (3<<6)); -	for (i = 0; i < sizeof(reg_set)/sizeof(struct bnx2x_reg_set); i++) +	for (i = 0; i < ARRAY_SIZE(reg_set); i++)  		bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg,  				 reg_set[i].val); @@ -3713,7 +3713,7 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy,  	};  	DP(NETIF_MSG_LINK, "Enable Auto Negotiation for KR\n");  	/* Set to default registers that may be overriden by 10G force */ -	for (i = 0; i < sizeof(reg_set)/sizeof(struct bnx2x_reg_set); i++) +	for (i = 0; i < ARRAY_SIZE(reg_set); i++)  		bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg,  				 reg_set[i].val); @@ -3854,7 +3854,7 @@ static void bnx2x_warpcore_set_10G_KR(struct bnx2x_phy *phy,  		{MDIO_PMA_DEVAD, MDIO_WC_REG_PMD_KR_CONTROL, 0x2}  	}; -	for (i = 0; i < sizeof(reg_set)/sizeof(struct bnx2x_reg_set); i++) +	for (i = 0; i < ARRAY_SIZE(reg_set); i++)  		bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg,  				 reg_set[i].val); @@ -4242,7 +4242,7 @@ static void bnx2x_warpcore_clear_regs(struct bnx2x_phy *phy,  	bnx2x_cl45_read_or_write(bp, phy, MDIO_WC_DEVAD,  				 MDIO_WC_REG_RX66_CONTROL, (3<<13)); -	for (i = 0; i < sizeof(wc_regs)/sizeof(struct bnx2x_reg_set); i++) +	for (i = 0; i < ARRAY_SIZE(wc_regs); i++)  		bnx2x_cl45_write(bp, phy, wc_regs[i].devad, wc_regs[i].reg,  				 wc_regs[i].val); @@ -4748,6 +4748,12 @@ void bnx2x_link_status_update(struct link_params *params,  	vars->link_status = REG_RD(bp, params->shmem_base +  				   offsetof(struct shmem_region,  					    port_mb[port].link_status)); + +	/* Force link UP in non LOOPBACK_EXT loopback mode(s) */ +	if (bp->link_params.loopback_mode != LOOPBACK_NONE && +	    bp->link_params.loopback_mode != LOOPBACK_EXT) +		vars->link_status |= LINK_STATUS_LINK_UP; +  	if (bnx2x_eee_has_cap(params))  		vars->eee_status = REG_RD(bp, params->shmem2_base +  					  offsetof(struct shmem2_region, @@ -9520,7 +9526,7 @@ static void bnx2x_save_848xx_spirom_version(struct bnx2x_phy *phy,  	} else {  		/* For 32-bit registers in 848xx, access via MDIO2ARM i/f. */  		/* (1) set reg 0xc200_0014(SPI_BRIDGE_CTRL_2) to 0x03000000 */ -		for (i = 0; i < sizeof(reg_set)/sizeof(struct bnx2x_reg_set); +		for (i = 0; i < ARRAY_SIZE(reg_set);  		      i++)  			bnx2x_cl45_write(bp, phy, reg_set[i].devad,  					 reg_set[i].reg, reg_set[i].val); @@ -9592,7 +9598,7 @@ static void bnx2x_848xx_set_led(struct bnx2x *bp,  			 MDIO_PMA_DEVAD,  			 MDIO_PMA_REG_8481_LINK_SIGNAL, val); -	for (i = 0; i < sizeof(reg_set)/sizeof(struct bnx2x_reg_set); i++) +	for (i = 0; i < ARRAY_SIZE(reg_set); i++)  		bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg,  				 reg_set[i].val); @@ -13007,64 +13013,6 @@ static int bnx2x_84833_common_init_phy(struct bnx2x *bp,  	return 0;  } -static int bnx2x_84833_pre_init_phy(struct bnx2x *bp, -				    struct bnx2x_phy *phy, -				    u8 port) -{ -	u16 val, cnt; -	/* Wait for FW completing its initialization. */ -	for (cnt = 0; cnt < 1500; cnt++) { -		bnx2x_cl45_read(bp, phy, -				MDIO_PMA_DEVAD, -				MDIO_PMA_REG_CTRL, &val); -		if (!(val & (1<<15))) -			break; -		usleep_range(1000, 2000); -	} -	if (cnt >= 1500) { -		DP(NETIF_MSG_LINK, "84833 reset timeout\n"); -		return -EINVAL; -	} - -	/* Put the port in super isolate mode. */ -	bnx2x_cl45_read(bp, phy, -			MDIO_CTL_DEVAD, -			MDIO_84833_TOP_CFG_XGPHY_STRAP1, &val); -	val |= MDIO_84833_SUPER_ISOLATE; -	bnx2x_cl45_write(bp, phy, -			 MDIO_CTL_DEVAD, -			 MDIO_84833_TOP_CFG_XGPHY_STRAP1, val); - -	/* Save spirom version */ -	bnx2x_save_848xx_spirom_version(phy, bp, port); -	return 0; -} - -int bnx2x_pre_init_phy(struct bnx2x *bp, -				  u32 shmem_base, -				  u32 shmem2_base, -				  u32 chip_id, -				  u8 port) -{ -	int rc = 0; -	struct bnx2x_phy phy; -	if (bnx2x_populate_phy(bp, EXT_PHY1, shmem_base, shmem2_base, -			       port, &phy) != 0) { -		DP(NETIF_MSG_LINK, "populate_phy failed\n"); -		return -EINVAL; -	} -	bnx2x_set_mdio_clk(bp, chip_id, phy.mdio_ctrl); -	switch (phy.type) { -	case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84833: -	case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM84834: -		rc = bnx2x_84833_pre_init_phy(bp, &phy, port); -		break; -	default: -		break; -	} -	return rc; -} -  static int bnx2x_ext_phy_common_init(struct bnx2x *bp, u32 shmem_base_path[],  				     u32 shmem2_base_path[], u8 phy_index,  				     u32 ext_phy_type, u32 chip_id) @@ -13395,7 +13343,7 @@ static void bnx2x_disable_kr2(struct link_params *params,  	};  	DP(NETIF_MSG_LINK, "Disabling 20G-KR2\n"); -	for (i = 0; i < sizeof(reg_set)/sizeof(struct bnx2x_reg_set); i++) +	for (i = 0; i < ARRAY_SIZE(reg_set); i++)  		bnx2x_cl45_write(bp, phy, reg_set[i].devad, reg_set[i].reg,  				 reg_set[i].val);  	vars->link_attr_sync &= ~LINK_ATTR_SYNC_KR2_ENABLE;  |