Ignore:
Timestamp:
2011-05-07T14:40:34+02:00 (6 years ago)
Author:
juhosg
Message:

ar71xx: ag71xx: add debugfs entry for [rt]x_ring

File:
1 edited

Legend:

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

    r26843 r26845  
    150150}; 
    151151 
     152#define DESC_PRINT_LEN  64 
     153 
     154static ssize_t read_file_ring(struct file *file, char __user *user_buf, 
     155                              size_t count, loff_t *ppos, 
     156                              struct ag71xx *ag, 
     157                              struct ag71xx_ring *ring, 
     158                              unsigned ring_size, 
     159                              unsigned desc_reg) 
     160{ 
     161        char *buf; 
     162        unsigned int buflen; 
     163        unsigned int len = 0; 
     164        unsigned long flags; 
     165        ssize_t ret; 
     166        int curr; 
     167        int dirty; 
     168        u32 desc_hw; 
     169        int i; 
     170 
     171        buflen = (ring_size * DESC_PRINT_LEN); 
     172        buf = kmalloc(buflen, GFP_KERNEL); 
     173        if (!buf) 
     174                return -ENOMEM; 
     175 
     176        len += snprintf(buf + len, buflen - len, 
     177                        "Idx ... %-8s %-8s %-8s %-8s . %-10s\n", 
     178                        "desc", "next", "data", "ctrl", "timestamp"); 
     179 
     180        spin_lock_irqsave(&ag->lock, flags); 
     181 
     182        curr = (ring->curr % ring_size); 
     183        dirty = (ring->dirty % ring_size); 
     184        desc_hw = ag71xx_rr(ag, desc_reg); 
     185        for (i = 0; i < ring_size; i++) { 
     186                struct ag71xx_buf *ab = &ring->buf[i]; 
     187 
     188                len += snprintf(buf + len, buflen - len, 
     189                        "%3d %c%c%c %08x %08x %08x %08x %c %10lu\n", 
     190                        i, 
     191                        (i == curr) ? 'C' : ' ', 
     192                        (i == dirty) ? 'D' : ' ', 
     193                        (desc_hw == ab->desc_dma) ? 'H' : ' ', 
     194                        ab->desc_dma, 
     195                        ab->desc->next, 
     196                        ab->desc->data, 
     197                        ab->desc->ctrl, 
     198                        (ab->desc->ctrl & DESC_EMPTY) ? 'E' : '*', 
     199                        ab->timestamp); 
     200        } 
     201 
     202        spin_unlock_irqrestore(&ag->lock, flags); 
     203 
     204        ret = simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     205        kfree(buf); 
     206 
     207        return ret; 
     208} 
     209 
     210static ssize_t read_file_tx_ring(struct file *file, char __user *user_buf, 
     211                                 size_t count, loff_t *ppos) 
     212{ 
     213        struct ag71xx *ag = file->private_data; 
     214 
     215        return read_file_ring(file, user_buf, count, ppos, ag, &ag->tx_ring, 
     216                              AG71XX_TX_RING_SIZE, AG71XX_REG_TX_DESC); 
     217} 
     218 
     219static const struct file_operations ag71xx_fops_tx_ring = { 
     220        .open   = ag71xx_debugfs_generic_open, 
     221        .read   = read_file_tx_ring, 
     222        .owner  = THIS_MODULE 
     223}; 
     224 
     225static ssize_t read_file_rx_ring(struct file *file, char __user *user_buf, 
     226                                 size_t count, loff_t *ppos) 
     227{ 
     228        struct ag71xx *ag = file->private_data; 
     229 
     230        return read_file_ring(file, user_buf, count, ppos, ag, &ag->rx_ring, 
     231                              AG71XX_RX_RING_SIZE, AG71XX_REG_RX_DESC); 
     232} 
     233 
     234static const struct file_operations ag71xx_fops_rx_ring = { 
     235        .open   = ag71xx_debugfs_generic_open, 
     236        .read   = read_file_rx_ring, 
     237        .owner  = THIS_MODULE 
     238}; 
     239 
    152240void ag71xx_debugfs_exit(struct ag71xx *ag) 
    153241{ 
     
    166254        debugfs_create_file("napi_stats", S_IRUGO, ag->debug.debugfs_dir, 
    167255                            ag, &ag71xx_fops_napi_stats); 
     256        debugfs_create_file("tx_ring", S_IRUGO, ag->debug.debugfs_dir, 
     257                            ag, &ag71xx_fops_tx_ring); 
     258        debugfs_create_file("rx_ring", S_IRUGO, ag->debug.debugfs_dir, 
     259                            ag, &ag71xx_fops_rx_ring); 
    168260 
    169261        return 0; 
Note: See TracChangeset for help on using the changeset viewer.