summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/Makefile2
-rw-r--r--drivers/block/Makefile2
-rw-r--r--drivers/char/Makefile2
-rw-r--r--drivers/char/console.c164
-rw-r--r--drivers/char/keyboard.c18
-rw-r--r--drivers/char/mem.c14
-rw-r--r--drivers/char/tty_io.c2
-rw-r--r--drivers/net/3c501.c2
-rw-r--r--drivers/net/3c505.c2
-rw-r--r--drivers/net/3c507.c2
-rw-r--r--drivers/net/3c509.c3
-rw-r--r--drivers/net/8390.c2
-rw-r--r--drivers/net/apricot.c2
-rw-r--r--drivers/net/at1700.c2
-rw-r--r--drivers/net/atp.c2
-rw-r--r--drivers/net/de600.c2
-rw-r--r--drivers/net/de620.c2
-rw-r--r--drivers/net/depca.c2
-rw-r--r--drivers/net/eexpress.c2
-rw-r--r--drivers/net/loopback.c9
-rw-r--r--drivers/net/ni52.c5
-rw-r--r--drivers/net/ni65.c2
-rw-r--r--drivers/net/plip.c2
-rw-r--r--drivers/net/sk_g16.c2
-rw-r--r--drivers/net/skeleton.c2
-rw-r--r--drivers/net/znet.c2
-rw-r--r--drivers/sound/.blurb.orig27
-rw-r--r--drivers/sound/dma.h266
28 files changed, 510 insertions, 36 deletions
diff --git a/drivers/Makefile b/drivers/Makefile
index a30e4a764..80d4488e4 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -12,7 +12,7 @@
.c.s:
$(CC) $(CFLAGS) -S $<
.s.o:
- $(AS) -c -o $*.o $<
+ $(AS) $(ASFLAGS) -c -o $*.o $<
.c.o:
$(CC) $(CFLAGS) -c $<
diff --git a/drivers/block/Makefile b/drivers/block/Makefile
index 30e6d74a1..ea77020f6 100644
--- a/drivers/block/Makefile
+++ b/drivers/block/Makefile
@@ -12,7 +12,7 @@
.c.s:
$(CC) $(CFLAGS) -S $<
.s.o:
- $(AS) -c -o $*.o $<
+ $(AS) $(ASFLAGS) -c -o $*.o $<
.c.o:
$(CC) $(CFLAGS) -c $<
diff --git a/drivers/char/Makefile b/drivers/char/Makefile
index ec8430aac..6045cc7fc 100644
--- a/drivers/char/Makefile
+++ b/drivers/char/Makefile
@@ -12,7 +12,7 @@
.c.s:
$(CC) $(CFLAGS) -S $<
.s.o:
- $(AS) -c -o $*.o $<
+ $(AS) $(ASFLAGS) -c -o $*.o $<
.c.o:
$(CC) $(CFLAGS) -c $<
diff --git a/drivers/char/console.c b/drivers/char/console.c
index 7a48e7871..1c5d4eb90 100644
--- a/drivers/char/console.c
+++ b/drivers/char/console.c
@@ -90,6 +90,7 @@
#include <linux/major.h>
#include <asm/io.h>
+#include <asm/slots.h>
#include <asm/system.h>
#include <asm/segment.h>
#include <asm/bitops.h>
@@ -124,6 +125,10 @@ static int sel_end;
static char sel_buffer[SEL_BUFFER_SIZE] = { '\0' };
#endif /* CONFIG_SELECTION */
+#ifdef __mips__
+static unsigned int dummy;
+#endif
+
#define NPAR 16
static void con_setsize(unsigned long rows, unsigned long cols);
@@ -290,12 +295,24 @@ static struct vc {
static void * memsetw(void * s, unsigned short c, unsigned int count)
{
+#if defined (__i386__)
__asm__("cld\n\t"
"rep\n\t"
"stosw"
: /* no output */
:"a" (c),"D" (s),"c" (count/2)
:"cx","di");
+#elif defined (__mips_)
+__asm__ __volatile__(
+ ".set\tnoreorder\n"
+ "1:sh\t%2,(%0)\n\t"
+ "subu\t%1,%1,1\n\t"
+ "bne\t$0,%1,1b\n\t"
+ "addiu\t%0,%0,2\n\t"
+ ".set\treorder"
+ :"=r" (dummy),"=r" (dummy)
+ :"r" (c),"0" (s),"1" (count/2));
+#endif
return s;
}
@@ -676,6 +693,7 @@ static void scrup(int currcons, unsigned int t, unsigned int b)
pos += video_size_row;
scr_end += video_size_row;
if (scr_end > video_mem_end) {
+#if defined (__i386__)
__asm__("cld\n\t"
"rep\n\t"
"movsl\n\t"
@@ -688,11 +706,37 @@ static void scrup(int currcons, unsigned int t, unsigned int b)
"D" (video_mem_start),
"S" (origin)
:"cx","di","si");
+#elif defined (__mips__)
+ __asm__ __volatile__(
+ ".set\tnoreorder\n\t"
+ ".set\tnoat\n"
+ "1:\tlwu\t$1,(%2)\n\t"
+ "subu\t%0,%0,1\n\t"
+ "addiu\t%2,%2,4\n\t"
+ "sw\t$1,(%1)\n\t"
+ "bne\t$0,%0,1b\n\t"
+ "addiu\t%1,%1,4\n"
+ "1:\tsh\t%4,(%1)\n\t"
+ "subu\t%3,%3,1\n\t"
+ "bne\t$0,%3,1b\n\t"
+ "addiu\t%1,%1,2\n\t"
+ ".set\tat\n\t"
+ ".set\treorder"
+ :"=r" (dummy),"=r" (dummy),
+ "=r" (dummy),"=r" (dummy)
+ :"r" (video_erase_char),
+ "0" ((video_num_lines-1)*video_num_columns>>1),
+ "1" (video_mem_start),
+ "2" (origin),
+ "3" (video_num_columns)
+ :"$1");
+#endif
scr_end -= origin-video_mem_start;
pos -= origin-video_mem_start;
origin = video_mem_start;
has_scrolled = 1;
} else {
+#if defined (__i386__)
__asm__("cld\n\t"
"rep\n\t"
"stosw"
@@ -701,9 +745,23 @@ static void scrup(int currcons, unsigned int t, unsigned int b)
"c" (video_num_columns),
"D" (scr_end-video_size_row)
:"cx","di");
+#elif defined (__mips__)
+ __asm__ __volatile__(
+ ".set\tnoreorder\n"
+ "1:sh\t%2,(%1)\n\t"
+ "subu\t%0,%0,1\n\t"
+ "bne\t$0,%0,1b\n\t"
+ "addiu\t%1,%1,2\n\t"
+ ".set\treorder\n\t"
+ :"=r" (dummy),"=r" (dummy)
+ :"r" (video_erase_char),
+ "0" (video_num_columns),
+ "1" (scr_end-video_size_row));
+#endif
}
set_origin(currcons);
} else {
+#if defined (__i386__)
__asm__("cld\n\t"
"rep\n\t"
"movsl\n\t"
@@ -716,6 +774,30 @@ static void scrup(int currcons, unsigned int t, unsigned int b)
"D" (origin+video_size_row*t),
"S" (origin+video_size_row*(t+1))
:"cx","di","si");
+#elif defined (__mips__)
+ __asm__ __volatile__(
+ ".set\tnoreorder\n\t"
+ ".set\tnoat\n"
+ "1:\tlwu\t$1,(%2)\n\t"
+ "subu\t%0,%0,1\n\t"
+ "sw\t$1,(%1)\n\t"
+ "addiu\t%2,%2,4\n\t"
+ "bne\t$0,%1,1b\n\t"
+ "addiu\t%1,%1,4\n"
+ "1:\tsh\t%4,(%1)\n\t"
+ "subu\t%3,%3,1\n\t"
+ "bne\t$0,%3,1b\n\t"
+ "addiu\t%1,%1,2\n\t"
+ ".set\tat\n\t"
+ ".set\treorder\n\t"
+ :"=r" (dummy),"=r" (dummy),"=r" (dummy),"=r" (dummy)
+ :"r" (video_erase_char),
+ "0" ((b-t-1)*video_num_columns>>1),
+ "1" (origin+video_size_row*t),
+ "2" (origin+video_size_row*(t+1)),
+ "3" (video_num_columns)
+ :"$1");
+#endif
}
}
@@ -723,6 +805,7 @@ static void scrdown(int currcons, unsigned int t, unsigned int b)
{
if (b > video_num_lines || t >= b)
return;
+#if defined (__i386__)
__asm__("std\n\t"
"rep\n\t"
"movsl\n\t"
@@ -737,6 +820,30 @@ static void scrdown(int currcons, unsigned int t, unsigned int b)
"D" (origin+video_size_row*b-4),
"S" (origin+video_size_row*(b-1)-4)
:"ax","cx","di","si");
+#elif defined (__mips__)
+ __asm__ __volatile__(
+ ".set\tnoreorder\n\t"
+ ".set\tnoat\n"
+ "1:\tlw\t$1,(%2)\n\t"
+ "subu\t%0,%0,1\n\t"
+ "sw\t$1,(%1)\n\t"
+ "subu\t%2,%2,4\n\t"
+ "bne\t$0,%0,1b\n\t"
+ "subu\t%1,%1,4\n"
+ "1:\tsh\t%4,(%1)\n\t"
+ "subu\t%3,%3,1\n\t"
+ "bne\t$0,%3,1b\n\t"
+ "subu\t%1,%1,2\n\t"
+ ".set\tat\n\t"
+ ".set\treorder"
+ :"=r" (dummy),"=r" (dummy),"=r" (dummy),"=r" (dummy)
+ :"r" (video_erase_char),
+ "0" ((b-t-1)*video_num_columns>>1),
+ "1" (origin+video_size_row*b-4),
+ "2" (origin+video_size_row*(b-1)-4),
+ "3" (video_num_columns)
+ :"$1");
+#endif
has_scrolled = 1;
}
@@ -809,6 +916,7 @@ static void csi_J(int currcons, int vpar)
default:
return;
}
+#if defined (__i386__)
__asm__("cld\n\t"
"rep\n\t"
"stosw\n\t"
@@ -816,6 +924,17 @@ static void csi_J(int currcons, int vpar)
:"c" (count),
"D" (start),"a" (video_erase_char)
:"cx","di");
+#elif defined (__mips__)
+ __asm__ __volatile__(
+ ".set\tnoreorder\n"
+ "1:\tsh\t%4,(%1)\n\t"
+ "subu\t%0,%0,1\n\t"
+ "bne\t$0,%0,1b\n\t"
+ "addiu\t%1,%1,2\n\t"
+ ".set\treorder"
+ :"=r" (dummy),"=r" (dummy)
+ :"0" (count),"1" (start),"r" (video_erase_char));
+#endif
need_wrap = 0;
}
@@ -840,6 +959,7 @@ static void csi_K(int currcons, int vpar)
default:
return;
}
+#if defined (__i386__)
__asm__("cld\n\t"
"rep\n\t"
"stosw\n\t"
@@ -847,6 +967,17 @@ static void csi_K(int currcons, int vpar)
:"c" (count),
"D" (start),"a" (video_erase_char)
:"cx","di");
+#elif defined (__mips__)
+ __asm__ __volatile__(
+ ".set\tnoreorder\n"
+ "1:\tsh\t%2,(%1)\n\t"
+ "subu\t%0,%0,1\n\t"
+ "bne\t$0,%0,1b\n\t"
+ "addiu\t%1,%1,2\n\t"
+ ".set\treorder\n\t"
+ :"=r" (dummy),"=r" (dummy)
+ :"0" (count),"1" (start),"r" (video_erase_char));
+#endif
need_wrap = 0;
}
@@ -861,6 +992,7 @@ static void csi_X(int currcons, int vpar) /* erase the following vpar positions
start=pos;
count=(vpar > video_num_columns-x) ? (video_num_columns-x) : vpar;
+#if defined (__i386__)
__asm__("cld\n\t"
"rep\n\t"
"stosw\n\t"
@@ -868,6 +1000,17 @@ static void csi_X(int currcons, int vpar) /* erase the following vpar positions
:"c" (count),
"D" (start),"a" (video_erase_char)
:"cx","di");
+#elif defined (__mips__)
+ __asm__ __volatile__(
+ ".set\tnoreorder\n"
+ "1:\tsh\t%4,(%1)\n\t"
+ "subu\t%0,%0,1\n\t"
+ "bne\t$0,%0,1b\n\t"
+ "addiu\t%1,%1,2\n\t"
+ ".set\treorder"
+ :"=r" (dummy),"=r" (dummy)
+ :"0" (count),"1" (start),"r" (video_erase_char));
+#endif
need_wrap = 0;
}
@@ -1280,6 +1423,7 @@ static void reset_terminal(int currcons, int do_clear)
deccm = 1;
decim = 0;
+#ifdef __i386__
set_kbd(decarm);
clr_kbd(decckm);
clr_kbd(kbdapplic);
@@ -1288,6 +1432,7 @@ static void reset_terminal(int currcons, int do_clear)
kbd_table[currcons].ledmode = LED_SHOW_FLAGS;
kbd_table[currcons].ledflagstate = kbd_table[currcons].default_ledflagstate;
set_leds();
+#endif
default_attr(currcons);
update_attr(currcons);
@@ -1869,7 +2014,6 @@ long con_init(long kmem_start)
int currcons = 0;
int orig_x = ORIG_X;
int orig_y = ORIG_Y;
-
memset(&console_driver, 0, sizeof(struct tty_driver));
console_driver.magic = TTY_DRIVER_MAGIC;
console_driver.name = "tty";
@@ -1910,42 +2054,42 @@ long con_init(long kmem_start)
if (ORIG_VIDEO_MODE == 7) /* Is this a monochrome display? */
{
- video_mem_base = 0xb0000;
+ video_mem_base = SLOTSPACE + 0xb0000;
video_port_reg = 0x3b4;
video_port_val = 0x3b5;
if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10)
{
video_type = VIDEO_TYPE_EGAM;
- video_mem_term = 0xb8000;
+ video_mem_term = SLOTSPACE + 0xb8000;
display_desc = "EGA+";
}
else
{
video_type = VIDEO_TYPE_MDA;
- video_mem_term = 0xb2000;
+ video_mem_term = SLOTSPACE + 0xb2000;
display_desc = "*MDA";
}
}
else /* If not, it is color. */
{
can_do_color = 1;
- video_mem_base = 0xb8000;
+ video_mem_base = SLOTSPACE + 0xb8000;
video_port_reg = 0x3d4;
video_port_val = 0x3d5;
if ((ORIG_VIDEO_EGA_BX & 0xff) != 0x10)
{
video_type = VIDEO_TYPE_EGAC;
- video_mem_term = 0xc0000;
+ video_mem_term = SLOTSPACE + 0xc0000;
display_desc = "EGA+";
}
else
{
video_type = VIDEO_TYPE_CGA;
- video_mem_term = 0xba000;
+ video_mem_term = SLOTSPACE + 0xba000;
display_desc = "*CGA";
}
}
-
+
/* Initialize the variables used for scrolling (mostly EGA/VGA) */
/* Due to kmalloc roundup allocating statically is more efficient -
@@ -2491,10 +2635,10 @@ static void clear_selection()
* (sizif@botik.yaroslavl.su).
*/
-#define colourmap ((char *)0xa0000)
+#define colourmap ((char *)(SLOTSPACE + 0xa0000))
/* Pauline Middelink <middelin@polyware.iaf.nl> reports that we
should use 0xA0000 for the bwmap as well.. */
-#define blackwmap ((char *)0xa0000)
+#define blackwmap ((char *)(SLOTSPACE + 0xa0000))
#define cmapsz 8192
#define seq_port_reg (0x3c4)
#define seq_port_val (0x3c5)
diff --git a/drivers/char/keyboard.c b/drivers/char/keyboard.c
index fac55feb8..1f8b86b73 100644
--- a/drivers/char/keyboard.c
+++ b/drivers/char/keyboard.c
@@ -75,8 +75,12 @@ extern void scrollback(int);
extern void scrollfront(int);
extern int vc_cons_allocated(unsigned int);
+#if defined (__i386__)
#define fake_keyboard_interrupt() \
__asm__ __volatile__("int $0x21")
+#elif defined (__mips__)
+extern void fake_keyboard_interrupt(void);
+#endif
unsigned char kbd_read_mask = 0x01; /* modified by psaux.c */
@@ -614,6 +618,7 @@ static void show_ptregs(void)
{
if (!pt_regs)
return;
+#if defined (__i386__)
printk("\n");
printk("EIP: %04x:%08lx",0xffff & pt_regs->cs,pt_regs->eip);
if (pt_regs->cs & 3)
@@ -626,6 +631,11 @@ static void show_ptregs(void)
printk(" DS: %04x ES: %04x FS: %04x GS: %04x\n",
0xffff & pt_regs->ds,0xffff & pt_regs->es,
0xffff & pt_regs->fs,0xffff & pt_regs->gs);
+#elif defined (__mips__)
+ /*
+ * FIXME...
+ */
+#endif
}
static void hold(void)
@@ -1146,7 +1156,9 @@ static void kbd_bh(void * unused)
sti();
}
+#ifdef __i386__
long no_idt[2] = {0, 0};
+#endif
/*
* This routine reboots the machine by asking the keyboard
@@ -1156,12 +1168,16 @@ long no_idt[2] = {0, 0};
void hard_reset_now(void)
{
int i, j;
+#ifdef __i386__
extern unsigned long pg0[1024];
+#endif
sti();
/* rebooting needs to touch the page at absolute addr 0 */
+#ifdef __i386__
pg0[0] = 7;
*((unsigned short *)0x472) = 0x1234;
+#endif
for (;;) {
for (i=0; i<100; i++) {
kb_wait();
@@ -1169,7 +1185,9 @@ void hard_reset_now(void)
/* nothing */;
outb(0xfe,0x64); /* pulse reset low */
}
+#ifdef __i386__
__asm__("\tlidt _no_idt");
+#endif
}
}
diff --git a/drivers/char/mem.c b/drivers/char/mem.c
index 4e721da79..3c1274030 100644
--- a/drivers/char/mem.c
+++ b/drivers/char/mem.c
@@ -87,9 +87,16 @@ static int mmap_mem(struct inode * inode, struct file * file, struct vm_area_str
{
if (vma->vm_offset & ~PAGE_MASK)
return -ENXIO;
+#if defined (__i386__)
if (x86 > 3 && vma->vm_offset >= high_memory)
vma->vm_page_prot |= PAGE_PCD;
- if (remap_page_range(vma->vm_start, vma->vm_offset, vma->vm_end - vma->vm_start, vma->vm_page_prot))
+#elif defined (__mips__)
+ if (vma->vm_offset >= high_memory)
+ vma->vm_page_prot = vma->vm_page_prot & ~CACHE_MASK | CACHE_UNCACHED;
+#endif
+
+ if (remap_page_range(vma->vm_start, vma->vm_offset,
+ vma->vm_end - vma->vm_start, vma->vm_page_prot))
return -EAGAIN;
vma->vm_inode = inode;
inode->i_count++;
@@ -179,8 +186,9 @@ static int write_full(struct inode * inode,struct file * file,char * buf, int co
}
/*
- * Special lseek() function for /dev/null and /dev/zero. Most notably, you can fopen()
- * both devices with "a" now. This was previously impossible. SRB.
+ * Special lseek() function for /dev/null and /dev/zero.
+ * Most notably, you can fopen() both devices with "a" now.
+ * This was previously impossible. SRB.
*/
static int null_lseek(struct inode * inode, struct file * file, off_t offset, int orig)
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
index 66782f42f..425b63e33 100644
--- a/drivers/char/tty_io.c
+++ b/drivers/char/tty_io.c
@@ -1588,7 +1588,7 @@ int tty_register_driver(struct tty_driver *driver)
driver->prev = 0;
driver->next = tty_drivers;
- tty_drivers->prev = driver;
+ if(tty_drivers) tty_drivers->prev = driver;
tty_drivers = driver;
return error;
}
diff --git a/drivers/net/3c501.c b/drivers/net/3c501.c
index c2a0b4962..5643c2d5e 100644
--- a/drivers/net/3c501.c
+++ b/drivers/net/3c501.c
@@ -329,7 +329,7 @@ el_start_xmit(struct sk_buff *skb, struct device *dev)
static void
el_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev = (struct device *)(irq2dev_map[irq]);
struct net_local *lp;
int ioaddr;
diff --git a/drivers/net/3c505.c b/drivers/net/3c505.c
index 657e2ac04..a980373c5 100644
--- a/drivers/net/3c505.c
+++ b/drivers/net/3c505.c
@@ -671,7 +671,7 @@ static void elp_interrupt(int reg_ptr)
{
int len;
int dlen;
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev;
elp_device * adapter;
int timeout;
diff --git a/drivers/net/3c507.c b/drivers/net/3c507.c
index e8a8ae673..5cc261c51 100644
--- a/drivers/net/3c507.c
+++ b/drivers/net/3c507.c
@@ -511,7 +511,7 @@ el16_send_packet(struct sk_buff *skb, struct device *dev)
static void
el16_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev = (struct device *)(irq2dev_map[irq]);
struct net_local *lp;
int ioaddr, status, boguscount = 0;
diff --git a/drivers/net/3c509.c b/drivers/net/3c509.c
index f8f363c68..395a096c6 100644
--- a/drivers/net/3c509.c
+++ b/drivers/net/3c509.c
@@ -462,7 +462,8 @@ el3_start_xmit(struct sk_buff *skb, struct device *dev)
static void
el3_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
+
struct device *dev = (struct device *)(irq2dev_map[irq]);
int ioaddr, status;
int i = 0;
diff --git a/drivers/net/8390.c b/drivers/net/8390.c
index e05081be5..ebed123a7 100644
--- a/drivers/net/8390.c
+++ b/drivers/net/8390.c
@@ -238,7 +238,7 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
Handle the ether interface interrupts. */
void ei_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev = (struct device *)(irq2dev_map[irq]);
int e8390_base;
int interrupts, boguscount = 0;
diff --git a/drivers/net/apricot.c b/drivers/net/apricot.c
index fcf3386e4..f3da8c8e9 100644
--- a/drivers/net/apricot.c
+++ b/drivers/net/apricot.c
@@ -712,7 +712,7 @@ unsigned long apricot_init(unsigned long mem_start, unsigned long mem_end)
static void
i596_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev = (struct device *)(irq2dev_map[irq]);
struct i596_private *lp;
short ioaddr;
diff --git a/drivers/net/at1700.c b/drivers/net/at1700.c
index 974f98d1e..be2bf7ed3 100644
--- a/drivers/net/at1700.c
+++ b/drivers/net/at1700.c
@@ -437,7 +437,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
static void
net_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev = (struct device *)(irq2dev_map[irq]);
struct net_local *lp;
int ioaddr, status;
diff --git a/drivers/net/atp.c b/drivers/net/atp.c
index 3f860b99b..19520abf2 100644
--- a/drivers/net/atp.c
+++ b/drivers/net/atp.c
@@ -481,7 +481,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
static void
net_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev = (struct device *)(irq2dev_map[irq]);
struct net_local *lp;
int ioaddr, status, boguscount = 20;
diff --git a/drivers/net/de600.c b/drivers/net/de600.c
index 4cd21582d..a8867c2d9 100644
--- a/drivers/net/de600.c
+++ b/drivers/net/de600.c
@@ -498,7 +498,7 @@ de600_start_xmit(struct sk_buff *skb, struct device *dev)
static void
de600_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev = irq2dev_map[irq];
byte irq_status;
int retrig = 0;
diff --git a/drivers/net/de620.c b/drivers/net/de620.c
index e3cb9a307..28124eb3c 100644
--- a/drivers/net/de620.c
+++ b/drivers/net/de620.c
@@ -568,7 +568,7 @@ de620_start_xmit(struct sk_buff *skb, struct device *dev)
static void
de620_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev = irq2dev_map[irq];
byte irq_status;
int bogus_count = 0;
diff --git a/drivers/net/depca.c b/drivers/net/depca.c
index fcb8f86af..c3fdccaf6 100644
--- a/drivers/net/depca.c
+++ b/drivers/net/depca.c
@@ -948,7 +948,7 @@ depca_start_xmit(struct sk_buff *skb, struct device *dev)
static void
depca_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev = (struct device *)(irq2dev_map[irq]);
struct depca_private *lp;
int csr0, ioaddr, nicsr;
diff --git a/drivers/net/eexpress.c b/drivers/net/eexpress.c
index ace82ca4e..f1e041fd5 100644
--- a/drivers/net/eexpress.c
+++ b/drivers/net/eexpress.c
@@ -516,7 +516,7 @@ eexp_send_packet(struct sk_buff *skb, struct device *dev)
static void
eexp_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev = (struct device *)(irq2dev_map[irq]);
struct net_local *lp;
int ioaddr, status, boguscount = 0;
diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c
index 4927dfedb..b1ec43b23 100644
--- a/drivers/net/loopback.c
+++ b/drivers/net/loopback.c
@@ -21,6 +21,7 @@
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/interrupt.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/string.h>
@@ -71,6 +72,7 @@ loopback_xmit(struct sk_buff *skb, struct device *dev)
dev->tbusy = 0;
#if 1
+#if defined (__i386__)
__asm__("cmpl $0,_intr_count\n\t"
"jne 1f\n\t"
"movl _bh_active,%%eax\n\t"
@@ -83,6 +85,13 @@ loopback_xmit(struct sk_buff *skb, struct device *dev)
:
:
: "ax", "dx", "cx");
+#elif defined (__mips__)
+ if(intr_count == 0 && (bh_active & bh_mask) != 0) {
+ intr_count++;
+ do_bottom_half();
+ intr_count--;
+ }
+#endif
#endif
return(0);
diff --git a/drivers/net/ni52.c b/drivers/net/ni52.c
index aa7673dfd..12ad62caf 100644
--- a/drivers/net/ni52.c
+++ b/drivers/net/ni52.c
@@ -716,7 +716,8 @@ static void *alloc_rfa(struct device *dev,void *ptr)
static void ni52_interrupt(int reg_ptr)
{
- struct device *dev = (struct device *) irq2dev_map[-((struct pt_regs *)reg_ptr)->orig_eax-2];
+ int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ struct device *dev = (struct device *)(irq2dev_map[irq]);
unsigned short stat;
int pd = 0;
struct priv *p;
@@ -726,7 +727,7 @@ static void ni52_interrupt(int reg_ptr)
#endif
if (dev == NULL) {
- printk ("ni52-interrupt: irq %d for unknown device.\n",(int) -(((struct pt_regs *)reg_ptr)->orig_eax+2));
+ printk ("ni52-interrupt: irq %d for unknown device.\n", irq);
return;
}
p = (struct priv *) dev->priv;
diff --git a/drivers/net/ni65.c b/drivers/net/ni65.c
index 126b41a06..e17f71908 100644
--- a/drivers/net/ni65.c
+++ b/drivers/net/ni65.c
@@ -400,7 +400,7 @@ static int am7990_reinit(struct device *dev)
static void ni65_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
int csr0;
struct device *dev = (struct device *) irq2dev_map[irq];
diff --git a/drivers/net/plip.c b/drivers/net/plip.c
index f54135a47..e0c6a10b1 100644
--- a/drivers/net/plip.c
+++ b/drivers/net/plip.c
@@ -681,7 +681,7 @@ plip_receive_packet(struct device *dev)
static void
plip_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev = (struct device *) irq2dev_map[irq];
struct net_local *nl = (struct net_local *)dev->priv;
struct plip_local *rcv = &nl->rcv_data;
diff --git a/drivers/net/sk_g16.c b/drivers/net/sk_g16.c
index f6f427525..acdce289f 100644
--- a/drivers/net/sk_g16.c
+++ b/drivers/net/sk_g16.c
@@ -1312,7 +1312,7 @@ static int SK_send_packet(struct sk_buff *skb, struct device *dev)
static void SK_interrupt(int reg_ptr)
{
- int irq = - (((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
int csr0;
struct device *dev = (struct device *) irq2dev_map[irq];
struct priv *p = (struct priv *) dev->priv;
diff --git a/drivers/net/skeleton.c b/drivers/net/skeleton.c
index 37ea0d125..f98250c85 100644
--- a/drivers/net/skeleton.c
+++ b/drivers/net/skeleton.c
@@ -357,7 +357,7 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
static void
net_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev = (struct device *)(irq2dev_map[irq]);
struct net_local *lp;
int ioaddr, status, boguscount = 0;
diff --git a/drivers/net/znet.c b/drivers/net/znet.c
index 21df8831f..1111f41b1 100644
--- a/drivers/net/znet.c
+++ b/drivers/net/znet.c
@@ -405,7 +405,7 @@ static int znet_send_packet(struct sk_buff *skb, struct device *dev)
/* The ZNET interrupt handler. */
static void znet_interrupt(int reg_ptr)
{
- int irq = -(((struct pt_regs *)reg_ptr)->orig_eax+2);
+ int irq = pt_regs2irq(reg_ptr);
struct device *dev = irq2dev_map[irq];
int ioaddr;
int boguscnt = 20;
diff --git a/drivers/sound/.blurb.orig b/drivers/sound/.blurb.orig
new file mode 100644
index 000000000..165e01ac8
--- /dev/null
+++ b/drivers/sound/.blurb.orig
@@ -0,0 +1,27 @@
+NOTE!
+
+ This is an ALPHA TEST VERSION (pre 3.0). The latest
+ released version of this driver is now part of
+ Linux kernel distribution. For other operating systems
+ use the snd-driv-2.5.tar.gz package.
+
+ This particular version contains lots of new features
+ BUT THERE ARE NO APPLICATIONS WHICH USE THEM. So there
+ is no need to install this version as long as you are
+ not developing the driver or applications which use it.
+ All new features are in the /dev/sequencer and /dev/midi
+ parts of the driver.
+
+
+ This version is little bit incomplete. Some features have
+ not been implemented for each soundcards yet. All features
+ of v2.4 should work OK.
+
+CAUTION!
+ This version of driver works with applications written and
+ compiled for v2.*. The problem is that APPLICATIONS COMPILED
+ WITH soundcard.h OF THIS VERSION WILL NOT WORK WITH OLDER DRIVER.
+ Be carefull when distributing applications compiled with this
+ version (just the apps using /dev/sequencer are incompatible).
+
+Hannu
diff --git a/drivers/sound/dma.h b/drivers/sound/dma.h
new file mode 100644
index 000000000..1196fdff1
--- /dev/null
+++ b/drivers/sound/dma.h
@@ -0,0 +1,266 @@
+/* $Id: dma.h,v 1.7 1992/12/14 00:29:34 root Exp root $
+ * linux/include/asm/dma.h: Defines for using and allocating dma channels.
+ * Written by Hennus Bergman, 1992.
+ * High DMA channel support & info by Hannu Savolainen
+ * and John Boyd, Nov. 1992.
+ */
+
+#ifndef _ASM_DMA_H
+#define _ASM_DMA_H
+
+#include <asm/io.h> /* need byte IO */
+
+#define deb_outb(x,y) {printk("out %02x, %02x\n", x, y);outb(x,y);}
+
+
+#ifdef HAVE_REALLY_SLOW_DMA_CONTROLLER
+#define outb outb_p
+#endif
+
+/*
+ * NOTES about DMA transfers:
+ *
+ * controller 1: channels 0-3, byte operations, ports 00-1F
+ * controller 2: channels 4-7, word operations, ports C0-DF
+ *
+ * - ALL registers are 8 bits only, regardless of transfer size
+ * - channel 4 is not used - cascades 1 into 2.
+ * - channels 0-3 are byte - addresses/counts are for physical bytes
+ * - channels 5-7 are word - addresses/counts are for physical words
+ * - transfers must not cross physical 64K (0-3) or 128K (5-7) boundaries
+ * - transfer count loaded to registers is 1 less than actual count
+ * - controller 2 offsets are all even (2x offsets for controller 1)
+ * - page registers for 5-7 don't use data bit 0, represent 128K pages
+ * - page registers for 0-3 use bit 0, represent 64K pages
+ *
+ * DMA transfers are limited to the lower 16MB of _physical_ memory.
+ * Note that addresses loaded into registers must be _physical_ addresses,
+ * not logical addresses (which may differ if paging is active).
+ *
+ * Address mapping for channels 0-3:
+ *
+ * A23 ... A16 A15 ... A8 A7 ... A0 (Physical addresses)
+ * | ... | | ... | | ... |
+ * | ... | | ... | | ... |
+ * | ... | | ... | | ... |
+ * P7 ... P0 A7 ... A0 A7 ... A0
+ * | Page | Addr MSB | Addr LSB | (DMA registers)
+ *
+ * Address mapping for channels 5-7:
+ *
+ * A23 ... A17 A16 A15 ... A9 A8 A7 ... A1 A0 (Physical addresses)
+ * | ... | \ \ ... \ \ \ ... \ \
+ * | ... | \ \ ... \ \ \ ... \ (not used)
+ * | ... | \ \ ... \ \ \ ... \
+ * P7 ... P1 (0) A7 A6 ... A0 A7 A6 ... A0
+ * | Page | Addr MSB | Addr LSB | (DMA registers)
+ *
+ * Again, channels 5-7 transfer _physical_ words (16 bits), so addresses
+ * and counts _must_ be word-aligned (the lowest address bit is _ignored_ at
+ * the hardware level, so odd-byte transfers aren't possible).
+ *
+ * Transfer count (_not # bytes_) is limited to 64K, represented as actual
+ * count - 1 : 64K => 0xFFFF, 1 => 0x0000. Thus, count is always 1 or more,
+ * and up to 128K bytes may be transferred on channels 5-7 in one operation.
+ *
+ */
+
+#define MAX_DMA_CHANNELS 8
+
+/* 8237 DMA controllers */
+#define IO_DMA1_BASE 0x00 /* 8 bit slave DMA, channels 0..3 */
+#define IO_DMA2_BASE 0xC0 /* 16 bit master DMA, ch 4(=slave input)..7 */
+
+/* DMA controller registers */
+#define DMA1_CMD_REG 0x08 /* command register (w) */
+#define DMA1_STAT_REG 0x08 /* status register (r) */
+#define DMA1_REQ_REG 0x09 /* request register (w) */
+#define DMA1_MASK_REG 0x0A /* single-channel mask (w) */
+#define DMA1_MODE_REG 0x0B /* mode register (w) */
+#define DMA1_CLEAR_FF_REG 0x0C /* clear pointer flip-flop (w) */
+#define DMA1_TEMP_REG 0x0D /* Temporary Register (r) */
+#define DMA1_RESET_REG 0x0D /* Master Clear (w) */
+#define DMA1_CLR_MASK_REG 0x0E /* Clear Mask */
+#define DMA1_MASK_ALL_REG 0x0F /* all-channels mask (w) */
+
+#define DMA2_CMD_REG 0xD0 /* command register (w) */
+#define DMA2_STAT_REG 0xD0 /* status register (r) */
+#define DMA2_REQ_REG 0xD2 /* request register (w) */
+#define DMA2_MASK_REG 0xD4 /* single-channel mask (w) */
+#define DMA2_MODE_REG 0xD6 /* mode register (w) */
+#define DMA2_CLEAR_FF_REG 0xD8 /* clear pointer flip-flop (w) */
+#define DMA2_TEMP_REG 0xDA /* Temporary Register (r) */
+#define DMA2_RESET_REG 0xDA /* Master Clear (w) */
+#define DMA2_CLR_MASK_REG 0xDC /* Clear Mask */
+#define DMA2_MASK_ALL_REG 0xDE /* all-channels mask (w) */
+
+#define DMA_ADDR_0 0x00 /* DMA address registers */
+#define DMA_ADDR_1 0x02
+#define DMA_ADDR_2 0x04
+#define DMA_ADDR_3 0x06
+#define DMA_ADDR_4 0xC0
+#define DMA_ADDR_5 0xC4
+#define DMA_ADDR_6 0xC8
+#define DMA_ADDR_7 0xCC
+
+#define DMA_CNT_0 0x01 /* DMA count registers */
+#define DMA_CNT_1 0x03
+#define DMA_CNT_2 0x05
+#define DMA_CNT_3 0x07
+#define DMA_CNT_4 0xC2
+#define DMA_CNT_5 0xC6
+#define DMA_CNT_6 0xCA
+#define DMA_CNT_7 0xCE
+
+#define DMA_PAGE_0 0x87 /* DMA page registers */
+#define DMA_PAGE_1 0x83
+#define DMA_PAGE_2 0x81
+#define DMA_PAGE_3 0x82
+#define DMA_PAGE_5 0x8B
+#define DMA_PAGE_6 0x89
+#define DMA_PAGE_7 0x8A
+
+#define DMA_MODE_READ 0x44 /* I/O to memory, no autoinit, increment, single mode */
+#define DMA_MODE_WRITE 0x48 /* memory to I/O, no autoinit, increment, single mode */
+#define DMA_MODE_CASCADE 0xC0 /* pass thru DREQ->HRQ, DACK<-HLDA only */
+
+/* enable/disable a specific DMA channel */
+static __inline__ void enable_dma(unsigned int dmanr)
+{
+ if (dmanr<=3)
+ deb_outb(dmanr, DMA1_MASK_REG)
+ else
+ deb_outb(dmanr & 3, DMA2_MASK_REG);
+}
+
+static __inline__ void disable_dma(unsigned int dmanr)
+{
+ if (dmanr<=3)
+ deb_outb(dmanr | 4, DMA1_MASK_REG)
+ else
+ deb_outb((dmanr & 3) | 4, DMA2_MASK_REG);
+}
+
+/* Clear the 'DMA Pointer Flip Flop'.
+ * Write 0 for LSB/MSB, 1 for MSB/LSB access.
+ * Use this once to initialize the FF to a known state.
+ * After that, keep track of it. :-)
+ * --- In order to do that, the DMA routines below should ---
+ * --- only be used while interrupts are disabled! ---
+ */
+static __inline__ void clear_dma_ff(unsigned int dmanr)
+{
+ if (dmanr<=3)
+ deb_outb(0, DMA1_CLEAR_FF_REG)
+ else
+ deb_outb(0, DMA2_CLEAR_FF_REG);
+}
+
+/* set mode (above) for a specific DMA channel */
+static __inline__ void set_dma_mode(unsigned int dmanr, char mode)
+{
+ if (dmanr<=3)
+ deb_outb(mode | dmanr, DMA1_MODE_REG)
+ else
+ deb_outb(mode | (dmanr&3), DMA2_MODE_REG);
+}
+
+/* Set only the page register bits of the transfer address.
+ * This is used for successive transfers when we know the contents of
+ * the lower 16 bits of the DMA current address register, but a 64k boundary
+ * may have been crossed.
+ */
+static __inline__ void set_dma_page(unsigned int dmanr, char pagenr)
+{
+ switch(dmanr) {
+ case 0:
+ deb_outb(pagenr, DMA_PAGE_0);
+ break;
+ case 1:
+ deb_outb(pagenr, DMA_PAGE_1);
+ break;
+ case 2:
+ deb_outb(pagenr, DMA_PAGE_2);
+ break;
+ case 3:
+ deb_outb(pagenr, DMA_PAGE_3);
+ break;
+ case 5:
+ deb_outb(pagenr & 0xfe, DMA_PAGE_5);
+ break;
+ case 6:
+ deb_outb(pagenr & 0xfe, DMA_PAGE_6);
+ break;
+ case 7:
+ deb_outb(pagenr & 0xfe, DMA_PAGE_7);
+ break;
+ }
+}
+
+
+/* Set transfer address & page bits for specific DMA channel.
+ * Assumes dma flipflop is clear.
+ */
+static __inline__ void set_dma_addr(unsigned int dmanr, unsigned int a)
+{
+ set_dma_page(dmanr, a>>16);
+ if (dmanr <= 3) {
+ deb_outb( a & 0xff, ((dmanr&3)<<1) + IO_DMA1_BASE );
+ deb_outb( (a>>8) & 0xff, ((dmanr&3)<<1) + IO_DMA1_BASE )
+ } else {
+ deb_outb( (a>>1) & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE );
+ deb_outb( (a>>9) & 0xff, ((dmanr&3)<<2) + IO_DMA2_BASE );
+ }
+}
+
+
+/* Set transfer size (max 64k for DMA1..3, 128k for DMA5..7) for
+ * a specific DMA channel.
+ * You must ensure the parameters are valid.
+ * NOTE: from a manual: "the number of transfers is one more
+ * than the initial word count"! This is taken into account.
+ * Assumes dma flip-flop is clear.
+ * NOTE 2: "count" represents _bytes_ and must be even for channels 5-7.
+ */
+static __inline__ void set_dma_count(unsigned int dmanr, unsigned int count)
+{
+ count--;
+ if (dmanr <= 3) {
+ deb_outb( count & 0xff, ((dmanr&3)<<1) + 1 + IO_DMA1_BASE );
+ deb_outb( (count>>8) & 0xff, ((dmanr&3)<<1) + 1 + IO_DMA1_BASE );
+ } else {
+ deb_outb( (count>>1) & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE );
+ deb_outb( (count>>9) & 0xff, ((dmanr&3)<<2) + 2 + IO_DMA2_BASE );
+ }
+}
+
+
+/* Get DMA residue count. After a DMA transfer, this
+ * should return zero. Reading this while a DMA transfer is
+ * still in progress will return unpredictable results.
+ * If called before the channel has been used, it may return 1.
+ * Otherwise, it returns the number of _bytes_ left to transfer.
+ *
+ * Assumes DMA flip-flop is clear.
+ */
+static __inline__ int get_dma_residue(unsigned int dmanr)
+{
+ unsigned int io_port = (dmanr<=3)? ((dmanr&3)<<1) + 1 + IO_DMA1_BASE
+ : ((dmanr&3)<<2) + 2 + IO_DMA2_BASE;
+
+ /* using short to get 16-bit wrap around */
+ unsigned short count;
+
+ count = 1 + inb(io_port);
+ count += inb(io_port) << 8;
+
+ return (dmanr<=3)? count : (count<<1);
+}
+
+
+/* These are in kernel/dma.c: */
+extern int request_dma(unsigned int dmanr,char * deviceID); /* reserve a DMA channel */
+extern void free_dma(unsigned int dmanr); /* release it again */
+
+
+#endif /* _ASM_DMA_H */