Changeset 27975


Ignore:
Timestamp:
2011-08-14T00:30:14+02:00 (6 years ago)
Author:
nbd
Message:

ar71xx: add some code to detect DMA stuck conditions on ar7240

Location:
trunk/target/linux/ar71xx/files
Files:
4 edited

Legend:

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

    r27703 r27975  
    590590                                     : ar724x_set_pll_ge0; 
    591591                pdata->is_ar724x = 1; 
     592                if (ar71xx_soc == AR71XX_SOC_AR7240) 
     593                        pdata->is_ar7240 = 1; 
    592594 
    593595                if (!pdata->fifo_cfg1) 
  • trunk/target/linux/ar71xx/files/arch/mips/include/asm/mach-ar71xx/platform.h

    r23975 r27975  
    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; 
  • trunk/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h

    r27896 r27975  
    237237#define AG71XX_REG_INT_STATUS   0x019c 
    238238 
     239#define AG71XX_REG_FIFO_DEPTH   0x01a8 
     240#define AG71XX_REG_RX_SM        0x01b0 
     241#define AG71XX_REG_TX_SM        0x01b4 
     242 
    239243#define MAC_CFG1_TXE            BIT(0)  /* Tx Enable */ 
    240244#define MAC_CFG1_STX            BIT(1)  /* Synchronize Tx Enable */ 
  • trunk/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c

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