From d83ab218fe6799c8f6f9c4b0ff0e05044ed26185 Mon Sep 17 00:00:00 2001
From: Florian Fainelli <florian@openwrt.org>
Date: Sun, 20 Feb 2011 17:24:15 +0000
Subject: [package] switch: fix switch-robo device reference counting

Fix incorrect device reference counting by switch-robo.

Signed-off-by: George Kashperko <george@znau.edu.ua>

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@25619 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 package/switch/Makefile          |  4 ++--
 package/switch/src/switch-robo.c | 19 ++++++++++++++-----
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/package/switch/Makefile b/package/switch/Makefile
index a2baf99d1b..17158dac8b 100644
--- a/package/switch/Makefile
+++ b/package/switch/Makefile
@@ -1,5 +1,5 @@
 # 
-# Copyright (C) 2006 OpenWrt.org
+# Copyright (C) 2006-2011 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=kmod-switch
-PKG_RELEASE:=3
+PKG_RELEASE:=4
 
 include $(INCLUDE_DIR)/package.mk
 
diff --git a/package/switch/src/switch-robo.c b/package/switch/src/switch-robo.c
index 2fca360578..817fba3f48 100644
--- a/package/switch/src/switch-robo.c
+++ b/package/switch/src/switch-robo.c
@@ -301,7 +301,7 @@ static int robo_probe(char *devname)
 {
 	__u32 phyid;
 	unsigned int i;
-	int err;
+	int err = 1;
 
 	printk(KERN_INFO PFX "Probing device %s: ", devname);
 	strcpy(robo.ifr.ifr_name, devname);
@@ -331,7 +331,7 @@ static int robo_probe(char *devname)
 		    (mii->phy_id != ROBO_PHY_ADDR_BCM63XX) &&
 		    (mii->phy_id != ROBO_PHY_ADDR_TG3)) {
 			printk("Invalid phy address (%d)\n", mii->phy_id);
-			return 1;
+			goto done;
 		}
 		robo.use_et = 0;
 		/* The robo has a fixed PHY address that is different from the
@@ -344,7 +344,7 @@ static int robo_probe(char *devname)
 
 	if (phyid == 0xffffffff || phyid == 0x55210022) {
 		printk("No Robo switch in managed mode found, phy_id = 0x%08x\n", phyid);
-		return 1;
+		goto done;
 	}
 
 	/* Get the device ID */
@@ -361,11 +361,18 @@ static int robo_probe(char *devname)
 	robo_switch_reset();
 	err = robo_switch_enable();
 	if (err)
-		return err;
+		goto done;
+	err = 0;
 
 	printk("found a 5%s%x!%s\n", robo.devid & 0xff00 ? "" : "3", robo.devid,
 		robo.is_5350 ? " It's a 5350." : "");
-	return 0;
+
+done:
+	if (err) {
+		dev_put(robo.dev);
+		robo.dev = NULL;
+	}
+	return err;
 }
 
 
@@ -610,6 +617,8 @@ static int __init robo_init(void)
 static void __exit robo_exit(void)
 {
 	switch_unregister_driver(DRIVER_NAME);
+	if (robo.dev)
+		dev_put(robo.dev);
 	kfree(robo.device);
 }
 
-- 
cgit v1.2.3