From patchwork Fri Apr 11 09:46:17 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marc Zyngier X-Patchwork-Id: 28249 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-yk0-f200.google.com (mail-yk0-f200.google.com [209.85.160.200]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 010C620822 for ; Fri, 11 Apr 2014 09:46:27 +0000 (UTC) Received: by mail-yk0-f200.google.com with SMTP id q9sf10347457ykb.3 for ; Fri, 11 Apr 2014 02:46:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:sender:precedence:list-id:x-original-sender :x-original-authentication-results:mailing-list:list-post:list-help :list-archive:list-unsubscribe; bh=02I59h8B/cHipJyIzj/fwv19UI6iTrvlrqqdl0z++pU=; b=D6KQIUnwobYJ+anEyT1j3yVMwEvgqXcE8aM+Vyl1tfUK+hPROCgpyIkvKwXzfE57A0 YdtlqzYhnwTgbUhQTgEPEjwM52tXcjtHIFMsjpw2EG1d6Ouz+FGPUR3U2wMZR04WZrCT 2ldsFUWU1TiV0HHPXzuAMDOtoubIcd2z5Bh3I7K7F/DHFWxWHVPZJOdf/V9VGFoixGyd 3ZwC04YOCzlYuYgCVwBcOSswAacDf24YZ+UD26Or0xklZ+Q5L0pHJm6/3NZEbsaSY0RD 9JolgLrRXS26Zo7Js4nalfFUAsyj2OAxewwFVFPwWOXeOyrxlkrugYAcdmHxQkbPCUNe MoJA== X-Gm-Message-State: ALoCoQns16IF3QAU4zN+DaxnZIrEJgC6SfDm/NpzSfKC7G+2sdUS8s4QLRROrevwAYOJ1XBIoOo8 X-Received: by 10.52.28.116 with SMTP id a20mr9354956vdh.2.1397209587660; Fri, 11 Apr 2014 02:46:27 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.20.138 with SMTP id 10ls1518041qgj.92.gmail; Fri, 11 Apr 2014 02:46:27 -0700 (PDT) X-Received: by 10.58.207.74 with SMTP id lu10mr18868365vec.15.1397209587574; Fri, 11 Apr 2014 02:46:27 -0700 (PDT) Received: from mail-vc0-f172.google.com (mail-vc0-f172.google.com [209.85.220.172]) by mx.google.com with ESMTPS id rw10si1208209vec.26.2014.04.11.02.46.27 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 11 Apr 2014 02:46:27 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.220.172 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.220.172; Received: by mail-vc0-f172.google.com with SMTP id la4so4637150vcb.31 for ; Fri, 11 Apr 2014 02:46:27 -0700 (PDT) X-Received: by 10.52.164.237 with SMTP id yt13mr16118112vdb.18.1397209587508; Fri, 11 Apr 2014 02:46:27 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.220.221.72 with SMTP id ib8csp42954vcb; Fri, 11 Apr 2014 02:46:27 -0700 (PDT) X-Received: by 10.68.239.70 with SMTP id vq6mr25706876pbc.152.1397209586833; Fri, 11 Apr 2014 02:46:26 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id sf3si3855145pac.370.2014.04.11.02.46.26; Fri, 11 Apr 2014 02:46:26 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756130AbaDKJqW (ORCPT + 3 others); Fri, 11 Apr 2014 05:46:22 -0400 Received: from fw-tnat.austin.arm.com ([217.140.110.23]:53484 "EHLO collaborate-mta1.arm.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755998AbaDKJqT (ORCPT ); Fri, 11 Apr 2014 05:46:19 -0400 Received: from e102391-lin.cambridge.arm.com (e102391-lin.cambridge.arm.com [10.1.209.166]) by collaborate-mta1.arm.com (Postfix) with ESMTP id 2EBAB13F8EE; Fri, 11 Apr 2014 04:46:18 -0500 (CDT) From: Marc Zyngier To: linux-sunxi@googlegroups.com, netdev@vger.kernel.org Cc: Stefan Roese , Maxime Ripard Subject: [PATCH] net: sun4i-emac: add promiscuous support Date: Fri, 11 Apr 2014 10:46:17 +0100 Message-Id: <1397209577-24443-1-git-send-email-marc.zyngier@arm.com> X-Mailer: git-send-email 1.8.3.4 Sender: netdev-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: netdev@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: marc.zyngier@arm.com X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.220.172 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , The sun4i-emac driver is rather primitive, and doesn't support promiscuous mode. This makes usage such as bridging impossible, which is a shame on virtualization capable HW such as the Allwinner A20. The fix is fairly simple: move the RX setup code to the ndo_set_rx_mode vector, and add the required HW configuration when IFF_PROMISC is passed by the core code. This has been tested on a generic A20 box running a few virtual machines hanging off a bridge with the EMAC chip as the link to the outside world. Cc: Stefan Roese Cc: Maxime Ripard Signed-off-by: Marc Zyngier Acked-by: Stefan Roese --- drivers/net/ethernet/allwinner/sun4i-emac.c | 30 ++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/allwinner/sun4i-emac.c b/drivers/net/ethernet/allwinner/sun4i-emac.c index 511f6ee..6343beb 100644 --- a/drivers/net/ethernet/allwinner/sun4i-emac.c +++ b/drivers/net/ethernet/allwinner/sun4i-emac.c @@ -268,15 +268,6 @@ static unsigned int emac_setup(struct net_device *ndev) writel(reg_val | EMAC_TX_MODE_ABORTED_FRAME_EN, db->membase + EMAC_TX_MODE_REG); - /* set up RX */ - reg_val = readl(db->membase + EMAC_RX_CTL_REG); - - writel(reg_val | EMAC_RX_CTL_PASS_LEN_OOR_EN | - EMAC_RX_CTL_ACCEPT_UNICAST_EN | EMAC_RX_CTL_DA_FILTER_EN | - EMAC_RX_CTL_ACCEPT_MULTICAST_EN | - EMAC_RX_CTL_ACCEPT_BROADCAST_EN, - db->membase + EMAC_RX_CTL_REG); - /* set MAC */ /* set MAC CTL0 */ reg_val = readl(db->membase + EMAC_MAC_CTL0_REG); @@ -309,6 +300,26 @@ static unsigned int emac_setup(struct net_device *ndev) return 0; } +static void emac_set_rx_mode(struct net_device *ndev) +{ + struct emac_board_info *db = netdev_priv(ndev); + unsigned int reg_val; + + /* set up RX */ + reg_val = readl(db->membase + EMAC_RX_CTL_REG); + + if (ndev->flags & IFF_PROMISC) + reg_val |= EMAC_RX_CTL_PASS_ALL_EN; + else + reg_val &= ~EMAC_RX_CTL_PASS_ALL_EN; + + writel(reg_val | EMAC_RX_CTL_PASS_LEN_OOR_EN | + EMAC_RX_CTL_ACCEPT_UNICAST_EN | EMAC_RX_CTL_DA_FILTER_EN | + EMAC_RX_CTL_ACCEPT_MULTICAST_EN | + EMAC_RX_CTL_ACCEPT_BROADCAST_EN, + db->membase + EMAC_RX_CTL_REG); +} + static unsigned int emac_powerup(struct net_device *ndev) { struct emac_board_info *db = netdev_priv(ndev); @@ -782,6 +793,7 @@ static const struct net_device_ops emac_netdev_ops = { .ndo_stop = emac_stop, .ndo_start_xmit = emac_start_xmit, .ndo_tx_timeout = emac_timeout, + .ndo_set_rx_mode = emac_set_rx_mode, .ndo_do_ioctl = emac_ioctl, .ndo_change_mtu = eth_change_mtu, .ndo_validate_addr = eth_validate_addr,