diff -ruN linux-2.4.21/drivers/s390/char/tape.h linux-2.3/drivers/s390/char/tape.h
--- linux-2.4.21/drivers/s390/char/tape.h	Fri Jul  9 16:09:19 2004
+++ linux-2.3/drivers/s390/char/tape.h	Fri Jul  9 14:51:51 2004
@@ -33,12 +33,12 @@
  */
 #define DBF_EVENT(d_level, d_str...) \
 do { \
-	debug_sprintf_event(tape_dbf_area, d_level, d_str); \
+	debug_sprintf_event(TAPE_DBF_AREA, d_level, d_str); \
 } while (0)
 
 #define DBF_EXCEPTION(d_level, d_str...) \
 do { \
-	debug_sprintf_exception(tape_dbf_area, d_level, d_str); \
+	debug_sprintf_exception(TAPE_DBF_AREA, d_level, d_str); \
 } while (0)
 
 #define TAPE_VERSION_MAJOR 2
@@ -366,7 +366,7 @@
 void tape_34xx_exit(void);
 
 /* The debug area */
-extern debug_info_t *tape_dbf_area;
+extern debug_info_t *TAPE_DBF_AREA;
 
 /* functions for building ccws */
 static inline ccw1_t *
diff -ruN linux-2.4.21/drivers/s390/char/tape_34xx.c linux-2.3/drivers/s390/char/tape_34xx.c
--- linux-2.4.21/drivers/s390/char/tape_34xx.c	Fri Jul  9 16:09:21 2004
+++ linux-2.3/drivers/s390/char/tape_34xx.c	Fri Jul  9 14:51:51 2004
@@ -16,12 +16,19 @@
 #include <linux/init.h>
 #include <asm/tape390.h>
 
+#define TAPE_DBF_AREA	tape_34xx_dbf
+
 #include "tape.h"
 #include "tape_std.h"
 
 #define PRINTK_HEADER "T34xx:"
 
 /*
+ * Pointer to debug area.
+ */
+debug_info_t *TAPE_DBF_AREA = NULL;
+
+/*
  * The block ID is the complete marker for a specific tape position.
  * It contains a physical part (wrap, segment, format) and a logical
  * block number.
@@ -1315,7 +1322,10 @@
 {
 	int rc;
 
-	DBF_EVENT(3, "34xx init: $Revision: 1.9.4.4 $\n");
+	TAPE_DBF_AREA = debug_register ( "tape_34xx", 1, 2, 4*sizeof(long));
+	debug_register_view(TAPE_DBF_AREA, &debug_sprintf_view);
+
+	DBF_EVENT(3, "34xx init: $Revision: 1.9.4.5 $\n");
 	/* Register discipline. */
 	rc = tape_register_discipline(&tape_discipline_3480);
 	if (rc == 0) {
@@ -1335,11 +1345,12 @@
 {
 	tape_unregister_discipline(&tape_discipline_3480);
 	tape_unregister_discipline(&tape_discipline_3490);
+	debug_unregister(TAPE_DBF_AREA);
 }
 
 MODULE_AUTHOR("(C) 2001-2002 IBM Deutschland Entwicklung GmbH");
 MODULE_DESCRIPTION("Linux on zSeries channel attached 3480 tape "
-		   "device driver ($Revision: 1.9.4.4 $)");
+		   "device driver ($Revision: 1.9.4.5 $)");
 MODULE_LICENSE("GPL");
 
 module_init(tape_34xx_init);
diff -ruN linux-2.4.21/drivers/s390/char/tape_block.c linux-2.3/drivers/s390/char/tape_block.c
--- linux-2.4.21/drivers/s390/char/tape_block.c	Fri Jul  9 16:09:19 2004
+++ linux-2.3/drivers/s390/char/tape_block.c	Fri Jul  9 14:51:51 2004
@@ -21,6 +21,8 @@
 #include <asm/irq.h>
 #include <asm/s390dyn.h>
 
+#define TAPE_DBF_AREA	tape_core_dbf
+
 #include "tape.h"
 #include "tape_std.h"
 
diff -ruN linux-2.4.21/drivers/s390/char/tape_char.c linux-2.3/drivers/s390/char/tape_char.c
--- linux-2.4.21/drivers/s390/char/tape_char.c	Fri Jul  9 16:09:21 2004
+++ linux-2.3/drivers/s390/char/tape_char.c	Fri Jul  9 14:51:51 2004
@@ -22,6 +22,8 @@
 #include <asm/s390dyn.h>
 #include <asm/uaccess.h>
 
+#define TAPE_DBF_AREA	tape_core_dbf
+
 #include "tape.h"
 #include "tape_std.h"
 
diff -ruN linux-2.4.21/drivers/s390/char/tape_core.c linux-2.3/drivers/s390/char/tape_core.c
--- linux-2.4.21/drivers/s390/char/tape_core.c	Fri Jul  9 16:09:21 2004
+++ linux-2.3/drivers/s390/char/tape_core.c	Fri Jul  9 14:51:51 2004
@@ -24,6 +24,8 @@
 #include <asm/s390io.h>
 #include <asm/s390dyn.h>
 
+#define TAPE_DBF_AREA	tape_core_dbf
+
 #include "tape.h"
 #include "tape_std.h"
 
@@ -49,7 +51,7 @@
 /*
  * Pointer to debug area.
  */
-debug_info_t *tape_dbf_area = NULL;
+debug_info_t *TAPE_DBF_AREA = NULL;
 
 const char *tape_op_verbose[TO_SIZE] =
 {
@@ -1297,10 +1299,9 @@
 static int
 tape_init (void)
 {
-	tape_dbf_area = debug_register ( "tape", 1, 2, 4*sizeof(long));
-	debug_register_view(tape_dbf_area, &debug_sprintf_view);
-	debug_set_level(tape_dbf_area, 6); /* FIXME */
-	DBF_EVENT(3, "tape init: ($Revision: 1.7.4.6 $)\n");
+	TAPE_DBF_AREA = debug_register ( "tape", 1, 2, 4*sizeof(long));
+	debug_register_view(TAPE_DBF_AREA, &debug_sprintf_view);
+	DBF_EVENT(3, "tape init: ($Revision: 1.7.4.8 $)\n");
 #ifdef CONFIG_DEVFS_FS
 	tape_devfs_root_entry = devfs_mk_dir (NULL, "tape", NULL);
 #endif /* CONFIG_DEVFS_FS */
@@ -1349,7 +1350,7 @@
 #ifdef CONFIG_DEVFS_FS
 	devfs_unregister (tape_devfs_root_entry); /* devfs checks for NULL */
 #endif /* CONFIG_DEVFS_FS */
-	debug_unregister (tape_dbf_area);
+	debug_unregister (TAPE_DBF_AREA);
 }
 
 /*
@@ -1408,12 +1409,11 @@
 MODULE_AUTHOR("(C) 2001 IBM Deutschland Entwicklung GmbH by Carsten Otte and "
 	      "Michael Holzheu (cotte@de.ibm.com,holzheu@de.ibm.com)");
 MODULE_DESCRIPTION("Linux on zSeries channel attached "
-		   "tape device driver ($Revision: 1.7.4.6 $)");
+		   "tape device driver ($Revision: 1.7.4.8 $)");
 
 module_init(tape_init);
 module_exit(tape_exit);
 
-EXPORT_SYMBOL(tape_dbf_area);
 EXPORT_SYMBOL(tape_state_string);
 EXPORT_SYMBOL(tape_op_verbose);
 EXPORT_SYMBOL(tape_state_set);
diff -ruN linux-2.4.21/drivers/s390/char/tape_devmap.c linux-2.3/drivers/s390/char/tape_devmap.c
--- linux-2.4.21/drivers/s390/char/tape_devmap.c	Fri Jul  9 16:09:21 2004
+++ linux-2.3/drivers/s390/char/tape_devmap.c	Fri Jul  9 15:10:15 2004
@@ -27,6 +27,7 @@
 /* This is ugly... */
 #define PRINTK_HEADER "tape_devmap:"
 
+#define TAPE_DBF_AREA tape_core_dbf
 #include "tape.h"
 
 struct tape_devmap {
diff -ruN linux-2.4.21/drivers/s390/char/tape_proc.c linux-2.3/drivers/s390/char/tape_proc.c
--- linux-2.4.21/drivers/s390/char/tape_proc.c	Fri Jul  9 16:09:20 2004
+++ linux-2.3/drivers/s390/char/tape_proc.c	Fri Jul  9 14:51:51 2004
@@ -19,6 +19,8 @@
 #include <asm/irq.h>
 #include <asm/s390io.h>
 
+#define TAPE_DBF_AREA	tape_core_dbf
+
 #include "tape.h"
 
 #define PRINTK_HEADER "T390:"
diff -ruN linux-2.4.21/drivers/s390/char/tape_std.c linux-2.3/drivers/s390/char/tape_std.c
--- linux-2.4.21/drivers/s390/char/tape_std.c	Fri Jul  9 16:09:21 2004
+++ linux-2.3/drivers/s390/char/tape_std.c	Fri Jul  9 14:51:51 2004
@@ -25,6 +25,8 @@
 #include <asm/ebcdic.h>
 #include <asm/tape390.h>
 
+#define TAPE_DBF_AREA	tape_core_dbf
+
 #include "tape.h"
 #include "tape_std.h"
 
diff -ruN linux-2.4.21/drivers/s390/net/iucv.c linux-2.3/drivers/s390/net/iucv.c
--- linux-2.4.21/drivers/s390/net/iucv.c	Fri Jul  9 16:09:23 2004
+++ linux-2.3/drivers/s390/net/iucv.c	Tue Jun 29 09:37:33 2004
@@ -1,5 +1,5 @@
 /* 
- * $Id: iucv.c,v 1.40.2.4 2004/02/06 08:48:04 braunu Exp $
+ * $Id: iucv.c,v 1.40.2.5 2004/06/29 07:37:33 braunu Exp $
  *
  * IUCV network driver
  *
@@ -29,7 +29,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.40.2.4 $
+ * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.40.2.5 $
  *
  */
 
@@ -342,7 +342,7 @@
 static void
 iucv_banner(void)
 {
-	char vbuf[] = "$Revision: 1.40.2.4 $";
+	char vbuf[] = "$Revision: 1.40.2.5 $";
 	char *version = vbuf;
 
 	if ((version = strchr(version, ':'))) {
@@ -441,17 +441,19 @@
 static __inline__ iucv_param *
 grab_param(void)
 {
-	iucv_param *ret;
-	int i = 0;
+	iucv_param *ptr;
+        static int hint = 0;
 
-	while (atomic_compare_and_swap(0, 1, &iucv_param_pool[i].in_use)) {
-		i++;
-		if (i >= PARAM_POOL_SIZE)
-			i = 0;
-	}
-	ret = &iucv_param_pool[i];
-	memset(&ret->param, 0, sizeof(ret->param));
-	return ret;
+	ptr = iucv_param_pool + hint;
+	do {
+		ptr++;
+		if (ptr >= iucv_param_pool + PARAM_POOL_SIZE)
+			ptr = iucv_param_pool;
+	} while (atomic_compare_and_swap(0, 1, &ptr->in_use));
+	hint = ptr - iucv_param_pool;
+
+	memset(&ptr->param, 0, sizeof(ptr->param));
+	return ptr;
 }
 
 /**
@@ -773,6 +775,7 @@
 		if (iucv_pathid_table == NULL) {
 			printk(KERN_WARNING "%s: iucv_pathid_table storage "
 			       "allocation failed\n", __FUNCTION__);
+			kfree(new_handler);
 			return NULL;
 		}
 		memset (iucv_pathid_table, 0, max_connections * sizeof(handler *));
@@ -2347,7 +2350,8 @@
 					iucv_debug(2,
 						   "found a matching handler");
 					break;
-				}
+				} else
+					h = NULL;
 			}
 			spin_unlock_irqrestore (&iucv_lock, flags);
 			if (h) {
diff -ruN linux-2.4.21/drivers/s390/net/netiucv.c linux-2.3/drivers/s390/net/netiucv.c
--- linux-2.4.21/drivers/s390/net/netiucv.c	Fri Jul  9 16:09:23 2004
+++ linux-2.3/drivers/s390/net/netiucv.c	Tue Jun 29 09:37:33 2004
@@ -1,5 +1,5 @@
 /*
- * $Id: netiucv.c,v 1.21.8.5 2004/04/16 10:06:18 braunu Exp $
+ * $Id: netiucv.c,v 1.21.8.6 2004/06/29 07:37:33 braunu Exp $
  *
  * IUCV network driver
  *
@@ -28,7 +28,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * RELEASE-TAG: IUCV network driver $Revision: 1.21.8.5 $
+ * RELEASE-TAG: IUCV network driver $Revision: 1.21.8.6 $
  *
  */
 
@@ -114,7 +114,6 @@
 	spinlock_t               collect_lock;
 	int                      collect_len;
 	int                      max_buffsize;
-	int                      flags;
 	fsm_timer                timer;
 	fsm_instance             *fsm;
 	net_device               *netdev;
@@ -122,8 +121,6 @@
 	char                     userid[9];
 } iucv_connection;
 
-#define CONN_FLAGS_BUFSIZE_CHANGED 1
-
 /**
  * Linked list of all connection structs.
  */
@@ -148,7 +145,6 @@
 #endif
 	fsm_instance            *fsm;
         iucv_connection         *conn;
-	fsm_timer		timer;
 	struct proc_dir_entry   *proc_dentry;
 	struct proc_dir_entry   *proc_stat_entry;
 	struct proc_dir_entry   *proc_buffer_entry;
@@ -275,7 +271,6 @@
 	DEV_EVENT_STOP,
 	DEV_EVENT_CONUP,
 	DEV_EVENT_CONDOWN,
-	DEV_EVENT_TIMER,
 	/**
 	 * MUST be always the last element!!
 	 */
@@ -287,7 +282,6 @@
 	"Stop",
 	"Connection up",
 	"Connection down",
-	"Timer",
 };
 
 /**
@@ -592,7 +586,7 @@
 	iucv_MessagePending *eib = (iucv_MessagePending *)ev->data;
 	netiucv_priv *privptr = (netiucv_priv *)conn->netdev->priv;
 
-	__u16 msglen = eib->ln1msg2.ipbfln1f;
+	__u32 msglen = eib->ln1msg2.ipbfln1f;
 	int rc;
 
 #ifdef DEBUG
@@ -615,6 +609,7 @@
 			  conn->rx_buff->data, msglen, NULL, NULL, NULL);
 	if (rc != 0 || msglen < 5) {
 		privptr->stats.rx_errors++;
+		printk(KERN_INFO "iucv_receive returned %08x\n", rc);
 		return;
 	}
 	netiucv_unpack_skb(conn, conn->rx_buff);
@@ -692,7 +687,7 @@
 			fsm_newstate(fi, CONN_STATE_IDLE);
 			if (privptr)
 				privptr->stats.tx_errors += txpackets;
-			printk(KERN_DEBUG "iucv_send returned %08x\n",
+			printk(KERN_INFO "iucv_send returned %08x\n",
 			       rc);
 		} else {
 			if (privptr) {
@@ -1031,6 +1026,7 @@
 dev_action_connup(fsm_instance *fi, int event, void *arg)
 {
 	net_device   *dev = (net_device *)arg;
+	netiucv_priv *privptr = (netiucv_priv *)dev->priv;
 
 #ifdef DEBUG
 	printk(KERN_DEBUG "%s() called\n", __FUNCTION__);
@@ -1039,8 +1035,8 @@
 		case DEV_STATE_STARTWAIT:
 			fsm_newstate(fi, DEV_STATE_RUNNING);
 			printk(KERN_INFO
-			       "%s: connected with remote side\n",
-			       dev->name);
+			       "%s: connected with remote side %s\n",
+			       dev->name, privptr->conn->userid);
 			break;
 		case DEV_STATE_STOPWAIT:
 			printk(KERN_INFO
@@ -1419,7 +1415,6 @@
 	privptr->conn->max_buffsize = bs1;
 	if (!(dev->flags & IFF_RUNNING))
 		dev->mtu = bs1 - NETIUCV_HDRLEN - NETIUCV_HDRLEN;
-	privptr->conn->flags |= CONN_FLAGS_BUFSIZE_CHANGED;
 
 	return count;
 }
@@ -2045,7 +2040,7 @@
 static void
 netiucv_banner(void)
 {
-	char vbuf[] = "$Revision: 1.21.8.5 $";
+	char vbuf[] = "$Revision: 1.21.8.6 $";
 	char *version = vbuf;
 
 	if ((version = strchr(version, ':'))) {
diff -ruN linux-2.4.21/drivers/s390/qdio.c linux-2.3/drivers/s390/qdio.c
--- linux-2.4.21/drivers/s390/qdio.c	Fri Jul  9 16:09:23 2004
+++ linux-2.3/drivers/s390/qdio.c	Wed Jun 30 14:29:59 2004
@@ -57,7 +57,7 @@
 
 #include <asm/qdio.h>
 
-#define VERSION_QDIO_C "$Revision: 1.145.4.6 $"
+#define VERSION_QDIO_C "$Revision: 1.145.4.9 $"
 
 /****************** MODULE PARAMETER VARIABLES ********************/
 MODULE_AUTHOR("Utz Bacher <utz.bacher@de.ibm.com>");
@@ -97,6 +97,7 @@
 #endif /* QDIO_PERFORMANCE_STATS */
 
 static int hydra_thinints=0;
+static int omit_svs=0;
 
 static int indicator_used[INDICATORS_PER_CACHELINE];
 static __u32 * volatile indicators;
@@ -628,8 +629,8 @@
 		set_slsb(&q->slsb.acc.val[(gsf+QDIO_MAX_BUFFERS_PER_Q-1)&
 			 (QDIO_MAX_BUFFERS_PER_Q-1)],SLSB_P_INPUT_NOT_INIT);
 		/* we don't issue this SYNC_MEMORY, as we trust Rick T and
-		 * moreover will not use the PROCESSING state, so q->polling
-		 * was 0
+		 * moreover will not use the PROCESSING state under VM,
+		 * so q->polling was 0 anyway.
 		SYNC_MEMORY;*/
 		if (q->slsb.acc.val[gsf]==SLSB_P_INPUT_PRIMED) {
 			/* set our summary bit again, as otherwise there is a
@@ -662,6 +663,11 @@
 	if ((q->is_thinint_q)&&(q->is_input_q)) {
 		/* iQDIO */
 		spin_lock_irqsave(&ttiq_list_lock,flags);
+		/* in case cleanup has done this already and simultanously
+		 * qdio_unmark_q is called from the interrupt handler, we've
+		 * got to check this in this specific case again */
+		if ((!q->list_prev)||(!q->list_next))
+			goto out;
 		if (q->list_next==q) {
 			/* q was the only interesting q */
 			tiq_list=NULL;
@@ -674,6 +680,7 @@
 			q->list_next=NULL;
 			q->list_prev=NULL;
 		}
+out:
 		spin_unlock_irqrestore(&ttiq_list_lock,flags);
 	}
 }
@@ -1039,6 +1046,9 @@
 	char slsbyte;
 	int first_not_to_check;
 	char dbf_text[15];
+#ifdef QDIO_USE_PROCESSING_STATE
+	int last_position=-1;
+#endif /* QDIO_USE_PROCESSING_STATE */
 
 #ifdef QDIO_DBF_LIKE_HELL
 	QDIO_DBF_TEXT4(0,trace,"getibfro");
@@ -1081,8 +1091,14 @@
 		if (q->siga_sync) {
 			set_slsb(&slsb[f_mod_no],SLSB_P_INPUT_NOT_INIT);
 		} else {
-			set_slsb(&slsb[f_mod_no],SLSB_P_INPUT_PROCESSING);
+			/* set the previous buffer to NOT_INIT. The current
+			 * buffer will be set to PROCESSING at the end of
+			 * this function to avoid further interrupts. */
+			if (last_position>=0)
+				set_slsb(&slsb[last_position],
+					SLSB_P_INPUT_NOT_INIT);
 			atomic_set(&q->polling,1);
+			last_position=f_mod_no;
 		}
 #else /* QDIO_USE_PROCESSING_STATE */
 		set_slsb(&slsb[f_mod_no],SLSB_P_INPUT_NOT_INIT);
@@ -1123,6 +1139,10 @@
 		f_mod_no=(f_mod_no+1)&(QDIO_MAX_BUFFERS_PER_Q-1);
 		atomic_dec(&q->number_of_buffers_used);
 
+#ifdef QDIO_USE_PROCESSING_STATE
+		last_position=-1;
+#endif /* QDIO_USE_PROCESSING_STATE */
+
 		goto out;
 	}
 
@@ -1130,6 +1150,11 @@
 out:
 	q->first_to_check=f_mod_no;
 
+#ifdef QDIO_USE_PROCESSING_STATE
+	if (last_position>=0)
+		set_slsb(&slsb[last_position],SLSB_P_INPUT_PROCESSING);
+#endif /* QDIO_USE_PROCESSING_STATE */
+
 #ifdef QDIO_DBF_LIKE_HELL
 	QDIO_DBF_HEX4(0,trace,&q->first_to_check,sizeof(int));
 #endif /* QDIO_DBF_LIKE_HELL */
@@ -1513,7 +1538,8 @@
 		q=(qdio_q_t*)q->list_next;
 	} while (q!=(qdio_q_t*)tiq_list);
 
-	/* switch off all queues' processing state */
+	/* switch off all queues' processing state, see comments in
+	 * qdio_get_inbound_buffer_frontier */
 #ifdef QDIO_USE_PROCESSING_STATE
 	q=(qdio_q_t*)tiq_list;
 	do {
@@ -2042,9 +2068,10 @@
 	perf_stats.start_time_inbound=NOW;
 #endif /* QDIO_PERFORMANCE_STATS */
 
-	/* VM will do the SVS for us
-	 * issue SVS to benefit from iqdio interrupt avoidance (SVS clears AISOI)*/
-	if (!MACHINE_IS_VM) {
+	/* SVS only when needed:
+	 * issue SVS to benefit from iqdio interrupt avoidance
+	 * (SVS clears AISOI)*/
+	if (!omit_svs) {
 		tiqdio_clear_global_summary();
 	}
 
@@ -2372,7 +2399,7 @@
 	return result;
 }
 
-static int qdio_check_for_hydra_thinints(void)
+static void qdio_check_for_machine_features(void)
 {
 	int i,result;
 	unsigned long flags;
@@ -2406,13 +2433,20 @@
 	 * 512: chsc char */
 	/* check for bit 67 */
 	if ( (*(((unsigned int*)(chsc_area))+4+2+2)&0x10000000)!=0x10000000) {
-		result=0;
+		hydra_thinints=0;
 	} else {
-		result=1;
+		hydra_thinints=1;
+	}
+
+	/* check for bit 56: if aif time delay disablement fac installed,
+	 * omit svs even under lpar (good point by rick again) */
+	if ( (*(((unsigned int*)(chsc_area))+4+2+1)&0x00000080)!=0x00000080) {
+		omit_svs=1;
+	} else {
+		omit_svs=0;
 	}
 out:
 	spin_unlock_irqrestore(&chsc_area_lock,flags);
-	return result;
 }
 
 /* the chsc_area is locked by the lock in qdio_activate */
@@ -3111,15 +3145,15 @@
 		goto out;
 	}
 
-	if (MACHINE_IS_VM)
 		irq_ptr->qdioac=qdio_check_siga_needs(irq_ptr->irq);
-	else { 
-                irq_ptr->qdioac=CHSC_FLAG_SIGA_INPUT_NECESSARY
-                        | CHSC_FLAG_SIGA_OUTPUT_NECESSARY;
-        }
 	sprintf(dbf_text,"qdioac%2x",irq_ptr->qdioac);
 	QDIO_DBF_TEXT2(0,setup,dbf_text);
 
+	/* if this gets set once, we're running under VM and can omit SVSes */
+	if (irq_ptr->qdioac&CHSC_FLAG_SIGA_SYNC_NECESSARY) {
+		omit_svs=1;
+	}
+
 	sprintf(dbf_text,"qib ac%2x",irq_ptr->qib.ac);
 	QDIO_DBF_TEXT2(0,setup,dbf_text);
 
@@ -3726,10 +3760,12 @@
 
 	qdio_add_procfs_entry();
 
-	hydra_thinints=qdio_check_for_hydra_thinints();
+	qdio_check_for_machine_features();
 
 	sprintf(dbf_text,"hydrati%1x",hydra_thinints);
 	QDIO_DBF_TEXT0(0,setup,dbf_text);
+	sprintf(dbf_text,"omitsvs%1x",omit_svs);
+	QDIO_DBF_TEXT0(0,setup,dbf_text);
 
 	tiqdio_register_thinints();
 
diff -ruN linux-2.4.21/drivers/s390/scsi/zfcp_main.c linux-2.3/drivers/s390/scsi/zfcp_main.c
--- linux-2.4.21/drivers/s390/scsi/zfcp_main.c	Fri Jul  9 16:09:23 2004
+++ linux-2.3/drivers/s390/scsi/zfcp_main.c	Mon Jul  5 15:39:06 2004
@@ -14,7 +14,7 @@
  */
 
 /* this drivers version (do not edit !!! generated and updated by cvs) */
-#define ZFCP_REVISION		"$Revision: 1.31.2.10 $"
+#define ZFCP_REVISION		"$Revision: 1.31.2.11 $"
 
 #define ZFCP_QTCB_VERSION	FSF_QTCB_CURRENT_VERSION
 
@@ -16357,8 +16357,24 @@
 
 	ZFCP_LOG_TRACE("enter (data=0x%lx)\n", data);
 
-	if (send_els->status != 0)
+	if (send_els->status != 0) {
+		ZFCP_LOG_NORMAL(
+			"ELS request timed out, force physical port reopen "
+			"(wwpn=0x%016Lx devno=0x%04x)\n",
+			(unsigned long long)port->wwpn,
+			adapter->devno);
+		debug_text_event(adapter->erp_dbf, 3, "forcreop");
+		retval = zfcp_erp_port_forced_reopen(port, 0);
+		if (retval != 0) {
+			ZFCP_LOG_NORMAL(
+				"Cannot reopen a remote port "
+				"(wwpn=0x%016Lx devno=0x%04x)\n",
+				(unsigned long long)port->wwpn,
+				adapter->devno);
+			retval = -EPERM;
+		}
 		goto skip_fsfstatus;
+	}
 
 	switch (resp_code) {
 
diff -ruN linux-2.4.21/include/asm-s390/pgtable.h linux-2.3/include/asm-s390/pgtable.h
--- linux-2.4.21/include/asm-s390/pgtable.h	Fri Jul  9 16:09:20 2004
+++ linux-2.3/include/asm-s390/pgtable.h	Wed Jun 16 12:59:05 2004
@@ -426,9 +426,12 @@
 	__pte;                                                            \
 })
 
-#define arch_set_page_uptodate(__page)					  \
+#define SetPageUptodate(_page) \
 	do {								  \
-		asm volatile ("sske %0,%1" : : "d" (get_storage_key()),	  \
+		struct page *__page = (_page);				  \
+		if (!test_and_set_bit(PG_uptodate, &__page->flags))	  \
+			asm volatile ("sske %0,%1" 			  \
+			      : : "d" (get_storage_key()),		  \
 			      "a" (__pa((__page-mem_map) << PAGE_SHIFT)));\
 	} while (0)
 
diff -ruN linux-2.4.21/include/asm-s390/qdio.h linux-2.3/include/asm-s390/qdio.h
--- linux-2.4.21/include/asm-s390/qdio.h	Fri Jul  9 16:09:23 2004
+++ linux-2.3/include/asm-s390/qdio.h	Wed Jun 30 14:30:00 2004
@@ -11,7 +11,7 @@
 #ifndef __QDIO_H__
 #define __QDIO_H__
 
-#define VERSION_QDIO_H "$Revision: 1.66.4.3 $"
+#define VERSION_QDIO_H "$Revision: 1.66.4.4 $"
 
 /* note, that most of the typedef's are from ingo. */
 
@@ -619,6 +619,8 @@
 typedef struct qdio_q_t {
 	volatile slsb_t slsb;
 
+	char unused[QDIO_MAX_BUFFERS_PER_Q];
+
 	__u32 * volatile dev_st_chg_ind;
 
 	int is_input_q;
diff -ruN linux-2.4.21/include/asm-s390x/pgtable.h linux-2.3/include/asm-s390x/pgtable.h
--- linux-2.4.21/include/asm-s390x/pgtable.h	Fri Jul  9 16:09:19 2004
+++ linux-2.3/include/asm-s390x/pgtable.h	Wed Jun 16 12:59:05 2004
@@ -484,9 +484,11 @@
 	__pte;                                                            \
 })
 
-#define arch_set_page_uptodate(__page)					  \
+#define SetPageUptodate(_page) \
 	do {								  \
-		asm volatile ("sske %0,%1" : : "d" (0),			  \
+		struct page *__page = (_page);				  \
+		if (!test_and_set_bit(PG_uptodate, &__page->flags))	  \
+			asm volatile ("sske %0,%1" : : "d" (0),		  \
 			      "a" (__pa((__page-mem_map) << PAGE_SHIFT)));\
 	} while (0)
 
diff -ruN linux-2.4.21/include/asm-s390x/qdio.h linux-2.3/include/asm-s390x/qdio.h
--- linux-2.4.21/include/asm-s390x/qdio.h	Fri Jul  9 16:09:23 2004
+++ linux-2.3/include/asm-s390x/qdio.h	Wed Jun 30 14:30:02 2004
@@ -11,7 +11,7 @@
 #ifndef __QDIO_H__
 #define __QDIO_H__
 
-#define VERSION_QDIO_H "$Revision: 1.57.4.3 $"
+#define VERSION_QDIO_H "$Revision: 1.57.4.4 $"
 
 /* note, that most of the typedef's are from ingo. */
 
@@ -619,6 +619,8 @@
 typedef struct qdio_q_t {
 	volatile slsb_t slsb;
 
+	char unused[QDIO_MAX_BUFFERS_PER_Q];
+
 	__u32 * volatile dev_st_chg_ind;
 
 	int is_input_q;
diff -ruN linux-2.4.21/include/linux/mm.h linux-2.3/include/linux/mm.h
--- linux-2.4.21/include/linux/mm.h	Fri Jul  9 16:09:19 2004
+++ linux-2.3/include/linux/mm.h	Wed Jun 16 12:59:05 2004
@@ -308,11 +308,9 @@
 /* Make it prettier to test the above... */
 #define UnlockPage(page)	unlock_page(page)
 #define Page_Uptodate(page)	test_bit(PG_uptodate, &(page)->flags)
-#define SetPageUptodate(page) \
-	do {								\
-		arch_set_page_uptodate(page);				\
-		set_bit(PG_uptodate, &(page)->flags);			\
-	} while (0)
+#ifndef SetPageUptodate
+#define SetPageUptodate(page)	set_bit(PG_uptodate, &(page)->flags);
+#endif
 #define ClearPageUptodate(page)	clear_bit(PG_uptodate, &(page)->flags)
 #define PageDirty(page)		test_bit(PG_dirty, &(page)->flags)
 #define SetPageDirty(page)	set_bit(PG_dirty, &(page)->flags)
