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

Commit 3719c17e authored by Shahar Patury's avatar Shahar Patury Committed by Kalle Valo
Browse files

wlcore/wl18xx: fw logger over sdio



Enable the FW Logger to work over the SDIO interface in addition to over UART
interface. In the new design we use fw internal memory instead of packet ram
that was used in older (wl12xx) design. This change reduces the impact on TP
and stability.

A new event was added to notify fw logger is ready for reading. Dynamic
configuration to debugfs was added as well.

Signed-off-by: default avatarShahar Patury <shaharp@ti.com>
Signed-off-by: default avatarGuy Mishol <guym@ti.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 0510931e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -205,6 +205,8 @@ int wl18xx_process_mailbox_events(struct wl1271 *wl)
						 mbox->sc_ssid,
						 mbox->sc_pwd_len,
						 mbox->sc_pwd);
	if (vector & FW_LOGGER_INDICATION)
		wlcore_event_fw_logger(wl);

	return 0;
}
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ enum {
	SMART_CONFIG_SYNC_EVENT_ID               = BIT(22),
	SMART_CONFIG_DECODE_EVENT_ID             = BIT(23),
	TIME_SYNC_EVENT_ID                       = BIT(24),
	FW_LOGGER_INDICATION			= BIT(25),
};

enum wl18xx_radar_types {
+5 −4
Original line number Diff line number Diff line
@@ -472,7 +472,7 @@ static struct wlcore_conf wl18xx_conf = {
	},
	.fwlog = {
		.mode                         = WL12XX_FWLOG_CONTINUOUS,
		.mem_blocks                   = 2,
		.mem_blocks                   = 0,
		.severity                     = 0,
		.timestamp                    = WL12XX_FWLOG_TIMESTAMP_DISABLED,
		.output                       = WL12XX_FWLOG_OUTPUT_DBG_PINS,
@@ -595,7 +595,7 @@ static const struct wlcore_partition_set wl18xx_ptable[PART_TABLE_LEN] = {
		.mem  = { .start = 0x00A00000, .size  = 0x00012000 },
		.reg  = { .start = 0x00807000, .size  = 0x00005000 },
		.mem2 = { .start = 0x00800000, .size  = 0x0000B000 },
		.mem3 = { .start = 0x00000000, .size  = 0x00000000 },
		.mem3 = { .start = 0x00401594, .size  = 0x00001020 },
	},
	[PART_DOWN] = {
		.mem  = { .start = 0x00000000, .size  = 0x00014000 },
@@ -613,7 +613,7 @@ static const struct wlcore_partition_set wl18xx_ptable[PART_TABLE_LEN] = {
		.mem  = { .start = 0x00800000, .size  = 0x000050FC },
		.reg  = { .start = 0x00B00404, .size  = 0x00001000 },
		.mem2 = { .start = 0x00C00000, .size  = 0x00000400 },
		.mem3 = { .start = 0x00000000, .size  = 0x00000000 },
		.mem3 = { .start = 0x00401594, .size  = 0x00001020 },
	},
	[PART_PHY_INIT] = {
		.mem  = { .start = WL18XX_PHY_INIT_MEM_ADDR,
@@ -1040,7 +1040,8 @@ static int wl18xx_boot(struct wl1271 *wl)
		DFS_CHANNELS_CONFIG_COMPLETE_EVENT |
		SMART_CONFIG_SYNC_EVENT_ID |
		SMART_CONFIG_DECODE_EVENT_ID |
		TIME_SYNC_EVENT_ID;
		TIME_SYNC_EVENT_ID |
		FW_LOGGER_INDICATION;

	wl->ap_event_mask = MAX_TX_FAILURE_EVENT_ID;

+0 −1
Original line number Diff line number Diff line
@@ -626,7 +626,6 @@ struct wl12xx_cmd_remove_peer {
 */
enum wl12xx_fwlogger_log_mode {
	WL12XX_FWLOG_CONTINUOUS,
	WL12XX_FWLOG_ON_DEMAND
};

/* Include/exclude timestamps from the log messages */
+60 −0
Original line number Diff line number Diff line
@@ -1234,6 +1234,65 @@ static const struct file_operations dev_mem_ops = {
	.llseek = dev_mem_seek,
};

static ssize_t fw_logger_read(struct file *file, char __user *user_buf,
			      size_t count, loff_t *ppos)
{
	struct wl1271 *wl = file->private_data;

	return wl1271_format_buffer(user_buf, count,
					ppos, "%d\n",
					wl->conf.fwlog.output);
}

static ssize_t fw_logger_write(struct file *file,
			       const char __user *user_buf,
			       size_t count, loff_t *ppos)
{
	struct wl1271 *wl = file->private_data;
	unsigned long value;
	int ret;

	ret = kstrtoul_from_user(user_buf, count, 0, &value);
	if (ret < 0) {
		wl1271_warning("illegal value in fw_logger");
		return -EINVAL;
	}

	if ((value > 2) || (value == 0)) {
		wl1271_warning("fw_logger value must be 1-UART 2-SDIO");
		return -ERANGE;
	}

	if (wl->conf.fwlog.output == 0) {
		wl1271_warning("iligal opperation - fw logger disabled by default, please change mode via wlconf");
		return -EINVAL;
	}

	mutex_lock(&wl->mutex);
	ret = wl1271_ps_elp_wakeup(wl);
	if (ret < 0) {
		count = ret;
		goto out;
	}

	wl->conf.fwlog.output = value;

	ret = wl12xx_cmd_config_fwlog(wl);

	wl1271_ps_elp_sleep(wl);

out:
	mutex_unlock(&wl->mutex);
	return count;
}

static const struct file_operations fw_logger_ops = {
	.open = simple_open,
	.read = fw_logger_read,
	.write = fw_logger_write,
	.llseek = default_llseek,
};

static int wl1271_debugfs_add_files(struct wl1271 *wl,
				    struct dentry *rootdir)
{
@@ -1260,6 +1319,7 @@ static int wl1271_debugfs_add_files(struct wl1271 *wl,
	DEBUGFS_ADD(irq_timeout, rootdir);
	DEBUGFS_ADD(fw_stats_raw, rootdir);
	DEBUGFS_ADD(sleep_auth, rootdir);
	DEBUGFS_ADD(fw_logger, rootdir);

	streaming = debugfs_create_dir("rx_streaming", rootdir);
	if (!streaming || IS_ERR(streaming))
Loading