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

Commit 79028819 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

Merge 5.4.214 into android11-5.4-lts



Changes in 5.4.214
	drm/msm/rd: Fix FIFO-full deadlock
	HID: ishtp-hid-clientHID: ishtp-hid-client: Fix comment typo
	hid: intel-ish-hid: ishtp: Fix ishtp client sending disordered message
	tg3: Disable tg3 device on system reboot to avoid triggering AER
	ieee802154: cc2520: add rc code in cc2520_tx()
	Input: iforce - add support for Boeder Force Feedback Wheel
	nvmet-tcp: fix unhandled tcp states in nvmet_tcp_state_change()
	perf/arm_pmu_platform: fix tests for platform_get_irq() failure
	platform/x86: acer-wmi: Acer Aspire One AOD270/Packard Bell Dot keymap fixes
	usb: storage: Add ASUS <0x0b05:0x1932> to IGNORE_UAS
	mm: Fix TLB flush for not-first PFNMAP mappings in unmap_region()
	net: dp83822: disable rx error interrupt
	soc: fsl: select FSL_GUTS driver for DPIO
	tracefs: Only clobber mode/uid/gid on remount if asked
	Linux 5.4.214

Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
Change-Id: I034f32293503012d4c66b6c2b2f2eb2bea8d2b8b
parents 04f24402 9f02aa34
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -517,6 +517,7 @@ All I-Force devices are supported by the iforce module. This includes:
* AVB Mag Turbo Force
* AVB Mag Turbo Force
* AVB Top Shot Pegasus
* AVB Top Shot Pegasus
* AVB Top Shot Force Feedback Racing Wheel
* AVB Top Shot Force Feedback Racing Wheel
* Boeder Force Feedback Wheel
* Logitech WingMan Force
* Logitech WingMan Force
* Logitech WingMan Force Wheel
* Logitech WingMan Force Wheel
* Guillemot Race Leader Force Feedback
* Guillemot Race Leader Force Feedback
+1 −1
Original line number Original line Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0
# SPDX-License-Identifier: GPL-2.0
VERSION = 5
VERSION = 5
PATCHLEVEL = 4
PATCHLEVEL = 4
SUBLEVEL = 213
SUBLEVEL = 214
EXTRAVERSION =
EXTRAVERSION =
NAME = Kleptomaniac Octopus
NAME = Kleptomaniac Octopus


+3 −0
Original line number Original line Diff line number Diff line
@@ -191,6 +191,9 @@ static int rd_open(struct inode *inode, struct file *file)
	file->private_data = rd;
	file->private_data = rd;
	rd->open = true;
	rd->open = true;


	/* Reset fifo to clear any previously unread data: */
	rd->fifo.head = rd->fifo.tail = 0;

	/* the parsing tools need to know gpu-id to know which
	/* the parsing tools need to know gpu-id to know which
	 * register database to load.
	 * register database to load.
	 */
	 */
+1 −1
Original line number Original line Diff line number Diff line
@@ -110,7 +110,7 @@ struct report_list {
 * @multi_packet_cnt:	Count of fragmented packet count
 * @multi_packet_cnt:	Count of fragmented packet count
 *
 *
 * This structure is used to store completion flags and per client data like
 * This structure is used to store completion flags and per client data like
 * like report description, number of HID devices etc.
 * report description, number of HID devices etc.
 */
 */
struct ishtp_cl_data {
struct ishtp_cl_data {
	/* completion flags */
	/* completion flags */
+39 −29
Original line number Original line Diff line number Diff line
@@ -626,13 +626,14 @@ static void ishtp_cl_read_complete(struct ishtp_cl_rb *rb)
}
}


/**
/**
 * ipc_tx_callback() - IPC tx callback function
 * ipc_tx_send() - IPC tx send function
 * @prm: Pointer to client device instance
 * @prm: Pointer to client device instance
 *
 *
 * Send message over IPC either first time or on callback on previous message
 * Send message over IPC. Message will be split into fragments
 * completion
 * if message size is bigger than IPC FIFO size, and all
 * fragments will be sent one by one.
 */
 */
static void ipc_tx_callback(void *prm)
static void ipc_tx_send(void *prm)
{
{
	struct ishtp_cl	*cl = prm;
	struct ishtp_cl	*cl = prm;
	struct ishtp_cl_tx_ring	*cl_msg;
	struct ishtp_cl_tx_ring	*cl_msg;
@@ -677,32 +678,41 @@ static void ipc_tx_callback(void *prm)
			    list);
			    list);
	rem = cl_msg->send_buf.size - cl->tx_offs;
	rem = cl_msg->send_buf.size - cl->tx_offs;


	while (rem > 0) {
		ishtp_hdr.host_addr = cl->host_client_id;
		ishtp_hdr.host_addr = cl->host_client_id;
		ishtp_hdr.fw_addr = cl->fw_client_id;
		ishtp_hdr.fw_addr = cl->fw_client_id;
		ishtp_hdr.reserved = 0;
		ishtp_hdr.reserved = 0;
		pmsg = cl_msg->send_buf.data + cl->tx_offs;
		pmsg = cl_msg->send_buf.data + cl->tx_offs;


		if (rem <= dev->mtu) {
		if (rem <= dev->mtu) {
			/* Last fragment or only one packet */
			ishtp_hdr.length = rem;
			ishtp_hdr.length = rem;
			ishtp_hdr.msg_complete = 1;
			ishtp_hdr.msg_complete = 1;
		cl->sending = 0;
		list_del_init(&cl_msg->list);	/* Must be before write */
		spin_unlock_irqrestore(&cl->tx_list_spinlock, tx_flags);
			/* Submit to IPC queue with no callback */
			/* Submit to IPC queue with no callback */
			ishtp_write_message(dev, &ishtp_hdr, pmsg);
			ishtp_write_message(dev, &ishtp_hdr, pmsg);
			cl->tx_offs = 0;
			cl->sending = 0;

			break;
		} else {
			/* Send ipc fragment */
			ishtp_hdr.length = dev->mtu;
			ishtp_hdr.msg_complete = 0;
			/* All fregments submitted to IPC queue with no callback */
			ishtp_write_message(dev, &ishtp_hdr, pmsg);
			cl->tx_offs += dev->mtu;
			rem = cl_msg->send_buf.size - cl->tx_offs;
		}
	}

	list_del_init(&cl_msg->list);
	spin_unlock_irqrestore(&cl->tx_list_spinlock, tx_flags);

	spin_lock_irqsave(&cl->tx_free_list_spinlock, tx_free_flags);
	spin_lock_irqsave(&cl->tx_free_list_spinlock, tx_free_flags);
	list_add_tail(&cl_msg->list, &cl->tx_free_list.list);
	list_add_tail(&cl_msg->list, &cl->tx_free_list.list);
	++cl->tx_ring_free_size;
	++cl->tx_ring_free_size;
	spin_unlock_irqrestore(&cl->tx_free_list_spinlock,
	spin_unlock_irqrestore(&cl->tx_free_list_spinlock,
		tx_free_flags);
		tx_free_flags);
	} else {
		/* Send IPC fragment */
		spin_unlock_irqrestore(&cl->tx_list_spinlock, tx_flags);
		cl->tx_offs += dev->mtu;
		ishtp_hdr.length = dev->mtu;
		ishtp_hdr.msg_complete = 0;
		ishtp_send_msg(dev, &ishtp_hdr, pmsg, ipc_tx_callback, cl);
	}
}
}


/**
/**
@@ -720,7 +730,7 @@ static void ishtp_cl_send_msg_ipc(struct ishtp_device *dev,
		return;
		return;


	cl->tx_offs = 0;
	cl->tx_offs = 0;
	ipc_tx_callback(cl);
	ipc_tx_send(cl);
	++cl->send_msg_cnt_ipc;
	++cl->send_msg_cnt_ipc;
}
}


Loading