Changeset 30547


Ignore:
Timestamp:
2012-02-15T07:47:12+01:00 (6 years ago)
Author:
juhosg
Message:

ramips: raeth: add PHYLIB support

Location:
trunk/target/linux/ramips
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ramips/files/arch/mips/include/asm/mach-ralink/ramips_eth_platform.h

    r22211 r30547  
    2020#define _RAMIPS_ETH_PLATFORM_H 
    2121 
     22#include <linux/phy.h> 
     23 
    2224struct ramips_eth_platform_data 
    2325{ 
     
    3133        int tx_fc; 
    3234        int rx_fc; 
     35 
     36        u32 phy_mask; 
     37        phy_interface_t phy_if_mode; 
    3338}; 
    3439 
  • trunk/target/linux/ramips/files/drivers/net/ramips.c

    r30497 r30547  
    9393#define RAMIPS_MDIO_RETRY       1000 
    9494 
    95 static void 
    96 ramips_setup_mdio_cfg(struct raeth_priv *re) 
    97 { 
    98         unsigned int mdio_cfg; 
     95static unsigned char *ramips_speed_str(struct raeth_priv *re) 
     96{ 
     97        switch (re->speed) { 
     98        case SPEED_1000: 
     99                return "1000"; 
     100        case SPEED_100: 
     101                return "100"; 
     102        case SPEED_10: 
     103                return "10"; 
     104        } 
     105 
     106        return "?"; 
     107} 
     108 
     109static void ramips_link_adjust(struct raeth_priv *re) 
     110{ 
     111        struct ramips_eth_platform_data *pdata; 
     112        u32 mdio_cfg; 
     113 
     114        pdata = re->parent->platform_data; 
     115        if (!re->link) { 
     116                netif_carrier_off(re->netdev); 
     117                netdev_info(re->netdev, "link down\n"); 
     118                return; 
     119        } 
    99120 
    100121        mdio_cfg = RAMIPS_MDIO_CFG_TX_CLK_SKEW_200 | 
     
    126147 
    127148        ramips_fe_wr(mdio_cfg, RAMIPS_MDIO_CFG); 
    128 } 
     149 
     150        netif_carrier_on(re->netdev); 
     151        netdev_info(re->netdev, "link up (%sMbps/%s duplex)\n", 
     152                    ramips_speed_str(re), 
     153                    (DUPLEX_FULL == re->duplex) ? "Full" : "Half"); 
     154} 
     155 
    129156static int 
    130157ramips_mdio_wait_ready(struct raeth_priv *re) 
     
    247274} 
    248275 
     276static void 
     277ramips_phy_link_adjust(struct net_device *dev) 
     278{ 
     279        struct raeth_priv *re = netdev_priv(dev); 
     280        struct phy_device *phydev = re->phy_dev; 
     281        unsigned long flags; 
     282        int status_change = 0; 
     283 
     284        spin_lock_irqsave(&re->phy_lock, flags); 
     285 
     286        if (phydev->link) 
     287                if (re->duplex != phydev->duplex || 
     288                    re->speed != phydev->speed) 
     289                        status_change = 1; 
     290 
     291        if (phydev->link != re->link) 
     292                status_change = 1; 
     293 
     294        re->link = phydev->link; 
     295        re->duplex = phydev->duplex; 
     296        re->speed = phydev->speed; 
     297 
     298        if (status_change) 
     299                ramips_link_adjust(re); 
     300 
     301        spin_unlock_irqrestore(&re->phy_lock, flags); 
     302} 
     303 
     304static int 
     305ramips_phy_connect_multi(struct raeth_priv *re) 
     306{ 
     307        struct net_device *netdev = re->netdev; 
     308        struct ramips_eth_platform_data *pdata; 
     309        struct phy_device *phydev = NULL; 
     310        int phy_addr; 
     311        int ret = 0; 
     312 
     313        pdata = re->parent->platform_data; 
     314        for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) { 
     315                if (!(pdata->phy_mask & (1 << phy_addr))) 
     316                        continue; 
     317 
     318                if (re->mii_bus->phy_map[phy_addr] == NULL) 
     319                        continue; 
     320 
     321                RADEBUG("%s: PHY found at %s, uid=%08x\n", 
     322                        netdev->name, 
     323                        dev_name(&re->mii_bus->phy_map[phy_addr]->dev), 
     324                        re->mii_bus->phy_map[phy_addr]->phy_id); 
     325 
     326                if (phydev == NULL) 
     327                        phydev = re->mii_bus->phy_map[phy_addr]; 
     328        } 
     329 
     330        if (!phydev) { 
     331                netdev_err(netdev, "no PHY found with phy_mask=%08x\n", 
     332                           pdata->phy_mask); 
     333                return -ENODEV; 
     334        } 
     335 
     336        re->phy_dev = phy_connect(netdev, dev_name(&phydev->dev), 
     337                                  ramips_phy_link_adjust, 0, 
     338                                  pdata->phy_if_mode); 
     339 
     340        if (IS_ERR(re->phy_dev)) { 
     341                netdev_err(netdev, "could not connect to PHY at %s\n", 
     342                           dev_name(&phydev->dev)); 
     343                return PTR_ERR(re->phy_dev); 
     344        } 
     345 
     346        phydev->supported &= PHY_GBIT_FEATURES; 
     347        phydev->advertising = phydev->supported; 
     348 
     349        RADEBUG("%s: connected to PHY at %s [uid=%08x, driver=%s]\n", 
     350                netdev->name, dev_name(&phydev->dev), 
     351                phydev->phy_id, phydev->drv->name); 
     352 
     353        re->link = 0; 
     354        re->speed = 0; 
     355        re->duplex = -1; 
     356        re->rx_fc = 0; 
     357        re->tx_fc = 0; 
     358 
     359        return ret; 
     360} 
     361 
     362static int 
     363ramips_phy_connect_fixed(struct raeth_priv *re) 
     364{ 
     365        struct ramips_eth_platform_data *pdata; 
     366 
     367        pdata = re->parent->platform_data; 
     368        switch (pdata->speed) { 
     369        case SPEED_10: 
     370        case SPEED_100: 
     371        case SPEED_1000: 
     372                break; 
     373        default: 
     374                netdev_err(re->netdev, "invalid speed specified\n"); 
     375                return -EINVAL; 
     376        } 
     377 
     378        RADEBUG("%s: using fixed link parameters\n", re->netdev->name); 
     379 
     380        re->speed = pdata->speed; 
     381        re->duplex = pdata->duplex; 
     382        re->tx_fc = pdata->tx_fc; 
     383        re->rx_fc = pdata->tx_fc; 
     384 
     385        return 0; 
     386} 
     387 
     388static int 
     389ramips_phy_connect(struct raeth_priv *re) 
     390{ 
     391        struct ramips_eth_platform_data *pdata; 
     392 
     393        pdata = re->parent->platform_data; 
     394        if (pdata->phy_mask) 
     395                return ramips_phy_connect_multi(re); 
     396 
     397        return ramips_phy_connect_fixed(re); 
     398} 
     399 
     400static void 
     401ramips_phy_disconnect(struct raeth_priv *re) 
     402{ 
     403        if (re->phy_dev) 
     404                phy_disconnect(re->phy_dev); 
     405} 
     406 
     407static void 
     408ramips_phy_start(struct raeth_priv *re) 
     409{ 
     410        if (re->phy_dev) { 
     411                phy_start(re->phy_dev); 
     412        } else { 
     413                re->link = 1; 
     414                ramips_link_adjust(re); 
     415        } 
     416} 
     417 
     418static void 
     419ramips_phy_stop(struct raeth_priv *re) 
     420{ 
     421        if (re->phy_dev) { 
     422                phy_stop(re->phy_dev); 
     423        } else { 
     424                re->link = 0; 
     425                ramips_link_adjust(re); 
     426        } 
     427} 
    249428#else 
    250 static inline void 
    251 ramips_setup_mdio_cfg(struct raeth_priv *re) 
    252 { 
    253 } 
    254  
    255429static inline int 
    256430ramips_mdio_init(struct raeth_priv *re) 
     
    261435static inline void 
    262436ramips_mdio_cleanup(struct raeth_priv *re) 
     437{ 
     438} 
     439 
     440static inline int 
     441ramips_phy_connect(struct raeth_priv *re) 
     442{ 
     443        return 0; 
     444} 
     445 
     446static inline void 
     447ramips_phy_disconnect(struct raeth_priv *re) 
     448{ 
     449} 
     450 
     451static inline void 
     452ramips_phy_start(struct raeth_priv *re) 
     453{ 
     454} 
     455 
     456static inline void 
     457ramips_phy_stop(struct raeth_priv *re) 
    263458{ 
    264459} 
     
    547742        tasklet_init(&priv->rx_tasklet, ramips_eth_rx_hw, (unsigned long)dev); 
    548743 
    549         ramips_setup_mdio_cfg(priv); 
     744        ramips_phy_start(priv); 
    550745 
    551746        ramips_fe_wr(RAMIPS_DELAY_INIT, RAMIPS_DLY_INT_CFG); 
     
    581776        ramips_fe_wr(0, RAMIPS_FE_INT_ENABLE); 
    582777 
     778        ramips_phy_stop(priv); 
    583779        free_irq(dev->irq, dev); 
    584780        netif_stop_queue(dev); 
     
    605801        dev->watchdog_timeo = TX_TIMEOUT; 
    606802        spin_lock_init(&priv->page_lock); 
     803        spin_lock_init(&priv->phy_lock); 
    607804 
    608805        err = ramips_mdio_init(priv); 
     806        if (err) 
     807                return err; 
     808 
     809        err = ramips_phy_connect(priv); 
     810        if (err) 
     811                goto err_mdio_cleanup; 
     812 
     813        return 0; 
     814 
     815err_mdio_cleanup: 
     816        ramips_mdio_cleanup(priv); 
    609817        return err; 
    610818} 
     
    615823        struct raeth_priv *re = netdev_priv(dev); 
    616824 
     825        ramips_phy_disconnect(re); 
    617826        ramips_mdio_cleanup(re); 
    618827} 
  • trunk/target/linux/ramips/files/drivers/net/ramips_eth.h

    r30455 r30547  
    230230 
    231231        spinlock_t              page_lock; 
    232         struct net_device       *netdev; 
     232        struct net_device       *netdev; 
    233233        struct device           *parent; 
    234234        struct ramips_eth_platform_data *plat; 
    235235 
     236        int                     link; 
    236237        int                     speed; 
    237238        int                     duplex; 
     
    241242        struct mii_bus          *mii_bus; 
    242243        int                     mii_irq[PHY_MAX_ADDR]; 
     244        struct phy_device       *phy_dev; 
     245        spinlock_t              phy_lock; 
    243246}; 
    244247 
  • trunk/target/linux/ramips/patches-2.6.39/103-ethernet.patch

    r30450 r30547  
    11--- a/drivers/net/Kconfig 
    22+++ b/drivers/net/Kconfig 
    3 @@ -494,6 +494,16 @@ config MIPS_AU1X00_ENET 
     3@@ -494,6 +494,17 @@ config MIPS_AU1X00_ENET 
    44          If you have an Alchemy Semi AU1X00 based system 
    55          say Y.  Otherwise, say N. 
     
    88+       tristate "Ethernet driver for rt288x/rt305x" 
    99+       depends on MIPS_RALINK 
     10+       select PHYLIB if (SOC_RT288X || SOC_RT3883) 
    1011+       help 
    1112+         This driver supports the etehrnet mac inside the ralink wisocs 
  • trunk/target/linux/ramips/patches-3.2/103-ethernet.patch

    r30476 r30547  
    11--- a/drivers/net/Kconfig 
    22+++ b/drivers/net/Kconfig 
    3 @@ -277,6 +277,16 @@ source "drivers/net/plip/Kconfig" 
     3@@ -277,6 +277,17 @@ source "drivers/net/plip/Kconfig" 
    44  
    55 source "drivers/net/ppp/Kconfig" 
     
    88+       tristate "Ethernet driver for rt288x/rt305x" 
    99+       depends on MIPS_RALINK 
     10+       select PHYLIB if (SOC_RT288X || SOC_RT3883) 
    1011+       help 
    1112+         This driver supports the etehrnet mac inside the ralink wisocs 
Note: See TracChangeset for help on using the changeset viewer.