static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm) { do { memset(sei, 0, sizeof(*sei)); sei->request.length = 0x0010; sei->request.code = 0x000e; 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); break; } CIO_CRW_EVENT(2, "chsc: sei successful (nt=%d)\n", sei->nt); switch (sei->nt) { case 0: chsc_process_sei_nt0(&sei->u.nt0_area); break; case 2: chsc_process_sei_nt2(&sei->u.nt2_area); break; default: CIO_CRW_EVENT(2, "chsc: unhandled nt: %d\n", sei->nt); break; } } while (sei->u.nt0_area.flags & 0x80); }
static void chsc_process_event_information(struct chsc_sei *sei, u64 ntsm) { static int ntsm_unsupported; while (true) { memset(sei, 0, sizeof(*sei)); sei->request.length = 0x0010; sei->request.code = 0x000e; if (!ntsm_unsupported) sei->ntsm = ntsm; if (chsc(sei)) break; if (sei->response.code != 0x0001) { 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; } CIO_CRW_EVENT(2, "chsc: sei successful (nt=%d)\n", sei->nt); switch (sei->nt) { case 0: chsc_process_sei_nt0(&sei->u.nt0_area); break; case 2: chsc_process_sei_nt2(&sei->u.nt2_area); break; default: CIO_CRW_EVENT(2, "chsc: unhandled nt: %d\n", sei->nt); break; } if (!(sei->u.nt0_area.flags & 0x80)) break; } }