#include <linux/types.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
+#include <linux/completion.h>
#include <linux/reboot.h>
#include <linux/mm.h>
#include <linux/slab.h>
unsigned int length;
unsigned int use_loader;
void *buffer;
+ struct completion *complete;
};
struct expcard_blacklist {
}
}
-#include <linux/completion.h>
-
static DECLARE_WAIT_QUEUE_HEAD(ecard_wait);
static struct ecard_request *ecard_req;
static DECLARE_MUTEX(ecard_sem);
-static DECLARE_COMPLETION(ecard_completion);
/*
* Set up the expansion card daemon's page tables.
wait_event_interruptible(ecard_wait, ecard_req != NULL);
req = xchg(&ecard_req, NULL);
- if (req != NULL)
+ if (req != NULL) {
ecard_do_request(req);
- complete(&ecard_completion);
+ complete(req->complete);
+ }
}
}
* FIXME: The test here is not sufficient to detect if the
* kcardd is running.
*/
-static void
-ecard_call(struct ecard_request *req)
+static void ecard_call(struct ecard_request *req)
{
+ DECLARE_COMPLETION(completion);
+
/*
* Make sure we have a context that is able to sleep.
*/
if (current == &init_task || in_interrupt())
BUG();
+ req->complete = &completion;
+
down(&ecard_sem);
ecard_req = req;
wake_up(&ecard_wait);
/*
* Now wait for kecardd to run.
*/
- wait_for_completion(&ecard_completion);
+ wait_for_completion(&completion);
up(&ecard_sem);
}