zdev->max_mod_size = CEX2A_MAX_MOD_SIZE;
                zdev->short_crt = 1;
                zdev->speed_rating = CEX2A_SPEED_RATING;
+               zdev->max_exp_bit_length = CEX2A_MAX_MOD_SIZE;
                break;
        case AP_DEVICE_TYPE_CEX3A:
                zdev = zcrypt_device_alloc(CEX3A_MAX_RESPONSE_SIZE);
                zdev->type_string = "CEX3A";
                zdev->min_mod_size = CEX2A_MIN_MOD_SIZE;
                zdev->max_mod_size = CEX2A_MAX_MOD_SIZE;
-               if (ap_4096_commands_available(ap_dev->qid))
+               zdev->max_exp_bit_length = CEX2A_MAX_MOD_SIZE;
+               if (ap_4096_commands_available(ap_dev->qid)) {
                        zdev->max_mod_size = CEX3A_MAX_MOD_SIZE;
+                       zdev->max_exp_bit_length = CEX3A_MAX_MOD_SIZE;
+               }
                zdev->short_crt = 1;
                zdev->speed_rating = CEX3A_SPEED_RATING;
                break;
 
        zdev->min_mod_size = PCICA_MIN_MOD_SIZE;
        zdev->max_mod_size = PCICA_MAX_MOD_SIZE;
        zdev->speed_rating = PCICA_SPEED_RATING;
+       zdev->max_exp_bit_length = PCICA_MAX_MOD_SIZE;
        ap_dev->reply = &zdev->reply;
        ap_dev->private = zdev;
        rc = zcrypt_device_register(zdev);
 
        zdev->min_mod_size = PCICC_MIN_MOD_SIZE;
        zdev->max_mod_size = PCICC_MAX_MOD_SIZE;
        zdev->speed_rating = PCICC_SPEED_RATING;
+       zdev->max_exp_bit_length = PCICC_MAX_MOD_SIZE;
        ap_dev->reply = &zdev->reply;
        ap_dev->private = zdev;
        rc = zcrypt_device_register(zdev);
 
        case TYPE88_RSP_CODE:
                return convert_error(zdev, reply);
        case TYPE86_RSP_CODE:
+               if (msg->cprbx.ccp_rtcode &&
+                  (msg->cprbx.ccp_rscode == 0x14f) &&
+                  (outputdatalength > 256)) {
+                       if (zdev->max_exp_bit_length <= 17) {
+                               zdev->max_exp_bit_length = 17;
+                               return -EAGAIN;
+                       } else
+                               return -EINVAL;
+               }
                if (msg->hdr.reply_code)
                        return convert_error(zdev, reply);
                if (msg->cprbx.cprb_ver_id == 0x02)
                        zdev->speed_rating = PCIXCC_MCL2_SPEED_RATING;
                        zdev->min_mod_size = PCIXCC_MIN_MOD_SIZE_OLD;
                        zdev->max_mod_size = PCIXCC_MAX_MOD_SIZE;
+                       zdev->max_exp_bit_length = PCIXCC_MAX_MOD_SIZE;
                } else {
                        zdev->type_string = "PCIXCC_MCL3";
                        zdev->speed_rating = PCIXCC_MCL3_SPEED_RATING;
                        zdev->min_mod_size = PCIXCC_MIN_MOD_SIZE;
                        zdev->max_mod_size = PCIXCC_MAX_MOD_SIZE;
+                       zdev->max_exp_bit_length = PCIXCC_MAX_MOD_SIZE;
                }
                break;
        case AP_DEVICE_TYPE_CEX2C:
                zdev->speed_rating = CEX2C_SPEED_RATING;
                zdev->min_mod_size = PCIXCC_MIN_MOD_SIZE;
                zdev->max_mod_size = PCIXCC_MAX_MOD_SIZE;
+               zdev->max_exp_bit_length = PCIXCC_MAX_MOD_SIZE;
                break;
        case AP_DEVICE_TYPE_CEX3C:
                zdev->user_space_type = ZCRYPT_CEX3C;
                zdev->speed_rating = CEX3C_SPEED_RATING;
                zdev->min_mod_size = CEX3C_MIN_MOD_SIZE;
                zdev->max_mod_size = CEX3C_MAX_MOD_SIZE;
+               zdev->max_exp_bit_length = CEX3C_MAX_MOD_SIZE;
                break;
        default:
                goto out_free;