From patchwork Mon Sep 17 15:10:17 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 184436 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 22BF42C0084 for ; Tue, 18 Sep 2012 01:10:42 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756598Ab2IQPKZ (ORCPT ); Mon, 17 Sep 2012 11:10:25 -0400 Received: from mail-bk0-f46.google.com ([209.85.214.46]:64760 "EHLO mail-bk0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755163Ab2IQPKY (ORCPT ); Mon, 17 Sep 2012 11:10:24 -0400 Received: by bkwj10 with SMTP id j10so2570646bkw.19 for ; Mon, 17 Sep 2012 08:10:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:x-gm-message-state; bh=c2PeCW1ulsU2bX+zC3srkdgiqbYd1HOW2lW/7T5bZTA=; b=R6zgeQDyHaFrCxsdAmIpA1cLe1PJsGXDWbM5oNADqoQUNnkviCBOcxIsH6+UbgdTXk G7cYdAvIJ7wE5hPYdR044PPz4wJheQBsau2LyaJCx2WKED/SannaQkGm6wmoO4QRcn9r 0e5we12g+7rYekCyNIOEsUVu56AhhPmMefQkr2ff50MP+ErSkgmOawS3LLJOBzYBSeec 1cc0i6lfJCE/c3kwnNF/bOg6WpaQZe4A4FDLeJbvqUooR/iR50V4kv0/VhKIw94y9H2y e7wQfJivw5WFehu+NcdY+ikFkt84+zadXJFJfQ8xn3Ic8kGxUqk/utHZcF8R+B6Kv9eq bESQ== Received: by 10.204.136.215 with SMTP id s23mr4490374bkt.32.1347894622650; Mon, 17 Sep 2012 08:10:22 -0700 (PDT) Received: from localhost (nat-pool-brq-t.redhat.com. [209.132.186.34]) by mx.google.com with ESMTPS id 14sm5802030bkw.15.2012.09.17.08.10.20 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 17 Sep 2012 08:10:21 -0700 (PDT) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net, mlindner@marvell.com, shemminger@vyatta.com, linux-kernel@vger.kernel.org Subject: [patch net] sky2: fix rx filter setup on link up Date: Mon, 17 Sep 2012 17:10:17 +0200 Message-Id: <1347894617-13614-1-git-send-email-jiri@resnulli.us> X-Mailer: git-send-email 1.7.11.4 X-Gm-Message-State: ALoCoQklWqbA6WW3fxTCYyolwmUtAyVoXSZM6++5vji1g/bLn95uGa+Ep4eEdTfNbvhkB/SfKmC6 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In my case I have following problem. sky2_set_multicast() sets registers GM_MC_ADDR_H[1-4] correctly to: 0000 0800 0001 0410 However, when adapter gets link and sky2_link_up() is called, the values are for some reason different: 0000 0800 0016 0410 This in my case prevents iface to be able to receive packets with dst mac 01:80:C2:00:00:02 (LACPDU dst mac), which I set up previously by SIOCADDMULTI. So remember computed rx_filter data and write it to GM_MC_ADDR_H[1-4] on link_up. Signed-off-by: Jiri Pirko --- drivers/net/ethernet/marvell/sky2.c | 30 ++++++++++++++++++++++-------- drivers/net/ethernet/marvell/sky2.h | 2 ++ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c index 2b0748d..5293ff4 100644 --- a/drivers/net/ethernet/marvell/sky2.c +++ b/drivers/net/ethernet/marvell/sky2.c @@ -2186,6 +2186,8 @@ static u16 sky2_phy_speed(const struct sky2_hw *hw, u16 aux) } } +static void sky2_write_rx_filter(struct sky2_port *sky2, u8 *filter); + static void sky2_link_up(struct sky2_port *sky2) { struct sky2_hw *hw = sky2->hw; @@ -2211,6 +2213,9 @@ static void sky2_link_up(struct sky2_port *sky2) sky2_write8(hw, SK_REG(port, LNK_LED_REG), LINKLED_ON | LINKLED_BLINK_OFF | LINKLED_LINKSYNC_OFF); + /* Refresh RX filter */ + sky2_write_rx_filter(sky2, sky2->rx_filter); + netif_info(sky2, link, sky2->netdev, "Link is up at %d Mbps, %s duplex, flow control %s\n", sky2->speed, @@ -3849,6 +3854,21 @@ static inline void sky2_add_filter(u8 filter[8], const u8 *addr) filter[bit >> 3] |= 1 << (bit & 7); } +static void sky2_write_rx_filter(struct sky2_port *sky2, u8 *filter) +{ + struct sky2_hw *hw = sky2->hw; + unsigned port = sky2->port; + + gma_write16(hw, port, GM_MC_ADDR_H1, + (u16) filter[0] | ((u16) filter[1] << 8)); + gma_write16(hw, port, GM_MC_ADDR_H2, + (u16) filter[2] | ((u16) filter[3] << 8)); + gma_write16(hw, port, GM_MC_ADDR_H3, + (u16) filter[4] | ((u16) filter[5] << 8)); + gma_write16(hw, port, GM_MC_ADDR_H4, + (u16) filter[6] | ((u16) filter[7] << 8)); +} + static void sky2_set_multicast(struct net_device *dev) { struct sky2_port *sky2 = netdev_priv(dev); @@ -3882,14 +3902,8 @@ static void sky2_set_multicast(struct net_device *dev) sky2_add_filter(filter, ha->addr); } - gma_write16(hw, port, GM_MC_ADDR_H1, - (u16) filter[0] | ((u16) filter[1] << 8)); - gma_write16(hw, port, GM_MC_ADDR_H2, - (u16) filter[2] | ((u16) filter[3] << 8)); - gma_write16(hw, port, GM_MC_ADDR_H3, - (u16) filter[4] | ((u16) filter[5] << 8)); - gma_write16(hw, port, GM_MC_ADDR_H4, - (u16) filter[6] | ((u16) filter[7] << 8)); + sky2_write_rx_filter(sky2, filter); + memcpy(sky2->rx_filter, filter, sizeof(sky2->rx_filter)); gma_write16(hw, port, GM_RX_CTRL, reg); } diff --git a/drivers/net/ethernet/marvell/sky2.h b/drivers/net/ethernet/marvell/sky2.h index 615ac63..513c266 100644 --- a/drivers/net/ethernet/marvell/sky2.h +++ b/drivers/net/ethernet/marvell/sky2.h @@ -2272,6 +2272,8 @@ struct sky2_port { #ifdef CONFIG_SKY2_DEBUG struct dentry *debugfs; #endif + + u8 rx_filter[8]; }; struct sky2_hw {