diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-22 21:15:32 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-22 21:15:32 -0400 |
commit | db1417967959569599da2a4bd0ffb93b17ad795f (patch) | |
tree | 08751414d5f4a9e264af924154ed3543a8e573a9 /drivers | |
parent | 48aab2f79dfc1357c48ce22ff5c989b52a590069 (diff) | |
parent | c6da39f26cfe475704ec521723192e520e8f51b8 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
Pull s390 patches from Martin Schwidefsky:
"The biggest patch is the rework of the smp code, something I wanted to
do for some time. There are some patches for our various dump methods
and one new thing: z/VM LGR detection. LGR stands for linux-guest-
relocation and is the guest migration feature of z/VM. For debugging
purposes we keep a log of the systems where a specific guest has lived."
Fix up trivial conflict in arch/s390/kernel/smp.c due to the scheduler
cleanup having removed some code next to removed s390 code.
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
[S390] kernel: Pass correct stack for smp_call_ipl_cpu()
[S390] Ensure that vmcore_info pointer is never accessed directly
[S390] dasd: prevent validate server for offline devices
[S390] Remove monolithic build option for zcrypt driver.
[S390] stack dump: fix indentation in output
[S390] kernel: Add OS info memory interface
[S390] Use block_sigmask()
[S390] kernel: Add z/VM LGR detection
[S390] irq: external interrupt code passing
[S390] irq: set __ARCH_IRQ_EXIT_IRQS_DISABLED
[S390] zfcpdump: Implement async sdias event processing
[S390] Use copy_to_absolute_zero() instead of "stura/sturg"
[S390] rework idle code
[S390] rework smp code
[S390] rename lowcore field
[S390] Fix gcc 4.6.0 compile warning
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/crypto/Kconfig | 9 | ||||
-rw-r--r-- | drivers/s390/block/dasd.c | 4 | ||||
-rw-r--r-- | drivers/s390/block/dasd_diag.c | 8 | ||||
-rw-r--r-- | drivers/s390/block/dasd_eckd.c | 8 | ||||
-rw-r--r-- | drivers/s390/char/sclp.c | 4 | ||||
-rw-r--r-- | drivers/s390/char/sclp_quiesce.c | 1 | ||||
-rw-r--r-- | drivers/s390/char/sclp_sdias.c | 101 | ||||
-rw-r--r-- | drivers/s390/char/zcore.c | 1 | ||||
-rw-r--r-- | drivers/s390/cio/cio.c | 2 | ||||
-rw-r--r-- | drivers/s390/cio/qdio_main.c | 6 | ||||
-rw-r--r-- | drivers/s390/crypto/Makefile | 10 | ||||
-rw-r--r-- | drivers/s390/crypto/ap_bus.c | 2 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_api.c | 2 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_cex2a.c | 4 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_mono.c | 100 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_pcica.c | 4 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_pcicc.c | 4 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_pcixcc.c | 4 | ||||
-rw-r--r-- | drivers/s390/kvm/kvm_virtio.c | 6 |
19 files changed, 106 insertions, 174 deletions
diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig index e707979767fb..ab9abb46d01a 100644 --- a/drivers/crypto/Kconfig +++ b/drivers/crypto/Kconfig | |||
@@ -64,7 +64,6 @@ config CRYPTO_DEV_GEODE | |||
64 | config ZCRYPT | 64 | config ZCRYPT |
65 | tristate "Support for PCI-attached cryptographic adapters" | 65 | tristate "Support for PCI-attached cryptographic adapters" |
66 | depends on S390 | 66 | depends on S390 |
67 | select ZCRYPT_MONOLITHIC if ZCRYPT="y" | ||
68 | select HW_RANDOM | 67 | select HW_RANDOM |
69 | help | 68 | help |
70 | Select this option if you want to use a PCI-attached cryptographic | 69 | Select this option if you want to use a PCI-attached cryptographic |
@@ -77,14 +76,6 @@ config ZCRYPT | |||
77 | + Crypto Express3 Coprocessor (CEX3C) | 76 | + Crypto Express3 Coprocessor (CEX3C) |
78 | + Crypto Express3 Accelerator (CEX3A) | 77 | + Crypto Express3 Accelerator (CEX3A) |
79 | 78 | ||
80 | config ZCRYPT_MONOLITHIC | ||
81 | bool "Monolithic zcrypt module" | ||
82 | depends on ZCRYPT | ||
83 | help | ||
84 | Select this option if you want to have a single module z90crypt, | ||
85 | that contains all parts of the crypto device driver (ap bus, | ||
86 | request router and all the card drivers). | ||
87 | |||
88 | config CRYPTO_SHA1_S390 | 79 | config CRYPTO_SHA1_S390 |
89 | tristate "SHA1 digest algorithm" | 80 | tristate "SHA1 digest algorithm" |
90 | depends on S390 | 81 | depends on S390 |
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 110137e7ec81..f3509120a507 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
@@ -640,6 +640,10 @@ void dasd_enable_device(struct dasd_device *device) | |||
640 | dasd_set_target_state(device, DASD_STATE_NEW); | 640 | dasd_set_target_state(device, DASD_STATE_NEW); |
641 | /* Now wait for the devices to come up. */ | 641 | /* Now wait for the devices to come up. */ |
642 | wait_event(dasd_init_waitq, _wait_for_device(device)); | 642 | wait_event(dasd_init_waitq, _wait_for_device(device)); |
643 | |||
644 | dasd_reload_device(device); | ||
645 | if (device->discipline->kick_validate) | ||
646 | device->discipline->kick_validate(device); | ||
643 | } | 647 | } |
644 | 648 | ||
645 | /* | 649 | /* |
diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c index 46784b83c5c4..0cea7e98f464 100644 --- a/drivers/s390/block/dasd_diag.c +++ b/drivers/s390/block/dasd_diag.c | |||
@@ -229,7 +229,7 @@ dasd_diag_term_IO(struct dasd_ccw_req * cqr) | |||
229 | } | 229 | } |
230 | 230 | ||
231 | /* Handle external interruption. */ | 231 | /* Handle external interruption. */ |
232 | static void dasd_ext_handler(unsigned int ext_int_code, | 232 | static void dasd_ext_handler(struct ext_code ext_code, |
233 | unsigned int param32, unsigned long param64) | 233 | unsigned int param32, unsigned long param64) |
234 | { | 234 | { |
235 | struct dasd_ccw_req *cqr, *next; | 235 | struct dasd_ccw_req *cqr, *next; |
@@ -239,7 +239,7 @@ static void dasd_ext_handler(unsigned int ext_int_code, | |||
239 | addr_t ip; | 239 | addr_t ip; |
240 | int rc; | 240 | int rc; |
241 | 241 | ||
242 | switch (ext_int_code >> 24) { | 242 | switch (ext_code.subcode >> 8) { |
243 | case DASD_DIAG_CODE_31BIT: | 243 | case DASD_DIAG_CODE_31BIT: |
244 | ip = (addr_t) param32; | 244 | ip = (addr_t) param32; |
245 | break; | 245 | break; |
@@ -280,7 +280,7 @@ static void dasd_ext_handler(unsigned int ext_int_code, | |||
280 | cqr->stopclk = get_clock(); | 280 | cqr->stopclk = get_clock(); |
281 | 281 | ||
282 | expires = 0; | 282 | expires = 0; |
283 | if ((ext_int_code & 0xff0000) == 0) { | 283 | if ((ext_code.subcode & 0xff) == 0) { |
284 | cqr->status = DASD_CQR_SUCCESS; | 284 | cqr->status = DASD_CQR_SUCCESS; |
285 | /* Start first request on queue if possible -> fast_io. */ | 285 | /* Start first request on queue if possible -> fast_io. */ |
286 | if (!list_empty(&device->ccw_queue)) { | 286 | if (!list_empty(&device->ccw_queue)) { |
@@ -296,7 +296,7 @@ static void dasd_ext_handler(unsigned int ext_int_code, | |||
296 | cqr->status = DASD_CQR_QUEUED; | 296 | cqr->status = DASD_CQR_QUEUED; |
297 | DBF_DEV_EVENT(DBF_DEBUG, device, "interrupt status for " | 297 | DBF_DEV_EVENT(DBF_DEBUG, device, "interrupt status for " |
298 | "request %p was %d (%d retries left)", cqr, | 298 | "request %p was %d (%d retries left)", cqr, |
299 | (ext_int_code >> 16) & 0xff, cqr->retries); | 299 | ext_code.subcode & 0xff, cqr->retries); |
300 | dasd_diag_erp(device); | 300 | dasd_diag_erp(device); |
301 | } | 301 | } |
302 | 302 | ||
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 2617b1ed4709..c21871a4e73d 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
@@ -1564,6 +1564,12 @@ static void dasd_eckd_do_validate_server(struct work_struct *work) | |||
1564 | static void dasd_eckd_kick_validate_server(struct dasd_device *device) | 1564 | static void dasd_eckd_kick_validate_server(struct dasd_device *device) |
1565 | { | 1565 | { |
1566 | dasd_get_device(device); | 1566 | dasd_get_device(device); |
1567 | /* exit if device not online or in offline processing */ | ||
1568 | if (test_bit(DASD_FLAG_OFFLINE, &device->flags) || | ||
1569 | device->state < DASD_STATE_ONLINE) { | ||
1570 | dasd_put_device(device); | ||
1571 | return; | ||
1572 | } | ||
1567 | /* queue call to do_validate_server to the kernel event daemon. */ | 1573 | /* queue call to do_validate_server to the kernel event daemon. */ |
1568 | schedule_work(&device->kick_validate); | 1574 | schedule_work(&device->kick_validate); |
1569 | } | 1575 | } |
@@ -1993,6 +1999,7 @@ static int dasd_eckd_ready_to_online(struct dasd_device *device) | |||
1993 | static int dasd_eckd_online_to_ready(struct dasd_device *device) | 1999 | static int dasd_eckd_online_to_ready(struct dasd_device *device) |
1994 | { | 2000 | { |
1995 | cancel_work_sync(&device->reload_device); | 2001 | cancel_work_sync(&device->reload_device); |
2002 | cancel_work_sync(&device->kick_validate); | ||
1996 | return dasd_alias_remove_device(device); | 2003 | return dasd_alias_remove_device(device); |
1997 | }; | 2004 | }; |
1998 | 2005 | ||
@@ -2263,6 +2270,7 @@ static void dasd_eckd_check_for_device_change(struct dasd_device *device, | |||
2263 | * and only if not suspended | 2270 | * and only if not suspended |
2264 | */ | 2271 | */ |
2265 | if (!device->block && private->lcu && | 2272 | if (!device->block && private->lcu && |
2273 | device->state == DASD_STATE_ONLINE && | ||
2266 | !test_bit(DASD_FLAG_OFFLINE, &device->flags) && | 2274 | !test_bit(DASD_FLAG_OFFLINE, &device->flags) && |
2267 | !test_bit(DASD_FLAG_SUSPENDED, &device->flags)) { | 2275 | !test_bit(DASD_FLAG_SUSPENDED, &device->flags)) { |
2268 | /* | 2276 | /* |
diff --git a/drivers/s390/char/sclp.c b/drivers/s390/char/sclp.c index eaa7e78186f9..30f29a0020a1 100644 --- a/drivers/s390/char/sclp.c +++ b/drivers/s390/char/sclp.c | |||
@@ -393,7 +393,7 @@ __sclp_find_req(u32 sccb) | |||
393 | /* Handler for external interruption. Perform request post-processing. | 393 | /* Handler for external interruption. Perform request post-processing. |
394 | * Prepare read event data request if necessary. Start processing of next | 394 | * Prepare read event data request if necessary. Start processing of next |
395 | * request on queue. */ | 395 | * request on queue. */ |
396 | static void sclp_interrupt_handler(unsigned int ext_int_code, | 396 | static void sclp_interrupt_handler(struct ext_code ext_code, |
397 | unsigned int param32, unsigned long param64) | 397 | unsigned int param32, unsigned long param64) |
398 | { | 398 | { |
399 | struct sclp_req *req; | 399 | struct sclp_req *req; |
@@ -818,7 +818,7 @@ EXPORT_SYMBOL(sclp_reactivate); | |||
818 | 818 | ||
819 | /* Handler for external interruption used during initialization. Modify | 819 | /* Handler for external interruption used during initialization. Modify |
820 | * request state to done. */ | 820 | * request state to done. */ |
821 | static void sclp_check_handler(unsigned int ext_int_code, | 821 | static void sclp_check_handler(struct ext_code ext_code, |
822 | unsigned int param32, unsigned long param64) | 822 | unsigned int param32, unsigned long param64) |
823 | { | 823 | { |
824 | u32 finished_sccb; | 824 | u32 finished_sccb; |
diff --git a/drivers/s390/char/sclp_quiesce.c b/drivers/s390/char/sclp_quiesce.c index 87fc0ac11e67..69df137310bc 100644 --- a/drivers/s390/char/sclp_quiesce.c +++ b/drivers/s390/char/sclp_quiesce.c | |||
@@ -15,7 +15,6 @@ | |||
15 | #include <linux/reboot.h> | 15 | #include <linux/reboot.h> |
16 | #include <linux/atomic.h> | 16 | #include <linux/atomic.h> |
17 | #include <asm/ptrace.h> | 17 | #include <asm/ptrace.h> |
18 | #include <asm/sigp.h> | ||
19 | #include <asm/smp.h> | 18 | #include <asm/smp.h> |
20 | 19 | ||
21 | #include "sclp.h" | 20 | #include "sclp.h" |
diff --git a/drivers/s390/char/sclp_sdias.c b/drivers/s390/char/sclp_sdias.c index fa733ecd3d70..69e6c50d4cfb 100644 --- a/drivers/s390/char/sclp_sdias.c +++ b/drivers/s390/char/sclp_sdias.c | |||
@@ -8,6 +8,7 @@ | |||
8 | #define KMSG_COMPONENT "sclp_sdias" | 8 | #define KMSG_COMPONENT "sclp_sdias" |
9 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | 9 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt |
10 | 10 | ||
11 | #include <linux/completion.h> | ||
11 | #include <linux/sched.h> | 12 | #include <linux/sched.h> |
12 | #include <asm/sclp.h> | 13 | #include <asm/sclp.h> |
13 | #include <asm/debug.h> | 14 | #include <asm/debug.h> |
@@ -62,15 +63,29 @@ struct sdias_sccb { | |||
62 | } __attribute__((packed)); | 63 | } __attribute__((packed)); |
63 | 64 | ||
64 | static struct sdias_sccb sccb __attribute__((aligned(4096))); | 65 | static struct sdias_sccb sccb __attribute__((aligned(4096))); |
66 | static struct sdias_evbuf sdias_evbuf; | ||
65 | 67 | ||
66 | static int sclp_req_done; | 68 | static DECLARE_COMPLETION(evbuf_accepted); |
67 | static wait_queue_head_t sdias_wq; | 69 | static DECLARE_COMPLETION(evbuf_done); |
68 | static DEFINE_MUTEX(sdias_mutex); | 70 | static DEFINE_MUTEX(sdias_mutex); |
69 | 71 | ||
72 | /* | ||
73 | * Called by SCLP base when read event data has been completed (async mode only) | ||
74 | */ | ||
75 | static void sclp_sdias_receiver_fn(struct evbuf_header *evbuf) | ||
76 | { | ||
77 | memcpy(&sdias_evbuf, evbuf, | ||
78 | min_t(unsigned long, sizeof(sdias_evbuf), evbuf->length)); | ||
79 | complete(&evbuf_done); | ||
80 | TRACE("sclp_sdias_receiver_fn done\n"); | ||
81 | } | ||
82 | |||
83 | /* | ||
84 | * Called by SCLP base when sdias event has been accepted | ||
85 | */ | ||
70 | static void sdias_callback(struct sclp_req *request, void *data) | 86 | static void sdias_callback(struct sclp_req *request, void *data) |
71 | { | 87 | { |
72 | sclp_req_done = 1; | 88 | complete(&evbuf_accepted); |
73 | wake_up(&sdias_wq); /* Inform caller, that request is complete */ | ||
74 | TRACE("callback done\n"); | 89 | TRACE("callback done\n"); |
75 | } | 90 | } |
76 | 91 | ||
@@ -80,7 +95,6 @@ static int sdias_sclp_send(struct sclp_req *req) | |||
80 | int rc; | 95 | int rc; |
81 | 96 | ||
82 | for (retries = SDIAS_RETRIES; retries; retries--) { | 97 | for (retries = SDIAS_RETRIES; retries; retries--) { |
83 | sclp_req_done = 0; | ||
84 | TRACE("add request\n"); | 98 | TRACE("add request\n"); |
85 | rc = sclp_add_request(req); | 99 | rc = sclp_add_request(req); |
86 | if (rc) { | 100 | if (rc) { |
@@ -91,16 +105,31 @@ static int sdias_sclp_send(struct sclp_req *req) | |||
91 | continue; | 105 | continue; |
92 | } | 106 | } |
93 | /* initiated, wait for completion of service call */ | 107 | /* initiated, wait for completion of service call */ |
94 | wait_event(sdias_wq, (sclp_req_done == 1)); | 108 | wait_for_completion(&evbuf_accepted); |
95 | if (req->status == SCLP_REQ_FAILED) { | 109 | if (req->status == SCLP_REQ_FAILED) { |
96 | TRACE("sclp request failed\n"); | 110 | TRACE("sclp request failed\n"); |
97 | rc = -EIO; | ||
98 | continue; | 111 | continue; |
99 | } | 112 | } |
113 | /* if not accepted, retry */ | ||
114 | if (!(sccb.evbuf.hdr.flags & 0x80)) { | ||
115 | TRACE("sclp request failed: flags=%x\n", | ||
116 | sccb.evbuf.hdr.flags); | ||
117 | continue; | ||
118 | } | ||
119 | /* | ||
120 | * for the sync interface the response is in the initial sccb | ||
121 | */ | ||
122 | if (!sclp_sdias_register.receiver_fn) { | ||
123 | memcpy(&sdias_evbuf, &sccb.evbuf, sizeof(sdias_evbuf)); | ||
124 | TRACE("sync request done\n"); | ||
125 | return 0; | ||
126 | } | ||
127 | /* otherwise we wait for completion */ | ||
128 | wait_for_completion(&evbuf_done); | ||
100 | TRACE("request done\n"); | 129 | TRACE("request done\n"); |
101 | break; | 130 | return 0; |
102 | } | 131 | } |
103 | return rc; | 132 | return -EIO; |
104 | } | 133 | } |
105 | 134 | ||
106 | /* | 135 | /* |
@@ -140,13 +169,12 @@ int sclp_sdias_blk_count(void) | |||
140 | goto out; | 169 | goto out; |
141 | } | 170 | } |
142 | 171 | ||
143 | switch (sccb.evbuf.event_status) { | 172 | switch (sdias_evbuf.event_status) { |
144 | case 0: | 173 | case 0: |
145 | rc = sccb.evbuf.blk_cnt; | 174 | rc = sdias_evbuf.blk_cnt; |
146 | break; | 175 | break; |
147 | default: | 176 | default: |
148 | pr_err("SCLP error: %x\n", | 177 | pr_err("SCLP error: %x\n", sdias_evbuf.event_status); |
149 | sccb.evbuf.event_status); | ||
150 | rc = -EIO; | 178 | rc = -EIO; |
151 | goto out; | 179 | goto out; |
152 | } | 180 | } |
@@ -211,18 +239,18 @@ int sclp_sdias_copy(void *dest, int start_blk, int nr_blks) | |||
211 | goto out; | 239 | goto out; |
212 | } | 240 | } |
213 | 241 | ||
214 | switch (sccb.evbuf.event_status) { | 242 | switch (sdias_evbuf.event_status) { |
215 | case EVSTATE_ALL_STORED: | 243 | case EVSTATE_ALL_STORED: |
216 | TRACE("all stored\n"); | 244 | TRACE("all stored\n"); |
217 | case EVSTATE_PART_STORED: | 245 | case EVSTATE_PART_STORED: |
218 | TRACE("part stored: %i\n", sccb.evbuf.blk_cnt); | 246 | TRACE("part stored: %i\n", sdias_evbuf.blk_cnt); |
219 | break; | 247 | break; |
220 | case EVSTATE_NO_DATA: | 248 | case EVSTATE_NO_DATA: |
221 | TRACE("no data\n"); | 249 | TRACE("no data\n"); |
222 | default: | 250 | default: |
223 | pr_err("Error from SCLP while copying hsa. " | 251 | pr_err("Error from SCLP while copying hsa. " |
224 | "Event status = %x\n", | 252 | "Event status = %x\n", |
225 | sccb.evbuf.event_status); | 253 | sdias_evbuf.event_status); |
226 | rc = -EIO; | 254 | rc = -EIO; |
227 | } | 255 | } |
228 | out: | 256 | out: |
@@ -230,19 +258,50 @@ out: | |||
230 | return rc; | 258 | return rc; |
231 | } | 259 | } |
232 | 260 | ||
233 | int __init sclp_sdias_init(void) | 261 | static int __init sclp_sdias_register_check(void) |
234 | { | 262 | { |
235 | int rc; | 263 | int rc; |
236 | 264 | ||
265 | rc = sclp_register(&sclp_sdias_register); | ||
266 | if (rc) | ||
267 | return rc; | ||
268 | if (sclp_sdias_blk_count() == 0) { | ||
269 | sclp_unregister(&sclp_sdias_register); | ||
270 | return -ENODEV; | ||
271 | } | ||
272 | return 0; | ||
273 | } | ||
274 | |||
275 | static int __init sclp_sdias_init_sync(void) | ||
276 | { | ||
277 | TRACE("Try synchronous mode\n"); | ||
278 | sclp_sdias_register.receive_mask = 0; | ||
279 | sclp_sdias_register.receiver_fn = NULL; | ||
280 | return sclp_sdias_register_check(); | ||
281 | } | ||
282 | |||
283 | static int __init sclp_sdias_init_async(void) | ||
284 | { | ||
285 | TRACE("Try asynchronous mode\n"); | ||
286 | sclp_sdias_register.receive_mask = EVTYP_SDIAS_MASK; | ||
287 | sclp_sdias_register.receiver_fn = sclp_sdias_receiver_fn; | ||
288 | return sclp_sdias_register_check(); | ||
289 | } | ||
290 | |||
291 | int __init sclp_sdias_init(void) | ||
292 | { | ||
237 | if (ipl_info.type != IPL_TYPE_FCP_DUMP) | 293 | if (ipl_info.type != IPL_TYPE_FCP_DUMP) |
238 | return 0; | 294 | return 0; |
239 | sdias_dbf = debug_register("dump_sdias", 4, 1, 4 * sizeof(long)); | 295 | sdias_dbf = debug_register("dump_sdias", 4, 1, 4 * sizeof(long)); |
240 | debug_register_view(sdias_dbf, &debug_sprintf_view); | 296 | debug_register_view(sdias_dbf, &debug_sprintf_view); |
241 | debug_set_level(sdias_dbf, 6); | 297 | debug_set_level(sdias_dbf, 6); |
242 | rc = sclp_register(&sclp_sdias_register); | 298 | if (sclp_sdias_init_sync() == 0) |
243 | if (rc) | 299 | goto out; |
244 | return rc; | 300 | if (sclp_sdias_init_async() == 0) |
245 | init_waitqueue_head(&sdias_wq); | 301 | goto out; |
302 | TRACE("init failed\n"); | ||
303 | return -ENODEV; | ||
304 | out: | ||
246 | TRACE("init done\n"); | 305 | TRACE("init done\n"); |
247 | return 0; | 306 | return 0; |
248 | } | 307 | } |
diff --git a/drivers/s390/char/zcore.c b/drivers/s390/char/zcore.c index 1b6d9247fdc7..3303d66b2794 100644 --- a/drivers/s390/char/zcore.c +++ b/drivers/s390/char/zcore.c | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <asm/ipl.h> | 21 | #include <asm/ipl.h> |
22 | #include <asm/sclp.h> | 22 | #include <asm/sclp.h> |
23 | #include <asm/setup.h> | 23 | #include <asm/setup.h> |
24 | #include <asm/sigp.h> | ||
25 | #include <asm/uaccess.h> | 24 | #include <asm/uaccess.h> |
26 | #include <asm/debug.h> | 25 | #include <asm/debug.h> |
27 | #include <asm/processor.h> | 26 | #include <asm/processor.h> |
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index dc67c397449e..a49c46c91983 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -601,8 +601,6 @@ void __irq_entry do_IRQ(struct pt_regs *regs) | |||
601 | struct pt_regs *old_regs; | 601 | struct pt_regs *old_regs; |
602 | 602 | ||
603 | old_regs = set_irq_regs(regs); | 603 | old_regs = set_irq_regs(regs); |
604 | s390_idle_check(regs, S390_lowcore.int_clock, | ||
605 | S390_lowcore.async_enter_timer); | ||
606 | irq_enter(); | 604 | irq_enter(); |
607 | __this_cpu_write(s390_idle.nohz_delay, 1); | 605 | __this_cpu_write(s390_idle.nohz_delay, 1); |
608 | if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator) | 606 | if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator) |
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c index 770a740a393c..2a0dfcb0bc42 100644 --- a/drivers/s390/cio/qdio_main.c +++ b/drivers/s390/cio/qdio_main.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/atomic.h> | 18 | #include <linux/atomic.h> |
19 | #include <asm/debug.h> | 19 | #include <asm/debug.h> |
20 | #include <asm/qdio.h> | 20 | #include <asm/qdio.h> |
21 | #include <asm/ipl.h> | ||
21 | 22 | ||
22 | #include "cio.h" | 23 | #include "cio.h" |
23 | #include "css.h" | 24 | #include "css.h" |
@@ -1093,6 +1094,11 @@ static void qdio_handle_activate_check(struct ccw_device *cdev, | |||
1093 | q->nr, q->first_to_kick, count, irq_ptr->int_parm); | 1094 | q->nr, q->first_to_kick, count, irq_ptr->int_parm); |
1094 | no_handler: | 1095 | no_handler: |
1095 | qdio_set_state(irq_ptr, QDIO_IRQ_STATE_STOPPED); | 1096 | qdio_set_state(irq_ptr, QDIO_IRQ_STATE_STOPPED); |
1097 | /* | ||
1098 | * In case of z/VM LGR (Live Guest Migration) QDIO recovery will happen. | ||
1099 | * Therefore we call the LGR detection function here. | ||
1100 | */ | ||
1101 | lgr_info_log(); | ||
1096 | } | 1102 | } |
1097 | 1103 | ||
1098 | static void qdio_establish_handle_irq(struct ccw_device *cdev, int cstat, | 1104 | static void qdio_establish_handle_irq(struct ccw_device *cdev, int cstat, |
diff --git a/drivers/s390/crypto/Makefile b/drivers/s390/crypto/Makefile index f0a12d2eb780..af3c7f16ea88 100644 --- a/drivers/s390/crypto/Makefile +++ b/drivers/s390/crypto/Makefile | |||
@@ -2,16 +2,6 @@ | |||
2 | # S/390 crypto devices | 2 | # S/390 crypto devices |
3 | # | 3 | # |
4 | 4 | ||
5 | ifdef CONFIG_ZCRYPT_MONOLITHIC | ||
6 | |||
7 | z90crypt-objs := zcrypt_mono.o ap_bus.o zcrypt_api.o \ | ||
8 | zcrypt_pcica.o zcrypt_pcicc.o zcrypt_pcixcc.o zcrypt_cex2a.o | ||
9 | obj-$(CONFIG_ZCRYPT) += z90crypt.o | ||
10 | |||
11 | else | ||
12 | |||
13 | ap-objs := ap_bus.o | 5 | ap-objs := ap_bus.o |
14 | obj-$(CONFIG_ZCRYPT) += ap.o zcrypt_api.o zcrypt_pcicc.o zcrypt_pcixcc.o | 6 | obj-$(CONFIG_ZCRYPT) += ap.o zcrypt_api.o zcrypt_pcicc.o zcrypt_pcixcc.o |
15 | obj-$(CONFIG_ZCRYPT) += zcrypt_pcica.o zcrypt_cex2a.o | 7 | obj-$(CONFIG_ZCRYPT) += zcrypt_pcica.o zcrypt_cex2a.o |
16 | |||
17 | endif | ||
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index 96bbe9d12a79..12ae1817b172 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c | |||
@@ -1862,7 +1862,5 @@ void ap_module_exit(void) | |||
1862 | } | 1862 | } |
1863 | } | 1863 | } |
1864 | 1864 | ||
1865 | #ifndef CONFIG_ZCRYPT_MONOLITHIC | ||
1866 | module_init(ap_module_init); | 1865 | module_init(ap_module_init); |
1867 | module_exit(ap_module_exit); | 1866 | module_exit(ap_module_exit); |
1868 | #endif | ||
diff --git a/drivers/s390/crypto/zcrypt_api.c b/drivers/s390/crypto/zcrypt_api.c index 88ad33ed5d38..88523208d47d 100644 --- a/drivers/s390/crypto/zcrypt_api.c +++ b/drivers/s390/crypto/zcrypt_api.c | |||
@@ -1220,7 +1220,5 @@ void zcrypt_api_exit(void) | |||
1220 | misc_deregister(&zcrypt_misc_device); | 1220 | misc_deregister(&zcrypt_misc_device); |
1221 | } | 1221 | } |
1222 | 1222 | ||
1223 | #ifndef CONFIG_ZCRYPT_MONOLITHIC | ||
1224 | module_init(zcrypt_api_init); | 1223 | module_init(zcrypt_api_init); |
1225 | module_exit(zcrypt_api_exit); | 1224 | module_exit(zcrypt_api_exit); |
1226 | #endif | ||
diff --git a/drivers/s390/crypto/zcrypt_cex2a.c b/drivers/s390/crypto/zcrypt_cex2a.c index da171b5f3996..084286728166 100644 --- a/drivers/s390/crypto/zcrypt_cex2a.c +++ b/drivers/s390/crypto/zcrypt_cex2a.c | |||
@@ -63,13 +63,11 @@ static struct ap_device_id zcrypt_cex2a_ids[] = { | |||
63 | { /* end of list */ }, | 63 | { /* end of list */ }, |
64 | }; | 64 | }; |
65 | 65 | ||
66 | #ifndef CONFIG_ZCRYPT_MONOLITHIC | ||
67 | MODULE_DEVICE_TABLE(ap, zcrypt_cex2a_ids); | 66 | MODULE_DEVICE_TABLE(ap, zcrypt_cex2a_ids); |
68 | MODULE_AUTHOR("IBM Corporation"); | 67 | MODULE_AUTHOR("IBM Corporation"); |
69 | MODULE_DESCRIPTION("CEX2A Cryptographic Coprocessor device driver, " | 68 | MODULE_DESCRIPTION("CEX2A Cryptographic Coprocessor device driver, " |
70 | "Copyright 2001, 2006 IBM Corporation"); | 69 | "Copyright 2001, 2006 IBM Corporation"); |
71 | MODULE_LICENSE("GPL"); | 70 | MODULE_LICENSE("GPL"); |
72 | #endif | ||
73 | 71 | ||
74 | static int zcrypt_cex2a_probe(struct ap_device *ap_dev); | 72 | static int zcrypt_cex2a_probe(struct ap_device *ap_dev); |
75 | static void zcrypt_cex2a_remove(struct ap_device *ap_dev); | 73 | static void zcrypt_cex2a_remove(struct ap_device *ap_dev); |
@@ -496,7 +494,5 @@ void __exit zcrypt_cex2a_exit(void) | |||
496 | ap_driver_unregister(&zcrypt_cex2a_driver); | 494 | ap_driver_unregister(&zcrypt_cex2a_driver); |
497 | } | 495 | } |
498 | 496 | ||
499 | #ifndef CONFIG_ZCRYPT_MONOLITHIC | ||
500 | module_init(zcrypt_cex2a_init); | 497 | module_init(zcrypt_cex2a_init); |
501 | module_exit(zcrypt_cex2a_exit); | 498 | module_exit(zcrypt_cex2a_exit); |
502 | #endif | ||
diff --git a/drivers/s390/crypto/zcrypt_mono.c b/drivers/s390/crypto/zcrypt_mono.c deleted file mode 100644 index eb313c3fb2d1..000000000000 --- a/drivers/s390/crypto/zcrypt_mono.c +++ /dev/null | |||
@@ -1,100 +0,0 @@ | |||
1 | /* | ||
2 | * linux/drivers/s390/crypto/zcrypt_mono.c | ||
3 | * | ||
4 | * zcrypt 2.1.0 | ||
5 | * | ||
6 | * Copyright (C) 2001, 2006 IBM Corporation | ||
7 | * Author(s): Robert Burroughs | ||
8 | * Eric Rossman (edrossma@us.ibm.com) | ||
9 | * | ||
10 | * Hotplug & misc device support: Jochen Roehrig (roehrig@de.ibm.com) | ||
11 | * Major cleanup & driver split: Martin Schwidefsky <schwidefsky@de.ibm.com> | ||
12 | * | ||
13 | * This program is free software; you can redistribute it and/or modify | ||
14 | * it under the terms of the GNU General Public License as published by | ||
15 | * the Free Software Foundation; either version 2, or (at your option) | ||
16 | * any later version. | ||
17 | * | ||
18 | * This program is distributed in the hope that it will be useful, | ||
19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
21 | * GNU General Public License for more details. | ||
22 | * | ||
23 | * You should have received a copy of the GNU General Public License | ||
24 | * along with this program; if not, write to the Free Software | ||
25 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
26 | */ | ||
27 | |||
28 | #include <linux/module.h> | ||
29 | #include <linux/init.h> | ||
30 | #include <linux/interrupt.h> | ||
31 | #include <linux/miscdevice.h> | ||
32 | #include <linux/fs.h> | ||
33 | #include <linux/proc_fs.h> | ||
34 | #include <linux/compat.h> | ||
35 | #include <linux/atomic.h> | ||
36 | #include <asm/uaccess.h> | ||
37 | |||
38 | #include "ap_bus.h" | ||
39 | #include "zcrypt_api.h" | ||
40 | #include "zcrypt_pcica.h" | ||
41 | #include "zcrypt_pcicc.h" | ||
42 | #include "zcrypt_pcixcc.h" | ||
43 | #include "zcrypt_cex2a.h" | ||
44 | |||
45 | /** | ||
46 | * The module initialization code. | ||
47 | */ | ||
48 | static int __init zcrypt_init(void) | ||
49 | { | ||
50 | int rc; | ||
51 | |||
52 | rc = ap_module_init(); | ||
53 | if (rc) | ||
54 | goto out; | ||
55 | rc = zcrypt_api_init(); | ||
56 | if (rc) | ||
57 | goto out_ap; | ||
58 | rc = zcrypt_pcica_init(); | ||
59 | if (rc) | ||
60 | goto out_api; | ||
61 | rc = zcrypt_pcicc_init(); | ||
62 | if (rc) | ||
63 | goto out_pcica; | ||
64 | rc = zcrypt_pcixcc_init(); | ||
65 | if (rc) | ||
66 | goto out_pcicc; | ||
67 | rc = zcrypt_cex2a_init(); | ||
68 | if (rc) | ||
69 | goto out_pcixcc; | ||
70 | return 0; | ||
71 | |||
72 | out_pcixcc: | ||
73 | zcrypt_pcixcc_exit(); | ||
74 | out_pcicc: | ||
75 | zcrypt_pcicc_exit(); | ||
76 | out_pcica: | ||
77 | zcrypt_pcica_exit(); | ||
78 | out_api: | ||
79 | zcrypt_api_exit(); | ||
80 | out_ap: | ||
81 | ap_module_exit(); | ||
82 | out: | ||
83 | return rc; | ||
84 | } | ||
85 | |||
86 | /** | ||
87 | * The module termination code. | ||
88 | */ | ||
89 | static void __exit zcrypt_exit(void) | ||
90 | { | ||
91 | zcrypt_cex2a_exit(); | ||
92 | zcrypt_pcixcc_exit(); | ||
93 | zcrypt_pcicc_exit(); | ||
94 | zcrypt_pcica_exit(); | ||
95 | zcrypt_api_exit(); | ||
96 | ap_module_exit(); | ||
97 | } | ||
98 | |||
99 | module_init(zcrypt_init); | ||
100 | module_exit(zcrypt_exit); | ||
diff --git a/drivers/s390/crypto/zcrypt_pcica.c b/drivers/s390/crypto/zcrypt_pcica.c index d84816f144df..0effca925451 100644 --- a/drivers/s390/crypto/zcrypt_pcica.c +++ b/drivers/s390/crypto/zcrypt_pcica.c | |||
@@ -53,13 +53,11 @@ static struct ap_device_id zcrypt_pcica_ids[] = { | |||
53 | { /* end of list */ }, | 53 | { /* end of list */ }, |
54 | }; | 54 | }; |
55 | 55 | ||
56 | #ifndef CONFIG_ZCRYPT_MONOLITHIC | ||
57 | MODULE_DEVICE_TABLE(ap, zcrypt_pcica_ids); | 56 | MODULE_DEVICE_TABLE(ap, zcrypt_pcica_ids); |
58 | MODULE_AUTHOR("IBM Corporation"); | 57 | MODULE_AUTHOR("IBM Corporation"); |
59 | MODULE_DESCRIPTION("PCICA Cryptographic Coprocessor device driver, " | 58 | MODULE_DESCRIPTION("PCICA Cryptographic Coprocessor device driver, " |
60 | "Copyright 2001, 2006 IBM Corporation"); | 59 | "Copyright 2001, 2006 IBM Corporation"); |
61 | MODULE_LICENSE("GPL"); | 60 | MODULE_LICENSE("GPL"); |
62 | #endif | ||
63 | 61 | ||
64 | static int zcrypt_pcica_probe(struct ap_device *ap_dev); | 62 | static int zcrypt_pcica_probe(struct ap_device *ap_dev); |
65 | static void zcrypt_pcica_remove(struct ap_device *ap_dev); | 63 | static void zcrypt_pcica_remove(struct ap_device *ap_dev); |
@@ -408,7 +406,5 @@ void zcrypt_pcica_exit(void) | |||
408 | ap_driver_unregister(&zcrypt_pcica_driver); | 406 | ap_driver_unregister(&zcrypt_pcica_driver); |
409 | } | 407 | } |
410 | 408 | ||
411 | #ifndef CONFIG_ZCRYPT_MONOLITHIC | ||
412 | module_init(zcrypt_pcica_init); | 409 | module_init(zcrypt_pcica_init); |
413 | module_exit(zcrypt_pcica_exit); | 410 | module_exit(zcrypt_pcica_exit); |
414 | #endif | ||
diff --git a/drivers/s390/crypto/zcrypt_pcicc.c b/drivers/s390/crypto/zcrypt_pcicc.c index bdbdbe192993..f9523c0cc8d2 100644 --- a/drivers/s390/crypto/zcrypt_pcicc.c +++ b/drivers/s390/crypto/zcrypt_pcicc.c | |||
@@ -65,13 +65,11 @@ static struct ap_device_id zcrypt_pcicc_ids[] = { | |||
65 | { /* end of list */ }, | 65 | { /* end of list */ }, |
66 | }; | 66 | }; |
67 | 67 | ||
68 | #ifndef CONFIG_ZCRYPT_MONOLITHIC | ||
69 | MODULE_DEVICE_TABLE(ap, zcrypt_pcicc_ids); | 68 | MODULE_DEVICE_TABLE(ap, zcrypt_pcicc_ids); |
70 | MODULE_AUTHOR("IBM Corporation"); | 69 | MODULE_AUTHOR("IBM Corporation"); |
71 | MODULE_DESCRIPTION("PCICC Cryptographic Coprocessor device driver, " | 70 | MODULE_DESCRIPTION("PCICC Cryptographic Coprocessor device driver, " |
72 | "Copyright 2001, 2006 IBM Corporation"); | 71 | "Copyright 2001, 2006 IBM Corporation"); |
73 | MODULE_LICENSE("GPL"); | 72 | MODULE_LICENSE("GPL"); |
74 | #endif | ||
75 | 73 | ||
76 | static int zcrypt_pcicc_probe(struct ap_device *ap_dev); | 74 | static int zcrypt_pcicc_probe(struct ap_device *ap_dev); |
77 | static void zcrypt_pcicc_remove(struct ap_device *ap_dev); | 75 | static void zcrypt_pcicc_remove(struct ap_device *ap_dev); |
@@ -614,7 +612,5 @@ void zcrypt_pcicc_exit(void) | |||
614 | ap_driver_unregister(&zcrypt_pcicc_driver); | 612 | ap_driver_unregister(&zcrypt_pcicc_driver); |
615 | } | 613 | } |
616 | 614 | ||
617 | #ifndef CONFIG_ZCRYPT_MONOLITHIC | ||
618 | module_init(zcrypt_pcicc_init); | 615 | module_init(zcrypt_pcicc_init); |
619 | module_exit(zcrypt_pcicc_exit); | 616 | module_exit(zcrypt_pcicc_exit); |
620 | #endif | ||
diff --git a/drivers/s390/crypto/zcrypt_pcixcc.c b/drivers/s390/crypto/zcrypt_pcixcc.c index 077b7d109fde..cf1cbd4747f4 100644 --- a/drivers/s390/crypto/zcrypt_pcixcc.c +++ b/drivers/s390/crypto/zcrypt_pcixcc.c | |||
@@ -75,13 +75,11 @@ static struct ap_device_id zcrypt_pcixcc_ids[] = { | |||
75 | { /* end of list */ }, | 75 | { /* end of list */ }, |
76 | }; | 76 | }; |
77 | 77 | ||
78 | #ifndef CONFIG_ZCRYPT_MONOLITHIC | ||
79 | MODULE_DEVICE_TABLE(ap, zcrypt_pcixcc_ids); | 78 | MODULE_DEVICE_TABLE(ap, zcrypt_pcixcc_ids); |
80 | MODULE_AUTHOR("IBM Corporation"); | 79 | MODULE_AUTHOR("IBM Corporation"); |
81 | MODULE_DESCRIPTION("PCIXCC Cryptographic Coprocessor device driver, " | 80 | MODULE_DESCRIPTION("PCIXCC Cryptographic Coprocessor device driver, " |
82 | "Copyright 2001, 2006 IBM Corporation"); | 81 | "Copyright 2001, 2006 IBM Corporation"); |
83 | MODULE_LICENSE("GPL"); | 82 | MODULE_LICENSE("GPL"); |
84 | #endif | ||
85 | 83 | ||
86 | static int zcrypt_pcixcc_probe(struct ap_device *ap_dev); | 84 | static int zcrypt_pcixcc_probe(struct ap_device *ap_dev); |
87 | static void zcrypt_pcixcc_remove(struct ap_device *ap_dev); | 85 | static void zcrypt_pcixcc_remove(struct ap_device *ap_dev); |
@@ -1121,7 +1119,5 @@ void zcrypt_pcixcc_exit(void) | |||
1121 | ap_driver_unregister(&zcrypt_pcixcc_driver); | 1119 | ap_driver_unregister(&zcrypt_pcixcc_driver); |
1122 | } | 1120 | } |
1123 | 1121 | ||
1124 | #ifndef CONFIG_ZCRYPT_MONOLITHIC | ||
1125 | module_init(zcrypt_pcixcc_init); | 1122 | module_init(zcrypt_pcixcc_init); |
1126 | module_exit(zcrypt_pcixcc_exit); | 1123 | module_exit(zcrypt_pcixcc_exit); |
1127 | #endif | ||
diff --git a/drivers/s390/kvm/kvm_virtio.c b/drivers/s390/kvm/kvm_virtio.c index 7bc1955337ea..d74e9ae6dfb3 100644 --- a/drivers/s390/kvm/kvm_virtio.c +++ b/drivers/s390/kvm/kvm_virtio.c | |||
@@ -380,15 +380,13 @@ static void hotplug_devices(struct work_struct *dummy) | |||
380 | /* | 380 | /* |
381 | * we emulate the request_irq behaviour on top of s390 extints | 381 | * we emulate the request_irq behaviour on top of s390 extints |
382 | */ | 382 | */ |
383 | static void kvm_extint_handler(unsigned int ext_int_code, | 383 | static void kvm_extint_handler(struct ext_code ext_code, |
384 | unsigned int param32, unsigned long param64) | 384 | unsigned int param32, unsigned long param64) |
385 | { | 385 | { |
386 | struct virtqueue *vq; | 386 | struct virtqueue *vq; |
387 | u16 subcode; | ||
388 | u32 param; | 387 | u32 param; |
389 | 388 | ||
390 | subcode = ext_int_code >> 16; | 389 | if ((ext_code.subcode & 0xff00) != VIRTIO_SUBCODE_64) |
391 | if ((subcode & 0xff00) != VIRTIO_SUBCODE_64) | ||
392 | return; | 390 | return; |
393 | kstat_cpu(smp_processor_id()).irqs[EXTINT_VRT]++; | 391 | kstat_cpu(smp_processor_id()).irqs[EXTINT_VRT]++; |
394 | 392 | ||