Loading drivers/char/diag/diagchar.h +3 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* Copyright (c) 2008-2019, The Linux Foundation. All rights reserved. /* Copyright (c) 2008-2020, The Linux Foundation. All rights reserved. */ #ifndef DIAGCHAR_H Loading Loading @@ -225,6 +225,8 @@ #define HDLC_CTXT 1 #define NON_HDLC_CTXT 2 #define PKT_PROCESS_TIMEOUT 200 #define TYPE_DATA 0 #define TYPE_CNTL 1 #define TYPE_DCI 2 Loading drivers/char/diag/diagchar_core.c +33 −9 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2008-2019, The Linux Foundation. All rights reserved. /* Copyright (c) 2008-2020, The Linux Foundation. All rights reserved. */ #include <linux/slab.h> Loading @@ -14,6 +14,7 @@ #include <linux/sched.h> #include <linux/ratelimit.h> #include <linux/timer.h> #include <linux/jiffies.h> #include <linux/sched/task.h> #ifdef CONFIG_DIAG_OVER_USB #include <linux/usb/usbdiag.h> Loading Loading @@ -3085,7 +3086,7 @@ long diagchar_ioctl(struct file *filp, static int diag_process_apps_data_hdlc(unsigned char *buf, int len, int pkt_type) { int err = 0; int err = 0, wait_err = 0; int ret = PKT_DROP; struct diag_apps_data_t *data = &hdlc_data; struct diag_send_desc_type send = { NULL, NULL, DIAG_STATE_START, 0 }; Loading Loading @@ -3116,8 +3117,15 @@ static int diag_process_apps_data_hdlc(unsigned char *buf, int len, send.terminate = 1; wait_for_buffer: wait_event_interruptible(driver->hdlc_wait_q, (data->flushed == 0)); wait_err = wait_event_interruptible_timeout(driver->hdlc_wait_q, (data->flushed == 0), msecs_to_jiffies(PKT_PROCESS_TIMEOUT)); if (wait_err <= 0) { DIAG_LOG(DIAG_DEBUG_USERSPACE, "diag: Timeout while waiting for hdlc buffer to be flushed, err: %d\n", wait_err); return PKT_DROP; } spin_lock_irqsave(&driver->diagmem_lock, flags); if (data->flushed) { spin_unlock_irqrestore(&driver->diagmem_lock, flags); Loading Loading @@ -3168,8 +3176,16 @@ static int diag_process_apps_data_hdlc(unsigned char *buf, int len, goto fail_free_buf; } wait_for_agg_buff: wait_event_interruptible(driver->hdlc_wait_q, (data->flushed == 0)); wait_err = wait_event_interruptible_timeout(driver->hdlc_wait_q, (data->flushed == 0), msecs_to_jiffies(PKT_PROCESS_TIMEOUT)); if (wait_err <= 0) { DIAG_LOG(DIAG_DEBUG_USERSPACE, "diag: Timeout while waiting for hdlc aggregation buffer to be flushed, err: %d\n", wait_err); return PKT_DROP; } spin_lock_irqsave(&driver->diagmem_lock, flags); if (data->flushed) { spin_unlock_irqrestore(&driver->diagmem_lock, flags); Loading Loading @@ -3227,7 +3243,7 @@ static int diag_process_apps_data_hdlc(unsigned char *buf, int len, static int diag_process_apps_data_non_hdlc(unsigned char *buf, int len, int pkt_type) { int err = 0; int err = 0, wait_err = 0; int ret = PKT_DROP; struct diag_pkt_frame_t header; struct diag_apps_data_t *data = &non_hdlc_data; Loading @@ -3245,8 +3261,16 @@ static int diag_process_apps_data_non_hdlc(unsigned char *buf, int len, return -EIO; } wait_for_buffer: wait_event_interruptible(driver->hdlc_wait_q, (data->flushed == 0)); wait_err = wait_event_interruptible_timeout(driver->hdlc_wait_q, (data->flushed == 0), msecs_to_jiffies(PKT_PROCESS_TIMEOUT)); if (wait_err <= 0) { DIAG_LOG(DIAG_DEBUG_USERSPACE, "diag: Timeout while waiting for non-hdlc buffer to be flushed, err: %d\n", wait_err); return PKT_DROP; } spin_lock_irqsave(&driver->diagmem_lock, flags); if (data->flushed) { spin_unlock_irqrestore(&driver->diagmem_lock, flags); Loading Loading
drivers/char/diag/diagchar.h +3 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* Copyright (c) 2008-2019, The Linux Foundation. All rights reserved. /* Copyright (c) 2008-2020, The Linux Foundation. All rights reserved. */ #ifndef DIAGCHAR_H Loading Loading @@ -225,6 +225,8 @@ #define HDLC_CTXT 1 #define NON_HDLC_CTXT 2 #define PKT_PROCESS_TIMEOUT 200 #define TYPE_DATA 0 #define TYPE_CNTL 1 #define TYPE_DCI 2 Loading
drivers/char/diag/diagchar_core.c +33 −9 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2008-2019, The Linux Foundation. All rights reserved. /* Copyright (c) 2008-2020, The Linux Foundation. All rights reserved. */ #include <linux/slab.h> Loading @@ -14,6 +14,7 @@ #include <linux/sched.h> #include <linux/ratelimit.h> #include <linux/timer.h> #include <linux/jiffies.h> #include <linux/sched/task.h> #ifdef CONFIG_DIAG_OVER_USB #include <linux/usb/usbdiag.h> Loading Loading @@ -3085,7 +3086,7 @@ long diagchar_ioctl(struct file *filp, static int diag_process_apps_data_hdlc(unsigned char *buf, int len, int pkt_type) { int err = 0; int err = 0, wait_err = 0; int ret = PKT_DROP; struct diag_apps_data_t *data = &hdlc_data; struct diag_send_desc_type send = { NULL, NULL, DIAG_STATE_START, 0 }; Loading Loading @@ -3116,8 +3117,15 @@ static int diag_process_apps_data_hdlc(unsigned char *buf, int len, send.terminate = 1; wait_for_buffer: wait_event_interruptible(driver->hdlc_wait_q, (data->flushed == 0)); wait_err = wait_event_interruptible_timeout(driver->hdlc_wait_q, (data->flushed == 0), msecs_to_jiffies(PKT_PROCESS_TIMEOUT)); if (wait_err <= 0) { DIAG_LOG(DIAG_DEBUG_USERSPACE, "diag: Timeout while waiting for hdlc buffer to be flushed, err: %d\n", wait_err); return PKT_DROP; } spin_lock_irqsave(&driver->diagmem_lock, flags); if (data->flushed) { spin_unlock_irqrestore(&driver->diagmem_lock, flags); Loading Loading @@ -3168,8 +3176,16 @@ static int diag_process_apps_data_hdlc(unsigned char *buf, int len, goto fail_free_buf; } wait_for_agg_buff: wait_event_interruptible(driver->hdlc_wait_q, (data->flushed == 0)); wait_err = wait_event_interruptible_timeout(driver->hdlc_wait_q, (data->flushed == 0), msecs_to_jiffies(PKT_PROCESS_TIMEOUT)); if (wait_err <= 0) { DIAG_LOG(DIAG_DEBUG_USERSPACE, "diag: Timeout while waiting for hdlc aggregation buffer to be flushed, err: %d\n", wait_err); return PKT_DROP; } spin_lock_irqsave(&driver->diagmem_lock, flags); if (data->flushed) { spin_unlock_irqrestore(&driver->diagmem_lock, flags); Loading Loading @@ -3227,7 +3243,7 @@ static int diag_process_apps_data_hdlc(unsigned char *buf, int len, static int diag_process_apps_data_non_hdlc(unsigned char *buf, int len, int pkt_type) { int err = 0; int err = 0, wait_err = 0; int ret = PKT_DROP; struct diag_pkt_frame_t header; struct diag_apps_data_t *data = &non_hdlc_data; Loading @@ -3245,8 +3261,16 @@ static int diag_process_apps_data_non_hdlc(unsigned char *buf, int len, return -EIO; } wait_for_buffer: wait_event_interruptible(driver->hdlc_wait_q, (data->flushed == 0)); wait_err = wait_event_interruptible_timeout(driver->hdlc_wait_q, (data->flushed == 0), msecs_to_jiffies(PKT_PROCESS_TIMEOUT)); if (wait_err <= 0) { DIAG_LOG(DIAG_DEBUG_USERSPACE, "diag: Timeout while waiting for non-hdlc buffer to be flushed, err: %d\n", wait_err); return PKT_DROP; } spin_lock_irqsave(&driver->diagmem_lock, flags); if (data->flushed) { spin_unlock_irqrestore(&driver->diagmem_lock, flags); Loading