source: trunk/target/linux/ar7/patches-2.6.37/972-cpmac_fixup.patch @ 31572

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

[ar7] fix MII register ioremap on when high cpmac is available, patch from Wipster

File size: 6.5 KB
  • arch/mips/ar7/platform.c

    a b  
    3333#include <linux/string.h> 
    3434#include <linux/etherdevice.h> 
    3535#include <linux/phy.h> 
    36 #include <linux/phy_fixed.h> 
    3736#include <linux/gpio.h> 
    3837#include <linux/clk.h> 
    3938 
    static struct resource cpmac_high_res[] 
    248247        }, 
    249248}; 
    250249 
    251 static struct fixed_phy_status fixed_phy_status __initdata = { 
    252         .link           = 1, 
    253         .speed          = 100, 
    254         .duplex         = 1, 
    255 }; 
    256  
    257250static struct plat_cpmac_data cpmac_low_data = { 
    258251        .reset_bit      = 17, 
    259252        .power_bit      = 20, 
    static int __init ar7_register_devices(v 
    643636        } 
    644637 
    645638        if (ar7_has_high_cpmac()) { 
    646                 res = fixed_phy_add(PHY_POLL, cpmac_high.id, &fixed_phy_status); 
    647                 if (!res) { 
    648                         cpmac_get_mac(1, cpmac_high_data.dev_addr); 
    649  
    650                         res = platform_device_register(&cpmac_high); 
    651                         if (res) 
    652                                 pr_warning("unable to register cpmac-high: %d\n", res); 
    653                 } else 
    654                         pr_warning("unable to add cpmac-high phy: %d\n", res); 
    655         } else 
    656                 cpmac_low_data.phy_mask = 0xffffffff; 
     639                cpmac_get_mac(1, cpmac_high_data.dev_addr); 
    657640 
    658         res = fixed_phy_add(PHY_POLL, cpmac_low.id, &fixed_phy_status); 
    659         if (!res) { 
    660                 cpmac_get_mac(0, cpmac_low_data.dev_addr); 
    661                 res = platform_device_register(&cpmac_low); 
     641                res = platform_device_register(&cpmac_high); 
    662642                if (res) 
    663                         pr_warning("unable to register cpmac-low: %d\n", res); 
     643                        pr_warning("unable to register cpmac-high: %d\n", res); 
    664644        } else 
    665                 pr_warning("unable to add cpmac-low phy: %d\n", res); 
     645                cpmac_low_data.phy_mask = 0xffffffff; 
     646 
     647        cpmac_get_mac(0, cpmac_low_data.dev_addr); 
     648        res = platform_device_register(&cpmac_low); 
     649        if (res) 
     650                pr_warning("unable to register cpmac-low: %d\n", res); 
    666651 
    667652        detect_leds(); 
    668653        res = platform_device_register(&ar7_gpio_leds); 
    static int __init ar7_register_devices(v 
    675660 
    676661        /* Register watchdog only if enabled in hardware */ 
    677662        bootcr = ioremap_nocache(AR7_REGS_DCL, 4); 
    678         val = readl(bootcr); 
    679         iounmap(bootcr); 
     663        if (bootcr) { 
     664                val = readl(bootcr); 
     665                iounmap(bootcr); 
     666        } 
    680667        if (val & AR7_WDT_HW_ENA) { 
    681668                if (ar7_has_high_vlynq()) 
    682669                        ar7_wdt_res.start = UR8_REGS_WDT; 
  • arch/mips/include/asm/mach-ar7/ar7.h

    a b  
    4242#define AR7_REGS_PINSEL (AR7_REGS_BASE + 0x160C) 
    4343#define AR7_REGS_VLYNQ0 (AR7_REGS_BASE + 0x1800) 
    4444#define AR7_REGS_DCL    (AR7_REGS_BASE + 0x1a00) 
     45#define AR7_REGS_MII    (AR7_REGS_BASE + 0x1a08) 
    4546#define AR7_REGS_VLYNQ1 (AR7_REGS_BASE + 0x1c00) 
    4647#define AR7_REGS_MDIO   (AR7_REGS_BASE + 0x1e00) 
    4748#define AR7_REGS_IRQ    (AR7_REGS_BASE + 0x2400) 
  • drivers/net/cpmac.c

    a b  
    3434#include <linux/skbuff.h> 
    3535#include <linux/mii.h> 
    3636#include <linux/phy.h> 
    37 #include <linux/phy_fixed.h> 
    3837#include <linux/platform_device.h> 
    3938#include <linux/dma-mapping.h> 
    4039#include <linux/clk.h> 
    MODULE_LICENSE("GPL"); 
    4746MODULE_ALIAS("platform:cpmac"); 
    4847 
    4948static int debug_level = 8; 
    50 static int dumb_switch; 
    5149 
    52 /* Next 2 are only used in cpmac_probe, so it's pointless to change them */ 
     50/* Next is only used in cpmac_probe, so it's pointless to change them */ 
    5351module_param(debug_level, int, 0444); 
    54 module_param(dumb_switch, int, 0444); 
    5552 
    5653MODULE_PARM_DESC(debug_level, "Number of NETIF_MSG bits to enable"); 
    57 MODULE_PARM_DESC(dumb_switch, "Assume switch is not connected to MDIO bus"); 
    5854 
    5955#define CPMAC_VERSION "0.5.2" 
    6056/* frame size + 802.1q tag + FCS size */ 
    static void cpmac_hw_start(struct net_de 
    673669        for (i = 0; i < 8; i++) 
    674670                cpmac_write(priv->regs, CPMAC_MAC_ADDR_LO(i), dev->dev_addr[5]); 
    675671        cpmac_write(priv->regs, CPMAC_MAC_ADDR_MID, dev->dev_addr[4]); 
    676         cpmac_write(priv->regs, CPMAC_MAC_ADDR_HI, dev->dev_addr[0] | 
    677                     (dev->dev_addr[1] << 8) | (dev->dev_addr[2] << 16) | 
    678                     (dev->dev_addr[3] << 24)); 
     672        cpmac_write(priv->regs, CPMAC_MAC_ADDR_HI, be32_to_cpu(*(u32 *) 
     673                        dev->dev_addr)); 
    679674        cpmac_write(priv->regs, CPMAC_MAX_LENGTH, CPMAC_SKB_SIZE); 
    680675        cpmac_write(priv->regs, CPMAC_UNICAST_CLEAR, 0xff); 
    681676        cpmac_write(priv->regs, CPMAC_RX_INT_CLEAR, 0xff); 
    static const struct net_device_ops cpmac 
    11071102        .ndo_set_mac_address    = eth_mac_addr, 
    11081103}; 
    11091104 
    1110 static int external_switch; 
    1111  
    11121105static int __devinit cpmac_probe(struct platform_device *pdev) 
    11131106{ 
    11141107        int rc, phy_id; 
    static int __devinit cpmac_probe(struct 
    11201113 
    11211114        pdata = pdev->dev.platform_data; 
    11221115 
    1123         if (external_switch || dumb_switch) { 
    1124                 strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); /* fixed phys bus */ 
    1125                 phy_id = pdev->id; 
    1126         } else { 
    1127                 for (phy_id = 0; phy_id < PHY_MAX_ADDR; phy_id++) { 
    1128                         if (!(pdata->phy_mask & (1 << phy_id))) 
    1129                                 continue; 
    1130                         if (!cpmac_mii->phy_map[phy_id]) 
    1131                                 continue; 
    1132                         strncpy(mdio_bus_id, cpmac_mii->id, MII_BUS_ID_SIZE); 
    1133                         break; 
    1134                 } 
     1116        for (phy_id = 0; phy_id < PHY_MAX_ADDR; phy_id++) { 
     1117                if (!(pdata->phy_mask & (1 << phy_id))) 
     1118                        continue; 
     1119                if (!cpmac_mii->phy_map[phy_id]) 
     1120                        continue; 
     1121                strncpy(mdio_bus_id, cpmac_mii->id, MII_BUS_ID_SIZE); 
     1122                break; 
    11351123        } 
    11361124 
    11371125        if (phy_id == PHY_MAX_ADDR) { 
    1138                 dev_err(&pdev->dev, "no PHY present, falling back " 
    1139                                         "to switch on MDIO bus 0\n"); 
    1140                 strncpy(mdio_bus_id, "0", MII_BUS_ID_SIZE); /* fixed phys bus */ 
    1141                 phy_id = pdev->id; 
     1126                printk(KERN_ERR "cpmac: No PHY present\n"); 
     1127                return -ENXIO; 
    11421128        } 
    11431129 
    11441130        dev = alloc_etherdev_mq(sizeof(*priv), CPMAC_QUEUES); 
    int __devinit cpmac_init(void) 
    12271213{ 
    12281214        u32 mask; 
    12291215        int i, res; 
     1216        void __iomem *mii_reg; 
    12301217 
    12311218        cpmac_mii = mdiobus_alloc(); 
    12321219        if (cpmac_mii == NULL) 
    int __devinit cpmac_init(void) 
    12501237        ar7_gpio_disable(26); 
    12511238        ar7_gpio_disable(27); 
    12521239 
    1253         if (!ar7_is_titan()) { 
     1240        if (ar7_is_titan()) { 
     1241                ar7_device_reset(AR7_RESET_BIT_EPHY); 
     1242                ar7_device_reset(TITAN_RESET_BIT_EPHY1); 
     1243        } else { 
     1244                ar7_device_reset(AR7_RESET_BIT_EPHY); 
    12541245                ar7_device_reset(AR7_RESET_BIT_CPMAC_LO); 
    12551246                ar7_device_reset(AR7_RESET_BIT_CPMAC_HI); 
    12561247        } 
    1257         ar7_device_reset(AR7_RESET_BIT_EPHY); 
    1258  
    1259         if (ar7_is_titan()) 
    1260                 ar7_device_reset(TITAN_RESET_BIT_EPHY1); 
    12611248 
    12621249        cpmac_mii->reset(cpmac_mii); 
    12631250 
    int __devinit cpmac_init(void) 
    12691256                        msleep(10); 
    12701257        } 
    12711258 
    1272         mask &= 0x7fffffff; 
     1259        mask &= ar7_is_titan()? ~(0x80000000 | 0x40000000) : ~(0x80000000); 
    12731260        if (mask & (mask - 1)) { 
    1274                 external_switch = 1; 
    1275                 mask = 0; 
     1261                if (!ar7_has_high_cpmac()) { 
     1262                        if (ar7_is_titan()) { 
     1263                                ar7_device_disable(AR7_RESET_BIT_EPHY); 
     1264                                ar7_device_disable(TITAN_RESET_BIT_EPHY1); 
     1265                        } else 
     1266                                ar7_device_disable(AR7_RESET_BIT_EPHY); 
     1267 
     1268                        //Titan remap might be different 
     1269                        mii_reg = ioremap(AR7_REGS_MII, 4); 
     1270                        if (mii_reg) { 
     1271                                writel(readl(mii_reg) | 1, mii_reg); 
     1272                                iounmap(mii_reg); 
     1273                        } 
     1274                } 
    12761275        } 
    12771276 
    12781277        cpmac_mii->phy_mask = ar7_is_titan()? ~(mask | 0x80000000 | 0x40000000) : 
Note: See TracBrowser for help on using the repository browser.