From: Domen Puncer Use msleep_interruptible() instead of schedule_timeout() to guarantee the task delays as expected. Also remove macro MS_TO_HZ() and replace with msecs_to_jiffies(). Signed-off-by: Nishanth Aravamudan Signed-off-by: Domen Puncer Acked-by:: Benjamin Herrenschmidt Signed-off-by: Andrew Morton --- 25-akpm/drivers/macintosh/mediabay.c | 32 +++++++++++++------------------- 1 files changed, 13 insertions(+), 19 deletions(-) diff -puN drivers/macintosh/mediabay.c~macintosh-mediabay-replace-schedule_timeout-with-msleep_interruptible drivers/macintosh/mediabay.c --- 25/drivers/macintosh/mediabay.c~macintosh-mediabay-replace-schedule_timeout-with-msleep_interruptible 2005-03-07 22:11:23.000000000 -0800 +++ 25-akpm/drivers/macintosh/mediabay.c 2005-03-07 22:11:23.000000000 -0800 @@ -98,11 +98,6 @@ int media_bay_count = 0; #define MB_IDE_READY(i) ((readb(media_bays[i].cd_base + 0x70) & 0x80) == 0) #endif -/* Note: All delays are not in milliseconds and converted to HZ relative - * values by the macro below - */ -#define MS_TO_HZ(ms) ((ms * HZ + 999) / 1000) - /* * Wait that number of ms between each step in normal polling mode */ @@ -384,7 +379,7 @@ static inline void __pmac set_mb_power(s bay->state = mb_powering_down; MBDBG("mediabay%d: powering down\n", bay->index); } - bay->timer = MS_TO_HZ(MB_POWER_DELAY); + bay->timer = msecs_to_jiffies(MB_POWER_DELAY); } static void __pmac poll_media_bay(struct media_bay_info* bay) @@ -393,8 +388,8 @@ static void __pmac poll_media_bay(struct if (id == bay->last_value) { if (id != bay->content_id) { - bay->value_count += MS_TO_HZ(MB_POLL_DELAY); - if (bay->value_count >= MS_TO_HZ(MB_STABLE_DELAY)) { + bay->value_count += msecs_to_jiffies(MB_POLL_DELAY); + if (bay->value_count >= msecs_to_jiffies(MB_STABLE_DELAY)) { /* If the device type changes without going thru * "MB_NO", we force a pass by "MB_NO" to make sure * things are properly reset @@ -504,7 +499,7 @@ static void __pmac media_bay_step(int i) /* If timer expired or polling IDE busy, run state machine */ if ((bay->state != mb_ide_waiting) && (bay->timer != 0)) { - bay->timer -= MS_TO_HZ(MB_POLL_DELAY); + bay->timer -= msecs_to_jiffies(MB_POLL_DELAY); if (bay->timer > 0) return; bay->timer = 0; @@ -517,13 +512,13 @@ static void __pmac media_bay_step(int i) set_mb_power(bay, 0); break; } - bay->timer = MS_TO_HZ(MB_RESET_DELAY); + bay->timer = msecs_to_jiffies(MB_RESET_DELAY); bay->state = mb_enabling_bay; MBDBG("mediabay%d: enabling (kind:%d)\n", i, bay->content_id); break; case mb_enabling_bay: bay->ops->un_reset(bay); - bay->timer = MS_TO_HZ(MB_SETUP_DELAY); + bay->timer = msecs_to_jiffies(MB_SETUP_DELAY); bay->state = mb_resetting; MBDBG("mediabay%d: waiting reset (kind:%d)\n", i, bay->content_id); break; @@ -537,7 +532,7 @@ static void __pmac media_bay_step(int i) #ifdef CONFIG_BLK_DEV_IDE MBDBG("mediabay%d: waiting IDE reset (kind:%d)\n", i, bay->content_id); bay->ops->un_reset_ide(bay); - bay->timer = MS_TO_HZ(MB_IDE_WAIT); + bay->timer = msecs_to_jiffies(MB_IDE_WAIT); bay->state = mb_ide_resetting; #else printk(KERN_DEBUG "media-bay %d is ide (not compiled in kernel)\n", i); @@ -547,7 +542,7 @@ static void __pmac media_bay_step(int i) #ifdef CONFIG_BLK_DEV_IDE case mb_ide_resetting: - bay->timer = MS_TO_HZ(MB_IDE_TIMEOUT); + bay->timer = msecs_to_jiffies(MB_IDE_TIMEOUT); bay->state = mb_ide_waiting; MBDBG("mediabay%d: waiting IDE ready (kind:%d)\n", i, bay->content_id); break; @@ -583,7 +578,7 @@ static void __pmac media_bay_step(int i) } break; } else if (bay->timer > 0) - bay->timer -= MS_TO_HZ(MB_POLL_DELAY); + bay->timer -= msecs_to_jiffies(MB_POLL_DELAY); if (bay->timer <= 0) { printk("\nIDE Timeout in bay %d !, IDE state is: 0x%02x\n", i, readb(bay->cd_base + 0x70)); @@ -641,8 +636,7 @@ static int __pmac media_bay_task(void *x up(&media_bays[i].lock); } - current->state = TASK_INTERRUPTIBLE; - schedule_timeout(MS_TO_HZ(MB_POLL_DELAY)); + msleep_interruptible(MB_POLL_DELAY); if (signal_pending(current)) return 0; } @@ -691,7 +685,7 @@ static int __devinit media_bay_attach(st msleep(MB_POWER_DELAY); bay->content_id = MB_NO; bay->last_value = bay->ops->content(bay); - bay->value_count = MS_TO_HZ(MB_STABLE_DELAY); + bay->value_count = msecs_to_jiffies(MB_STABLE_DELAY); bay->state = mb_empty; do { msleep(MB_POLL_DELAY); @@ -747,8 +741,8 @@ static int __pmac media_bay_resume(struc } set_mb_power(bay, 1); bay->last_value = bay->content_id; - bay->value_count = MS_TO_HZ(MB_STABLE_DELAY); - bay->timer = MS_TO_HZ(MB_POWER_DELAY); + bay->value_count = msecs_to_jiffies(MB_STABLE_DELAY); + bay->timer = msecs_to_jiffies(MB_POWER_DELAY); #ifdef CONFIG_BLK_DEV_IDE bay->cd_retry = 0; #endif _