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

Commit c20aa25a authored by Gopikrishna Mogasati's avatar Gopikrishna Mogasati Committed by Gerrit - the friendly Code Review server
Browse files

diag: dci: Send masks information to only supported peripherals



Currently log and event mask information is sent to all
peripherals. This fix sends log and event mask information
to only dci supported peripherals.

CRs-Fixed: 1117238
Change-Id: Ibcf3762574212e097502b2f36f7ac9284bac3e06
Signed-off-by: default avatarGopikrishna Mogasati <gmogas@codeaurora.org>
parent 5b93637d
Loading
Loading
Loading
Loading
+42 −9
Original line number Diff line number Diff line
@@ -134,6 +134,35 @@ void diag_dci_record_traffic(int read_bytes, uint8_t ch_type,
void diag_dci_record_traffic(int read_bytes, uint8_t ch_type,
			     uint8_t peripheral, uint8_t proc) { }
#endif

static int check_peripheral_dci_support(int peripheral_id, int dci_proc_id)
{
	int dci_peripheral_list = 0;

	if (dci_proc_id < 0 || dci_proc_id >= NUM_DCI_PROC) {
		pr_err("diag:In %s,not a supported DCI proc id\n", __func__);
		return 0;
	}
	if (peripheral_id < 0 || peripheral_id >= NUM_PERIPHERALS) {
		pr_err("diag:In %s,not a valid peripheral id\n", __func__);
		return 0;
	}
	dci_peripheral_list = dci_ops_tbl[dci_proc_id].peripheral_status;

	if (dci_peripheral_list <= 0 || dci_peripheral_list > DIAG_CON_ALL) {
		pr_err("diag:In %s,not a valid dci peripheral mask\n",
			 __func__);
		return 0;
	}
	/* Remove APSS bit mask information */
	dci_peripheral_list = dci_peripheral_list >> 1;

	if ((1 << peripheral_id) & (dci_peripheral_list))
		return 1;
	else
		return 0;
}

static void create_dci_log_mask_tbl(unsigned char *mask, uint8_t dirty)
{
	unsigned char *temp = mask;
@@ -2396,11 +2425,13 @@ int diag_send_dci_event_mask(int token)
		 * is down. It may also mean that the peripheral doesn't
		 * support DCI.
		 */
		if (check_peripheral_dci_support(i, DCI_LOCAL_PROC)) {
			err = diag_dci_write_proc(i, DIAG_CNTL_TYPE, buf,
				  header_size + DCI_EVENT_MASK_SIZE);
			if (err != DIAG_DCI_NO_ERROR)
				ret = DIAG_DCI_SEND_DATA_FAIL;
		}
	}

	mutex_unlock(&event_mask.lock);
	mutex_unlock(&dci_event_mask_mutex);
@@ -2581,13 +2612,15 @@ int diag_send_dci_log_mask(int token)
		}
		write_len = dci_fill_log_mask(buf, log_mask_ptr);
		for (j = 0; j < NUM_PERIPHERALS && write_len; j++) {
			err = diag_dci_write_proc(j, DIAG_CNTL_TYPE, buf,
						  write_len);
			if (check_peripheral_dci_support(j, DCI_LOCAL_PROC)) {
				err = diag_dci_write_proc(j, DIAG_CNTL_TYPE,
					buf, write_len);
				if (err != DIAG_DCI_NO_ERROR) {
					updated = 0;
					ret = DIAG_DCI_SEND_DATA_FAIL;
				}
			}
		}
		if (updated)
			*(log_mask_ptr+1) = 0; /* clear dirty byte */
		log_mask_ptr += 514;