Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 690142e9 authored by Mircea Gherzan's avatar Mircea Gherzan Committed by Luciano Coelho
Browse files

wl12xx: fix DMA-API-related warnings



On the PandaBoard (omap_hsmmc + wl12xx_sdio) with DMA_API_DEBUG:

 WARNING: at lib/dma-debug.c:930 check_for_stack.part.8+0x7c/0xe0()
 omap_hsmmc omap_hsmmc.4: DMA-API: device driver maps memory fromstack

Signed-off-by: default avatarMircea Gherzan <mgherzan@gmail.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent c56dbd57
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -83,14 +83,22 @@ static void wl1271_parse_fw_ver(struct wl1271 *wl)

static void wl1271_boot_fw_version(struct wl1271 *wl)
{
	struct wl1271_static_data static_data;
	struct wl1271_static_data *static_data;

	wl1271_read(wl, wl->cmd_box_addr, &static_data, sizeof(static_data),
	static_data = kmalloc(sizeof(*static_data), GFP_DMA);
	if (!static_data) {
		__WARN();
		return;
	}

	wl1271_read(wl, wl->cmd_box_addr, static_data, sizeof(*static_data),
		    false);

	strncpy(wl->chip.fw_ver_str, static_data.fw_version,
	strncpy(wl->chip.fw_ver_str, static_data->fw_version,
		sizeof(wl->chip.fw_ver_str));

	kfree(static_data);

	/* make sure the string is NULL-terminated */
	wl->chip.fw_ver_str[sizeof(wl->chip.fw_ver_str) - 1] = '\0';

+16 −9
Original line number Diff line number Diff line
@@ -342,8 +342,12 @@ int wl1271_cmd_ext_radio_parms(struct wl1271 *wl)
 */
static int wl1271_cmd_wait_for_event_or_timeout(struct wl1271 *wl, u32 mask)
{
	u32 events_vector, event;
	u32 *events_vector;
	u32 event;
	unsigned long timeout;
	int ret = 0;

	events_vector = kmalloc(sizeof(*events_vector), GFP_DMA);

	timeout = jiffies + msecs_to_jiffies(WL1271_EVENT_TIMEOUT);

@@ -351,21 +355,24 @@ static int wl1271_cmd_wait_for_event_or_timeout(struct wl1271 *wl, u32 mask)
		if (time_after(jiffies, timeout)) {
			wl1271_debug(DEBUG_CMD, "timeout waiting for event %d",
				     (int)mask);
			return -ETIMEDOUT;
			ret = -ETIMEDOUT;
			goto out;
		}

		msleep(1);

		/* read from both event fields */
		wl1271_read(wl, wl->mbox_ptr[0], &events_vector,
			    sizeof(events_vector), false);
		event = events_vector & mask;
		wl1271_read(wl, wl->mbox_ptr[1], &events_vector,
			    sizeof(events_vector), false);
		event |= events_vector & mask;
		wl1271_read(wl, wl->mbox_ptr[0], events_vector,
			    sizeof(*events_vector), false);
		event = *events_vector & mask;
		wl1271_read(wl, wl->mbox_ptr[1], events_vector,
			    sizeof(*events_vector), false);
		event |= *events_vector & mask;
	} while (!event);

	return 0;
out:
	kfree(events_vector);
	return ret;
}

static int wl1271_cmd_wait_for_event(struct wl1271 *wl, u32 mask)
+5 −5
Original line number Diff line number Diff line
@@ -98,8 +98,9 @@ static void wl1271_event_mbox_dump(struct event_mailbox *mbox)
	wl1271_debug(DEBUG_EVENT, "\tmask: 0x%x", mbox->events_mask);
}

static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
static int wl1271_event_process(struct wl1271 *wl)
{
	struct event_mailbox *mbox = wl->mbox;
	struct ieee80211_vif *vif;
	struct wl12xx_vif *wlvif;
	u32 vector;
@@ -289,7 +290,6 @@ void wl1271_event_mbox_config(struct wl1271 *wl)

int wl1271_event_handle(struct wl1271 *wl, u8 mbox_num)
{
	struct event_mailbox mbox;
	int ret;

	wl1271_debug(DEBUG_EVENT, "EVENT on mbox %d", mbox_num);
@@ -298,11 +298,11 @@ int wl1271_event_handle(struct wl1271 *wl, u8 mbox_num)
		return -EINVAL;

	/* first we read the mbox descriptor */
	wl1271_read(wl, wl->mbox_ptr[mbox_num], &mbox,
		    sizeof(struct event_mailbox), false);
	wl1271_read(wl, wl->mbox_ptr[mbox_num], wl->mbox,
		    sizeof(*wl->mbox), false);

	/* process the descriptor */
	ret = wl1271_event_process(wl, &mbox);
	ret = wl1271_event_process(wl);
	if (ret < 0)
		return ret;

+2 −0
Original line number Diff line number Diff line
@@ -132,6 +132,8 @@ struct event_mailbox {
	u8 reserved_8[9];
} __packed;

struct wl1271;

int wl1271_event_unmask(struct wl1271 *wl);
void wl1271_event_mbox_config(struct wl1271 *wl);
int wl1271_event_handle(struct wl1271 *wl, u8 mbox);
+9 −0
Original line number Diff line number Diff line
@@ -5375,8 +5375,17 @@ static struct ieee80211_hw *wl1271_alloc_hw(void)
		goto err_dummy_packet;
	}

	wl->mbox = kmalloc(sizeof(*wl->mbox), GFP_DMA);
	if (!wl->mbox) {
		ret = -ENOMEM;
		goto err_fwlog;
	}

	return hw;

err_fwlog:
	free_page((unsigned long)wl->fwlog);

err_dummy_packet:
	dev_kfree_skb(wl->dummy_packet);

Loading