wimax/i2400m: fix the bootmode RX deadlock in SDIO driver
authorCindy H Kao <cindy.h.kao@intel.com>
Thu, 27 Aug 2009 22:25:12 +0000 (15:25 -0700)
committerInaky Perez-Gonzalez <inaky@linux.intel.com>
Mon, 19 Oct 2009 06:55:33 +0000 (15:55 +0900)
commit5b45bfe5010ae1ddaac463d1bcdb141a4ff4ff66
tree8115ce638a420e4ba6610ea6c2e126ddb9180b86
parent663ebb4aa2fd0d19e3d1da0fed3fa3fa134a4ef0
wimax/i2400m: fix the bootmode RX deadlock in SDIO driver

i2400ms_bus_bm_wait_for_ack() causes a race condition. It happens
because this function clears i2400ms->bm_ack_size before waiting for
an interrupt, which is set by the interrupt service routine i2400ms_rx()
to indicate reception and size of received data; thus, if the interrupt
came right before the clearing/waiting, it is lost.

The fix is clear the bm_ack_size to -EINPROGRESS before we are enabling
the RX interrupt configuration in i2400ms_rx_setup(). Then everytime
when the interrupt service routine i2400ms_rx() is invoked during bootmode,
bm_ack_size is updated with the actual rx_size and it is cleared to
-EINPROGRESS again after the RX data is handled.

Signed-off-by: Cindy H Kao <cindy.h.kao@intel.com>
Signed-off-by: Inaky Perez-Gonzalez <inaky@linux.intel.com>
drivers/net/wimax/i2400m/sdio-fw.c
drivers/net/wimax/i2400m/sdio-rx.c