The AR6000 driver uses A_MDELAY with sometimes long delays at several places. A_MDELAY is just another name for "mdelay", which is a busy loop. All these delays appear to occur in a context where we can sleep, so it's better to use "msleep" instead.
This includes the "big fat mdelay(2000)" Balaji found in the suspend path: http://lists.openmoko.org/pipermail/openmoko-kernel/2008-December/007171.html Note that only the ones in DevPollMboxMsgRecv and ar6000_reset_device are actually invoked in normal use, and only during initialization and shutdown, respectively. So the impact on overall system performance is small. Signed-off-by: Werner Almesberger <[email protected]> --- Index: ktrack/drivers/ar6000/htc/ar6k.c =================================================================== --- ktrack.orig/drivers/ar6000/htc/ar6k.c 2009-01-17 18:31:58.000000000 -0200 +++ ktrack/drivers/ar6000/htc/ar6k.c 2009-01-17 18:58:29.000000000 -0200 @@ -723,7 +723,7 @@ } /* delay a little, target may not be ready */ - A_MDELAY(1000); + msleep(1000); } Index: ktrack/drivers/ar6000/htc/ar6k_events.c =================================================================== --- ktrack.orig/drivers/ar6000/htc/ar6k_events.c 2009-01-17 18:31:58.000000000 -0200 +++ ktrack/drivers/ar6000/htc/ar6k_events.c 2009-01-17 18:59:09.000000000 -0200 @@ -131,7 +131,7 @@ } /* delay a little */ - A_MDELAY(DELAY_PER_INTERVAL_MS); + msleep(DELAY_PER_INTERVAL_MS); AR_DEBUG_PRINTF(ATH_DEBUG_RECV,(" Retry Mbox Poll : %d \n",timeout)); } Index: ktrack/drivers/ar6000/miscdrv/common_drv.c =================================================================== --- ktrack.orig/drivers/ar6000/miscdrv/common_drv.c 2009-01-17 18:31:58.000000000 -0200 +++ ktrack/drivers/ar6000/miscdrv/common_drv.c 2009-01-17 18:58:46.000000000 -0200 @@ -311,7 +311,7 @@ } } - A_MDELAY(50); /* delay to allow dragon to come to BMI phase */ + msleep(50); /* delay to allow dragon to come to BMI phase */ return A_OK; } @@ -350,7 +350,7 @@ * Read back the RESET CAUSE register to ensure that the cold reset * went through. */ - A_MDELAY(2000); /* 2 second delay to allow things to settle down */ + msleep(2000); /* 2 second delay to allow things to settle down */ // address = RESET_CAUSE_ADDRESS;
