Lines Matching refs:pInfo
111 static void remove_from_tx_queue(struct r3964_info *pInfo, int error_code);
112 static void put_char(struct r3964_info *pInfo, unsigned char ch);
113 static void trigger_transmit(struct r3964_info *pInfo);
114 static void retry_transmit(struct r3964_info *pInfo);
115 static void transmit_block(struct r3964_info *pInfo);
116 static void receive_char(struct r3964_info *pInfo, const unsigned char c);
117 static void receive_error(struct r3964_info *pInfo, const char flag);
119 static int enable_signals(struct r3964_info *pInfo, struct pid *pid, int arg);
120 static int read_telegram(struct r3964_info *pInfo, struct pid *pid,
124 static struct r3964_message *remove_msg(struct r3964_info *pInfo,
126 static void remove_client_block(struct r3964_info *pInfo,
233 static void add_tx_queue(struct r3964_info *pInfo, in add_tx_queue() argument
238 spin_lock_irqsave(&pInfo->lock, flags); in add_tx_queue()
242 if (pInfo->tx_last == NULL) { in add_tx_queue()
243 pInfo->tx_first = pInfo->tx_last = pHeader; in add_tx_queue()
245 pInfo->tx_last->next = pHeader; in add_tx_queue()
246 pInfo->tx_last = pHeader; in add_tx_queue()
249 spin_unlock_irqrestore(&pInfo->lock, flags); in add_tx_queue()
252 pHeader, pHeader->length, pInfo->tx_first); in add_tx_queue()
255 static void remove_from_tx_queue(struct r3964_info *pInfo, int error_code) in remove_from_tx_queue() argument
263 pHeader = pInfo->tx_first; in remove_from_tx_queue()
284 wake_up_interruptible(&pInfo->tty->read_wait); in remove_from_tx_queue()
287 spin_lock_irqsave(&pInfo->lock, flags); in remove_from_tx_queue()
289 pInfo->tx_first = pHeader->next; in remove_from_tx_queue()
290 if (pInfo->tx_first == NULL) { in remove_from_tx_queue()
291 pInfo->tx_last = NULL; in remove_from_tx_queue()
294 spin_unlock_irqrestore(&pInfo->lock, flags); in remove_from_tx_queue()
300 pInfo->tx_first, pInfo->tx_last); in remove_from_tx_queue()
303 static void add_rx_queue(struct r3964_info *pInfo, in add_rx_queue() argument
308 spin_lock_irqsave(&pInfo->lock, flags); in add_rx_queue()
312 if (pInfo->rx_last == NULL) { in add_rx_queue()
313 pInfo->rx_first = pInfo->rx_last = pHeader; in add_rx_queue()
315 pInfo->rx_last->next = pHeader; in add_rx_queue()
316 pInfo->rx_last = pHeader; in add_rx_queue()
318 pInfo->blocks_in_rx_queue++; in add_rx_queue()
320 spin_unlock_irqrestore(&pInfo->lock, flags); in add_rx_queue()
324 pInfo->rx_first, pInfo->blocks_in_rx_queue); in add_rx_queue()
327 static void remove_from_rx_queue(struct r3964_info *pInfo, in remove_from_rx_queue() argument
337 pInfo->rx_first, pInfo->rx_last, pInfo->blocks_in_rx_queue); in remove_from_rx_queue()
341 spin_lock_irqsave(&pInfo->lock, flags); in remove_from_rx_queue()
343 if (pInfo->rx_first == pHeader) { in remove_from_rx_queue()
345 pInfo->rx_first = pHeader->next; in remove_from_rx_queue()
347 if (pInfo->rx_first == NULL) { in remove_from_rx_queue()
348 pInfo->rx_last = NULL; in remove_from_rx_queue()
350 pInfo->blocks_in_rx_queue--; in remove_from_rx_queue()
353 for (pFind = pInfo->rx_first; pFind; pFind = pFind->next) { in remove_from_rx_queue()
357 pInfo->blocks_in_rx_queue--; in remove_from_rx_queue()
360 pInfo->rx_last = pFind; in remove_from_rx_queue()
367 spin_unlock_irqrestore(&pInfo->lock, flags); in remove_from_rx_queue()
373 pInfo->rx_first, pInfo->rx_last, pInfo->blocks_in_rx_queue); in remove_from_rx_queue()
376 static void put_char(struct r3964_info *pInfo, unsigned char ch) in put_char() argument
378 struct tty_struct *tty = pInfo->tty; in put_char()
381 pInfo->bcc ^= ch; in put_char()
384 static void flush(struct r3964_info *pInfo) in flush() argument
386 struct tty_struct *tty = pInfo->tty; in flush()
393 static void trigger_transmit(struct r3964_info *pInfo) in trigger_transmit() argument
397 spin_lock_irqsave(&pInfo->lock, flags); in trigger_transmit()
399 if ((pInfo->state == R3964_IDLE) && (pInfo->tx_first != NULL)) { in trigger_transmit()
400 pInfo->state = R3964_TX_REQUEST; in trigger_transmit()
401 pInfo->nRetry = 0; in trigger_transmit()
402 pInfo->flags &= ~R3964_ERROR; in trigger_transmit()
403 mod_timer(&pInfo->tmr, jiffies + R3964_TO_QVZ); in trigger_transmit()
405 spin_unlock_irqrestore(&pInfo->lock, flags); in trigger_transmit()
409 put_char(pInfo, STX); in trigger_transmit()
410 flush(pInfo); in trigger_transmit()
412 pInfo->bcc = 0; in trigger_transmit()
414 spin_unlock_irqrestore(&pInfo->lock, flags); in trigger_transmit()
418 static void retry_transmit(struct r3964_info *pInfo) in retry_transmit() argument
420 if (pInfo->nRetry < R3964_MAX_RETRIES) { in retry_transmit()
421 TRACE_PE("transmission failed. Retry #%d", pInfo->nRetry); in retry_transmit()
422 pInfo->bcc = 0; in retry_transmit()
423 put_char(pInfo, STX); in retry_transmit()
424 flush(pInfo); in retry_transmit()
425 pInfo->state = R3964_TX_REQUEST; in retry_transmit()
426 pInfo->nRetry++; in retry_transmit()
427 mod_timer(&pInfo->tmr, jiffies + R3964_TO_QVZ); in retry_transmit()
432 remove_from_tx_queue(pInfo, R3964_TX_FAIL); in retry_transmit()
434 put_char(pInfo, NAK); in retry_transmit()
435 flush(pInfo); in retry_transmit()
436 pInfo->state = R3964_IDLE; in retry_transmit()
438 trigger_transmit(pInfo); in retry_transmit()
442 static void transmit_block(struct r3964_info *pInfo) in transmit_block() argument
444 struct tty_struct *tty = pInfo->tty; in transmit_block()
445 struct r3964_block_header *pBlock = pInfo->tx_first; in transmit_block()
457 while (pInfo->tx_position < pBlock->length) { in transmit_block()
461 if (pBlock->data[pInfo->tx_position] == DLE) { in transmit_block()
463 put_char(pInfo, DLE); in transmit_block()
465 put_char(pInfo, pBlock->data[pInfo->tx_position++]); in transmit_block()
470 if ((pInfo->tx_position == pBlock->length) && (room >= 3)) { in transmit_block()
471 put_char(pInfo, DLE); in transmit_block()
472 put_char(pInfo, ETX); in transmit_block()
473 if (pInfo->flags & R3964_BCC) { in transmit_block()
474 put_char(pInfo, pInfo->bcc); in transmit_block()
476 pInfo->state = R3964_WAIT_FOR_TX_ACK; in transmit_block()
477 mod_timer(&pInfo->tmr, jiffies + R3964_TO_QVZ); in transmit_block()
479 flush(pInfo); in transmit_block()
482 static void on_receive_block(struct r3964_info *pInfo) in on_receive_block() argument
488 length = pInfo->rx_position; in on_receive_block()
491 if (pInfo->flags & R3964_BCC) { in on_receive_block()
492 if (pInfo->bcc != pInfo->last_rx) { in on_receive_block()
494 pInfo->last_rx, pInfo->bcc); in on_receive_block()
495 pInfo->flags |= R3964_CHECKSUM; in on_receive_block()
500 if (pInfo->flags & R3964_ERROR) { in on_receive_block()
502 pInfo->flags & R3964_ERROR); in on_receive_block()
504 put_char(pInfo, NAK); in on_receive_block()
505 flush(pInfo); in on_receive_block()
506 if (pInfo->nRetry < R3964_MAX_RETRIES) { in on_receive_block()
507 pInfo->state = R3964_WAIT_FOR_RX_REPEAT; in on_receive_block()
508 pInfo->nRetry++; in on_receive_block()
509 mod_timer(&pInfo->tmr, jiffies + R3964_TO_RX_PANIC); in on_receive_block()
512 pInfo->state = R3964_IDLE; in on_receive_block()
518 put_char(pInfo, DLE); in on_receive_block()
519 flush(pInfo); in on_receive_block()
520 del_timer_sync(&pInfo->tmr); in on_receive_block()
538 memcpy(pBlock->data, pInfo->rx_buf, length); in on_receive_block()
541 add_rx_queue(pInfo, pBlock); in on_receive_block()
544 for (pClient = pInfo->firstClient; pClient; pClient = pClient->next) { in on_receive_block()
550 wake_up_interruptible(&pInfo->tty->read_wait); in on_receive_block()
552 pInfo->state = R3964_IDLE; in on_receive_block()
554 trigger_transmit(pInfo); in on_receive_block()
557 static void receive_char(struct r3964_info *pInfo, const unsigned char c) in receive_char() argument
559 switch (pInfo->state) { in receive_char()
564 pInfo->state = R3964_TRANSMITTING; in receive_char()
565 pInfo->tx_position = 0; in receive_char()
567 transmit_block(pInfo); in receive_char()
569 if (pInfo->nRetry == 0) { in receive_char()
571 if (pInfo->priority == R3964_SLAVE) { in receive_char()
582 retry_transmit(pInfo); in receive_char()
588 retry_transmit(pInfo); in receive_char()
592 pInfo->state = R3964_WAIT_ZVZ_BEFORE_TX_RETRY; in receive_char()
593 mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ); in receive_char()
599 remove_from_tx_queue(pInfo, R3964_OK); in receive_char()
601 pInfo->state = R3964_IDLE; in receive_char()
602 trigger_transmit(pInfo); in receive_char()
604 retry_transmit(pInfo); in receive_char()
611 if (pInfo->blocks_in_rx_queue >= in receive_char()
615 pInfo->state = R3964_WAIT_FOR_RX_BUF; in receive_char()
616 mod_timer(&pInfo->tmr, in receive_char()
623 pInfo->rx_position = 0; in receive_char()
624 pInfo->last_rx = 0; in receive_char()
625 pInfo->flags &= ~R3964_ERROR; in receive_char()
626 pInfo->state = R3964_RECEIVING; in receive_char()
627 mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ); in receive_char()
628 pInfo->nRetry = 0; in receive_char()
629 put_char(pInfo, DLE); in receive_char()
630 flush(pInfo); in receive_char()
631 pInfo->bcc = 0; in receive_char()
635 if (pInfo->rx_position < RX_BUF_SIZE) { in receive_char()
636 pInfo->bcc ^= c; in receive_char()
639 if (pInfo->last_rx == DLE) { in receive_char()
640 pInfo->last_rx = 0; in receive_char()
643 pInfo->last_rx = DLE; in receive_char()
645 } else if ((c == ETX) && (pInfo->last_rx == DLE)) { in receive_char()
646 if (pInfo->flags & R3964_BCC) { in receive_char()
647 pInfo->state = R3964_WAIT_FOR_BCC; in receive_char()
648 mod_timer(&pInfo->tmr, in receive_char()
651 on_receive_block(pInfo); in receive_char()
654 pInfo->last_rx = c; in receive_char()
656 pInfo->rx_buf[pInfo->rx_position++] = c; in receive_char()
657 mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ); in receive_char()
663 pInfo->last_rx = c; in receive_char()
664 on_receive_block(pInfo); in receive_char()
669 static void receive_error(struct r3964_info *pInfo, const char flag) in receive_error() argument
676 pInfo->flags |= R3964_BREAK; in receive_error()
680 pInfo->flags |= R3964_PARITY; in receive_error()
684 pInfo->flags |= R3964_FRAME; in receive_error()
688 pInfo->flags |= R3964_OVERRUN; in receive_error()
692 pInfo->flags |= R3964_UNKNOWN; in receive_error()
699 struct r3964_info *pInfo = from_timer(pInfo, t, tmr); in on_timeout() local
701 switch (pInfo->state) { in on_timeout()
704 retry_transmit(pInfo); in on_timeout()
707 put_char(pInfo, NAK); in on_timeout()
708 flush(pInfo); in on_timeout()
709 retry_transmit(pInfo); in on_timeout()
713 retry_transmit(pInfo); in on_timeout()
717 put_char(pInfo, NAK); in on_timeout()
718 flush(pInfo); in on_timeout()
719 pInfo->state = R3964_IDLE; in on_timeout()
723 pInfo->rx_position); in on_timeout()
724 put_char(pInfo, NAK); in on_timeout()
725 flush(pInfo); in on_timeout()
726 pInfo->state = R3964_IDLE; in on_timeout()
730 pInfo->state = R3964_IDLE; in on_timeout()
734 put_char(pInfo, NAK); in on_timeout()
735 flush(pInfo); in on_timeout()
736 pInfo->state = R3964_IDLE; in on_timeout()
741 static struct r3964_client_info *findClient(struct r3964_info *pInfo, in findClient() argument
746 for (pClient = pInfo->firstClient; pClient; pClient = pClient->next) { in findClient()
754 static int enable_signals(struct r3964_info *pInfo, struct pid *pid, int arg) in enable_signals() argument
762 for (ppClient = &pInfo->firstClient; *ppClient; in enable_signals()
771 pMsg = remove_msg(pInfo, pClient); in enable_signals()
786 pClient = findClient(pInfo, pid); in enable_signals()
802 pClient->next = pInfo->firstClient; in enable_signals()
807 pInfo->firstClient = pClient; in enable_signals()
814 static int read_telegram(struct r3964_info *pInfo, struct pid *pid, in read_telegram() argument
824 pClient = findClient(pInfo, pid); in read_telegram()
836 remove_client_block(pInfo, pClient); in read_telegram()
900 static struct r3964_message *remove_msg(struct r3964_info *pInfo, in remove_msg() argument
917 remove_client_block(pInfo, pClient); in remove_msg()
925 static void remove_client_block(struct r3964_info *pInfo, in remove_client_block() argument
936 remove_from_rx_queue(pInfo, block); in remove_client_block()
948 struct r3964_info *pInfo; in r3964_open() local
954 pInfo = kmalloc(sizeof(struct r3964_info), GFP_KERNEL); in r3964_open()
955 TRACE_M("r3964_open - info kmalloc %p", pInfo); in r3964_open()
957 if (!pInfo) { in r3964_open()
962 pInfo->rx_buf = kmalloc(RX_BUF_SIZE, GFP_KERNEL); in r3964_open()
963 TRACE_M("r3964_open - rx_buf kmalloc %p", pInfo->rx_buf); in r3964_open()
965 if (!pInfo->rx_buf) { in r3964_open()
967 kfree(pInfo); in r3964_open()
968 TRACE_M("r3964_open - info kfree %p", pInfo); in r3964_open()
972 pInfo->tx_buf = kmalloc(TX_BUF_SIZE, GFP_KERNEL); in r3964_open()
973 TRACE_M("r3964_open - tx_buf kmalloc %p", pInfo->tx_buf); in r3964_open()
975 if (!pInfo->tx_buf) { in r3964_open()
977 kfree(pInfo->rx_buf); in r3964_open()
978 TRACE_M("r3964_open - rx_buf kfree %p", pInfo->rx_buf); in r3964_open()
979 kfree(pInfo); in r3964_open()
980 TRACE_M("r3964_open - info kfree %p", pInfo); in r3964_open()
984 spin_lock_init(&pInfo->lock); in r3964_open()
985 mutex_init(&pInfo->read_lock); in r3964_open()
986 pInfo->tty = tty; in r3964_open()
987 pInfo->priority = R3964_MASTER; in r3964_open()
988 pInfo->rx_first = pInfo->rx_last = NULL; in r3964_open()
989 pInfo->tx_first = pInfo->tx_last = NULL; in r3964_open()
990 pInfo->rx_position = 0; in r3964_open()
991 pInfo->tx_position = 0; in r3964_open()
992 pInfo->last_rx = 0; in r3964_open()
993 pInfo->blocks_in_rx_queue = 0; in r3964_open()
994 pInfo->firstClient = NULL; in r3964_open()
995 pInfo->state = R3964_IDLE; in r3964_open()
996 pInfo->flags = R3964_DEBUG; in r3964_open()
997 pInfo->nRetry = 0; in r3964_open()
999 tty->disc_data = pInfo; in r3964_open()
1002 timer_setup(&pInfo->tmr, on_timeout, 0); in r3964_open()
1009 struct r3964_info *pInfo = tty->disc_data; in r3964_close() local
1021 del_timer_sync(&pInfo->tmr); in r3964_close()
1024 pClient = pInfo->firstClient; in r3964_close()
1028 pMsg = remove_msg(pInfo, pClient); in r3964_close()
1040 spin_lock_irqsave(&pInfo->lock, flags); in r3964_close()
1041 pHeader = pInfo->tx_first; in r3964_close()
1042 pInfo->tx_first = pInfo->tx_last = NULL; in r3964_close()
1043 spin_unlock_irqrestore(&pInfo->lock, flags); in r3964_close()
1052 kfree(pInfo->rx_buf); in r3964_close()
1053 TRACE_M("r3964_close - rx_buf kfree %p", pInfo->rx_buf); in r3964_close()
1054 kfree(pInfo->tx_buf); in r3964_close()
1055 TRACE_M("r3964_close - tx_buf kfree %p", pInfo->tx_buf); in r3964_close()
1056 kfree(pInfo); in r3964_close()
1057 TRACE_M("r3964_close - info kfree %p", pInfo); in r3964_close()
1064 struct r3964_info *pInfo = tty->disc_data; in r3964_read() local
1076 if (!mutex_trylock(&pInfo->read_lock)) in r3964_read()
1079 if (mutex_lock_interruptible(&pInfo->read_lock)) in r3964_read()
1083 pClient = findClient(pInfo, task_pid(current)); in r3964_read()
1085 pMsg = remove_msg(pInfo, pClient); in r3964_read()
1094 (pMsg = remove_msg(pInfo, pClient))); in r3964_read()
1120 mutex_unlock(&pInfo->read_lock); in r3964_read()
1127 struct r3964_info *pInfo = tty->disc_data; in r3964_write() local
1137 if (!pInfo) in r3964_write()
1144 if (pInfo->flags & R3964_DEBUG) { in r3964_write()
1157 if (pInfo->flags & R3964_DEBUG) { in r3964_write()
1169 pClient = findClient(pInfo, task_pid(current)); in r3964_write()
1176 if (pInfo->flags & R3964_DEBUG) { in r3964_write()
1183 add_tx_queue(pInfo, pHeader); in r3964_write()
1184 trigger_transmit(pInfo); in r3964_write()
1192 struct r3964_info *pInfo = tty->disc_data; in r3964_ioctl() local
1193 if (pInfo == NULL) in r3964_ioctl()
1197 return enable_signals(pInfo, task_pid(current), arg); in r3964_ioctl()
1201 pInfo->priority = arg & 0xff; in r3964_ioctl()
1205 pInfo->flags |= R3964_BCC; in r3964_ioctl()
1207 pInfo->flags &= ~R3964_BCC; in r3964_ioctl()
1210 return read_telegram(pInfo, task_pid(current), in r3964_ioctl()
1241 struct r3964_info *pInfo = tty->disc_data; in r3964_poll() local
1249 pClient = findClient(pInfo, task_pid(current)); in r3964_poll()
1252 spin_lock_irqsave(&pInfo->lock, flags); in r3964_poll()
1254 spin_unlock_irqrestore(&pInfo->lock, flags); in r3964_poll()
1266 struct r3964_info *pInfo = tty->disc_data; in r3964_receive_buf() local
1275 receive_char(pInfo, *p); in r3964_receive_buf()
1277 receive_error(pInfo, flags); in r3964_receive_buf()