lkml.org 
[lkml]   [2008]   [Feb]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 71/73] atl1: fix frame length bug
    2.6.23-stable review patch.  If anyone has any objections, please let us know.
    ------------------
    From: Jay Cliburn <jacliburn@bellsouth.net>


    Upstream commit: 2a49128f0a6edee337174ea341c1d6d7565be350

    The driver sets up the hardware to accept a frame with max length
    equal to MTU + Ethernet header + FCS + VLAN tag, but we neglect to
    add the VLAN tag size to the ingress buffer. When a VLAN-tagged
    frame arrives, the hardware passes it, but bad things happen
    because the buffer is too small. This patch fixes that.

    Thanks to David Harris for reporting the bug and testing the fix.

    Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net>
    Tested-by: David Harris <david.harris@cpni-inc.com>
    Signed-off-by: Jeff Garzik <jeff@garzik.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/net/atl1/atl1_main.c | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    --- a/drivers/net/atl1/atl1_main.c
    +++ b/drivers/net/atl1/atl1_main.c
    @@ -121,7 +121,7 @@ static int __devinit atl1_sw_init(struct
    struct atl1_hw *hw = &adapter->hw;
    struct net_device *netdev = adapter->netdev;

    - hw->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
    + hw->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
    hw->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;

    adapter->wol = 0;
    @@ -689,7 +689,7 @@ static int atl1_change_mtu(struct net_de
    {
    struct atl1_adapter *adapter = netdev_priv(netdev);
    int old_mtu = netdev->mtu;
    - int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
    + int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;

    if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
    (max_frame > MAX_JUMBO_FRAME_SIZE)) {
    @@ -854,8 +854,8 @@ static u32 atl1_configure(struct atl1_ad
    /* set Interrupt Clear Timer */
    iowrite16(adapter->ict, hw->hw_addr + REG_CMBDISDMA_TIMER);

    - /* set MTU, 4 : VLAN */
    - iowrite32(hw->max_frame_size + 4, hw->hw_addr + REG_MTU);
    + /* set max frame size hw will accept */
    + iowrite32(hw->max_frame_size, hw->hw_addr + REG_MTU);

    /* jumbo size & rrd retirement timer */
    value = (((u32) hw->rx_jumbo_th & RXQ_JMBOSZ_TH_MASK)
    --


    \
     
     \ /
      Last update: 2008-02-07 01:35    [W:0.038 / U:0.920 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site