__u8    pad_0x00a4[0x00a8-0x00a4];      /* 0x00a4 */
        __u64   trans_exc_code;                 /* 0x00a8 */
        __u64   monitor_code;                   /* 0x00b0 */
-       __u16   subchannel_id;                  /* 0x00b8 */
-       __u16   subchannel_nr;                  /* 0x00ba */
-       __u32   io_int_parm;                    /* 0x00bc */
-       __u32   io_int_word;                    /* 0x00c0 */
+       union {
+               struct {
+                       __u16   subchannel_id;  /* 0x00b8 */
+                       __u16   subchannel_nr;  /* 0x00ba */
+                       __u32   io_int_parm;    /* 0x00bc */
+                       __u32   io_int_word;    /* 0x00c0 */
+               };
+               struct tpi_info tpi_info;       /* 0x00b8 */
+       };
        __u8    pad_0x00c4[0x00c8-0x00c4];      /* 0x00c4 */
        __u32   stfl_fac_list;                  /* 0x00c8 */
        __u8    pad_0x00cc[0x00e8-0x00cc];      /* 0x00cc */
 
                account_idle_time_irq();
 
        do {
-               memcpy(®s->int_code, &S390_lowcore.subchannel_id, 12);
-               if (S390_lowcore.io_int_word & BIT(31))
+               regs->tpi_info = S390_lowcore.tpi_info;
+               if (S390_lowcore.tpi_info.adapter_IO)
                        do_irq_async(regs, THIN_INTERRUPT);
                else
                        do_irq_async(regs, IO_INTERRUPT);
 
                        memset(&__entry->tpi_info, 0, sizeof(struct tpi_info));
                else if (addr)
                        __entry->tpi_info = *addr;
-               else {
-                       memcpy(&__entry->tpi_info, &S390_lowcore.subchannel_id,
-                              sizeof(struct tpi_info));
-               }
+               else
+                       __entry->tpi_info = S390_lowcore.tpi_info;
                __entry->cssid = __entry->tpi_info.schid.cssid;
                __entry->ssid = __entry->tpi_info.schid.ssid;
                __entry->schno = __entry->tpi_info.schid.sch_no;