diff options
author | Mauro Carvalho Chehab <mchehab@infradead.org> | 2006-02-06 07:43:13 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2006-02-06 07:43:13 -0500 |
commit | b2faf597d93bdf5e2d12d93ea0815935a73f749e (patch) | |
tree | 1876616290ff282b8a0814e2429d23e0104f3701 /drivers/s390 | |
parent | 638e174688f58200d0deb7435093435e7d737b09 (diff) | |
parent | 410c05427a69f53851637ccb85c2212131409fbd (diff) |
Merge branch 'origin'
Diffstat (limited to 'drivers/s390')
85 files changed, 1314 insertions, 249 deletions
diff --git a/drivers/s390/Kconfig b/drivers/s390/Kconfig index a86a650f3d6d..721787cc5a1c 100644 --- a/drivers/s390/Kconfig +++ b/drivers/s390/Kconfig | |||
@@ -51,6 +51,13 @@ config UNIX98_PTY_COUNT | |||
51 | When not in use, each additional set of 256 PTYs occupy | 51 | When not in use, each additional set of 256 PTYs occupy |
52 | approximately 8 KB of kernel memory on 32-bit architectures. | 52 | approximately 8 KB of kernel memory on 32-bit architectures. |
53 | 53 | ||
54 | config HANGCHECK_TIMER | ||
55 | tristate "Hangcheck timer" | ||
56 | help | ||
57 | The hangcheck-timer module detects when the system has gone | ||
58 | out to lunch past a certain margin. It can reboot the system | ||
59 | or merely print a warning. | ||
60 | |||
54 | source "drivers/char/watchdog/Kconfig" | 61 | source "drivers/char/watchdog/Kconfig" |
55 | 62 | ||
56 | comment "S/390 character device drivers" | 63 | comment "S/390 character device drivers" |
diff --git a/drivers/s390/block/Kconfig b/drivers/s390/block/Kconfig index 6f50cc9323d9..6912399d0937 100644 --- a/drivers/s390/block/Kconfig +++ b/drivers/s390/block/Kconfig | |||
@@ -55,13 +55,21 @@ config DASD_DIAG | |||
55 | Disks under VM. If you are not running under VM or unsure what it is, | 55 | Disks under VM. If you are not running under VM or unsure what it is, |
56 | say "N". | 56 | say "N". |
57 | 57 | ||
58 | config DASD_EER | ||
59 | tristate "Extended error reporting (EER)" | ||
60 | depends on DASD | ||
61 | help | ||
62 | This driver provides a character device interface to the | ||
63 | DASD extended error reporting. This is only needed if you want to | ||
64 | use applications written for the EER facility. | ||
65 | |||
58 | config DASD_CMB | 66 | config DASD_CMB |
59 | tristate "Compatibility interface for DASD channel measurement blocks" | 67 | tristate "Compatibility interface for DASD channel measurement blocks" |
60 | depends on DASD | 68 | depends on DASD |
61 | help | 69 | help |
62 | This driver provides an additional interface to the channel measurement | 70 | This driver provides an additional interface to the channel |
63 | facility, which is normally accessed though sysfs, with a set of | 71 | measurement facility, which is normally accessed though sysfs, with |
64 | ioctl functions specific to the dasd driver. | 72 | a set of ioctl functions specific to the dasd driver. |
65 | This is only needed if you want to use applications written for | 73 | This is only needed if you want to use applications written for |
66 | linux-2.4 dasd channel measurement facility interface. | 74 | linux-2.4 dasd channel measurement facility interface. |
67 | 75 | ||
diff --git a/drivers/s390/block/Makefile b/drivers/s390/block/Makefile index 58c6780134f7..0c0d871e8f51 100644 --- a/drivers/s390/block/Makefile +++ b/drivers/s390/block/Makefile | |||
@@ -5,6 +5,7 @@ | |||
5 | dasd_eckd_mod-objs := dasd_eckd.o dasd_3990_erp.o dasd_9343_erp.o | 5 | dasd_eckd_mod-objs := dasd_eckd.o dasd_3990_erp.o dasd_9343_erp.o |
6 | dasd_fba_mod-objs := dasd_fba.o dasd_3370_erp.o dasd_9336_erp.o | 6 | dasd_fba_mod-objs := dasd_fba.o dasd_3370_erp.o dasd_9336_erp.o |
7 | dasd_diag_mod-objs := dasd_diag.o | 7 | dasd_diag_mod-objs := dasd_diag.o |
8 | dasd_eer_mod-objs := dasd_eer.o | ||
8 | dasd_mod-objs := dasd.o dasd_ioctl.o dasd_proc.o dasd_devmap.o \ | 9 | dasd_mod-objs := dasd.o dasd_ioctl.o dasd_proc.o dasd_devmap.o \ |
9 | dasd_genhd.o dasd_erp.o | 10 | dasd_genhd.o dasd_erp.o |
10 | 11 | ||
@@ -13,5 +14,6 @@ obj-$(CONFIG_DASD_DIAG) += dasd_diag_mod.o | |||
13 | obj-$(CONFIG_DASD_ECKD) += dasd_eckd_mod.o | 14 | obj-$(CONFIG_DASD_ECKD) += dasd_eckd_mod.o |
14 | obj-$(CONFIG_DASD_FBA) += dasd_fba_mod.o | 15 | obj-$(CONFIG_DASD_FBA) += dasd_fba_mod.o |
15 | obj-$(CONFIG_DASD_CMB) += dasd_cmb.o | 16 | obj-$(CONFIG_DASD_CMB) += dasd_cmb.o |
17 | obj-$(CONFIG_DASD_EER) += dasd_eer.o | ||
16 | obj-$(CONFIG_BLK_DEV_XPRAM) += xpram.o | 18 | obj-$(CONFIG_BLK_DEV_XPRAM) += xpram.o |
17 | obj-$(CONFIG_DCSSBLK) += dcssblk.o | 19 | obj-$(CONFIG_DCSSBLK) += dcssblk.o |
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index ef4c687e7c01..08c88fcd8963 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
@@ -7,7 +7,6 @@ | |||
7 | * Bugreports.to..: <Linux390@de.ibm.com> | 7 | * Bugreports.to..: <Linux390@de.ibm.com> |
8 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001 | 8 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001 |
9 | * | 9 | * |
10 | * $Revision: 1.172 $ | ||
11 | */ | 10 | */ |
12 | 11 | ||
13 | #include <linux/config.h> | 12 | #include <linux/config.h> |
@@ -19,6 +18,7 @@ | |||
19 | #include <linux/slab.h> | 18 | #include <linux/slab.h> |
20 | #include <linux/buffer_head.h> | 19 | #include <linux/buffer_head.h> |
21 | #include <linux/hdreg.h> | 20 | #include <linux/hdreg.h> |
21 | #include <linux/notifier.h> | ||
22 | 22 | ||
23 | #include <asm/ccwdev.h> | 23 | #include <asm/ccwdev.h> |
24 | #include <asm/ebcdic.h> | 24 | #include <asm/ebcdic.h> |
@@ -58,6 +58,7 @@ static void dasd_int_handler(struct ccw_device *, unsigned long, struct irb *); | |||
58 | static void dasd_flush_ccw_queue(struct dasd_device *, int); | 58 | static void dasd_flush_ccw_queue(struct dasd_device *, int); |
59 | static void dasd_tasklet(struct dasd_device *); | 59 | static void dasd_tasklet(struct dasd_device *); |
60 | static void do_kick_device(void *data); | 60 | static void do_kick_device(void *data); |
61 | static void dasd_disable_eer(struct dasd_device *device); | ||
61 | 62 | ||
62 | /* | 63 | /* |
63 | * SECTION: Operations on the device structure. | 64 | * SECTION: Operations on the device structure. |
@@ -152,6 +153,8 @@ dasd_state_new_to_known(struct dasd_device *device) | |||
152 | static inline void | 153 | static inline void |
153 | dasd_state_known_to_new(struct dasd_device * device) | 154 | dasd_state_known_to_new(struct dasd_device * device) |
154 | { | 155 | { |
156 | /* disable extended error reporting for this device */ | ||
157 | dasd_disable_eer(device); | ||
155 | /* Forget the discipline information. */ | 158 | /* Forget the discipline information. */ |
156 | device->discipline = NULL; | 159 | device->discipline = NULL; |
157 | device->state = DASD_STATE_NEW; | 160 | device->state = DASD_STATE_NEW; |
@@ -675,11 +678,8 @@ dasd_term_IO(struct dasd_ccw_req * cqr) | |||
675 | rc = ccw_device_clear(device->cdev, (long) cqr); | 678 | rc = ccw_device_clear(device->cdev, (long) cqr); |
676 | switch (rc) { | 679 | switch (rc) { |
677 | case 0: /* termination successful */ | 680 | case 0: /* termination successful */ |
678 | if (cqr->retries > 0) { | 681 | cqr->retries--; |
679 | cqr->retries--; | 682 | cqr->status = DASD_CQR_CLEAR; |
680 | cqr->status = DASD_CQR_CLEAR; | ||
681 | } else | ||
682 | cqr->status = DASD_CQR_FAILED; | ||
683 | cqr->stopclk = get_clock(); | 683 | cqr->stopclk = get_clock(); |
684 | DBF_DEV_EVENT(DBF_DEBUG, device, | 684 | DBF_DEV_EVENT(DBF_DEBUG, device, |
685 | "terminate cqr %p successful", | 685 | "terminate cqr %p successful", |
@@ -871,6 +871,9 @@ dasd_handle_state_change_pending(struct dasd_device *device) | |||
871 | struct dasd_ccw_req *cqr; | 871 | struct dasd_ccw_req *cqr; |
872 | struct list_head *l, *n; | 872 | struct list_head *l, *n; |
873 | 873 | ||
874 | /* first of all call extended error reporting */ | ||
875 | dasd_write_eer_trigger(DASD_EER_STATECHANGE, device, NULL); | ||
876 | |||
874 | device->stopped &= ~DASD_STOPPED_PENDING; | 877 | device->stopped &= ~DASD_STOPPED_PENDING; |
875 | 878 | ||
876 | /* restart all 'running' IO on queue */ | 879 | /* restart all 'running' IO on queue */ |
@@ -1090,6 +1093,19 @@ restart: | |||
1090 | } | 1093 | } |
1091 | goto restart; | 1094 | goto restart; |
1092 | } | 1095 | } |
1096 | |||
1097 | /* first of all call extended error reporting */ | ||
1098 | if (device->eer && cqr->status == DASD_CQR_FAILED) { | ||
1099 | dasd_write_eer_trigger(DASD_EER_FATALERROR, | ||
1100 | device, cqr); | ||
1101 | |||
1102 | /* restart request */ | ||
1103 | cqr->status = DASD_CQR_QUEUED; | ||
1104 | cqr->retries = 255; | ||
1105 | device->stopped |= DASD_STOPPED_QUIESCE; | ||
1106 | goto restart; | ||
1107 | } | ||
1108 | |||
1093 | /* Process finished ERP request. */ | 1109 | /* Process finished ERP request. */ |
1094 | if (cqr->refers) { | 1110 | if (cqr->refers) { |
1095 | __dasd_process_erp(device, cqr); | 1111 | __dasd_process_erp(device, cqr); |
@@ -1227,7 +1243,8 @@ __dasd_start_head(struct dasd_device * device) | |||
1227 | cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, list); | 1243 | cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, list); |
1228 | /* check FAILFAST */ | 1244 | /* check FAILFAST */ |
1229 | if (device->stopped & ~DASD_STOPPED_PENDING && | 1245 | if (device->stopped & ~DASD_STOPPED_PENDING && |
1230 | test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags)) { | 1246 | test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && |
1247 | (!device->eer)) { | ||
1231 | cqr->status = DASD_CQR_FAILED; | 1248 | cqr->status = DASD_CQR_FAILED; |
1232 | dasd_schedule_bh(device); | 1249 | dasd_schedule_bh(device); |
1233 | } | 1250 | } |
@@ -1308,7 +1325,7 @@ dasd_tasklet(struct dasd_device * device) | |||
1308 | /* Now call the callback function of requests with final status */ | 1325 | /* Now call the callback function of requests with final status */ |
1309 | list_for_each_safe(l, n, &final_queue) { | 1326 | list_for_each_safe(l, n, &final_queue) { |
1310 | cqr = list_entry(l, struct dasd_ccw_req, list); | 1327 | cqr = list_entry(l, struct dasd_ccw_req, list); |
1311 | list_del(&cqr->list); | 1328 | list_del_init(&cqr->list); |
1312 | if (cqr->callback != NULL) | 1329 | if (cqr->callback != NULL) |
1313 | (cqr->callback)(cqr, cqr->callback_data); | 1330 | (cqr->callback)(cqr, cqr->callback_data); |
1314 | } | 1331 | } |
@@ -1393,7 +1410,9 @@ _wait_for_wakeup(struct dasd_ccw_req *cqr) | |||
1393 | 1410 | ||
1394 | device = cqr->device; | 1411 | device = cqr->device; |
1395 | spin_lock_irq(get_ccwdev_lock(device->cdev)); | 1412 | spin_lock_irq(get_ccwdev_lock(device->cdev)); |
1396 | rc = cqr->status == DASD_CQR_DONE || cqr->status == DASD_CQR_FAILED; | 1413 | rc = ((cqr->status == DASD_CQR_DONE || |
1414 | cqr->status == DASD_CQR_FAILED) && | ||
1415 | list_empty(&cqr->list)); | ||
1397 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); | 1416 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); |
1398 | return rc; | 1417 | return rc; |
1399 | } | 1418 | } |
@@ -1457,15 +1476,37 @@ dasd_sleep_on_interruptible(struct dasd_ccw_req * cqr) | |||
1457 | while (!finished) { | 1476 | while (!finished) { |
1458 | rc = wait_event_interruptible(wait_q, _wait_for_wakeup(cqr)); | 1477 | rc = wait_event_interruptible(wait_q, _wait_for_wakeup(cqr)); |
1459 | if (rc != -ERESTARTSYS) { | 1478 | if (rc != -ERESTARTSYS) { |
1460 | /* Request status is either done or failed. */ | 1479 | /* Request is final (done or failed) */ |
1461 | rc = (cqr->status == DASD_CQR_FAILED) ? -EIO : 0; | 1480 | rc = (cqr->status == DASD_CQR_DONE) ? 0 : -EIO; |
1462 | break; | 1481 | break; |
1463 | } | 1482 | } |
1464 | spin_lock_irq(get_ccwdev_lock(device->cdev)); | 1483 | spin_lock_irq(get_ccwdev_lock(device->cdev)); |
1465 | if (cqr->status == DASD_CQR_IN_IO && | 1484 | switch (cqr->status) { |
1466 | device->discipline->term_IO(cqr) == 0) { | 1485 | case DASD_CQR_IN_IO: |
1467 | list_del(&cqr->list); | 1486 | /* terminate runnig cqr */ |
1487 | if (device->discipline->term_IO) { | ||
1488 | cqr->retries = -1; | ||
1489 | device->discipline->term_IO(cqr); | ||
1490 | /*nished = | ||
1491 | * wait (non-interruptible) for final status | ||
1492 | * because signal ist still pending | ||
1493 | */ | ||
1494 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); | ||
1495 | wait_event(wait_q, _wait_for_wakeup(cqr)); | ||
1496 | spin_lock_irq(get_ccwdev_lock(device->cdev)); | ||
1497 | rc = (cqr->status == DASD_CQR_DONE) ? 0 : -EIO; | ||
1498 | finished = 1; | ||
1499 | } | ||
1500 | break; | ||
1501 | case DASD_CQR_QUEUED: | ||
1502 | /* request */ | ||
1503 | list_del_init(&cqr->list); | ||
1504 | rc = -EIO; | ||
1468 | finished = 1; | 1505 | finished = 1; |
1506 | break; | ||
1507 | default: | ||
1508 | /* cqr with 'non-interruptable' status - just wait */ | ||
1509 | break; | ||
1469 | } | 1510 | } |
1470 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); | 1511 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); |
1471 | } | 1512 | } |
@@ -1945,6 +1986,9 @@ dasd_generic_notify(struct ccw_device *cdev, int event) | |||
1945 | switch (event) { | 1986 | switch (event) { |
1946 | case CIO_GONE: | 1987 | case CIO_GONE: |
1947 | case CIO_NO_PATH: | 1988 | case CIO_NO_PATH: |
1989 | /* first of all call extended error reporting */ | ||
1990 | dasd_write_eer_trigger(DASD_EER_NOPATH, device, NULL); | ||
1991 | |||
1948 | if (device->state < DASD_STATE_BASIC) | 1992 | if (device->state < DASD_STATE_BASIC) |
1949 | break; | 1993 | break; |
1950 | /* Device is active. We want to keep it. */ | 1994 | /* Device is active. We want to keep it. */ |
@@ -2002,6 +2046,51 @@ dasd_generic_auto_online (struct ccw_driver *dasd_discipline_driver) | |||
2002 | put_driver(drv); | 2046 | put_driver(drv); |
2003 | } | 2047 | } |
2004 | 2048 | ||
2049 | /* | ||
2050 | * notifications for extended error reports | ||
2051 | */ | ||
2052 | static struct notifier_block *dasd_eer_chain; | ||
2053 | |||
2054 | int | ||
2055 | dasd_register_eer_notifier(struct notifier_block *nb) | ||
2056 | { | ||
2057 | return notifier_chain_register(&dasd_eer_chain, nb); | ||
2058 | } | ||
2059 | |||
2060 | int | ||
2061 | dasd_unregister_eer_notifier(struct notifier_block *nb) | ||
2062 | { | ||
2063 | return notifier_chain_unregister(&dasd_eer_chain, nb); | ||
2064 | } | ||
2065 | |||
2066 | /* | ||
2067 | * Notify the registered error reporting module of a problem | ||
2068 | */ | ||
2069 | void | ||
2070 | dasd_write_eer_trigger(unsigned int id, struct dasd_device *device, | ||
2071 | struct dasd_ccw_req *cqr) | ||
2072 | { | ||
2073 | if (device->eer) { | ||
2074 | struct dasd_eer_trigger temp; | ||
2075 | temp.id = id; | ||
2076 | temp.device = device; | ||
2077 | temp.cqr = cqr; | ||
2078 | notifier_call_chain(&dasd_eer_chain, DASD_EER_TRIGGER, | ||
2079 | (void *)&temp); | ||
2080 | } | ||
2081 | } | ||
2082 | |||
2083 | /* | ||
2084 | * Tell the registered error reporting module to disable error reporting for | ||
2085 | * a given device and to cleanup any private data structures on that device. | ||
2086 | */ | ||
2087 | static void | ||
2088 | dasd_disable_eer(struct dasd_device *device) | ||
2089 | { | ||
2090 | notifier_call_chain(&dasd_eer_chain, DASD_EER_DISABLE, (void *)device); | ||
2091 | } | ||
2092 | |||
2093 | |||
2005 | static int __init | 2094 | static int __init |
2006 | dasd_init(void) | 2095 | dasd_init(void) |
2007 | { | 2096 | { |
@@ -2083,6 +2172,11 @@ EXPORT_SYMBOL_GPL(dasd_generic_set_online); | |||
2083 | EXPORT_SYMBOL_GPL(dasd_generic_set_offline); | 2172 | EXPORT_SYMBOL_GPL(dasd_generic_set_offline); |
2084 | EXPORT_SYMBOL_GPL(dasd_generic_auto_online); | 2173 | EXPORT_SYMBOL_GPL(dasd_generic_auto_online); |
2085 | 2174 | ||
2175 | EXPORT_SYMBOL(dasd_register_eer_notifier); | ||
2176 | EXPORT_SYMBOL(dasd_unregister_eer_notifier); | ||
2177 | EXPORT_SYMBOL(dasd_write_eer_trigger); | ||
2178 | |||
2179 | |||
2086 | /* | 2180 | /* |
2087 | * Overrides for Emacs so that we follow Linus's tabbing style. | 2181 | * Overrides for Emacs so that we follow Linus's tabbing style. |
2088 | * Emacs will notice this stuff at the end of the file and automatically | 2182 | * Emacs will notice this stuff at the end of the file and automatically |
diff --git a/drivers/s390/block/dasd_3370_erp.c b/drivers/s390/block/dasd_3370_erp.c index 84565c8f584e..1d11c2a9525d 100644 --- a/drivers/s390/block/dasd_3370_erp.c +++ b/drivers/s390/block/dasd_3370_erp.c | |||
@@ -4,7 +4,6 @@ | |||
4 | * Bugreports.to..: <Linux390@de.ibm.com> | 4 | * Bugreports.to..: <Linux390@de.ibm.com> |
5 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000 | 5 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000 |
6 | * | 6 | * |
7 | * $Revision: 1.9 $ | ||
8 | */ | 7 | */ |
9 | 8 | ||
10 | #define PRINTK_HEADER "dasd_erp(3370)" | 9 | #define PRINTK_HEADER "dasd_erp(3370)" |
diff --git a/drivers/s390/block/dasd_3990_erp.c b/drivers/s390/block/dasd_3990_erp.c index c143ecb53d9d..c811380b9079 100644 --- a/drivers/s390/block/dasd_3990_erp.c +++ b/drivers/s390/block/dasd_3990_erp.c | |||
@@ -5,7 +5,6 @@ | |||
5 | * Bugreports.to..: <Linux390@de.ibm.com> | 5 | * Bugreports.to..: <Linux390@de.ibm.com> |
6 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000, 2001 | 6 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000, 2001 |
7 | * | 7 | * |
8 | * $Revision: 1.36 $ | ||
9 | */ | 8 | */ |
10 | 9 | ||
11 | #include <linux/timer.h> | 10 | #include <linux/timer.h> |
@@ -1109,6 +1108,9 @@ dasd_3990_handle_env_data(struct dasd_ccw_req * erp, char *sense) | |||
1109 | case 0x0B: | 1108 | case 0x0B: |
1110 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 1109 | DEV_MESSAGE(KERN_WARNING, device, "%s", |
1111 | "FORMAT F - Volume is suspended duplex"); | 1110 | "FORMAT F - Volume is suspended duplex"); |
1111 | /* call extended error reporting (EER) */ | ||
1112 | dasd_write_eer_trigger(DASD_EER_PPRCSUSPEND, device, | ||
1113 | erp->refers); | ||
1112 | break; | 1114 | break; |
1113 | case 0x0C: | 1115 | case 0x0C: |
1114 | DEV_MESSAGE(KERN_WARNING, device, "%s", | 1116 | DEV_MESSAGE(KERN_WARNING, device, "%s", |
diff --git a/drivers/s390/block/dasd_9336_erp.c b/drivers/s390/block/dasd_9336_erp.c index 01e87170a3a2..dc861446d056 100644 --- a/drivers/s390/block/dasd_9336_erp.c +++ b/drivers/s390/block/dasd_9336_erp.c | |||
@@ -4,7 +4,6 @@ | |||
4 | * Bugreports.to..: <Linux390@de.ibm.com> | 4 | * Bugreports.to..: <Linux390@de.ibm.com> |
5 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000 | 5 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000 |
6 | * | 6 | * |
7 | * $Revision: 1.8 $ | ||
8 | */ | 7 | */ |
9 | 8 | ||
10 | #define PRINTK_HEADER "dasd_erp(9336)" | 9 | #define PRINTK_HEADER "dasd_erp(9336)" |
diff --git a/drivers/s390/block/dasd_9343_erp.c b/drivers/s390/block/dasd_9343_erp.c index 2a23b74faf3f..4a5b79569aaa 100644 --- a/drivers/s390/block/dasd_9343_erp.c +++ b/drivers/s390/block/dasd_9343_erp.c | |||
@@ -4,7 +4,6 @@ | |||
4 | * Bugreports.to..: <Linux390@de.ibm.com> | 4 | * Bugreports.to..: <Linux390@de.ibm.com> |
5 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000 | 5 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 2000 |
6 | * | 6 | * |
7 | * $Revision: 1.13 $ | ||
8 | */ | 7 | */ |
9 | 8 | ||
10 | #define PRINTK_HEADER "dasd_erp(9343)" | 9 | #define PRINTK_HEADER "dasd_erp(9343)" |
diff --git a/drivers/s390/block/dasd_cmb.c b/drivers/s390/block/dasd_cmb.c index 4f365bff275c..e88f73ee72ce 100644 --- a/drivers/s390/block/dasd_cmb.c +++ b/drivers/s390/block/dasd_cmb.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/s390/block/dasd_cmb.c ($Revision: 1.9 $) | ||
3 | * | ||
4 | * Linux on zSeries Channel Measurement Facility support | 2 | * Linux on zSeries Channel Measurement Facility support |
5 | * (dasd device driver interface) | 3 | * (dasd device driver interface) |
6 | * | 4 | * |
diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c index caee16a3dc62..1629b27c48ab 100644 --- a/drivers/s390/block/dasd_devmap.c +++ b/drivers/s390/block/dasd_devmap.c | |||
@@ -11,7 +11,6 @@ | |||
11 | * functions may not be called from interrupt context. In particular | 11 | * functions may not be called from interrupt context. In particular |
12 | * dasd_get_device is a no-no from interrupt context. | 12 | * dasd_get_device is a no-no from interrupt context. |
13 | * | 13 | * |
14 | * $Revision: 1.43 $ | ||
15 | */ | 14 | */ |
16 | 15 | ||
17 | #include <linux/config.h> | 16 | #include <linux/config.h> |
diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c index ba80fdea7ebf..3f9d704d2657 100644 --- a/drivers/s390/block/dasd_diag.c +++ b/drivers/s390/block/dasd_diag.c | |||
@@ -6,7 +6,6 @@ | |||
6 | * Bugreports.to..: <Linux390@de.ibm.com> | 6 | * Bugreports.to..: <Linux390@de.ibm.com> |
7 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 | 7 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 |
8 | * | 8 | * |
9 | * $Revision: 1.53 $ | ||
10 | */ | 9 | */ |
11 | 10 | ||
12 | #include <linux/config.h> | 11 | #include <linux/config.h> |
diff --git a/drivers/s390/block/dasd_diag.h b/drivers/s390/block/dasd_diag.h index a4f80bd735f1..38a4e55f8953 100644 --- a/drivers/s390/block/dasd_diag.h +++ b/drivers/s390/block/dasd_diag.h | |||
@@ -6,7 +6,6 @@ | |||
6 | * Bugreports.to..: <Linux390@de.ibm.com> | 6 | * Bugreports.to..: <Linux390@de.ibm.com> |
7 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 | 7 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 |
8 | * | 8 | * |
9 | * $Revision: 1.9 $ | ||
10 | */ | 9 | */ |
11 | 10 | ||
12 | #define MDSK_WRITE_REQ 0x01 | 11 | #define MDSK_WRITE_REQ 0x01 |
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 96eb48258580..822e2a265578 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -7,7 +7,6 @@ | |||
7 | * Bugreports.to..: <Linux390@de.ibm.com> | 7 | * Bugreports.to..: <Linux390@de.ibm.com> |
8 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 | 8 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 |
9 | * | 9 | * |
10 | * $Revision: 1.74 $ | ||
11 | */ | 10 | */ |
12 | 11 | ||
13 | #include <linux/config.h> | 12 | #include <linux/config.h> |
diff --git a/drivers/s390/block/dasd_eckd.h b/drivers/s390/block/dasd_eckd.h index b6888c68b224..e15dd7978050 100644 --- a/drivers/s390/block/dasd_eckd.h +++ b/drivers/s390/block/dasd_eckd.h | |||
@@ -5,7 +5,6 @@ | |||
5 | * Bugreports.to..: <Linux390@de.ibm.com> | 5 | * Bugreports.to..: <Linux390@de.ibm.com> |
6 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 | 6 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 |
7 | * | 7 | * |
8 | * $Revision: 1.10 $ | ||
9 | */ | 8 | */ |
10 | 9 | ||
11 | #ifndef DASD_ECKD_H | 10 | #ifndef DASD_ECKD_H |
@@ -30,6 +29,7 @@ | |||
30 | #define DASD_ECKD_CCW_PSF 0x27 | 29 | #define DASD_ECKD_CCW_PSF 0x27 |
31 | #define DASD_ECKD_CCW_RSSD 0x3e | 30 | #define DASD_ECKD_CCW_RSSD 0x3e |
32 | #define DASD_ECKD_CCW_LOCATE_RECORD 0x47 | 31 | #define DASD_ECKD_CCW_LOCATE_RECORD 0x47 |
32 | #define DASD_ECKD_CCW_SNSS 0x54 | ||
33 | #define DASD_ECKD_CCW_DEFINE_EXTENT 0x63 | 33 | #define DASD_ECKD_CCW_DEFINE_EXTENT 0x63 |
34 | #define DASD_ECKD_CCW_WRITE_MT 0x85 | 34 | #define DASD_ECKD_CCW_WRITE_MT 0x85 |
35 | #define DASD_ECKD_CCW_READ_MT 0x86 | 35 | #define DASD_ECKD_CCW_READ_MT 0x86 |
diff --git a/drivers/s390/block/dasd_eer.c b/drivers/s390/block/dasd_eer.c new file mode 100644 index 000000000000..f70cd7716b24 --- /dev/null +++ b/drivers/s390/block/dasd_eer.c | |||
@@ -0,0 +1,1090 @@ | |||
1 | /* | ||
2 | * character device driver for extended error reporting | ||
3 | * | ||
4 | * | ||
5 | * Copyright (C) 2005 IBM Corporation | ||
6 | * extended error reporting for DASD ECKD devices | ||
7 | * Author(s): Stefan Weinhuber <wein@de.ibm.com> | ||
8 | * | ||
9 | */ | ||
10 | |||
11 | #include <linux/init.h> | ||
12 | #include <linux/fs.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/miscdevice.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/moduleparam.h> | ||
17 | #include <linux/device.h> | ||
18 | #include <linux/workqueue.h> | ||
19 | #include <linux/poll.h> | ||
20 | #include <linux/notifier.h> | ||
21 | |||
22 | #include <asm/uaccess.h> | ||
23 | #include <asm/semaphore.h> | ||
24 | #include <asm/atomic.h> | ||
25 | #include <asm/ebcdic.h> | ||
26 | |||
27 | #include "dasd_int.h" | ||
28 | #include "dasd_eckd.h" | ||
29 | |||
30 | |||
31 | MODULE_LICENSE("GPL"); | ||
32 | |||
33 | MODULE_AUTHOR("Stefan Weinhuber <wein@de.ibm.com>"); | ||
34 | MODULE_DESCRIPTION("DASD extended error reporting module"); | ||
35 | |||
36 | |||
37 | #ifdef PRINTK_HEADER | ||
38 | #undef PRINTK_HEADER | ||
39 | #endif /* PRINTK_HEADER */ | ||
40 | #define PRINTK_HEADER "dasd(eer):" | ||
41 | |||
42 | |||
43 | |||
44 | |||
45 | |||
46 | /*****************************************************************************/ | ||
47 | /* the internal buffer */ | ||
48 | /*****************************************************************************/ | ||
49 | |||
50 | /* | ||
51 | * The internal buffer is meant to store obaque blobs of data, so it doesn't | ||
52 | * know of higher level concepts like triggers. | ||
53 | * It consists of a number of pages that are used as a ringbuffer. Each data | ||
54 | * blob is stored in a simple record that consists of an integer, which | ||
55 | * contains the size of the following data, and the data bytes themselfes. | ||
56 | * | ||
57 | * To allow for multiple independent readers we create one internal buffer | ||
58 | * each time the device is opened and destroy the buffer when the file is | ||
59 | * closed again. | ||
60 | * | ||
61 | * One record can be written to a buffer by using the functions | ||
62 | * - dasd_eer_start_record (one time per record to write the size to the buffer | ||
63 | * and reserve the space for the data) | ||
64 | * - dasd_eer_write_buffer (one or more times per record to write the data) | ||
65 | * The data can be written in several steps but you will have to compute | ||
66 | * the total size up front for the invocation of dasd_eer_start_record. | ||
67 | * If the ringbuffer is full, dasd_eer_start_record will remove the required | ||
68 | * number of old records. | ||
69 | * | ||
70 | * A record is typically read in two steps, first read the integer that | ||
71 | * specifies the size of the following data, then read the data. | ||
72 | * Both can be done by | ||
73 | * - dasd_eer_read_buffer | ||
74 | * | ||
75 | * For all mentioned functions you need to get the bufferlock first and keep it | ||
76 | * until a complete record is written or read. | ||
77 | */ | ||
78 | |||
79 | |||
80 | /* | ||
81 | * Alle information necessary to keep track of an internal buffer is kept in | ||
82 | * a struct eerbuffer. The buffer specific to a file pointer is strored in | ||
83 | * the private_data field of that file. To be able to write data to all | ||
84 | * existing buffers, each buffer is also added to the bufferlist. | ||
85 | * If the user doesn't want to read a complete record in one go, we have to | ||
86 | * keep track of the rest of the record. residual stores the number of bytes | ||
87 | * that are still to deliver. If the rest of the record is invalidated between | ||
88 | * two reads then residual will be set to -1 so that the next read will fail. | ||
89 | * All entries in the eerbuffer structure are protected with the bufferlock. | ||
90 | * To avoid races between writing to a buffer on the one side and creating | ||
91 | * and destroying buffers on the other side, the bufferlock must also be used | ||
92 | * to protect the bufferlist. | ||
93 | */ | ||
94 | |||
95 | struct eerbuffer { | ||
96 | struct list_head list; | ||
97 | char **buffer; | ||
98 | int buffersize; | ||
99 | int buffer_page_count; | ||
100 | int head; | ||
101 | int tail; | ||
102 | int residual; | ||
103 | }; | ||
104 | |||
105 | LIST_HEAD(bufferlist); | ||
106 | |||
107 | static spinlock_t bufferlock = SPIN_LOCK_UNLOCKED; | ||
108 | |||
109 | DECLARE_WAIT_QUEUE_HEAD(dasd_eer_read_wait_queue); | ||
110 | |||
111 | /* | ||
112 | * How many free bytes are available on the buffer. | ||
113 | * needs to be called with bufferlock held | ||
114 | */ | ||
115 | static int | ||
116 | dasd_eer_get_free_bytes(struct eerbuffer *eerb) | ||
117 | { | ||
118 | if (eerb->head < eerb->tail) { | ||
119 | return eerb->tail - eerb->head - 1; | ||
120 | } else | ||
121 | return eerb->buffersize - eerb->head + eerb->tail -1; | ||
122 | } | ||
123 | |||
124 | /* | ||
125 | * How many bytes of buffer space are used. | ||
126 | * needs to be called with bufferlock held | ||
127 | */ | ||
128 | static int | ||
129 | dasd_eer_get_filled_bytes(struct eerbuffer *eerb) | ||
130 | { | ||
131 | |||
132 | if (eerb->head >= eerb->tail) { | ||
133 | return eerb->head - eerb->tail; | ||
134 | } else | ||
135 | return eerb->buffersize - eerb->tail + eerb->head; | ||
136 | } | ||
137 | |||
138 | /* | ||
139 | * The dasd_eer_write_buffer function just copies count bytes of data | ||
140 | * to the buffer. Make sure to call dasd_eer_start_record first, to | ||
141 | * make sure that enough free space is available. | ||
142 | * needs to be called with bufferlock held | ||
143 | */ | ||
144 | static void | ||
145 | dasd_eer_write_buffer(struct eerbuffer *eerb, int count, char *data) | ||
146 | { | ||
147 | |||
148 | unsigned long headindex,localhead; | ||
149 | unsigned long rest, len; | ||
150 | char *nextdata; | ||
151 | |||
152 | nextdata = data; | ||
153 | rest = count; | ||
154 | while (rest > 0) { | ||
155 | headindex = eerb->head / PAGE_SIZE; | ||
156 | localhead = eerb->head % PAGE_SIZE; | ||
157 | len = min(rest, (PAGE_SIZE - localhead)); | ||
158 | memcpy(eerb->buffer[headindex]+localhead, nextdata, len); | ||
159 | nextdata += len; | ||
160 | rest -= len; | ||
161 | eerb->head += len; | ||
162 | if ( eerb->head == eerb->buffersize ) | ||
163 | eerb->head = 0; /* wrap around */ | ||
164 | if (eerb->head > eerb->buffersize) { | ||
165 | MESSAGE(KERN_ERR, "%s", "runaway buffer head."); | ||
166 | BUG(); | ||
167 | } | ||
168 | } | ||
169 | } | ||
170 | |||
171 | /* | ||
172 | * needs to be called with bufferlock held | ||
173 | */ | ||
174 | static int | ||
175 | dasd_eer_read_buffer(struct eerbuffer *eerb, int count, char *data) | ||
176 | { | ||
177 | |||
178 | unsigned long tailindex,localtail; | ||
179 | unsigned long rest, len, finalcount; | ||
180 | char *nextdata; | ||
181 | |||
182 | finalcount = min(count, dasd_eer_get_filled_bytes(eerb)); | ||
183 | nextdata = data; | ||
184 | rest = finalcount; | ||
185 | while (rest > 0) { | ||
186 | tailindex = eerb->tail / PAGE_SIZE; | ||
187 | localtail = eerb->tail % PAGE_SIZE; | ||
188 | len = min(rest, (PAGE_SIZE - localtail)); | ||
189 | memcpy(nextdata, eerb->buffer[tailindex]+localtail, len); | ||
190 | nextdata += len; | ||
191 | rest -= len; | ||
192 | eerb->tail += len; | ||
193 | if ( eerb->tail == eerb->buffersize ) | ||
194 | eerb->tail = 0; /* wrap around */ | ||
195 | if (eerb->tail > eerb->buffersize) { | ||
196 | MESSAGE(KERN_ERR, "%s", "runaway buffer tail."); | ||
197 | BUG(); | ||
198 | } | ||
199 | } | ||
200 | return finalcount; | ||
201 | } | ||
202 | |||
203 | /* | ||
204 | * Whenever you want to write a blob of data to the internal buffer you | ||
205 | * have to start by using this function first. It will write the number | ||
206 | * of bytes that will be written to the buffer. If necessary it will remove | ||
207 | * old records to make room for the new one. | ||
208 | * needs to be called with bufferlock held | ||
209 | */ | ||
210 | static int | ||
211 | dasd_eer_start_record(struct eerbuffer *eerb, int count) | ||
212 | { | ||
213 | int tailcount; | ||
214 | if (count + sizeof(count) > eerb->buffersize) | ||
215 | return -ENOMEM; | ||
216 | while (dasd_eer_get_free_bytes(eerb) < count + sizeof(count)) { | ||
217 | if (eerb->residual > 0) { | ||
218 | eerb->tail += eerb->residual; | ||
219 | if (eerb->tail >= eerb->buffersize) | ||
220 | eerb->tail -= eerb->buffersize; | ||
221 | eerb->residual = -1; | ||
222 | } | ||
223 | dasd_eer_read_buffer(eerb, sizeof(tailcount), | ||
224 | (char*)(&tailcount)); | ||
225 | eerb->tail += tailcount; | ||
226 | if (eerb->tail >= eerb->buffersize) | ||
227 | eerb->tail -= eerb->buffersize; | ||
228 | } | ||
229 | dasd_eer_write_buffer(eerb, sizeof(count), (char*)(&count)); | ||
230 | |||
231 | return 0; | ||
232 | }; | ||
233 | |||
234 | /* | ||
235 | * release pages that are not used anymore | ||
236 | */ | ||
237 | static void | ||
238 | dasd_eer_free_buffer_pages(char **buf, int no_pages) | ||
239 | { | ||
240 | int i; | ||
241 | |||
242 | for (i = 0; i < no_pages; ++i) { | ||
243 | free_page((unsigned long)buf[i]); | ||
244 | } | ||
245 | } | ||
246 | |||
247 | /* | ||
248 | * allocate a new set of memory pages | ||
249 | */ | ||
250 | static int | ||
251 | dasd_eer_allocate_buffer_pages(char **buf, int no_pages) | ||
252 | { | ||
253 | int i; | ||
254 | |||
255 | for (i = 0; i < no_pages; ++i) { | ||
256 | buf[i] = (char *) get_zeroed_page(GFP_KERNEL); | ||
257 | if (!buf[i]) { | ||
258 | dasd_eer_free_buffer_pages(buf, i); | ||
259 | return -ENOMEM; | ||
260 | } | ||
261 | } | ||
262 | return 0; | ||
263 | } | ||
264 | |||
265 | /* | ||
266 | * empty the buffer by resetting head and tail | ||
267 | * In case there is a half read data blob in the buffer, we set residual | ||
268 | * to -1 to indicate that the remainder of the blob is lost. | ||
269 | */ | ||
270 | static void | ||
271 | dasd_eer_purge_buffer(struct eerbuffer *eerb) | ||
272 | { | ||
273 | unsigned long flags; | ||
274 | |||
275 | spin_lock_irqsave(&bufferlock, flags); | ||
276 | if (eerb->residual > 0) | ||
277 | eerb->residual = -1; | ||
278 | eerb->tail=0; | ||
279 | eerb->head=0; | ||
280 | spin_unlock_irqrestore(&bufferlock, flags); | ||
281 | } | ||
282 | |||
283 | /* | ||
284 | * set the size of the buffer, newsize is the new number of pages to be used | ||
285 | * we don't try to copy any data back an forth, so any resize will also purge | ||
286 | * the buffer | ||
287 | */ | ||
288 | static int | ||
289 | dasd_eer_resize_buffer(struct eerbuffer *eerb, int newsize) | ||
290 | { | ||
291 | int i, oldcount, reuse; | ||
292 | char **new; | ||
293 | char **old; | ||
294 | unsigned long flags; | ||
295 | |||
296 | if (newsize < 1) | ||
297 | return -EINVAL; | ||
298 | if (eerb->buffer_page_count == newsize) { | ||
299 | /* documented behaviour is that any successfull invocation | ||
300 | * will purge all records */ | ||
301 | dasd_eer_purge_buffer(eerb); | ||
302 | return 0; | ||
303 | } | ||
304 | new = kmalloc(newsize*sizeof(char*), GFP_KERNEL); | ||
305 | if (!new) | ||
306 | return -ENOMEM; | ||
307 | |||
308 | reuse=min(eerb->buffer_page_count, newsize); | ||
309 | for (i = 0; i < reuse; ++i) { | ||
310 | new[i] = eerb->buffer[i]; | ||
311 | } | ||
312 | if (eerb->buffer_page_count < newsize) { | ||
313 | if (dasd_eer_allocate_buffer_pages( | ||
314 | &new[eerb->buffer_page_count], | ||
315 | newsize - eerb->buffer_page_count)) { | ||
316 | kfree(new); | ||
317 | return -ENOMEM; | ||
318 | } | ||
319 | } | ||
320 | |||
321 | spin_lock_irqsave(&bufferlock, flags); | ||
322 | old = eerb->buffer; | ||
323 | eerb->buffer = new; | ||
324 | if (eerb->residual > 0) | ||
325 | eerb->residual = -1; | ||
326 | eerb->tail = 0; | ||
327 | eerb->head = 0; | ||
328 | oldcount = eerb->buffer_page_count; | ||
329 | eerb->buffer_page_count = newsize; | ||
330 | spin_unlock_irqrestore(&bufferlock, flags); | ||
331 | |||
332 | if (oldcount > newsize) { | ||
333 | for (i = newsize; i < oldcount; ++i) { | ||
334 | free_page((unsigned long)old[i]); | ||
335 | } | ||
336 | } | ||
337 | kfree(old); | ||
338 | |||
339 | return 0; | ||
340 | } | ||
341 | |||
342 | |||
343 | /*****************************************************************************/ | ||
344 | /* The extended error reporting functionality */ | ||
345 | /*****************************************************************************/ | ||
346 | |||
347 | /* | ||
348 | * When a DASD device driver wants to report an error, it calls the | ||
349 | * function dasd_eer_write_trigger (via a notifier mechanism) and gives the | ||
350 | * respective trigger ID as parameter. | ||
351 | * Currently there are four kinds of triggers: | ||
352 | * | ||
353 | * DASD_EER_FATALERROR: all kinds of unrecoverable I/O problems | ||
354 | * DASD_EER_PPRCSUSPEND: PPRC was suspended | ||
355 | * DASD_EER_NOPATH: There is no path to the device left. | ||
356 | * DASD_EER_STATECHANGE: The state of the device has changed. | ||
357 | * | ||
358 | * For the first three triggers all required information can be supplied by | ||
359 | * the caller. For these triggers a record is written by the function | ||
360 | * dasd_eer_write_standard_trigger. | ||
361 | * | ||
362 | * When dasd_eer_write_trigger is called to write a DASD_EER_STATECHANGE | ||
363 | * trigger, we have to gather the necessary sense data first. We cannot queue | ||
364 | * the necessary SNSS (sense subsystem status) request immediatly, since we | ||
365 | * are likely to run in a deadlock situation. Instead, we schedule a | ||
366 | * work_struct that calls the function dasd_eer_sense_subsystem_status to | ||
367 | * create and start an SNSS request asynchronously. | ||
368 | * | ||
369 | * To avoid memory allocations at runtime, the necessary memory is allocated | ||
370 | * when the extended error reporting is enabled for a device (by | ||
371 | * dasd_eer_probe). There is one private eer data structure for each eer | ||
372 | * enabled DASD device. It contains memory for the work_struct, one SNSS cqr | ||
373 | * and a flags field that is used to coordinate the use of the cqr. The call | ||
374 | * to write a state change trigger can come in at any time, so we have one flag | ||
375 | * CQR_IN_USE that protects the cqr itself. When this flag indicates that the | ||
376 | * cqr is currently in use, dasd_eer_sense_subsystem_status cannot start a | ||
377 | * second request but sets the SNSS_REQUESTED flag instead. | ||
378 | * | ||
379 | * When the request is finished, the callback function dasd_eer_SNSS_cb | ||
380 | * is called. This function will invoke the function | ||
381 | * dasd_eer_write_SNSS_trigger to finally write the trigger. It will also | ||
382 | * check the SNSS_REQUESTED flag and if it is set it will call | ||
383 | * dasd_eer_sense_subsystem_status again. | ||
384 | * | ||
385 | * To avoid race conditions during the handling of the lock, the flags must | ||
386 | * be protected by the snsslock. | ||
387 | */ | ||
388 | |||
389 | struct dasd_eer_private { | ||
390 | struct dasd_ccw_req *cqr; | ||
391 | unsigned long flags; | ||
392 | struct work_struct worker; | ||
393 | }; | ||
394 | |||
395 | static void dasd_eer_destroy(struct dasd_device *device, | ||
396 | struct dasd_eer_private *eer); | ||
397 | static int | ||
398 | dasd_eer_write_trigger(struct dasd_eer_trigger *trigger); | ||
399 | static void dasd_eer_sense_subsystem_status(void *data); | ||
400 | static int dasd_eer_notify(struct notifier_block *self, | ||
401 | unsigned long action, void *data); | ||
402 | |||
403 | struct workqueue_struct *dasd_eer_workqueue; | ||
404 | |||
405 | #define SNSS_DATA_SIZE 44 | ||
406 | static spinlock_t snsslock = SPIN_LOCK_UNLOCKED; | ||
407 | |||
408 | #define DASD_EER_BUSID_SIZE 10 | ||
409 | struct dasd_eer_header { | ||
410 | __u32 total_size; | ||
411 | __u32 trigger; | ||
412 | __u64 tv_sec; | ||
413 | __u64 tv_usec; | ||
414 | char busid[DASD_EER_BUSID_SIZE]; | ||
415 | } __attribute__ ((packed)); | ||
416 | |||
417 | static struct notifier_block dasd_eer_nb = { | ||
418 | .notifier_call = dasd_eer_notify, | ||
419 | }; | ||
420 | |||
421 | /* | ||
422 | * flags for use with dasd_eer_private | ||
423 | */ | ||
424 | #define CQR_IN_USE 0 | ||
425 | #define SNSS_REQUESTED 1 | ||
426 | |||
427 | /* | ||
428 | * This function checks if extended error reporting is available for a given | ||
429 | * dasd_device. If yes, then it creates and returns a struct dasd_eer, | ||
430 | * otherwise it returns an -EPERM error pointer. | ||
431 | */ | ||
432 | struct dasd_eer_private * | ||
433 | dasd_eer_probe(struct dasd_device *device) | ||
434 | { | ||
435 | struct dasd_eer_private *private; | ||
436 | |||
437 | if (!(device && device->discipline | ||
438 | && !strcmp(device->discipline->name, "ECKD"))) { | ||
439 | return ERR_PTR(-EPERM); | ||
440 | } | ||
441 | /* allocate the private data structure */ | ||
442 | private = (struct dasd_eer_private *)kmalloc( | ||
443 | sizeof(struct dasd_eer_private), GFP_KERNEL); | ||
444 | if (!private) { | ||
445 | return ERR_PTR(-ENOMEM); | ||
446 | } | ||
447 | INIT_WORK(&private->worker, dasd_eer_sense_subsystem_status, | ||
448 | (void *)device); | ||
449 | private->cqr = dasd_kmalloc_request("ECKD", | ||
450 | 1 /* SNSS */ , | ||
451 | SNSS_DATA_SIZE , | ||
452 | device); | ||
453 | if (!private->cqr) { | ||
454 | kfree(private); | ||
455 | return ERR_PTR(-ENOMEM); | ||
456 | } | ||
457 | private->flags = 0; | ||
458 | return private; | ||
459 | }; | ||
460 | |||
461 | /* | ||
462 | * If our private SNSS request is queued, remove it from the | ||
463 | * dasd ccw queue so we can free the requests memory. | ||
464 | */ | ||
465 | static void | ||
466 | dasd_eer_dequeue_SNSS_request(struct dasd_device *device, | ||
467 | struct dasd_eer_private *eer) | ||
468 | { | ||
469 | struct list_head *lst, *nxt; | ||
470 | struct dasd_ccw_req *cqr, *erpcqr; | ||
471 | dasd_erp_fn_t erp_fn; | ||
472 | |||
473 | spin_lock_irq(get_ccwdev_lock(device->cdev)); | ||
474 | list_for_each_safe(lst, nxt, &device->ccw_queue) { | ||
475 | cqr = list_entry(lst, struct dasd_ccw_req, list); | ||
476 | /* we are looking for two kinds or requests */ | ||
477 | /* first kind: our SNSS request: */ | ||
478 | if (cqr == eer->cqr) { | ||
479 | if (cqr->status == DASD_CQR_IN_IO) | ||
480 | device->discipline->term_IO(cqr); | ||
481 | list_del(&cqr->list); | ||
482 | break; | ||
483 | } | ||
484 | /* second kind: ERP requests for our SNSS request */ | ||
485 | if (cqr->refers) { | ||
486 | /* If this erp request chain ends in our cqr, then */ | ||
487 | /* cal the erp_postaction to clean it up */ | ||
488 | erpcqr = cqr; | ||
489 | while (erpcqr->refers) { | ||
490 | erpcqr = erpcqr->refers; | ||
491 | } | ||
492 | if (erpcqr == eer->cqr) { | ||
493 | erp_fn = device->discipline->erp_postaction( | ||
494 | cqr); | ||
495 | erp_fn(cqr); | ||
496 | } | ||
497 | continue; | ||
498 | } | ||
499 | } | ||
500 | spin_unlock_irq(get_ccwdev_lock(device->cdev)); | ||
501 | } | ||
502 | |||
503 | /* | ||
504 | * This function dismantles a struct dasd_eer that was created by | ||
505 | * dasd_eer_probe. Since we want to free our private data structure, | ||
506 | * we must make sure that the memory is not in use anymore. | ||
507 | * We have to flush the work queue and remove a possible SNSS request | ||
508 | * from the dasd queue. | ||
509 | */ | ||
510 | static void | ||
511 | dasd_eer_destroy(struct dasd_device *device, struct dasd_eer_private *eer) | ||
512 | { | ||
513 | flush_workqueue(dasd_eer_workqueue); | ||
514 | dasd_eer_dequeue_SNSS_request(device, eer); | ||
515 | dasd_kfree_request(eer->cqr, device); | ||
516 | kfree(eer); | ||
517 | }; | ||
518 | |||
519 | /* | ||
520 | * enable the extended error reporting for a particular device | ||
521 | */ | ||
522 | static int | ||
523 | dasd_eer_enable_on_device(struct dasd_device *device) | ||
524 | { | ||
525 | void *eer; | ||
526 | if (!device) | ||
527 | return -ENODEV; | ||
528 | if (device->eer) | ||
529 | return 0; | ||
530 | if (!try_module_get(THIS_MODULE)) { | ||
531 | return -EINVAL; | ||
532 | } | ||
533 | eer = (void *)dasd_eer_probe(device); | ||
534 | if (IS_ERR(eer)) { | ||
535 | module_put(THIS_MODULE); | ||
536 | return PTR_ERR(eer); | ||
537 | } | ||
538 | device->eer = eer; | ||
539 | return 0; | ||
540 | } | ||
541 | |||
542 | /* | ||
543 | * enable the extended error reporting for a particular device | ||
544 | */ | ||
545 | static int | ||
546 | dasd_eer_disable_on_device(struct dasd_device *device) | ||
547 | { | ||
548 | struct dasd_eer_private *eer = device->eer; | ||
549 | |||
550 | if (!device) | ||
551 | return -ENODEV; | ||
552 | if (!device->eer) | ||
553 | return 0; | ||
554 | device->eer = NULL; | ||
555 | dasd_eer_destroy(device,eer); | ||
556 | module_put(THIS_MODULE); | ||
557 | |||
558 | return 0; | ||
559 | } | ||
560 | |||
561 | /* | ||
562 | * Set extended error reporting (eer) | ||
563 | * Note: This will be registered as a DASD ioctl, to be called on DASD devices. | ||
564 | */ | ||
565 | static int | ||
566 | dasd_ioctl_set_eer(struct block_device *bdev, int no, long args) | ||
567 | { | ||
568 | struct dasd_device *device; | ||
569 | int intval; | ||
570 | |||
571 | if (!capable(CAP_SYS_ADMIN)) | ||
572 | return -EACCES; | ||
573 | if (bdev != bdev->bd_contains) | ||
574 | /* Error-reporting is not allowed for partitions */ | ||
575 | return -EINVAL; | ||
576 | if (get_user(intval, (int __user *) args)) | ||
577 | return -EFAULT; | ||
578 | device = bdev->bd_disk->private_data; | ||
579 | if (device == NULL) | ||
580 | return -ENODEV; | ||
581 | |||
582 | intval = (intval != 0); | ||
583 | DEV_MESSAGE (KERN_DEBUG, device, | ||
584 | "set eer on device to %d", intval); | ||
585 | if (intval) | ||
586 | return dasd_eer_enable_on_device(device); | ||
587 | else | ||
588 | return dasd_eer_disable_on_device(device); | ||
589 | } | ||
590 | |||
591 | /* | ||
592 | * Get value of extended error reporting. | ||
593 | * Note: This will be registered as a DASD ioctl, to be called on DASD devices. | ||
594 | */ | ||
595 | static int | ||
596 | dasd_ioctl_get_eer(struct block_device *bdev, int no, long args) | ||
597 | { | ||
598 | struct dasd_device *device; | ||
599 | |||
600 | device = bdev->bd_disk->private_data; | ||
601 | if (device == NULL) | ||
602 | return -ENODEV; | ||
603 | return put_user((device->eer != NULL), (int __user *) args); | ||
604 | } | ||
605 | |||
606 | /* | ||
607 | * The following function can be used for those triggers that have | ||
608 | * all necessary data available when the function is called. | ||
609 | * If the parameter cqr is not NULL, the chain of requests will be searched | ||
610 | * for valid sense data, and all valid sense data sets will be added to | ||
611 | * the triggers data. | ||
612 | */ | ||
613 | static int | ||
614 | dasd_eer_write_standard_trigger(int trigger, struct dasd_device *device, | ||
615 | struct dasd_ccw_req *cqr) | ||
616 | { | ||
617 | struct dasd_ccw_req *temp_cqr; | ||
618 | int data_size; | ||
619 | struct timeval tv; | ||
620 | struct dasd_eer_header header; | ||
621 | unsigned long flags; | ||
622 | struct eerbuffer *eerb; | ||
623 | |||
624 | /* go through cqr chain and count the valid sense data sets */ | ||
625 | temp_cqr = cqr; | ||
626 | data_size = 0; | ||
627 | while (temp_cqr) { | ||
628 | if (temp_cqr->irb.esw.esw0.erw.cons) | ||
629 | data_size += 32; | ||
630 | temp_cqr = temp_cqr->refers; | ||
631 | } | ||
632 | |||
633 | header.total_size = sizeof(header) + data_size + 4; /* "EOR" */ | ||
634 | header.trigger = trigger; | ||
635 | do_gettimeofday(&tv); | ||
636 | header.tv_sec = tv.tv_sec; | ||
637 | header.tv_usec = tv.tv_usec; | ||
638 | strncpy(header.busid, device->cdev->dev.bus_id, DASD_EER_BUSID_SIZE); | ||
639 | |||
640 | spin_lock_irqsave(&bufferlock, flags); | ||
641 | list_for_each_entry(eerb, &bufferlist, list) { | ||
642 | dasd_eer_start_record(eerb, header.total_size); | ||
643 | dasd_eer_write_buffer(eerb, sizeof(header), (char*)(&header)); | ||
644 | temp_cqr = cqr; | ||
645 | while (temp_cqr) { | ||
646 | if (temp_cqr->irb.esw.esw0.erw.cons) | ||
647 | dasd_eer_write_buffer(eerb, 32, cqr->irb.ecw); | ||
648 | temp_cqr = temp_cqr->refers; | ||
649 | } | ||
650 | dasd_eer_write_buffer(eerb, 4,"EOR"); | ||
651 | } | ||
652 | spin_unlock_irqrestore(&bufferlock, flags); | ||
653 | |||
654 | wake_up_interruptible(&dasd_eer_read_wait_queue); | ||
655 | |||
656 | return 0; | ||
657 | } | ||
658 | |||
659 | /* | ||
660 | * This function writes a DASD_EER_STATECHANGE trigger. | ||
661 | */ | ||
662 | static void | ||
663 | dasd_eer_write_SNSS_trigger(struct dasd_device *device, | ||
664 | struct dasd_ccw_req *cqr) | ||
665 | { | ||
666 | int data_size; | ||
667 | int snss_rc; | ||
668 | struct timeval tv; | ||
669 | struct dasd_eer_header header; | ||
670 | unsigned long flags; | ||
671 | struct eerbuffer *eerb; | ||
672 | |||
673 | snss_rc = (cqr->status == DASD_CQR_FAILED) ? -EIO : 0; | ||
674 | if (snss_rc) | ||
675 | data_size = 0; | ||
676 | else | ||
677 | data_size = SNSS_DATA_SIZE; | ||
678 | |||
679 | header.total_size = sizeof(header) + data_size + 4; /* "EOR" */ | ||
680 | header.trigger = DASD_EER_STATECHANGE; | ||
681 | do_gettimeofday(&tv); | ||
682 | header.tv_sec = tv.tv_sec; | ||
683 | header.tv_usec = tv.tv_usec; | ||
684 | strncpy(header.busid, device->cdev->dev.bus_id, DASD_EER_BUSID_SIZE); | ||
685 | |||
686 | spin_lock_irqsave(&bufferlock, flags); | ||
687 | list_for_each_entry(eerb, &bufferlist, list) { | ||
688 | dasd_eer_start_record(eerb, header.total_size); | ||
689 | dasd_eer_write_buffer(eerb, sizeof(header),(char*)(&header)); | ||
690 | if (!snss_rc) | ||
691 | dasd_eer_write_buffer(eerb, SNSS_DATA_SIZE, cqr->data); | ||
692 | dasd_eer_write_buffer(eerb, 4,"EOR"); | ||
693 | } | ||
694 | spin_unlock_irqrestore(&bufferlock, flags); | ||
695 | |||
696 | wake_up_interruptible(&dasd_eer_read_wait_queue); | ||
697 | } | ||
698 | |||
699 | /* | ||
700 | * callback function for use with SNSS request | ||
701 | */ | ||
702 | static void | ||
703 | dasd_eer_SNSS_cb(struct dasd_ccw_req *cqr, void *data) | ||
704 | { | ||
705 | struct dasd_device *device; | ||
706 | struct dasd_eer_private *private; | ||
707 | unsigned long irqflags; | ||
708 | |||
709 | device = (struct dasd_device *)data; | ||
710 | private = (struct dasd_eer_private *)device->eer; | ||
711 | dasd_eer_write_SNSS_trigger(device, cqr); | ||
712 | spin_lock_irqsave(&snsslock, irqflags); | ||
713 | if(!test_and_clear_bit(SNSS_REQUESTED, &private->flags)) { | ||
714 | clear_bit(CQR_IN_USE, &private->flags); | ||
715 | spin_unlock_irqrestore(&snsslock, irqflags); | ||
716 | return; | ||
717 | }; | ||
718 | clear_bit(CQR_IN_USE, &private->flags); | ||
719 | spin_unlock_irqrestore(&snsslock, irqflags); | ||
720 | dasd_eer_sense_subsystem_status(device); | ||
721 | return; | ||
722 | } | ||
723 | |||
724 | /* | ||
725 | * clean a used cqr before using it again | ||
726 | */ | ||
727 | static void | ||
728 | dasd_eer_clean_SNSS_request(struct dasd_ccw_req *cqr) | ||
729 | { | ||
730 | struct ccw1 *cpaddr = cqr->cpaddr; | ||
731 | void *data = cqr->data; | ||
732 | |||
733 | memset(cqr, 0, sizeof(struct dasd_ccw_req)); | ||
734 | memset(cpaddr, 0, sizeof(struct ccw1)); | ||
735 | memset(data, 0, SNSS_DATA_SIZE); | ||
736 | cqr->cpaddr = cpaddr; | ||
737 | cqr->data = data; | ||
738 | strncpy((char *) &cqr->magic, "ECKD", 4); | ||
739 | ASCEBC((char *) &cqr->magic, 4); | ||
740 | set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); | ||
741 | } | ||
742 | |||
743 | /* | ||
744 | * build and start an SNSS request | ||
745 | * This function is called from a work queue so we have to | ||
746 | * pass the dasd_device pointer as a void pointer. | ||
747 | */ | ||
748 | static void | ||
749 | dasd_eer_sense_subsystem_status(void *data) | ||
750 | { | ||
751 | struct dasd_device *device; | ||
752 | struct dasd_eer_private *private; | ||
753 | struct dasd_ccw_req *cqr; | ||
754 | struct ccw1 *ccw; | ||
755 | unsigned long irqflags; | ||
756 | |||
757 | device = (struct dasd_device *)data; | ||
758 | private = (struct dasd_eer_private *)device->eer; | ||
759 | if (!private) /* device not eer enabled any more */ | ||
760 | return; | ||
761 | cqr = private->cqr; | ||
762 | spin_lock_irqsave(&snsslock, irqflags); | ||
763 | if(test_and_set_bit(CQR_IN_USE, &private->flags)) { | ||
764 | set_bit(SNSS_REQUESTED, &private->flags); | ||
765 | spin_unlock_irqrestore(&snsslock, irqflags); | ||
766 | return; | ||
767 | }; | ||
768 | spin_unlock_irqrestore(&snsslock, irqflags); | ||
769 | dasd_eer_clean_SNSS_request(cqr); | ||
770 | cqr->device = device; | ||
771 | cqr->retries = 255; | ||
772 | cqr->expires = 10 * HZ; | ||
773 | |||
774 | ccw = cqr->cpaddr; | ||
775 | ccw->cmd_code = DASD_ECKD_CCW_SNSS; | ||
776 | ccw->count = SNSS_DATA_SIZE; | ||
777 | ccw->flags = 0; | ||
778 | ccw->cda = (__u32)(addr_t)cqr->data; | ||
779 | |||
780 | cqr->buildclk = get_clock(); | ||
781 | cqr->status = DASD_CQR_FILLED; | ||
782 | cqr->callback = dasd_eer_SNSS_cb; | ||
783 | cqr->callback_data = (void *)device; | ||
784 | dasd_add_request_head(cqr); | ||
785 | |||
786 | return; | ||
787 | } | ||
788 | |||
789 | /* | ||
790 | * This function is called for all triggers. It calls the appropriate | ||
791 | * function that writes the actual trigger records. | ||
792 | */ | ||
793 | static int | ||
794 | dasd_eer_write_trigger(struct dasd_eer_trigger *trigger) | ||
795 | { | ||
796 | int rc; | ||
797 | struct dasd_eer_private *private = trigger->device->eer; | ||
798 | |||
799 | switch (trigger->id) { | ||
800 | case DASD_EER_FATALERROR: | ||
801 | case DASD_EER_PPRCSUSPEND: | ||
802 | rc = dasd_eer_write_standard_trigger( | ||
803 | trigger->id, trigger->device, trigger->cqr); | ||
804 | break; | ||
805 | case DASD_EER_NOPATH: | ||
806 | rc = dasd_eer_write_standard_trigger( | ||
807 | trigger->id, trigger->device, NULL); | ||
808 | break; | ||
809 | case DASD_EER_STATECHANGE: | ||
810 | if (queue_work(dasd_eer_workqueue, &private->worker)) { | ||
811 | rc=0; | ||
812 | } else { | ||
813 | /* If the work_struct was already queued, it can't | ||
814 | * be queued again. But this is OK since we don't | ||
815 | * need to have it queued twice. | ||
816 | */ | ||
817 | rc = -EBUSY; | ||
818 | } | ||
819 | break; | ||
820 | default: /* unknown trigger, so we write it without any sense data */ | ||
821 | rc = dasd_eer_write_standard_trigger( | ||
822 | trigger->id, trigger->device, NULL); | ||
823 | break; | ||
824 | } | ||
825 | return rc; | ||
826 | } | ||
827 | |||
828 | /* | ||
829 | * This function is registered with the dasd device driver and gets called | ||
830 | * for all dasd eer notifications. | ||
831 | */ | ||
832 | static int dasd_eer_notify(struct notifier_block *self, | ||
833 | unsigned long action, void *data) | ||
834 | { | ||
835 | switch (action) { | ||
836 | case DASD_EER_DISABLE: | ||
837 | dasd_eer_disable_on_device((struct dasd_device *)data); | ||
838 | break; | ||
839 | case DASD_EER_TRIGGER: | ||
840 | dasd_eer_write_trigger((struct dasd_eer_trigger *)data); | ||
841 | break; | ||
842 | } | ||
843 | return NOTIFY_OK; | ||
844 | } | ||
845 | |||
846 | |||
847 | /*****************************************************************************/ | ||
848 | /* the device operations */ | ||
849 | /*****************************************************************************/ | ||
850 | |||
851 | /* | ||
852 | * On the one side we need a lock to access our internal buffer, on the | ||
853 | * other side a copy_to_user can sleep. So we need to copy the data we have | ||
854 | * to transfer in a readbuffer, which is protected by the readbuffer_mutex. | ||
855 | */ | ||
856 | static char readbuffer[PAGE_SIZE]; | ||
857 | DECLARE_MUTEX(readbuffer_mutex); | ||
858 | |||
859 | |||
860 | static int | ||
861 | dasd_eer_open(struct inode *inp, struct file *filp) | ||
862 | { | ||
863 | struct eerbuffer *eerb; | ||
864 | unsigned long flags; | ||
865 | |||
866 | eerb = kmalloc(sizeof(struct eerbuffer), GFP_KERNEL); | ||
867 | eerb->head = 0; | ||
868 | eerb->tail = 0; | ||
869 | eerb->residual = 0; | ||
870 | eerb->buffer_page_count = 1; | ||
871 | eerb->buffersize = eerb->buffer_page_count * PAGE_SIZE; | ||
872 | eerb->buffer = kmalloc(eerb->buffer_page_count*sizeof(char*), | ||
873 | GFP_KERNEL); | ||
874 | if (!eerb->buffer) | ||
875 | return -ENOMEM; | ||
876 | if (dasd_eer_allocate_buffer_pages(eerb->buffer, | ||
877 | eerb->buffer_page_count)) { | ||
878 | kfree(eerb->buffer); | ||
879 | return -ENOMEM; | ||
880 | } | ||
881 | filp->private_data = eerb; | ||
882 | spin_lock_irqsave(&bufferlock, flags); | ||
883 | list_add(&eerb->list, &bufferlist); | ||
884 | spin_unlock_irqrestore(&bufferlock, flags); | ||
885 | |||
886 | return nonseekable_open(inp,filp); | ||
887 | } | ||
888 | |||
889 | static int | ||
890 | dasd_eer_close(struct inode *inp, struct file *filp) | ||
891 | { | ||
892 | struct eerbuffer *eerb; | ||
893 | unsigned long flags; | ||
894 | |||
895 | eerb = (struct eerbuffer *)filp->private_data; | ||
896 | spin_lock_irqsave(&bufferlock, flags); | ||
897 | list_del(&eerb->list); | ||
898 | spin_unlock_irqrestore(&bufferlock, flags); | ||
899 | dasd_eer_free_buffer_pages(eerb->buffer, eerb->buffer_page_count); | ||
900 | kfree(eerb->buffer); | ||
901 | kfree(eerb); | ||
902 | |||
903 | return 0; | ||
904 | } | ||
905 | |||
906 | static long | ||
907 | dasd_eer_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||
908 | { | ||
909 | int intval; | ||
910 | struct eerbuffer *eerb; | ||
911 | |||
912 | eerb = (struct eerbuffer *)filp->private_data; | ||
913 | switch (cmd) { | ||
914 | case DASD_EER_PURGE: | ||
915 | dasd_eer_purge_buffer(eerb); | ||
916 | return 0; | ||
917 | case DASD_EER_SETBUFSIZE: | ||
918 | if (get_user(intval, (int __user *)arg)) | ||
919 | return -EFAULT; | ||
920 | return dasd_eer_resize_buffer(eerb, intval); | ||
921 | default: | ||
922 | return -ENOIOCTLCMD; | ||
923 | } | ||
924 | } | ||
925 | |||
926 | static ssize_t | ||
927 | dasd_eer_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos) | ||
928 | { | ||
929 | int tc,rc; | ||
930 | int tailcount,effective_count; | ||
931 | unsigned long flags; | ||
932 | struct eerbuffer *eerb; | ||
933 | |||
934 | eerb = (struct eerbuffer *)filp->private_data; | ||
935 | if(down_interruptible(&readbuffer_mutex)) | ||
936 | return -ERESTARTSYS; | ||
937 | |||
938 | spin_lock_irqsave(&bufferlock, flags); | ||
939 | |||
940 | if (eerb->residual < 0) { /* the remainder of this record */ | ||
941 | /* has been deleted */ | ||
942 | eerb->residual = 0; | ||
943 | spin_unlock_irqrestore(&bufferlock, flags); | ||
944 | up(&readbuffer_mutex); | ||
945 | return -EIO; | ||
946 | } else if (eerb->residual > 0) { | ||
947 | /* OK we still have a second half of a record to deliver */ | ||
948 | effective_count = min(eerb->residual, (int)count); | ||
949 | eerb->residual -= effective_count; | ||
950 | } else { | ||
951 | tc = 0; | ||
952 | while (!tc) { | ||
953 | tc = dasd_eer_read_buffer(eerb, | ||
954 | sizeof(tailcount), (char*)(&tailcount)); | ||
955 | if (!tc) { | ||
956 | /* no data available */ | ||
957 | spin_unlock_irqrestore(&bufferlock, flags); | ||
958 | up(&readbuffer_mutex); | ||
959 | if (filp->f_flags & O_NONBLOCK) | ||
960 | return -EAGAIN; | ||
961 | rc = wait_event_interruptible( | ||
962 | dasd_eer_read_wait_queue, | ||
963 | eerb->head != eerb->tail); | ||
964 | if (rc) { | ||
965 | return rc; | ||
966 | } | ||
967 | if(down_interruptible(&readbuffer_mutex)) | ||
968 | return -ERESTARTSYS; | ||
969 | spin_lock_irqsave(&bufferlock, flags); | ||
970 | } | ||
971 | } | ||
972 | WARN_ON(tc != sizeof(tailcount)); | ||
973 | effective_count = min(tailcount,(int)count); | ||
974 | eerb->residual = tailcount - effective_count; | ||
975 | } | ||
976 | |||
977 | tc = dasd_eer_read_buffer(eerb, effective_count, readbuffer); | ||
978 | WARN_ON(tc != effective_count); | ||
979 | |||
980 | spin_unlock_irqrestore(&bufferlock, flags); | ||
981 | |||
982 | if (copy_to_user(buf, readbuffer, effective_count)) { | ||
983 | up(&readbuffer_mutex); | ||
984 | return -EFAULT; | ||
985 | } | ||
986 | |||
987 | up(&readbuffer_mutex); | ||
988 | return effective_count; | ||
989 | } | ||
990 | |||
991 | static unsigned int | ||
992 | dasd_eer_poll (struct file *filp, poll_table *ptable) | ||
993 | { | ||
994 | unsigned int mask; | ||
995 | unsigned long flags; | ||
996 | struct eerbuffer *eerb; | ||
997 | |||
998 | eerb = (struct eerbuffer *)filp->private_data; | ||
999 | poll_wait(filp, &dasd_eer_read_wait_queue, ptable); | ||
1000 | spin_lock_irqsave(&bufferlock, flags); | ||
1001 | if (eerb->head != eerb->tail) | ||
1002 | mask = POLLIN | POLLRDNORM ; | ||
1003 | else | ||
1004 | mask = 0; | ||
1005 | spin_unlock_irqrestore(&bufferlock, flags); | ||
1006 | return mask; | ||
1007 | } | ||
1008 | |||
1009 | static struct file_operations dasd_eer_fops = { | ||
1010 | .open = &dasd_eer_open, | ||
1011 | .release = &dasd_eer_close, | ||
1012 | .unlocked_ioctl = &dasd_eer_ioctl, | ||
1013 | .compat_ioctl = &dasd_eer_ioctl, | ||
1014 | .read = &dasd_eer_read, | ||
1015 | .poll = &dasd_eer_poll, | ||
1016 | .owner = THIS_MODULE, | ||
1017 | }; | ||
1018 | |||
1019 | static struct miscdevice dasd_eer_dev = { | ||
1020 | .minor = MISC_DYNAMIC_MINOR, | ||
1021 | .name = "dasd_eer", | ||
1022 | .fops = &dasd_eer_fops, | ||
1023 | }; | ||
1024 | |||
1025 | |||
1026 | /*****************************************************************************/ | ||
1027 | /* Init and exit */ | ||
1028 | /*****************************************************************************/ | ||
1029 | |||
1030 | static int | ||
1031 | __init dasd_eer_init(void) | ||
1032 | { | ||
1033 | int rc; | ||
1034 | |||
1035 | dasd_eer_workqueue = create_singlethread_workqueue("dasd_eer"); | ||
1036 | if (!dasd_eer_workqueue) { | ||
1037 | MESSAGE(KERN_ERR , "%s", "dasd_eer_init could not " | ||
1038 | "create workqueue \n"); | ||
1039 | rc = -ENOMEM; | ||
1040 | goto out; | ||
1041 | } | ||
1042 | |||
1043 | rc = dasd_register_eer_notifier(&dasd_eer_nb); | ||
1044 | if (rc) { | ||
1045 | MESSAGE(KERN_ERR, "%s", "dasd_eer_init could not " | ||
1046 | "register error reporting"); | ||
1047 | goto queue; | ||
1048 | } | ||
1049 | |||
1050 | dasd_ioctl_no_register(THIS_MODULE, BIODASDEERSET, dasd_ioctl_set_eer); | ||
1051 | dasd_ioctl_no_register(THIS_MODULE, BIODASDEERGET, dasd_ioctl_get_eer); | ||
1052 | |||
1053 | /* we don't need our own character device, | ||
1054 | * so we just register as misc device */ | ||
1055 | rc = misc_register(&dasd_eer_dev); | ||
1056 | if (rc) { | ||
1057 | MESSAGE(KERN_ERR, "%s", "dasd_eer_init could not " | ||
1058 | "register misc device"); | ||
1059 | goto unregister; | ||
1060 | } | ||
1061 | |||
1062 | return 0; | ||
1063 | |||
1064 | unregister: | ||
1065 | dasd_unregister_eer_notifier(&dasd_eer_nb); | ||
1066 | dasd_ioctl_no_unregister(THIS_MODULE, BIODASDEERSET, | ||
1067 | dasd_ioctl_set_eer); | ||
1068 | dasd_ioctl_no_unregister(THIS_MODULE, BIODASDEERGET, | ||
1069 | dasd_ioctl_get_eer); | ||
1070 | queue: | ||
1071 | destroy_workqueue(dasd_eer_workqueue); | ||
1072 | out: | ||
1073 | return rc; | ||
1074 | |||
1075 | } | ||
1076 | module_init(dasd_eer_init); | ||
1077 | |||
1078 | static void | ||
1079 | __exit dasd_eer_exit(void) | ||
1080 | { | ||
1081 | dasd_unregister_eer_notifier(&dasd_eer_nb); | ||
1082 | dasd_ioctl_no_unregister(THIS_MODULE, BIODASDEERSET, | ||
1083 | dasd_ioctl_set_eer); | ||
1084 | dasd_ioctl_no_unregister(THIS_MODULE, BIODASDEERGET, | ||
1085 | dasd_ioctl_get_eer); | ||
1086 | destroy_workqueue(dasd_eer_workqueue); | ||
1087 | |||
1088 | WARN_ON(misc_deregister(&dasd_eer_dev) != 0); | ||
1089 | } | ||
1090 | module_exit(dasd_eer_exit); | ||
diff --git a/drivers/s390/block/dasd_erp.c b/drivers/s390/block/dasd_erp.c index 7cb98d25f341..8fd71ab02ef0 100644 --- a/drivers/s390/block/dasd_erp.c +++ b/drivers/s390/block/dasd_erp.c | |||
@@ -7,7 +7,6 @@ | |||
7 | * Bugreports.to..: <Linux390@de.ibm.com> | 7 | * Bugreports.to..: <Linux390@de.ibm.com> |
8 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001 | 8 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001 |
9 | * | 9 | * |
10 | * $Revision: 1.14 $ | ||
11 | */ | 10 | */ |
12 | 11 | ||
13 | #include <linux/config.h> | 12 | #include <linux/config.h> |
diff --git a/drivers/s390/block/dasd_fba.c b/drivers/s390/block/dasd_fba.c index 8ec75dc08e2c..91145698f8e9 100644 --- a/drivers/s390/block/dasd_fba.c +++ b/drivers/s390/block/dasd_fba.c | |||
@@ -4,7 +4,6 @@ | |||
4 | * Bugreports.to..: <Linux390@de.ibm.com> | 4 | * Bugreports.to..: <Linux390@de.ibm.com> |
5 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 | 5 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 |
6 | * | 6 | * |
7 | * $Revision: 1.41 $ | ||
8 | */ | 7 | */ |
9 | 8 | ||
10 | #include <linux/config.h> | 9 | #include <linux/config.h> |
diff --git a/drivers/s390/block/dasd_fba.h b/drivers/s390/block/dasd_fba.h index 624f0402ee22..da1fa91fc01d 100644 --- a/drivers/s390/block/dasd_fba.h +++ b/drivers/s390/block/dasd_fba.h | |||
@@ -4,7 +4,6 @@ | |||
4 | * Bugreports.to..: <Linux390@de.ibm.com> | 4 | * Bugreports.to..: <Linux390@de.ibm.com> |
5 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 | 5 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 |
6 | * | 6 | * |
7 | * $Revision: 1.6 $ | ||
8 | */ | 7 | */ |
9 | 8 | ||
10 | #ifndef DASD_FBA_H | 9 | #ifndef DASD_FBA_H |
diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c index a601c9a33541..65dc844b975c 100644 --- a/drivers/s390/block/dasd_genhd.c +++ b/drivers/s390/block/dasd_genhd.c | |||
@@ -9,7 +9,6 @@ | |||
9 | * | 9 | * |
10 | * gendisk related functions for the dasd driver. | 10 | * gendisk related functions for the dasd driver. |
11 | * | 11 | * |
12 | * $Revision: 1.51 $ | ||
13 | */ | 12 | */ |
14 | 13 | ||
15 | #include <linux/config.h> | 14 | #include <linux/config.h> |
diff --git a/drivers/s390/block/dasd_int.h b/drivers/s390/block/dasd_int.h index e4b401500b01..d1b08fa13fd2 100644 --- a/drivers/s390/block/dasd_int.h +++ b/drivers/s390/block/dasd_int.h | |||
@@ -6,7 +6,6 @@ | |||
6 | * Bugreports.to..: <Linux390@de.ibm.com> | 6 | * Bugreports.to..: <Linux390@de.ibm.com> |
7 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 | 7 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999,2000 |
8 | * | 8 | * |
9 | * $Revision: 1.68 $ | ||
10 | */ | 9 | */ |
11 | 10 | ||
12 | #ifndef DASD_INT_H | 11 | #ifndef DASD_INT_H |
@@ -276,6 +275,34 @@ struct dasd_discipline { | |||
276 | 275 | ||
277 | extern struct dasd_discipline *dasd_diag_discipline_pointer; | 276 | extern struct dasd_discipline *dasd_diag_discipline_pointer; |
278 | 277 | ||
278 | |||
279 | /* | ||
280 | * Notification numbers for extended error reporting notifications: | ||
281 | * The DASD_EER_DISABLE notification is sent before a dasd_device (and it's | ||
282 | * eer pointer) is freed. The error reporting module needs to do all necessary | ||
283 | * cleanup steps. | ||
284 | * The DASD_EER_TRIGGER notification sends the actual error reports (triggers). | ||
285 | */ | ||
286 | #define DASD_EER_DISABLE 0 | ||
287 | #define DASD_EER_TRIGGER 1 | ||
288 | |||
289 | /* Trigger IDs for extended error reporting DASD_EER_TRIGGER notification */ | ||
290 | #define DASD_EER_FATALERROR 1 | ||
291 | #define DASD_EER_NOPATH 2 | ||
292 | #define DASD_EER_STATECHANGE 3 | ||
293 | #define DASD_EER_PPRCSUSPEND 4 | ||
294 | |||
295 | /* | ||
296 | * The dasd_eer_trigger structure contains all data that we need to send | ||
297 | * along with an DASD_EER_TRIGGER notification. | ||
298 | */ | ||
299 | struct dasd_eer_trigger { | ||
300 | unsigned int id; | ||
301 | struct dasd_device *device; | ||
302 | struct dasd_ccw_req *cqr; | ||
303 | }; | ||
304 | |||
305 | |||
279 | struct dasd_device { | 306 | struct dasd_device { |
280 | /* Block device stuff. */ | 307 | /* Block device stuff. */ |
281 | struct gendisk *gdp; | 308 | struct gendisk *gdp; |
@@ -289,6 +316,9 @@ struct dasd_device { | |||
289 | unsigned long flags; /* per device flags */ | 316 | unsigned long flags; /* per device flags */ |
290 | unsigned short features; /* copy of devmap-features (read-only!) */ | 317 | unsigned short features; /* copy of devmap-features (read-only!) */ |
291 | 318 | ||
319 | /* extended error reporting stuff (eer) */ | ||
320 | void *eer; | ||
321 | |||
292 | /* Device discipline stuff. */ | 322 | /* Device discipline stuff. */ |
293 | struct dasd_discipline *discipline; | 323 | struct dasd_discipline *discipline; |
294 | char *private; | 324 | char *private; |
@@ -489,6 +519,12 @@ int dasd_generic_set_online(struct ccw_device *, struct dasd_discipline *); | |||
489 | int dasd_generic_set_offline (struct ccw_device *cdev); | 519 | int dasd_generic_set_offline (struct ccw_device *cdev); |
490 | int dasd_generic_notify(struct ccw_device *, int); | 520 | int dasd_generic_notify(struct ccw_device *, int); |
491 | void dasd_generic_auto_online (struct ccw_driver *); | 521 | void dasd_generic_auto_online (struct ccw_driver *); |
522 | int dasd_register_eer_notifier(struct notifier_block *); | ||
523 | int dasd_unregister_eer_notifier(struct notifier_block *); | ||
524 | void dasd_write_eer_trigger(unsigned int , struct dasd_device *, | ||
525 | struct dasd_ccw_req *); | ||
526 | |||
527 | |||
492 | 528 | ||
493 | /* externals in dasd_devmap.c */ | 529 | /* externals in dasd_devmap.c */ |
494 | extern int dasd_max_devindex; | 530 | extern int dasd_max_devindex; |
diff --git a/drivers/s390/block/dasd_ioctl.c b/drivers/s390/block/dasd_ioctl.c index 9396fcacb8f8..fafeeae52675 100644 --- a/drivers/s390/block/dasd_ioctl.c +++ b/drivers/s390/block/dasd_ioctl.c | |||
@@ -7,8 +7,6 @@ | |||
7 | * Bugreports.to..: <Linux390@de.ibm.com> | 7 | * Bugreports.to..: <Linux390@de.ibm.com> |
8 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001 | 8 | * (C) IBM Corporation, IBM Deutschland Entwicklung GmbH, 1999-2001 |
9 | * | 9 | * |
10 | * $Revision: 1.50 $ | ||
11 | * | ||
12 | * i/o controls for the dasd driver. | 10 | * i/o controls for the dasd driver. |
13 | */ | 11 | */ |
14 | #include <linux/config.h> | 12 | #include <linux/config.h> |
@@ -423,8 +421,15 @@ dasd_ioctl_information(struct block_device *bdev, int no, long args) | |||
423 | dasd_info->cu_model = cdev->id.cu_model; | 421 | dasd_info->cu_model = cdev->id.cu_model; |
424 | dasd_info->dev_type = cdev->id.dev_type; | 422 | dasd_info->dev_type = cdev->id.dev_type; |
425 | dasd_info->dev_model = cdev->id.dev_model; | 423 | dasd_info->dev_model = cdev->id.dev_model; |
426 | dasd_info->open_count = atomic_read(&device->open_count); | ||
427 | dasd_info->status = device->state; | 424 | dasd_info->status = device->state; |
425 | /* | ||
426 | * The open_count is increased for every opener, that includes | ||
427 | * the blkdev_get in dasd_scan_partitions. | ||
428 | * This must be hidden from user-space. | ||
429 | */ | ||
430 | dasd_info->open_count = atomic_read(&device->open_count); | ||
431 | if (!device->bdev) | ||
432 | dasd_info->open_count++; | ||
428 | 433 | ||
429 | /* | 434 | /* |
430 | * check if device is really formatted | 435 | * check if device is really formatted |
diff --git a/drivers/s390/block/dasd_proc.c b/drivers/s390/block/dasd_proc.c index fff9020d4886..2d5da3c75ca7 100644 --- a/drivers/s390/block/dasd_proc.c +++ b/drivers/s390/block/dasd_proc.c | |||
@@ -9,7 +9,6 @@ | |||
9 | * | 9 | * |
10 | * /proc interface for the dasd driver. | 10 | * /proc interface for the dasd driver. |
11 | * | 11 | * |
12 | * $Revision: 1.33 $ | ||
13 | */ | 12 | */ |
14 | 13 | ||
15 | #include <linux/config.h> | 14 | #include <linux/config.h> |
diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c index 1f060914cfa4..606f6ad285a0 100644 --- a/drivers/s390/char/con3215.c +++ b/drivers/s390/char/con3215.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/console.h> | 22 | #include <linux/console.h> |
23 | #include <linux/interrupt.h> | 23 | #include <linux/interrupt.h> |
24 | #include <linux/err.h> | ||
24 | 25 | ||
25 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
26 | #include <linux/bootmem.h> | 27 | #include <linux/bootmem.h> |
@@ -864,7 +865,7 @@ con3215_init(void) | |||
864 | } | 865 | } |
865 | 866 | ||
866 | cdev = ccw_device_probe_console(); | 867 | cdev = ccw_device_probe_console(); |
867 | if (!cdev) | 868 | if (IS_ERR(cdev)) |
868 | return -ENODEV; | 869 | return -ENODEV; |
869 | 870 | ||
870 | raw3215[0] = raw = (struct raw3215_info *) | 871 | raw3215[0] = raw = (struct raw3215_info *) |
diff --git a/drivers/s390/char/con3270.c b/drivers/s390/char/con3270.c index c570a9f6ce9c..ef607a1de55a 100644 --- a/drivers/s390/char/con3270.c +++ b/drivers/s390/char/con3270.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | #include <linux/list.h> | 16 | #include <linux/list.h> |
17 | #include <linux/types.h> | 17 | #include <linux/types.h> |
18 | #include <linux/err.h> | ||
18 | 19 | ||
19 | #include <asm/ccwdev.h> | 20 | #include <asm/ccwdev.h> |
20 | #include <asm/cio.h> | 21 | #include <asm/cio.h> |
@@ -597,7 +598,7 @@ con3270_init(void) | |||
597 | } | 598 | } |
598 | 599 | ||
599 | cdev = ccw_device_probe_console(); | 600 | cdev = ccw_device_probe_console(); |
600 | if (!cdev) | 601 | if (IS_ERR(cdev)) |
601 | return -ENODEV; | 602 | return -ENODEV; |
602 | rp = raw3270_setup_console(cdev); | 603 | rp = raw3270_setup_console(cdev); |
603 | if (IS_ERR(rp)) | 604 | if (IS_ERR(rp)) |
diff --git a/drivers/s390/char/keyboard.c b/drivers/s390/char/keyboard.c index 5bda2340a39d..a317a123daba 100644 --- a/drivers/s390/char/keyboard.c +++ b/drivers/s390/char/keyboard.c | |||
@@ -440,7 +440,11 @@ do_kdgkb_ioctl(struct kbd_data *kbd, struct kbsentry __user *u_kbs, | |||
440 | return -EPERM; | 440 | return -EPERM; |
441 | len = strnlen_user(u_kbs->kb_string, | 441 | len = strnlen_user(u_kbs->kb_string, |
442 | sizeof(u_kbs->kb_string) - 1); | 442 | sizeof(u_kbs->kb_string) - 1); |
443 | p = kmalloc(len, GFP_KERNEL); | 443 | if (!len) |
444 | return -EFAULT; | ||
445 | if (len > sizeof(u_kbs->kb_string) - 1) | ||
446 | return -EINVAL; | ||
447 | p = kmalloc(len + 1, GFP_KERNEL); | ||
444 | if (!p) | 448 | if (!p) |
445 | return -ENOMEM; | 449 | return -ENOMEM; |
446 | if (copy_from_user(p, u_kbs->kb_string, len)) { | 450 | if (copy_from_user(p, u_kbs->kb_string, len)) { |
diff --git a/drivers/s390/char/tape_34xx.c b/drivers/s390/char/tape_34xx.c index 20be88e91fa1..682039cac15b 100644 --- a/drivers/s390/char/tape_34xx.c +++ b/drivers/s390/char/tape_34xx.c | |||
@@ -1357,7 +1357,7 @@ tape_34xx_init (void) | |||
1357 | debug_set_level(TAPE_DBF_AREA, 6); | 1357 | debug_set_level(TAPE_DBF_AREA, 6); |
1358 | #endif | 1358 | #endif |
1359 | 1359 | ||
1360 | DBF_EVENT(3, "34xx init: $Revision: 1.23 $\n"); | 1360 | DBF_EVENT(3, "34xx init\n"); |
1361 | /* Register driver for 3480/3490 tapes. */ | 1361 | /* Register driver for 3480/3490 tapes. */ |
1362 | rc = ccw_driver_register(&tape_34xx_driver); | 1362 | rc = ccw_driver_register(&tape_34xx_driver); |
1363 | if (rc) | 1363 | if (rc) |
@@ -1377,8 +1377,7 @@ tape_34xx_exit(void) | |||
1377 | 1377 | ||
1378 | MODULE_DEVICE_TABLE(ccw, tape_34xx_ids); | 1378 | MODULE_DEVICE_TABLE(ccw, tape_34xx_ids); |
1379 | MODULE_AUTHOR("(C) 2001-2002 IBM Deutschland Entwicklung GmbH"); | 1379 | MODULE_AUTHOR("(C) 2001-2002 IBM Deutschland Entwicklung GmbH"); |
1380 | MODULE_DESCRIPTION("Linux on zSeries channel attached 3480 tape " | 1380 | MODULE_DESCRIPTION("Linux on zSeries channel attached 3480 tape device driver"); |
1381 | "device driver ($Revision: 1.23 $)"); | ||
1382 | MODULE_LICENSE("GPL"); | 1381 | MODULE_LICENSE("GPL"); |
1383 | 1382 | ||
1384 | module_init(tape_34xx_init); | 1383 | module_init(tape_34xx_init); |
diff --git a/drivers/s390/char/tape_class.c b/drivers/s390/char/tape_class.c index fcaee447d6fe..b3569c82bb16 100644 --- a/drivers/s390/char/tape_class.c +++ b/drivers/s390/char/tape_class.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * (C) Copyright IBM Corp. 2004 | 2 | * (C) Copyright IBM Corp. 2004 |
3 | * tape_class.c ($Revision: 1.8 $) | 3 | * tape_class.c |
4 | * | 4 | * |
5 | * Tape class device support | 5 | * Tape class device support |
6 | * | 6 | * |
@@ -12,7 +12,7 @@ | |||
12 | MODULE_AUTHOR("Stefan Bader <shbader@de.ibm.com>"); | 12 | MODULE_AUTHOR("Stefan Bader <shbader@de.ibm.com>"); |
13 | MODULE_DESCRIPTION( | 13 | MODULE_DESCRIPTION( |
14 | "(C) Copyright IBM Corp. 2004 All Rights Reserved.\n" | 14 | "(C) Copyright IBM Corp. 2004 All Rights Reserved.\n" |
15 | "tape_class.c ($Revision: 1.8 $)" | 15 | "tape_class.c" |
16 | ); | 16 | ); |
17 | MODULE_LICENSE("GPL"); | 17 | MODULE_LICENSE("GPL"); |
18 | 18 | ||
diff --git a/drivers/s390/char/tape_class.h b/drivers/s390/char/tape_class.h index 33133ad00ba2..3d0ca054cdee 100644 --- a/drivers/s390/char/tape_class.h +++ b/drivers/s390/char/tape_class.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * (C) Copyright IBM Corp. 2004 All Rights Reserved. | 2 | * (C) Copyright IBM Corp. 2004 All Rights Reserved. |
3 | * tape_class.h ($Revision: 1.4 $) | 3 | * tape_class.h |
4 | * | 4 | * |
5 | * Tape class device support | 5 | * Tape class device support |
6 | * | 6 | * |
diff --git a/drivers/s390/char/tape_core.c b/drivers/s390/char/tape_core.c index 8f486e1a8507..4ea438c749c9 100644 --- a/drivers/s390/char/tape_core.c +++ b/drivers/s390/char/tape_core.c | |||
@@ -1239,7 +1239,7 @@ tape_init (void) | |||
1239 | #ifdef DBF_LIKE_HELL | 1239 | #ifdef DBF_LIKE_HELL |
1240 | debug_set_level(TAPE_DBF_AREA, 6); | 1240 | debug_set_level(TAPE_DBF_AREA, 6); |
1241 | #endif | 1241 | #endif |
1242 | DBF_EVENT(3, "tape init: ($Revision: 1.54 $)\n"); | 1242 | DBF_EVENT(3, "tape init\n"); |
1243 | tape_proc_init(); | 1243 | tape_proc_init(); |
1244 | tapechar_init (); | 1244 | tapechar_init (); |
1245 | tapeblock_init (); | 1245 | tapeblock_init (); |
@@ -1263,8 +1263,7 @@ tape_exit(void) | |||
1263 | 1263 | ||
1264 | MODULE_AUTHOR("(C) 2001 IBM Deutschland Entwicklung GmbH by Carsten Otte and " | 1264 | MODULE_AUTHOR("(C) 2001 IBM Deutschland Entwicklung GmbH by Carsten Otte and " |
1265 | "Michael Holzheu (cotte@de.ibm.com,holzheu@de.ibm.com)"); | 1265 | "Michael Holzheu (cotte@de.ibm.com,holzheu@de.ibm.com)"); |
1266 | MODULE_DESCRIPTION("Linux on zSeries channel attached " | 1266 | MODULE_DESCRIPTION("Linux on zSeries channel attached tape device driver"); |
1267 | "tape device driver ($Revision: 1.54 $)"); | ||
1268 | MODULE_LICENSE("GPL"); | 1267 | MODULE_LICENSE("GPL"); |
1269 | 1268 | ||
1270 | module_init(tape_init); | 1269 | module_init(tape_init); |
diff --git a/drivers/s390/cio/airq.c b/drivers/s390/cio/airq.c index cd2cc28e16a7..5287631fbfc8 100644 --- a/drivers/s390/cio/airq.c +++ b/drivers/s390/cio/airq.c | |||
@@ -2,8 +2,6 @@ | |||
2 | * drivers/s390/cio/airq.c | 2 | * drivers/s390/cio/airq.c |
3 | * S/390 common I/O routines -- support for adapter interruptions | 3 | * S/390 common I/O routines -- support for adapter interruptions |
4 | * | 4 | * |
5 | * $Revision: 1.15 $ | ||
6 | * | ||
7 | * Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH, | 5 | * Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH, |
8 | * IBM Corporation | 6 | * IBM Corporation |
9 | * Author(s): Ingo Adlung (adlung@de.ibm.com) | 7 | * Author(s): Ingo Adlung (adlung@de.ibm.com) |
diff --git a/drivers/s390/cio/blacklist.c b/drivers/s390/cio/blacklist.c index 72f27c151c09..cb8e2e672b68 100644 --- a/drivers/s390/cio/blacklist.c +++ b/drivers/s390/cio/blacklist.c | |||
@@ -1,7 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * drivers/s390/cio/blacklist.c | 2 | * drivers/s390/cio/blacklist.c |
3 | * S/390 common I/O routines -- blacklisting of specific devices | 3 | * S/390 common I/O routines -- blacklisting of specific devices |
4 | * $Revision: 1.42 $ | ||
5 | * | 4 | * |
6 | * Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH, | 5 | * Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH, |
7 | * IBM Corporation | 6 | * IBM Corporation |
diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index 6c077ad71edc..8013c8eb76fe 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c | |||
@@ -1,7 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * drivers/s390/cio/ccwgroup.c | 2 | * drivers/s390/cio/ccwgroup.c |
3 | * bus driver for ccwgroup | 3 | * bus driver for ccwgroup |
4 | * $Revision: 1.35 $ | ||
5 | * | 4 | * |
6 | * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, | 5 | * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, |
7 | * IBM Corporation | 6 | * IBM Corporation |
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index 2cbb724791a8..92be75d99a56 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c | |||
@@ -1,7 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * drivers/s390/cio/chsc.c | 2 | * drivers/s390/cio/chsc.c |
3 | * S/390 common I/O routines -- channel subsystem call | 3 | * S/390 common I/O routines -- channel subsystem call |
4 | * $Revision: 1.128 $ | ||
5 | * | 4 | * |
6 | * Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH, | 5 | * Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH, |
7 | * IBM Corporation | 6 | * IBM Corporation |
diff --git a/drivers/s390/cio/chsc.h b/drivers/s390/cio/chsc.h index 44e4b4bb1c5a..3e75095f35d0 100644 --- a/drivers/s390/cio/chsc.h +++ b/drivers/s390/cio/chsc.h | |||
@@ -68,6 +68,6 @@ extern void *chsc_get_chp_desc(struct subchannel*, int); | |||
68 | 68 | ||
69 | extern int chsc_enable_facility(int); | 69 | extern int chsc_enable_facility(int); |
70 | 70 | ||
71 | #define to_channelpath(dev) container_of(dev, struct channel_path, dev) | 71 | #define to_channelpath(device) container_of(device, struct channel_path, dev) |
72 | 72 | ||
73 | #endif | 73 | #endif |
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 6223b06d27d5..cbb86fa5f293 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -1,7 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * drivers/s390/cio/cio.c | 2 | * drivers/s390/cio/cio.c |
3 | * S/390 common I/O routines -- low level i/o calls | 3 | * S/390 common I/O routines -- low level i/o calls |
4 | * $Revision: 1.140 $ | ||
5 | * | 4 | * |
6 | * Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH, | 5 | * Copyright (C) 1999-2002 IBM Deutschland Entwicklung GmbH, |
7 | * IBM Corporation | 6 | * IBM Corporation |
diff --git a/drivers/s390/cio/cmf.c b/drivers/s390/cio/cmf.c index 0b03714e696a..07ef3f640f4a 100644 --- a/drivers/s390/cio/cmf.c +++ b/drivers/s390/cio/cmf.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/s390/cio/cmf.c ($Revision: 1.19 $) | 2 | * linux/drivers/s390/cio/cmf.c |
3 | * | 3 | * |
4 | * Linux on zSeries Channel Measurement Facility support | 4 | * Linux on zSeries Channel Measurement Facility support |
5 | * | 5 | * |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index 516108779f60..1bbf231f8aaf 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -1,7 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * drivers/s390/cio/css.c | 2 | * drivers/s390/cio/css.c |
3 | * driver for channel subsystem | 3 | * driver for channel subsystem |
4 | * $Revision: 1.96 $ | ||
5 | * | 4 | * |
6 | * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, | 5 | * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, |
7 | * IBM Corporation | 6 | * IBM Corporation |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index a67e7e60e330..062fb100d94c 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -1,7 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * drivers/s390/cio/device.c | 2 | * drivers/s390/cio/device.c |
3 | * bus driver for ccw devices | 3 | * bus driver for ccw devices |
4 | * $Revision: 1.140 $ | ||
5 | * | 4 | * |
6 | * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, | 5 | * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, |
7 | * IBM Corporation | 6 | * IBM Corporation |
@@ -255,7 +254,7 @@ modalias_show (struct device *dev, struct device_attribute *attr, char *buf) | |||
255 | struct ccw_device_id *id = &(cdev->id); | 254 | struct ccw_device_id *id = &(cdev->id); |
256 | int ret; | 255 | int ret; |
257 | 256 | ||
258 | ret = sprintf(buf, "ccw:t%04Xm%02x", | 257 | ret = sprintf(buf, "ccw:t%04Xm%02X", |
259 | id->cu_type, id->cu_model); | 258 | id->cu_type, id->cu_model); |
260 | if (id->dev_type != 0) | 259 | if (id->dev_type != 0) |
261 | ret += sprintf(buf + ret, "dt%04Xdm%02X\n", | 260 | ret += sprintf(buf + ret, "dt%04Xdm%02X\n", |
@@ -1013,7 +1012,7 @@ ccw_device_probe_console(void) | |||
1013 | int ret; | 1012 | int ret; |
1014 | 1013 | ||
1015 | if (xchg(&console_cdev_in_use, 1) != 0) | 1014 | if (xchg(&console_cdev_in_use, 1) != 0) |
1016 | return NULL; | 1015 | return ERR_PTR(-EBUSY); |
1017 | sch = cio_probe_console(); | 1016 | sch = cio_probe_console(); |
1018 | if (IS_ERR(sch)) { | 1017 | if (IS_ERR(sch)) { |
1019 | console_cdev_in_use = 0; | 1018 | console_cdev_in_use = 0; |
diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c index 8b0218949b62..3a50b1903287 100644 --- a/drivers/s390/cio/device_ops.c +++ b/drivers/s390/cio/device_ops.c | |||
@@ -1,8 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * drivers/s390/cio/device_ops.c | 2 | * drivers/s390/cio/device_ops.c |
3 | * | 3 | * |
4 | * $Revision: 1.61 $ | ||
5 | * | ||
6 | * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, | 4 | * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, |
7 | * IBM Corporation | 5 | * IBM Corporation |
8 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) | 6 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) |
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c index 77be2c39bfe4..45ce032772f4 100644 --- a/drivers/s390/cio/qdio.c +++ b/drivers/s390/cio/qdio.c | |||
@@ -56,8 +56,6 @@ | |||
56 | #include "ioasm.h" | 56 | #include "ioasm.h" |
57 | #include "chsc.h" | 57 | #include "chsc.h" |
58 | 58 | ||
59 | #define VERSION_QDIO_C "$Revision: 1.117 $" | ||
60 | |||
61 | /****************** MODULE PARAMETER VARIABLES ********************/ | 59 | /****************** MODULE PARAMETER VARIABLES ********************/ |
62 | MODULE_AUTHOR("Utz Bacher <utz.bacher@de.ibm.com>"); | 60 | MODULE_AUTHOR("Utz Bacher <utz.bacher@de.ibm.com>"); |
63 | MODULE_DESCRIPTION("QDIO base support version 2, " \ | 61 | MODULE_DESCRIPTION("QDIO base support version 2, " \ |
@@ -66,8 +64,7 @@ MODULE_LICENSE("GPL"); | |||
66 | 64 | ||
67 | /******************** HERE WE GO ***********************************/ | 65 | /******************** HERE WE GO ***********************************/ |
68 | 66 | ||
69 | static const char version[] = "QDIO base support version 2 (" | 67 | static const char version[] = "QDIO base support version 2"; |
70 | VERSION_QDIO_C "/" VERSION_QDIO_H "/" VERSION_CIO_QDIO_H ")"; | ||
71 | 68 | ||
72 | #ifdef QDIO_PERFORMANCE_STATS | 69 | #ifdef QDIO_PERFORMANCE_STATS |
73 | static int proc_perf_file_registration; | 70 | static int proc_perf_file_registration; |
diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h index fa385e761fe1..ceb3ab31ee08 100644 --- a/drivers/s390/cio/qdio.h +++ b/drivers/s390/cio/qdio.h | |||
@@ -5,8 +5,6 @@ | |||
5 | 5 | ||
6 | #include "schid.h" | 6 | #include "schid.h" |
7 | 7 | ||
8 | #define VERSION_CIO_QDIO_H "$Revision: 1.40 $" | ||
9 | |||
10 | #ifdef CONFIG_QDIO_DEBUG | 8 | #ifdef CONFIG_QDIO_DEBUG |
11 | #define QDIO_VERBOSE_LEVEL 9 | 9 | #define QDIO_VERBOSE_LEVEL 9 |
12 | #else /* CONFIG_QDIO_DEBUG */ | 10 | #else /* CONFIG_QDIO_DEBUG */ |
diff --git a/drivers/s390/crypto/z90common.h b/drivers/s390/crypto/z90common.h index f87c785f2039..dbbcda3c846a 100644 --- a/drivers/s390/crypto/z90common.h +++ b/drivers/s390/crypto/z90common.h | |||
@@ -27,8 +27,6 @@ | |||
27 | #ifndef _Z90COMMON_H_ | 27 | #ifndef _Z90COMMON_H_ |
28 | #define _Z90COMMON_H_ | 28 | #define _Z90COMMON_H_ |
29 | 29 | ||
30 | #define VERSION_Z90COMMON_H "$Revision: 1.17 $" | ||
31 | |||
32 | 30 | ||
33 | #define RESPBUFFSIZE 256 | 31 | #define RESPBUFFSIZE 256 |
34 | #define PCI_FUNC_KEY_DECRYPT 0x5044 | 32 | #define PCI_FUNC_KEY_DECRYPT 0x5044 |
diff --git a/drivers/s390/crypto/z90crypt.h b/drivers/s390/crypto/z90crypt.h index 3a18443fdfa7..5e6b1f535f62 100644 --- a/drivers/s390/crypto/z90crypt.h +++ b/drivers/s390/crypto/z90crypt.h | |||
@@ -29,8 +29,6 @@ | |||
29 | 29 | ||
30 | #include <linux/ioctl.h> | 30 | #include <linux/ioctl.h> |
31 | 31 | ||
32 | #define VERSION_Z90CRYPT_H "$Revision: 1.2.2.4 $" | ||
33 | |||
34 | #define z90crypt_VERSION 1 | 32 | #define z90crypt_VERSION 1 |
35 | #define z90crypt_RELEASE 3 // 2 = PCIXCC, 3 = rewrite for coding standards | 33 | #define z90crypt_RELEASE 3 // 2 = PCIXCC, 3 = rewrite for coding standards |
36 | #define z90crypt_VARIANT 3 // 3 = CEX2A support | 34 | #define z90crypt_VARIANT 3 // 3 = CEX2A support |
diff --git a/drivers/s390/crypto/z90hardware.c b/drivers/s390/crypto/z90hardware.c index d7f7494a0cbe..4141919da805 100644 --- a/drivers/s390/crypto/z90hardware.c +++ b/drivers/s390/crypto/z90hardware.c | |||
@@ -32,12 +32,6 @@ | |||
32 | #include "z90crypt.h" | 32 | #include "z90crypt.h" |
33 | #include "z90common.h" | 33 | #include "z90common.h" |
34 | 34 | ||
35 | #define VERSION_Z90HARDWARE_C "$Revision: 1.34 $" | ||
36 | |||
37 | char z90hardware_version[] __initdata = | ||
38 | "z90hardware.o (" VERSION_Z90HARDWARE_C "/" | ||
39 | VERSION_Z90COMMON_H "/" VERSION_Z90CRYPT_H ")"; | ||
40 | |||
41 | struct cca_token_hdr { | 35 | struct cca_token_hdr { |
42 | unsigned char token_identifier; | 36 | unsigned char token_identifier; |
43 | unsigned char version; | 37 | unsigned char version; |
diff --git a/drivers/s390/crypto/z90main.c b/drivers/s390/crypto/z90main.c index 2f54d033d7cf..7d6f19030ef9 100644 --- a/drivers/s390/crypto/z90main.c +++ b/drivers/s390/crypto/z90main.c | |||
@@ -38,14 +38,6 @@ | |||
38 | #include "z90crypt.h" | 38 | #include "z90crypt.h" |
39 | #include "z90common.h" | 39 | #include "z90common.h" |
40 | 40 | ||
41 | #define VERSION_Z90MAIN_C "$Revision: 1.62 $" | ||
42 | |||
43 | static char z90main_version[] __initdata = | ||
44 | "z90main.o (" VERSION_Z90MAIN_C "/" | ||
45 | VERSION_Z90COMMON_H "/" VERSION_Z90CRYPT_H ")"; | ||
46 | |||
47 | extern char z90hardware_version[]; | ||
48 | |||
49 | /** | 41 | /** |
50 | * Defaults that may be modified. | 42 | * Defaults that may be modified. |
51 | */ | 43 | */ |
@@ -594,8 +586,6 @@ z90crypt_init_module(void) | |||
594 | PRINTKN("Version %d.%d.%d loaded, built on %s %s\n", | 586 | PRINTKN("Version %d.%d.%d loaded, built on %s %s\n", |
595 | z90crypt_VERSION, z90crypt_RELEASE, z90crypt_VARIANT, | 587 | z90crypt_VERSION, z90crypt_RELEASE, z90crypt_VARIANT, |
596 | __DATE__, __TIME__); | 588 | __DATE__, __TIME__); |
597 | PRINTKN("%s\n", z90main_version); | ||
598 | PRINTKN("%s\n", z90hardware_version); | ||
599 | PDEBUG("create_z90crypt (domain index %d) successful.\n", | 589 | PDEBUG("create_z90crypt (domain index %d) successful.\n", |
600 | domain); | 590 | domain); |
601 | } else | 591 | } else |
diff --git a/drivers/s390/net/claw.c b/drivers/s390/net/claw.c index e70af7f39946..a86436a7a606 100644 --- a/drivers/s390/net/claw.c +++ b/drivers/s390/net/claw.c | |||
@@ -2,8 +2,6 @@ | |||
2 | * drivers/s390/net/claw.c | 2 | * drivers/s390/net/claw.c |
3 | * ESCON CLAW network driver | 3 | * ESCON CLAW network driver |
4 | * | 4 | * |
5 | * $Revision: 1.38 $ $Date: 2005/08/29 09:47:04 $ | ||
6 | * | ||
7 | * Linux for zSeries version | 5 | * Linux for zSeries version |
8 | * Copyright (C) 2002,2005 IBM Corporation | 6 | * Copyright (C) 2002,2005 IBM Corporation |
9 | * Author(s) Original code written by: | 7 | * Author(s) Original code written by: |
@@ -4391,14 +4389,7 @@ static int __init | |||
4391 | claw_init(void) | 4389 | claw_init(void) |
4392 | { | 4390 | { |
4393 | int ret = 0; | 4391 | int ret = 0; |
4394 | printk(KERN_INFO "claw: starting driver " | 4392 | printk(KERN_INFO "claw: starting driver\n"); |
4395 | #ifdef MODULE | ||
4396 | "module " | ||
4397 | #else | ||
4398 | "compiled into kernel " | ||
4399 | #endif | ||
4400 | " $Revision: 1.38 $ $Date: 2005/08/29 09:47:04 $ \n"); | ||
4401 | |||
4402 | 4393 | ||
4403 | #ifdef FUNCTRACE | 4394 | #ifdef FUNCTRACE |
4404 | printk(KERN_INFO "claw: %s() enter \n",__FUNCTION__); | 4395 | printk(KERN_INFO "claw: %s() enter \n",__FUNCTION__); |
diff --git a/drivers/s390/net/claw.h b/drivers/s390/net/claw.h index 3df71970f601..969be465309c 100644 --- a/drivers/s390/net/claw.h +++ b/drivers/s390/net/claw.h | |||
@@ -2,7 +2,7 @@ | |||
2 | * Define constants * | 2 | * Define constants * |
3 | * * | 3 | * * |
4 | ********************************************************/ | 4 | ********************************************************/ |
5 | #define VERSION_CLAW_H "$Revision: 1.6 $" | 5 | |
6 | /*-----------------------------------------------------* | 6 | /*-----------------------------------------------------* |
7 | * CCW command codes for CLAW protocol * | 7 | * CCW command codes for CLAW protocol * |
8 | *------------------------------------------------------*/ | 8 | *------------------------------------------------------*/ |
diff --git a/drivers/s390/net/ctcdbug.c b/drivers/s390/net/ctcdbug.c index 0e2a8bb93032..e6e72deb36b5 100644 --- a/drivers/s390/net/ctcdbug.c +++ b/drivers/s390/net/ctcdbug.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * | 2 | * |
3 | * linux/drivers/s390/net/ctcdbug.c ($Revision: 1.6 $) | 3 | * linux/drivers/s390/net/ctcdbug.c |
4 | * | 4 | * |
5 | * CTC / ESCON network driver - s390 dbf exploit. | 5 | * CTC / ESCON network driver - s390 dbf exploit. |
6 | * | 6 | * |
@@ -9,8 +9,6 @@ | |||
9 | * Author(s): Original Code written by | 9 | * Author(s): Original Code written by |
10 | * Peter Tiedemann (ptiedem@de.ibm.com) | 10 | * Peter Tiedemann (ptiedem@de.ibm.com) |
11 | * | 11 | * |
12 | * $Revision: 1.6 $ $Date: 2005/05/11 08:10:17 $ | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
15 | * it under the terms of the GNU General Public License as published by | 13 | * it under the terms of the GNU General Public License as published by |
16 | * the Free Software Foundation; either version 2, or (at your option) | 14 | * the Free Software Foundation; either version 2, or (at your option) |
@@ -80,4 +78,3 @@ ctc_register_dbf_views(void) | |||
80 | return 0; | 78 | return 0; |
81 | } | 79 | } |
82 | 80 | ||
83 | |||
diff --git a/drivers/s390/net/ctcdbug.h b/drivers/s390/net/ctcdbug.h index 7d6afa1627c3..413925ee23d1 100644 --- a/drivers/s390/net/ctcdbug.h +++ b/drivers/s390/net/ctcdbug.h | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * | 2 | * |
3 | * linux/drivers/s390/net/ctcdbug.h ($Revision: 1.6 $) | 3 | * linux/drivers/s390/net/ctcdbug.h |
4 | * | 4 | * |
5 | * CTC / ESCON network driver - s390 dbf exploit. | 5 | * CTC / ESCON network driver - s390 dbf exploit. |
6 | * | 6 | * |
@@ -9,8 +9,6 @@ | |||
9 | * Author(s): Original Code written by | 9 | * Author(s): Original Code written by |
10 | * Peter Tiedemann (ptiedem@de.ibm.com) | 10 | * Peter Tiedemann (ptiedem@de.ibm.com) |
11 | * | 11 | * |
12 | * $Revision: 1.6 $ $Date: 2005/05/11 08:10:17 $ | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
15 | * it under the terms of the GNU General Public License as published by | 13 | * it under the terms of the GNU General Public License as published by |
16 | * the Free Software Foundation; either version 2, or (at your option) | 14 | * the Free Software Foundation; either version 2, or (at your option) |
diff --git a/drivers/s390/net/ctcmain.c b/drivers/s390/net/ctcmain.c index 1901feef07d9..af9f212314b3 100644 --- a/drivers/s390/net/ctcmain.c +++ b/drivers/s390/net/ctcmain.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: ctcmain.c,v 1.79 2006/01/11 11:32:18 cohuck Exp $ | ||
3 | * | ||
4 | * CTC / ESCON network driver | 2 | * CTC / ESCON network driver |
5 | * | 3 | * |
6 | * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation | 4 | * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation |
@@ -37,8 +35,6 @@ | |||
37 | * along with this program; if not, write to the Free Software | 35 | * along with this program; if not, write to the Free Software |
38 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 36 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
39 | * | 37 | * |
40 | * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.79 $ | ||
41 | * | ||
42 | */ | 38 | */ |
43 | #undef DEBUG | 39 | #undef DEBUG |
44 | #include <linux/module.h> | 40 | #include <linux/module.h> |
@@ -248,22 +244,11 @@ static void | |||
248 | print_banner(void) | 244 | print_banner(void) |
249 | { | 245 | { |
250 | static int printed = 0; | 246 | static int printed = 0; |
251 | char vbuf[] = "$Revision: 1.79 $"; | ||
252 | char *version = vbuf; | ||
253 | 247 | ||
254 | if (printed) | 248 | if (printed) |
255 | return; | 249 | return; |
256 | if ((version = strchr(version, ':'))) { | 250 | |
257 | char *p = strchr(version + 1, '$'); | 251 | printk(KERN_INFO "CTC driver initialized\n"); |
258 | if (p) | ||
259 | *p = '\0'; | ||
260 | } else | ||
261 | version = " ??? "; | ||
262 | printk(KERN_INFO "CTC driver Version%s" | ||
263 | #ifdef DEBUG | ||
264 | " (DEBUG-VERSION, " __DATE__ __TIME__ ")" | ||
265 | #endif | ||
266 | " initialized\n", version); | ||
267 | printed = 1; | 252 | printed = 1; |
268 | } | 253 | } |
269 | 254 | ||
diff --git a/drivers/s390/net/ctcmain.h b/drivers/s390/net/ctcmain.h index ba3605f16335..d2e835c0c134 100644 --- a/drivers/s390/net/ctcmain.h +++ b/drivers/s390/net/ctcmain.h | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: ctcmain.h,v 1.4 2005/03/24 09:04:17 mschwide Exp $ | ||
3 | * | ||
4 | * CTC / ESCON network driver | 2 | * CTC / ESCON network driver |
5 | * | 3 | * |
6 | * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation | 4 | * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation |
@@ -29,8 +27,6 @@ | |||
29 | * along with this program; if not, write to the Free Software | 27 | * along with this program; if not, write to the Free Software |
30 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
31 | * | 29 | * |
32 | * RELEASE-TAG: CTC/ESCON network driver $Revision: 1.4 $ | ||
33 | * | ||
34 | */ | 30 | */ |
35 | 31 | ||
36 | #ifndef _CTCMAIN_H_ | 32 | #ifndef _CTCMAIN_H_ |
diff --git a/drivers/s390/net/ctctty.c b/drivers/s390/net/ctctty.c index 93d1725eb79b..5cdcdbf92962 100644 --- a/drivers/s390/net/ctctty.c +++ b/drivers/s390/net/ctctty.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: ctctty.c,v 1.29 2005/04/05 08:50:44 mschwide Exp $ | ||
3 | * | ||
4 | * CTC / ESCON network driver, tty interface. | 2 | * CTC / ESCON network driver, tty interface. |
5 | * | 3 | * |
6 | * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation | 4 | * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation |
diff --git a/drivers/s390/net/ctctty.h b/drivers/s390/net/ctctty.h index 84b2f8f23ab3..7254dc006311 100644 --- a/drivers/s390/net/ctctty.h +++ b/drivers/s390/net/ctctty.h | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: ctctty.h,v 1.4 2003/09/18 08:01:10 mschwide Exp $ | ||
3 | * | ||
4 | * CTC / ESCON network driver, tty interface. | 2 | * CTC / ESCON network driver, tty interface. |
5 | * | 3 | * |
6 | * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation | 4 | * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation |
diff --git a/drivers/s390/net/cu3088.c b/drivers/s390/net/cu3088.c index 2014fb7a4881..b12533104c1f 100644 --- a/drivers/s390/net/cu3088.c +++ b/drivers/s390/net/cu3088.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: cu3088.c,v 1.38 2006/01/12 14:33:09 cohuck Exp $ | ||
3 | * | ||
4 | * CTC / LCS ccw_device driver | 2 | * CTC / LCS ccw_device driver |
5 | * | 3 | * |
6 | * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation | 4 | * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation |
diff --git a/drivers/s390/net/fsm.c b/drivers/s390/net/fsm.c index 24029bd9c7d0..6caf5fa6a3b5 100644 --- a/drivers/s390/net/fsm.c +++ b/drivers/s390/net/fsm.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /** | 1 | /** |
2 | * $Id: fsm.c,v 1.6 2003/10/15 11:37:29 mschwide Exp $ | ||
3 | * | ||
4 | * A generic FSM based on fsm used in isdn4linux | 2 | * A generic FSM based on fsm used in isdn4linux |
5 | * | 3 | * |
6 | */ | 4 | */ |
diff --git a/drivers/s390/net/fsm.h b/drivers/s390/net/fsm.h index 5b98253be7aa..af679c10f1bd 100644 --- a/drivers/s390/net/fsm.h +++ b/drivers/s390/net/fsm.h | |||
@@ -1,5 +1,3 @@ | |||
1 | /* $Id: fsm.h,v 1.1.1.1 2002/03/13 19:33:09 mschwide Exp $ | ||
2 | */ | ||
3 | #ifndef _FSM_H_ | 1 | #ifndef _FSM_H_ |
4 | #define _FSM_H_ | 2 | #define _FSM_H_ |
5 | 3 | ||
diff --git a/drivers/s390/net/iucv.c b/drivers/s390/net/iucv.c index ea8177392564..760e77ec5a11 100644 --- a/drivers/s390/net/iucv.c +++ b/drivers/s390/net/iucv.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: iucv.c,v 1.47 2005/11/21 11:35:22 mschwide Exp $ | ||
3 | * | ||
4 | * IUCV network driver | 2 | * IUCV network driver |
5 | * | 3 | * |
6 | * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation | 4 | * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation |
@@ -29,8 +27,6 @@ | |||
29 | * along with this program; if not, write to the Free Software | 27 | * along with this program; if not, write to the Free Software |
30 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
31 | * | 29 | * |
32 | * RELEASE-TAG: IUCV lowlevel driver $Revision: 1.47 $ | ||
33 | * | ||
34 | */ | 30 | */ |
35 | 31 | ||
36 | /* #define DEBUG */ | 32 | /* #define DEBUG */ |
@@ -355,17 +351,7 @@ do { \ | |||
355 | static void | 351 | static void |
356 | iucv_banner(void) | 352 | iucv_banner(void) |
357 | { | 353 | { |
358 | char vbuf[] = "$Revision: 1.47 $"; | 354 | printk(KERN_INFO "IUCV lowlevel driver initialized\n"); |
359 | char *version = vbuf; | ||
360 | |||
361 | if ((version = strchr(version, ':'))) { | ||
362 | char *p = strchr(version + 1, '$'); | ||
363 | if (p) | ||
364 | *p = '\0'; | ||
365 | } else | ||
366 | version = " ??? "; | ||
367 | printk(KERN_INFO | ||
368 | "IUCV lowlevel driver Version%s initialized\n", version); | ||
369 | } | 355 | } |
370 | 356 | ||
371 | /** | 357 | /** |
diff --git a/drivers/s390/net/lcs.c b/drivers/s390/net/lcs.c index da8c515743e8..6229ba4995ad 100644 --- a/drivers/s390/net/lcs.c +++ b/drivers/s390/net/lcs.c | |||
@@ -11,8 +11,6 @@ | |||
11 | * Frank Pavlic (fpavlic@de.ibm.com) and | 11 | * Frank Pavlic (fpavlic@de.ibm.com) and |
12 | * Martin Schwidefsky <schwidefsky@de.ibm.com> | 12 | * Martin Schwidefsky <schwidefsky@de.ibm.com> |
13 | * | 13 | * |
14 | * $Revision: 1.99 $ $Date: 2005/05/11 08:10:17 $ | ||
15 | * | ||
16 | * This program is free software; you can redistribute it and/or modify | 14 | * This program is free software; you can redistribute it and/or modify |
17 | * it under the terms of the GNU General Public License as published by | 15 | * it under the terms of the GNU General Public License as published by |
18 | * the Free Software Foundation; either version 2, or (at your option) | 16 | * the Free Software Foundation; either version 2, or (at your option) |
@@ -59,9 +57,8 @@ | |||
59 | /** | 57 | /** |
60 | * initialization string for output | 58 | * initialization string for output |
61 | */ | 59 | */ |
62 | #define VERSION_LCS_C "$Revision: 1.99 $" | ||
63 | 60 | ||
64 | static char version[] __initdata = "LCS driver ("VERSION_LCS_C "/" VERSION_LCS_H ")"; | 61 | static char version[] __initdata = "LCS driver"; |
65 | static char debug_buffer[255]; | 62 | static char debug_buffer[255]; |
66 | 63 | ||
67 | /** | 64 | /** |
diff --git a/drivers/s390/net/lcs.h b/drivers/s390/net/lcs.h index a7f348ef1b08..08e60ad43916 100644 --- a/drivers/s390/net/lcs.h +++ b/drivers/s390/net/lcs.h | |||
@@ -6,8 +6,6 @@ | |||
6 | #include <linux/workqueue.h> | 6 | #include <linux/workqueue.h> |
7 | #include <asm/ccwdev.h> | 7 | #include <asm/ccwdev.h> |
8 | 8 | ||
9 | #define VERSION_LCS_H "$Revision: 1.19 $" | ||
10 | |||
11 | #define LCS_DBF_TEXT(level, name, text) \ | 9 | #define LCS_DBF_TEXT(level, name, text) \ |
12 | do { \ | 10 | do { \ |
13 | debug_text_event(lcs_dbf_##name, level, text); \ | 11 | debug_text_event(lcs_dbf_##name, level, text); \ |
diff --git a/drivers/s390/net/netiucv.c b/drivers/s390/net/netiucv.c index ac4c4b83fe17..71d3853e8682 100644 --- a/drivers/s390/net/netiucv.c +++ b/drivers/s390/net/netiucv.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * $Id: netiucv.c,v 1.69 2006/01/12 14:33:09 cohuck Exp $ | ||
3 | * | ||
4 | * IUCV network driver | 2 | * IUCV network driver |
5 | * | 3 | * |
6 | * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation | 4 | * Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation |
@@ -31,8 +29,6 @@ | |||
31 | * along with this program; if not, write to the Free Software | 29 | * along with this program; if not, write to the Free Software |
32 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 30 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
33 | * | 31 | * |
34 | * RELEASE-TAG: IUCV network driver $Revision: 1.69 $ | ||
35 | * | ||
36 | */ | 32 | */ |
37 | 33 | ||
38 | #undef DEBUG | 34 | #undef DEBUG |
@@ -2077,16 +2073,7 @@ DRIVER_ATTR(remove, 0200, NULL, remove_write); | |||
2077 | static void | 2073 | static void |
2078 | netiucv_banner(void) | 2074 | netiucv_banner(void) |
2079 | { | 2075 | { |
2080 | char vbuf[] = "$Revision: 1.69 $"; | 2076 | PRINT_INFO("NETIUCV driver initialized\n"); |
2081 | char *version = vbuf; | ||
2082 | |||
2083 | if ((version = strchr(version, ':'))) { | ||
2084 | char *p = strchr(version + 1, '$'); | ||
2085 | if (p) | ||
2086 | *p = '\0'; | ||
2087 | } else | ||
2088 | version = " ??? "; | ||
2089 | PRINT_INFO("NETIUCV driver Version%s initialized\n", version); | ||
2090 | } | 2077 | } |
2091 | 2078 | ||
2092 | static void __exit | 2079 | static void __exit |
diff --git a/drivers/s390/net/qeth.h b/drivers/s390/net/qeth.h index d238c7ed103b..9a064d4727ad 100644 --- a/drivers/s390/net/qeth.h +++ b/drivers/s390/net/qeth.h | |||
@@ -25,8 +25,6 @@ | |||
25 | 25 | ||
26 | #include "qeth_mpc.h" | 26 | #include "qeth_mpc.h" |
27 | 27 | ||
28 | #define VERSION_QETH_H "$Revision: 1.152 $" | ||
29 | |||
30 | #ifdef CONFIG_QETH_IPV6 | 28 | #ifdef CONFIG_QETH_IPV6 |
31 | #define QETH_VERSION_IPV6 ":IPv6" | 29 | #define QETH_VERSION_IPV6 ":IPv6" |
32 | #else | 30 | #else |
diff --git a/drivers/s390/net/qeth_eddp.c b/drivers/s390/net/qeth_eddp.c index f94f1f25eec6..b02313127780 100644 --- a/drivers/s390/net/qeth_eddp.c +++ b/drivers/s390/net/qeth_eddp.c | |||
@@ -1,6 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * | 2 | * linux/drivers/s390/net/qeth_eddp.c |
3 | * linux/drivers/s390/net/qeth_eddp.c ($Revision: 1.13 $) | ||
4 | * | 3 | * |
5 | * Enhanced Device Driver Packing (EDDP) support for the qeth driver. | 4 | * Enhanced Device Driver Packing (EDDP) support for the qeth driver. |
6 | * | 5 | * |
@@ -8,8 +7,6 @@ | |||
8 | * | 7 | * |
9 | * Author(s): Thomas Spatzier <tspat@de.ibm.com> | 8 | * Author(s): Thomas Spatzier <tspat@de.ibm.com> |
10 | * | 9 | * |
11 | * $Revision: 1.13 $ $Date: 2005/05/04 20:19:18 $ | ||
12 | * | ||
13 | */ | 10 | */ |
14 | #include <linux/config.h> | 11 | #include <linux/config.h> |
15 | #include <linux/errno.h> | 12 | #include <linux/errno.h> |
diff --git a/drivers/s390/net/qeth_eddp.h b/drivers/s390/net/qeth_eddp.h index e1b51860bc57..cae9ba265056 100644 --- a/drivers/s390/net/qeth_eddp.h +++ b/drivers/s390/net/qeth_eddp.h | |||
@@ -1,14 +1,12 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/s390/net/qeth_eddp.c ($Revision: 1.5 $) | 2 | * linux/drivers/s390/net/qeth_eddp.h |
3 | * | 3 | * |
4 | * Header file for qeth enhanced device driver pakcing. | 4 | * Header file for qeth enhanced device driver packing. |
5 | * | 5 | * |
6 | * Copyright 2004 IBM Corporation | 6 | * Copyright 2004 IBM Corporation |
7 | * | 7 | * |
8 | * Author(s): Thomas Spatzier <tspat@de.ibm.com> | 8 | * Author(s): Thomas Spatzier <tspat@de.ibm.com> |
9 | * | 9 | * |
10 | * $Revision: 1.5 $ $Date: 2005/03/24 09:04:18 $ | ||
11 | * | ||
12 | */ | 10 | */ |
13 | #ifndef __QETH_EDDP_H__ | 11 | #ifndef __QETH_EDDP_H__ |
14 | #define __QETH_EDDP_H__ | 12 | #define __QETH_EDDP_H__ |
diff --git a/drivers/s390/net/qeth_fs.h b/drivers/s390/net/qeth_fs.h index c0b4c8d82c45..e422b41c656e 100644 --- a/drivers/s390/net/qeth_fs.h +++ b/drivers/s390/net/qeth_fs.h | |||
@@ -12,11 +12,6 @@ | |||
12 | #ifndef __QETH_FS_H__ | 12 | #ifndef __QETH_FS_H__ |
13 | #define __QETH_FS_H__ | 13 | #define __QETH_FS_H__ |
14 | 14 | ||
15 | #define VERSION_QETH_FS_H "$Revision: 1.10 $" | ||
16 | |||
17 | extern const char *VERSION_QETH_PROC_C; | ||
18 | extern const char *VERSION_QETH_SYS_C; | ||
19 | |||
20 | #ifdef CONFIG_PROC_FS | 15 | #ifdef CONFIG_PROC_FS |
21 | extern int | 16 | extern int |
22 | qeth_create_procfs_entries(void); | 17 | qeth_create_procfs_entries(void); |
diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index 97f927c01a82..410abeada6c4 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c | |||
@@ -1,6 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * | 2 | * linux/drivers/s390/net/qeth_main.c |
3 | * linux/drivers/s390/net/qeth_main.c ($Revision: 1.251 $) | ||
4 | * | 3 | * |
5 | * Linux on zSeries OSA Express and HiperSockets support | 4 | * Linux on zSeries OSA Express and HiperSockets support |
6 | * | 5 | * |
@@ -12,8 +11,6 @@ | |||
12 | * Frank Pavlic (fpavlic@de.ibm.com) and | 11 | * Frank Pavlic (fpavlic@de.ibm.com) and |
13 | * Thomas Spatzier <tspat@de.ibm.com> | 12 | * Thomas Spatzier <tspat@de.ibm.com> |
14 | * | 13 | * |
15 | * $Revision: 1.251 $ $Date: 2005/05/04 20:19:18 $ | ||
16 | * | ||
17 | * This program is free software; you can redistribute it and/or modify | 14 | * This program is free software; you can redistribute it and/or modify |
18 | * it under the terms of the GNU General Public License as published by | 15 | * it under the terms of the GNU General Public License as published by |
19 | * the Free Software Foundation; either version 2, or (at your option) | 16 | * the Free Software Foundation; either version 2, or (at your option) |
@@ -73,7 +70,6 @@ | |||
73 | #include "qeth_eddp.h" | 70 | #include "qeth_eddp.h" |
74 | #include "qeth_tso.h" | 71 | #include "qeth_tso.h" |
75 | 72 | ||
76 | #define VERSION_QETH_C "$Revision: 1.251 $" | ||
77 | static const char *version = "qeth S/390 OSA-Express driver"; | 73 | static const char *version = "qeth S/390 OSA-Express driver"; |
78 | 74 | ||
79 | /** | 75 | /** |
@@ -8626,12 +8622,7 @@ qeth_init(void) | |||
8626 | { | 8622 | { |
8627 | int rc=0; | 8623 | int rc=0; |
8628 | 8624 | ||
8629 | PRINT_INFO("loading %s (%s/%s/%s/%s/%s/%s/%s %s %s)\n", | 8625 | PRINT_INFO("loading %s\n", version); |
8630 | version, VERSION_QETH_C, VERSION_QETH_H, | ||
8631 | VERSION_QETH_MPC_H, VERSION_QETH_MPC_C, | ||
8632 | VERSION_QETH_FS_H, VERSION_QETH_PROC_C, | ||
8633 | VERSION_QETH_SYS_C, QETH_VERSION_IPV6, | ||
8634 | QETH_VERSION_VLAN); | ||
8635 | 8626 | ||
8636 | INIT_LIST_HEAD(&qeth_card_list.list); | 8627 | INIT_LIST_HEAD(&qeth_card_list.list); |
8637 | INIT_LIST_HEAD(&qeth_notify_list); | 8628 | INIT_LIST_HEAD(&qeth_notify_list); |
diff --git a/drivers/s390/net/qeth_mpc.c b/drivers/s390/net/qeth_mpc.c index 5f8754addc14..77c83209d70e 100644 --- a/drivers/s390/net/qeth_mpc.c +++ b/drivers/s390/net/qeth_mpc.c | |||
@@ -11,8 +11,6 @@ | |||
11 | #include <asm/cio.h> | 11 | #include <asm/cio.h> |
12 | #include "qeth_mpc.h" | 12 | #include "qeth_mpc.h" |
13 | 13 | ||
14 | const char *VERSION_QETH_MPC_C = "$Revision: 1.13 $"; | ||
15 | |||
16 | unsigned char IDX_ACTIVATE_READ[]={ | 14 | unsigned char IDX_ACTIVATE_READ[]={ |
17 | 0x00,0x00,0x80,0x00, 0x00,0x00,0x00,0x00, | 15 | 0x00,0x00,0x80,0x00, 0x00,0x00,0x00,0x00, |
18 | 0x19,0x01,0x01,0x80, 0x00,0x00,0x00,0x00, | 16 | 0x19,0x01,0x01,0x80, 0x00,0x00,0x00,0x00, |
diff --git a/drivers/s390/net/qeth_mpc.h b/drivers/s390/net/qeth_mpc.h index 864cec5f6c62..011c41041029 100644 --- a/drivers/s390/net/qeth_mpc.h +++ b/drivers/s390/net/qeth_mpc.h | |||
@@ -14,10 +14,6 @@ | |||
14 | 14 | ||
15 | #include <asm/qeth.h> | 15 | #include <asm/qeth.h> |
16 | 16 | ||
17 | #define VERSION_QETH_MPC_H "$Revision: 1.46 $" | ||
18 | |||
19 | extern const char *VERSION_QETH_MPC_C; | ||
20 | |||
21 | #define IPA_PDU_HEADER_SIZE 0x40 | 17 | #define IPA_PDU_HEADER_SIZE 0x40 |
22 | #define QETH_IPA_PDU_LEN_TOTAL(buffer) (buffer+0x0e) | 18 | #define QETH_IPA_PDU_LEN_TOTAL(buffer) (buffer+0x0e) |
23 | #define QETH_IPA_PDU_LEN_PDU1(buffer) (buffer+0x26) | 19 | #define QETH_IPA_PDU_LEN_PDU1(buffer) (buffer+0x26) |
diff --git a/drivers/s390/net/qeth_proc.c b/drivers/s390/net/qeth_proc.c index 7bf35098831e..3c6339df879d 100644 --- a/drivers/s390/net/qeth_proc.c +++ b/drivers/s390/net/qeth_proc.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * | 2 | * |
3 | * linux/drivers/s390/net/qeth_fs.c ($Revision: 1.16 $) | 3 | * linux/drivers/s390/net/qeth_fs.c |
4 | * | 4 | * |
5 | * Linux on zSeries OSA Express and HiperSockets support | 5 | * Linux on zSeries OSA Express and HiperSockets support |
6 | * This file contains code related to procfs. | 6 | * This file contains code related to procfs. |
@@ -21,8 +21,6 @@ | |||
21 | #include "qeth_mpc.h" | 21 | #include "qeth_mpc.h" |
22 | #include "qeth_fs.h" | 22 | #include "qeth_fs.h" |
23 | 23 | ||
24 | const char *VERSION_QETH_PROC_C = "$Revision: 1.16 $"; | ||
25 | |||
26 | /***** /proc/qeth *****/ | 24 | /***** /proc/qeth *****/ |
27 | #define QETH_PROCFILE_NAME "qeth" | 25 | #define QETH_PROCFILE_NAME "qeth" |
28 | static struct proc_dir_entry *qeth_procfile; | 26 | static struct proc_dir_entry *qeth_procfile; |
diff --git a/drivers/s390/net/qeth_sys.c b/drivers/s390/net/qeth_sys.c index 0ea185f70f75..c1831f572585 100644 --- a/drivers/s390/net/qeth_sys.c +++ b/drivers/s390/net/qeth_sys.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * | 2 | * |
3 | * linux/drivers/s390/net/qeth_sys.c ($Revision: 1.60 $) | 3 | * linux/drivers/s390/net/qeth_sys.c |
4 | * | 4 | * |
5 | * Linux on zSeries OSA Express and HiperSockets support | 5 | * Linux on zSeries OSA Express and HiperSockets support |
6 | * This file contains code related to sysfs. | 6 | * This file contains code related to sysfs. |
@@ -20,8 +20,6 @@ | |||
20 | #include "qeth_mpc.h" | 20 | #include "qeth_mpc.h" |
21 | #include "qeth_fs.h" | 21 | #include "qeth_fs.h" |
22 | 22 | ||
23 | const char *VERSION_QETH_SYS_C = "$Revision: 1.60 $"; | ||
24 | |||
25 | /*****************************************************************************/ | 23 | /*****************************************************************************/ |
26 | /* */ | 24 | /* */ |
27 | /* /sys-fs stuff UNDER DEVELOPMENT !!! */ | 25 | /* /sys-fs stuff UNDER DEVELOPMENT !!! */ |
diff --git a/drivers/s390/net/qeth_tso.h b/drivers/s390/net/qeth_tso.h index 3c50b6f24f51..1286ddea450b 100644 --- a/drivers/s390/net/qeth_tso.h +++ b/drivers/s390/net/qeth_tso.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/s390/net/qeth_tso.h ($Revision: 1.8 $) | 2 | * linux/drivers/s390/net/qeth_tso.h |
3 | * | 3 | * |
4 | * Header file for qeth TCP Segmentation Offload support. | 4 | * Header file for qeth TCP Segmentation Offload support. |
5 | * | 5 | * |
@@ -7,8 +7,6 @@ | |||
7 | * | 7 | * |
8 | * Author(s): Frank Pavlic <fpavlic@de.ibm.com> | 8 | * Author(s): Frank Pavlic <fpavlic@de.ibm.com> |
9 | * | 9 | * |
10 | * $Revision: 1.8 $ $Date: 2005/05/04 20:19:18 $ | ||
11 | * | ||
12 | */ | 10 | */ |
13 | #ifndef __QETH_TSO_H__ | 11 | #ifndef __QETH_TSO_H__ |
14 | #define __QETH_TSO_H__ | 12 | #define __QETH_TSO_H__ |
diff --git a/drivers/s390/s390_rdev.c b/drivers/s390/s390_rdev.c index 206518c7d332..e3f647169827 100644 --- a/drivers/s390/s390_rdev.c +++ b/drivers/s390/s390_rdev.c | |||
@@ -1,7 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * drivers/s390/s390_rdev.c | 2 | * drivers/s390/s390_rdev.c |
3 | * s390 root device | 3 | * s390 root device |
4 | * $Revision: 1.4 $ | ||
5 | * | 4 | * |
6 | * Copyright (C) 2002, 2005 IBM Deutschland Entwicklung GmbH, | 5 | * Copyright (C) 2002, 2005 IBM Deutschland Entwicklung GmbH, |
7 | * IBM Corporation | 6 | * IBM Corporation |
diff --git a/drivers/s390/s390mach.h b/drivers/s390/s390mach.h index d9ea7ed2e46e..7abb42a09ae2 100644 --- a/drivers/s390/s390mach.h +++ b/drivers/s390/s390mach.h | |||
@@ -90,15 +90,16 @@ struct crw { | |||
90 | 90 | ||
91 | static inline int stcrw(struct crw *pcrw ) | 91 | static inline int stcrw(struct crw *pcrw ) |
92 | { | 92 | { |
93 | int ccode; | 93 | int ccode; |
94 | 94 | ||
95 | __asm__ __volatile__( | 95 | __asm__ __volatile__( |
96 | "STCRW 0(%1)\n\t" | 96 | "stcrw 0(%2)\n\t" |
97 | "IPM %0\n\t" | 97 | "ipm %0\n\t" |
98 | "SRL %0,28\n\t" | 98 | "srl %0,28\n\t" |
99 | : "=d" (ccode) : "a" (pcrw) | 99 | : "=d" (ccode), "=m" (*pcrw) |
100 | : "cc", "1" ); | 100 | : "a" (pcrw) |
101 | return ccode; | 101 | : "cc" ); |
102 | return ccode; | ||
102 | } | 103 | } |
103 | 104 | ||
104 | #endif /* __s390mach */ | 105 | #endif /* __s390mach */ |
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index 167fef39d8a7..95b92f317b6f 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
@@ -29,8 +29,6 @@ | |||
29 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 29 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
30 | */ | 30 | */ |
31 | 31 | ||
32 | #define ZFCP_AUX_REVISION "$Revision: 1.145 $" | ||
33 | |||
34 | #include "zfcp_ext.h" | 32 | #include "zfcp_ext.h" |
35 | 33 | ||
36 | /* accumulated log level (module parameter) */ | 34 | /* accumulated log level (module parameter) */ |
diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c index 0fc46381fc22..241136d0c6eb 100644 --- a/drivers/s390/scsi/zfcp_ccw.c +++ b/drivers/s390/scsi/zfcp_ccw.c | |||
@@ -27,8 +27,6 @@ | |||
27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #define ZFCP_CCW_C_REVISION "$Revision: 1.58 $" | ||
31 | |||
32 | #include "zfcp_ext.h" | 30 | #include "zfcp_ext.h" |
33 | 31 | ||
34 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG | 32 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG |
diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c index 95599719f8ab..4d7d47cf2394 100644 --- a/drivers/s390/scsi/zfcp_dbf.c +++ b/drivers/s390/scsi/zfcp_dbf.c | |||
@@ -23,8 +23,6 @@ | |||
23 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 23 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
24 | */ | 24 | */ |
25 | 25 | ||
26 | #define ZFCP_DBF_REVISION "$Revision$" | ||
27 | |||
28 | #include <asm/debug.h> | 26 | #include <asm/debug.h> |
29 | #include <linux/ctype.h> | 27 | #include <linux/ctype.h> |
30 | #include "zfcp_ext.h" | 28 | #include "zfcp_ext.h" |
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index 9bb511083a26..e260d19fa717 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
@@ -34,8 +34,6 @@ | |||
34 | #ifndef ZFCP_DEF_H | 34 | #ifndef ZFCP_DEF_H |
35 | #define ZFCP_DEF_H | 35 | #define ZFCP_DEF_H |
36 | 36 | ||
37 | #define ZFCP_DEF_REVISION "$Revision: 1.111 $" | ||
38 | |||
39 | /*************************** INCLUDES *****************************************/ | 37 | /*************************** INCLUDES *****************************************/ |
40 | 38 | ||
41 | #include <linux/init.h> | 39 | #include <linux/init.h> |
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index c065cb836c97..da947e662031 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
@@ -31,8 +31,6 @@ | |||
31 | 31 | ||
32 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_ERP | 32 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_ERP |
33 | 33 | ||
34 | #define ZFCP_ERP_REVISION "$Revision: 1.86 $" | ||
35 | |||
36 | #include "zfcp_ext.h" | 34 | #include "zfcp_ext.h" |
37 | 35 | ||
38 | static int zfcp_erp_adisc(struct zfcp_port *); | 36 | static int zfcp_erp_adisc(struct zfcp_port *); |
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index c3782261cb5c..c1ba7cf1b496 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h | |||
@@ -32,8 +32,6 @@ | |||
32 | #ifndef ZFCP_EXT_H | 32 | #ifndef ZFCP_EXT_H |
33 | #define ZFCP_EXT_H | 33 | #define ZFCP_EXT_H |
34 | 34 | ||
35 | #define ZFCP_EXT_REVISION "$Revision: 1.62 $" | ||
36 | |||
37 | #include "zfcp_def.h" | 35 | #include "zfcp_def.h" |
38 | 36 | ||
39 | extern struct zfcp_data zfcp_data; | 37 | extern struct zfcp_data zfcp_data; |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index cbfab09899c8..9f0cb3d820c0 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
@@ -30,8 +30,6 @@ | |||
30 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 30 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
31 | */ | 31 | */ |
32 | 32 | ||
33 | #define ZFCP_FSF_C_REVISION "$Revision: 1.92 $" | ||
34 | |||
35 | #include "zfcp_ext.h" | 33 | #include "zfcp_ext.h" |
36 | 34 | ||
37 | static int zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *); | 35 | static int zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *); |
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index d719f66a29a4..1c3275163c91 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c | |||
@@ -29,8 +29,6 @@ | |||
29 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 29 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
30 | */ | 30 | */ |
31 | 31 | ||
32 | #define ZFCP_QDIO_C_REVISION "$Revision: 1.20 $" | ||
33 | |||
34 | #include "zfcp_ext.h" | 32 | #include "zfcp_ext.h" |
35 | 33 | ||
36 | static inline void zfcp_qdio_sbal_limit(struct zfcp_fsf_req *, int); | 34 | static inline void zfcp_qdio_sbal_limit(struct zfcp_fsf_req *, int); |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 3c2cbcccbf54..e0803757c0fa 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -31,8 +31,6 @@ | |||
31 | 31 | ||
32 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_SCSI | 32 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_SCSI |
33 | 33 | ||
34 | #define ZFCP_SCSI_REVISION "$Revision: 1.74 $" | ||
35 | |||
36 | #include "zfcp_ext.h" | 34 | #include "zfcp_ext.h" |
37 | 35 | ||
38 | static void zfcp_scsi_slave_destroy(struct scsi_device *sdp); | 36 | static void zfcp_scsi_slave_destroy(struct scsi_device *sdp); |
diff --git a/drivers/s390/scsi/zfcp_sysfs_adapter.c b/drivers/s390/scsi/zfcp_sysfs_adapter.c index 9f262250043a..dfc07370f412 100644 --- a/drivers/s390/scsi/zfcp_sysfs_adapter.c +++ b/drivers/s390/scsi/zfcp_sysfs_adapter.c | |||
@@ -27,8 +27,6 @@ | |||
27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #define ZFCP_SYSFS_ADAPTER_C_REVISION "$Revision: 1.38 $" | ||
31 | |||
32 | #include "zfcp_ext.h" | 30 | #include "zfcp_ext.h" |
33 | 31 | ||
34 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG | 32 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG |
diff --git a/drivers/s390/scsi/zfcp_sysfs_driver.c b/drivers/s390/scsi/zfcp_sysfs_driver.c index 77a5e2dcc0ff..6622d55e0a45 100644 --- a/drivers/s390/scsi/zfcp_sysfs_driver.c +++ b/drivers/s390/scsi/zfcp_sysfs_driver.c | |||
@@ -27,8 +27,6 @@ | |||
27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #define ZFCP_SYSFS_DRIVER_C_REVISION "$Revision: 1.17 $" | ||
31 | |||
32 | #include "zfcp_ext.h" | 30 | #include "zfcp_ext.h" |
33 | 31 | ||
34 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG | 32 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG |
diff --git a/drivers/s390/scsi/zfcp_sysfs_port.c b/drivers/s390/scsi/zfcp_sysfs_port.c index 3924eb38805c..f401d42db21c 100644 --- a/drivers/s390/scsi/zfcp_sysfs_port.c +++ b/drivers/s390/scsi/zfcp_sysfs_port.c | |||
@@ -28,8 +28,6 @@ | |||
28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | #define ZFCP_SYSFS_PORT_C_REVISION "$Revision: 1.47 $" | ||
32 | |||
33 | #include "zfcp_ext.h" | 31 | #include "zfcp_ext.h" |
34 | 32 | ||
35 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG | 33 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG |
diff --git a/drivers/s390/scsi/zfcp_sysfs_unit.c b/drivers/s390/scsi/zfcp_sysfs_unit.c index 2f50815f65c7..ad5dfb889bee 100644 --- a/drivers/s390/scsi/zfcp_sysfs_unit.c +++ b/drivers/s390/scsi/zfcp_sysfs_unit.c | |||
@@ -28,8 +28,6 @@ | |||
28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
29 | */ | 29 | */ |
30 | 30 | ||
31 | #define ZFCP_SYSFS_UNIT_C_REVISION "$Revision: 1.30 $" | ||
32 | |||
33 | #include "zfcp_ext.h" | 31 | #include "zfcp_ext.h" |
34 | 32 | ||
35 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG | 33 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_CONFIG |