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()
612 if (pInfo->blocks_in_rx_queue >= in receive_char()
616 pInfo->state = R3964_WAIT_FOR_RX_BUF; in receive_char()
617 mod_timer(&pInfo->tmr, in receive_char()
624 pInfo->rx_position = 0; in receive_char()
625 pInfo->last_rx = 0; in receive_char()
626 pInfo->flags &= ~R3964_ERROR; in receive_char()
627 pInfo->state = R3964_RECEIVING; in receive_char()
628 mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ); in receive_char()
629 pInfo->nRetry = 0; in receive_char()
630 put_char(pInfo, DLE); in receive_char()
631 flush(pInfo); in receive_char()
632 pInfo->bcc = 0; in receive_char()
636 if (pInfo->rx_position < RX_BUF_SIZE) { in receive_char()
637 pInfo->bcc ^= c; in receive_char()
640 if (pInfo->last_rx == DLE) { in receive_char()
641 pInfo->last_rx = 0; in receive_char()
644 pInfo->last_rx = DLE; in receive_char()
646 } else if ((c == ETX) && (pInfo->last_rx == DLE)) { in receive_char()
647 if (pInfo->flags & R3964_BCC) { in receive_char()
648 pInfo->state = R3964_WAIT_FOR_BCC; in receive_char()
649 mod_timer(&pInfo->tmr, in receive_char()
652 on_receive_block(pInfo); in receive_char()
655 pInfo->last_rx = c; in receive_char()
657 pInfo->rx_buf[pInfo->rx_position++] = c; in receive_char()
658 mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ); in receive_char()
664 pInfo->last_rx = c; in receive_char()
665 on_receive_block(pInfo); in receive_char()
670 static void receive_error(struct r3964_info *pInfo, const char flag) in receive_error() argument
677 pInfo->flags |= R3964_BREAK; in receive_error()
681 pInfo->flags |= R3964_PARITY; in receive_error()
685 pInfo->flags |= R3964_FRAME; in receive_error()
689 pInfo->flags |= R3964_OVERRUN; in receive_error()
693 pInfo->flags |= R3964_UNKNOWN; in receive_error()
700 struct r3964_info *pInfo = from_timer(pInfo, t, tmr); in on_timeout() local
702 switch (pInfo->state) { in on_timeout()
705 retry_transmit(pInfo); in on_timeout()
708 put_char(pInfo, NAK); in on_timeout()
709 flush(pInfo); in on_timeout()
710 retry_transmit(pInfo); in on_timeout()
714 retry_transmit(pInfo); in on_timeout()
718 put_char(pInfo, NAK); in on_timeout()
719 flush(pInfo); in on_timeout()
720 pInfo->state = R3964_IDLE; in on_timeout()
724 pInfo->rx_position); in on_timeout()
725 put_char(pInfo, NAK); in on_timeout()
726 flush(pInfo); in on_timeout()
727 pInfo->state = R3964_IDLE; in on_timeout()
731 pInfo->state = R3964_IDLE; in on_timeout()
735 put_char(pInfo, NAK); in on_timeout()
736 flush(pInfo); in on_timeout()
737 pInfo->state = R3964_IDLE; in on_timeout()
742 static struct r3964_client_info *findClient(struct r3964_info *pInfo, in findClient() argument
747 for (pClient = pInfo->firstClient; pClient; pClient = pClient->next) { in findClient()
755 static int enable_signals(struct r3964_info *pInfo, struct pid *pid, int arg) in enable_signals() argument
763 for (ppClient = &pInfo->firstClient; *ppClient; in enable_signals()
772 pMsg = remove_msg(pInfo, pClient); in enable_signals()
787 pClient = findClient(pInfo, pid); in enable_signals()
803 pClient->next = pInfo->firstClient; in enable_signals()
808 pInfo->firstClient = pClient; in enable_signals()
815 static int read_telegram(struct r3964_info *pInfo, struct pid *pid, in read_telegram() argument
825 pClient = findClient(pInfo, pid); in read_telegram()
837 remove_client_block(pInfo, pClient); in read_telegram()
901 static struct r3964_message *remove_msg(struct r3964_info *pInfo, in remove_msg() argument
918 remove_client_block(pInfo, pClient); in remove_msg()
926 static void remove_client_block(struct r3964_info *pInfo, in remove_client_block() argument
937 remove_from_rx_queue(pInfo, block); in remove_client_block()
949 struct r3964_info *pInfo; in r3964_open() local
955 pInfo = kmalloc(sizeof(struct r3964_info), GFP_KERNEL); in r3964_open()
956 TRACE_M("r3964_open - info kmalloc %p", pInfo); in r3964_open()
958 if (!pInfo) { in r3964_open()
963 pInfo->rx_buf = kmalloc(RX_BUF_SIZE, GFP_KERNEL); in r3964_open()
964 TRACE_M("r3964_open - rx_buf kmalloc %p", pInfo->rx_buf); in r3964_open()
966 if (!pInfo->rx_buf) { in r3964_open()
968 kfree(pInfo); in r3964_open()
969 TRACE_M("r3964_open - info kfree %p", pInfo); in r3964_open()
973 pInfo->tx_buf = kmalloc(TX_BUF_SIZE, GFP_KERNEL); in r3964_open()
974 TRACE_M("r3964_open - tx_buf kmalloc %p", pInfo->tx_buf); in r3964_open()
976 if (!pInfo->tx_buf) { in r3964_open()
978 kfree(pInfo->rx_buf); in r3964_open()
979 TRACE_M("r3964_open - rx_buf kfree %p", pInfo->rx_buf); in r3964_open()
980 kfree(pInfo); in r3964_open()
981 TRACE_M("r3964_open - info kfree %p", pInfo); in r3964_open()
985 spin_lock_init(&pInfo->lock); in r3964_open()
986 mutex_init(&pInfo->read_lock); in r3964_open()
987 pInfo->tty = tty; in r3964_open()
988 pInfo->priority = R3964_MASTER; in r3964_open()
989 pInfo->rx_first = pInfo->rx_last = NULL; in r3964_open()
990 pInfo->tx_first = pInfo->tx_last = NULL; in r3964_open()
991 pInfo->rx_position = 0; in r3964_open()
992 pInfo->tx_position = 0; in r3964_open()
993 pInfo->last_rx = 0; in r3964_open()
994 pInfo->blocks_in_rx_queue = 0; in r3964_open()
995 pInfo->firstClient = NULL; in r3964_open()
996 pInfo->state = R3964_IDLE; in r3964_open()
997 pInfo->flags = R3964_DEBUG; in r3964_open()
998 pInfo->nRetry = 0; in r3964_open()
1000 tty->disc_data = pInfo; in r3964_open()
1003 timer_setup(&pInfo->tmr, on_timeout, 0); in r3964_open()
1010 struct r3964_info *pInfo = tty->disc_data; in r3964_close() local
1022 del_timer_sync(&pInfo->tmr); in r3964_close()
1025 pClient = pInfo->firstClient; in r3964_close()
1029 pMsg = remove_msg(pInfo, pClient); in r3964_close()
1041 spin_lock_irqsave(&pInfo->lock, flags); in r3964_close()
1042 pHeader = pInfo->tx_first; in r3964_close()
1043 pInfo->tx_first = pInfo->tx_last = NULL; in r3964_close()
1044 spin_unlock_irqrestore(&pInfo->lock, flags); in r3964_close()
1053 kfree(pInfo->rx_buf); in r3964_close()
1054 TRACE_M("r3964_close - rx_buf kfree %p", pInfo->rx_buf); in r3964_close()
1055 kfree(pInfo->tx_buf); in r3964_close()
1056 TRACE_M("r3964_close - tx_buf kfree %p", pInfo->tx_buf); in r3964_close()
1057 kfree(pInfo); in r3964_close()
1058 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()
1123 mutex_unlock(&pInfo->read_lock); in r3964_read()
1130 struct r3964_info *pInfo = tty->disc_data; in r3964_write() local
1140 if (!pInfo) in r3964_write()
1147 if (pInfo->flags & R3964_DEBUG) { in r3964_write()
1160 if (pInfo->flags & R3964_DEBUG) { in r3964_write()
1172 pClient = findClient(pInfo, task_pid(current)); in r3964_write()
1179 if (pInfo->flags & R3964_DEBUG) { in r3964_write()
1186 add_tx_queue(pInfo, pHeader); in r3964_write()
1187 trigger_transmit(pInfo); in r3964_write()
1195 struct r3964_info *pInfo = tty->disc_data; in r3964_ioctl() local
1196 if (pInfo == NULL) in r3964_ioctl()
1200 return enable_signals(pInfo, task_pid(current), arg); in r3964_ioctl()
1204 pInfo->priority = arg & 0xff; in r3964_ioctl()
1208 pInfo->flags |= R3964_BCC; in r3964_ioctl()
1210 pInfo->flags &= ~R3964_BCC; in r3964_ioctl()
1213 return read_telegram(pInfo, task_pid(current), in r3964_ioctl()
1244 struct r3964_info *pInfo = tty->disc_data; in r3964_poll() local
1252 pClient = findClient(pInfo, task_pid(current)); in r3964_poll()
1255 spin_lock_irqsave(&pInfo->lock, flags); in r3964_poll()
1257 spin_unlock_irqrestore(&pInfo->lock, flags); in r3964_poll()
1269 struct r3964_info *pInfo = tty->disc_data; in r3964_receive_buf() local
1278 receive_char(pInfo, *p); in r3964_receive_buf()
1280 receive_error(pInfo, flags); in r3964_receive_buf()