aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-4.4/7209-staging-fsl-dpaa2-mac-Interrupt-code-cleanup.patch
blob: 9ed721f7fa7df121d52c3984efd7029fa224a1a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
From bb42890533f9592e8d30654b4e0b19c3cf7caaec Mon Sep 17 00:00:00 2001
From: Ioana Radulescu <ruxandra.radulescu@nxp.com>
Date: Fri, 1 Apr 2016 18:38:18 +0300
Subject: [PATCH 209/226] staging: fsl-dpaa2/mac: Interrupt code cleanup

Cleanup and a couple of minor fixes for the interrupt
handling code:
* Removed a few unnecessary checks, unify format for others
* Don't print error/debug messages in interrupt handler
* No need to explicitly disable DPMAC interrupts before
configuring them
* Use unlikely in interrupt handler routine error checks
* if status register is zero or we're unable to read its value,
return IRQ_NONE instead of IRQ_HANDLED
* always clear the entire status register, not just the bit(s)
that were treated

Signed-off-by: Ioana Radulescu <ruxandra.radulescu@nxp.com>
(cherry picked from commit 4b46eec16c56e4f453ca1558af9aceaf6ffe831a)
(Stuart:resolved merge conflict)
Signed-off-by: Stuart Yoder <stuart.yoder@nxp.com>
---
 drivers/staging/fsl-dpaa2/mac/mac.c |   77 ++++++++---------------------------
 1 file changed, 16 insertions(+), 61 deletions(-)

--- a/drivers/staging/fsl-dpaa2/mac/mac.c
+++ b/drivers/staging/fsl-dpaa2/mac/mac.c
@@ -132,7 +132,7 @@ static void dpaa2_mac_link_changed(struc
 }
 
 /* IRQ bits that we handle */
-static const u32 dpmac_irq_mask =  DPMAC_IRQ_EVENT_LINK_CFG_REQ;
+static const u32 dpmac_irq_mask = DPMAC_IRQ_EVENT_LINK_CFG_REQ;
 
 #ifdef CONFIG_FSL_DPAA2_MAC_NETDEVS
 static netdev_tx_t dpaa2_mac_drop_frame(struct sk_buff *skb,
@@ -345,16 +345,13 @@ static const struct ethtool_ops dpaa2_ma
 };
 #endif /* CONFIG_FSL_DPAA2_MAC_NETDEVS */
 
-static int configure_link(struct dpaa2_mac_priv *priv,
-			  struct dpmac_link_cfg *cfg)
+static void configure_link(struct dpaa2_mac_priv *priv,
+			   struct dpmac_link_cfg *cfg)
 {
 	struct phy_device *phydev = priv->netdev->phydev;
 
-	if (!phydev) {
-		dev_warn(priv->netdev->dev.parent,
-			 "asked to change PHY settings but PHY ref is NULL, ignoring\n");
-		return 0;
-	}
+	if (unlikely(!phydev))
+		return;
 
 	phydev->speed = cfg->rate;
 	phydev->duplex  = !!(cfg->options & DPMAC_LINK_OPT_HALF_DUPLEX);
@@ -368,8 +365,6 @@ static int configure_link(struct dpaa2_m
 	}
 
 	phy_start_aneg(phydev);
-
-	return 0;
 }
 
 static irqreturn_t dpaa2_mac_irq_handler(int irq_num, void *arg)
@@ -378,53 +373,29 @@ static irqreturn_t dpaa2_mac_irq_handler
 	struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
 	struct dpaa2_mac_priv *priv = dev_get_drvdata(dev);
 	struct dpmac_link_cfg link_cfg;
-	u8 irq_index = DPMAC_IRQ_INDEX;
-	u32 status, clear = 0;
+	u32 status;
 	int err;
 
-	if (mc_dev->irqs[0]->msi_desc->irq != irq_num) {
-		dev_err(dev, "received unexpected interrupt %d!\n", irq_num);
-		goto err;
-	}
-
 	err = dpmac_get_irq_status(mc_dev->mc_io, 0, mc_dev->mc_handle,
-				   irq_index, &status);
-	if (err) {
-		dev_err(dev, "dpmac_get_irq_status err %d\n", err);
-		clear = ~0x0u;
-		goto out;
-	}
+				   DPMAC_IRQ_INDEX, &status);
+	if (unlikely(err || !status))
+		return IRQ_NONE;
 
 	/* DPNI-initiated link configuration; 'ifconfig up' also calls this */
 	if (status & DPMAC_IRQ_EVENT_LINK_CFG_REQ) {
-		dev_dbg(dev, "DPMAC IRQ %d - LINK_CFG_REQ\n", irq_num);
-		clear |= DPMAC_IRQ_EVENT_LINK_CFG_REQ;
-
 		err = dpmac_get_link_cfg(mc_dev->mc_io, 0, mc_dev->mc_handle,
 					 &link_cfg);
-		if (err) {
-			dev_err(dev, "dpmac_get_link_cfg err %d\n", err);
+		if (unlikely(err))
 			goto out;
-		}
 
-		err = configure_link(priv, &link_cfg);
-		if (err) {
-			dev_err(dev, "cannot configure link\n");
-			goto out;
-		}
+		configure_link(priv, &link_cfg);
 	}
 
 out:
-	err = dpmac_clear_irq_status(mc_dev->mc_io, 0, mc_dev->mc_handle,
-				     irq_index, clear);
-	if (err < 0)
-		dev_err(&mc_dev->dev, "dpmac_clear_irq_status() err %d\n", err);
+	dpmac_clear_irq_status(mc_dev->mc_io, 0, mc_dev->mc_handle,
+			       DPMAC_IRQ_INDEX, status);
 
 	return IRQ_HANDLED;
-
-err:
-	dev_warn(dev, "DPMAC IRQ %d was not handled!\n", irq_num);
-	return IRQ_NONE;
 }
 
 static int setup_irqs(struct fsl_mc_device *mc_dev)
@@ -437,19 +408,6 @@ static int setup_irqs(struct fsl_mc_devi
 		return err;
 	}
 
-	err = dpmac_set_irq_mask(mc_dev->mc_io, 0, mc_dev->mc_handle,
-				 DPMAC_IRQ_INDEX, dpmac_irq_mask);
-	if (err < 0) {
-		dev_err(&mc_dev->dev, "dpmac_set_irq_mask err %d\n", err);
-		goto free_irq;
-	}
-	err = dpmac_set_irq_enable(mc_dev->mc_io, 0, mc_dev->mc_handle,
-				   DPMAC_IRQ_INDEX, 0);
-	if (err) {
-		dev_err(&mc_dev->dev, "dpmac_set_irq_enable err %d\n", err);
-		goto free_irq;
-	}
-
 	err = devm_request_threaded_irq(&mc_dev->dev,
 					mc_dev->irqs[0]->msi_desc->irq,
 					NULL, &dpaa2_mac_irq_handler,
@@ -463,7 +421,7 @@ static int setup_irqs(struct fsl_mc_devi
 
 	err = dpmac_set_irq_mask(mc_dev->mc_io, 0, mc_dev->mc_handle,
 				 DPMAC_IRQ_INDEX, dpmac_irq_mask);
-	if (err < 0) {
+	if (err) {
 		dev_err(&mc_dev->dev, "dpmac_set_irq_mask err %d\n", err);
 		goto free_irq;
 	}
@@ -490,12 +448,12 @@ static void teardown_irqs(struct fsl_mc_
 
 	err = dpmac_set_irq_mask(mc_dev->mc_io, 0, mc_dev->mc_handle,
 				 DPMAC_IRQ_INDEX, dpmac_irq_mask);
-	if (err < 0)
+	if (err)
 		dev_err(&mc_dev->dev, "dpmac_set_irq_mask err %d\n", err);
 
 	err = dpmac_set_irq_enable(mc_dev->mc_io, 0, mc_dev->mc_handle,
 				   DPMAC_IRQ_INDEX, 0);
-	if (err < 0)
+	if (err)
 		dev_err(&mc_dev->dev, "dpmac_set_irq_enable err %d\n", err);
 
 	devm_free_irq(&mc_dev->dev, mc_dev->irqs[0]->msi_desc->irq, &mc_dev->dev);
@@ -562,9 +520,6 @@ static int dpaa2_mac_probe(struct fsl_mc
 	phy_interface_t		if_mode;
 	int			err = 0;
 
-	/* just being completely paranoid */
-	if (!mc_dev)
-		return -EFAULT;
 	dev = &mc_dev->dev;
 
 	/* prepare a net_dev structure to make the phy lib API happy */