diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/Makefile | 2 | ||||
-rw-r--r-- | drivers/block/Makefile | 2 | ||||
-rw-r--r-- | drivers/char/Makefile | 2 | ||||
-rw-r--r-- | drivers/char/console.c | 164 | ||||
-rw-r--r-- | drivers/char/keyboard.c | 18 | ||||
-rw-r--r-- | drivers/char/mem.c | 14 | ||||
-rw-r--r-- | drivers/char/tty_io.c | 2 | ||||
-rw-r--r-- | drivers/net/3c501.c | 2 | ||||
-rw-r--r-- | drivers/net/3c505.c | 2 | ||||
-rw-r--r-- | drivers/net/3c507.c | 2 | ||||
-rw-r--r-- | drivers/net/3c509.c | 3 | ||||
-rw-r--r-- | drivers/net/8390.c | 2 | ||||
-rw-r--r-- | drivers/net/apricot.c | 2 | ||||
-rw-r--r-- | drivers/net/at1700.c | 2 | ||||
-rw-r--r-- | drivers/net/atp.c | 2 | ||||
-rw-r--r-- | drivers/net/de600.c | 2 | ||||
-rw-r--r-- | drivers/net/de620.c | 2 | ||||
-rw-r--r-- | drivers/net/depca.c | 2 | ||||
-rw-r--r-- | drivers/net/eexpress.c | 2 | ||||
-rw-r--r-- | drivers/net/loopback.c | 9 | ||||
-rw-r--r-- | drivers/net/ni52.c | 5 | ||||
-rw-r--r-- | drivers/net/ni65.c | 2 | ||||
-rw-r--r-- | drivers/net/plip.c | 2 | ||||
-rw-r--r-- | drivers/net/sk_g16.c | 2 | ||||
-rw-r--r-- | drivers/net/skeleton.c | 2 | ||||
-rw-r--r-- | drivers/net/znet.c | 2 | ||||
-rw-r--r-- | drivers/sound/.blurb.orig | 27 | ||||
-rw-r--r-- | drivers/sound/dma.h | 266 |
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 */ |