diff -urN v2.4.6/include/asm-alpha/skbuff.h linux-skbhacks1/include/asm-alpha/skbuff.h
--- v2.4.6/include/asm-alpha/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-alpha/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/asm-arm/skbuff.h linux-skbhacks1/include/asm-arm/skbuff.h
--- v2.4.6/include/asm-arm/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-arm/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/asm-cris/skbuff.h linux-skbhacks1/include/asm-cris/skbuff.h
--- v2.4.6/include/asm-cris/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-cris/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/asm-generic/skbuff.h linux-skbhacks1/include/asm-generic/skbuff.h
--- v2.4.6/include/asm-generic/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-generic/skbuff.h	Sun Jul 15 10:54:15 2001
@@ -0,0 +1,16 @@
+#ifndef ASM_GENERIC__SKBUF_H
+#define ASM_GENERIC__SKBUF_H
+
+#define arch_skb_under_check(skb, len) \
+	do {\
+		if(skb->data<skb->head)\
+			skb_under_panic(skb, len, current_text_addr());\
+	} while(0)
+
+#define arch_skb_over_check(skb, len) \
+	do {\
+		if(skb->tail>skb->end)\
+			skb_over_panic(skb, len, current_text_addr());\
+	} while(0)
+
+#endif /*ASM_GENERIC__SKBUF_H*/
diff -urN v2.4.6/include/asm-i386/skbuff.h linux-skbhacks1/include/asm-i386/skbuff.h
--- v2.4.6/include/asm-i386/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-i386/skbuff.h	Sun Jul 15 21:58:01 2001
@@ -0,0 +1,24 @@
+#ifndef ASM_I386__SKBUF_H
+#define ASM_I386__SKBUF_H
+
+#define __arch_skb_check(insn, left, right, skb, why, len) \
+	__asm__ __volatile__( \
+	"	cmpl %1,%0\n" \
+	"1:	" insn " 2f\n" \
+	".section .text.lock,\"ax\"\n" \
+	"2:	pushl 1b\n" \
+	"	pushl %3\n" \
+	"	pushl %2\n" \
+	"	call skb_" why "_panic\n" \
+	"	ud2a\n" \
+	".previous\n" \
+	: : "r" (left), "rm" (right), "rmi" (skb), "rmi" (len) \
+	: "cc" )
+
+#define arch_skb_under_check(skb, len) \
+	__arch_skb_check("jl", skb->data, skb->head, skb, "under", len)
+
+#define arch_skb_over_check(skb, len) \
+	__arch_skb_check("jg", skb->tail, skb->end, skb, "over", len)
+
+#endif /*ASM_I386__SKBUF_H*/
diff -urN v2.4.6/include/asm-ia64/skbuff.h linux-skbhacks1/include/asm-ia64/skbuff.h
--- v2.4.6/include/asm-ia64/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-ia64/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/asm-m68k/skbuff.h linux-skbhacks1/include/asm-m68k/skbuff.h
--- v2.4.6/include/asm-m68k/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-m68k/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/asm-mips/skbuff.h linux-skbhacks1/include/asm-mips/skbuff.h
--- v2.4.6/include/asm-mips/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-mips/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/asm-mips64/skbuff.h linux-skbhacks1/include/asm-mips64/skbuff.h
--- v2.4.6/include/asm-mips64/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-mips64/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/asm-parisc/skbuff.h linux-skbhacks1/include/asm-parisc/skbuff.h
--- v2.4.6/include/asm-parisc/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-parisc/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/asm-ppc/skbuff.h linux-skbhacks1/include/asm-ppc/skbuff.h
--- v2.4.6/include/asm-ppc/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-ppc/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/asm-s390/skbuff.h linux-skbhacks1/include/asm-s390/skbuff.h
--- v2.4.6/include/asm-s390/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-s390/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/asm-s390x/skbuff.h linux-skbhacks1/include/asm-s390x/skbuff.h
--- v2.4.6/include/asm-s390x/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-s390x/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/asm-sh/skbuff.h linux-skbhacks1/include/asm-sh/skbuff.h
--- v2.4.6/include/asm-sh/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-sh/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/asm-sparc/skbuff.h linux-skbhacks1/include/asm-sparc/skbuff.h
--- v2.4.6/include/asm-sparc/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-sparc/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/asm-sparc64/skbuff.h linux-skbhacks1/include/asm-sparc64/skbuff.h
--- v2.4.6/include/asm-sparc64/skbuff.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/asm-sparc64/skbuff.h	Sun Jul 15 10:12:37 2001
@@ -0,0 +1 @@
+#include <asm-generic/skbuff.h>
diff -urN v2.4.6/include/linux/eeprom.h linux-skbhacks1/include/linux/eeprom.h
--- v2.4.6/include/linux/eeprom.h	Wed Dec 31 19:00:00 1969
+++ linux-skbhacks1/include/linux/eeprom.h	Mon Jun 25 17:53:27 2001
@@ -0,0 +1,135 @@
+/* credit winbond-840.c
+ */
+struct eeprom_ops {
+	void	(*set_cs)(void *ee);
+	void	(*clear_cs)(void *ee);
+};
+
+#define EEPOL_EEDI	0x01
+#define EEPOL_EEDO	0x02
+#define EEPOL_EECLK	0x04
+#define EEPOL_EESEL	0x08
+
+struct eeprom {
+	void *dev;
+	struct eeprom_ops *ops;
+
+	long		addr;
+
+	unsigned	ee_addr_bits;
+
+	unsigned	eesel;
+	unsigned	eeclk;
+	unsigned	eedo;
+	unsigned	eedi;
+	unsigned	polarity;
+	unsigned	ee_state;
+
+	spinlock_t	*lock;
+	u32		*cache;
+};
+
+
+u8   eeprom_readb(struct eeprom *ee, unsigned address);
+void eeprom_read(struct eeprom *ee, unsigned address, u8 *bytes,
+		unsigned count);
+void eeprom_writeb(struct eeprom *ee, unsigned address, u8 data);
+void eeprom_write(struct eeprom *ee, unsigned address, u8 *bytes,
+		unsigned count);
+
+/* The EEPROM commands include the alway-set leading bit. */
+enum EEPROM_Cmds {
+        EE_WriteCmd=(5 << 6), EE_ReadCmd=(6 << 6), EE_EraseCmd=(7 << 6),
+};
+
+void setup_ee_mem_bitbanger(struct eeprom *ee, long memaddr, int eesel_bit, int eeclk_bit, int eedo_bit, int eedi_bit, unsigned polarity)
+{
+	ee->addr = memaddr;
+	ee->eesel = 1 << eesel_bit;
+	ee->eeclk = 1 << eeclk_bit;
+	ee->eedo = 1 << eedo_bit;
+	ee->eedi = 1 << eedi_bit;
+
+	ee->polarity = polarity;
+
+	*ee->cache = readl(ee->addr);
+}
+
+/* foo. put this in a .c file */
+static inline void eeprom_update(struct eeprom *ee, u32 mask, int pol)
+{
+	long flags;
+	u32 data;
+
+	spin_lock_irqsave(ee->lock, flags);
+	data = *ee->cache;
+
+	data &= ~mask;
+	if (pol)
+		data |= mask;
+
+	*ee->cache = data;
+//printk("update: %08x\n", data);
+	writel(data, ee->addr);
+	spin_unlock_irqrestore(ee->lock, flags);
+}
+
+void eeprom_clk_lo(struct eeprom *ee)
+{
+	int pol = !!(ee->polarity & EEPOL_EECLK);
+
+	eeprom_update(ee, ee->eeclk, pol);
+	udelay(2);
+}
+
+void eeprom_clk_hi(struct eeprom *ee)
+{
+	int pol = !!(ee->polarity & EEPOL_EECLK);
+
+	eeprom_update(ee, ee->eeclk, !pol);
+	udelay(2);
+}
+
+void eeprom_send_addr(struct eeprom *ee, unsigned address)
+{
+	int pol = !!(ee->polarity & EEPOL_EEDI);
+	unsigned i;
+	address |= 6 << 6;
+
+        /* Shift the read command bits out. */
+        for (i=0; i<11; i++) {
+		eeprom_update(ee, ee->eedi, ((address >> 10) & 1) ^ pol);
+		address <<= 1;
+		eeprom_clk_hi(ee);
+		eeprom_clk_lo(ee);
+        }
+	eeprom_update(ee, ee->eedi, pol);
+}
+
+u16   eeprom_readw(struct eeprom *ee, unsigned address)
+{
+	unsigned i;
+	u16	res = 0;
+
+	eeprom_clk_lo(ee);
+	eeprom_update(ee, ee->eesel, 1 ^ !!(ee->polarity & EEPOL_EESEL));
+	eeprom_send_addr(ee, address);
+
+	for (i=0; i<16; i++) {
+		u32 data;
+		eeprom_clk_hi(ee);
+		res <<= 1;
+		data = readl(ee->addr);
+//printk("eeprom_readw: %08x\n", data);
+		res |= !!(data & ee->eedo) ^ !!(ee->polarity & EEPOL_EEDO);
+		eeprom_clk_lo(ee);
+	}
+	eeprom_update(ee, ee->eesel, 0 ^ !!(ee->polarity & EEPOL_EESEL));
+
+	return res;
+}
+
+
+void eeprom_writeb(struct eeprom *ee, unsigned address, u8 data)
+{
+}
diff -urN v2.4.6/include/linux/skbuff.h linux-skbhacks1/include/linux/skbuff.h
--- v2.4.6/include/linux/skbuff.h	Tue Jul  3 18:43:04 2001
+++ linux-skbhacks1/include/linux/skbuff.h	Sun Jul 15 10:56:16 2001
@@ -22,6 +22,7 @@
 
 #include <asm/atomic.h>
 #include <asm/types.h>
+#include <asm/skbuff.h>
 #include <linux/spinlock.h>
 #include <linux/mm.h>
 #include <linux/highmem.h>
@@ -787,9 +788,7 @@
 	SKB_LINEAR_ASSERT(skb);
 	skb->tail+=len;
 	skb->len+=len;
-	if(skb->tail>skb->end) {
-		skb_over_panic(skb, len, current_text_addr());
-	}
+	arch_skb_over_check(skb, len);
 	return tmp;
 }
 
@@ -814,9 +813,7 @@
 {
 	skb->data-=len;
 	skb->len+=len;
-	if(skb->data<skb->head) {
-		skb_under_panic(skb, len, current_text_addr());
-	}
+	arch_skb_under_check(skb, len);
 	return skb->data;
 }