diff options
Diffstat (limited to 'drivers/s390/cio/chsc.c')
-rw-r--r-- | drivers/s390/cio/chsc.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c index 9f0ea6cb6922..e3bf885f4a6c 100644 --- a/drivers/s390/cio/chsc.c +++ b/drivers/s390/cio/chsc.c | |||
@@ -541,18 +541,27 @@ static void chsc_process_sei_nt0(struct chsc_sei_nt0_area *sei_area) | |||
541 | 541 | ||
542 | static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm) | 542 | static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm) |
543 | { | 543 | { |
544 | do { | 544 | static int ntsm_unsupported; |
545 | |||
546 | while (true) { | ||
545 | memset(sei, 0, sizeof(*sei)); | 547 | memset(sei, 0, sizeof(*sei)); |
546 | sei->request.length = 0x0010; | 548 | sei->request.length = 0x0010; |
547 | sei->request.code = 0x000e; | 549 | sei->request.code = 0x000e; |
548 | sei->ntsm = ntsm; | 550 | if (!ntsm_unsupported) |
551 | sei->ntsm = ntsm; | ||
549 | 552 | ||
550 | if (chsc(sei)) | 553 | if (chsc(sei)) |
551 | break; | 554 | break; |
552 | 555 | ||
553 | if (sei->response.code != 0x0001) { | 556 | if (sei->response.code != 0x0001) { |
554 | CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x)\n", | 557 | CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x, ntsm=%llx)\n", |
555 | sei->response.code); | 558 | sei->response.code, sei->ntsm); |
559 | |||
560 | if (sei->response.code == 3 && sei->ntsm) { | ||
561 | /* Fallback for old firmware. */ | ||
562 | ntsm_unsupported = 1; | ||
563 | continue; | ||
564 | } | ||
556 | break; | 565 | break; |
557 | } | 566 | } |
558 | 567 | ||
@@ -568,7 +577,10 @@ static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm) | |||
568 | CIO_CRW_EVENT(2, "chsc: unhandled nt: %d\n", sei->nt); | 577 | CIO_CRW_EVENT(2, "chsc: unhandled nt: %d\n", sei->nt); |
569 | break; | 578 | break; |
570 | } | 579 | } |
571 | } while (sei->u.nt0_area.flags & 0x80); | 580 | |
581 | if (!(sei->u.nt0_area.flags & 0x80)) | ||
582 | break; | ||
583 | } | ||
572 | } | 584 | } |
573 | 585 | ||
574 | /* | 586 | /* |