if (rc == -EAGAIN)
                                tr.again_counter++;
                } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX);
+       if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX)
+               rc = -EIO;
        if (rc) {
                ZCRYPT_DBF(DBF_DEBUG, "ioctl ICARSAMODEXPO rc=%d\n", rc);
                return rc;
                        if (rc == -EAGAIN)
                                tr.again_counter++;
                } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX);
+       if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX)
+               rc = -EIO;
        if (rc) {
                ZCRYPT_DBF(DBF_DEBUG, "ioctl ICARSACRT rc=%d\n", rc);
                return rc;
                        if (rc == -EAGAIN)
                                tr.again_counter++;
                } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX);
+       if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX)
+               rc = -EIO;
        if (rc)
                ZCRYPT_DBF(DBF_DEBUG, "ioctl ZSENDCPRB rc=%d status=0x%x\n",
                           rc, xcRB.status);
                        if (rc == -EAGAIN)
                                tr.again_counter++;
                } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX);
+       if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX)
+               rc = -EIO;
        if (rc)
                ZCRYPT_DBF(DBF_DEBUG, "ioctl ZSENDEP11CPRB rc=%d\n", rc);
        if (copy_to_user(uxcrb, &xcrb, sizeof(xcrb)))
                        if (rc == -EAGAIN)
                                tr.again_counter++;
                } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX);
+       if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX)
+               rc = -EIO;
        if (rc)
                return rc;
        return put_user(mex64.outputdatalength,
                        if (rc == -EAGAIN)
                                tr.again_counter++;
                } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX);
+       if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX)
+               rc = -EIO;
        if (rc)
                return rc;
        return put_user(crt64.outputdatalength,
                        if (rc == -EAGAIN)
                                tr.again_counter++;
                } while (rc == -EAGAIN && tr.again_counter < TRACK_AGAIN_MAX);
+       if (rc == -EAGAIN && tr.again_counter >= TRACK_AGAIN_MAX)
+               rc = -EIO;
        xcRB32.reply_control_blk_length = xcRB64.reply_control_blk_length;
        xcRB32.reply_data_length = xcRB64.reply_data_length;
        xcRB32.status = xcRB64.status;