From f8e84c4e39ec732280ea65d7a4862e08807c6a5c Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Tue, 28 Apr 2009 19:16:17 +0000
Subject: swconfig: add a generic switch reset call

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@15470 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 target/linux/generic-2.6/files/drivers/net/phy/ip175c.c | 13 +++----------
 .../linux/generic-2.6/files/drivers/net/phy/swconfig.c  | 17 +++++++++++++++++
 target/linux/generic-2.6/files/include/linux/switch.h   |  1 +
 3 files changed, 21 insertions(+), 10 deletions(-)

(limited to 'target')

diff --git a/target/linux/generic-2.6/files/drivers/net/phy/ip175c.c b/target/linux/generic-2.6/files/drivers/net/phy/ip175c.c
index 673ff12763..c56186192c 100644
--- a/target/linux/generic-2.6/files/drivers/net/phy/ip175c.c
+++ b/target/linux/generic-2.6/files/drivers/net/phy/ip175c.c
@@ -801,7 +801,7 @@ static int ip175c_apply(struct switch_dev *dev)
 	return 0;
 }
 
-static int ip175c_reset(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val)
+static int ip175c_reset(struct switch_dev *dev)
 {
 	struct ip175c_state *state = dev->priv;
 	int i, err;
@@ -1125,14 +1125,6 @@ enum Globals {
 };
 
 static const struct switch_attr ip175c_global[] = {
-	[IP175C_RESET] = {
-		.id = IP175C_RESET,
-		.type = SWITCH_TYPE_NOVAL,
-		.name  = "reset",
-		.get = NULL,
-		.description = "Resets the switch but does not clear vlan configuration",
-		.set = ip175c_reset,
-	},
 	[IP175C_ENABLE_VLAN] = {
 		.id = IP175C_ENABLE_VLAN,
 		.type = SWITCH_TYPE_INT,
@@ -1233,6 +1225,7 @@ static int ip175c_probe(struct phy_device *pdev)
 	dev->get_vlan_ports = ip175c_get_ports;
 	dev->set_vlan_ports = ip175c_set_ports;
 	dev->apply_config = ip175c_apply;
+	dev->reset_switch = ip175c_reset;
 
 	dev->priv = state;
 	pdev->priv = state;
@@ -1265,7 +1258,7 @@ static int ip175c_config_init(struct phy_device *pdev)
 	if (err < 0)
 		return err;
 
-	ip175c_reset(&state->dev, NULL, NULL);
+	ip175c_reset(&state->dev);
 
 	state->registered = true;
 	netif_carrier_on(pdev->attached_dev);
diff --git a/target/linux/generic-2.6/files/drivers/net/phy/swconfig.c b/target/linux/generic-2.6/files/drivers/net/phy/swconfig.c
index 8bae667081..7207e46592 100644
--- a/target/linux/generic-2.6/files/drivers/net/phy/swconfig.c
+++ b/target/linux/generic-2.6/files/drivers/net/phy/swconfig.c
@@ -133,9 +133,19 @@ swconfig_apply_config(struct switch_dev *dev, const struct switch_attr *attr, st
 	return dev->apply_config(dev);
 }
 
+static int
+swconfig_reset_switch(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val)
+{
+	/* don't complain if not supported by the switch driver */
+	if (!dev->reset_switch)
+		return 0;
+
+	return dev->reset_switch(dev);
+}
 
 enum global_defaults {
 	GLOBAL_APPLY,
+	GLOBAL_RESET,
 };
 
 enum vlan_defaults {
@@ -152,6 +162,12 @@ static struct switch_attr default_global[] = {
 		.name = "apply",
 		.description = "Activate changes in the hardware",
 		.set = swconfig_apply_config,
+	},
+	[GLOBAL_RESET] = {
+		.type = SWITCH_TYPE_NOVAL,
+		.name = "reset",
+		.description = "Reset the switch",
+		.set = swconfig_reset_switch,
 	}
 };
 
@@ -190,6 +206,7 @@ static void swconfig_defaults_init(struct switch_dev *dev)
 
 	/* always present, can be no-op */
 	set_bit(GLOBAL_APPLY, &dev->def_global);
+	set_bit(GLOBAL_RESET, &dev->def_global);
 }
 
 
diff --git a/target/linux/generic-2.6/files/include/linux/switch.h b/target/linux/generic-2.6/files/include/linux/switch.h
index 75c7dcfa91..98b86e8514 100644
--- a/target/linux/generic-2.6/files/include/linux/switch.h
+++ b/target/linux/generic-2.6/files/include/linux/switch.h
@@ -132,6 +132,7 @@ struct switch_dev {
 	int (*get_port_pvid)(struct switch_dev *dev, int port, int *val);
 	int (*set_port_pvid)(struct switch_dev *dev, int port, int val);
 	int (*apply_config)(struct switch_dev *dev);
+	int (*reset_switch)(struct switch_dev *dev);
 };
 
 struct switch_port {
-- 
cgit v1.2.3