The airo driver is calling schedule() under spinlocking (the seq_file interface via airo_get_stats(), for one). It's just waiting for the hardware to return a result - busywait for it. drivers/net/wireless/airo.c | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) diff -puN drivers/net/wireless/airo.c~airo-schedule-fix drivers/net/wireless/airo.c --- 25/drivers/net/wireless/airo.c~airo-schedule-fix 2003-04-21 20:15:35.000000000 -0700 +++ 25-akpm/drivers/net/wireless/airo.c 2003-04-21 20:15:35.000000000 -0700 @@ -44,6 +44,7 @@ #include #include #include +#include #include #ifdef CONFIG_PCI @@ -2379,20 +2380,26 @@ static u16 setup_card(struct airo_info * static u16 issuecommand(struct airo_info *ai, Cmd *pCmd, Resp *pRsp) { // Im really paranoid about letting it run forever! int max_tries = 600000; + static int max = 0; + int count = 0; if (sendcommand(ai, pCmd) == (u16)ERROR) return ERROR; while (max_tries-- && (IN4500(ai, EVSTAT) & EV_CMD) == 0) { - if (!in_interrupt() && (max_tries & 255) == 0) - schedule(); + udelay(1); + count++; } - if ( max_tries == -1 ) { + if (max_tries == -1) { printk( KERN_ERR "airo: Max tries exceeded waiting for command\n" ); return ERROR; } completecommand(ai, pRsp); + if (count > max) { + max = count; + printk("%s: max delay = %d usec\n", __FUNCTION__, max); + } return SUCCESS; } _