[svn-commits] tzafrir: trunk r1416 - in /trunk/xpp: utils/genzaptelconf xbus-core.c xpd.h

svn-commits at lists.digium.com svn-commits at lists.digium.com
Wed Sep 6 13:12:57 MST 2006


Author: tzafrir
Date: Wed Sep  6 15:12:57 2006
New Revision: 1416

URL: http://svn.digium.com/view/zaptel?rev=1416&view=rev
Log:
Fixes for 2.6.8 compilation:
* Replace the completion variable with two atomic counters and a wait queue
  the xbus_poll() code is revamped to use this.
* genzaptelconf: Adapt to different module parameter location in sysfs .

Modified:
    trunk/xpp/utils/genzaptelconf
    trunk/xpp/xbus-core.c
    trunk/xpp/xpd.h

Modified: trunk/xpp/utils/genzaptelconf
URL: http://svn.digium.com/view/zaptel/trunk/xpp/utils/genzaptelconf?rev=1416&r1=1415&r2=1416&view=diff
==============================================================================
--- trunk/xpp/utils/genzaptelconf (original)
+++ trunk/xpp/utils/genzaptelconf Wed Sep  6 15:12:57 2006
@@ -456,8 +456,16 @@
 
 # sleep a while until the xpp modules fully register
 wait_for_xpp() {
+	case "`uname -r`" in
+	2.6.8*)
+		autoreg="/sys/module/xpp/zap_autoreg"
+		;;
+	*)
+		autoreg="/sys/module/xpp/parameters/zap_autoreg"
+		;;
+	esac
 	if [ -d /proc/xpp ] && \
-	   [ "`cat /sys/module/xpp/parameters/zap_autoreg`" = 'Y' ]
+	   [ "`cat $autoreg`" = 'Y' ]
 	then
 		# wait for the XPDs to register:
 		# TODO: improve error reporting and produce a messagee here

Modified: trunk/xpp/xbus-core.c
URL: http://svn.digium.com/view/zaptel/trunk/xpp/xbus-core.c?rev=1416&r1=1415&r2=1416&view=diff
==============================================================================
--- trunk/xpp/xbus-core.c (original)
+++ trunk/xpp/xbus-core.c Wed Sep  6 15:12:57 2006
@@ -43,6 +43,7 @@
 
 /* Defines */
 #define	POLL_TIMEOUT		(MAX_XPDS)	/* in jiffies */
+#define	INITIALIZATION_TIMEOUT	(40*HZ)		/* in jiffies */
 #define	PROC_XBUSES		"xbuses"
 #define	PROC_XBUS_SUMMARY	"summary"
 #define	PROC_XBUS_WAITFOR_XPDS	"waitfor_xpds"
@@ -325,13 +326,13 @@
 		ERR("%s is being removed...\n", xbus->busname);
 		return -EBUSY;
 	}
+	mdelay(2);	/* roundtrip for older polls */
 	spin_lock_irqsave(&xbus->lock, flags);
 	DBG("%s\n", xbus->busname);
 
 	/*
 	 * Send out the polls
 	 */
-	atomic_set(&xbus->count_poll_answers, 0);
 	for(id = 0; id < MAX_XPDS; id++) {
 		if(!xbus->hardware_exists)
 			break;
@@ -349,13 +350,16 @@
 	/*
 	 * Wait for replies
 	 */
-	DBG("%s: Polled %d XPD's. Waiting for replies\n", xbus->busname, MAX_XPDS);
-	ret = wait_event_timeout(xbus->wait_for_polls, atomic_read(&xbus->count_poll_answers) >= MAX_XPDS, POLL_TIMEOUT);
-	if(ret < 0) {
-		ERR("%s: Poll timeout %d\n", xbus->busname, ret);
+	DBG("%s: Polled %d XPD's. Waiting for replies max %d jiffies\n", xbus->busname, MAX_XPDS, POLL_TIMEOUT);
+	ret = wait_event_interruptible_timeout(xbus->wait_for_polls, atomic_read(&xbus->count_poll_answers) >= MAX_XPDS, POLL_TIMEOUT);
+	if(ret == 0) {
+		ERR("%s: Poll timeout\n", xbus->busname);
 		goto out;
-	}
-	DBG("%s: Poll finished. Start processing.\n", xbus->busname);
+	} else if(ret < 0) {
+		ERR("%s: Poll interrupted %d\n", xbus->busname, ret);
+		goto out;
+	}
+	DBG("%s: Poll finished in %d jiffies. Start processing.\n", xbus->busname, POLL_TIMEOUT-ret);
 	/*
 	 * Build removals/additions lists
 	 */
@@ -384,6 +388,7 @@
 			kfree(card_desc);
 		}
 	}
+	atomic_set(&xbus->count_xpds_to_initialize, count_added);
 	spin_unlock_irqrestore(&xbus->lock, flags);
 	INFO("%s: Poll results: removals=%d additions=%d\n", xbus->busname, count_removed, count_added);
 	/*
@@ -407,9 +412,11 @@
 		struct card_desc_struct	*card_desc = list_entry(card, struct card_desc_struct, card_list);
 
 		list_del(card);
+		/* FIXME: card_detected() should have a return value for count_xpds_initialized */
 		card_detected(card_desc);
-	}
-	complete_all(&xbus->xpds_initialized);
+		atomic_inc(&xbus->count_xpds_initialized);
+	}
+	wake_up(&xbus->wait_for_xpd_initialization);
 out:
 	up_read(&xbus->in_use);
 	return ret;
@@ -557,12 +564,17 @@
 	INFO("New xbus: %s\n", xbus->busname);
 	init_waitqueue_head(&xbus->packet_cache_empty);
 	atomic_set(&xbus->packet_counter, 0);
+
+	/* poll related variables */
 	atomic_set(&xbus->count_poll_answers, 0);
+	atomic_set(&xbus->count_xpds_to_initialize, 0);
+	atomic_set(&xbus->count_xpds_initialized, 0);
+	INIT_LIST_HEAD(&xbus->poll_results);
 	init_waitqueue_head(&xbus->wait_for_polls);
+	init_waitqueue_head(&xbus->wait_for_xpd_initialization);
+	xbus->num_xpds = 0;
+
 	init_rwsem(&xbus->in_use);
-	INIT_LIST_HEAD(&xbus->poll_results);
-	init_completion(&xbus->xpds_initialized);
-	xbus->num_xpds = 0;
 	xbus_reset_counters(xbus);
 
 	/* Device-Model */
@@ -703,8 +715,11 @@
 			(xbus->hardware_exists) ? "connected" : "missing",
 			xbus->bus_type
 		      );
-	len += sprintf(page + len, "POLLS: %d/%d\n", atomic_read(&xbus->count_poll_answers), MAX_XPDS);
-	len += sprintf(page + len, "XPDS_READY: %s\n", (xbus->xpds_initialized.done) ? "YES" : "NO");
+	len += sprintf(page + len, "POLLS: %d/%d\n",
+			atomic_read(&xbus->count_poll_answers), MAX_XPDS);
+	len += sprintf(page + len, "XPDS_READY: %d/%d\n",
+			atomic_read(&xbus->count_xpds_initialized),
+			atomic_read(&xbus->count_xpds_to_initialize));
 	len += sprintf(page + len, "\nmax_packet_size=%d open_counter=%d packet_count=%d\n",
 			xbus->max_packet_size,
 			xbus->open_counter,
@@ -732,20 +747,29 @@
 
 static int xbus_read_waitfor_xpds(char *page, char **start, off_t off, int count, int *eof, void *data)
 {
-	int len = 0;
-	unsigned long flags;
-	xbus_t	*xbus = data;
-	int i;
+	int		len = 0;
+	unsigned long	flags;
+	xbus_t		*xbus = data;
+	int		ret;
 
 	if(!xbus)
 		goto out;
-	i = wait_for_completion_interruptible_timeout(&xbus->xpds_initialized, 40*HZ);
-	if(i < 0) {
-		NOTICE("PID=%d waiting for XPDS initialization failed: %d\n", current->pid, i);
-		return i;
-	}
+	DBG("%s: Waiting for card initialization of %d XPD's max %d seconds\n", xbus->busname, MAX_XPDS, INITIALIZATION_TIMEOUT/HZ);
+	ret = wait_event_interruptible_timeout(xbus->wait_for_xpd_initialization,
+			atomic_read(&xbus->count_xpds_initialized) >= atomic_read(&xbus->count_xpds_to_initialize),
+			INITIALIZATION_TIMEOUT);
+	if(ret == 0) {
+		ERR("%s: Card Initialization Timeout\n", xbus->busname);
+		return ret;
+	} else if(ret < 0) {
+		ERR("%s: Card Initialization Interrupted %d\n", xbus->busname, ret);
+		return ret;
+	}
+	DBG("%s: Finished initialization of %d XPD's in %d seconds.\n", xbus->busname, MAX_XPDS, (INITIALIZATION_TIMEOUT - ret)/HZ);
 	spin_lock_irqsave(&xbus->lock, flags);
-	len += sprintf(page + len, "XPDS_READY: %s\n", (xbus->xpds_initialized.done) ? "YES" : "NO");
+	len += sprintf(page + len, "XPDS_READY: %d/%d\n",
+			atomic_read(&xbus->count_xpds_initialized),
+			atomic_read(&xbus->count_xpds_to_initialize));
 	spin_unlock_irqrestore(&xbus->lock, flags);
 out:
 	if (len <= off+count)

Modified: trunk/xpp/xpd.h
URL: http://svn.digium.com/view/zaptel/trunk/xpp/xpd.h?rev=1416&r1=1415&r2=1416&view=diff
==============================================================================
--- trunk/xpp/xpd.h (original)
+++ trunk/xpp/xpd.h Wed Sep  6 15:12:57 2006
@@ -132,7 +132,6 @@
 	xpd_addr_t		xpd_addr;
 };
 
-
 /*
  * An xbus is a transport layer for Xorcom Protocol commands
  */
@@ -164,8 +163,12 @@
 	atomic_t		count_poll_answers;
 	struct list_head	poll_results;
 	wait_queue_head_t	wait_for_polls;
+
 	struct work_struct	xpds_init_work;
-	struct completion	xpds_initialized;
+
+	atomic_t		count_xpds_to_initialize;
+	atomic_t		count_xpds_initialized;
+	wait_queue_head_t	wait_for_xpd_initialization;
 
 	struct	rw_semaphore	in_use;
 	int			num_xpds;



More information about the svn-commits mailing list