|
@@ -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)
|
|
|
{
|
|
|
- do {
|
|
|
+ static int ntsm_unsupported;
|
|
|
+
|
|
|
+ while (true) {
|
|
|
memset(sei, 0, sizeof(*sei));
|
|
|
sei->request.length = 0x0010;
|
|
|
sei->request.code = 0x000e;
|
|
|
- sei->ntsm = ntsm;
|
|
|
+ if (!ntsm_unsupported)
|
|
|
+ sei->ntsm = ntsm;
|
|
|
|
|
|
if (chsc(sei))
|
|
|
break;
|
|
|
|
|
|
if (sei->response.code != 0x0001) {
|
|
|
- CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x)\n",
|
|
|
- sei->response.code);
|
|
|
+ CIO_CRW_EVENT(2, "chsc: sei failed (rc=%04x, ntsm=%llx)\n",
|
|
|
+ sei->response.code, sei->ntsm);
|
|
|
+
|
|
|
+ if (sei->response.code == 3 && sei->ntsm) {
|
|
|
+ /* Fallback for old firmware. */
|
|
|
+ ntsm_unsupported = 1;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -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);
|
|
|
break;
|
|
|
}
|
|
|
- } while (sei->u.nt0_area.flags & 0x80);
|
|
|
+
|
|
|
+ if (!(sei->u.nt0_area.flags & 0x80))
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*
|