source: trunk/target/linux/ixp4xx/patches-2.6.30/207-npe_driver_multiphy_support.patch @ 15500

Last change on this file since 15500 was 15500, checked in by kaloz, 8 years ago

merge [15491] for 2.6.30

File size: 3.6 KB
  • arch/arm/mach-ixp4xx/include/mach/platform.h

    TODO: take care of additional PHYs through the PHY abstraction layer
    
    a b extern unsigned long ixp4xx_exp_bus_size 
    7272/* 
    7373 * Clock Speed Definitions. 
    7474 */ 
    75 #define IXP4XX_PERIPHERAL_BUS_CLOCK     (66) /* 66Mhzi APB BUS   */  
     75#define IXP4XX_PERIPHERAL_BUS_CLOCK     (66) /* 66Mhzi APB BUS   */ 
    7676#define IXP4XX_UART_XTAL                14745600 
    7777 
    7878/* 
    struct sys_timer; 
    9595#define IXP4XX_ETH_NPEB         0x10 
    9696#define IXP4XX_ETH_NPEC         0x20 
    9797 
     98#define IXP4XX_ETH_PHY_MAX_ADDR 32 
     99 
    98100/* Information about built-in Ethernet MAC interfaces */ 
    99101struct eth_plat_info { 
    100102        u8 phy;         /* MII PHY ID, 0 - 31 */ 
    101103        u8 rxq;         /* configurable, currently 0 - 31 only */ 
    102104        u8 txreadyq; 
    103105        u8 hwaddr[6]; 
     106 
     107        u32 phy_mask; 
     108#if 0 
     109        int speed; 
     110        int duplex; 
     111#else 
     112        int speed_10; 
     113        int half_duplex; 
     114#endif 
    104115}; 
    105116 
    106117/* Information about built-in HSS (synchronous serial) interfaces */ 
  • drivers/net/arm/ixp4xx_eth.c

    a b static int ixp4xx_phy_connect(struct net 
    417417        struct eth_plat_info *plat = port->plat; 
    418418        char phy_id[BUS_ID_SIZE]; 
    419419 
     420        if (plat->phy == IXP4XX_ETH_PHY_MAX_ADDR) { 
     421#if 0 
     422                switch (plat->speed) { 
     423                case SPEED_10: 
     424                case SPEED_100: 
     425                        break; 
     426                default: 
     427                        printk(KERN_ERR "%s: invalid speed (%d)\n", 
     428                                        dev->name, plat->speed); 
     429                        return -EINVAL; 
     430                } 
     431 
     432                switch (plat->duplex) { 
     433                case DUPLEX_HALF: 
     434                case DUPLEX_FULL: 
     435                        break; 
     436                default: 
     437                        printk(KERN_ERR "%s: invalid duplex mode (%d)\n", 
     438                                        dev->name, plat->duplex); 
     439                        return -EINVAL; 
     440                } 
     441                port->speed = plat->speed; 
     442                port->duplex = plat->duplex; 
     443#else 
     444                port->speed = plat->speed_10 ? SPEED_10 : SPEED_100; 
     445                port->duplex = plat->half_duplex ? DUPLEX_HALF : DUPLEX_FULL; 
     446#endif 
     447 
     448                return 0; 
     449        } 
     450 
    420451        snprintf(phy_id, BUS_ID_SIZE, PHY_ID_FMT, "0", plat->phy); 
    421452        port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link, 0, 
    422453                                   PHY_INTERFACE_MODE_MII); 
    static void ixp4xx_phy_disconnect(struct 
    445476{ 
    446477        struct port *port = netdev_priv(dev); 
    447478 
    448         phy_disconnect(port->phydev); 
     479        if (port->phydev) 
     480                phy_disconnect(port->phydev); 
    449481} 
    450482 
    451483static void ixp4xx_phy_start(struct net_device *dev) 
    452484{ 
    453485        struct port *port = netdev_priv(dev); 
    454486 
    455         phy_start(port->phydev); 
     487        if (port->phydev) { 
     488                phy_start(port->phydev); 
     489        } else { 
     490                port->link = 1; 
     491                ixp4xx_update_link(dev); 
     492        } 
    456493} 
    457494 
    458495static void ixp4xx_phy_stop(struct net_device *dev) 
    459496{ 
    460497        struct port *port = netdev_priv(dev); 
    461498 
    462         phy_stop(port->phydev); 
     499        if (port->phydev) { 
     500                phy_stop(port->phydev); 
     501        } else { 
     502                port->link = 0; 
     503                ixp4xx_update_link(dev); 
     504        } 
    463505} 
    464506 
    465507static inline void debug_pkt(struct net_device *dev, const char *func, 
    static int eth_ioctl(struct net_device * 
    831873 
    832874        if (!netif_running(dev)) 
    833875                return -EINVAL; 
     876 
     877        if (!port->phydev) 
     878                return -EOPNOTSUPP; 
     879 
    834880        return phy_mii_ioctl(port->phydev, if_mii(req), cmd); 
    835881} 
    836882 
    static void ixp4xx_get_drvinfo(struct ne 
    850896static int ixp4xx_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) 
    851897{ 
    852898        struct port *port = netdev_priv(dev); 
     899 
     900        if (!port->phydev) 
     901                return -EOPNOTSUPP; 
     902 
    853903        return phy_ethtool_gset(port->phydev, cmd); 
    854904} 
    855905 
    856906static int ixp4xx_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) 
    857907{ 
    858908        struct port *port = netdev_priv(dev); 
     909 
     910        if (!port->phydev) 
     911                return -EOPNOTSUPP; 
     912 
    859913        return phy_ethtool_sset(port->phydev, cmd); 
    860914} 
    861915 
    862916static int ixp4xx_nway_reset(struct net_device *dev) 
    863917{ 
    864918        struct port *port = netdev_priv(dev); 
     919 
     920        if (!port->phydev) 
     921                return -EOPNOTSUPP; 
     922 
    865923        return phy_start_aneg(port->phydev); 
    866924} 
    867925 
Note: See TracBrowser for help on using the repository browser.