Skip to content

Commit

Permalink
wl12xx: fix rx descriptor use
Browse files Browse the repository at this point in the history
Rx descriptor was incorrectly allocated from stack, use struct wl12xx
instead. Needed for DMA transfers.

Signed-off-by: Kalle Valo <kalle.valo@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Kalle Valo authored and John W. Linville committed Jul 10, 2009
1 parent 53d6542 commit 4721213
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 5 deletions.
14 changes: 14 additions & 0 deletions drivers/net/wireless/wl12xx/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1261,6 +1261,13 @@ static int __devinit wl12xx_probe(struct spi_device *spi)
wl->tx_mgmt_frm_rate = DEFAULT_HW_GEN_TX_RATE;
wl->tx_mgmt_frm_mod = DEFAULT_HW_GEN_MODULATION_TYPE;

wl->rx_descriptor = kmalloc(sizeof(*wl->rx_descriptor), GFP_KERNEL);
if (!wl->rx_descriptor) {
wl12xx_error("could not allocate memory for rx descriptor");
ret = -ENOMEM;
goto out_free;
}

/* This is the only SPI value that we need to set here, the rest
* comes from the board-peripherals file */
spi->bits_per_word = 32;
Expand Down Expand Up @@ -1313,6 +1320,9 @@ static int __devinit wl12xx_probe(struct spi_device *spi)
free_irq(wl->irq, wl);

out_free:
kfree(wl->rx_descriptor);
wl->rx_descriptor = NULL;

ieee80211_free_hw(hw);

return ret;
Expand All @@ -1333,6 +1343,10 @@ static int __devexit wl12xx_remove(struct spi_device *spi)
wl->fw = NULL;
kfree(wl->nvs);
wl->nvs = NULL;

kfree(wl->rx_descriptor);
wl->rx_descriptor = NULL;

ieee80211_free_hw(wl->hw);

return 0;
Expand Down
11 changes: 6 additions & 5 deletions drivers/net/wireless/wl12xx/rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ static void wl12xx_rx_header(struct wl12xx *wl,
if (wl->rx_current_buffer)
rx_packet_ring_addr += wl->data_path->rx_packet_ring_chunk_size;

wl12xx_spi_mem_read(wl, rx_packet_ring_addr, desc,
sizeof(struct wl12xx_rx_descriptor));
wl12xx_spi_mem_read(wl, rx_packet_ring_addr, desc, sizeof(*desc));
}

static void wl12xx_rx_status(struct wl12xx *wl,
Expand Down Expand Up @@ -175,16 +174,18 @@ static void wl12xx_rx_ack(struct wl12xx *wl)

void wl12xx_rx(struct wl12xx *wl)
{
struct wl12xx_rx_descriptor rx_desc;
struct wl12xx_rx_descriptor *rx_desc;

if (wl->state != WL12XX_STATE_ON)
return;

rx_desc = wl->rx_descriptor;

/* We first read the frame's header */
wl12xx_rx_header(wl, &rx_desc);
wl12xx_rx_header(wl, rx_desc);

/* Now we can read the body */
wl12xx_rx_body(wl, &rx_desc);
wl12xx_rx_body(wl, rx_desc);

/* Finally, we need to ACK the RX */
wl12xx_rx_ack(wl);
Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/wl12xx/wl12xx.h
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@ struct wl12xx {
u32 buffer_32;
u32 buffer_cmd;
u8 buffer_busyword[WL12XX_BUSY_WORD_LEN];
struct wl12xx_rx_descriptor *rx_descriptor;
};

int wl12xx_plt_start(struct wl12xx *wl);
Expand Down

0 comments on commit 4721213

Please sign in to comment.