r1002 - trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches
Joshua Kwan
joshk@haydn.debian.org
Wed, 11 Aug 2004 02:36:29 -0600
Author: joshk
Date: 2004-08-11 02:36:00 -0600 (Wed, 11 Aug 2004)
New Revision: 1002
Modified:
trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/004_386_emu.diff
trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/patch-2.4.26-1
Log:
get everything to apply, and remove some already applied stuff
Modified: trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/004_386_emu.diff
===================================================================
--- trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/004_386_emu.diff 2004-08-11 08:10:45 UTC (rev 1001)
+++ trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/004_386_emu.diff 2004-08-11 08:36:00 UTC (rev 1002)
@@ -49,12 +49,11 @@
else
define_bool CONFIG_X86_WP_WORKS_OK y
define_bool CONFIG_X86_INVLPG y
-@@ -224,7 +225,10 @@
+@@ -224,7 +225,9 @@
bool 'Math emulation' CONFIG_MATH_EMULATION
bool 'MTRR (Memory Type Range Register) support' CONFIG_MTRR
-bool 'Symmetric multi-processing support' CONFIG_SMP
-+bool 'Support for big physical area reservation' CONFIG_BIGPHYS_AREA
+if [ "$CONFIG_CPU_EMU486" != "y" ]; then
+ bool 'Symmetric multi-processing support' CONFIG_SMP
+fi
Modified: trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/patch-2.4.26-1
===================================================================
--- trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/patch-2.4.26-1 2004-08-11 08:10:45 UTC (rev 1001)
+++ trunk/kernel-2.4/source/kernel-source-2.4.27-2.4.27/debian/patches/patch-2.4.26-1 2004-08-11 08:36:00 UTC (rev 1002)
@@ -7017,524 +7017,6 @@
#else
(-1),(-1)
#endif
-diff -urN kernel-source-2.4.26/drivers/sound/i810_audio.c kernel-source-2.4.26-1/drivers/sound/i810_audio.c
---- kernel-source-2.4.26/drivers/sound/i810_audio.c 2004-04-14 23:05:32.000000000 +1000
-+++ kernel-source-2.4.26-1/drivers/sound/i810_audio.c 2004-04-17 14:23:59.000000000 +1000
-@@ -99,6 +99,7 @@
- #include <linux/spinlock.h>
- #include <linux/smp_lock.h>
- #include <linux/ac97_codec.h>
-+#include <linux/bitops.h>
- #include <asm/uaccess.h>
- #include <asm/hardirq.h>
-
-@@ -148,6 +149,9 @@
- #define PCI_DEVICE_ID_AMD_8111_AC97 0x746d
- #endif
-
-+#define MODULOP2(a, b) ((a) & ((b) - 1))
-+#define MASKP2(a, b) ((a) & ~((b) - 1))
-+
- static int ftsodell;
- static int strict_clocking;
- static unsigned int clocking;
-@@ -209,6 +213,7 @@
-
- #define ENUM_ENGINE(PRE,DIG) \
- enum { \
-+ PRE##_BASE = 0x##DIG##0, /* Base Address */ \
- PRE##_BDBAR = 0x##DIG##0, /* Buffer Descriptor list Base Address */ \
- PRE##_CIV = 0x##DIG##4, /* Current Index Value */ \
- PRE##_LVI = 0x##DIG##5, /* Last Valid Index */ \
-@@ -491,8 +496,12 @@
- /* extract register offset from codec struct */
- #define IO_REG_OFF(codec) (((struct i810_card *) codec->private_data)->ac97_id_map[codec->id])
-
-+#define GET_CIV(port) MODULOP2(inb((port) + OFF_CIV), SG_LEN)
-+#define GET_LVI(port) MODULOP2(inb((port) + OFF_LVI), SG_LEN)
-+
- /* set LVI from CIV */
--#define CIV_TO_LVI(port, off) outb((inb(port+OFF_CIV)+off) & 31, port+OFF_LVI)
-+#define CIV_TO_LVI(port, off) \
-+ outb(MODULOP2(GET_CIV((port)) + (off), SG_LEN), (port) + OFF_LVI)
-
- static struct i810_card *devs = NULL;
-
-@@ -762,7 +771,7 @@
- port_picb = port + OFF_PICB;
-
- do {
-- civ = inb(port+OFF_CIV) & 31;
-+ civ = GET_CIV(port);
- offset = inw(port_picb);
- /* Must have a delay here! */
- if(offset == 0)
-@@ -782,7 +791,7 @@
- * that we won't have to worry about the chip still being
- * out of sync with reality ;-)
- */
-- } while (civ != (inb(port+OFF_CIV) & 31) || offset != inw(port_picb));
-+ } while (civ != GET_CIV(port) || offset != inw(port_picb));
-
- return (((civ + 1) * dmabuf->fragsize - (bytes * offset))
- % dmabuf->dmasize);
-@@ -992,6 +1001,7 @@
- dmabuf->numfrag = SG_LEN;
- dmabuf->fragsize = dmabuf->dmasize/dmabuf->numfrag;
- dmabuf->fragsamples = dmabuf->fragsize >> 1;
-+ dmabuf->fragshift = ffs(dmabuf->fragsize) - 1;
- dmabuf->userfragsize = dmabuf->ossfragsize;
- dmabuf->userfrags = dmabuf->dmasize/dmabuf->ossfragsize;
-
-@@ -999,16 +1009,12 @@
-
- if(dmabuf->ossmaxfrags == 4) {
- fragint = 8;
-- dmabuf->fragshift = 2;
- } else if (dmabuf->ossmaxfrags == 8) {
- fragint = 4;
-- dmabuf->fragshift = 3;
- } else if (dmabuf->ossmaxfrags == 16) {
- fragint = 2;
-- dmabuf->fragshift = 4;
- } else {
- fragint = 1;
-- dmabuf->fragshift = 5;
- }
- /*
- * Now set up the ring
-@@ -1072,41 +1078,41 @@
- {
- struct dmabuf *dmabuf = &state->dmabuf;
- int x, port;
--
-+ int trigger;
-+ int count, fragsize;
-+ void (*start)(struct i810_state *);
-+
-+ count = dmabuf->count;
- port = state->card->iobase;
-- if(rec)
-+ if (rec) {
- port += dmabuf->read_channel->port;
-- else
-+ trigger = PCM_ENABLE_INPUT;
-+ start = __start_adc;
-+ count = dmabuf->dmasize - count;
-+ } else {
- port += dmabuf->write_channel->port;
-+ trigger = PCM_ENABLE_OUTPUT;
-+ start = __start_dac;
-+ }
-+
-+ /* Do not process partial fragments. */
-+ fragsize = dmabuf->fragsize;
-+ if (count < fragsize)
-+ return;
-
-- /* if we are currently stopped, then our CIV is actually set to our
-- * *last* sg segment and we are ready to wrap to the next. However,
-- * if we set our LVI to the last sg segment, then it won't wrap to
-- * the next sg segment, it won't even get a start. So, instead, when
-- * we are stopped, we set both the LVI value and also we increment
-- * the CIV value to the next sg segment to be played so that when
-- * we call start_{dac,adc}, things will operate properly
-- */
- if (!dmabuf->enable && dmabuf->ready) {
-- if(rec && dmabuf->count < dmabuf->dmasize &&
-- (dmabuf->trigger & PCM_ENABLE_INPUT))
-- {
-- CIV_TO_LVI(port, 1);
-- __start_adc(state);
-- while( !(inb(port + OFF_CR) & ((1<<4) | (1<<2))) ) ;
-- } else if (!rec && dmabuf->count &&
-- (dmabuf->trigger & PCM_ENABLE_OUTPUT))
-- {
-- CIV_TO_LVI(port, 1);
-- __start_dac(state);
-- while( !(inb(port + OFF_CR) & ((1<<4) | (1<<2))) ) ;
-- }
-+ if (!(dmabuf->trigger & trigger))
-+ return;
-+
-+ start(state);
-+ while (!(inb(port + OFF_CR) & ((1<<4) | (1<<2))))
-+ ;
- }
-
-- /* swptr - 1 is the tail of our transfer */
-- x = (dmabuf->dmasize + dmabuf->swptr - 1) % dmabuf->dmasize;
-- x /= dmabuf->fragsize;
-- outb(x, port+OFF_LVI);
-+ /* MASKP2(swptr, fragsize) - 1 is the tail of our transfer */
-+ x = MODULOP2(MASKP2(dmabuf->swptr, fragsize) - 1, dmabuf->dmasize);
-+ x >>= dmabuf->fragshift;
-+ outb(x, port + OFF_LVI);
- }
-
- static void i810_update_lvi(struct i810_state *state, int rec)
-@@ -1126,13 +1132,17 @@
- {
- struct dmabuf *dmabuf = &state->dmabuf;
- unsigned hwptr;
-+ unsigned fragmask, dmamask;
- int diff;
-
-- /* error handling and process wake up for DAC */
-+ fragmask = MASKP2(~0, dmabuf->fragsize);
-+ dmamask = MODULOP2(~0, dmabuf->dmasize);
-+
-+ /* error handling and process wake up for ADC */
- if (dmabuf->enable == ADC_RUNNING) {
- /* update hardware pointer */
-- hwptr = i810_get_dma_addr(state, 1);
-- diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
-+ hwptr = i810_get_dma_addr(state, 1) & fragmask;
-+ diff = (hwptr - dmabuf->hwptr) & dmamask;
- #if defined(DEBUG_INTERRUPTS) || defined(DEBUG_MMAP)
- printk("ADC HWP %d,%d,%d\n", hwptr, dmabuf->hwptr, diff);
- #endif
-@@ -1144,20 +1154,20 @@
- /* this is normal for the end of a read */
- /* only give an error if we went past the */
- /* last valid sg entry */
-- if((inb(state->card->iobase + PI_CIV) & 31) !=
-- (inb(state->card->iobase + PI_LVI) & 31)) {
-+ if (GET_CIV(state->card->iobase + PI_BASE) !=
-+ GET_LVI(state->card->iobase + PI_BASE)) {
- printk(KERN_WARNING "i810_audio: DMA overrun on read\n");
- dmabuf->error++;
- }
- }
-- if (dmabuf->count > dmabuf->userfragsize)
-+ if (diff)
- wake_up(&dmabuf->wait);
- }
- /* error handling and process wake up for DAC */
- if (dmabuf->enable == DAC_RUNNING) {
- /* update hardware pointer */
-- hwptr = i810_get_dma_addr(state, 0);
-- diff = (dmabuf->dmasize + hwptr - dmabuf->hwptr) % dmabuf->dmasize;
-+ hwptr = i810_get_dma_addr(state, 0) & fragmask;
-+ diff = (hwptr - dmabuf->hwptr) & dmamask;
- #if defined(DEBUG_INTERRUPTS) || defined(DEBUG_MMAP)
- printk("DAC HWP %d,%d,%d\n", hwptr, dmabuf->hwptr, diff);
- #endif
-@@ -1169,18 +1179,18 @@
- /* this is normal for the end of a write */
- /* only give an error if we went past the */
- /* last valid sg entry */
-- if((inb(state->card->iobase + PO_CIV) & 31) !=
-- (inb(state->card->iobase + PO_LVI) & 31)) {
-+ if (GET_CIV(state->card->iobase + PO_BASE) !=
-+ GET_LVI(state->card->iobase + PO_BASE)) {
- printk(KERN_WARNING "i810_audio: DMA overrun on write\n");
- printk("i810_audio: CIV %d, LVI %d, hwptr %x, "
- "count %d\n",
-- inb(state->card->iobase + PO_CIV) & 31,
-- inb(state->card->iobase + PO_LVI) & 31,
-+ GET_CIV(state->card->iobase + PO_BASE),
-+ GET_LVI(state->card->iobase + PO_BASE),
- dmabuf->hwptr, dmabuf->count);
- dmabuf->error++;
- }
- }
-- if (dmabuf->count < (dmabuf->dmasize-dmabuf->userfragsize))
-+ if (diff)
- wake_up(&dmabuf->wait);
- }
- }
-@@ -1197,7 +1207,6 @@
- dmabuf->swptr = dmabuf->hwptr;
- }
- free = dmabuf->dmasize - dmabuf->count;
-- free -= (dmabuf->hwptr % dmabuf->fragsize);
- if(free < 0)
- return(0);
- return(free);
-@@ -1215,12 +1224,27 @@
- dmabuf->swptr = dmabuf->hwptr;
- }
- avail = dmabuf->count;
-- avail -= (dmabuf->hwptr % dmabuf->fragsize);
- if(avail < 0)
- return(0);
- return(avail);
- }
-
-+static inline void fill_partial_frag(struct dmabuf *dmabuf)
-+{
-+ unsigned fragsize;
-+ unsigned swptr, len;
-+
-+ fragsize = dmabuf->fragsize;
-+ swptr = dmabuf->swptr;
-+ len = fragsize - MODULOP2(dmabuf->swptr, fragsize);
-+ if (len == fragsize)
-+ return;
-+
-+ memset(dmabuf->rawbuf + swptr, '\0', len);
-+ dmabuf->swptr = MODULOP2(swptr + len, dmabuf->dmasize);
-+ dmabuf->count += len;
-+}
-+
- static int drain_dac(struct i810_state *state, int signals_allowed)
- {
- DECLARE_WAITQUEUE(wait, current);
-@@ -1235,30 +1259,28 @@
- stop_dac(state);
- return 0;
- }
-+
-+ spin_lock_irqsave(&state->card->lock, flags);
-+
-+ fill_partial_frag(dmabuf);
-+
-+ /*
-+ * This will make sure that our LVI is correct, that our
-+ * pointer is updated, and that the DAC is running. We
-+ * have to force the setting of dmabuf->trigger to avoid
-+ * any possible deadlocks.
-+ */
-+ dmabuf->trigger = PCM_ENABLE_OUTPUT;
-+ __i810_update_lvi(state, 0);
-+
-+ spin_unlock_irqrestore(&state->card->lock, flags);
-+
- add_wait_queue(&dmabuf->wait, &wait);
- for (;;) {
-
- spin_lock_irqsave(&state->card->lock, flags);
- i810_update_ptr(state);
- count = dmabuf->count;
-- spin_unlock_irqrestore(&state->card->lock, flags);
--
-- if (count <= 0)
-- break;
--
-- /*
-- * This will make sure that our LVI is correct, that our
-- * pointer is updated, and that the DAC is running. We
-- * have to force the setting of dmabuf->trigger to avoid
-- * any possible deadlocks.
-- */
-- if(!dmabuf->enable) {
-- dmabuf->trigger = PCM_ENABLE_OUTPUT;
-- i810_update_lvi(state,0);
-- }
-- if (signal_pending(current) && signals_allowed) {
-- break;
-- }
-
- /* It seems that we have to set the current state to
- * TASK_INTERRUPTIBLE every time to make the process
-@@ -1269,7 +1291,17 @@
- * instead of actually sleeping and waiting for an
- * interrupt to wake us up!
- */
-- set_current_state(TASK_INTERRUPTIBLE);
-+ __set_current_state(signals_allowed ?
-+ TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
-+ spin_unlock_irqrestore(&state->card->lock, flags);
-+
-+ if (count <= 0)
-+ break;
-+
-+ if (signal_pending(current) && signals_allowed) {
-+ break;
-+ }
-+
- /*
- * set the timeout to significantly longer than it *should*
- * take for the DAC to drain the DMA buffer
-@@ -1350,11 +1382,10 @@
- if(status & DMA_INT_DCH)
- printk("DCH -");
- #endif
-- if(dmabuf->enable & DAC_RUNNING)
-- count = dmabuf->count;
-- else
-- count = dmabuf->dmasize - dmabuf->count;
-- if(count > 0) {
-+ count = dmabuf->count;
-+ if(dmabuf->enable & ADC_RUNNING)
-+ count = dmabuf->dmasize - count;
-+ if (count >= (int)dmabuf->fragsize) {
- outb(inb(port+OFF_CR) | 1, port+OFF_CR);
- #ifdef DEBUG_INTERRUPTS
- printk(" CONTINUE ");
-@@ -1417,6 +1448,7 @@
- unsigned long flags;
- unsigned int swptr;
- int cnt;
-+ int pending;
- DECLARE_WAITQUEUE(waita, current);
-
- #ifdef DEBUG2
-@@ -1442,6 +1474,8 @@
- return -EFAULT;
- ret = 0;
-
-+ pending = 0;
-+
- add_wait_queue(&dmabuf->wait, &waita);
- while (count > 0) {
- set_current_state(TASK_INTERRUPTIBLE);
-@@ -1455,8 +1489,8 @@
- }
- continue;
- }
-- swptr = dmabuf->swptr;
- cnt = i810_get_available_read_data(state);
-+ swptr = dmabuf->swptr;
- // this is to make the copy_to_user simpler below
- if(cnt > (dmabuf->dmasize - swptr))
- cnt = dmabuf->dmasize - swptr;
-@@ -1464,15 +1498,6 @@
-
- if (cnt > count)
- cnt = count;
-- /* Lop off the last two bits to force the code to always
-- * write in full samples. This keeps software that sets
-- * O_NONBLOCK but doesn't check the return value of the
-- * write call from getting things out of state where they
-- * think a full 4 byte sample was written when really only
-- * a portion was, resulting in odd sound and stereo
-- * hysteresis.
-- */
-- cnt &= ~0x3;
- if (cnt <= 0) {
- unsigned long tmo;
- /*
-@@ -1526,7 +1551,7 @@
- goto done;
- }
-
-- swptr = (swptr + cnt) % dmabuf->dmasize;
-+ swptr = MODULOP2(swptr + cnt, dmabuf->dmasize);
-
- spin_lock_irqsave(&card->lock, flags);
-
-@@ -1535,7 +1560,7 @@
- continue;
- }
- dmabuf->swptr = swptr;
-- dmabuf->count -= cnt;
-+ pending = dmabuf->count -= cnt;
- spin_unlock_irqrestore(&card->lock, flags);
-
- count -= cnt;
-@@ -1543,7 +1568,9 @@
- ret += cnt;
- }
- done:
-- i810_update_lvi(state,1);
-+ pending = dmabuf->dmasize - pending;
-+ if (dmabuf->enable || pending >= dmabuf->userfragsize)
-+ i810_update_lvi(state, 1);
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&dmabuf->wait, &waita);
-
-@@ -1560,7 +1587,8 @@
- ssize_t ret;
- unsigned long flags;
- unsigned int swptr = 0;
-- int cnt, x;
-+ int pending;
-+ int cnt;
- DECLARE_WAITQUEUE(waita, current);
-
- #ifdef DEBUG2
-@@ -1585,6 +1613,8 @@
- return -EFAULT;
- ret = 0;
-
-+ pending = 0;
-+
- add_wait_queue(&dmabuf->wait, &waita);
- while (count > 0) {
- set_current_state(TASK_INTERRUPTIBLE);
-@@ -1599,8 +1629,8 @@
- continue;
- }
-
-- swptr = dmabuf->swptr;
- cnt = i810_get_free_write_space(state);
-+ swptr = dmabuf->swptr;
- /* Bound the maximum size to how much we can copy to the
- * dma buffer before we hit the end. If we have more to
- * copy then it will get done in a second pass of this
-@@ -1615,15 +1645,6 @@
- #endif
- if (cnt > count)
- cnt = count;
-- /* Lop off the last two bits to force the code to always
-- * write in full samples. This keeps software that sets
-- * O_NONBLOCK but doesn't check the return value of the
-- * write call from getting things out of state where they
-- * think a full 4 byte sample was written when really only
-- * a portion was, resulting in odd sound and stereo
-- * hysteresis.
-- */
-- cnt &= ~0x3;
- if (cnt <= 0) {
- unsigned long tmo;
- // There is data waiting to be played
-@@ -1668,7 +1689,7 @@
- goto ret;
- }
-
-- swptr = (swptr + cnt) % dmabuf->dmasize;
-+ swptr = MODULOP2(swptr + cnt, dmabuf->dmasize);
-
- spin_lock_irqsave(&state->card->lock, flags);
- if (PM_SUSPENDED(card)) {
-@@ -1677,19 +1698,16 @@
- }
-
- dmabuf->swptr = swptr;
-- dmabuf->count += cnt;
-+ pending = dmabuf->count += cnt;
-
- count -= cnt;
- buffer += cnt;
- ret += cnt;
- spin_unlock_irqrestore(&state->card->lock, flags);
- }
-- if (swptr % dmabuf->fragsize) {
-- x = dmabuf->fragsize - (swptr % dmabuf->fragsize);
-- memset(dmabuf->rawbuf + swptr, '\0', x);
-- }
- ret:
-- i810_update_lvi(state,0);
-+ if (dmabuf->enable || pending >= dmabuf->userfragsize)
-+ i810_update_lvi(state, 0);
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&dmabuf->wait, &waita);
-
-@@ -2202,10 +2220,10 @@
- dmabuf->swptr = dmabuf->hwptr;
- dmabuf->count = i810_get_free_write_space(state);
- dmabuf->swptr = (dmabuf->swptr + dmabuf->count) % dmabuf->dmasize;
-- __i810_update_lvi(state, 0);
- spin_unlock_irqrestore(&state->card->lock, flags);
-- } else
-- start_dac(state);
-+ }
-+ i810_update_lvi(state, 0);
-+ start_dac(state);
- }
- if((file->f_mode & FMODE_READ) && (val & PCM_ENABLE_INPUT) && !(dmabuf->enable & ADC_RUNNING)) {
- if (!dmabuf->read_channel) {
-@@ -3065,7 +3083,7 @@
- goto config_out;
- }
- dmabuf->count = dmabuf->dmasize;
-- CIV_TO_LVI(card->iobase+dmabuf->write_channel->port, 31);
-+ CIV_TO_LVI(card->iobase+dmabuf->write_channel->port, -1);
- save_flags(flags);
- cli();
- start_dac(state);
diff -urN kernel-source-2.4.26/drivers/sound/nm256.h kernel-source-2.4.26-1/drivers/sound/nm256.h
--- kernel-source-2.4.26/drivers/sound/nm256.h 2000-12-12 08:02:32.000000000 +1100
+++ kernel-source-2.4.26-1/drivers/sound/nm256.h 2001-10-20 16:47:17.000000000 +1000
@@ -7632,144 +7114,6 @@
FILL_CONTROL_URB(&hid->urbout, dev, usb_sndctrlpipe(dev, 0),
(void*) &hid->out[0].dr, hid->out[0].buffer, 1, hid_ctrl, hid);
-diff -urN kernel-source-2.4.26/drivers/usb/hiddev.c kernel-source-2.4.26-1/drivers/usb/hiddev.c
---- kernel-source-2.4.26/drivers/usb/hiddev.c 2004-04-14 23:05:32.000000000 +1000
-+++ kernel-source-2.4.26-1/drivers/usb/hiddev.c 2004-04-17 14:24:00.000000000 +1000
-@@ -433,7 +433,9 @@
- dinfo.product = dev->descriptor.idProduct;
- dinfo.version = dev->descriptor.bcdDevice;
- dinfo.num_applications = hid->maxapplication;
-- return copy_to_user((void *) arg, &dinfo, sizeof(dinfo));
-+ if (copy_to_user((void *) arg, &dinfo, sizeof(dinfo)))
-+ return -EFAULT;
-+ return 0;
-
- case HIDIOCGFLAG:
- return put_user(list->flags, (int *) arg);
-@@ -522,7 +524,9 @@
-
- rinfo.num_fields = report->maxfield;
-
-- return copy_to_user((void *) arg, &rinfo, sizeof(rinfo));
-+ if (copy_to_user((void *) arg, &rinfo, sizeof(rinfo)))
-+ return -EFAULT;
-+ return 0;
-
- case HIDIOCGFIELDINFO:
- if (copy_from_user(&finfo, (void *) arg, sizeof(finfo)))
-@@ -552,32 +556,16 @@
- finfo.unit_exponent = field->unit_exponent;
- finfo.unit = field->unit;
-
-- return copy_to_user((void *) arg, &finfo, sizeof(finfo));
--
-- case HIDIOCGUCODE:
-- if (copy_from_user(uref, (void *) arg, sizeof(*uref)))
-+ if (copy_to_user((void *) arg, &finfo, sizeof(finfo)))
- return -EFAULT;
-
-- rinfo.report_type = uref->report_type;
-- rinfo.report_id = uref->report_id;
-- if ((report = hiddev_lookup_report(hid, &rinfo)) == NULL)
-- return -EINVAL;
--
-- if (uref->field_index >= report->maxfield)
-- return -EINVAL;
--
-- field = report->field[uref->field_index];
-- if (uref->usage_index >= field->maxusage)
-- return -EINVAL;
--
-- uref->usage_code = field->usage[uref->usage_index].hid;
--
-- return copy_to_user((void *) arg, uref, sizeof(*uref));
-+ return 0;
-
- case HIDIOCGUSAGE:
- case HIDIOCSUSAGE:
- case HIDIOCGUSAGES:
- case HIDIOCSUSAGES:
-+ case HIDIOCGUCODE:
- case HIDIOCGCOLLECTIONINDEX:
- if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) {
- if (copy_from_user(&uref_multi, (void *) arg,
-@@ -593,7 +581,8 @@
- uref->report_type == HID_REPORT_TYPE_INPUT)
- return -EINVAL;
-
-- if (uref->report_id == HID_REPORT_ID_UNKNOWN) {
-+ if (cmd != HIDIOCGUCODE &&
-+ uref->report_id == HID_REPORT_ID_UNKNOWN) {
- field = hiddev_lookup_usage(hid, uref);
- if (field == NULL)
- return -EINVAL;
-@@ -607,26 +596,34 @@
- return -EINVAL;
-
- field = report->field[uref->field_index];
-- if (uref->usage_index >= field->maxusage)
-- return -EINVAL;
--
-- if (cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) {
-- if (uref_multi.num_values >= HID_MAX_USAGES ||
-- uref->usage_index >= field->maxusage ||
-- (uref->usage_index + uref_multi.num_values) >= field->maxusage)
-+ if (cmd == HIDIOCGUCODE ||
-+ cmd == HIDIOCGCOLLECTIONINDEX) {
-+ if (uref->usage_index >= field->maxusage)
- return -EINVAL;
-- }
-+ } else if (uref->usage_index >= field->report_count)
-+ return -EINVAL;
-+ else if ((cmd == HIDIOCGUSAGES ||
-+ cmd == HIDIOCSUSAGES) &&
-+ (uref->usage_index + uref_multi.num_values >=
-+ field->report_count ||
-+ uref->usage_index + uref_multi.num_values <
-+ uref->usage_index))
-+ return -EINVAL;
- }
-
- switch (cmd) {
- case HIDIOCGUSAGE:
- uref->value = field->value[uref->usage_index];
-- return copy_to_user((void *) arg, uref, sizeof(*uref));
-+ break;
-
- case HIDIOCSUSAGE:
- field->value[uref->usage_index] = uref->value;
- return 0;
-
-+ case HIDIOCGUCODE:
-+ uref->usage_code = field->usage[uref->usage_index].hid;
-+ break;
-+
- case HIDIOCGCOLLECTIONINDEX:
- return field->usage[uref->usage_index].collection_index;
- case HIDIOCGUSAGES:
-@@ -643,7 +640,10 @@
- uref_multi.values[i];
- return 0;
- }
-- break;
-+
-+ if (copy_to_user((void *) arg, uref, sizeof(*uref)))
-+ return -EFAULT;
-+ return 0;
-
- case HIDIOCGCOLLECTIONINFO:
- if (copy_from_user(&cinfo, (void *) arg, sizeof(cinfo)))
-@@ -656,7 +656,9 @@
- cinfo.usage = hid->collection[cinfo.index].usage;
- cinfo.level = hid->collection[cinfo.index].level;
-
-- return copy_to_user((void *) arg, &cinfo, sizeof(cinfo));
-+ if (copy_to_user((void *) arg, &cinfo, sizeof(cinfo)))
-+ return -EFAULT;
-+ return 0;
-
- default:
-
diff -urN kernel-source-2.4.26/drivers/usb/host/usb-ohci.c kernel-source-2.4.26-1/drivers/usb/host/usb-ohci.c
--- kernel-source-2.4.26/drivers/usb/host/usb-ohci.c 2004-04-14 23:05:33.000000000 +1000
+++ kernel-source-2.4.26-1/drivers/usb/host/usb-ohci.c 2004-04-17 14:24:00.000000000 +1000
@@ -20888,7 +20232,6 @@
#include <linux/ctype.h>
#include <linux/file.h>
#include <linux/iobuf.h>
-
@@ -109,12 +113,15 @@
EXPORT_SYMBOL(kmem_cache_alloc);
EXPORT_SYMBOL(kmem_cache_free);