* [PATCH net 0/2] net: stmmac: Correct socfpga init/exit and cppcheck issue
@ 2014-06-23 0:34 Vince Bridgers
2014-06-23 0:35 ` [PATCH net 1/2] net: stmmac: add platform init/exit for Altera's ARM socfpga Vince Bridgers
2014-06-23 0:35 ` [PATCH net 2/2] net: stmmac: Correct duplicate if/then/else case found by cppcheck Vince Bridgers
0 siblings, 2 replies; 5+ messages in thread
From: Vince Bridgers @ 2014-06-23 0:34 UTC (permalink / raw)
To: netdev, peppe.cavallaro; +Cc: vbridgers2013
This patch series adds platform specific init/exit code so that socfpga
suspend/resume works as expected, and corrects a minor issue detected by
cppcheck.
Vince Bridgers (2):
net: stmmac: add platform init/exit for Altera's ARM socfpga
net: stmmac: Correct duplicate if/then/else case found by cppcheck
.../net/ethernet/stmicro/stmmac/dwmac-socfpga.c | 68 ++++++++++++++++++++
drivers/net/ethernet/stmicro/stmmac/enh_desc.c | 2 +-
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 4 ++
3 files changed, 73 insertions(+), 1 deletion(-)
--
1.7.9.5
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH net 1/2] net: stmmac: add platform init/exit for Altera's ARM socfpga
2014-06-23 0:34 [PATCH net 0/2] net: stmmac: Correct socfpga init/exit and cppcheck issue Vince Bridgers
@ 2014-06-23 0:35 ` Vince Bridgers
2014-06-25 22:59 ` David Miller
2014-06-23 0:35 ` [PATCH net 2/2] net: stmmac: Correct duplicate if/then/else case found by cppcheck Vince Bridgers
1 sibling, 1 reply; 5+ messages in thread
From: Vince Bridgers @ 2014-06-23 0:35 UTC (permalink / raw)
To: netdev, peppe.cavallaro; +Cc: vbridgers2013
This patch adds platform init/exit functions and modifications to support
suspend/resume for the Altera Cyclone 5 SOC Ethernet controller. The platform
exit function puts the controller into reset using the socfpga reset
controller driver. The platform init function sets up the Synopsys mac by
first making sure the Ethernet controller is held in reset, programming the
phy mode through external support logic, then deasserts reset through
the socfpga reset manager driver.
Signed-off-by: Vince Bridgers <vbridgers2013@gmail.com>
---
.../net/ethernet/stmicro/stmmac/dwmac-socfpga.c | 68 ++++++++++++++++++++
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 4 ++
2 files changed, 72 insertions(+)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
index fd8a217..1607c04 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
@@ -20,7 +20,9 @@
#include <linux/of_net.h>
#include <linux/phy.h>
#include <linux/regmap.h>
+#include <linux/reset.h>
#include <linux/stmmac.h>
+#include "stmmac.h"
#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII 0x0
#define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII 0x1
@@ -34,6 +36,7 @@ struct socfpga_dwmac {
u32 reg_shift;
struct device *dev;
struct regmap *sys_mgr_base_addr;
+ struct reset_control *stmmac_rst;
};
static int socfpga_dwmac_parse_data(struct socfpga_dwmac *dwmac, struct device *dev)
@@ -43,6 +46,13 @@ static int socfpga_dwmac_parse_data(struct socfpga_dwmac *dwmac, struct device *
u32 reg_offset, reg_shift;
int ret;
+ dwmac->stmmac_rst = devm_reset_control_get(dev,
+ STMMAC_RESOURCE_NAME);
+ if (IS_ERR(dwmac->stmmac_rst)) {
+ dev_info(dev, "Could not get reset control!\n");
+ return -EINVAL;
+ }
+
dwmac->interface = of_get_phy_mode(np);
sys_mgr_base_addr = syscon_regmap_lookup_by_phandle(np, "altr,sysmgr-syscon");
@@ -125,6 +135,64 @@ static void *socfpga_dwmac_probe(struct platform_device *pdev)
return dwmac;
}
+static void socfpga_dwmac_exit(struct platform_device *pdev, void *priv)
+{
+ struct socfpga_dwmac *dwmac = priv;
+
+ /* On socfpga platform exit, assert and hold reset to the
+ * enet controller - the default state after a hard reset.
+ */
+ if (dwmac->stmmac_rst)
+ reset_control_assert(dwmac->stmmac_rst);
+}
+
+static int socfpga_dwmac_init(struct platform_device *pdev, void *priv)
+{
+ struct socfpga_dwmac *dwmac = priv;
+ struct net_device *ndev = platform_get_drvdata(pdev);
+ struct stmmac_priv *stpriv = NULL;
+ int ret = 0;
+
+ if (ndev)
+ stpriv = netdev_priv(ndev);
+
+ /* Assert reset to the enet controller before changing the phy mode */
+ if (dwmac->stmmac_rst)
+ reset_control_assert(dwmac->stmmac_rst);
+
+ /* Setup the phy mode in the system manager registers according to
+ * devicetree configuration
+ */
+ ret = socfpga_dwmac_setup(dwmac);
+
+ /* Deassert reset for the phy configuration to be sampled by
+ * the enet controller, and operation to start in requested mode
+ */
+ if (dwmac->stmmac_rst)
+ reset_control_deassert(dwmac->stmmac_rst);
+
+ /* Before the enet controller is suspended, the phy is suspended.
+ * This causes the phy clock to be gated. The enet controller is
+ * resumed before the phy, so the clock is still gated "off" when
+ * the enet controller is resumed. This code makes sure the phy
+ * is "resumed" before reinitializing the enet controller since
+ * the enet controller depends on an active phy clock to complete
+ * a DMA reset. A DMA reset will "time out" if executed
+ * with no phy clock input on the Synopsys enet controller.
+ * Verified through Synopsys Case #8000711656.
+ *
+ * Note that the phy clock is also gated when the phy is isolated.
+ * Phy "suspend" and "isolate" controls are located in phy basic
+ * control register 0, and can be modified by the phy driver
+ * framework.
+ */
+ if (stpriv && stpriv->phydev)
+ phy_resume(stpriv->phydev);
+
+ return ret;
+}
const struct stmmac_of_data socfpga_gmac_data = {
.setup = socfpga_dwmac_probe,
+ .init = socfpga_dwmac_init,
+ .exit = socfpga_dwmac_exit,
};
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 057a120..18315f3 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -2878,6 +2878,10 @@ int stmmac_suspend(struct net_device *ndev)
clk_disable_unprepare(priv->stmmac_clk);
}
spin_unlock_irqrestore(&priv->lock, flags);
+
+ priv->oldlink = 0;
+ priv->speed = 0;
+ priv->oldduplex = -1;
return 0;
}
--
1.7.9.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH net 2/2] net: stmmac: Correct duplicate if/then/else case found by cppcheck
2014-06-23 0:34 [PATCH net 0/2] net: stmmac: Correct socfpga init/exit and cppcheck issue Vince Bridgers
2014-06-23 0:35 ` [PATCH net 1/2] net: stmmac: add platform init/exit for Altera's ARM socfpga Vince Bridgers
@ 2014-06-23 0:35 ` Vince Bridgers
1 sibling, 0 replies; 5+ messages in thread
From: Vince Bridgers @ 2014-06-23 0:35 UTC (permalink / raw)
To: netdev, peppe.cavallaro; +Cc: vbridgers2013
Cppcheck found a duplicate if/then/else case where a receive descriptor
was being processed. This patch corrects that issue.
cppcheck --force --enable=all --inline-suppr .
...
Checking enh_desc.c...
[enh_desc.c:148] -> [enh_desc.c:144]: (style) Found duplicate if expressions.
...
Signed-off-by: Vince Bridgers <vbridgers2013@gmail.com>
---
drivers/net/ethernet/stmicro/stmmac/enh_desc.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c
index 7e6628a..1e2bcf5 100644
--- a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c
+++ b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c
@@ -145,7 +145,7 @@ static void enh_desc_get_ext_status(void *data, struct stmmac_extra_stats *x,
x->rx_msg_type_delay_req++;
else if (p->des4.erx.msg_type == RDES_EXT_DELAY_RESP)
x->rx_msg_type_delay_resp++;
- else if (p->des4.erx.msg_type == RDES_EXT_DELAY_REQ)
+ else if (p->des4.erx.msg_type == RDES_EXT_PDELAY_REQ)
x->rx_msg_type_pdelay_req++;
else if (p->des4.erx.msg_type == RDES_EXT_PDELAY_RESP)
x->rx_msg_type_pdelay_resp++;
--
1.7.9.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH net 1/2] net: stmmac: add platform init/exit for Altera's ARM socfpga
2014-06-23 0:35 ` [PATCH net 1/2] net: stmmac: add platform init/exit for Altera's ARM socfpga Vince Bridgers
@ 2014-06-25 22:59 ` David Miller
2014-06-28 15:40 ` Vince Bridgers
0 siblings, 1 reply; 5+ messages in thread
From: David Miller @ 2014-06-25 22:59 UTC (permalink / raw)
To: vbridgers2013; +Cc: netdev, peppe.cavallaro
From: Vince Bridgers <vbridgers2013@gmail.com>
Date: Sun, 22 Jun 2014 19:35:00 -0500
> + return ret;
> +}
> const struct stmmac_of_data socfpga_gmac_data = {
Please always place one empty line between top-level declarations.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net 1/2] net: stmmac: add platform init/exit for Altera's ARM socfpga
2014-06-25 22:59 ` David Miller
@ 2014-06-28 15:40 ` Vince Bridgers
0 siblings, 0 replies; 5+ messages in thread
From: Vince Bridgers @ 2014-06-28 15:40 UTC (permalink / raw)
To: David Miller; +Cc: netdev@vger.kernel.org, Giuseppe CAVALLARO
On Wed, Jun 25, 2014 at 5:59 PM, David Miller <davem@davemloft.net> wrote:
> From: Vince Bridgers <vbridgers2013@gmail.com>
> Date: Sun, 22 Jun 2014 19:35:00 -0500
>
>> + return ret;
>> +}
>> const struct stmmac_of_data socfpga_gmac_data = {
>
> Please always place one empty line between top-level declarations.
Thanks, I'll address and respin the patch
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-06-28 15:40 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-23 0:34 [PATCH net 0/2] net: stmmac: Correct socfpga init/exit and cppcheck issue Vince Bridgers
2014-06-23 0:35 ` [PATCH net 1/2] net: stmmac: add platform init/exit for Altera's ARM socfpga Vince Bridgers
2014-06-25 22:59 ` David Miller
2014-06-28 15:40 ` Vince Bridgers
2014-06-23 0:35 ` [PATCH net 2/2] net: stmmac: Correct duplicate if/then/else case found by cppcheck Vince Bridgers
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).