Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390/chsc: fix SEI usage on old FW levels

Using a notification type mask for the store event information chsc
is unsupported on some firmware levels. Retry SEI with that mask set
to zero (which is the old way of requesting only channel subsystem
related events).

Cc: <stable@vger.kernel.org>
Reported-and-tested-by: Stefan Haberland <stefan.haberland@de.ibm.com>
Reviewed-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

authored by

Sebastian Ott and committed by
Martin Schwidefsky
06cd7a87 6ca2a88a

+17 -5
+17 -5
drivers/s390/cio/chsc.c
··· 541 541 542 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 547 memset(sei, 0, sizeof(*sei)); 546 548 sei->request.length = 0x0010; 547 549 sei->request.code = 0x000e; 548 - sei->ntsm = ntsm; 550 + if (!ntsm_unsupported) 551 + sei->ntsm = ntsm; 549 552 550 553 if (chsc(sei)) 551 554 break; 552 555 553 556 if (sei->response.code != 0x0001) { 554 - CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x)\n", 555 - sei->response.code); 557 + CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x, ntsm=%llx)\n", 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 565 break; 557 566 } 558 567 ··· 577 568 CIO_CRW_EVENT(2, "chsc: unhandled nt: %d\n", sei->nt); 578 569 break; 579 570 } 580 - } while (sei->u.nt0_area.flags & 0x80); 571 + 572 + if (!(sei->u.nt0_area.flags & 0x80)) 573 + break; 574 + } 581 575 } 582 576 583 577 /*