From patchwork Fri Aug 26 20:01:07 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Brandt X-Patchwork-Id: 663231 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 3sLX515h0pz9sRZ for ; Sat, 27 Aug 2016 06:02:13 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753766AbcHZUCJ (ORCPT ); Fri, 26 Aug 2016 16:02:09 -0400 Received: from relmlor2.renesas.com ([210.160.252.172]:5401 "EHLO relmlie1.idc.renesas.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751691AbcHZUCJ (ORCPT ); Fri, 26 Aug 2016 16:02:09 -0400 Received: from unknown (HELO relmlir2.idc.renesas.com) ([10.200.68.152]) by relmlie1.idc.renesas.com with ESMTP; 27 Aug 2016 05:02:06 +0900 Received: from relmlac1.idc.renesas.com (relmlac1.idc.renesas.com [10.200.69.21]) by relmlir2.idc.renesas.com (Postfix) with ESMTP id A4E65430CE; Sat, 27 Aug 2016 05:02:06 +0900 (JST) Received: by relmlac1.idc.renesas.com (Postfix, from userid 0) id 933C28002E; Sat, 27 Aug 2016 05:02:06 +0900 (JST) Received: from relmlac1.idc.renesas.com (localhost [127.0.0.1]) by relmlac1.idc.renesas.com (Postfix) with ESMTP id 8D4B58002D; Sat, 27 Aug 2016 05:02:06 +0900 (JST) Received: from relmlii1.idc.renesas.com [10.200.68.65] by relmlac1.idc.renesas.com with ESMTP id FAE14900; Sat, 27 Aug 2016 05:02:06 +0900 X-IronPort-AV: E=Sophos;i="5.22,559,1449500400"; d="scan'208";a="218227677" Received: from unknown (HELO rtamta01.rta.renesas.com) ([143.103.48.75]) by relmlii1.idc.renesas.com with ESMTP; 27 Aug 2016 05:02:05 +0900 Received: from localhost.localdomain (unknown [172.27.49.101]) by rtamta01.rta.renesas.com (Postfix) with ESMTP id 0963C5BB; Fri, 26 Aug 2016 20:02:00 +0000 (UTC) From: Chris Brandt To: sergei.shtylyov@cogentembedded.com, "David S . Miller" Cc: Chris Brandt , Simon Horman , Geert Uytterhoeven , Daniel Palmer , netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org Subject: [PATCH] net: ethernet: renesas: sh_eth: do not access POST registers if not exist Date: Fri, 26 Aug 2016 16:01:07 -0400 Message-Id: <20160826200107.20681-1-chris.brandt@renesas.com> X-Mailer: git-send-email 2.9.2 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The RZ/A1 has a TSU, but since it only has one Ethernet port, it does not have POST registers. Therefore, if you try to write to register index TSU_POST1 (which will be FFFF because it does not exist), it will either panic or corrupt memory elsewhere. Reported-by: Daniel Palmer Signed-off-by: Chris Brandt --- drivers/net/ethernet/renesas/sh_eth.c | 7 +++++++ drivers/net/ethernet/renesas/sh_eth.h | 1 + 2 files changed, 8 insertions(+) diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c index 1f8240a..850a13c 100644 --- a/drivers/net/ethernet/renesas/sh_eth.c +++ b/drivers/net/ethernet/renesas/sh_eth.c @@ -532,6 +532,7 @@ static struct sh_eth_cpu_data r7s72100_data = { .no_ade = 1, .hw_crc = 1, .tsu = 1, + .tsu_no_post = 1, .shift_rd0 = 1, }; @@ -2460,6 +2461,9 @@ static void sh_eth_tsu_enable_cam_entry_post(struct net_device *ndev, u32 tmp; void *reg_offset; + if (mdp->cd->tsu_no_post) + return; + reg_offset = sh_eth_tsu_get_post_reg_offset(mdp, entry); tmp = ioread32(reg_offset); iowrite32(tmp | sh_eth_tsu_get_post_bit(mdp, entry), reg_offset); @@ -2472,6 +2476,9 @@ static bool sh_eth_tsu_disable_cam_entry_post(struct net_device *ndev, u32 post_mask, ref_mask, tmp; void *reg_offset; + if (mdp->cd->tsu_no_post) + return false; + reg_offset = sh_eth_tsu_get_post_reg_offset(mdp, entry); post_mask = sh_eth_tsu_get_post_mask(entry); ref_mask = sh_eth_tsu_get_post_bit(mdp, entry) & ~post_mask; diff --git a/drivers/net/ethernet/renesas/sh_eth.h b/drivers/net/ethernet/renesas/sh_eth.h index d050f37..ae34f2e 100644 --- a/drivers/net/ethernet/renesas/sh_eth.h +++ b/drivers/net/ethernet/renesas/sh_eth.h @@ -484,6 +484,7 @@ struct sh_eth_cpu_data { unsigned tpauser:1; /* EtherC have TPAUSER */ unsigned bculr:1; /* EtherC have BCULR */ unsigned tsu:1; /* EtherC have TSU */ + unsigned tsu_no_post:1; /* EtherC have TSU, but no POST */ unsigned hw_swap:1; /* E-DMAC have DE bit in EDMR */ unsigned rpadir:1; /* E-DMAC have RPADIR */ unsigned no_trimd:1; /* E-DMAC DO NOT have TRIMD */