return reg1 != 0;
 }
 
+/* TAPQ register GR2 response struct */
+struct ap_tapq_gr2 {
+       union {
+               unsigned long value;
+               struct {
+                       unsigned int fac    : 32; /* facility bits */
+                       unsigned int apinfo : 32; /* ap type, ... */
+               };
+               struct {
+                       unsigned int s     :  1; /* APSC */
+                       unsigned int m     :  1; /* AP4KM */
+                       unsigned int c     :  1; /* AP4KC */
+                       unsigned int mode  :  3;
+                       unsigned int n     :  1; /* APXA */
+                       unsigned int       :  1;
+                       unsigned int class :  8;
+                       unsigned int bs    :  2; /* SE bind/assoc */
+                       unsigned int       : 14;
+                       unsigned int at    :  8; /* ap type */
+                       unsigned int nd    :  8; /* nr of domains */
+                       unsigned int       :  4;
+                       unsigned int ml    :  4; /* apxl ml */
+                       unsigned int       :  4;
+                       unsigned int qd    :  4; /* queue depth */
+               };
+       };
+};
+
 /**
  * ap_tapq(): Test adjunct processor queue.
  * @qid: The AP queue number
  *
  * Returns AP queue status structure.
  */
-static inline struct ap_queue_status ap_tapq(ap_qid_t qid, unsigned long *info)
+static inline struct ap_queue_status ap_tapq(ap_qid_t qid, struct ap_tapq_gr2 *info)
 {
        union ap_queue_status_reg reg1;
        unsigned long reg2;
                : [qid] "d" (qid)
                : "cc", "0", "1", "2");
        if (info)
-               *info = reg2;
+               info->value = reg2;
        return reg1.status;
 }
 
  * ap_test_queue(): Test adjunct processor queue.
  * @qid: The AP queue number
  * @tbit: Test facilities bit
- * @info: Pointer to queue descriptor
+ * @info: Ptr to tapq gr2 struct
  *
  * Returns AP queue status structure.
  */
-static inline struct ap_queue_status ap_test_queue(ap_qid_t qid,
-                                                  int tbit,
-                                                  unsigned long *info)
+static inline struct ap_queue_status ap_test_queue(ap_qid_t qid, int tbit,
+                                                  struct ap_tapq_gr2 *info)
 {
        if (tbit)
                qid |= 1UL << 23; /* set T bit*/
 
                          int *q_depth, int *q_ml, bool *q_decfg, bool *q_cstop)
 {
        struct ap_queue_status status;
-       union {
-               unsigned long value;
-               struct {
-                       unsigned int fac   : 32; /* facility bits */
-                       unsigned int at    :  8; /* ap type */
-                       unsigned int _res1 :  8;
-                       unsigned int _res2 :  4;
-                       unsigned int ml    :  4; /* apxl ml */
-                       unsigned int _res3 :  4;
-                       unsigned int qd    :  4; /* queue depth */
-               } tapq_gr2;
-       } tapq_info;
+       struct ap_tapq_gr2 tapq_info;
 
        tapq_info.value = 0;
 
                return false;
 
        /* call TAPQ on this APQN */
-       status = ap_test_queue(qid, ap_apft_available(), &tapq_info.value);
+       status = ap_test_queue(qid, ap_apft_available(), &tapq_info);
        switch (status.response_code) {
        case AP_RESPONSE_NORMAL:
        case AP_RESPONSE_RESET_IN_PROGRESS:
                 */
                if (WARN_ON_ONCE(!tapq_info.value))
                        return false;
-               *q_type = tapq_info.tapq_gr2.at;
-               *q_fac = tapq_info.tapq_gr2.fac;
-               *q_depth = tapq_info.tapq_gr2.qd;
-               *q_ml = tapq_info.tapq_gr2.ml;
+               *q_type = tapq_info.at;
+               *q_fac = tapq_info.fac;
+               *q_depth = tapq_info.qd;
+               *q_ml = tapq_info.ml;
                *q_decfg = status.response_code == AP_RESPONSE_DECONFIGURED;
                *q_cstop = status.response_code == AP_RESPONSE_CHECKSTOPPED;
                switch (*q_type) {
 
 {
        bool apid_cleared;
        struct ap_queue_status status;
-       unsigned long apid, apqi, info;
-       int qtype, qtype_mask = 0xff000000;
+       unsigned long apid, apqi;
+       struct ap_tapq_gr2 info;
 
        for_each_set_bit_inv(apid, apm, AP_DEVICES) {
                apid_cleared = false;
                        case AP_RESPONSE_DECONFIGURED:
                        case AP_RESPONSE_CHECKSTOPPED:
                        case AP_RESPONSE_BUSY:
-                               qtype = info & qtype_mask;
-
                                /*
                                 * The vfio_ap device driver only
                                 * supports CEX4 and newer adapters, so
                                 * remove the APID if the adapter is
                                 * older than a CEX4.
                                 */
-                               if (qtype < AP_DEVICE_TYPE_CEX4) {
+                               if (info.at < AP_DEVICE_TYPE_CEX4) {
                                        clear_bit_inv(apid, apm);
                                        apid_cleared = true;
                                }