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

Commit b6560f13 authored by Anand Kumar's avatar Anand Kumar Committed by Hardik Kantilal Patel
Browse files

wcnss: Read multiple SMD Packet from SMD Channel



It observe that sometime, there are multiple SMD
packets in SMD channel. In current scenario,
driver reading one packet at single event.
Reading all SMD packets to avoid any packets miss.

CRs-Fixed: 1074988
Change-Id: I9cd821f6369762151857e1bc2887895714262f54
Signed-off-by: default avatarAnand Kumar <anandkumar@codeaurora.org>
parent b7ac7086
Loading
Loading
Loading
Loading
+29 −16
Original line number Diff line number Diff line
@@ -2123,10 +2123,8 @@ exit:
	return;
}


static void wcnssctrl_rx_handler(struct work_struct *worker)
static void wcnss_process_smd_msg(int len)
{
	int len = 0;
	int rc = 0;
	unsigned char buf[sizeof(struct wcnss_version)];
	unsigned char build[WCNSS_MAX_BUILD_VER_LEN+1];
@@ -2136,17 +2134,6 @@ static void wcnssctrl_rx_handler(struct work_struct *worker)
	int hw_type;
	unsigned char fw_status = 0;

	len = smd_read_avail(penv->smd_ch);
	if (len > WCNSS_MAX_FRAME_SIZE) {
		pr_err("wcnss: frame larger than the allowed size\n");
		smd_read(penv->smd_ch, NULL, len);
		return;
	}
	if (len < sizeof(struct smd_msg_hdr)) {
		pr_err("wcnss: incomplete header available len = %d\n", len);
		return;
	}

	rc = smd_read(penv->smd_ch, buf, sizeof(struct smd_msg_hdr));
	if (rc < sizeof(struct smd_msg_hdr)) {
		pr_err("wcnss: incomplete header read from smd\n");
@@ -2245,7 +2232,6 @@ static void wcnssctrl_rx_handler(struct work_struct *worker)
		penv->is_cbc_done = 1;
		pr_debug("wcnss: received WCNSS_CBC_COMPLETE_IND from FW\n");
		break;

	case WCNSS_CALDATA_UPLD_REQ:
		extract_cal_data(len);
		break;
@@ -2256,6 +2242,33 @@ static void wcnssctrl_rx_handler(struct work_struct *worker)
	return;
}

static void wcnssctrl_rx_handler(struct work_struct *worker)
{
	int len;

	while (1) {
		len = smd_read_avail(penv->smd_ch);
		if (0 == len) {
			pr_debug("wcnss: No more data to be read\n");
			return;
		}

		if (len > WCNSS_MAX_FRAME_SIZE) {
			pr_err("wcnss: frame larger than the allowed size\n");
			smd_read(penv->smd_ch, NULL, len);
			return;
		}

		if (len < sizeof(struct smd_msg_hdr)) {
			pr_err("wcnss: incomplete header available len = %d\n",
			       len);
			return;
		}

		wcnss_process_smd_msg(len);
	}
}

static void wcnss_send_version_req(struct work_struct *worker)
{
	struct smd_msg_hdr smd_msg;