From patchwork Wed Apr 26 23:38:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Iyappan Subramanian X-Patchwork-Id: 755688 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 3wCxLN5w2Rz9s82 for ; Thu, 27 Apr 2017 09:36:44 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=apm.com header.i=@apm.com header.b="gy+yuwTX"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1032776AbdDZXgl (ORCPT ); Wed, 26 Apr 2017 19:36:41 -0400 Received: from mail-pf0-f181.google.com ([209.85.192.181]:35095 "EHLO mail-pf0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1032757AbdDZXgf (ORCPT ); Wed, 26 Apr 2017 19:36:35 -0400 Received: by mail-pf0-f181.google.com with SMTP id v14so8272499pfd.2 for ; Wed, 26 Apr 2017 16:36:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=apm.com; s=apm; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=IfYyetepg3iUrcd121lh3Rg5DQ6u5VuVodylC2sS+5M=; b=gy+yuwTXWu7tiORKhbtLj+cxokps3gBkFgEywXnRp7tt2Sph/LUbpCNv7g3I53mcuA qM+2sMAdwip0JAzvWfBJqdwa9piaNAZZn18LilY04RoTPGjDBjgB1XceUAtknStDqWKk nU9B1xW3pbc3WzwSROnfCaAQlMtVEKGE+OQP8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=IfYyetepg3iUrcd121lh3Rg5DQ6u5VuVodylC2sS+5M=; b=gbA+oqQiahm0TXr1S+tLdBOQeL5rxMzxRzhVHiUcOPBnkWM9Nm2SBhr/l3VcfRSyKa S8Pj1+/DmnMpFhkZRVqRJOFMq5eA39lYgMJmDXmNJ1yoXNW3nZJl6VgS/i+fORa0q7uK 3vSZmE+A0PEtip3Da3/tXduLVDYwCKjK1c+GqKY6QKlhnf6DWA899Q+ScH64+9s0OFNd jddyjb/pH7YQ+PfP7xLj9yNoyZZxqQ9OMKFYB00RDvOHzQGZ5geJxO/aLOp1lb0RY7Ry 37fjos65PgmKZgLODPxW/f7fHVqn2kk1xdcmwZat7mG2TSnbi52sSBtp7c2Fh0ZaYvr7 RwNQ== X-Gm-Message-State: AN3rC/4yaUm925wu2fl0ptOU/LJwKE0dBO0s1/9DB4qeDRaQZsazp1D8 vaXmiwJSqGyUnYP9 X-Received: by 10.98.60.134 with SMTP id b6mr2488183pfk.19.1493249794621; Wed, 26 Apr 2017 16:36:34 -0700 (PDT) Received: from isubrama-dev.amcc.com ([206.80.4.98]) by smtp.gmail.com with ESMTPSA id i30sm626700pgn.39.2017.04.26.16.36.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 26 Apr 2017 16:36:34 -0700 (PDT) From: Iyappan Subramanian To: davem@davemloft.net, netdev@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, patches@apm.com, Quan Nguyen , Iyappan Subramanian Subject: [PATCH net-next 1/9] drivers: net: xgene: Protect indirect MAC access Date: Wed, 26 Apr 2017 16:38:47 -0700 Message-Id: <1493249935-30759-2-git-send-email-isubramanian@apm.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1493249935-30759-1-git-send-email-isubramanian@apm.com> References: <1493249935-30759-1-git-send-email-isubramanian@apm.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Quan Nguyen This patch adds lock to protect indirect mac access sequence. Signed-off-by: Quan Nguyen Signed-off-by: Iyappan Subramanian --- drivers/net/ethernet/apm/xgene/xgene_enet_hw.c | 2 ++ drivers/net/ethernet/apm/xgene/xgene_enet_main.c | 1 + drivers/net/ethernet/apm/xgene/xgene_enet_main.h | 1 + drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c | 7 ++++++- drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c | 2 ++ 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c index 2a835e0..3697ba7 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c @@ -365,9 +365,11 @@ static void xgene_enet_rd_mcx_mac(struct xgene_enet_pdata *pdata, cmd = pdata->mcx_mac_addr + MAC_COMMAND_REG_OFFSET; cmd_done = pdata->mcx_mac_addr + MAC_COMMAND_DONE_REG_OFFSET; + spin_lock(&pdata->mac_lock); if (!xgene_enet_rd_indirect(addr, rd, cmd, cmd_done, rd_addr, rd_data)) netdev_err(pdata->ndev, "MCX mac read failed, addr: %04x\n", rd_addr); + spin_unlock(&pdata->mac_lock); } static void xgene_gmac_set_mac_addr(struct xgene_enet_pdata *pdata) diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c index 5f37ed3..9a28ac3 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c @@ -2055,6 +2055,7 @@ static int xgene_enet_probe(struct platform_device *pdev) goto err; xgene_enet_setup_ops(pdata); + spin_lock_init(&pdata->mac_lock); if (pdata->phy_mode == PHY_INTERFACE_MODE_XGMII) { ndev->features |= NETIF_F_TSO | NETIF_F_RXCSUM; diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.h b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h index 0d4be24..827b33d 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.h +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.h @@ -221,6 +221,7 @@ struct xgene_enet_pdata { struct xgene_enet_cle cle; struct rtnl_link_stats64 stats; const struct xgene_mac_ops *mac_ops; + spinlock_t mac_lock; /* mac lock */ const struct xgene_port_ops *port_ops; struct xgene_ring_ops *ring_ops; const struct xgene_cle_ops *cle_ops; diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c b/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c index a8e063b..4dd41f5 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c @@ -130,6 +130,7 @@ static u32 xgene_enet_rd_indirect(struct xgene_indirect_ctl *ctl, u32 rd_addr) static u32 xgene_enet_rd_mac(struct xgene_enet_pdata *p, u32 rd_addr) { + u32 val; struct xgene_indirect_ctl ctl = { .addr = p->mcx_mac_addr + MAC_ADDR_REG_OFFSET, .ctl = p->mcx_mac_addr + MAC_READ_REG_OFFSET, @@ -137,7 +138,11 @@ static u32 xgene_enet_rd_mac(struct xgene_enet_pdata *p, u32 rd_addr) .cmd_done = p->mcx_mac_addr + MAC_COMMAND_DONE_REG_OFFSET }; - return xgene_enet_rd_indirect(&ctl, rd_addr); + spin_lock(&p->mac_lock); + val = xgene_enet_rd_indirect(&ctl, rd_addr); + spin_unlock(&p->mac_lock); + + return val; } static int xgene_enet_ecc_init(struct xgene_enet_pdata *p) diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c b/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c index 423240c..9a2d0ca 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c @@ -158,9 +158,11 @@ static void xgene_enet_rd_mac(struct xgene_enet_pdata *pdata, cmd = pdata->mcx_mac_addr + MAC_COMMAND_REG_OFFSET; cmd_done = pdata->mcx_mac_addr + MAC_COMMAND_DONE_REG_OFFSET; + spin_lock(&pdata->mac_lock); if (!xgene_enet_rd_indirect(addr, rd, cmd, cmd_done, rd_addr, rd_data)) netdev_err(pdata->ndev, "MCX mac read failed, addr: %04x\n", rd_addr); + spin_unlock(&pdata->mac_lock); } static bool xgene_enet_rd_pcs(struct xgene_enet_pdata *pdata,