lkml.org 
[lkml]   [2017]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 087/109] net: fec: fix multicast filtering hardware setup
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Rui Sousa <rui.sousa@nxp.com>


    [ Upstream commit 01f8902bcf3ff124d0aeb88a774180ebcec20ace ]

    Fix hardware setup of multicast address hash:
    - Never clear the hardware hash (to avoid packet loss)
    - Construct the hash register values in software and then write once
    to hardware

    Signed-off-by: Rui Sousa <rui.sousa@nxp.com>
    Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/ethernet/freescale/fec_main.c | 23 +++++++++--------------
    1 file changed, 9 insertions(+), 14 deletions(-)

    --- a/drivers/net/ethernet/freescale/fec_main.c
    +++ b/drivers/net/ethernet/freescale/fec_main.c
    @@ -2923,6 +2923,7 @@ static void set_multicast_list(struct ne
    struct netdev_hw_addr *ha;
    unsigned int i, bit, data, crc, tmp;
    unsigned char hash;
    + unsigned int hash_high = 0, hash_low = 0;

    if (ndev->flags & IFF_PROMISC) {
    tmp = readl(fep->hwp + FEC_R_CNTRL);
    @@ -2945,11 +2946,7 @@ static void set_multicast_list(struct ne
    return;
    }

    - /* Clear filter and add the addresses in hash register
    - */
    - writel(0, fep->hwp + FEC_GRP_HASH_TABLE_HIGH);
    - writel(0, fep->hwp + FEC_GRP_HASH_TABLE_LOW);
    -
    + /* Add the addresses in hash register */
    netdev_for_each_mc_addr(ha, ndev) {
    /* calculate crc32 value of mac address */
    crc = 0xffffffff;
    @@ -2967,16 +2964,14 @@ static void set_multicast_list(struct ne
    */
    hash = (crc >> (32 - FEC_HASH_BITS)) & 0x3f;

    - if (hash > 31) {
    - tmp = readl(fep->hwp + FEC_GRP_HASH_TABLE_HIGH);
    - tmp |= 1 << (hash - 32);
    - writel(tmp, fep->hwp + FEC_GRP_HASH_TABLE_HIGH);
    - } else {
    - tmp = readl(fep->hwp + FEC_GRP_HASH_TABLE_LOW);
    - tmp |= 1 << hash;
    - writel(tmp, fep->hwp + FEC_GRP_HASH_TABLE_LOW);
    - }
    + if (hash > 31)
    + hash_high |= 1 << (hash - 32);
    + else
    + hash_low |= 1 << hash;
    }
    +
    + writel(hash_high, fep->hwp + FEC_GRP_HASH_TABLE_HIGH);
    + writel(hash_low, fep->hwp + FEC_GRP_HASH_TABLE_LOW);
    }

    /* Set a MAC change in hardware. */

    \
     
     \ /
      Last update: 2017-12-07 14:03    [W:4.141 / U:0.824 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site