#ifndef __COMMON_H__
 #define __COMMON_H__
 
+#include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
+#include <linux/io.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/pci.h>
        u32   sizeofzops;
 };
 
+static inline int zip_poll_result(union zip_zres_s *result)
+{
+       int retries = 1000;
+
+       while (!result->s.compcode) {
+               if (!--retries) {
+                       pr_err("ZIP ERR: request timed out");
+                       return -ETIMEDOUT;
+               }
+               udelay(10);
+               /*
+                * Force re-reading of compcode which is updated
+                * by the ZIP coprocessor.
+                */
+               rmb();
+       }
+       return 0;
+}
+
 /* error messages */
 #define zip_err(fmt, args...) pr_err("ZIP ERR:%s():%d: " \
                              fmt "\n", __func__, __LINE__, ## args)
 
        /* Stats update for compression requests submitted */
        atomic64_inc(&zip_dev->stats.comp_req_submit);
 
-       while (!result_ptr->s.compcode)
-               continue;
+       /* Wait for completion or error */
+       zip_poll_result(result_ptr);
 
        /* Stats update for compression requests completed */
        atomic64_inc(&zip_dev->stats.comp_req_complete);
 
        /* Decompression requests submitted stats update */
        atomic64_inc(&zip_dev->stats.decomp_req_submit);
 
-       while (!result_ptr->s.compcode)
-               continue;
+       /* Wait for completion or error */
+       zip_poll_result(result_ptr);
 
        /* Decompression requests completed stats update */
        atomic64_inc(&zip_dev->stats.decomp_req_complete);