From 6234190be3437eb8e6ce225f934e2ad97ce46c6a Mon Sep 17 00:00:00 2001
From: Michael Gernoth <michael@gernoth.net>
Date: Fri, 11 Apr 2008 15:22:59 +0200
Subject: [PATCH] add xpcu_close

---
 usb-driver.c |  8 ++------
 xpcu.c       | 13 ++++++++++++-
 xpcu.h       |  2 +-
 3 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/usb-driver.c b/usb-driver.c
index 53a0309..566b10b 100644
--- a/usb-driver.c
+++ b/usb-driver.c
@@ -633,13 +633,9 @@ int close(int fd) {
 	if (fd == windrvrfd && windrvrfd >= 0) {
 		DPRINTF("close windrvrfd\n");
 
-		if (xpcu->handle) {
-			xpcu_claim(xpcu, XPCU_RELEASE);
-			usb_close(xpcu->handle);
-		}
+		if (xpcu)
+			xpcu_close(xpcu);
 
-		xpcu->handle = NULL;
-		xpcu->interface = -1;
 		xpcu = NULL;
 		windrvrfd = -1;
 	}
diff --git a/xpcu.c b/xpcu.c
index 28770fe..17ab7cb 100644
--- a/xpcu.c
+++ b/xpcu.c
@@ -166,7 +166,7 @@ int xpcu_deviceinfo(struct xpcu_s *xpcu, unsigned char *buf) {
 	return len;
 }
 
-int xpcu_claim(struct xpcu_s *xpcu, int claim) {
+static int xpcu_claim(struct xpcu_s *xpcu, int claim) {
 	int ret = 0;
 	static int claimed = 0;
 
@@ -247,3 +247,14 @@ struct xpcu_s *xpcu_open(void) {
 
 	return &xpcu;
 }
+
+void xpcu_close(struct xpcu_s *xpcu) {
+	if (xpcu->handle) {
+		xpcu_claim(xpcu, XPCU_RELEASE);
+		usb_close(xpcu->handle);
+	}
+
+	xpcu->handle = NULL;
+	xpcu->interface = -1;
+	xpcu->alternate = -1;
+}
diff --git a/xpcu.h b/xpcu.h
index 9583ed2..fb8fd55 100644
--- a/xpcu.h
+++ b/xpcu.h
@@ -10,6 +10,6 @@ struct xpcu_s {
 };
 
 int __attribute__ ((visibility ("hidden"))) xpcu_deviceinfo(struct xpcu_s *xpcu, unsigned char *buf);
-int __attribute__ ((visibility ("hidden"))) xpcu_claim(struct xpcu_s *xpcu, int claim);
 int __attribute__ ((visibility ("hidden"))) xpcu_transfer(struct xpcu_s *xpcu, struct usb_transfer *ut);
 struct xpcu_s __attribute__ ((visibility ("hidden"))) *xpcu_open(void);
+void __attribute__ ((visibility ("hidden"))) xpcu_close(struct xpcu_s *xpcu);
-- 
2.39.5