source: trunk/target/linux/ar7/patches-2.6.32/972-cpmac_multi_probe.patch @ 22850

Last change on this file since 22850 was 22850, checked in by florian, 6 years ago

[ar7] rework multi_probe patch to be cleaner

File size: 2.6 KB
  • drivers/net/cpmac.c

    a b  
    3333#include <linux/skbuff.h> 
    3434#include <linux/mii.h> 
    3535#include <linux/phy.h> 
     36#include <linux/phy_fixed.h> 
    3637#include <linux/platform_device.h> 
    3738#include <linux/dma-mapping.h> 
    3839#include <asm/gpio.h> 
    static void cpmac_hw_stop(struct net_dev 
    217218static int cpmac_stop(struct net_device *dev); 
    218219static int cpmac_open(struct net_device *dev); 
    219220 
     221static struct fixed_phy_status fixed_phy_status = { 
     222        .link = 1, 
     223        .speed = 100, 
     224        .duplex = 1, 
     225}; 
     226 
    220227static void cpmac_dump_regs(struct net_device *dev) 
    221228{ 
    222229        int i; 
    static int __devinit cpmac_probe(struct  
    11111118        struct cpmac_priv *priv; 
    11121119        struct net_device *dev; 
    11131120        struct plat_cpmac_data *pdata; 
     1121        void __iomem *mii_reg; 
     1122        u32 tmp; 
     1123        unsigned external_mii = 0; 
    11141124 
    11151125        pdata = pdev->dev.platform_data; 
    11161126 
     1127detect_again: 
    11171128        for (phy_id = 0; phy_id < PHY_MAX_ADDR; phy_id++) { 
    11181129                if (!(pdata->phy_mask & (1 << phy_id))) 
    11191130                        continue; 
    static int __devinit cpmac_probe(struct  
    11221133                strncpy(mdio_bus_id, cpmac_mii->id, MII_BUS_ID_SIZE); 
    11231134                break; 
    11241135        } 
    1125          
    1126         if (phy_id == PHY_MAX_ADDR) { 
    1127                 dev_err(&pdev->dev, "no PHY present\n"); 
    1128                 return -ENODEV; 
     1136 
     1137        if (phy_id < PHY_MAX_ADDR && !external_mii) 
     1138                goto dev_alloc; 
     1139 
     1140        /* Now disable EPHY and enable MII */ 
     1141        dev_info(&pdev->dev, "trying external MII\n"); 
     1142        ar7_device_disable(AR7_RESET_BIT_EPHY); 
     1143 
     1144        mii_reg = ioremap(AR7_REGS_MII, 4); 
     1145        if (!mii_reg) { 
     1146                dev_err(&pdev->dev, "failed to iorenamp MII_SEL\n"); 
     1147                return -ENOMEM; 
    11291148        } 
    11301149 
     1150        tmp = readl(mii_reg); 
     1151        tmp |= 1; 
     1152        writel(tmp, mii_reg); 
     1153        external_mii++; 
     1154 
     1155        if (external_mii == 1) 
     1156                goto detect_again; 
     1157 
     1158        if (phy_id < PHY_MAX_ADDR) 
     1159                goto dev_alloc; 
     1160 
     1161        /* This still does not work, so now we register a fixed phy */ 
     1162        dev_info(&pdev->dev, "using fixed PHY\n"); 
     1163        rc = fixed_phy_add(PHY_POLL, pdev->id, &fixed_phy_status); 
     1164        if (rc && rc != -ENODEV) { 
     1165                dev_err(&pdev->dev, "unable to register fixed PHY\n"); 
     1166                return rc; 
     1167        } 
     1168 
     1169        strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); /* fixed phys bus */ 
     1170        phy_id = pdev->id; 
     1171 
     1172dev_alloc: 
    11311173        dev = alloc_etherdev_mq(sizeof(*priv), CPMAC_QUEUES); 
    11321174 
    11331175        if (!dev) { 
  • arch/mips/include/asm/mach-ar7/ar7.h

    a b  
    4141#define AR7_REGS_RESET  (AR7_REGS_BASE + 0x1600) 
    4242#define AR7_REGS_VLYNQ0 (AR7_REGS_BASE + 0x1800) 
    4343#define AR7_REGS_DCL    (AR7_REGS_BASE + 0x1a00) 
     44#define AR7_REGS_MII    (AR7_REGS_BASE + 0x1a08) 
    4445#define AR7_REGS_VLYNQ1 (AR7_REGS_BASE + 0x1c00) 
    4546#define AR7_REGS_MDIO   (AR7_REGS_BASE + 0x1e00) 
    4647#define AR7_REGS_IRQ    (AR7_REGS_BASE + 0x2400) 
Note: See TracBrowser for help on using the repository browser.