Merge "diag: Clear masks upon logging exit"
This commit is contained in:
commit
e454f66b6b
5 changed files with 60 additions and 10 deletions
|
@ -1780,6 +1780,15 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count,
|
||||||
if (!mask_info)
|
if (!mask_info)
|
||||||
return -EIO;
|
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);
|
mutex_lock(&mask_info->lock);
|
||||||
mask = (struct diag_msg_mask_t *)(mask_info->ptr);
|
mask = (struct diag_msg_mask_t *)(mask_info->ptr);
|
||||||
for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
|
for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) {
|
||||||
|
|
|
@ -215,6 +215,12 @@ static void usb_connect_work_fn(struct work_struct *work)
|
||||||
*/
|
*/
|
||||||
static void usb_disconnect(struct diag_usb_info *ch)
|
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)
|
if (ch && ch->ops && ch->ops->close)
|
||||||
ch->ops->close(ch->ctxt, DIAG_USB_MODE);
|
ch->ops->close(ch->ctxt, DIAG_USB_MODE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -467,6 +467,8 @@ struct diagchar_dev {
|
||||||
struct class *diagchar_class;
|
struct class *diagchar_class;
|
||||||
struct device *diag_dev;
|
struct device *diag_dev;
|
||||||
int ref_count;
|
int ref_count;
|
||||||
|
int mask_clear;
|
||||||
|
struct mutex diag_maskclear_mutex;
|
||||||
struct mutex diagchar_mutex;
|
struct mutex diagchar_mutex;
|
||||||
struct mutex diag_file_mutex;
|
struct mutex diag_file_mutex;
|
||||||
wait_queue_head_t wait_q;
|
wait_queue_head_t wait_q;
|
||||||
|
@ -625,6 +627,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_pid(int pid);
|
||||||
void diag_cmd_remove_reg_by_proc(int proc);
|
void diag_cmd_remove_reg_by_proc(int proc);
|
||||||
int diag_cmd_chk_polling(struct diag_cmd_reg_entry_t *entry);
|
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);
|
void diag_record_stats(int type, int flag);
|
||||||
|
|
||||||
|
|
|
@ -389,6 +389,27 @@ static uint32_t diag_translate_kernel_to_user_mask(uint32_t peripheral_mask)
|
||||||
return ret;
|
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)
|
static void diag_close_logging_process(const int pid)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -400,6 +421,12 @@ static void diag_close_logging_process(const int pid)
|
||||||
if (!session_info)
|
if (!session_info)
|
||||||
return;
|
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;
|
session_peripheral_mask = session_info->peripheral_mask;
|
||||||
diag_md_session_close(session_info);
|
diag_md_session_close(session_info);
|
||||||
for (i = 0; i < NUM_MD_SESSIONS; i++)
|
for (i = 0; i < NUM_MD_SESSIONS; i++)
|
||||||
|
@ -475,9 +502,14 @@ static int diag_remove_client_entry(struct file *file)
|
||||||
}
|
}
|
||||||
static int diagchar_close(struct inode *inode, 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",
|
DIAG_LOG(DIAG_DEBUG_USERSPACE, "diag: process exit %s\n",
|
||||||
current->comm);
|
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)
|
void diag_record_stats(int type, int flag)
|
||||||
|
@ -3358,6 +3390,7 @@ static int __init diagchar_init(void)
|
||||||
non_hdlc_data.len = 0;
|
non_hdlc_data.len = 0;
|
||||||
mutex_init(&driver->hdlc_disable_mutex);
|
mutex_init(&driver->hdlc_disable_mutex);
|
||||||
mutex_init(&driver->diagchar_mutex);
|
mutex_init(&driver->diagchar_mutex);
|
||||||
|
mutex_init(&driver->diag_maskclear_mutex);
|
||||||
mutex_init(&driver->diag_file_mutex);
|
mutex_init(&driver->diag_file_mutex);
|
||||||
mutex_init(&driver->delayed_rsp_mutex);
|
mutex_init(&driver->delayed_rsp_mutex);
|
||||||
mutex_init(&apps_data_mutex);
|
mutex_init(&apps_data_mutex);
|
||||||
|
|
|
@ -1232,8 +1232,6 @@ static int diagfwd_mux_open(int id, int mode)
|
||||||
|
|
||||||
static int diagfwd_mux_close(int id, int mode)
|
static int diagfwd_mux_close(int id, int mode)
|
||||||
{
|
{
|
||||||
uint8_t i;
|
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case DIAG_USB_MODE:
|
case DIAG_USB_MODE:
|
||||||
driver->usb_connected = 0;
|
driver->usb_connected = 0;
|
||||||
|
@ -1248,15 +1246,16 @@ static int diagfwd_mux_close(int id, int mode)
|
||||||
driver->md_session_mode == DIAG_MD_NONE) ||
|
driver->md_session_mode == DIAG_MD_NONE) ||
|
||||||
(driver->md_session_mode == DIAG_MD_PERIPHERAL)) {
|
(driver->md_session_mode == DIAG_MD_PERIPHERAL)) {
|
||||||
/*
|
/*
|
||||||
* In this case the channel must not be closed. This case
|
* This case indicates that the USB is removed
|
||||||
* indicates that the USB is removed but there is a client
|
* but there is a client running in background
|
||||||
* running in background with Memory Device mode
|
* with Memory Device mode.
|
||||||
*/
|
*/
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < NUM_PERIPHERALS; i++) {
|
/*
|
||||||
diagfwd_close(i, TYPE_DATA);
|
* With clearing of masks on ODL exit and
|
||||||
diagfwd_close(i, TYPE_CMD);
|
* USB disconnection, closing of the channel is
|
||||||
}
|
* not needed.This enables read and drop of stale packets.
|
||||||
|
*/
|
||||||
/* Re enable HDLC encoding */
|
/* Re enable HDLC encoding */
|
||||||
pr_debug("diag: In %s, re-enabling HDLC encoding\n",
|
pr_debug("diag: In %s, re-enabling HDLC encoding\n",
|
||||||
__func__);
|
__func__);
|
||||||
|
|
Loading…
Add table
Reference in a new issue