linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / arch / powerpc / kernel / rtas_flash.c
index 1442b63..aaf384c 100644 (file)
@@ -365,12 +365,20 @@ static int rtas_excl_release(struct inode *inode, struct file *file)
 
 static void manage_flash(struct rtas_manage_flash_t *args_buf)
 {
+       unsigned int wait_time;
        s32 rc;
 
-       do {
+       while (1) {
                rc = rtas_call(rtas_token("ibm,manage-flash-image"), 1, 
                               1, NULL, args_buf->op);
-       } while (rtas_busy_delay(rc));
+               if (rc == RTAS_RC_BUSY)
+                       udelay(1);
+               else if (rtas_is_extended_busy(rc)) {
+                       wait_time = rtas_extended_busy_delay_time(rc);
+                       udelay(wait_time * 1000);
+               } else
+                       break;
+       }
 
        args_buf->status = rc;
 }
@@ -443,18 +451,27 @@ static ssize_t manage_flash_write(struct file *file, const char __user *buf,
 static void validate_flash(struct rtas_validate_flash_t *args_buf)
 {
        int token = rtas_token("ibm,validate-flash-image");
+       unsigned int wait_time;
        int update_results;
        s32 rc; 
 
        rc = 0;
-       do {
+       while(1) {
                spin_lock(&rtas_data_buf_lock);
                memcpy(rtas_data_buf, args_buf->buf, VALIDATE_BUF_SIZE);
                rc = rtas_call(token, 2, 2, &update_results, 
                               (u32) __pa(rtas_data_buf), args_buf->buf_size);
                memcpy(args_buf->buf, rtas_data_buf, VALIDATE_BUF_SIZE);
                spin_unlock(&rtas_data_buf_lock);
-       } while (rtas_busy_delay(rc));
+                       
+               if (rc == RTAS_RC_BUSY)
+                       udelay(1);
+               else if (rtas_is_extended_busy(rc)) {
+                       wait_time = rtas_extended_busy_delay_time(rc);
+                       udelay(wait_time * 1000);
+               } else
+                       break;
+       }
 
        args_buf->status = rc;
        args_buf->update_results = update_results;