Skip to content
Snippets Groups Projects
Commit 06cd7a87 authored by Sebastian Ott's avatar Sebastian Ott Committed by Martin Schwidefsky
Browse files

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: default avatarStefan Haberland <stefan.haberland@de.ibm.com>
Reviewed-by: default avatarPeter Oberparleiter <oberpar@linux.vnet.ibm.com>
Signed-off-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 6ca2a88a
No related merge requests found
...@@ -541,18 +541,27 @@ static void chsc_process_sei_nt0(struct chsc_sei_nt0_area *sei_area) ...@@ -541,18 +541,27 @@ static void chsc_process_sei_nt0(struct chsc_sei_nt0_area *sei_area)
static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm) static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm)
{ {
do { static int ntsm_unsupported;
while (true) {
memset(sei, 0, sizeof(*sei)); memset(sei, 0, sizeof(*sei));
sei->request.length = 0x0010; sei->request.length = 0x0010;
sei->request.code = 0x000e; sei->request.code = 0x000e;
sei->ntsm = ntsm; if (!ntsm_unsupported)
sei->ntsm = ntsm;
if (chsc(sei)) if (chsc(sei))
break; break;
if (sei->response.code != 0x0001) { if (sei->response.code != 0x0001) {
CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x)\n", CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x, ntsm=%llx)\n",
sei->response.code); sei->response.code, sei->ntsm);
if (sei->response.code == 3 && sei->ntsm) {
/* Fallback for old firmware. */
ntsm_unsupported = 1;
continue;
}
break; break;
} }
...@@ -568,7 +577,10 @@ static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm) ...@@ -568,7 +577,10 @@ static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm)
CIO_CRW_EVENT(2, "chsc: unhandled nt: %d\n", sei->nt); CIO_CRW_EVENT(2, "chsc: unhandled nt: %d\n", sei->nt);
break; break;
} }
} while (sei->u.nt0_area.flags & 0x80);
if (!(sei->u.nt0_area.flags & 0x80))
break;
}
} }
/* /*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment