Changeset 16302


Ignore:
Timestamp:
2009-06-03T10:55:18+02:00 (8 years ago)
Author:
florian
Message:

[brcm63xx] merger mtu/802.1q related fixes:
bcm63xx integrated ethernet mac supports receiving and sending frames
bigger than 1500 bytes, this patch adds support for changing MTU.

This patch also fixes the reception of 802.1q frames for default MTU
which were reported as oversized.

Location:
trunk/target/linux/brcm63xx/files/drivers/net
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/brcm63xx/files/drivers/net/bcm63xx_enet.c

    r16277 r16302  
    2828#include <linux/dma-mapping.h> 
    2929#include <linux/platform_device.h> 
     30#include <linux/if_vlan.h> 
    3031 
    3132#include <bcm63xx_dev_enet.h> 
     
    190191 
    191192                if (!priv->rx_skb[desc_idx]) { 
    192                         skb = netdev_alloc_skb(dev, BCMENET_MAX_RX_SIZE); 
     193                        skb = netdev_alloc_skb(dev, priv->rx_skb_size); 
    193194                        if (!skb) 
    194195                                break; 
     
    196197 
    197198                        p = dma_map_single(&priv->pdev->dev, skb->data, 
    198                                            BCMENET_MAX_RX_SIZE, 
     199                                           priv->rx_skb_size, 
    199200                                           DMA_FROM_DEVICE); 
    200201                        desc->address = p; 
    201202                } 
    202203 
    203                 len_stat = BCMENET_MAX_RX_SIZE << DMADESC_LENGTH_SHIFT; 
     204                len_stat = priv->rx_skb_size << DMADESC_LENGTH_SHIFT; 
    204205                len_stat |= DMADESC_OWNER_MASK; 
    205206                if (priv->rx_dirty_desc == priv->rx_ring_size - 1) { 
     
    338339                } else { 
    339340                        dma_unmap_single(&priv->pdev->dev, desc->address, 
    340                                          BCMENET_MAX_RX_SIZE, DMA_FROM_DEVICE); 
     341                                         priv->rx_skb_size, DMA_FROM_DEVICE); 
    341342                        priv->rx_skb[desc_idx] = NULL; 
    342343                } 
     
    950951 
    951952        /* set max rx/tx length */ 
    952         enet_writel(priv, BCMENET_MAX_RX_SIZE, ENET_RXMAXLEN_REG); 
    953         enet_writel(priv, BCMENET_MAX_TX_SIZE, ENET_TXMAXLEN_REG); 
     953        enet_writel(priv, priv->hw_mtu, ENET_RXMAXLEN_REG); 
     954        enet_writel(priv, priv->hw_mtu, ENET_TXMAXLEN_REG); 
    954955 
    955956        /* set dma maximum burst len */ 
     
    10171018 
    10181019                desc = &priv->rx_desc_cpu[i]; 
    1019                 dma_unmap_single(kdev, desc->address, BCMENET_MAX_RX_SIZE, 
     1020                dma_unmap_single(kdev, desc->address, priv->rx_skb_size, 
    10201021                                 DMA_FROM_DEVICE); 
    10211022                kfree_skb(priv->rx_skb[i]); 
     
    11171118 
    11181119                desc = &priv->rx_desc_cpu[i]; 
    1119                 dma_unmap_single(kdev, desc->address, BCMENET_MAX_RX_SIZE, 
     1120                dma_unmap_single(kdev, desc->address, priv->rx_skb_size, 
    11201121                                 DMA_FROM_DEVICE); 
    11211122                kfree_skb(priv->rx_skb[i]); 
     
    15071508 
    15081509/* 
     1510 * calculate actual hardware mtu 
     1511 */ 
     1512static int compute_hw_mtu(struct bcm_enet_priv *priv, int mtu) 
     1513{ 
     1514        int actual_mtu; 
     1515 
     1516        actual_mtu = mtu; 
     1517 
     1518        /* add ethernet header + vlan tag size */ 
     1519        actual_mtu += VLAN_ETH_HLEN; 
     1520 
     1521        if (actual_mtu < 64 || actual_mtu > BCMENET_MAX_MTU) 
     1522                return -EINVAL; 
     1523 
     1524        /* 
     1525         * setup maximum size before we get overflow mark in 
     1526         * descriptor, note that this will not prevent reception of 
     1527         * big frames, they will be split into multiple buffers 
     1528         * anyway 
     1529         */ 
     1530        priv->hw_mtu = actual_mtu; 
     1531 
     1532        /* 
     1533         * align rx buffer size to dma burst len, account FCS since 
     1534         * it's appended 
     1535         */ 
     1536        priv->rx_skb_size = ALIGN(actual_mtu + ETH_FCS_LEN, 
     1537                                  BCMENET_DMA_MAXBURST * 4); 
     1538        return 0; 
     1539} 
     1540 
     1541/* 
     1542 * adjust mtu, can't be called while device is running 
     1543 */ 
     1544static int bcm_enet_change_mtu(struct net_device *dev, int new_mtu) 
     1545{ 
     1546        int ret; 
     1547 
     1548        if (netif_running(dev)) 
     1549                return -EBUSY; 
     1550 
     1551        ret = compute_hw_mtu(netdev_priv(dev), new_mtu); 
     1552        if (ret) 
     1553                return ret; 
     1554        dev->mtu = new_mtu; 
     1555        return 0; 
     1556} 
     1557 
     1558/* 
    15091559 * preinit hardware to allow mii operation while device is down 
    15101560 */ 
     
    15821632        priv = netdev_priv(dev); 
    15831633        memset(priv, 0, sizeof(*priv)); 
     1634 
     1635        ret = compute_hw_mtu(priv, dev->mtu); 
     1636        if (ret) 
     1637                goto out; 
    15841638 
    15851639        iomem_size = res_mem->end - res_mem->start + 1; 
     
    17221776        dev->poll_controller = bcm_enet_netpoll; 
    17231777#endif 
     1778        dev->change_mtu = bcm_enet_change_mtu; 
    17241779 
    17251780        SET_ETHTOOL_OPS(dev, &bcm_enet_ethtool_ops); 
     
    17551810                iounmap(priv->base); 
    17561811        } 
     1812out: 
    17571813        free_netdev(dev); 
    17581814        return ret; 
  • trunk/target/linux/brcm63xx/files/drivers/net/bcm63xx_enet.h

    r13368 r16302  
    2424#define BCMENET_TX_FIFO_TRESH   32 
    2525 
    26 /* maximum rx/tx packet size */ 
    27 #define BCMENET_MAX_RX_SIZE     (ETH_FRAME_LEN + 4) 
    28 #define BCMENET_MAX_TX_SIZE     (ETH_FRAME_LEN + 4) 
     26/* 
     27 * hardware maximum rx/tx packet size including FCS, max mtu is 
     28 * actually 2047, but if we set max rx size register to 2047 we won't 
     29 * get overflow information if packet size is 2048 or above 
     30 */ 
     31#define BCMENET_MAX_MTU         2046 
    2932 
    3033/* 
     
    203206        int rx_dirty_desc; 
    204207 
     208        /* size of allocated rx skbs */ 
     209        unsigned int rx_skb_size; 
     210 
    205211        /* list of skb given to hw for rx */ 
    206212        struct sk_buff **rx_skb; 
     
    290296        /* platform device reference */ 
    291297        struct platform_device *pdev; 
     298 
     299        /* maximum hardware transmit/receive size */ 
     300        unsigned int hw_mtu; 
    292301}; 
    293302 
Note: See TracChangeset for help on using the changeset viewer.