Changeset 26922


Ignore:
Timestamp:
2011-05-17T13:12:56+02:00 (7 years ago)
Author:
matteo
Message:

ar71xx: detect link on LAN ports

Location:
trunk/target/linux/ar71xx/files/drivers/net/ag71xx
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h

    r26890 r26922  
    163163 
    164164        struct work_struct      restart_work; 
     165        struct delayed_work     link_work; 
    165166        struct timer_list       oom_timer; 
    166167 
  • trunk/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_ar7240.c

    r26856 r26922  
    829829} 
    830830 
     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 
    831855void ag71xx_ar7240_start(struct ag71xx *ag) 
    832856{ 
     
    837861 
    838862        ag->speed = SPEED_1000; 
    839         ag->link = 1; 
    840863        ag->duplex = 1; 
    841864 
    842865        ar7240_set_addr(as, ag->dev->dev_addr); 
    843866        ar7240_hw_apply(&as->swdev); 
     867 
     868        schedule_delayed_work(&ag->link_work, HZ / 10); 
    844869} 
    845870 
    846871void ag71xx_ar7240_stop(struct ag71xx *ag) 
    847872{ 
     873        cancel_delayed_work_sync(&ag->link_work); 
    848874} 
    849875 
     
    859885        ar7240sw_reset(as); 
    860886 
     887        INIT_DELAYED_WORK(&ag->link_work, link_function); 
     888 
    861889        return 0; 
    862890} 
  • trunk/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c

    r26855 r26922  
    4949        if (ag->phy_dev) { 
    5050                phy_start(ag->phy_dev); 
     51        } else if (pdata->has_ar7240_switch) { 
     52                ag71xx_ar7240_start(ag); 
    5153        } else { 
    52                 if (pdata->has_ar7240_switch) 
    53                         ag71xx_ar7240_start(ag); 
    5454                ag->link = 1; 
    5555                ag71xx_link_adjust(ag); 
Note: See TracChangeset for help on using the changeset viewer.