]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.9.135/ravb-do-not-write-1-to-reserved-bits.patch
4.14-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.9.135 / ravb-do-not-write-1-to-reserved-bits.patch
CommitLineData
be7e94f8
GKH
1From foo@baz Thu Oct 18 11:11:32 CEST 2018
2From: Kazuya Mizuguchi <kazuya.mizuguchi.ks@renesas.com>
3Date: Tue, 18 Sep 2018 12:22:26 +0200
4Subject: ravb: do not write 1 to reserved bits
5
6From: Kazuya Mizuguchi <kazuya.mizuguchi.ks@renesas.com>
7
8[ Upstream commit 2fe397a3959de8a472f165e6d152f64cb77fa2cc ]
9
10EtherAVB hardware requires 0 to be written to status register bits in
11order to clear them, however, care must be taken not to:
12
131. Clear other bits, by writing zero to them
142. Write one to reserved bits
15
16This patch corrects the ravb driver with respect to the second point above.
17This is done by defining reserved bit masks for the affected registers and,
18after auditing the code, ensure all sites that may write a one to a
19reserved bit use are suitably masked.
20
21Signed-off-by: Kazuya Mizuguchi <kazuya.mizuguchi.ks@renesas.com>
22Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
23Reviewed-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
24Signed-off-by: David S. Miller <davem@davemloft.net>
25Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
26Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
27---
28 drivers/net/ethernet/renesas/ravb.h | 5 +++++
29 drivers/net/ethernet/renesas/ravb_main.c | 11 ++++++-----
30 drivers/net/ethernet/renesas/ravb_ptp.c | 2 +-
31 3 files changed, 12 insertions(+), 6 deletions(-)
32
33--- a/drivers/net/ethernet/renesas/ravb.h
34+++ b/drivers/net/ethernet/renesas/ravb.h
35@@ -421,6 +421,7 @@ enum EIS_BIT {
36 EIS_CULF1 = 0x00000080,
37 EIS_TFFF = 0x00000100,
38 EIS_QFS = 0x00010000,
39+ EIS_RESERVED = (GENMASK(31, 17) | GENMASK(15, 11)),
40 };
41
42 /* RIC0 */
43@@ -465,6 +466,7 @@ enum RIS0_BIT {
44 RIS0_FRF15 = 0x00008000,
45 RIS0_FRF16 = 0x00010000,
46 RIS0_FRF17 = 0x00020000,
47+ RIS0_RESERVED = GENMASK(31, 18),
48 };
49
50 /* RIC1 */
51@@ -521,6 +523,7 @@ enum RIS2_BIT {
52 RIS2_QFF16 = 0x00010000,
53 RIS2_QFF17 = 0x00020000,
54 RIS2_RFFF = 0x80000000,
55+ RIS2_RESERVED = GENMASK(30, 18),
56 };
57
58 /* TIC */
59@@ -537,6 +540,7 @@ enum TIS_BIT {
60 TIS_FTF1 = 0x00000002, /* Undocumented? */
61 TIS_TFUF = 0x00000100,
62 TIS_TFWF = 0x00000200,
63+ TIS_RESERVED = (GENMASK(31, 20) | GENMASK(15, 12) | GENMASK(7, 4))
64 };
65
66 /* ISS */
67@@ -610,6 +614,7 @@ enum GIC_BIT {
68 enum GIS_BIT {
69 GIS_PTCF = 0x00000001, /* Undocumented? */
70 GIS_PTMF = 0x00000004,
71+ GIS_RESERVED = GENMASK(15, 10),
72 };
73
74 /* GIE (R-Car Gen3 only) */
75--- a/drivers/net/ethernet/renesas/ravb_main.c
76+++ b/drivers/net/ethernet/renesas/ravb_main.c
77@@ -717,10 +717,11 @@ static void ravb_error_interrupt(struct
78 u32 eis, ris2;
79
80 eis = ravb_read(ndev, EIS);
81- ravb_write(ndev, ~EIS_QFS, EIS);
82+ ravb_write(ndev, ~(EIS_QFS | EIS_RESERVED), EIS);
83 if (eis & EIS_QFS) {
84 ris2 = ravb_read(ndev, RIS2);
85- ravb_write(ndev, ~(RIS2_QFF0 | RIS2_RFFF), RIS2);
86+ ravb_write(ndev, ~(RIS2_QFF0 | RIS2_RFFF | RIS2_RESERVED),
87+ RIS2);
88
89 /* Receive Descriptor Empty int */
90 if (ris2 & RIS2_QFF0)
91@@ -773,7 +774,7 @@ static bool ravb_timestamp_interrupt(str
92 u32 tis = ravb_read(ndev, TIS);
93
94 if (tis & TIS_TFUF) {
95- ravb_write(ndev, ~TIS_TFUF, TIS);
96+ ravb_write(ndev, ~(TIS_TFUF | TIS_RESERVED), TIS);
97 ravb_get_tx_tstamp(ndev);
98 return true;
99 }
100@@ -908,7 +909,7 @@ static int ravb_poll(struct napi_struct
101 /* Processing RX Descriptor Ring */
102 if (ris0 & mask) {
103 /* Clear RX interrupt */
104- ravb_write(ndev, ~mask, RIS0);
105+ ravb_write(ndev, ~(mask | RIS0_RESERVED), RIS0);
106 if (ravb_rx(ndev, &quota, q))
107 goto out;
108 }
109@@ -916,7 +917,7 @@ static int ravb_poll(struct napi_struct
110 if (tis & mask) {
111 spin_lock_irqsave(&priv->lock, flags);
112 /* Clear TX interrupt */
113- ravb_write(ndev, ~mask, TIS);
114+ ravb_write(ndev, ~(mask | TIS_RESERVED), TIS);
115 ravb_tx_free(ndev, q, true);
116 netif_wake_subqueue(ndev, q);
117 mmiowb();
118--- a/drivers/net/ethernet/renesas/ravb_ptp.c
119+++ b/drivers/net/ethernet/renesas/ravb_ptp.c
120@@ -319,7 +319,7 @@ void ravb_ptp_interrupt(struct net_devic
121 }
122 }
123
124- ravb_write(ndev, ~gis, GIS);
125+ ravb_write(ndev, ~(gis | GIS_RESERVED), GIS);
126 }
127
128 void ravb_ptp_init(struct net_device *ndev, struct platform_device *pdev)