source: branches/backfire/target/linux/atheros/patches-2.6.32/220-enet_micrel_workaround.patch @ 21041

Last change on this file since 21041 was 21041, checked in by juhosg, 6 years ago

backfire: atheros: refresh 2.6.32 patches (backport of r21039)

File size: 1.8 KB
  • drivers/net/ar231x.c

    a b static int ar231x_mdiobus_write(struct m 
    148148static int ar231x_mdiobus_reset(struct mii_bus *bus); 
    149149static int ar231x_mdiobus_probe (struct net_device *dev); 
    150150static void ar231x_adjust_link(struct net_device *dev); 
     151static bool no_phy = false; 
    151152 
    152153#ifndef ERR 
    153154#define ERR(fmt, args...) printk("%s: " fmt, __func__, ##args) 
    int __init ar231x_probe(struct platform_ 
    278279 
    279280        mdiobus_register(sp->mii_bus); 
    280281 
     282        /* Workaround for Micrel switch, which is only available on 
     283         * one PHY and cannot be configured through MDIO */ 
     284        if (!no_phy) { 
     285                u32 phy_id = 0; 
     286                get_phy_id(sp->mii_bus, 1, &phy_id); 
     287                if (phy_id == 0x00221450) 
     288                        no_phy = true; 
     289        } 
     290        if (no_phy) { 
     291                sp->link = 1; 
     292                netif_carrier_on(dev); 
     293                return 0; 
     294        } 
     295        no_phy = true; 
     296 
    281297        if (ar231x_mdiobus_probe(dev) != 0) { 
    282298                printk(KERN_ERR "%s: mdiobus_probe failed\n", dev->name); 
    283299                rx_tasklet_cleanup(dev); 
    static int __devexit ar231x_remove(struc 
    334350        rx_tasklet_cleanup(dev); 
    335351        ar231x_init_cleanup(dev); 
    336352        unregister_netdev(dev); 
    337         mdiobus_unregister(sp->mii_bus); 
    338         mdiobus_free(sp->mii_bus); 
     353        if (sp->mii_bus) { 
     354                mdiobus_unregister(sp->mii_bus); 
     355                mdiobus_free(sp->mii_bus); 
     356        } 
    339357        kfree(dev); 
    340358        return 0; 
    341359} 
    static int ar231x_rx_int(struct net_devi 
    836854                                dev->stats.rx_bytes += skb->len; 
    837855 
    838856                                /* pass the packet to upper layers */ 
    839                                 sp->rx(skb); 
     857                                if (sp->rx) { 
     858                                        sp->rx(skb); 
     859                                } else { 
     860                                        skb->protocol = eth_type_trans(skb, skb->dev); 
     861                                        netif_rx(skb); 
     862                                } 
    840863                                skb_new->dev = dev; 
    841864 
    842865                                /* 16 bit align */ 
    static int ar231x_ioctl(struct net_devic 
    11231146        struct ar231x_private *sp = netdev_priv(dev); 
    11241147        int ret; 
    11251148 
     1149        if (!sp->phy_dev) 
     1150                return -ENODEV; 
     1151 
    11261152        switch (cmd) { 
    11271153 
    11281154        case SIOCETHTOOL: 
Note: See TracBrowser for help on using the repository browser.