summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile6
-rw-r--r--xpp/xbus-core.c21
2 files changed, 18 insertions, 9 deletions
diff --git a/Makefile b/Makefile
index 70f1a2f..024972f 100644
--- a/Makefile
+++ b/Makefile
@@ -165,16 +165,16 @@ ifeq ($(HOTPLUG_FIRMWARE),yes)
CFLAGS+=-DHOTPLUG_FIRMWARE
endif
-# Also build xpp in the subdirectory xpp/ . But only for >=2.6.10 and only
+# Also build xpp in the subdirectory xpp/ . But only for >=2.6.9 and only
# for i386 or x86_64. On other archs the module will probably build but panic.
# These lines are only meaningful when this Makefile is used as kconfig for
# 2.6 build
-ifneq (,$(shell [ 0$(SUBLEVEL) -ge 10 ] && [ "$(ARCH)" = 'i386' ] && [ "x$(BUILD_XPP)" = "xyes" ] && echo 1))
+ifneq (,$(shell [ 0$(SUBLEVEL) -ge 9 ] && [ "$(ARCH)" = 'i386' ] && [ "x$(BUILD_XPP)" = "xyes" ] && echo 1))
obj-m+=xpp/
endif
-ifneq (,$(shell [ 0$(SUBLEVEL) -ge 10 ] && [ "$(ARCH)" = 'x86_64' ] && [ "x$(BUILD_XPP)" = "xyes" ] && echo 1))
+ifneq (,$(shell [ 0$(SUBLEVEL) -ge 9 ] && [ "$(ARCH)" = 'x86_64' ] && [ "x$(BUILD_XPP)" = "xyes" ] && echo 1))
obj-m+=xpp/
endif
diff --git a/xpp/xbus-core.c b/xpp/xbus-core.c
index 59db079..9f3b24b 100644
--- a/xpp/xbus-core.c
+++ b/xpp/xbus-core.c
@@ -69,7 +69,6 @@ DEF_PARM(uint, poll_timeout, POLL_TIMEOUT,"Timeout (in jiffies) waiting for unit
static DEVICE_ATTR_FUNC(connector_show, dev, buf);
static DEVICE_ATTR_FUNC(status_show, dev, buf);
-static int xbus_poll(void *data);
static void xbus_release(struct device *dev);
static int xbus_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data);
static int xbus_read_waitfor_xpds(char *page, char **start, off_t off, int count, int *eof, void *data);
@@ -209,8 +208,16 @@ out:
* it returns only when all XPD's on the bus are detected and
* initialized.
*/
-static int xbus_poll(void *data)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
+static void xbus_poll(struct work_struct *work)
{
+ xbus_t *xbus = container_of(work, xbus_t, xpds_init_work);
+#else
+static void xbus_poll(void *data)
+{
+ xbus_t *xbus = data;
+#endif
+
int id;
int ret = 0;
unsigned long flags;
@@ -221,11 +228,10 @@ static int xbus_poll(void *data)
int count_removed;
int count_added;
int xpd_num;
- xbus_t *xbus = data;
if(!down_read_trylock(&xbus->in_use)) {
ERR("%s is being removed...\n", xbus->busname);
- return -EBUSY;
+ return;
}
msleep(2); /* roundtrip for older polls */
spin_lock_irqsave(&xbus->lock, flags);
@@ -326,7 +332,6 @@ static int xbus_poll(void *data)
wake_up(&xbus->wait_for_xpd_initialization);
out:
up_read(&xbus->in_use);
- return ret;
}
@@ -343,7 +348,11 @@ void xbus_activate(xbus_t *xbus)
xbus->hardware_exists = 1;
DBG("Activating: %s\n", xbus->busname);
/* Poll it */
- INIT_WORK(&xbus->xpds_init_work, (void (*)(void *))xbus_poll, (void *)xbus);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
+ INIT_WORK(&xbus->xpds_init_work, xbus_poll);
+#else
+ INIT_WORK(&xbus->xpds_init_work, xbus_poll, xbus);
+#endif
if(!queue_work(xpp_worker, &xbus->xpds_init_work)) {
ERR("Failed to queue xpd initialization work\n");
/* FIXME: need to return error */