Ignore:
Timestamp:
2011-05-24T11:17:31+02:00 (5 years ago)
Author:
nbd
Message:

ar71xx: merge latest ag71xx changes from trunk, fix wrong argument to phy_mii_ioctl()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/backfire/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_ar7240.c

    r26672 r26985  
    234234static u32 __ar7240sw_reg_read(struct mii_bus *mii, u32 reg) 
    235235{ 
     236        unsigned long flags; 
    236237        u16 phy_addr; 
    237238        u16 phy_reg; 
     
    239240 
    240241        reg = (reg & 0xfffffffc) >> 2; 
    241  
    242         ag71xx_mdio_mii_write(mii->priv, 0x1f, 0x10, mk_high_addr(reg)); 
    243  
    244242        phy_addr = mk_phy_addr(reg); 
    245243        phy_reg = mk_phy_reg(reg); 
    246244 
     245        local_irq_save(flags); 
     246        ag71xx_mdio_mii_write(mii->priv, 0x1f, 0x10, mk_high_addr(reg)); 
    247247        lo = (u32) ag71xx_mdio_mii_read(mii->priv, phy_addr, phy_reg); 
    248248        hi = (u32) ag71xx_mdio_mii_read(mii->priv, phy_addr, phy_reg + 1); 
     249        local_irq_restore(flags); 
    249250 
    250251        return (hi << 16) | lo; 
     
    253254static void __ar7240sw_reg_write(struct mii_bus *mii, u32 reg, u32 val) 
    254255{ 
     256        unsigned long flags; 
    255257        u16 phy_addr; 
    256258        u16 phy_reg; 
    257259 
    258260        reg = (reg & 0xfffffffc) >> 2; 
    259  
    260         ag71xx_mdio_mii_write(mii->priv, 0x1f, 0x10, mk_high_addr(reg)); 
    261  
    262261        phy_addr = mk_phy_addr(reg); 
    263262        phy_reg = mk_phy_reg(reg); 
    264263 
     264        local_irq_save(flags); 
     265        ag71xx_mdio_mii_write(mii->priv, 0x1f, 0x10, mk_high_addr(reg)); 
    265266        ag71xx_mdio_mii_write(mii->priv, phy_addr, phy_reg + 1, (val >> 16)); 
    266267        ag71xx_mdio_mii_write(mii->priv, phy_addr, phy_reg, (val & 0xffff)); 
     268        local_irq_restore(flags); 
    267269} 
    268270 
     
    827829} 
    828830 
     831static void link_function(struct work_struct *work) { 
     832        struct ag71xx *ag = container_of(work, struct ag71xx, link_work.work); 
     833        unsigned long flags; 
     834        int i; 
     835        int status = 0; 
     836 
     837        for (i = 0; i < 4; i++) { 
     838                int link = ar7240sw_phy_read(ag->mii_bus, i, MII_BMSR); 
     839                if(link & BMSR_LSTATUS) { 
     840                        status = 1; 
     841                        break; 
     842                } 
     843        } 
     844 
     845        spin_lock_irqsave(&ag->lock, flags); 
     846        if(status != ag->link) { 
     847                ag->link = status; 
     848                ag71xx_link_adjust(ag); 
     849        } 
     850        spin_unlock_irqrestore(&ag->lock, flags); 
     851 
     852        schedule_delayed_work(&ag->link_work, HZ / 2); 
     853} 
     854 
    829855void ag71xx_ar7240_start(struct ag71xx *ag) 
    830856{ 
     
    835861 
    836862        ag->speed = SPEED_1000; 
    837         ag->link = 1; 
    838863        ag->duplex = 1; 
    839864 
    840865        ar7240_set_addr(as, ag->dev->dev_addr); 
    841866        ar7240_hw_apply(&as->swdev); 
     867 
     868        schedule_delayed_work(&ag->link_work, HZ / 10); 
    842869} 
    843870 
    844871void ag71xx_ar7240_stop(struct ag71xx *ag) 
    845872{ 
     873        cancel_delayed_work_sync(&ag->link_work); 
    846874} 
    847875 
     
    857885        ar7240sw_reset(as); 
    858886 
    859         return 0; 
    860 } 
    861  
    862 void __devexit ag71xx_ar7240_cleanup(struct ag71xx *ag) 
     887        INIT_DELAYED_WORK(&ag->link_work, link_function); 
     888 
     889        return 0; 
     890} 
     891 
     892void ag71xx_ar7240_cleanup(struct ag71xx *ag) 
    863893{ 
    864894        struct ar7240sw *as = ag->phy_priv; 
Note: See TracChangeset for help on using the changeset viewer.