--- /dev/null
+From 3ca5de6dd4ec5a139b2b8f00dce3e4726ca91af1 Mon Sep 17 00:00:00 2001
+From: Dmitry Torokhov <dtor@insightbb.com>
+Date: Wed, 7 Mar 2007 23:20:55 -0500
+Subject: Input: i8042 - another attempt to fix AUX delivery checks
+
+Do not assume that AUX_LOOP command is broken unless it
+completes successfully but returns wrong (unexpected) data.
+
+Cc: Chuck Ebbert <cebbert@redhat.com>
+Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/input/serio/i8042.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+--- a/drivers/input/serio/i8042.c
++++ b/drivers/input/serio/i8042.c
+@@ -560,7 +560,8 @@ static int __devinit i8042_check_aux(voi
+ */
+
+ param = 0x5a;
+- if (i8042_command(¶m, I8042_CMD_AUX_LOOP) || param != 0x5a) {
++ retval = i8042_command(¶m, I8042_CMD_AUX_LOOP);
++ if (retval || param != 0x5a) {
+
+ /*
+ * External connection test - filters out AT-soldered PS/2 i8042's
+@@ -574,7 +575,12 @@ static int __devinit i8042_check_aux(voi
+ (param && param != 0xfa && param != 0xff))
+ return -1;
+
+- aux_loop_broken = 1;
++/*
++ * If AUX_LOOP completed without error but returned unexpected data
++ * mark it as broken
++ */
++ if (!retval)
++ aux_loop_broken = 1;
+ }
+
+ /*
--- /dev/null
+From stable-bounces@linux.kernel.org Mon Mar 19 21:12:09 2007
+From: Kai Makisara <Kai.Makisara@kolumbus.fi>
+Date: Mon, 19 Mar 2007 16:58:57 -0700
+Subject: st: fix Tape dies if wrong block size used, bug 7919
+To: stable@kernel.org
+Cc: James Bottomley <James.Bottomley@steeleye.com>, Andreas Steinmetz <ast@domdv.de>, Kai Makisara <Kai.Makisara@kolumbus.fi>
+Message-ID: <20070319165857.c9187906.akpm@linux-foundation.org>
+
+From: Kai Makisara <Kai.Makisara@kolumbus.fi>
+
+[SCSI] st: fix Tape dies if wrong block size used, bug 7919
+
+On Thu, 1 Feb 2007, Andrew Morton wrote:
+> On Thu, 1 Feb 2007 15:34:29 -0800
+> bugme-daemon@bugzilla.kernel.org wrote:
+>
+> > http://bugzilla.kernel.org/show_bug.cgi?id=7919
+> >
+> > Summary: Tape dies if wrong block size used
+> > Kernel Version: 2.6.20-rc5
+> > Status: NEW
+> > Severity: normal
+> > Owner: scsi_drivers-other@kernel-bugs.osdl.org
+> > Submitter: dmartin@sccd.ctc.edu
+> >
+> >
+> > Most recent kernel where this bug did *NOT* occur: 2.6.17.14
+> >
+> > Other Kernels Tested and Results:
+> >
+> > OK 2.6.15.7
+> > OK 2.6.16.37
+> > OK 2.6.17.14
+> > BAD 2.6.18.6
+> > BAD 2.6.18-1.2869.fc6
+> > BAD 2.6.19.2 +
+> > BAD 2.6.20-rc5
+> >
+> > NOTE: 2.6.18-1.2869.fc6 is a Fedora modified kernel, all others are from kernel.org
+> >
+...
+> > Steps to reproduce:
+> > Get a Adaptec AHA-2940U/UW/D / AIC-7881U card and a tape drive,
+> > install a recent kernel
+> > set the tape block size - mt setblk 4096
+> > read from or write to tape using wrong block size - tar -b 7 -cvf /dev/tape foo
+> >
+Write does not trigger this bug because the driver refuses in fixed block
+mode writes that are not a multiple of the block size. Read does trigger
+it in my system.
+
+The bug is not associated with any specific HBA. st tries to do direct i/o
+in fixed block mode with reads that are not a multiple of tape block size.
+
+The patch in this message fixes the st problem by switching to using the
+driver buffer up to the next close of the device file in fixed block mode
+if the user asks for a read like this.
+
+I don't know why the bug has surfaced only after 2.6.17 although the st
+problem is old. There may be another bug in the block subsystem and this
+patch works around it. However, the patch fixes a problem in st and in
+this way it is a valid fix.
+
+This patch may also fix the bug 7900.
+
+The patch compiles and is lightly tested.
+
+Signed-off-by: Kai Makisara <kai.makisara@kolumbus.fi>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/scsi/st.c | 23 +++++++++++++----------
+ drivers/scsi/st.h | 3 ++-
+ 2 files changed, 15 insertions(+), 11 deletions(-)
+
+--- a/drivers/scsi/st.c
++++ b/drivers/scsi/st.c
+@@ -9,7 +9,7 @@
+ Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky,
+ Michael Schaefer, J"org Weule, and Eric Youngdale.
+
+- Copyright 1992 - 2006 Kai Makisara
++ Copyright 1992 - 2007 Kai Makisara
+ email Kai.Makisara@kolumbus.fi
+
+ Some small formal changes - aeb, 950809
+@@ -17,7 +17,7 @@
+ Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
+ */
+
+-static const char *verstr = "20061107";
++static const char *verstr = "20070203";
+
+ #include <linux/module.h>
+
+@@ -1168,6 +1168,7 @@ static int st_open(struct inode *inode,
+ STps = &(STp->ps[i]);
+ STps->rw = ST_IDLE;
+ }
++ STp->try_dio_now = STp->try_dio;
+ STp->recover_count = 0;
+ DEB( STp->nbr_waits = STp->nbr_finished = 0;
+ STp->nbr_requests = STp->nbr_dio = STp->nbr_pages = STp->nbr_combinable = 0; )
+@@ -1400,9 +1401,9 @@ static int setup_buffering(struct scsi_t
+ struct st_buffer *STbp = STp->buffer;
+
+ if (is_read)
+- i = STp->try_dio && try_rdio;
++ i = STp->try_dio_now && try_rdio;
+ else
+- i = STp->try_dio && try_wdio;
++ i = STp->try_dio_now && try_wdio;
+
+ if (i && ((unsigned long)buf & queue_dma_alignment(
+ STp->device->request_queue)) == 0) {
+@@ -1599,7 +1600,7 @@ st_write(struct file *filp, const char _
+ STm->do_async_writes && STps->eof < ST_EOM_OK;
+
+ if (STp->block_size != 0 && STm->do_buffer_writes &&
+- !(STp->try_dio && try_wdio) && STps->eof < ST_EOM_OK &&
++ !(STp->try_dio_now && try_wdio) && STps->eof < ST_EOM_OK &&
+ STbp->buffer_bytes < STbp->buffer_size) {
+ STp->dirty = 1;
+ /* Don't write a buffer that is not full enough. */
+@@ -1769,7 +1770,7 @@ static long read_tape(struct scsi_tape *
+ if (STp->block_size == 0)
+ blks = bytes = count;
+ else {
+- if (!(STp->try_dio && try_rdio) && STm->do_read_ahead) {
++ if (!(STp->try_dio_now && try_rdio) && STm->do_read_ahead) {
+ blks = (STp->buffer)->buffer_blocks;
+ bytes = blks * STp->block_size;
+ } else {
+@@ -1948,10 +1949,12 @@ st_read(struct file *filp, char __user *
+ goto out;
+
+ STm = &(STp->modes[STp->current_mode]);
+- if (!(STm->do_read_ahead) && STp->block_size != 0 &&
+- (count % STp->block_size) != 0) {
+- retval = (-EINVAL); /* Read must be integral number of blocks */
+- goto out;
++ if (STp->block_size != 0 && (count % STp->block_size) != 0) {
++ if (!STm->do_read_ahead) {
++ retval = (-EINVAL); /* Read must be integral number of blocks */
++ goto out;
++ }
++ STp->try_dio_now = 0; /* Direct i/o can't handle split blocks */
+ }
+
+ STps = &(STp->ps[STp->partition]);
+--- a/drivers/scsi/st.h
++++ b/drivers/scsi/st.h
+@@ -117,7 +117,8 @@ struct scsi_tape {
+ unsigned char cln_sense_value;
+ unsigned char cln_sense_mask;
+ unsigned char use_pf; /* Set Page Format bit in all mode selects? */
+- unsigned char try_dio; /* try direct i/o? */
++ unsigned char try_dio; /* try direct i/o in general? */
++ unsigned char try_dio_now; /* try direct i/o before next close? */
+ unsigned char c_algo; /* compression algorithm */
+ unsigned char pos_unknown; /* after reset position unknown */
+ int tape_type;