aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-03-22 21:15:32 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-03-22 21:15:32 -0400
commitdb1417967959569599da2a4bd0ffb93b17ad795f (patch)
tree08751414d5f4a9e264af924154ed3543a8e573a9 /drivers
parent48aab2f79dfc1357c48ce22ff5c989b52a590069 (diff)
parentc6da39f26cfe475704ec521723192e520e8f51b8 (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/Kconfig9
-rw-r--r--drivers/s390/block/dasd.c4
-rw-r--r--drivers/s390/block/dasd_diag.c8
-rw-r--r--drivers/s390/block/dasd_eckd.c8
-rw-r--r--drivers/s390/char/sclp.c4
-rw-r--r--drivers/s390/char/sclp_quiesce.c1
-rw-r--r--drivers/s390/char/sclp_sdias.c101
-rw-r--r--drivers/s390/char/zcore.c1
-rw-r--r--drivers/s390/cio/cio.c2
-rw-r--r--drivers/s390/cio/qdio_main.c6
-rw-r--r--drivers/s390/crypto/Makefile10
-rw-r--r--drivers/s390/crypto/ap_bus.c2
-rw-r--r--drivers/s390/crypto/zcrypt_api.c2
-rw-r--r--drivers/s390/crypto/zcrypt_cex2a.c4
-rw-r--r--drivers/s390/crypto/zcrypt_mono.c100
-rw-r--r--drivers/s390/crypto/zcrypt_pcica.c4
-rw-r--r--drivers/s390/crypto/zcrypt_pcicc.c4
-rw-r--r--drivers/s390/crypto/zcrypt_pcixcc.c4
-rw-r--r--drivers/s390/kvm/kvm_virtio.c6
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
64config ZCRYPT 64config 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
80config 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
88config CRYPTO_SHA1_S390 79config 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. */
232static void dasd_ext_handler(unsigned int ext_int_code, 232static 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)
1564static void dasd_eckd_kick_validate_server(struct dasd_device *device) 1564static 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)
1993static int dasd_eckd_online_to_ready(struct dasd_device *device) 1999static 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. */
396static void sclp_interrupt_handler(unsigned int ext_int_code, 396static 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. */
821static void sclp_check_handler(unsigned int ext_int_code, 821static 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
64static struct sdias_sccb sccb __attribute__((aligned(4096))); 65static struct sdias_sccb sccb __attribute__((aligned(4096)));
66static struct sdias_evbuf sdias_evbuf;
65 67
66static int sclp_req_done; 68static DECLARE_COMPLETION(evbuf_accepted);
67static wait_queue_head_t sdias_wq; 69static DECLARE_COMPLETION(evbuf_done);
68static DEFINE_MUTEX(sdias_mutex); 70static DEFINE_MUTEX(sdias_mutex);
69 71
72/*
73 * Called by SCLP base when read event data has been completed (async mode only)
74 */
75static 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 */
70static void sdias_callback(struct sclp_req *request, void *data) 86static 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 }
228out: 256out:
@@ -230,19 +258,50 @@ out:
230 return rc; 258 return rc;
231} 259}
232 260
233int __init sclp_sdias_init(void) 261static 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
275static 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
283static 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
291int __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;
304out:
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);
1094no_handler: 1095no_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
1098static void qdio_establish_handle_irq(struct ccw_device *cdev, int cstat, 1104static 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
5ifdef CONFIG_ZCRYPT_MONOLITHIC
6
7z90crypt-objs := zcrypt_mono.o ap_bus.o zcrypt_api.o \
8 zcrypt_pcica.o zcrypt_pcicc.o zcrypt_pcixcc.o zcrypt_cex2a.o
9obj-$(CONFIG_ZCRYPT) += z90crypt.o
10
11else
12
13ap-objs := ap_bus.o 5ap-objs := ap_bus.o
14obj-$(CONFIG_ZCRYPT) += ap.o zcrypt_api.o zcrypt_pcicc.o zcrypt_pcixcc.o 6obj-$(CONFIG_ZCRYPT) += ap.o zcrypt_api.o zcrypt_pcicc.o zcrypt_pcixcc.o
15obj-$(CONFIG_ZCRYPT) += zcrypt_pcica.o zcrypt_cex2a.o 7obj-$(CONFIG_ZCRYPT) += zcrypt_pcica.o zcrypt_cex2a.o
16
17endif
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
1866module_init(ap_module_init); 1865module_init(ap_module_init);
1867module_exit(ap_module_exit); 1866module_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
1224module_init(zcrypt_api_init); 1223module_init(zcrypt_api_init);
1225module_exit(zcrypt_api_exit); 1224module_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
67MODULE_DEVICE_TABLE(ap, zcrypt_cex2a_ids); 66MODULE_DEVICE_TABLE(ap, zcrypt_cex2a_ids);
68MODULE_AUTHOR("IBM Corporation"); 67MODULE_AUTHOR("IBM Corporation");
69MODULE_DESCRIPTION("CEX2A Cryptographic Coprocessor device driver, " 68MODULE_DESCRIPTION("CEX2A Cryptographic Coprocessor device driver, "
70 "Copyright 2001, 2006 IBM Corporation"); 69 "Copyright 2001, 2006 IBM Corporation");
71MODULE_LICENSE("GPL"); 70MODULE_LICENSE("GPL");
72#endif
73 71
74static int zcrypt_cex2a_probe(struct ap_device *ap_dev); 72static int zcrypt_cex2a_probe(struct ap_device *ap_dev);
75static void zcrypt_cex2a_remove(struct ap_device *ap_dev); 73static 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
500module_init(zcrypt_cex2a_init); 497module_init(zcrypt_cex2a_init);
501module_exit(zcrypt_cex2a_exit); 498module_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 */
48static 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
72out_pcixcc:
73 zcrypt_pcixcc_exit();
74out_pcicc:
75 zcrypt_pcicc_exit();
76out_pcica:
77 zcrypt_pcica_exit();
78out_api:
79 zcrypt_api_exit();
80out_ap:
81 ap_module_exit();
82out:
83 return rc;
84}
85
86/**
87 * The module termination code.
88 */
89static 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
99module_init(zcrypt_init);
100module_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
57MODULE_DEVICE_TABLE(ap, zcrypt_pcica_ids); 56MODULE_DEVICE_TABLE(ap, zcrypt_pcica_ids);
58MODULE_AUTHOR("IBM Corporation"); 57MODULE_AUTHOR("IBM Corporation");
59MODULE_DESCRIPTION("PCICA Cryptographic Coprocessor device driver, " 58MODULE_DESCRIPTION("PCICA Cryptographic Coprocessor device driver, "
60 "Copyright 2001, 2006 IBM Corporation"); 59 "Copyright 2001, 2006 IBM Corporation");
61MODULE_LICENSE("GPL"); 60MODULE_LICENSE("GPL");
62#endif
63 61
64static int zcrypt_pcica_probe(struct ap_device *ap_dev); 62static int zcrypt_pcica_probe(struct ap_device *ap_dev);
65static void zcrypt_pcica_remove(struct ap_device *ap_dev); 63static 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
412module_init(zcrypt_pcica_init); 409module_init(zcrypt_pcica_init);
413module_exit(zcrypt_pcica_exit); 410module_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
69MODULE_DEVICE_TABLE(ap, zcrypt_pcicc_ids); 68MODULE_DEVICE_TABLE(ap, zcrypt_pcicc_ids);
70MODULE_AUTHOR("IBM Corporation"); 69MODULE_AUTHOR("IBM Corporation");
71MODULE_DESCRIPTION("PCICC Cryptographic Coprocessor device driver, " 70MODULE_DESCRIPTION("PCICC Cryptographic Coprocessor device driver, "
72 "Copyright 2001, 2006 IBM Corporation"); 71 "Copyright 2001, 2006 IBM Corporation");
73MODULE_LICENSE("GPL"); 72MODULE_LICENSE("GPL");
74#endif
75 73
76static int zcrypt_pcicc_probe(struct ap_device *ap_dev); 74static int zcrypt_pcicc_probe(struct ap_device *ap_dev);
77static void zcrypt_pcicc_remove(struct ap_device *ap_dev); 75static 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
618module_init(zcrypt_pcicc_init); 615module_init(zcrypt_pcicc_init);
619module_exit(zcrypt_pcicc_exit); 616module_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
79MODULE_DEVICE_TABLE(ap, zcrypt_pcixcc_ids); 78MODULE_DEVICE_TABLE(ap, zcrypt_pcixcc_ids);
80MODULE_AUTHOR("IBM Corporation"); 79MODULE_AUTHOR("IBM Corporation");
81MODULE_DESCRIPTION("PCIXCC Cryptographic Coprocessor device driver, " 80MODULE_DESCRIPTION("PCIXCC Cryptographic Coprocessor device driver, "
82 "Copyright 2001, 2006 IBM Corporation"); 81 "Copyright 2001, 2006 IBM Corporation");
83MODULE_LICENSE("GPL"); 82MODULE_LICENSE("GPL");
84#endif
85 83
86static int zcrypt_pcixcc_probe(struct ap_device *ap_dev); 84static int zcrypt_pcixcc_probe(struct ap_device *ap_dev);
87static void zcrypt_pcixcc_remove(struct ap_device *ap_dev); 85static 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
1125module_init(zcrypt_pcixcc_init); 1122module_init(zcrypt_pcixcc_init);
1126module_exit(zcrypt_pcixcc_exit); 1123module_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 */
383static void kvm_extint_handler(unsigned int ext_int_code, 383static 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