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

Commit a553f436 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "diag: Wait with timeout while apps data buffers are flushed"

parents 3636aea0 f6024a5a
Loading
Loading
Loading
Loading
+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
@@ -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
+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>
@@ -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>
@@ -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 };
@@ -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);
@@ -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);
@@ -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;
@@ -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);