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.patch | 265 |
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 + |
