]>
Commit | Line | Data |
---|---|---|
be7e94f8 GKH |
1 | From foo@baz Thu Oct 18 11:11:32 CEST 2018 |
2 | From: Kazuya Mizuguchi <kazuya.mizuguchi.ks@renesas.com> | |
3 | Date: Tue, 18 Sep 2018 12:22:26 +0200 | |
4 | Subject: ravb: do not write 1 to reserved bits | |
5 | ||
6 | From: Kazuya Mizuguchi <kazuya.mizuguchi.ks@renesas.com> | |
7 | ||
8 | [ Upstream commit 2fe397a3959de8a472f165e6d152f64cb77fa2cc ] | |
9 | ||
10 | EtherAVB hardware requires 0 to be written to status register bits in | |
11 | order to clear them, however, care must be taken not to: | |
12 | ||
13 | 1. Clear other bits, by writing zero to them | |
14 | 2. Write one to reserved bits | |
15 | ||
16 | This patch corrects the ravb driver with respect to the second point above. | |
17 | This is done by defining reserved bit masks for the affected registers and, | |
18 | after auditing the code, ensure all sites that may write a one to a | |
19 | reserved bit use are suitably masked. | |
20 | ||
21 | Signed-off-by: Kazuya Mizuguchi <kazuya.mizuguchi.ks@renesas.com> | |
22 | Signed-off-by: Simon Horman <horms+renesas@verge.net.au> | |
23 | Reviewed-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> | |
24 | Signed-off-by: David S. Miller <davem@davemloft.net> | |
25 | Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> | |
26 | Signed-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, "a, 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) |