Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6

* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6:
[S390] zcore: Fix reipl device detection
[S390] vdso: use ntp adjusted clock multiplier
[S390] cio: use exception-save stsch
[S390] add hook to reenable mss after hibernation
[S390] cio: allow enable_facility from outside init functions
[S390] dasd: fix endless loop in erp

+60 -53
+1
arch/s390/include/asm/vdso.h
··· 29 29 __u32 tz_minuteswest; /* Minutes west of Greenwich 0x30 */ 30 30 __u32 tz_dsttime; /* Type of dst correction 0x34 */ 31 31 __u32 ectg_available; 32 + __u32 ntp_mult; /* NTP adjusted multiplier 0x3C */ 32 33 }; 33 34 34 35 struct vdso_per_cpu_data {
+1
arch/s390/kernel/asm-offsets.c
··· 61 61 DEFINE(__VDSO_WTOM_NSEC, offsetof(struct vdso_data, wtom_clock_nsec)); 62 62 DEFINE(__VDSO_TIMEZONE, offsetof(struct vdso_data, tz_minuteswest)); 63 63 DEFINE(__VDSO_ECTG_OK, offsetof(struct vdso_data, ectg_available)); 64 + DEFINE(__VDSO_NTP_MULT, offsetof(struct vdso_data, ntp_mult)); 64 65 DEFINE(__VDSO_ECTG_BASE, offsetof(struct vdso_per_cpu_data, ectg_timer_base)); 65 66 DEFINE(__VDSO_ECTG_USER, offsetof(struct vdso_per_cpu_data, ectg_user_time)); 66 67 /* constants used by the vdso */
+3
arch/s390/kernel/swsusp_asm64.S
··· 256 256 lghi %r2,0 257 257 brasl %r14,arch_set_page_states 258 258 259 + /* Reinitialize the channel subsystem */ 260 + brasl %r14,channel_subsystem_reinit 261 + 259 262 /* Return 0 */ 260 263 lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15) 261 264 lghi %r2,0
+1
arch/s390/kernel/time.c
··· 221 221 vdso_data->xtime_clock_nsec = wall_time->tv_nsec; 222 222 vdso_data->wtom_clock_sec = wall_to_monotonic.tv_sec; 223 223 vdso_data->wtom_clock_nsec = wall_to_monotonic.tv_nsec; 224 + vdso_data->ntp_mult = mult; 224 225 smp_wmb(); 225 226 ++vdso_data->tb_update_count; 226 227 }
+6 -6
arch/s390/kernel/vdso32/clock_gettime.S
··· 38 38 sl %r1,__VDSO_XTIME_STAMP+4(%r5) 39 39 brc 3,2f 40 40 ahi %r0,-1 41 - 2: mhi %r0,1000 /* cyc2ns(clock,cycle_delta) */ 41 + 2: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ 42 42 lr %r2,%r0 43 - lhi %r0,1000 43 + l %r0,__VDSO_NTP_MULT(%r5) 44 44 ltr %r1,%r1 45 45 mr %r0,%r0 46 46 jnm 3f 47 - ahi %r0,1000 47 + a %r0,__VDSO_NTP_MULT(%r5) 48 48 3: alr %r0,%r2 49 49 srdl %r0,12 50 50 al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ ··· 86 86 sl %r1,__VDSO_XTIME_STAMP+4(%r5) 87 87 brc 3,12f 88 88 ahi %r0,-1 89 - 12: mhi %r0,1000 /* cyc2ns(clock,cycle_delta) */ 89 + 12: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ 90 90 lr %r2,%r0 91 - lhi %r0,1000 91 + l %r0,__VDSO_NTP_MULT(%r5) 92 92 ltr %r1,%r1 93 93 mr %r0,%r0 94 94 jnm 13f 95 - ahi %r0,1000 95 + a %r0,__VDSO_NTP_MULT(%r5) 96 96 13: alr %r0,%r2 97 97 srdl %r0,12 98 98 al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */
+3 -3
arch/s390/kernel/vdso32/gettimeofday.S
··· 35 35 sl %r1,__VDSO_XTIME_STAMP+4(%r5) 36 36 brc 3,3f 37 37 ahi %r0,-1 38 - 3: mhi %r0,1000 /* cyc2ns(clock,cycle_delta) */ 38 + 3: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ 39 39 st %r0,24(%r15) 40 - lhi %r0,1000 40 + l %r0,__VDSO_NTP_MULT(%r5) 41 41 ltr %r1,%r1 42 42 mr %r0,%r0 43 43 jnm 4f 44 - ahi %r0,1000 44 + a %r0,__VDSO_NTP_MULT(%r5) 45 45 4: al %r0,24(%r15) 46 46 srdl %r0,12 47 47 al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */
+2 -2
arch/s390/kernel/vdso64/clock_gettime.S
··· 36 36 stck 48(%r15) /* Store TOD clock */ 37 37 lg %r1,48(%r15) 38 38 sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ 39 - mghi %r1,1000 39 + msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ 40 40 srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ 41 41 alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime */ 42 42 lg %r0,__VDSO_XTIME_SEC(%r5) ··· 64 64 stck 48(%r15) /* Store TOD clock */ 65 65 lg %r1,48(%r15) 66 66 sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ 67 - mghi %r1,1000 67 + msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ 68 68 srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ 69 69 alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime */ 70 70 lg %r0,__VDSO_XTIME_SEC(%r5)
+1 -1
arch/s390/kernel/vdso64/gettimeofday.S
··· 31 31 stck 48(%r15) /* Store TOD clock */ 32 32 lg %r1,48(%r15) 33 33 sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ 34 - mghi %r1,1000 34 + msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ 35 35 srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ 36 36 alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime.tv_nsec */ 37 37 lg %r0,__VDSO_XTIME_SEC(%r5) /* xtime.tv_sec */
+2 -1
drivers/s390/block/dasd.c
··· 1899 1899 /* Process requests that may be recovered */ 1900 1900 if (cqr->status == DASD_CQR_NEED_ERP) { 1901 1901 erp_fn = base->discipline->erp_action(cqr); 1902 - erp_fn(cqr); 1902 + if (IS_ERR(erp_fn(cqr))) 1903 + continue; 1903 1904 goto restart; 1904 1905 } 1905 1906
+6 -1
drivers/s390/block/dasd_3990_erp.c
··· 2309 2309 cqr->retries); 2310 2310 dasd_block_set_timer(device->block, (HZ << 3)); 2311 2311 } 2312 - return cqr; 2312 + return erp; 2313 2313 } 2314 2314 2315 2315 ccw = cqr->cpaddr; ··· 2371 2371 2372 2372 /* add erp and initialize with default TIC */ 2373 2373 erp = dasd_3990_erp_add_erp(cqr); 2374 + 2375 + if (IS_ERR(erp)) 2376 + return erp; 2374 2377 2375 2378 /* inspect sense, determine specific ERP if possible */ 2376 2379 if (erp != cqr) { ··· 2714 2711 if (erp == NULL) { 2715 2712 /* no matching erp found - set up erp */ 2716 2713 erp = dasd_3990_erp_additional_erp(cqr); 2714 + if (IS_ERR(erp)) 2715 + return erp; 2717 2716 } else { 2718 2717 /* matching erp found - set all leading erp's to DONE */ 2719 2718 erp = dasd_3990_erp_handle_match_erp(cqr, erp);
+1 -5
drivers/s390/char/zcore.c
··· 638 638 rc = memcpy_hsa_kernel(ipl_block, ipib_info.ipib, PAGE_SIZE); 639 639 else 640 640 rc = memcpy_real(ipl_block, (void *) ipib_info.ipib, PAGE_SIZE); 641 - if (rc) { 642 - free_page((unsigned long) ipl_block); 643 - return rc; 644 - } 645 - if (csum_partial(ipl_block, ipl_block->hdr.len, 0) != 641 + if (rc || csum_partial(ipl_block, ipl_block->hdr.len, 0) != 646 642 ipib_info.checksum) { 647 643 TRACE("Checksum does not match\n"); 648 644 free_page((unsigned long) ipl_block);
+14 -15
drivers/s390/cio/chsc.c
··· 29 29 #include "chsc.h" 30 30 31 31 static void *sei_page; 32 + static DEFINE_SPINLOCK(sda_lock); 32 33 33 34 /** 34 35 * chsc_error_from_response() - convert a chsc response to an error ··· 833 832 kfree(sei_page); 834 833 } 835 834 836 - int __init 837 - chsc_enable_facility(int operation_code) 835 + int chsc_enable_facility(int operation_code) 838 836 { 839 837 int ret; 840 - struct { 838 + static struct { 841 839 struct chsc_header request; 842 840 u8 reserved1:4; 843 841 u8 format:4; ··· 849 849 u32 reserved5:4; 850 850 u32 format2:4; 851 851 u32 reserved6:24; 852 - } __attribute__ ((packed)) *sda_area; 852 + } __attribute__ ((packed, aligned(4096))) sda_area; 853 853 854 - sda_area = (void *)get_zeroed_page(GFP_KERNEL|GFP_DMA); 855 - if (!sda_area) 856 - return -ENOMEM; 857 - sda_area->request.length = 0x0400; 858 - sda_area->request.code = 0x0031; 859 - sda_area->operation_code = operation_code; 854 + spin_lock(&sda_lock); 855 + memset(&sda_area, 0, sizeof(sda_area)); 856 + sda_area.request.length = 0x0400; 857 + sda_area.request.code = 0x0031; 858 + sda_area.operation_code = operation_code; 860 859 861 - ret = chsc(sda_area); 860 + ret = chsc(&sda_area); 862 861 if (ret > 0) { 863 862 ret = (ret == 3) ? -ENODEV : -EBUSY; 864 863 goto out; 865 864 } 866 865 867 - switch (sda_area->response.code) { 866 + switch (sda_area.response.code) { 868 867 case 0x0101: 869 868 ret = -EOPNOTSUPP; 870 869 break; 871 870 default: 872 - ret = chsc_error_from_response(sda_area->response.code); 871 + ret = chsc_error_from_response(sda_area.response.code); 873 872 } 874 873 if (ret != 0) 875 874 CIO_CRW_EVENT(2, "chsc: sda (oc=%x) failed (rc=%04x)\n", 876 - operation_code, sda_area->response.code); 875 + operation_code, sda_area.response.code); 877 876 out: 878 - free_page((unsigned long)sda_area); 877 + spin_unlock(&sda_lock); 879 878 return ret; 880 879 } 881 880
+1 -1
drivers/s390/cio/chsc_sch.c
··· 124 124 * since we don't have a way to clear the subchannel and 125 125 * cannot disable it with a request running. 126 126 */ 127 - cc = stsch(sch->schid, &schib); 127 + cc = stsch_err(sch->schid, &schib); 128 128 if (!cc && scsw_stctl(&schib.scsw)) 129 129 return -EAGAIN; 130 130 return 0;
+9 -9
drivers/s390/cio/cio.c
··· 361 361 struct schib schib; 362 362 int ccode, retry, ret = 0; 363 363 364 - if (stsch(sch->schid, &schib) || !css_sch_is_valid(&schib)) 364 + if (stsch_err(sch->schid, &schib) || !css_sch_is_valid(&schib)) 365 365 return -ENODEV; 366 366 367 367 for (retry = 0; retry < 5; retry++) { ··· 372 372 return ccode; 373 373 switch (ccode) { 374 374 case 0: /* successful */ 375 - if (stsch(sch->schid, &schib) || 375 + if (stsch_err(sch->schid, &schib) || 376 376 !css_sch_is_valid(&schib)) 377 377 return -ENODEV; 378 378 if (cio_check_config(sch, &schib)) { ··· 404 404 { 405 405 struct schib schib; 406 406 407 - if (stsch(sch->schid, &schib) || !css_sch_is_valid(&schib)) 407 + if (stsch_err(sch->schid, &schib) || !css_sch_is_valid(&schib)) 408 408 return -ENODEV; 409 409 410 410 memcpy(&sch->schib, &schib, sizeof(schib)); ··· 771 771 if (console_irq != -1) { 772 772 /* VM provided us with the irq number of the console. */ 773 773 schid.sch_no = console_irq; 774 - if (stsch(schid, &console_subchannel.schib) != 0 || 774 + if (stsch_err(schid, &console_subchannel.schib) != 0 || 775 775 (console_subchannel.schib.pmcw.st != SUBCHANNEL_TYPE_IO) || 776 776 !console_subchannel.schib.pmcw.dnv) 777 777 return -1; ··· 863 863 cc = 0; 864 864 for (retry=0;retry<3;retry++) { 865 865 schib->pmcw.ena = 0; 866 - cc = msch(schid, schib); 866 + cc = msch_err(schid, schib); 867 867 if (cc) 868 868 return (cc==3?-ENODEV:-EBUSY); 869 - if (stsch(schid, schib) || !css_sch_is_valid(schib)) 869 + if (stsch_err(schid, schib) || !css_sch_is_valid(schib)) 870 870 return -ENODEV; 871 871 if (!schib->pmcw.ena) 872 872 return 0; ··· 913 913 914 914 pgm_check_occured = 0; 915 915 s390_base_pgm_handler_fn = cio_reset_pgm_check_handler; 916 - rc = stsch(schid, addr); 916 + rc = stsch_err(schid, addr); 917 917 s390_base_pgm_handler_fn = NULL; 918 918 919 919 /* The program check handler could have changed pgm_check_occured. */ ··· 950 950 /* No default clear strategy */ 951 951 break; 952 952 } 953 - stsch(schid, &schib); 953 + stsch_err(schid, &schib); 954 954 __disable_subchannel_easy(schid, &schib); 955 955 } 956 956 out: ··· 1086 1086 schid = *(struct subchannel_id *)&S390_lowcore.subchannel_id; 1087 1087 if (!schid.one) 1088 1088 return -ENODEV; 1089 - if (stsch(schid, &schib)) 1089 + if (stsch_err(schid, &schib)) 1090 1090 return -ENODEV; 1091 1091 if (schib.pmcw.st != SUBCHANNEL_TYPE_IO) 1092 1092 return -ENODEV;
+8 -8
drivers/s390/cio/css.c
··· 870 870 871 871 /* Try to enable MSS. */ 872 872 ret = chsc_enable_facility(CHSC_SDA_OC_MSS); 873 - switch (ret) { 874 - case 0: /* Success. */ 875 - max_ssid = __MAX_SSID; 876 - break; 877 - case -ENOMEM: 878 - goto out; 879 - default: 873 + if (ret) 880 874 max_ssid = 0; 881 - } 875 + else /* Success. */ 876 + max_ssid = __MAX_SSID; 882 877 883 878 ret = slow_subchannel_init(); 884 879 if (ret) ··· 1042 1047 return 0; 1043 1048 } 1044 1049 subsys_initcall_sync(channel_subsystem_init_sync); 1050 + 1051 + void channel_subsystem_reinit(void) 1052 + { 1053 + chsc_enable_facility(CHSC_SDA_OC_MSS); 1054 + } 1045 1055 1046 1056 #ifdef CONFIG_PROC_FS 1047 1057 static ssize_t cio_settle_write(struct file *file, const char __user *buf,
+1 -1
drivers/s390/cio/device_fsm.c
··· 45 45 sch = to_subchannel(cdev->dev.parent); 46 46 private = to_io_private(sch); 47 47 orb = &private->orb; 48 - cc = stsch(sch->schid, &schib); 48 + cc = stsch_err(sch->schid, &schib); 49 49 50 50 printk(KERN_WARNING "cio: ccw device timeout occurred at %llx, " 51 51 "device information:\n", get_clock());