aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/cio/chsc.c1
-rw-r--r--drivers/s390/cio/cio.c40
-rw-r--r--drivers/s390/cio/qdio.h14
-rw-r--r--drivers/s390/cio/qdio_main.c2
-rw-r--r--drivers/s390/crypto/zcrypt_msgtype6.c24
-rw-r--r--drivers/s390/net/qeth_core_main.c5
-rw-r--r--drivers/s390/net/qeth_l2_main.c3
-rw-r--r--drivers/s390/net/qeth_l3_main.c3
8 files changed, 54 insertions, 38 deletions
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c
index f6b9188c5af5..9f0ea6cb6922 100644
--- a/drivers/s390/cio/chsc.c
+++ b/drivers/s390/cio/chsc.c
@@ -610,6 +610,7 @@ void chsc_chp_online(struct chp_id chpid)
610 css_wait_for_slow_path(); 610 css_wait_for_slow_path();
611 for_each_subchannel_staged(__s390_process_res_acc, NULL, 611 for_each_subchannel_staged(__s390_process_res_acc, NULL,
612 &link); 612 &link);
613 css_schedule_reprobe();
613 } 614 }
614} 615}
615 616
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c
index 88e35d85d205..8ee88c4ebd83 100644
--- a/drivers/s390/cio/cio.c
+++ b/drivers/s390/cio/cio.c
@@ -342,8 +342,9 @@ static int cio_check_config(struct subchannel *sch, struct schib *schib)
342 */ 342 */
343int cio_commit_config(struct subchannel *sch) 343int cio_commit_config(struct subchannel *sch)
344{ 344{
345 struct schib schib;
346 int ccode, retry, ret = 0; 345 int ccode, retry, ret = 0;
346 struct schib schib;
347 struct irb irb;
347 348
348 if (stsch_err(sch->schid, &schib) || !css_sch_is_valid(&schib)) 349 if (stsch_err(sch->schid, &schib) || !css_sch_is_valid(&schib))
349 return -ENODEV; 350 return -ENODEV;
@@ -367,7 +368,10 @@ int cio_commit_config(struct subchannel *sch)
367 ret = -EAGAIN; 368 ret = -EAGAIN;
368 break; 369 break;
369 case 1: /* status pending */ 370 case 1: /* status pending */
370 return -EBUSY; 371 ret = -EBUSY;
372 if (tsch(sch->schid, &irb))
373 return ret;
374 break;
371 case 2: /* busy */ 375 case 2: /* busy */
372 udelay(100); /* allow for recovery */ 376 udelay(100); /* allow for recovery */
373 ret = -EBUSY; 377 ret = -EBUSY;
@@ -403,7 +407,6 @@ EXPORT_SYMBOL_GPL(cio_update_schib);
403 */ 407 */
404int cio_enable_subchannel(struct subchannel *sch, u32 intparm) 408int cio_enable_subchannel(struct subchannel *sch, u32 intparm)
405{ 409{
406 int retry;
407 int ret; 410 int ret;
408 411
409 CIO_TRACE_EVENT(2, "ensch"); 412 CIO_TRACE_EVENT(2, "ensch");
@@ -418,20 +421,14 @@ int cio_enable_subchannel(struct subchannel *sch, u32 intparm)
418 sch->config.isc = sch->isc; 421 sch->config.isc = sch->isc;
419 sch->config.intparm = intparm; 422 sch->config.intparm = intparm;
420 423
421 for (retry = 0; retry < 3; retry++) { 424 ret = cio_commit_config(sch);
425 if (ret == -EIO) {
426 /*
427 * Got a program check in msch. Try without
428 * the concurrent sense bit the next time.
429 */
430 sch->config.csense = 0;
422 ret = cio_commit_config(sch); 431 ret = cio_commit_config(sch);
423 if (ret == -EIO) {
424 /*
425 * Got a program check in msch. Try without
426 * the concurrent sense bit the next time.
427 */
428 sch->config.csense = 0;
429 } else if (ret == -EBUSY) {
430 struct irb irb;
431 if (tsch(sch->schid, &irb) != 0)
432 break;
433 } else
434 break;
435 } 432 }
436 CIO_HEX_EVENT(2, &ret, sizeof(ret)); 433 CIO_HEX_EVENT(2, &ret, sizeof(ret));
437 return ret; 434 return ret;
@@ -444,7 +441,6 @@ EXPORT_SYMBOL_GPL(cio_enable_subchannel);
444 */ 441 */
445int cio_disable_subchannel(struct subchannel *sch) 442int cio_disable_subchannel(struct subchannel *sch)
446{ 443{
447 int retry;
448 int ret; 444 int ret;
449 445
450 CIO_TRACE_EVENT(2, "dissch"); 446 CIO_TRACE_EVENT(2, "dissch");
@@ -456,16 +452,8 @@ int cio_disable_subchannel(struct subchannel *sch)
456 return -ENODEV; 452 return -ENODEV;
457 453
458 sch->config.ena = 0; 454 sch->config.ena = 0;
455 ret = cio_commit_config(sch);
459 456
460 for (retry = 0; retry < 3; retry++) {
461 ret = cio_commit_config(sch);
462 if (ret == -EBUSY) {
463 struct irb irb;
464 if (tsch(sch->schid, &irb) != 0)
465 break;
466 } else
467 break;
468 }
469 CIO_HEX_EVENT(2, &ret, sizeof(ret)); 457 CIO_HEX_EVENT(2, &ret, sizeof(ret));
470 return ret; 458 return ret;
471} 459}
diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h
index 8acaae18bd11..a563e4c00590 100644
--- a/drivers/s390/cio/qdio.h
+++ b/drivers/s390/cio/qdio.h
@@ -359,14 +359,12 @@ static inline int multicast_outbound(struct qdio_q *q)
359#define need_siga_sync_out_after_pci(q) \ 359#define need_siga_sync_out_after_pci(q) \
360 (unlikely(q->irq_ptr->siga_flag.sync_out_after_pci)) 360 (unlikely(q->irq_ptr->siga_flag.sync_out_after_pci))
361 361
362#define for_each_input_queue(irq_ptr, q, i) \ 362#define for_each_input_queue(irq_ptr, q, i) \
363 for (i = 0, q = irq_ptr->input_qs[0]; \ 363 for (i = 0; i < irq_ptr->nr_input_qs && \
364 i < irq_ptr->nr_input_qs; \ 364 ({ q = irq_ptr->input_qs[i]; 1; }); i++)
365 q = irq_ptr->input_qs[++i]) 365#define for_each_output_queue(irq_ptr, q, i) \
366#define for_each_output_queue(irq_ptr, q, i) \ 366 for (i = 0; i < irq_ptr->nr_output_qs && \
367 for (i = 0, q = irq_ptr->output_qs[0]; \ 367 ({ q = irq_ptr->output_qs[i]; 1; }); i++)
368 i < irq_ptr->nr_output_qs; \
369 q = irq_ptr->output_qs[++i])
370 368
371#define prev_buf(bufnr) \ 369#define prev_buf(bufnr) \
372 ((bufnr + QDIO_MAX_BUFFERS_MASK) & QDIO_MAX_BUFFERS_MASK) 370 ((bufnr + QDIO_MAX_BUFFERS_MASK) & QDIO_MAX_BUFFERS_MASK)
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c
index c883a085c059..77466c4faabb 100644
--- a/drivers/s390/cio/qdio_main.c
+++ b/drivers/s390/cio/qdio_main.c
@@ -996,7 +996,7 @@ static void qdio_int_handler_pci(struct qdio_irq *irq_ptr)
996 } 996 }
997 } 997 }
998 998
999 if (!pci_out_supported(q)) 999 if (!(irq_ptr->qib.ac & QIB_AC_OUTBOUND_PCI_SUPPORTED))
1000 return; 1000 return;
1001 1001
1002 for_each_output_queue(irq_ptr, q, i) { 1002 for_each_output_queue(irq_ptr, q, i) {
diff --git a/drivers/s390/crypto/zcrypt_msgtype6.c b/drivers/s390/crypto/zcrypt_msgtype6.c
index dc542e0a3055..0bc91e46395a 100644
--- a/drivers/s390/crypto/zcrypt_msgtype6.c
+++ b/drivers/s390/crypto/zcrypt_msgtype6.c
@@ -311,7 +311,7 @@ static int XCRB_msg_to_type6CPRB_msgX(struct zcrypt_device *zdev,
311 } __packed * msg = ap_msg->message; 311 } __packed * msg = ap_msg->message;
312 312
313 int rcblen = CEIL4(xcRB->request_control_blk_length); 313 int rcblen = CEIL4(xcRB->request_control_blk_length);
314 int replylen; 314 int replylen, req_sumlen, resp_sumlen;
315 char *req_data = ap_msg->message + sizeof(struct type6_hdr) + rcblen; 315 char *req_data = ap_msg->message + sizeof(struct type6_hdr) + rcblen;
316 char *function_code; 316 char *function_code;
317 317
@@ -321,12 +321,34 @@ static int XCRB_msg_to_type6CPRB_msgX(struct zcrypt_device *zdev,
321 xcRB->request_data_length; 321 xcRB->request_data_length;
322 if (ap_msg->length > MSGTYPE06_MAX_MSG_SIZE) 322 if (ap_msg->length > MSGTYPE06_MAX_MSG_SIZE)
323 return -EINVAL; 323 return -EINVAL;
324
325 /* Overflow check
326 sum must be greater (or equal) than the largest operand */
327 req_sumlen = CEIL4(xcRB->request_control_blk_length) +
328 xcRB->request_data_length;
329 if ((CEIL4(xcRB->request_control_blk_length) <=
330 xcRB->request_data_length) ?
331 (req_sumlen < xcRB->request_data_length) :
332 (req_sumlen < CEIL4(xcRB->request_control_blk_length))) {
333 return -EINVAL;
334 }
335
324 replylen = sizeof(struct type86_fmt2_msg) + 336 replylen = sizeof(struct type86_fmt2_msg) +
325 CEIL4(xcRB->reply_control_blk_length) + 337 CEIL4(xcRB->reply_control_blk_length) +
326 xcRB->reply_data_length; 338 xcRB->reply_data_length;
327 if (replylen > MSGTYPE06_MAX_MSG_SIZE) 339 if (replylen > MSGTYPE06_MAX_MSG_SIZE)
328 return -EINVAL; 340 return -EINVAL;
329 341
342 /* Overflow check
343 sum must be greater (or equal) than the largest operand */
344 resp_sumlen = CEIL4(xcRB->reply_control_blk_length) +
345 xcRB->reply_data_length;
346 if ((CEIL4(xcRB->reply_control_blk_length) <= xcRB->reply_data_length) ?
347 (resp_sumlen < xcRB->reply_data_length) :
348 (resp_sumlen < CEIL4(xcRB->reply_control_blk_length))) {
349 return -EINVAL;
350 }
351
330 /* prepare type6 header */ 352 /* prepare type6 header */
331 msg->hdr = static_type6_hdrX; 353 msg->hdr = static_type6_hdrX;
332 memcpy(msg->hdr.agent_id , &(xcRB->agent_ID), sizeof(xcRB->agent_ID)); 354 memcpy(msg->hdr.agent_id , &(xcRB->agent_ID), sizeof(xcRB->agent_ID));
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index c3a83df07894..795ed61a5496 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -1660,7 +1660,6 @@ int qeth_qdio_clear_card(struct qeth_card *card, int use_halt)
1660 QDIO_FLAG_CLEANUP_USING_CLEAR); 1660 QDIO_FLAG_CLEANUP_USING_CLEAR);
1661 if (rc) 1661 if (rc)
1662 QETH_CARD_TEXT_(card, 3, "1err%d", rc); 1662 QETH_CARD_TEXT_(card, 3, "1err%d", rc);
1663 qdio_free(CARD_DDEV(card));
1664 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); 1663 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED);
1665 break; 1664 break;
1666 case QETH_QDIO_CLEANING: 1665 case QETH_QDIO_CLEANING:
@@ -2605,6 +2604,7 @@ static int qeth_mpc_initialize(struct qeth_card *card)
2605 return 0; 2604 return 0;
2606out_qdio: 2605out_qdio:
2607 qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD); 2606 qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD);
2607 qdio_free(CARD_DDEV(card));
2608 return rc; 2608 return rc;
2609} 2609}
2610 2610
@@ -4906,9 +4906,11 @@ retry:
4906 if (retries < 3) 4906 if (retries < 3)
4907 QETH_DBF_MESSAGE(2, "%s Retrying to do IDX activates.\n", 4907 QETH_DBF_MESSAGE(2, "%s Retrying to do IDX activates.\n",
4908 dev_name(&card->gdev->dev)); 4908 dev_name(&card->gdev->dev));
4909 rc = qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD);
4909 ccw_device_set_offline(CARD_DDEV(card)); 4910 ccw_device_set_offline(CARD_DDEV(card));
4910 ccw_device_set_offline(CARD_WDEV(card)); 4911 ccw_device_set_offline(CARD_WDEV(card));
4911 ccw_device_set_offline(CARD_RDEV(card)); 4912 ccw_device_set_offline(CARD_RDEV(card));
4913 qdio_free(CARD_DDEV(card));
4912 rc = ccw_device_set_online(CARD_RDEV(card)); 4914 rc = ccw_device_set_online(CARD_RDEV(card));
4913 if (rc) 4915 if (rc)
4914 goto retriable; 4916 goto retriable;
@@ -4918,7 +4920,6 @@ retry:
4918 rc = ccw_device_set_online(CARD_DDEV(card)); 4920 rc = ccw_device_set_online(CARD_DDEV(card));
4919 if (rc) 4921 if (rc)
4920 goto retriable; 4922 goto retriable;
4921 rc = qeth_qdio_clear_card(card, card->info.type != QETH_CARD_TYPE_IQD);
4922retriable: 4923retriable:
4923 if (rc == -ERESTARTSYS) { 4924 if (rc == -ERESTARTSYS) {
4924 QETH_DBF_TEXT(SETUP, 2, "break1"); 4925 QETH_DBF_TEXT(SETUP, 2, "break1");
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
index 0710550093ce..908d82529ee9 100644
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -1091,6 +1091,7 @@ out_remove:
1091 ccw_device_set_offline(CARD_DDEV(card)); 1091 ccw_device_set_offline(CARD_DDEV(card));
1092 ccw_device_set_offline(CARD_WDEV(card)); 1092 ccw_device_set_offline(CARD_WDEV(card));
1093 ccw_device_set_offline(CARD_RDEV(card)); 1093 ccw_device_set_offline(CARD_RDEV(card));
1094 qdio_free(CARD_DDEV(card));
1094 if (recover_flag == CARD_STATE_RECOVER) 1095 if (recover_flag == CARD_STATE_RECOVER)
1095 card->state = CARD_STATE_RECOVER; 1096 card->state = CARD_STATE_RECOVER;
1096 else 1097 else
@@ -1132,6 +1133,7 @@ static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev,
1132 rc = (rc2) ? rc2 : rc3; 1133 rc = (rc2) ? rc2 : rc3;
1133 if (rc) 1134 if (rc)
1134 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); 1135 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
1136 qdio_free(CARD_DDEV(card));
1135 if (recover_flag == CARD_STATE_UP) 1137 if (recover_flag == CARD_STATE_UP)
1136 card->state = CARD_STATE_RECOVER; 1138 card->state = CARD_STATE_RECOVER;
1137 /* let user_space know that device is offline */ 1139 /* let user_space know that device is offline */
@@ -1194,6 +1196,7 @@ static void qeth_l2_shutdown(struct ccwgroup_device *gdev)
1194 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); 1196 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
1195 qeth_qdio_clear_card(card, 0); 1197 qeth_qdio_clear_card(card, 0);
1196 qeth_clear_qdio_buffers(card); 1198 qeth_clear_qdio_buffers(card);
1199 qdio_free(CARD_DDEV(card));
1197} 1200}
1198 1201
1199static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev) 1202static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev)
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
index 0f430424c3b8..3524d34ff694 100644
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -3447,6 +3447,7 @@ out_remove:
3447 ccw_device_set_offline(CARD_DDEV(card)); 3447 ccw_device_set_offline(CARD_DDEV(card));
3448 ccw_device_set_offline(CARD_WDEV(card)); 3448 ccw_device_set_offline(CARD_WDEV(card));
3449 ccw_device_set_offline(CARD_RDEV(card)); 3449 ccw_device_set_offline(CARD_RDEV(card));
3450 qdio_free(CARD_DDEV(card));
3450 if (recover_flag == CARD_STATE_RECOVER) 3451 if (recover_flag == CARD_STATE_RECOVER)
3451 card->state = CARD_STATE_RECOVER; 3452 card->state = CARD_STATE_RECOVER;
3452 else 3453 else
@@ -3493,6 +3494,7 @@ static int __qeth_l3_set_offline(struct ccwgroup_device *cgdev,
3493 rc = (rc2) ? rc2 : rc3; 3494 rc = (rc2) ? rc2 : rc3;
3494 if (rc) 3495 if (rc)
3495 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc); 3496 QETH_DBF_TEXT_(SETUP, 2, "1err%d", rc);
3497 qdio_free(CARD_DDEV(card));
3496 if (recover_flag == CARD_STATE_UP) 3498 if (recover_flag == CARD_STATE_UP)
3497 card->state = CARD_STATE_RECOVER; 3499 card->state = CARD_STATE_RECOVER;
3498 /* let user_space know that device is offline */ 3500 /* let user_space know that device is offline */
@@ -3545,6 +3547,7 @@ static void qeth_l3_shutdown(struct ccwgroup_device *gdev)
3545 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM); 3547 qeth_hw_trap(card, QETH_DIAGS_TRAP_DISARM);
3546 qeth_qdio_clear_card(card, 0); 3548 qeth_qdio_clear_card(card, 0);
3547 qeth_clear_qdio_buffers(card); 3549 qeth_clear_qdio_buffers(card);
3550 qdio_free(CARD_DDEV(card));
3548} 3551}
3549 3552
3550static int qeth_l3_pm_suspend(struct ccwgroup_device *gdev) 3553static int qeth_l3_pm_suspend(struct ccwgroup_device *gdev)