int reg2, int bit2, int val2, int wait)
 {
        struct NCR5380_hostdata *hostdata = shost_priv(instance);
+       unsigned long n = hostdata->poll_loops;
        unsigned long deadline = jiffies + wait;
-       unsigned long n;
 
-       /* Busy-wait for up to 10 ms */
-       n = min(10000U, jiffies_to_usecs(wait));
-       n *= hostdata->accesses_per_ms;
-       n /= 2000;
        do {
                if ((NCR5380_read(reg1) & bit1) == val1)
                        return 0;
        struct NCR5380_hostdata *hostdata = shost_priv(instance);
        int i;
        unsigned long deadline;
+       unsigned long accesses_per_ms;
 
        instance->max_lun = 7;
 
                ++i;
                cpu_relax();
        } while (time_is_after_jiffies(deadline));
-       hostdata->accesses_per_ms = i / 256;
+       accesses_per_ms = i / 256;
+       hostdata->poll_loops = NCR5380_REG_POLL_TIME * accesses_per_ms / 2;
 
        return 0;
 }
 
                                           * transfer to handle chip overruns */
        struct work_struct main_task;
        struct workqueue_struct *work_q;
-       unsigned long accesses_per_ms;  /* chip register accesses per ms */
+       unsigned long poll_loops;               /* register polling limit */
 };
 
 #ifdef __KERNEL__
 
 #define NCR5380_PIO_CHUNK_SIZE         256
 
+/* Time limit (ms) to poll registers when IRQs are disabled, e.g. during PDMA */
+#define NCR5380_REG_POLL_TIME          10
+
 static inline struct scsi_cmnd *NCR5380_to_scmd(struct NCR5380_cmd *ncmd_ptr)
 {
        return ((struct scsi_cmnd *)ncmd_ptr) - 1;