Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 194354
b: refs/heads/master
c: 96021f0
h: refs/heads/master
v: v3
  • Loading branch information
Dan Williams authored and John W. Linville committed Apr 16, 2010
1 parent 4bac2a8 commit 885cfae
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 64 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: edbe056a5a70aac20127189ca99d042640fd3366
refs/heads/master: 96021f096e5178582af296a2fbb6df7dbd6b695c
98 changes: 35 additions & 63 deletions trunk/drivers/net/wireless/libertas/if_sdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -314,12 +314,28 @@ static int if_sdio_handle_event(struct if_sdio_card *card,
return ret;
}

static int if_sdio_wait_status(struct if_sdio_card *card, const u8 condition)
{
u8 status;
unsigned long timeout;
int ret = 0;

timeout = jiffies + HZ;
while (1) {
status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
if (ret || (status & condition))
break;
if (time_after(jiffies, timeout))
return -ETIMEDOUT;
mdelay(1);
}
return ret;
}

static int if_sdio_card_to_host(struct if_sdio_card *card)
{
int ret;
u8 status;
u16 size, type, chunk;
unsigned long timeout;

lbs_deb_enter(LBS_DEB_SDIO);

Expand All @@ -334,19 +350,9 @@ static int if_sdio_card_to_host(struct if_sdio_card *card)
goto out;
}

timeout = jiffies + HZ;
while (1) {
status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
if (ret)
goto out;
if (status & IF_SDIO_IO_RDY)
break;
if (time_after(jiffies, timeout)) {
ret = -ETIMEDOUT;
goto out;
}
mdelay(1);
}
ret = if_sdio_wait_status(card, IF_SDIO_IO_RDY);
if (ret)
goto out;

/*
* The transfer must be in one transaction or the firmware
Expand Down Expand Up @@ -413,8 +419,6 @@ static void if_sdio_host_to_card_worker(struct work_struct *work)
{
struct if_sdio_card *card;
struct if_sdio_packet *packet;
unsigned long timeout;
u8 status;
int ret;
unsigned long flags;

Expand All @@ -434,25 +438,15 @@ static void if_sdio_host_to_card_worker(struct work_struct *work)

sdio_claim_host(card->func);

timeout = jiffies + HZ;
while (1) {
status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
if (ret)
goto release;
if (status & IF_SDIO_IO_RDY)
break;
if (time_after(jiffies, timeout)) {
ret = -ETIMEDOUT;
goto release;
}
mdelay(1);
ret = if_sdio_wait_status(card, IF_SDIO_IO_RDY);
if (ret == 0) {
ret = sdio_writesb(card->func, card->ioport,
packet->buffer, packet->nb);
}

ret = sdio_writesb(card->func, card->ioport,
packet->buffer, packet->nb);
if (ret)
goto release;
release:
lbs_pr_err("error %d sending packet to firmware\n", ret);

sdio_release_host(card->func);

kfree(packet);
Expand All @@ -465,10 +459,11 @@ static void if_sdio_host_to_card_worker(struct work_struct *work)
/* Firmware */
/********************************************************************/

#define FW_DL_READY_STATUS (IF_SDIO_IO_RDY | IF_SDIO_DL_RDY)

static int if_sdio_prog_helper(struct if_sdio_card *card)
{
int ret;
u8 status;
const struct firmware *fw;
unsigned long timeout;
u8 *chunk_buffer;
Expand Down Expand Up @@ -500,20 +495,9 @@ static int if_sdio_prog_helper(struct if_sdio_card *card)
size = fw->size;

while (size) {
timeout = jiffies + HZ;
while (1) {
status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
if (ret)
goto release;
if ((status & IF_SDIO_IO_RDY) &&
(status & IF_SDIO_DL_RDY))
break;
if (time_after(jiffies, timeout)) {
ret = -ETIMEDOUT;
goto release;
}
mdelay(1);
}
ret = if_sdio_wait_status(card, FW_DL_READY_STATUS);
if (ret)
goto release;

chunk_size = min(size, (size_t)60);

Expand Down Expand Up @@ -583,7 +567,6 @@ static int if_sdio_prog_helper(struct if_sdio_card *card)
static int if_sdio_prog_real(struct if_sdio_card *card)
{
int ret;
u8 status;
const struct firmware *fw;
unsigned long timeout;
u8 *chunk_buffer;
Expand Down Expand Up @@ -615,20 +598,9 @@ static int if_sdio_prog_real(struct if_sdio_card *card)
size = fw->size;

while (size) {
timeout = jiffies + HZ;
while (1) {
status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
if (ret)
goto release;
if ((status & IF_SDIO_IO_RDY) &&
(status & IF_SDIO_DL_RDY))
break;
if (time_after(jiffies, timeout)) {
ret = -ETIMEDOUT;
goto release;
}
mdelay(1);
}
ret = if_sdio_wait_status(card, FW_DL_READY_STATUS);
if (ret)
goto release;

req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, &ret);
if (ret)
Expand Down

0 comments on commit 885cfae

Please sign in to comment.