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 #include +#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 #include +#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 #include +#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 #include +#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 #include +#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 #include +#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 -#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 "); @@ -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)