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

Commit 1df1ef97 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "diag: Clear masks upon logging exit"

parents ca06d33d 2fe47947
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -1779,6 +1779,15 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count,
	if (!mask_info)
		return -EIO;

	mutex_lock(&driver->diag_maskclear_mutex);
	if (driver->mask_clear) {
		DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
		"diag:%s: count = %zu\n", __func__, count);
		mutex_unlock(&driver->diag_maskclear_mutex);
		return -EIO;
	}
	mutex_unlock(&driver->diag_maskclear_mutex);

	mutex_lock(&mask_info->lock);
	mask = (struct diag_msg_mask_t *)(mask_info->ptr);
	for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
+6 −0
Original line number Diff line number Diff line
@@ -215,6 +215,12 @@ static void usb_connect_work_fn(struct work_struct *work)
 */
static void usb_disconnect(struct diag_usb_info *ch)
{
	if (!ch)
		return;

	if (!atomic_read(&ch->connected) && driver->usb_connected)
		diag_clear_masks(NULL);

	if (ch && ch->ops && ch->ops->close)
		ch->ops->close(ch->ctxt, DIAG_USB_MODE);
}
+3 −0
Original line number Diff line number Diff line
@@ -463,6 +463,8 @@ struct diagchar_dev {
	struct class *diagchar_class;
	struct device *diag_dev;
	int ref_count;
	int mask_clear;
	struct mutex diag_maskclear_mutex;
	struct mutex diagchar_mutex;
	struct mutex diag_file_mutex;
	wait_queue_head_t wait_q;
@@ -622,6 +624,7 @@ void diag_cmd_remove_reg(struct diag_cmd_reg_entry_t *entry, uint8_t proc);
void diag_cmd_remove_reg_by_pid(int pid);
void diag_cmd_remove_reg_by_proc(int proc);
int diag_cmd_chk_polling(struct diag_cmd_reg_entry_t *entry);
void diag_clear_masks(struct diag_md_session_t *info);

void diag_record_stats(int type, int flag);

+34 −1
Original line number Diff line number Diff line
@@ -387,6 +387,27 @@ static uint32_t diag_translate_kernel_to_user_mask(uint32_t peripheral_mask)
	return ret;
}

void diag_clear_masks(struct diag_md_session_t *info)
{
	int ret;
	char cmd_disable_log_mask[] = { 0x73, 0, 0, 0, 0, 0, 0, 0};
	char cmd_disable_msg_mask[] = { 0x7D, 0x05, 0, 0, 0, 0, 0, 0};
	char cmd_disable_event_mask[] = { 0x60, 0};

	DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
	"diag: %s: masks clear request upon %s\n", __func__,
	((info) ? "ODL exit" : "USB Disconnection"));

	ret = diag_process_apps_masks(cmd_disable_log_mask,
			sizeof(cmd_disable_log_mask), info);
	ret = diag_process_apps_masks(cmd_disable_msg_mask,
			sizeof(cmd_disable_msg_mask), info);
	ret = diag_process_apps_masks(cmd_disable_event_mask,
			sizeof(cmd_disable_event_mask), info);
	DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
	"diag:%s: masks cleared successfully\n", __func__);
}

static void diag_close_logging_process(const int pid)
{
	int i;
@@ -398,6 +419,12 @@ static void diag_close_logging_process(const int pid)
	if (!session_info)
		return;

	diag_clear_masks(session_info);

	mutex_lock(&driver->diag_maskclear_mutex);
	driver->mask_clear = 1;
	mutex_unlock(&driver->diag_maskclear_mutex);

	session_peripheral_mask = session_info->peripheral_mask;
	diag_md_session_close(session_info);
	for (i = 0; i < NUM_MD_SESSIONS; i++)
@@ -473,9 +500,14 @@ static int diag_remove_client_entry(struct file *file)
}
static int diagchar_close(struct inode *inode, struct file *file)
{
	int ret;
	DIAG_LOG(DIAG_DEBUG_USERSPACE, "diag: process exit %s\n",
		current->comm);
	return diag_remove_client_entry(file);
	ret = diag_remove_client_entry(file);
	mutex_lock(&driver->diag_maskclear_mutex);
	driver->mask_clear = 0;
	mutex_unlock(&driver->diag_maskclear_mutex);
	return ret;
}

void diag_record_stats(int type, int flag)
@@ -3354,6 +3386,7 @@ static int __init diagchar_init(void)
	non_hdlc_data.len = 0;
	mutex_init(&driver->hdlc_disable_mutex);
	mutex_init(&driver->diagchar_mutex);
	mutex_init(&driver->diag_maskclear_mutex);
	mutex_init(&driver->diag_file_mutex);
	mutex_init(&driver->delayed_rsp_mutex);
	mutex_init(&apps_data_mutex);
+8 −9
Original line number Diff line number Diff line
@@ -1225,8 +1225,6 @@ static int diagfwd_mux_open(int id, int mode)

static int diagfwd_mux_close(int id, int mode)
{
	uint8_t i;

	switch (mode) {
	case DIAG_USB_MODE:
		driver->usb_connected = 0;
@@ -1241,15 +1239,16 @@ static int diagfwd_mux_close(int id, int mode)
		driver->md_session_mode == DIAG_MD_NONE) ||
		(driver->md_session_mode == DIAG_MD_PERIPHERAL)) {
		/*
		 * In this case the channel must not be closed. This case
		 * indicates that the USB is removed but there is a client
		 * running in background with Memory Device mode
		 * This case indicates that the USB is removed
		 * but there is a client running in background
		 * with Memory Device mode.
		 */
	} else {
		for (i = 0; i < NUM_PERIPHERALS; i++) {
			diagfwd_close(i, TYPE_DATA);
			diagfwd_close(i, TYPE_CMD);
		}
		/*
		* With clearing of masks on ODL exit and
		* USB disconnection, closing of the channel is
		* not needed.This enables read and drop of stale packets.
		*/
		/* Re enable HDLC encoding */
		pr_debug("diag: In %s, re-enabling HDLC encoding\n",
		       __func__);