ar71xx: ag71xx: move link update function
SVN-Revision: 20003
This commit is contained in:
		
							parent
							
								
									eacf9a7614
								
							
						
					
					
						commit
						a4bccded57
					
				| @ -172,6 +172,7 @@ struct ag71xx { | ||||
| }; | ||||
| 
 | ||||
| extern struct ethtool_ops ag71xx_ethtool_ops; | ||||
| void ag71xx_link_adjust(struct ag71xx *ag); | ||||
| 
 | ||||
| int ag71xx_mdio_driver_init(void) __init; | ||||
| void ag71xx_mdio_driver_exit(void); | ||||
|  | ||||
| @ -310,6 +310,107 @@ static void ag71xx_rings_cleanup(struct ag71xx *ag) | ||||
| 	ag71xx_ring_free(&ag->tx_ring); | ||||
| } | ||||
| 
 | ||||
| static unsigned char *ag71xx_speed_str(struct ag71xx *ag) | ||||
| { | ||||
| 	switch (ag->speed) { | ||||
| 	case SPEED_1000: | ||||
| 		return "1000"; | ||||
| 	case SPEED_100: | ||||
| 		return "100"; | ||||
| 	case SPEED_10: | ||||
| 		return "10"; | ||||
| 	} | ||||
| 
 | ||||
| 	return "?"; | ||||
| } | ||||
| 
 | ||||
| void ag71xx_link_adjust(struct ag71xx *ag) | ||||
| { | ||||
| 	struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); | ||||
| 	u32 cfg2; | ||||
| 	u32 ifctl; | ||||
| 	u32 fifo5; | ||||
| 	u32 mii_speed; | ||||
| 
 | ||||
| 	if (!ag->link) { | ||||
| 		netif_carrier_off(ag->dev); | ||||
| 		if (netif_msg_link(ag)) | ||||
| 			printk(KERN_INFO "%s: link down\n", ag->dev->name); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	cfg2 = ag71xx_rr(ag, AG71XX_REG_MAC_CFG2); | ||||
| 	cfg2 &= ~(MAC_CFG2_IF_1000 | MAC_CFG2_IF_10_100 | MAC_CFG2_FDX); | ||||
| 	cfg2 |= (ag->duplex) ? MAC_CFG2_FDX : 0; | ||||
| 
 | ||||
| 	ifctl = ag71xx_rr(ag, AG71XX_REG_MAC_IFCTL); | ||||
| 	ifctl &= ~(MAC_IFCTL_SPEED); | ||||
| 
 | ||||
| 	fifo5 = ag71xx_rr(ag, AG71XX_REG_FIFO_CFG5); | ||||
| 	fifo5 &= ~FIFO_CFG5_BM; | ||||
| 
 | ||||
| 	switch (ag->speed) { | ||||
| 	case SPEED_1000: | ||||
| 		mii_speed =  MII_CTRL_SPEED_1000; | ||||
| 		cfg2 |= MAC_CFG2_IF_1000; | ||||
| 		fifo5 |= FIFO_CFG5_BM; | ||||
| 		break; | ||||
| 	case SPEED_100: | ||||
| 		mii_speed = MII_CTRL_SPEED_100; | ||||
| 		cfg2 |= MAC_CFG2_IF_10_100; | ||||
| 		ifctl |= MAC_IFCTL_SPEED; | ||||
| 		break; | ||||
| 	case SPEED_10: | ||||
| 		mii_speed = MII_CTRL_SPEED_10; | ||||
| 		cfg2 |= MAC_CFG2_IF_10_100; | ||||
| 		break; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	if (pdata->is_ar91xx) | ||||
| 		ag71xx_wr(ag, AG71XX_REG_FIFO_CFG3, 0x00780fff); | ||||
| 	else if (pdata->is_ar724x) | ||||
| 		ag71xx_wr(ag, AG71XX_REG_FIFO_CFG3, pdata->fifo_cfg3); | ||||
| 	else | ||||
| 		ag71xx_wr(ag, AG71XX_REG_FIFO_CFG3, 0x008001ff); | ||||
| 
 | ||||
| 	if (pdata->set_pll) | ||||
| 		pdata->set_pll(ag->speed); | ||||
| 
 | ||||
| 	ag71xx_mii_ctrl_set_speed(ag, mii_speed); | ||||
| 
 | ||||
| 	ag71xx_wr(ag, AG71XX_REG_MAC_CFG2, cfg2); | ||||
| 	ag71xx_wr(ag, AG71XX_REG_FIFO_CFG5, fifo5); | ||||
| 	ag71xx_wr(ag, AG71XX_REG_MAC_IFCTL, ifctl); | ||||
| 
 | ||||
| 	netif_carrier_on(ag->dev); | ||||
| 	if (netif_msg_link(ag)) | ||||
| 		printk(KERN_INFO "%s: link up (%sMbps/%s duplex)\n", | ||||
| 			ag->dev->name, | ||||
| 			ag71xx_speed_str(ag), | ||||
| 			(DUPLEX_FULL == ag->duplex) ? "Full" : "Half"); | ||||
| 
 | ||||
| 	DBG("%s: fifo_cfg0=%#x, fifo_cfg1=%#x, fifo_cfg2=%#x\n", | ||||
| 		ag->dev->name, | ||||
| 		ag71xx_rr(ag, AG71XX_REG_FIFO_CFG0), | ||||
| 		ag71xx_rr(ag, AG71XX_REG_FIFO_CFG1), | ||||
| 		ag71xx_rr(ag, AG71XX_REG_FIFO_CFG2)); | ||||
| 
 | ||||
| 	DBG("%s: fifo_cfg3=%#x, fifo_cfg4=%#x, fifo_cfg5=%#x\n", | ||||
| 		ag->dev->name, | ||||
| 		ag71xx_rr(ag, AG71XX_REG_FIFO_CFG3), | ||||
| 		ag71xx_rr(ag, AG71XX_REG_FIFO_CFG4), | ||||
| 		ag71xx_rr(ag, AG71XX_REG_FIFO_CFG5)); | ||||
| 
 | ||||
| 	DBG("%s: mac_cfg2=%#x, mac_ifctl=%#x, mii_ctrl=%#x\n", | ||||
| 		ag->dev->name, | ||||
| 		ag71xx_rr(ag, AG71XX_REG_MAC_CFG2), | ||||
| 		ag71xx_rr(ag, AG71XX_REG_MAC_IFCTL), | ||||
| 		ag71xx_mii_ctrl_rr(ag)); | ||||
| } | ||||
| 
 | ||||
| static void ag71xx_hw_set_macaddr(struct ag71xx *ag, unsigned char *mac) | ||||
| { | ||||
| 	u32 t; | ||||
|  | ||||
| @ -13,107 +13,6 @@ | ||||
| 
 | ||||
| #include "ag71xx.h" | ||||
| 
 | ||||
| static unsigned char *ag71xx_speed_str(struct ag71xx *ag) | ||||
| { | ||||
| 	switch (ag->speed) { | ||||
| 	case SPEED_1000: | ||||
| 		return "1000"; | ||||
| 	case SPEED_100: | ||||
| 		return "100"; | ||||
| 	case SPEED_10: | ||||
| 		return "10"; | ||||
| 	} | ||||
| 
 | ||||
| 	return "?"; | ||||
| } | ||||
| 
 | ||||
| static void ag71xx_phy_link_update(struct ag71xx *ag) | ||||
| { | ||||
| 	struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); | ||||
| 	u32 cfg2; | ||||
| 	u32 ifctl; | ||||
| 	u32 fifo5; | ||||
| 	u32 mii_speed; | ||||
| 
 | ||||
| 	if (!ag->link) { | ||||
| 		netif_carrier_off(ag->dev); | ||||
| 		if (netif_msg_link(ag)) | ||||
| 			printk(KERN_INFO "%s: link down\n", ag->dev->name); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	cfg2 = ag71xx_rr(ag, AG71XX_REG_MAC_CFG2); | ||||
| 	cfg2 &= ~(MAC_CFG2_IF_1000 | MAC_CFG2_IF_10_100 | MAC_CFG2_FDX); | ||||
| 	cfg2 |= (ag->duplex) ? MAC_CFG2_FDX : 0; | ||||
| 
 | ||||
| 	ifctl = ag71xx_rr(ag, AG71XX_REG_MAC_IFCTL); | ||||
| 	ifctl &= ~(MAC_IFCTL_SPEED); | ||||
| 
 | ||||
| 	fifo5 = ag71xx_rr(ag, AG71XX_REG_FIFO_CFG5); | ||||
| 	fifo5 &= ~FIFO_CFG5_BM; | ||||
| 
 | ||||
| 	switch (ag->speed) { | ||||
| 	case SPEED_1000: | ||||
| 		mii_speed =  MII_CTRL_SPEED_1000; | ||||
| 		cfg2 |= MAC_CFG2_IF_1000; | ||||
| 		fifo5 |= FIFO_CFG5_BM; | ||||
| 		break; | ||||
| 	case SPEED_100: | ||||
| 		mii_speed = MII_CTRL_SPEED_100; | ||||
| 		cfg2 |= MAC_CFG2_IF_10_100; | ||||
| 		ifctl |= MAC_IFCTL_SPEED; | ||||
| 		break; | ||||
| 	case SPEED_10: | ||||
| 		mii_speed = MII_CTRL_SPEED_10; | ||||
| 		cfg2 |= MAC_CFG2_IF_10_100; | ||||
| 		break; | ||||
| 	default: | ||||
| 		BUG(); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	if (pdata->is_ar91xx) | ||||
| 		ag71xx_wr(ag, AG71XX_REG_FIFO_CFG3, 0x00780fff); | ||||
| 	else if (pdata->is_ar724x) | ||||
| 		ag71xx_wr(ag, AG71XX_REG_FIFO_CFG3, pdata->fifo_cfg3); | ||||
| 	else | ||||
| 		ag71xx_wr(ag, AG71XX_REG_FIFO_CFG3, 0x008001ff); | ||||
| 
 | ||||
| 	if (pdata->set_pll) | ||||
| 		pdata->set_pll(ag->speed); | ||||
| 
 | ||||
| 	ag71xx_mii_ctrl_set_speed(ag, mii_speed); | ||||
| 
 | ||||
| 	ag71xx_wr(ag, AG71XX_REG_MAC_CFG2, cfg2); | ||||
| 	ag71xx_wr(ag, AG71XX_REG_FIFO_CFG5, fifo5); | ||||
| 	ag71xx_wr(ag, AG71XX_REG_MAC_IFCTL, ifctl); | ||||
| 
 | ||||
| 	netif_carrier_on(ag->dev); | ||||
| 	if (netif_msg_link(ag)) | ||||
| 		printk(KERN_INFO "%s: link up (%sMbps/%s duplex)\n", | ||||
| 			ag->dev->name, | ||||
| 			ag71xx_speed_str(ag), | ||||
| 			(DUPLEX_FULL == ag->duplex) ? "Full" : "Half"); | ||||
| 
 | ||||
| 	DBG("%s: fifo_cfg0=%#x, fifo_cfg1=%#x, fifo_cfg2=%#x\n", | ||||
| 		ag->dev->name, | ||||
| 		ag71xx_rr(ag, AG71XX_REG_FIFO_CFG0), | ||||
| 		ag71xx_rr(ag, AG71XX_REG_FIFO_CFG1), | ||||
| 		ag71xx_rr(ag, AG71XX_REG_FIFO_CFG2)); | ||||
| 
 | ||||
| 	DBG("%s: fifo_cfg3=%#x, fifo_cfg4=%#x, fifo_cfg5=%#x\n", | ||||
| 		ag->dev->name, | ||||
| 		ag71xx_rr(ag, AG71XX_REG_FIFO_CFG3), | ||||
| 		ag71xx_rr(ag, AG71XX_REG_FIFO_CFG4), | ||||
| 		ag71xx_rr(ag, AG71XX_REG_FIFO_CFG5)); | ||||
| 
 | ||||
| 	DBG("%s: mac_cfg2=%#x, mac_ifctl=%#x, mii_ctrl=%#x\n", | ||||
| 		ag->dev->name, | ||||
| 		ag71xx_rr(ag, AG71XX_REG_MAC_CFG2), | ||||
| 		ag71xx_rr(ag, AG71XX_REG_MAC_IFCTL), | ||||
| 		ag71xx_mii_ctrl_rr(ag)); | ||||
| } | ||||
| 
 | ||||
| static void ag71xx_phy_link_adjust(struct net_device *dev) | ||||
| { | ||||
| 	struct ag71xx *ag = netdev_priv(dev); | ||||
| @ -138,7 +37,7 @@ static void ag71xx_phy_link_adjust(struct net_device *dev) | ||||
| 	ag->speed = phydev->speed; | ||||
| 
 | ||||
| 	if (status_change) | ||||
| 		ag71xx_phy_link_update(ag); | ||||
| 		ag71xx_link_adjust(ag); | ||||
| 
 | ||||
| 	spin_unlock_irqrestore(&ag->lock, flags); | ||||
| } | ||||
| @ -153,7 +52,7 @@ void ag71xx_phy_start(struct ag71xx *ag) | ||||
| 		ag->duplex = pdata->duplex; | ||||
| 		ag->speed = pdata->speed; | ||||
| 		ag->link = 1; | ||||
| 		ag71xx_phy_link_update(ag); | ||||
| 		ag71xx_link_adjust(ag); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -165,7 +64,7 @@ void ag71xx_phy_stop(struct ag71xx *ag) | ||||
| 		ag->duplex = -1; | ||||
| 		ag->link = 0; | ||||
| 		ag->speed = 0; | ||||
| 		ag71xx_phy_link_update(ag); | ||||
| 		ag71xx_link_adjust(ag); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user