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

Commit addb44be authored by Kalle Valo's avatar Kalle Valo
Browse files

ath6kl: cleanup diagnose window read and write functions



Just to make them a bit easier to read and unify naming. 32 suffix
in the function name means that it will be a 32 bit transfer. If there's
no number a buffer is transfered instead.

Use void pointers to get rid of ugly casts.

Don't provide target address as a pointer, pass it by value. Same for
the value used in write32().

Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 939f1cce
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -507,9 +507,9 @@ enum htc_send_full_action ath6kl_tx_queue_full(struct htc_target *target,
					       struct htc_packet *packet);
void ath6kl_stop_txrx(struct ath6kl *ar);
void ath6kl_cleanup_amsdu_rxbufs(struct ath6kl *ar);
int ath6kl_access_datadiag(struct ath6kl *ar, u32 address,
			   u8 *data, u32 length, bool read);
int ath6kl_read_reg_diag(struct ath6kl *ar, u32 *address, u32 *data);
int ath6kl_diag_write(struct ath6kl *ar, u32 address, void *data, u32 length);
int ath6kl_diag_read32(struct ath6kl *ar, u32 address, u32 *value);
int ath6kl_diag_read(struct ath6kl *ar, u32 address, void *data, u32 length);
void ath6kl_init_profile_info(struct ath6kl *ar);
void ath6kl_tx_data_cleanup(struct ath6kl *ar);
void ath6kl_stop_endpoint(struct net_device *dev, bool keep_profile,
+6 −10
Original line number Diff line number Diff line
@@ -133,14 +133,13 @@ static int ath6kl_set_host_app_area(struct ath6kl *ar)
	address = ath6kl_get_hi_item_addr(ar, HI_ITEM(hi_app_host_interest));
	address = TARG_VTOP(ar->target_type, address);

	if (ath6kl_read_reg_diag(ar, &address, &data))
	if (ath6kl_diag_read32(ar, address, &data))
		return -EIO;

	address = TARG_VTOP(ar->target_type, data);
	host_app_area.wmi_protocol_ver = WMI_PROTOCOL_VERSION;
	if (ath6kl_access_datadiag(ar, address,
				(u8 *)&host_app_area,
				sizeof(struct host_app_area), false))
	if (ath6kl_diag_write(ar, address, (u8 *) &host_app_area,
			      sizeof(struct host_app_area)))
		return -EIO;

	return 0;
@@ -377,7 +376,7 @@ static void ath6kl_dump_target_assert_info(struct ath6kl *ar)
	address = TARG_VTOP(ar->target_type, address);

	/* read RAM location through diagnostic window */
	status = ath6kl_read_reg_diag(ar, &address, &regdump_loc);
	status = ath6kl_diag_read32(ar, address, &regdump_loc);

	if (status || !regdump_loc) {
		ath6kl_err("failed to get ptr to register dump area\n");
@@ -389,11 +388,8 @@ static void ath6kl_dump_target_assert_info(struct ath6kl *ar)
	regdump_loc = TARG_VTOP(ar->target_type, regdump_loc);

	/* fetch register dump data */
	status = ath6kl_access_datadiag(ar,
					regdump_loc,
					(u8 *)&regdump_val[0],
					REG_DUMP_COUNT_AR6003 * (sizeof(u32)),
					true);
	status = ath6kl_diag_read(ar, regdump_loc, (u8 *)&regdump_val[0],
				  REG_DUMP_COUNT_AR6003 * (sizeof(u32)));

	if (status) {
		ath6kl_err("failed to get register dump\n");
+52 −42
Original line number Diff line number Diff line
@@ -229,74 +229,84 @@ static int ath6kl_set_addrwin_reg(struct ath6kl *ar, u32 reg_addr, u32 addr)
}

/*
 * Read from the ATH6KL through its diagnostic window. No cooperation from
 * the Target is required for this.
 * Read from the hardware through its diagnostic window. No cooperation
 * from the firmware is required for this.
 */
int ath6kl_read_reg_diag(struct ath6kl *ar, u32 *address, u32 *data)
int ath6kl_diag_read32(struct ath6kl *ar, u32 address, u32 *value)
{
	int status;
	int ret;

	/* set window register to start read cycle */
	status = ath6kl_set_addrwin_reg(ar, WINDOW_READ_ADDR_ADDRESS,
					*address);

	if (status)
		return status;
	ret = ath6kl_set_addrwin_reg(ar, WINDOW_READ_ADDR_ADDRESS, address);
	if (ret)
		return ret;

	/* read the data */
	status = hif_read_write_sync(ar, WINDOW_DATA_ADDRESS, (u8 *)data,
				     sizeof(u32), HIF_RD_SYNC_BYTE_INC);
	if (status) {
		ath6kl_err("failed to read from window data addr\n");
		return status;
	ret = hif_read_write_sync(ar, WINDOW_DATA_ADDRESS, (u8 *) value,
				  sizeof(*value), HIF_RD_SYNC_BYTE_INC);
	if (ret) {
		ath6kl_warn("failed to read32 through diagnose window: %d\n",
			    ret);
		return ret;
	}

	return status;
	return 0;
}


/*
 * Write to the ATH6KL through its diagnostic window. No cooperation from
 * the Target is required for this.
 */
static int ath6kl_write_reg_diag(struct ath6kl *ar, u32 *address, u32 *data)
static int ath6kl_diag_write32(struct ath6kl *ar, u32 address, u32 value)
{
	int status;
	int ret;

	/* set write data */
	status = hif_read_write_sync(ar, WINDOW_DATA_ADDRESS, (u8 *)data,
				     sizeof(u32), HIF_WR_SYNC_BYTE_INC);
	if (status) {
		ath6kl_err("failed to write 0x%x to window data addr\n", *data);
		return status;
	ret = hif_read_write_sync(ar, WINDOW_DATA_ADDRESS, (u8 *) &value,
				  sizeof(value), HIF_WR_SYNC_BYTE_INC);
	if (ret) {
		ath6kl_err("failed to write 0x%x during diagnose window to 0x%d\n",
			   address, value);
		return ret;
	}

	/* set window register, which starts the write cycle */
	return ath6kl_set_addrwin_reg(ar, WINDOW_WRITE_ADDR_ADDRESS,
				      *address);
				      address);
}

int ath6kl_access_datadiag(struct ath6kl *ar, u32 address,
			   u8 *data, u32 length, bool read)
int ath6kl_diag_read(struct ath6kl *ar, u32 address, void *data, u32 length)
{
	u32 count;
	int status = 0;
	u32 count, *buf = data;
	int ret;

	for (count = 0; count < length; count += 4, address += 4) {
		if (read) {
			status = ath6kl_read_reg_diag(ar, &address,
						      (u32 *) &data[count]);
			if (status)
				break;
		} else {
			status = ath6kl_write_reg_diag(ar, &address,
						       (u32 *) &data[count]);
			if (status)
				break;
	if (WARN_ON(length % 4))
		return -EINVAL;

	for (count = 0; count < length / 4; count++, address += 4) {
		ret = ath6kl_diag_read32(ar, address, &buf[count]);
		if (ret)
			return ret;
	}

	return 0;
}

int ath6kl_diag_write(struct ath6kl *ar, u32 address, void *data, u32 length)
{
	u32 count, *buf = data;
	int ret;

	if (WARN_ON(length % 4))
		return -EINVAL;

	for (count = 0; count < length / 4; count++, address += 4) {
		ret = ath6kl_diag_write32(ar, address, buf[count]);
		if (ret)
			return ret;
	}

	return status;
	return 0;
}

/* FIXME: move to a better place, target.h? */
@@ -328,7 +338,7 @@ static void ath6kl_reset_device(struct ath6kl *ar, u32 target_type,
		break;
	}

	status = ath6kl_write_reg_diag(ar, &address, &data);
	status = ath6kl_diag_write32(ar, address, data);

	if (status)
		ath6kl_err("failed to reset target\n");