132 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			132 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From e3eab80fb5d0a7d7fdb0f2f231b27161d5ec3804 Mon Sep 17 00:00:00 2001
 | |
| From: Jonas Gorski <jogo@openwrt.org>
 | |
| Date: Sun, 30 Jun 2013 15:52:53 +0200
 | |
| Subject: [PATCH 23/36] 205-npe_driver_separate_phy_functions.patch
 | |
| 
 | |
| ---
 | |
|  drivers/net/ethernet/xscale/ixp4xx_eth.c |   70 ++++++++++++++++++++++--------
 | |
|  1 file changed, 51 insertions(+), 19 deletions(-)
 | |
| 
 | |
| --- a/drivers/net/ethernet/xscale/ixp4xx_eth.c
 | |
| +++ b/drivers/net/ethernet/xscale/ixp4xx_eth.c
 | |
| @@ -593,6 +593,51 @@ static void ixp4xx_adjust_link(struct ne
 | |
|  	       dev->name, port->speed, port->duplex ? "full" : "half");
 | |
|  }
 | |
|  
 | |
| +static int ixp4xx_phy_connect(struct net_device *dev)
 | |
| +{
 | |
| +	struct port *port = netdev_priv(dev);
 | |
| +	struct eth_plat_info *plat = port->plat;
 | |
| +	char phy_id[MII_BUS_ID_SIZE + 3];
 | |
| +
 | |
| +	snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT,
 | |
| +		mdio_bus->id, plat->phy);
 | |
| +	port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link,
 | |
| +				   PHY_INTERFACE_MODE_MII);
 | |
| +	if (IS_ERR(port->phydev)) {
 | |
| +		printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name);
 | |
| +		return PTR_ERR(port->phydev);
 | |
| +	}
 | |
| +
 | |
| +	/* mask with MAC supported features */
 | |
| +	port->phydev->supported &= PHY_BASIC_FEATURES;
 | |
| +	port->phydev->advertising = port->phydev->supported;
 | |
| +
 | |
| +	port->phydev->irq = PHY_POLL;
 | |
| +
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
| +static void ixp4xx_phy_disconnect(struct net_device *dev)
 | |
| +{
 | |
| +	struct port *port = netdev_priv(dev);
 | |
| +
 | |
| +	phy_disconnect(port->phydev);
 | |
| +}
 | |
| +
 | |
| +static void ixp4xx_phy_start(struct net_device *dev)
 | |
| +{
 | |
| +	struct port *port = netdev_priv(dev);
 | |
| +
 | |
| +	port->speed = 0;	/* force "link up" message */
 | |
| +	phy_start(port->phydev);
 | |
| +}
 | |
| +
 | |
| +static void ixp4xx_phy_stop(struct net_device *dev)
 | |
| +{
 | |
| +	struct port *port = netdev_priv(dev);
 | |
| +
 | |
| +	phy_stop(port->phydev);
 | |
| +}
 | |
|  
 | |
|  static inline void debug_pkt(struct net_device *dev, const char *func,
 | |
|  			     u8 *data, int len)
 | |
| @@ -1263,8 +1308,7 @@ static int eth_open(struct net_device *d
 | |
|  		return err;
 | |
|  	}
 | |
|  
 | |
| -	port->speed = 0;	/* force "link up" message */
 | |
| -	phy_start(port->phydev);
 | |
| +	ixp4xx_phy_start(dev);
 | |
|  
 | |
|  	for (i = 0; i < ETH_ALEN; i++)
 | |
|  		__raw_writel(dev->dev_addr[i], &port->regs->hw_addr[i]);
 | |
| @@ -1385,7 +1429,7 @@ static int eth_close(struct net_device *
 | |
|  		printk(KERN_CRIT "%s: unable to disable loopback\n",
 | |
|  		       dev->name);
 | |
|  
 | |
| -	phy_stop(port->phydev);
 | |
| +	ixp4xx_phy_stop(dev);
 | |
|  
 | |
|  	if (!ports_open)
 | |
|  		qmgr_disable_irq(TXDONE_QUEUE);
 | |
| @@ -1411,7 +1455,6 @@ static int eth_init_one(struct platform_
 | |
|  	struct net_device *dev;
 | |
|  	struct eth_plat_info *plat = dev_get_platdata(&pdev->dev);
 | |
|  	u32 regs_phys;
 | |
| -	char phy_id[MII_BUS_ID_SIZE + 3];
 | |
|  	int err;
 | |
|  
 | |
|  	if (ptp_filter_init(ptp_filter, ARRAY_SIZE(ptp_filter))) {
 | |
| @@ -1474,20 +1517,9 @@ static int eth_init_one(struct platform_
 | |
|  	__raw_writel(DEFAULT_CORE_CNTRL, &port->regs->core_control);
 | |
|  	udelay(50);
 | |
|  
 | |
| -	snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT,
 | |
| -		mdio_bus->id, plat->phy);
 | |
| -	port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link,
 | |
| -				   PHY_INTERFACE_MODE_MII);
 | |
| -	if (IS_ERR(port->phydev)) {
 | |
| -		err = PTR_ERR(port->phydev);
 | |
| +	err = ixp4xx_phy_connect(dev);
 | |
| +	if (err)
 | |
|  		goto err_free_mem;
 | |
| -	}
 | |
| -
 | |
| -	/* mask with MAC supported features */
 | |
| -	port->phydev->supported &= PHY_BASIC_FEATURES;
 | |
| -	port->phydev->advertising = port->phydev->supported;
 | |
| -
 | |
| -	port->phydev->irq = PHY_POLL;
 | |
|  
 | |
|  	if ((err = register_netdev(dev)))
 | |
|  		goto err_phy_dis;
 | |
| @@ -1498,7 +1530,7 @@ static int eth_init_one(struct platform_
 | |
|  	return 0;
 | |
|  
 | |
|  err_phy_dis:
 | |
| -	phy_disconnect(port->phydev);
 | |
| +	ixp4xx_phy_disconnect(dev);
 | |
|  err_free_mem:
 | |
|  	npe_port_tab[NPE_ID(port->id)] = NULL;
 | |
|  	release_resource(port->mem_res);
 | |
| @@ -1515,7 +1547,7 @@ static int eth_remove_one(struct platfor
 | |
|  	struct port *port = netdev_priv(dev);
 | |
|  
 | |
|  	unregister_netdev(dev);
 | |
| -	phy_disconnect(port->phydev);
 | |
| +	ixp4xx_phy_disconnect(dev);
 | |
|  	npe_port_tab[NPE_ID(port->id)] = NULL;
 | |
|  	npe_release(port->npe);
 | |
|  	release_resource(port->mem_res);
 |