* [PATCH 0/3] net: netcp: bug fixes for dynamic module support
@ 2015-07-28 22:20 Murali Karicheri
2015-07-28 22:20 ` [PATCH 1/3] net: netcp: fix cleanup interface list in netcp_remove() Murali Karicheri
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: Murali Karicheri @ 2015-07-28 22:20 UTC (permalink / raw)
To: linux-kernel, netdev, w-kwok2, davem
This series fixes few bugs to allow keystone netcp modules to be
dynamically loaded and removed. Currently it allows following
sequence multiple times
insmod cpsw_ale.ko
insmod davinci_mdio.ko
insmod keystone_netcp.ko
insmod keystone_netcp_ethss.ko
ifup eth0
ifup eth1
ping <hosts on eth0>
ping <hosts on eth1>
ifdown eth1
ifdown eth0
rmmod keystone_netcp_ethss.ko
rmmod keystone_netcp.ko
rmmod davinci_mdio.ko
rmmod cpsw_ale.ko
Murali Karicheri (3):
net: netcp: fix cleanup interface list in netcp_remove()
net: netcp: ethss: fix up incorrect use of list api
net: netcp: ethss: cleanup gbe_probe() and gbe_remove() functions
drivers/net/ethernet/ti/netcp_core.c | 14 +++++++---
drivers/net/ethernet/ti/netcp_ethss.c | 49 ++++++++++++++---------------------
2 files changed, 30 insertions(+), 33 deletions(-)
--
1.9.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/3] net: netcp: fix cleanup interface list in netcp_remove()
2015-07-28 22:20 [PATCH 0/3] net: netcp: bug fixes for dynamic module support Murali Karicheri
@ 2015-07-28 22:20 ` Murali Karicheri
2015-07-28 22:20 ` [PATCH 2/3] net: netcp: ethss: fix up incorrect use of list api Murali Karicheri
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Murali Karicheri @ 2015-07-28 22:20 UTC (permalink / raw)
To: linux-kernel, netdev, w-kwok2, davem
Currently if user do rmmod keystone_netcp.ko following warning is
seen :-
[ 59.035891] ------------[ cut here ]------------
[ 59.040535] WARNING: CPU: 2 PID: 1619 at drivers/net/ethernet/ti/
netcp_core.c:2127 netcp_remove)
This is because the interface list is not cleaned up in netcp_remove.
This patch fixes this. Also fix some checkpatch related warnings.
Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
---
drivers/net/ethernet/ti/netcp_core.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/ti/netcp_core.c b/drivers/net/ethernet/ti/netcp_core.c
index ec8ed30..a1c6961 100644
--- a/drivers/net/ethernet/ti/netcp_core.c
+++ b/drivers/net/ethernet/ti/netcp_core.c
@@ -2112,6 +2112,7 @@ probe_quit:
static int netcp_remove(struct platform_device *pdev)
{
struct netcp_device *netcp_device = platform_get_drvdata(pdev);
+ struct netcp_intf *netcp_intf, *netcp_tmp;
struct netcp_inst_modpriv *inst_modpriv, *tmp;
struct netcp_module *module;
@@ -2123,8 +2124,16 @@ static int netcp_remove(struct platform_device *pdev)
list_del(&inst_modpriv->inst_list);
kfree(inst_modpriv);
}
- WARN(!list_empty(&netcp_device->interface_head), "%s interface list not empty!\n",
- pdev->name);
+
+ /* now that all modules are removed, clean up the interfaces */
+ list_for_each_entry_safe(netcp_intf, netcp_tmp,
+ &netcp_device->interface_head,
+ interface_list) {
+ netcp_delete_interface(netcp_device, netcp_intf->ndev);
+ }
+
+ WARN(!list_empty(&netcp_device->interface_head),
+ "%s interface list not empty!\n", pdev->name);
devm_kfree(&pdev->dev, netcp_device);
pm_runtime_put_sync(&pdev->dev);
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/3] net: netcp: ethss: fix up incorrect use of list api
2015-07-28 22:20 [PATCH 0/3] net: netcp: bug fixes for dynamic module support Murali Karicheri
2015-07-28 22:20 ` [PATCH 1/3] net: netcp: fix cleanup interface list in netcp_remove() Murali Karicheri
@ 2015-07-28 22:20 ` Murali Karicheri
2015-07-28 22:20 ` [PATCH 3/3] net: netcp: ethss: cleanup gbe_probe() and gbe_remove() functions Murali Karicheri
2015-07-30 1:38 ` [PATCH 0/3] net: netcp: bug fixes for dynamic module support David Miller
3 siblings, 0 replies; 5+ messages in thread
From: Murali Karicheri @ 2015-07-28 22:20 UTC (permalink / raw)
To: linux-kernel, netdev, w-kwok2, davem
The code seems to assume a null is returned when the list is empty
from first_sec_slave() to break the loop which is incorrect. Fix the
code by using list_empty().
Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
---
drivers/net/ethernet/ti/netcp_ethss.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/net/ethernet/ti/netcp_ethss.c b/drivers/net/ethernet/ti/netcp_ethss.c
index 9b7e0a3..77bcfca 100644
--- a/drivers/net/ethernet/ti/netcp_ethss.c
+++ b/drivers/net/ethernet/ti/netcp_ethss.c
@@ -2490,10 +2490,9 @@ static void free_secondary_ports(struct gbe_priv *gbe_dev)
{
struct gbe_slave *slave;
- for (;;) {
+ while (!list_empty(&gbe_dev->secondary_slaves)) {
slave = first_sec_slave(gbe_dev);
- if (!slave)
- break;
+
if (slave->phy)
phy_disconnect(slave->phy);
list_del(&slave->slave_list);
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/3] net: netcp: ethss: cleanup gbe_probe() and gbe_remove() functions
2015-07-28 22:20 [PATCH 0/3] net: netcp: bug fixes for dynamic module support Murali Karicheri
2015-07-28 22:20 ` [PATCH 1/3] net: netcp: fix cleanup interface list in netcp_remove() Murali Karicheri
2015-07-28 22:20 ` [PATCH 2/3] net: netcp: ethss: fix up incorrect use of list api Murali Karicheri
@ 2015-07-28 22:20 ` Murali Karicheri
2015-07-30 1:38 ` [PATCH 0/3] net: netcp: bug fixes for dynamic module support David Miller
3 siblings, 0 replies; 5+ messages in thread
From: Murali Karicheri @ 2015-07-28 22:20 UTC (permalink / raw)
To: linux-kernel, netdev, w-kwok2, davem
This patch clean up error handle code to use goto label properly. In some
cases, the code unnecessarily use goto instead of just returning the error
code. Code also make explicit calls to devm_* APIs on error which is
not necessary. In the gbe_remove() also it makes similar calls which is
also unnecessary.
Also fix few checkpatch warnings
Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
---
drivers/net/ethernet/ti/netcp_core.c | 1 -
drivers/net/ethernet/ti/netcp_ethss.c | 44 ++++++++++++++---------------------
2 files changed, 17 insertions(+), 28 deletions(-)
diff --git a/drivers/net/ethernet/ti/netcp_core.c b/drivers/net/ethernet/ti/netcp_core.c
index a1c6961..9749dfd 100644
--- a/drivers/net/ethernet/ti/netcp_core.c
+++ b/drivers/net/ethernet/ti/netcp_core.c
@@ -2135,7 +2135,6 @@ static int netcp_remove(struct platform_device *pdev)
WARN(!list_empty(&netcp_device->interface_head),
"%s interface list not empty!\n", pdev->name);
- devm_kfree(&pdev->dev, netcp_device);
pm_runtime_put_sync(&pdev->dev);
pm_runtime_disable(&pdev->dev);
platform_set_drvdata(pdev, NULL);
diff --git a/drivers/net/ethernet/ti/netcp_ethss.c b/drivers/net/ethernet/ti/netcp_ethss.c
index 77bcfca..f846c0f 100644
--- a/drivers/net/ethernet/ti/netcp_ethss.c
+++ b/drivers/net/ethernet/ti/netcp_ethss.c
@@ -2838,14 +2838,13 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
&gbe_dev->dma_chan_name);
if (ret < 0) {
dev_err(dev, "missing \"tx-channel\" parameter\n");
- ret = -ENODEV;
- goto quit;
+ return -EINVAL;
}
if (!strcmp(node->name, "gbe")) {
ret = get_gbe_resource_version(gbe_dev, node);
if (ret)
- goto quit;
+ return ret;
dev_dbg(dev, "ss_version: 0x%08x\n", gbe_dev->ss_version);
@@ -2856,22 +2855,20 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
else
ret = -ENODEV;
- if (ret)
- goto quit;
} else if (!strcmp(node->name, "xgbe")) {
ret = set_xgbe_ethss10_priv(gbe_dev, node);
if (ret)
- goto quit;
+ return ret;
ret = netcp_xgbe_serdes_init(gbe_dev->xgbe_serdes_regs,
gbe_dev->ss_regs);
- if (ret)
- goto quit;
} else {
dev_err(dev, "unknown GBE node(%s)\n", node->name);
ret = -ENODEV;
- goto quit;
}
+ if (ret)
+ return ret;
+
interfaces = of_get_child_by_name(node, "interfaces");
if (!interfaces)
dev_err(dev, "could not find interfaces\n");
@@ -2879,11 +2876,11 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
ret = netcp_txpipe_init(&gbe_dev->tx_pipe, netcp_device,
gbe_dev->dma_chan_name, gbe_dev->tx_queue_id);
if (ret)
- goto quit;
+ return ret;
ret = netcp_txpipe_open(&gbe_dev->tx_pipe);
if (ret)
- goto quit;
+ return ret;
/* Create network interfaces */
INIT_LIST_HEAD(&gbe_dev->gbe_intf_head);
@@ -2898,6 +2895,7 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
if (gbe_dev->num_slaves >= gbe_dev->max_num_slaves)
break;
}
+ of_node_put(interfaces);
if (!gbe_dev->num_slaves)
dev_warn(dev, "No network interface configured\n");
@@ -2910,9 +2908,10 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
of_node_put(secondary_ports);
if (!gbe_dev->num_slaves) {
- dev_err(dev, "No network interface or secondary ports configured\n");
+ dev_err(dev,
+ "No network interface or secondary ports configured\n");
ret = -ENODEV;
- goto quit;
+ goto free_sec_ports;
}
memset(&ale_params, 0, sizeof(ale_params));
@@ -2926,7 +2925,7 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
if (!gbe_dev->ale) {
dev_err(gbe_dev->dev, "error initializing ale engine\n");
ret = -ENODEV;
- goto quit;
+ goto free_sec_ports;
} else {
dev_dbg(gbe_dev->dev, "Created a gbe ale engine\n");
}
@@ -2942,14 +2941,8 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
*inst_priv = gbe_dev;
return 0;
-quit:
- if (gbe_dev->hw_stats)
- devm_kfree(dev, gbe_dev->hw_stats);
- cpsw_ale_destroy(gbe_dev->ale);
- if (gbe_dev->ss_regs)
- devm_iounmap(dev, gbe_dev->ss_regs);
- of_node_put(interfaces);
- devm_kfree(dev, gbe_dev);
+free_sec_ports:
+ free_secondary_ports(gbe_dev);
return ret;
}
@@ -3022,12 +3015,9 @@ static int gbe_remove(struct netcp_device *netcp_device, void *inst_priv)
free_secondary_ports(gbe_dev);
if (!list_empty(&gbe_dev->gbe_intf_head))
- dev_alert(gbe_dev->dev, "unreleased ethss interfaces present\n");
+ dev_alert(gbe_dev->dev,
+ "unreleased ethss interfaces present\n");
- devm_kfree(gbe_dev->dev, gbe_dev->hw_stats);
- devm_iounmap(gbe_dev->dev, gbe_dev->ss_regs);
- memset(gbe_dev, 0x00, sizeof(*gbe_dev));
- devm_kfree(gbe_dev->dev, gbe_dev);
return 0;
}
--
1.9.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 0/3] net: netcp: bug fixes for dynamic module support
2015-07-28 22:20 [PATCH 0/3] net: netcp: bug fixes for dynamic module support Murali Karicheri
` (2 preceding siblings ...)
2015-07-28 22:20 ` [PATCH 3/3] net: netcp: ethss: cleanup gbe_probe() and gbe_remove() functions Murali Karicheri
@ 2015-07-30 1:38 ` David Miller
3 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2015-07-30 1:38 UTC (permalink / raw)
To: m-karicheri2; +Cc: linux-kernel, netdev, w-kwok2
From: Murali Karicheri <m-karicheri2@ti.com>
Date: Tue, 28 Jul 2015 18:20:11 -0400
> This series fixes few bugs to allow keystone netcp modules to be
> dynamically loaded and removed. Currently it allows following
> sequence multiple times
...
Series applied, thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2015-07-30 1:38 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-28 22:20 [PATCH 0/3] net: netcp: bug fixes for dynamic module support Murali Karicheri
2015-07-28 22:20 ` [PATCH 1/3] net: netcp: fix cleanup interface list in netcp_remove() Murali Karicheri
2015-07-28 22:20 ` [PATCH 2/3] net: netcp: ethss: fix up incorrect use of list api Murali Karicheri
2015-07-28 22:20 ` [PATCH 3/3] net: netcp: ethss: cleanup gbe_probe() and gbe_remove() functions Murali Karicheri
2015-07-30 1:38 ` [PATCH 0/3] net: netcp: bug fixes for dynamic module support David Miller
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.