Changeset 26985 for branches/backfire


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

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

Location:
branches/backfire/target/linux/ar71xx/files/drivers/net/ag71xx
Files:
5 edited

Legend:

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

    r26672 r26985  
    2626#include <linux/ethtool.h> 
    2727#include <linux/etherdevice.h> 
     28#include <linux/if_vlan.h> 
    2829#include <linux/phy.h> 
    2930#include <linux/skbuff.h> 
     
    3637#include <asm/mach-ar71xx/platform.h> 
    3738 
    38 #define ETH_FCS_LEN     4 
    39  
    4039#define AG71XX_DRV_NAME         "ag71xx" 
    4140#define AG71XX_DRV_VERSION      "0.5.35" 
     
    5554#define AG71XX_RX_PKT_RESERVE   64 
    5655#define AG71XX_RX_PKT_SIZE      \ 
    57         (AG71XX_RX_PKT_RESERVE + ETH_HLEN + ETH_FRAME_LEN + ETH_FCS_LEN) 
     56        (AG71XX_RX_PKT_RESERVE + ETH_FRAME_LEN + ETH_FCS_LEN + VLAN_HLEN) 
    5857 
    5958#define AG71XX_TX_RING_SIZE     64 
     
    9291        struct ag71xx_desc      *desc; 
    9392        dma_addr_t              dma_addr; 
    94         u32                     pad; 
     93        unsigned long           timestamp; 
    9594}; 
    9695 
     
    137136struct ag71xx_debug { 
    138137        struct dentry           *debugfs_dir; 
    139         struct dentry           *debugfs_int_stats; 
    140         struct dentry           *debugfs_napi_stats; 
    141138 
    142139        struct ag71xx_int_stats int_stats; 
     
    166163 
    167164        struct work_struct      restart_work; 
     165        struct delayed_work     link_work; 
    168166        struct timer_list       oom_timer; 
    169167 
  • 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; 
  • branches/backfire/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_debugfs.c

    r26672 r26985  
    100100        struct ag71xx *ag = file->private_data; 
    101101        struct ag71xx_napi_stats *stats = &ag->debug.napi_stats; 
    102         char buf[2048]; 
     102        char *buf; 
     103        unsigned int buflen; 
    103104        unsigned int len = 0; 
    104105        unsigned long rx_avg = 0; 
    105106        unsigned long tx_avg = 0; 
     107        int ret; 
    106108        int i; 
     109 
     110        buflen = 2048; 
     111        buf = kmalloc(buflen, GFP_KERNEL); 
     112        if (!buf) 
     113                return -ENOMEM; 
    107114 
    108115        if (stats->rx_count) 
     
    112119                tx_avg = stats->tx_packets / stats->tx_count; 
    113120 
    114         len += snprintf(buf + len, sizeof(buf) - len, "%3s  %10s %10s\n", 
     121        len += snprintf(buf + len, buflen - len, "%3s  %10s %10s\n", 
    115122                        "len", "rx", "tx"); 
    116123 
    117124        for (i = 1; i <= AG71XX_NAPI_WEIGHT; i++) 
    118                 len += snprintf(buf + len, sizeof(buf) - len, 
     125                len += snprintf(buf + len, buflen - len, 
    119126                                "%3d: %10lu %10lu\n", 
    120127                                i, stats->rx[i], stats->tx[i]); 
    121128 
    122         len += snprintf(buf + len, sizeof(buf) - len, "\n"); 
    123  
    124         len += snprintf(buf + len, sizeof(buf) - len, "%3s: %10lu %10lu\n", 
     129        len += snprintf(buf + len, buflen - len, "\n"); 
     130 
     131        len += snprintf(buf + len, buflen - len, "%3s: %10lu %10lu\n", 
    125132                        "sum", stats->rx_count, stats->tx_count); 
    126         len += snprintf(buf + len, sizeof(buf) - len, "%3s: %10lu %10lu\n", 
     133        len += snprintf(buf + len, buflen - len, "%3s: %10lu %10lu\n", 
    127134                        "avg", rx_avg, tx_avg); 
    128         len += snprintf(buf + len, sizeof(buf) - len, "%3s: %10lu %10lu\n", 
     135        len += snprintf(buf + len, buflen - len, "%3s: %10lu %10lu\n", 
    129136                        "max", stats->rx_packets_max, stats->tx_packets_max); 
    130         len += snprintf(buf + len, sizeof(buf) - len, "%3s: %10lu %10lu\n", 
     137        len += snprintf(buf + len, buflen - len, "%3s: %10lu %10lu\n", 
    131138                        "pkt", stats->rx_packets, stats->tx_packets); 
    132139 
    133         return simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     140        ret = simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     141        kfree(buf); 
     142 
     143        return ret; 
    134144} 
    135145 
     
    140150}; 
    141151 
     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                u32 desc_dma = ((u32) ring->descs_dma) + i * ring->desc_size; 
     188 
     189                len += snprintf(buf + len, buflen - len, 
     190                        "%3d %c%c%c %08x %08x %08x %08x %c %10lu\n", 
     191                        i, 
     192                        (i == curr) ? 'C' : ' ', 
     193                        (i == dirty) ? 'D' : ' ', 
     194                        (desc_hw == desc_dma) ? 'H' : ' ', 
     195                        desc_dma, 
     196                        ab->desc->next, 
     197                        ab->desc->data, 
     198                        ab->desc->ctrl, 
     199                        (ab->desc->ctrl & DESC_EMPTY) ? 'E' : '*', 
     200                        ab->timestamp); 
     201        } 
     202 
     203        spin_unlock_irqrestore(&ag->lock, flags); 
     204 
     205        ret = simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     206        kfree(buf); 
     207 
     208        return ret; 
     209} 
     210 
     211static ssize_t read_file_tx_ring(struct file *file, char __user *user_buf, 
     212                                 size_t count, loff_t *ppos) 
     213{ 
     214        struct ag71xx *ag = file->private_data; 
     215 
     216        return read_file_ring(file, user_buf, count, ppos, ag, &ag->tx_ring, 
     217                              AG71XX_TX_RING_SIZE, AG71XX_REG_TX_DESC); 
     218} 
     219 
     220static const struct file_operations ag71xx_fops_tx_ring = { 
     221        .open   = ag71xx_debugfs_generic_open, 
     222        .read   = read_file_tx_ring, 
     223        .owner  = THIS_MODULE 
     224}; 
     225 
     226static ssize_t read_file_rx_ring(struct file *file, char __user *user_buf, 
     227                                 size_t count, loff_t *ppos) 
     228{ 
     229        struct ag71xx *ag = file->private_data; 
     230 
     231        return read_file_ring(file, user_buf, count, ppos, ag, &ag->rx_ring, 
     232                              AG71XX_RX_RING_SIZE, AG71XX_REG_RX_DESC); 
     233} 
     234 
     235static const struct file_operations ag71xx_fops_rx_ring = { 
     236        .open   = ag71xx_debugfs_generic_open, 
     237        .read   = read_file_rx_ring, 
     238        .owner  = THIS_MODULE 
     239}; 
     240 
    142241void ag71xx_debugfs_exit(struct ag71xx *ag) 
    143242{ 
    144         debugfs_remove(ag->debug.debugfs_napi_stats); 
    145         debugfs_remove(ag->debug.debugfs_int_stats); 
    146         debugfs_remove(ag->debug.debugfs_dir); 
     243        debugfs_remove_recursive(ag->debug.debugfs_dir); 
    147244} 
    148245 
     
    152249                                                   ag71xx_debugfs_root); 
    153250        if (!ag->debug.debugfs_dir) 
    154                 goto err; 
    155  
    156         ag->debug.debugfs_int_stats = 
    157                         debugfs_create_file("int_stats", 
    158                                             S_IRUGO, 
    159                                             ag->debug.debugfs_dir, 
    160                                             ag, 
    161                                             &ag71xx_fops_int_stats); 
    162         if (!ag->debug.debugfs_int_stats) 
    163                 goto err; 
    164  
    165         ag->debug.debugfs_napi_stats = 
    166                         debugfs_create_file("napi_stats", 
    167                                             S_IRUGO, 
    168                                             ag->debug.debugfs_dir, 
    169                                             ag, 
    170                                             &ag71xx_fops_napi_stats); 
    171         if (!ag->debug.debugfs_napi_stats) 
    172                 goto err; 
     251                return -ENOMEM; 
     252 
     253        debugfs_create_file("int_stats", S_IRUGO, ag->debug.debugfs_dir, 
     254                            ag, &ag71xx_fops_int_stats); 
     255        debugfs_create_file("napi_stats", S_IRUGO, ag->debug.debugfs_dir, 
     256                            ag, &ag71xx_fops_napi_stats); 
     257        debugfs_create_file("tx_ring", S_IRUGO, ag->debug.debugfs_dir, 
     258                            ag, &ag71xx_fops_tx_ring); 
     259        debugfs_create_file("rx_ring", S_IRUGO, ag->debug.debugfs_dir, 
     260                            ag, &ag71xx_fops_rx_ring); 
    173261 
    174262        return 0; 
    175  
    176 err: 
    177         ag71xx_debugfs_exit(ag); 
    178         return -ENOMEM; 
    179263} 
    180264 
  • branches/backfire/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c

    r26672 r26985  
    653653 
    654654        ring->buf[i].skb = skb; 
     655        ring->buf[i].timestamp = jiffies; 
    655656 
    656657        /* setup descriptor fields */ 
     
    714715                        break; 
    715716 
    716                 return phy_mii_ioctl(ag->phy_dev, ifr, cmd); 
     717                return phy_mii_ioctl(ag->phy_dev, if_mii(ifr), cmd); 
    717718 
    718719        default: 
  • branches/backfire/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_phy.c

    r26672 r26985  
    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); 
     
    218218} 
    219219 
    220 void __devexit ag71xx_phy_disconnect(struct ag71xx *ag) 
     220void ag71xx_phy_disconnect(struct ag71xx *ag) 
    221221{ 
    222222        struct ag71xx_platform_data *pdata = ag71xx_get_pdata(ag); 
Note: See TracChangeset for help on using the changeset viewer.