aboutsummaryrefslogtreecommitdiffstats
path: root/0005-tty-n_r3964-split-rx-and-tx-header-structures.patch
diff options
Diffstat (limited to '0005-tty-n_r3964-split-rx-and-tx-header-structures.patch')
-rw-r--r--0005-tty-n_r3964-split-rx-and-tx-header-structures.patch265
1 files changed, 265 insertions, 0 deletions
diff --git a/0005-tty-n_r3964-split-rx-and-tx-header-structures.patch b/0005-tty-n_r3964-split-rx-and-tx-header-structures.patch
new file mode 100644
index 00000000000000..0f633183531e36
--- /dev/null
+++ b/0005-tty-n_r3964-split-rx-and-tx-header-structures.patch
@@ -0,0 +1,265 @@
+From b717816885270bfe80ed184cb894b14c10c3f48f Mon Sep 17 00:00:00 2001
+From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Date: Thu, 24 Jan 2019 12:32:05 +0100
+Subject: [PATCH 05/15] tty: n_r3964: split rx and tx header structures
+
+It's really confusing to try to figure out what structure is what type
+of header when both the tx and rx queues are using the same header
+structure, but not all of the fields in it.
+
+So split this into two different structures. That makes it much more
+obvious what variable and queue and type of message is being kept track
+of where.
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/tty/n_r3964.c | 78 +++++++++++++++++++++----------------------
+ 1 file changed, 39 insertions(+), 39 deletions(-)
+
+diff --git a/drivers/tty/n_r3964.c b/drivers/tty/n_r3964.c
+index 6c0abb04c4f0..487aa6a38f7d 100644
+--- a/drivers/tty/n_r3964.c
++++ b/drivers/tty/n_r3964.c
+@@ -101,6 +101,8 @@ enum {
+ /* All open file-handles are 'clients' and are stored in a linked list: */
+
+ struct r3964_message;
++struct rx_block_header;
++struct tx_block_header;
+
+ struct r3964_client_info {
+ spinlock_t lock;
+@@ -111,30 +113,35 @@ struct r3964_client_info {
+
+ struct r3964_message *first_msg;
+ struct r3964_message *last_msg;
+- struct r3964_block_header *next_block_to_read;
++ struct rx_block_header *next_block_to_read;
+ int msg_count;
+ };
+
+-struct r3964_block_header;
+-
+ /* internal version of client_message: */
+ struct r3964_message {
+ int msg_id;
+ int arg;
+ int error_code;
+- struct r3964_block_header *block;
++ struct rx_block_header *block;
+ struct r3964_message *next;
+ };
+
+-/* Header of received block in rx_buf/tx_buf: */
+-struct r3964_block_header {
++/* Header of received block in rx_buf: */
++struct rx_block_header {
+ unsigned int length; /* length in chars without header */
+ unsigned char *data; /* usually data is located immediately
+ * behind this struct */
+ unsigned int locks; /* only used in rx_buffer */
+
+- struct r3964_block_header *next;
+- struct r3964_client_info *owner; /* =NULL in rx_buffer */
++ struct rx_block_header *next;
++};
++
++/* Header of received block in tx_buf: */
++struct tx_block_header {
++ unsigned int length; /* length in chars without header */
++ unsigned char *data;
++ struct tx_block_header *next;
++ struct r3964_client_info *owner;
+ };
+
+ /*
+@@ -162,10 +169,10 @@ struct r3964_info {
+ unsigned char *rx_buf; /* ring buffer */
+ unsigned char *tx_buf;
+
+- struct r3964_block_header *rx_first;
+- struct r3964_block_header *rx_last;
+- struct r3964_block_header *tx_first;
+- struct r3964_block_header *tx_last;
++ struct rx_block_header *rx_first;
++ struct rx_block_header *rx_last;
++ struct tx_block_header *tx_first;
++ struct tx_block_header *tx_last;
+ unsigned int tx_position;
+ unsigned int rx_position;
+ unsigned char last_rx;
+@@ -182,8 +189,6 @@ struct r3964_info {
+ int nRetry;
+ };
+
+-static void add_tx_queue(struct r3964_info *, struct r3964_block_header *);
+-static void remove_from_tx_queue(struct r3964_info *pInfo, int error_code);
+ static void put_char(struct r3964_info *pInfo, unsigned char ch);
+ static void trigger_transmit(struct r3964_info *pInfo);
+ static void retry_transmit(struct r3964_info *pInfo);
+@@ -195,7 +200,7 @@ static int enable_signals(struct r3964_info *pInfo, struct pid *pid, int arg);
+ static int read_telegram(struct r3964_info *pInfo, struct pid *pid,
+ unsigned char __user * buf);
+ static void add_msg(struct r3964_client_info *pClient, int msg_id, int arg,
+- int error_code, struct r3964_block_header *pBlock);
++ int error_code, struct rx_block_header *pBlock);
+ static struct r3964_message *remove_msg(struct r3964_info *pInfo,
+ struct r3964_client_info *pClient);
+ static void remove_client_block(struct r3964_info *pInfo,
+@@ -306,7 +311,7 @@ module_exit(r3964_exit);
+ *************************************************************/
+
+ static void add_tx_queue(struct r3964_info *pInfo,
+- struct r3964_block_header *pHeader)
++ struct tx_block_header *pHeader)
+ {
+ unsigned long flags;
+
+@@ -329,10 +334,10 @@ static void add_tx_queue(struct r3964_info *pInfo,
+
+ static void remove_from_tx_queue(struct r3964_info *pInfo, int error_code)
+ {
+- struct r3964_block_header *pHeader;
++ struct tx_block_header *pHeader;
+ unsigned long flags;
+ #ifdef DEBUG_QUEUE
+- struct r3964_block_header *pDump;
++ struct tx_block_header *pDump;
+ #endif
+
+ pHeader = pInfo->tx_first;
+@@ -376,7 +381,7 @@ static void remove_from_tx_queue(struct r3964_info *pInfo, int error_code)
+ }
+
+ static void add_rx_queue(struct r3964_info *pInfo,
+- struct r3964_block_header *pHeader)
++ struct rx_block_header *pHeader)
+ {
+ unsigned long flags;
+
+@@ -400,10 +405,10 @@ static void add_rx_queue(struct r3964_info *pInfo,
+ }
+
+ static void remove_from_rx_queue(struct r3964_info *pInfo,
+- struct r3964_block_header *pHeader)
++ struct rx_block_header *pHeader)
+ {
+ unsigned long flags;
+- struct r3964_block_header *pFind;
++ struct rx_block_header *pFind;
+
+ if (pHeader == NULL)
+ return;
+@@ -517,7 +522,7 @@ static void retry_transmit(struct r3964_info *pInfo)
+ static void transmit_block(struct r3964_info *pInfo)
+ {
+ struct tty_struct *tty = pInfo->tty;
+- struct r3964_block_header *pBlock = pInfo->tx_first;
++ struct tx_block_header *pBlock = pInfo->tx_first;
+ int room = 0;
+
+ if (tty == NULL || pBlock == NULL) {
+@@ -558,7 +563,7 @@ static void on_receive_block(struct r3964_info *pInfo)
+ {
+ unsigned int length;
+ struct r3964_client_info *pClient;
+- struct r3964_block_header *pBlock;
++ struct rx_block_header *pBlock;
+ unsigned long flags;
+
+ length = pInfo->rx_position;
+@@ -596,20 +601,17 @@ static void on_receive_block(struct r3964_info *pInfo)
+ del_timer_sync(&pInfo->tmr);
+ TRACE_PS(" rx success: got %d chars", length);
+
+- /* prepare struct r3964_block_header: */
+- pBlock = kmalloc(length + sizeof(struct r3964_block_header),
+- GFP_KERNEL);
++ /* prepare struct rx_block_header: */
++ pBlock = kmalloc(length + sizeof(*pBlock), GFP_KERNEL);
+ TRACE_M("on_receive_block - kmalloc %p", pBlock);
+
+ if (pBlock == NULL)
+ return;
+
+ pBlock->length = length;
+- pBlock->data = ((unsigned char *)pBlock) +
+- sizeof(struct r3964_block_header);
++ pBlock->data = ((unsigned char *)pBlock) + sizeof(*pBlock);
+ pBlock->locks = 0;
+ pBlock->next = NULL;
+- pBlock->owner = NULL;
+
+ memcpy(pBlock->data, pInfo->rx_buf, length);
+
+@@ -905,7 +907,7 @@ static int read_telegram(struct r3964_info *pInfo, struct pid *pid,
+ unsigned char __user * buf)
+ {
+ struct r3964_client_info *pClient;
+- struct r3964_block_header *block;
++ struct rx_block_header *block;
+
+ if (!buf) {
+ return -EINVAL;
+@@ -931,7 +933,7 @@ static int read_telegram(struct r3964_info *pInfo, struct pid *pid,
+ }
+
+ static void add_msg(struct r3964_client_info *pClient, int msg_id, int arg,
+- int error_code, struct r3964_block_header *pBlock)
++ int error_code, struct rx_block_header *pBlock)
+ {
+ struct r3964_message *pMsg;
+ unsigned long flags;
+@@ -1014,7 +1016,7 @@ static struct r3964_message *remove_msg(struct r3964_info *pInfo,
+ static void remove_client_block(struct r3964_info *pInfo,
+ struct r3964_client_info *pClient)
+ {
+- struct r3964_block_header *block;
++ struct rx_block_header *block;
+
+ TRACE_PS("remove_client_block PID %d", pid_nr(pClient->pid));
+
+@@ -1098,7 +1100,7 @@ static void r3964_close(struct tty_struct *tty)
+ struct r3964_info *pInfo = tty->disc_data;
+ struct r3964_client_info *pClient, *pNext;
+ struct r3964_message *pMsg;
+- struct r3964_block_header *pHeader, *pNextHeader;
++ struct tx_block_header *pHeader, *pNextHeader;
+ unsigned long flags;
+
+ TRACE_L("close");
+@@ -1214,7 +1216,7 @@ static ssize_t r3964_write(struct tty_struct *tty, struct file *file,
+ const unsigned char *data, size_t count)
+ {
+ struct r3964_info *pInfo = tty->disc_data;
+- struct r3964_block_header *pHeader;
++ struct tx_block_header *pHeader;
+ struct r3964_client_info *pClient;
+ unsigned char *new_data;
+
+@@ -1239,8 +1241,7 @@ static ssize_t r3964_write(struct tty_struct *tty, struct file *file,
+ /*
+ * Allocate a buffer for the data and copy it from the buffer with header prepended
+ */
+- new_data = kmalloc(count + sizeof(struct r3964_block_header),
+- GFP_KERNEL);
++ new_data = kmalloc(count + sizeof(*pHeader), GFP_KERNEL);
+ TRACE_M("r3964_write - kmalloc %p", new_data);
+ if (new_data == NULL) {
+ if (pInfo->flags & R3964_DEBUG) {
+@@ -1249,10 +1250,9 @@ static ssize_t r3964_write(struct tty_struct *tty, struct file *file,
+ return -ENOSPC;
+ }
+
+- pHeader = (struct r3964_block_header *)new_data;
+- pHeader->data = new_data + sizeof(struct r3964_block_header);
++ pHeader = (struct tx_block_header *)new_data;
++ pHeader->data = new_data + sizeof(*pHeader);
+ pHeader->length = count;
+- pHeader->locks = 0;
+ pHeader->owner = NULL;
+
+ pClient = findClient(pInfo, task_pid(current));
+--
+2.21.0
+