struct crb_priv *priv = dev_get_drvdata(&chip->dev);
        unsigned int expected;
 
-       /* sanity check */
-       if (count < 6)
+       /* A sanity check that the upper layer wants to get at least the header
+        * as that is the minimum size for any TPM response.
+        */
+       if (count < TPM_HEADER_SIZE)
                return -EIO;
 
+       /* If this bit is set, according to the spec, the TPM is in
+        * unrecoverable condition.
+        */
        if (ioread32(&priv->regs_t->ctrl_sts) & CRB_CTRL_STS_ERROR)
                return -EIO;
 
-       memcpy_fromio(buf, priv->rsp, 6);
-       expected = be32_to_cpup((__be32 *) &buf[2]);
-       if (expected > count || expected < 6)
+       /* Read the first 8 bytes in order to get the length of the response.
+        * We read exactly a quad word in order to make sure that the remaining
+        * reads will be aligned.
+        */
+       memcpy_fromio(buf, priv->rsp, 8);
+
+       expected = be32_to_cpup((__be32 *)&buf[2]);
+       if (expected > count || expected < TPM_HEADER_SIZE)
                return -EIO;
 
-       memcpy_fromio(&buf[6], &priv->rsp[6], expected - 6);
+       memcpy_fromio(&buf[8], &priv->rsp[8], expected - 8);
 
        return expected;
 }