patch-2.3.16 linux/arch/arm/kernel/ecard.c
Next file: linux/arch/arm/kernel/entry-armo.S
Previous file: linux/arch/arm/kernel/dma.c
Back to the patch index
Back to the overall index
- Lines: 128
- Date:
Mon Aug 30 18:15:11 1999
- Orig file:
v2.3.15/linux/arch/arm/kernel/ecard.c
- Orig date:
Thu Jun 17 01:11:35 1999
diff -u --recursive --new-file v2.3.15/linux/arch/arm/kernel/ecard.c linux/arch/arm/kernel/ecard.c
@@ -44,6 +44,7 @@
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/pgtable.h>
+#include <asm/mmu_context.h>
#ifdef CONFIG_ARCH_ARC
#include <asm/arch/oldlatches.h>
@@ -231,8 +232,42 @@
static wait_queue_head_t ecard_done;
static struct ecard_request *ecard_req;
+/* to be removed when exec_mmap becomes extern */
+static int exec_mmap(void)
+{
+ struct mm_struct * mm, * old_mm;
+
+ old_mm = current->mm;
+ if (old_mm && atomic_read(&old_mm->mm_users) == 1) {
+ flush_cache_mm(old_mm);
+ mm_release();
+ exit_mmap(old_mm);
+ flush_tlb_mm(old_mm);
+ return 0;
+ }
+
+ mm = mm_alloc();
+ if (mm) {
+ struct mm_struct *active_mm = current->active_mm;
+
+ current->mm = mm;
+ current->active_mm = mm;
+ activate_mm(active_mm, mm);
+ mm_release();
+ if (old_mm) {
+ if (active_mm != old_mm) BUG();
+ mmput(old_mm);
+ return 0;
+ }
+ mmdrop(active_mm);
+ return 0;
+ }
+ return -ENOMEM;
+}
+
/*
- * Set up the expansion card daemon's environment.
+ * Set up the expansion card
+ * daemon's environment.
*/
static void
ecard_init_task(void)
@@ -251,6 +286,8 @@
pgd_t *src_pgd, *dst_pgd;
unsigned int dst_addr = IO_START;
+ exec_mmap();
+
src_pgd = pgd_offset(current->mm, IO_BASE);
dst_pgd = pgd_offset(current->mm, dst_addr);
@@ -333,7 +370,7 @@
* call the loader. We can't schedule, or
* sleep for this call.
*/
- if ((current == task[0] || in_interrupt()) &&
+ if ((current == &init_task || in_interrupt()) &&
req->req == req_reset && req->ec == NULL) {
ecard_init_task();
ecard_task_reset(req);
@@ -721,8 +758,8 @@
printk(KERN_WARNING "Wild interrupt from backplane (masks)\n");
}
-__initfunc(static void
-ecard_probeirqhw(void))
+static void __init
+ecard_probeirqhw(void)
{
ecard_t *ec;
int found;
@@ -798,8 +835,6 @@
return address;
}
-static const char *unknown = "*unknown*";
-
static int ecard_prints(char *buffer, ecard_t *ec)
{
char *start = buffer;
@@ -818,7 +853,7 @@
ec->card_desc = kmalloc(strlen(incd.d.string)+1, GFP_KERNEL);
if (ec->card_desc)
- strcpy(ec->card_desc, incd.d.string);
+ strcpy((char *)ec->card_desc, incd.d.string);
}
buffer += sprintf(buffer, "%s\n", ec->card_desc ? ec->card_desc : "*unknown*");
@@ -872,8 +907,8 @@
* If bit 1 of the first byte of the card is set, then the
* card does not exist.
*/
-__initfunc(static int
-ecard_probe(int slot, card_type_t type))
+static int __init
+ecard_probe(int slot, card_type_t type)
{
ecard_t **ecp;
ecard_t *ec;
@@ -1009,7 +1044,7 @@
return finding_pos;
}
-__initfunc(static void ecard_free_all(void))
+static void __init ecard_free_all(void)
{
ecard_t *ec, *ecn;
@@ -1029,7 +1064,7 @@
* Locate all hardware - interrupt management and
* actual cards.
*/
-__initfunc(void ecard_init(void))
+void __init ecard_init(void)
{
int slot;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)