diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-10-14 18:31:15 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-10-14 18:31:15 -0400 |
commit | e7d688ec86c9c6aa94b58eeb266f833a76407018 (patch) | |
tree | db7ce6fe6fc9b8c69287d2e8ee11f8724d171682 | |
parent | d470c05bedc27dbd2df9d0bb6fd82336e4ff43db (diff) | |
parent | ac522b638dcb549f9d33085c6fadea88a5f826ae (diff) |
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] sclp_vt220 build fix
[S390] cio: change misleading console logic
[S390] call home support: fix proc handler
[S390] dasd: use idal for device characteristics
[S390] Add highgprs facility to /proc/cpuinfo
[S390] dasd: fix locking bug
[S390] tape390: Fix request queue handling in block driver
[S390] hypfs: Use subcode 6 if subcode 7 is not available
-rw-r--r-- | arch/s390/hypfs/hypfs_diag.c | 2 | ||||
-rw-r--r-- | arch/s390/kernel/processor.c | 6 | ||||
-rw-r--r-- | drivers/s390/block/dasd.c | 13 | ||||
-rw-r--r-- | drivers/s390/block/dasd_eckd.c | 8 | ||||
-rw-r--r-- | drivers/s390/char/sclp_async.c | 4 | ||||
-rw-r--r-- | drivers/s390/char/sclp_vt220.c | 30 | ||||
-rw-r--r-- | drivers/s390/char/tape_block.c | 3 | ||||
-rw-r--r-- | drivers/s390/cio/device.c | 9 |
8 files changed, 43 insertions, 32 deletions
diff --git a/arch/s390/hypfs/hypfs_diag.c b/arch/s390/hypfs/hypfs_diag.c index 704dd396257b..77df726180ba 100644 --- a/arch/s390/hypfs/hypfs_diag.c +++ b/arch/s390/hypfs/hypfs_diag.c | |||
@@ -438,7 +438,7 @@ static int diag204_probe(void) | |||
438 | } | 438 | } |
439 | if (diag204((unsigned long)SUBC_STIB6 | | 439 | if (diag204((unsigned long)SUBC_STIB6 | |
440 | (unsigned long)INFO_EXT, pages, buf) >= 0) { | 440 | (unsigned long)INFO_EXT, pages, buf) >= 0) { |
441 | diag204_store_sc = SUBC_STIB7; | 441 | diag204_store_sc = SUBC_STIB6; |
442 | diag204_info_type = INFO_EXT; | 442 | diag204_info_type = INFO_EXT; |
443 | goto out; | 443 | goto out; |
444 | } | 444 | } |
diff --git a/arch/s390/kernel/processor.c b/arch/s390/kernel/processor.c index 802c8ab247f3..0729f36c2fe3 100644 --- a/arch/s390/kernel/processor.c +++ b/arch/s390/kernel/processor.c | |||
@@ -31,9 +31,9 @@ void __cpuinit print_cpu_info(void) | |||
31 | 31 | ||
32 | static int show_cpuinfo(struct seq_file *m, void *v) | 32 | static int show_cpuinfo(struct seq_file *m, void *v) |
33 | { | 33 | { |
34 | static const char *hwcap_str[9] = { | 34 | static const char *hwcap_str[10] = { |
35 | "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", | 35 | "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", |
36 | "edat", "etf3eh" | 36 | "edat", "etf3eh", "highgprs" |
37 | }; | 37 | }; |
38 | struct _lowcore *lc; | 38 | struct _lowcore *lc; |
39 | unsigned long n = (unsigned long) v - 1; | 39 | unsigned long n = (unsigned long) v - 1; |
@@ -48,7 +48,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
48 | num_online_cpus(), loops_per_jiffy/(500000/HZ), | 48 | num_online_cpus(), loops_per_jiffy/(500000/HZ), |
49 | (loops_per_jiffy/(5000/HZ))%100); | 49 | (loops_per_jiffy/(5000/HZ))%100); |
50 | seq_puts(m, "features\t: "); | 50 | seq_puts(m, "features\t: "); |
51 | for (i = 0; i < 9; i++) | 51 | for (i = 0; i < 10; i++) |
52 | if (hwcap_str[i] && (elf_hwcap & (1UL << i))) | 52 | if (hwcap_str[i] && (elf_hwcap & (1UL << i))) |
53 | seq_printf(m, "%s ", hwcap_str[i]); | 53 | seq_printf(m, "%s ", hwcap_str[i]); |
54 | seq_puts(m, "\n"); | 54 | seq_puts(m, "\n"); |
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 53b8c255360a..aaccc8ecfa8f 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
@@ -2533,6 +2533,7 @@ static struct dasd_ccw_req *dasd_generic_build_rdc(struct dasd_device *device, | |||
2533 | { | 2533 | { |
2534 | struct dasd_ccw_req *cqr; | 2534 | struct dasd_ccw_req *cqr; |
2535 | struct ccw1 *ccw; | 2535 | struct ccw1 *ccw; |
2536 | unsigned long *idaw; | ||
2536 | 2537 | ||
2537 | cqr = dasd_smalloc_request(magic, 1 /* RDC */, rdc_buffer_size, device); | 2538 | cqr = dasd_smalloc_request(magic, 1 /* RDC */, rdc_buffer_size, device); |
2538 | 2539 | ||
@@ -2546,9 +2547,17 @@ static struct dasd_ccw_req *dasd_generic_build_rdc(struct dasd_device *device, | |||
2546 | 2547 | ||
2547 | ccw = cqr->cpaddr; | 2548 | ccw = cqr->cpaddr; |
2548 | ccw->cmd_code = CCW_CMD_RDC; | 2549 | ccw->cmd_code = CCW_CMD_RDC; |
2549 | ccw->cda = (__u32)(addr_t)rdc_buffer; | 2550 | if (idal_is_needed(rdc_buffer, rdc_buffer_size)) { |
2550 | ccw->count = rdc_buffer_size; | 2551 | idaw = (unsigned long *) (cqr->data); |
2552 | ccw->cda = (__u32)(addr_t) idaw; | ||
2553 | ccw->flags = CCW_FLAG_IDA; | ||
2554 | idaw = idal_create_words(idaw, rdc_buffer, rdc_buffer_size); | ||
2555 | } else { | ||
2556 | ccw->cda = (__u32)(addr_t) rdc_buffer; | ||
2557 | ccw->flags = 0; | ||
2558 | } | ||
2551 | 2559 | ||
2560 | ccw->count = rdc_buffer_size; | ||
2552 | cqr->startdev = device; | 2561 | cqr->startdev = device; |
2553 | cqr->memdev = device; | 2562 | cqr->memdev = device; |
2554 | cqr->expires = 10*HZ; | 2563 | cqr->expires = 10*HZ; |
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 0be7c15f45c5..417b97cd3f94 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -3216,6 +3216,7 @@ int dasd_eckd_restore_device(struct dasd_device *device) | |||
3216 | struct dasd_eckd_characteristics temp_rdc_data; | 3216 | struct dasd_eckd_characteristics temp_rdc_data; |
3217 | int is_known, rc; | 3217 | int is_known, rc; |
3218 | struct dasd_uid temp_uid; | 3218 | struct dasd_uid temp_uid; |
3219 | unsigned long flags; | ||
3219 | 3220 | ||
3220 | private = (struct dasd_eckd_private *) device->private; | 3221 | private = (struct dasd_eckd_private *) device->private; |
3221 | 3222 | ||
@@ -3228,7 +3229,8 @@ int dasd_eckd_restore_device(struct dasd_device *device) | |||
3228 | rc = dasd_eckd_generate_uid(device, &private->uid); | 3229 | rc = dasd_eckd_generate_uid(device, &private->uid); |
3229 | dasd_get_uid(device->cdev, &temp_uid); | 3230 | dasd_get_uid(device->cdev, &temp_uid); |
3230 | if (memcmp(&private->uid, &temp_uid, sizeof(struct dasd_uid)) != 0) | 3231 | if (memcmp(&private->uid, &temp_uid, sizeof(struct dasd_uid)) != 0) |
3231 | dev_err(&device->cdev->dev, "The UID of the DASD has changed\n"); | 3232 | dev_err(&device->cdev->dev, "The UID of the DASD has " |
3233 | "changed\n"); | ||
3232 | if (rc) | 3234 | if (rc) |
3233 | goto out_err; | 3235 | goto out_err; |
3234 | dasd_set_uid(device->cdev, &private->uid); | 3236 | dasd_set_uid(device->cdev, &private->uid); |
@@ -3256,9 +3258,9 @@ int dasd_eckd_restore_device(struct dasd_device *device) | |||
3256 | "device: %s", rc, dev_name(&device->cdev->dev)); | 3258 | "device: %s", rc, dev_name(&device->cdev->dev)); |
3257 | goto out_err; | 3259 | goto out_err; |
3258 | } | 3260 | } |
3259 | spin_lock(get_ccwdev_lock(device->cdev)); | 3261 | spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); |
3260 | memcpy(&private->rdc_data, &temp_rdc_data, sizeof(temp_rdc_data)); | 3262 | memcpy(&private->rdc_data, &temp_rdc_data, sizeof(temp_rdc_data)); |
3261 | spin_unlock(get_ccwdev_lock(device->cdev)); | 3263 | spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); |
3262 | 3264 | ||
3263 | /* add device to alias management */ | 3265 | /* add device to alias management */ |
3264 | dasd_alias_add_device(device); | 3266 | dasd_alias_add_device(device); |
diff --git a/drivers/s390/char/sclp_async.c b/drivers/s390/char/sclp_async.c index daaec185ed36..a4f68e5b9c96 100644 --- a/drivers/s390/char/sclp_async.c +++ b/drivers/s390/char/sclp_async.c | |||
@@ -62,7 +62,7 @@ static struct notifier_block call_home_panic_nb = { | |||
62 | .priority = INT_MAX, | 62 | .priority = INT_MAX, |
63 | }; | 63 | }; |
64 | 64 | ||
65 | static int proc_handler_callhome(ctl_table *ctl, int write, struct file *filp, | 65 | static int proc_handler_callhome(struct ctl_table *ctl, int write, |
66 | void __user *buffer, size_t *count, | 66 | void __user *buffer, size_t *count, |
67 | loff_t *ppos) | 67 | loff_t *ppos) |
68 | { | 68 | { |
@@ -100,7 +100,7 @@ static struct ctl_table callhome_table[] = { | |||
100 | { | 100 | { |
101 | .procname = "callhome", | 101 | .procname = "callhome", |
102 | .mode = 0644, | 102 | .mode = 0644, |
103 | .proc_handler = &proc_handler_callhome, | 103 | .proc_handler = proc_handler_callhome, |
104 | }, | 104 | }, |
105 | { .ctl_name = 0 } | 105 | { .ctl_name = 0 } |
106 | }; | 106 | }; |
diff --git a/drivers/s390/char/sclp_vt220.c b/drivers/s390/char/sclp_vt220.c index 178724f2a4c3..b9d2a007e93b 100644 --- a/drivers/s390/char/sclp_vt220.c +++ b/drivers/s390/char/sclp_vt220.c | |||
@@ -705,21 +705,6 @@ out_driver: | |||
705 | } | 705 | } |
706 | __initcall(sclp_vt220_tty_init); | 706 | __initcall(sclp_vt220_tty_init); |
707 | 707 | ||
708 | #ifdef CONFIG_SCLP_VT220_CONSOLE | ||
709 | |||
710 | static void | ||
711 | sclp_vt220_con_write(struct console *con, const char *buf, unsigned int count) | ||
712 | { | ||
713 | __sclp_vt220_write((const unsigned char *) buf, count, 1, 1, 0); | ||
714 | } | ||
715 | |||
716 | static struct tty_driver * | ||
717 | sclp_vt220_con_device(struct console *c, int *index) | ||
718 | { | ||
719 | *index = 0; | ||
720 | return sclp_vt220_driver; | ||
721 | } | ||
722 | |||
723 | static void __sclp_vt220_flush_buffer(void) | 708 | static void __sclp_vt220_flush_buffer(void) |
724 | { | 709 | { |
725 | unsigned long flags; | 710 | unsigned long flags; |
@@ -776,6 +761,21 @@ static void sclp_vt220_pm_event_fn(struct sclp_register *reg, | |||
776 | } | 761 | } |
777 | } | 762 | } |
778 | 763 | ||
764 | #ifdef CONFIG_SCLP_VT220_CONSOLE | ||
765 | |||
766 | static void | ||
767 | sclp_vt220_con_write(struct console *con, const char *buf, unsigned int count) | ||
768 | { | ||
769 | __sclp_vt220_write((const unsigned char *) buf, count, 1, 1, 0); | ||
770 | } | ||
771 | |||
772 | static struct tty_driver * | ||
773 | sclp_vt220_con_device(struct console *c, int *index) | ||
774 | { | ||
775 | *index = 0; | ||
776 | return sclp_vt220_driver; | ||
777 | } | ||
778 | |||
779 | static int | 779 | static int |
780 | sclp_vt220_notify(struct notifier_block *self, | 780 | sclp_vt220_notify(struct notifier_block *self, |
781 | unsigned long event, void *data) | 781 | unsigned long event, void *data) |
diff --git a/drivers/s390/char/tape_block.c b/drivers/s390/char/tape_block.c index 64f57ef2763c..0c0705b91c28 100644 --- a/drivers/s390/char/tape_block.c +++ b/drivers/s390/char/tape_block.c | |||
@@ -162,9 +162,10 @@ tapeblock_requeue(struct work_struct *work) { | |||
162 | spin_lock_irq(&device->blk_data.request_queue_lock); | 162 | spin_lock_irq(&device->blk_data.request_queue_lock); |
163 | while ( | 163 | while ( |
164 | !blk_queue_plugged(queue) && | 164 | !blk_queue_plugged(queue) && |
165 | (req = blk_fetch_request(queue)) && | 165 | blk_peek_request(queue) && |
166 | nr_queued < TAPEBLOCK_MIN_REQUEUE | 166 | nr_queued < TAPEBLOCK_MIN_REQUEUE |
167 | ) { | 167 | ) { |
168 | req = blk_fetch_request(queue); | ||
168 | if (rq_data_dir(req) == WRITE) { | 169 | if (rq_data_dir(req) == WRITE) { |
169 | DBF_EVENT(1, "TBLOCK: Rejecting write request\n"); | 170 | DBF_EVENT(1, "TBLOCK: Rejecting write request\n"); |
170 | spin_unlock_irq(&device->blk_data.request_queue_lock); | 171 | spin_unlock_irq(&device->blk_data.request_queue_lock); |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 2ee093ec86e4..2490b741e16a 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -1250,8 +1250,7 @@ static int io_subchannel_probe(struct subchannel *sch) | |||
1250 | unsigned long flags; | 1250 | unsigned long flags; |
1251 | struct ccw_dev_id dev_id; | 1251 | struct ccw_dev_id dev_id; |
1252 | 1252 | ||
1253 | cdev = sch_get_cdev(sch); | 1253 | if (cio_is_console(sch->schid)) { |
1254 | if (cdev) { | ||
1255 | rc = sysfs_create_group(&sch->dev.kobj, | 1254 | rc = sysfs_create_group(&sch->dev.kobj, |
1256 | &io_subchannel_attr_group); | 1255 | &io_subchannel_attr_group); |
1257 | if (rc) | 1256 | if (rc) |
@@ -1260,13 +1259,13 @@ static int io_subchannel_probe(struct subchannel *sch) | |||
1260 | "0.%x.%04x (rc=%d)\n", | 1259 | "0.%x.%04x (rc=%d)\n", |
1261 | sch->schid.ssid, sch->schid.sch_no, rc); | 1260 | sch->schid.ssid, sch->schid.sch_no, rc); |
1262 | /* | 1261 | /* |
1263 | * This subchannel already has an associated ccw_device. | 1262 | * The console subchannel already has an associated ccw_device. |
1264 | * Throw the delayed uevent for the subchannel, register | 1263 | * Throw the delayed uevent for the subchannel, register |
1265 | * the ccw_device and exit. This happens for all early | 1264 | * the ccw_device and exit. |
1266 | * devices, e.g. the console. | ||
1267 | */ | 1265 | */ |
1268 | dev_set_uevent_suppress(&sch->dev, 0); | 1266 | dev_set_uevent_suppress(&sch->dev, 0); |
1269 | kobject_uevent(&sch->dev.kobj, KOBJ_ADD); | 1267 | kobject_uevent(&sch->dev.kobj, KOBJ_ADD); |
1268 | cdev = sch_get_cdev(sch); | ||
1270 | cdev->dev.groups = ccwdev_attr_groups; | 1269 | cdev->dev.groups = ccwdev_attr_groups; |
1271 | device_initialize(&cdev->dev); | 1270 | device_initialize(&cdev->dev); |
1272 | ccw_device_register(cdev); | 1271 | ccw_device_register(cdev); |