From 39b3ec533cb423cd7bc623ab99ec0cf9e835d253 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 23 Nov 2007 15:09:15 -0500 Subject: [PATCH] Import 0.99.14c --- Makefile | 2 +- drivers/net/CONFIG | 4 ---- drivers/net/Makefile | 2 +- drivers/net/slhc.c | 5 ++++- drivers/net/slip.c | 3 ++- include/linux/in.h | 8 ++++---- kernel/sched.c | 23 ++++++++++++++++++----- 7 files changed, 30 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 8e94fff9fa98..626f0f231fa4 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ VERSION = 0.99 PATCHLEVEL = 14 -ALPHA = b +ALPHA = c all: Version zImage diff --git a/drivers/net/CONFIG b/drivers/net/CONFIG index c17d07fb6a2c..882a654610ec 100644 --- a/drivers/net/CONFIG +++ b/drivers/net/CONFIG @@ -27,9 +27,6 @@ # LANCE_DEBUG Set the debugging message level. # DEFAULT_DMA Change the default DMA to other than 5. # CONFIG_PLIP The Crynwr-protocol PL/IP driver -# SLIP The MicroWalt SLIP driver -# SL_DUMP Uses the "dump frame" debug code -# SL_COMPRESSED Use CSLIP # D_LINK The D-Link DE-600 Portable Ethernet Adaptor. # D_LINK_IO The D-Link I/O address (0x378 == default) # D_LINK_IRQ The D-Link IRQ number to use (IRQ7 == default) @@ -42,6 +39,5 @@ EL2_OPTS = #-UEL2_AUI NE_OPTS = HP_OPTS = PLIP_OPTS = -SLIP_OPTS = -DSL_DUMP -DSL_COMPRESSED DL_OPTS = -DD_LINK_IO=0x378 -DD_LINK_IRQ=7 -UD_LINK_DEBUG AT_OPTS = # -DLANCE_DMA=5 diff --git a/drivers/net/Makefile b/drivers/net/Makefile index c535be7bbc1c..2a958fdad658 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -70,7 +70,7 @@ endif ifdef CONFIG_SLIP NETDRV_OBJS := $(NETDRV_OBJS) net.a(slip.o) net.a(slhc.o) slip.o: slip.c CONFIG - $(CC) $(CPPFLAGS) $(CFLAGS) $(SLIP_OPTS) -c $< + $(CC) $(CPPFLAGS) $(CFLAGS) -c $< endif ifdef CONFIG_DE600 diff --git a/drivers/net/slhc.c b/drivers/net/slhc.c index 32e10d392d55..9ba15d0193f4 100644 --- a/drivers/net/slhc.c +++ b/drivers/net/slhc.c @@ -593,7 +593,10 @@ slhc_uncompress(struct slcompress *comp, unsigned char *icp, int isize) * packet. Recalculate IP checksum (but not TCP checksum). */ - len = isize - (cp - icp) + hdrlen; + len = isize - (cp - icp); + if (len < 0) + goto bad; + len += hdrlen; ip->tot_len = htons(len); ip->check = 0; diff --git a/drivers/net/slip.c b/drivers/net/slip.c index 0c3720f6ce83..bf8410a794f5 100644 --- a/drivers/net/slip.c +++ b/drivers/net/slip.c @@ -20,6 +20,8 @@ */ #include #include + +#include #include #include #include @@ -47,7 +49,6 @@ #include "slip.h" #include "slhc.h" - #define SLIP_VERSION "0.7.5" /* Define some IP layer stuff. Not all systems have it. */ diff --git a/include/linux/in.h b/include/linux/in.h index c3c656b9ee77..7ea09236a2c7 100644 --- a/include/linux/in.h +++ b/include/linux/in.h @@ -124,9 +124,9 @@ extern unsigned short int htons(unsigned short int); static __inline__ unsigned long int __ntohl(unsigned long int x) { - __asm__("xchgb %l0,%h0\n\t" /* swap lower bytes */ + __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */ "rorl $16,%0\n\t" /* swap words */ - "xchgb %l0,%h0" /* swap higher bytes */ + "xchgb %b0,%h0" /* swap higher bytes */ :"=q" (x) : "0" (x)); return x; @@ -144,9 +144,9 @@ __ntohs(unsigned short int x) static __inline__ unsigned long int __htonl(unsigned long int x) { - __asm__("xchgb %l0,%h0\n\t" /* swap lower bytes */ + __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes */ "rorl $16,%0\n\t" /* swap words */ - "xchgb %l0,%h0" /* swap higher bytes */ + "xchgb %b0,%h0" /* swap higher bytes */ :"=q" (x) : "0" (x)); return x; diff --git a/kernel/sched.c b/kernel/sched.c index 7a9a01d8390d..809329bb76a3 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -533,6 +533,9 @@ static void second_overflow(void) */ static void timer_bh(void * unused) { + unsigned long mask; + struct timer_struct *tp; + cli(); while (next_timer && next_timer->expires == 0) { void (*fn)(unsigned long) = next_timer->function; @@ -543,6 +546,18 @@ static void timer_bh(void * unused) cli(); } sti(); + + for (mask = 1, tp = timer_table+0 ; mask ; tp++,mask += mask) { + if (mask > timer_active) + break; + if (!(mask & timer_active)) + continue; + if (tp->expires > jiffies) + continue; + timer_active &= ~mask; + tp->fn(); + sti(); + } } /* @@ -554,7 +569,7 @@ static void timer_bh(void * unused) static void do_timer(struct pt_regs * regs) { unsigned long mask; - struct timer_struct *tp = timer_table+0; + struct timer_struct *tp; long ltemp; @@ -636,16 +651,14 @@ static void do_timer(struct pt_regs * regs) current->it_prof_value = current->it_prof_incr; send_sig(SIGPROF,current,1); } - for (mask = 1 ; mask ; tp++,mask += mask) { + for (mask = 1, tp = timer_table+0 ; mask ; tp++,mask += mask) { if (mask > timer_active) break; if (!(mask & timer_active)) continue; if (tp->expires > jiffies) continue; - timer_active &= ~mask; - tp->fn(); - sti(); + mark_bh(TIMER_BH); } cli(); itimer_ticks++; -- 2.39.5