Changeset 28215


Ignore:
Timestamp:
2011-09-11T23:36:33+02:00 (6 years ago)
Author:
nbd
Message:

ar71xx: add missing ethernet driver fix backport (fixes #10089)

Location:
branches/backfire/target/linux/ar71xx/files
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/backfire/target/linux/ar71xx/files/arch/mips/ar71xx/devices.c

    r27949 r28215  
    494494                                     : ar724x_set_pll_ge0; 
    495495                pdata->is_ar724x = 1; 
     496                if (ar71xx_soc == AR71XX_SOC_AR7240) 
     497                        pdata->is_ar7240 = 1; 
    496498 
    497499                if (!pdata->fifo_cfg1) 
  • branches/backfire/target/linux/ar71xx/files/arch/mips/include/asm/mach-ar71xx/platform.h

    r22678 r28215  
    3030        u8              has_gbit:1; 
    3131        u8              is_ar91xx:1; 
     32        u8              is_ar7240:1; 
    3233        u8              is_ar724x:1; 
    3334        u8              has_ar8216:1; 
  • branches/backfire/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h

    r28214 r28215  
    239239#define AG71XX_REG_INT_STATUS   0x019c 
    240240 
     241#define AG71XX_REG_FIFO_DEPTH   0x01a8 
     242#define AG71XX_REG_RX_SM        0x01b0 
     243#define AG71XX_REG_TX_SM        0x01b4 
     244 
    241245#define MAC_CFG1_TXE            BIT(0)  /* Tx Enable */ 
    242246#define MAC_CFG1_STX            BIT(1)  /* Synchronize Tx Enable */ 
  • branches/backfire/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c

    r27974 r28215  
    807807} 
    808808 
     809static bool ag71xx_check_dma_stuck(struct ag71xx *ag, unsigned long timestamp) 
     810{ 
     811        u32 rx_sm, tx_sm, rx_fd; 
     812 
     813        if (likely(time_before(jiffies, timestamp + HZ/10))) 
     814                return false; 
     815 
     816        if (!netif_carrier_ok(ag->dev)) 
     817                return false; 
     818 
     819        rx_sm = ag71xx_rr(ag, AG71XX_REG_RX_SM); 
     820        if ((rx_sm & 0x7) == 0x3 && ((rx_sm >> 4) & 0x7) == 0x6) 
     821                return true; 
     822 
     823        tx_sm = ag71xx_rr(ag, AG71XX_REG_TX_SM); 
     824        rx_fd = ag71xx_rr(ag, AG71XX_REG_FIFO_DEPTH); 
     825        if (((tx_sm >> 4) & 0x7) == 0 && ((rx_sm & 0x7) == 0) && 
     826            ((rx_sm >> 4) & 0x7) == 0 && rx_fd == 0) 
     827                return true; 
     828 
     829        return false; 
     830} 
     831 
    809832static int ag71xx_tx_packets(struct ag71xx *ag) 
    810833{ 
    811834        struct ag71xx_ring *ring = &ag->tx_ring; 
     835        struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); 
    812836        int sent; 
    813837 
     
    820844                struct sk_buff *skb = ring->buf[i].skb; 
    821845 
    822                 if (!ag71xx_desc_empty(desc)) 
     846                if (!ag71xx_desc_empty(desc)) { 
     847                        if (pdata->is_ar7240 && 
     848                            ag71xx_check_dma_stuck(ag, ring->buf[i].timestamp)) 
     849                                schedule_work(&ag->restart_work); 
    823850                        break; 
     851                } 
    824852 
    825853                ag71xx_wr(ag, AG71XX_REG_TX_STATUS, TX_STATUS_PS); 
Note: See TracChangeset for help on using the changeset viewer.