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

Commit ac64e7bb authored by Manoj Prabhu B's avatar Manoj Prabhu B
Browse files

diag: Add sysfs parameter to control diag mask clear



This patch adds syfs parameter which controls clearing
of the peripheral masks upon USB disconnect and stopping
ODL.
This patch takes proper care for handling buffers
while clearing masks.

CRs-Fixed: 1081142
Change-Id: Ibe070661618258513d683bfec13ff10f23bee5d6
Signed-off-by: default avatarManoj Prabhu B <bmanoj@codeaurora.org>
parent 67ca95e6
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/kernel.h>
#include <linux/err.h>
#include <linux/sched.h>
#include <linux/ratelimit.h>
@@ -218,7 +219,8 @@ static void usb_disconnect(struct diag_usb_info *ch)
	if (!ch)
		return;

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

	if (ch && ch->ops && ch->ops->close)
+1 −0
Original line number Diff line number Diff line
@@ -625,6 +625,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);
int diag_mask_param(void);
void diag_clear_masks(struct diag_md_session_t *info);

void diag_record_stats(int type, int flag);
+14 −2
Original line number Diff line number Diff line
@@ -144,6 +144,14 @@ module_param(max_clients, uint, 0);
static struct timer_list drain_timer;
static int timer_in_progress;

/*
 * Diag Mask clear variable
 * Used for clearing masks upon
 * USB disconnection and stopping ODL
 */
static int diag_mask_clear_param = 1;
module_param(diag_mask_clear_param, int, 0644);

struct diag_apps_data_t {
	void *buf;
	uint32_t len;
@@ -386,7 +394,10 @@ static uint32_t diag_translate_kernel_to_user_mask(uint32_t peripheral_mask)

	return ret;
}

int diag_mask_param(void)
{
	return diag_mask_clear_param;
}
void diag_clear_masks(struct diag_md_session_t *info)
{
	int ret;
@@ -419,6 +430,7 @@ static void diag_close_logging_process(const int pid)
	if (!session_info)
		return;

	if (diag_mask_clear_param)
		diag_clear_masks(session_info);

	mutex_lock(&driver->diag_maskclear_mutex);
+18 −4
Original line number Diff line number Diff line
@@ -1225,6 +1225,8 @@ 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;
@@ -1245,10 +1247,22 @@ static int diagfwd_mux_close(int id, int mode)
		 */
	} else {
		/*
		* 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.
		 * With sysfs parameter to clear masks set,
		 * peripheral masks are cleared on ODL exit and
		 * USB disconnection and buffers are not marked busy.
		 * This enables read and drop of stale packets.
		 *
		 * With sysfs parameter to clear masks cleared,
		 * masks are not cleared and buffers are to be marked
		 * busy to ensure traffic generated by peripheral
		 * are not read
		 */
		if (!(diag_mask_param())) {
			for (i = 0; i < NUM_PERIPHERALS; i++) {
				diagfwd_close(i, TYPE_DATA);
				diagfwd_close(i, TYPE_CMD);
			}
		}
		/* Re enable HDLC encoding */
		pr_debug("diag: In %s, re-enabling HDLC encoding\n",
		       __func__);