Lines Matching refs:pInfo

113 static void remove_from_tx_queue(struct r3964_info *pInfo, int error_code);
114 static void put_char(struct r3964_info *pInfo, unsigned char ch);
115 static void trigger_transmit(struct r3964_info *pInfo);
116 static void retry_transmit(struct r3964_info *pInfo);
117 static void transmit_block(struct r3964_info *pInfo);
118 static void receive_char(struct r3964_info *pInfo, const unsigned char c);
119 static void receive_error(struct r3964_info *pInfo, const char flag);
121 static int enable_signals(struct r3964_info *pInfo, struct pid *pid, int arg);
122 static int read_telegram(struct r3964_info *pInfo, struct pid *pid,
126 static struct r3964_message *remove_msg(struct r3964_info *pInfo,
128 static void remove_client_block(struct r3964_info *pInfo,
228 static void add_tx_queue(struct r3964_info *pInfo, in add_tx_queue() argument
233 spin_lock_irqsave(&pInfo->lock, flags); in add_tx_queue()
237 if (pInfo->tx_last == NULL) { in add_tx_queue()
238 pInfo->tx_first = pInfo->tx_last = pHeader; in add_tx_queue()
240 pInfo->tx_last->next = pHeader; in add_tx_queue()
241 pInfo->tx_last = pHeader; in add_tx_queue()
244 spin_unlock_irqrestore(&pInfo->lock, flags); in add_tx_queue()
247 pHeader, pHeader->length, pInfo->tx_first); in add_tx_queue()
250 static void remove_from_tx_queue(struct r3964_info *pInfo, int error_code) in remove_from_tx_queue() argument
258 pHeader = pInfo->tx_first; in remove_from_tx_queue()
279 wake_up_interruptible(&pInfo->read_wait); in remove_from_tx_queue()
282 spin_lock_irqsave(&pInfo->lock, flags); in remove_from_tx_queue()
284 pInfo->tx_first = pHeader->next; in remove_from_tx_queue()
285 if (pInfo->tx_first == NULL) { in remove_from_tx_queue()
286 pInfo->tx_last = NULL; in remove_from_tx_queue()
289 spin_unlock_irqrestore(&pInfo->lock, flags); in remove_from_tx_queue()
295 pInfo->tx_first, pInfo->tx_last); in remove_from_tx_queue()
298 static void add_rx_queue(struct r3964_info *pInfo, in add_rx_queue() argument
303 spin_lock_irqsave(&pInfo->lock, flags); in add_rx_queue()
307 if (pInfo->rx_last == NULL) { in add_rx_queue()
308 pInfo->rx_first = pInfo->rx_last = pHeader; in add_rx_queue()
310 pInfo->rx_last->next = pHeader; in add_rx_queue()
311 pInfo->rx_last = pHeader; in add_rx_queue()
313 pInfo->blocks_in_rx_queue++; in add_rx_queue()
315 spin_unlock_irqrestore(&pInfo->lock, flags); in add_rx_queue()
319 pInfo->rx_first, pInfo->blocks_in_rx_queue); in add_rx_queue()
322 static void remove_from_rx_queue(struct r3964_info *pInfo, in remove_from_rx_queue() argument
332 pInfo->rx_first, pInfo->rx_last, pInfo->blocks_in_rx_queue); in remove_from_rx_queue()
336 spin_lock_irqsave(&pInfo->lock, flags); in remove_from_rx_queue()
338 if (pInfo->rx_first == pHeader) { in remove_from_rx_queue()
340 pInfo->rx_first = pHeader->next; in remove_from_rx_queue()
342 if (pInfo->rx_first == NULL) { in remove_from_rx_queue()
343 pInfo->rx_last = NULL; in remove_from_rx_queue()
345 pInfo->blocks_in_rx_queue--; in remove_from_rx_queue()
348 for (pFind = pInfo->rx_first; pFind; pFind = pFind->next) { in remove_from_rx_queue()
352 pInfo->blocks_in_rx_queue--; in remove_from_rx_queue()
355 pInfo->rx_last = pFind; in remove_from_rx_queue()
362 spin_unlock_irqrestore(&pInfo->lock, flags); in remove_from_rx_queue()
368 pInfo->rx_first, pInfo->rx_last, pInfo->blocks_in_rx_queue); in remove_from_rx_queue()
371 static void put_char(struct r3964_info *pInfo, unsigned char ch) in put_char() argument
373 struct tty_struct *tty = pInfo->tty; in put_char()
376 pInfo->bcc ^= ch; in put_char()
379 static void flush(struct r3964_info *pInfo) in flush() argument
381 struct tty_struct *tty = pInfo->tty; in flush()
388 static void trigger_transmit(struct r3964_info *pInfo) in trigger_transmit() argument
392 spin_lock_irqsave(&pInfo->lock, flags); in trigger_transmit()
394 if ((pInfo->state == R3964_IDLE) && (pInfo->tx_first != NULL)) { in trigger_transmit()
395 pInfo->state = R3964_TX_REQUEST; in trigger_transmit()
396 pInfo->nRetry = 0; in trigger_transmit()
397 pInfo->flags &= ~R3964_ERROR; in trigger_transmit()
398 mod_timer(&pInfo->tmr, jiffies + R3964_TO_QVZ); in trigger_transmit()
400 spin_unlock_irqrestore(&pInfo->lock, flags); in trigger_transmit()
404 put_char(pInfo, STX); in trigger_transmit()
405 flush(pInfo); in trigger_transmit()
407 pInfo->bcc = 0; in trigger_transmit()
409 spin_unlock_irqrestore(&pInfo->lock, flags); in trigger_transmit()
413 static void retry_transmit(struct r3964_info *pInfo) in retry_transmit() argument
415 if (pInfo->nRetry < R3964_MAX_RETRIES) { in retry_transmit()
416 TRACE_PE("transmission failed. Retry #%d", pInfo->nRetry); in retry_transmit()
417 pInfo->bcc = 0; in retry_transmit()
418 put_char(pInfo, STX); in retry_transmit()
419 flush(pInfo); in retry_transmit()
420 pInfo->state = R3964_TX_REQUEST; in retry_transmit()
421 pInfo->nRetry++; in retry_transmit()
422 mod_timer(&pInfo->tmr, jiffies + R3964_TO_QVZ); in retry_transmit()
427 remove_from_tx_queue(pInfo, R3964_TX_FAIL); in retry_transmit()
429 put_char(pInfo, NAK); in retry_transmit()
430 flush(pInfo); in retry_transmit()
431 pInfo->state = R3964_IDLE; in retry_transmit()
433 trigger_transmit(pInfo); in retry_transmit()
437 static void transmit_block(struct r3964_info *pInfo) in transmit_block() argument
439 struct tty_struct *tty = pInfo->tty; in transmit_block()
440 struct r3964_block_header *pBlock = pInfo->tx_first; in transmit_block()
452 while (pInfo->tx_position < pBlock->length) { in transmit_block()
456 if (pBlock->data[pInfo->tx_position] == DLE) { in transmit_block()
458 put_char(pInfo, DLE); in transmit_block()
460 put_char(pInfo, pBlock->data[pInfo->tx_position++]); in transmit_block()
465 if ((pInfo->tx_position == pBlock->length) && (room >= 3)) { in transmit_block()
466 put_char(pInfo, DLE); in transmit_block()
467 put_char(pInfo, ETX); in transmit_block()
468 if (pInfo->flags & R3964_BCC) { in transmit_block()
469 put_char(pInfo, pInfo->bcc); in transmit_block()
471 pInfo->state = R3964_WAIT_FOR_TX_ACK; in transmit_block()
472 mod_timer(&pInfo->tmr, jiffies + R3964_TO_QVZ); in transmit_block()
474 flush(pInfo); in transmit_block()
477 static void on_receive_block(struct r3964_info *pInfo) in on_receive_block() argument
483 length = pInfo->rx_position; in on_receive_block()
486 if (pInfo->flags & R3964_BCC) { in on_receive_block()
487 if (pInfo->bcc != pInfo->last_rx) { in on_receive_block()
489 pInfo->last_rx, pInfo->bcc); in on_receive_block()
490 pInfo->flags |= R3964_CHECKSUM; in on_receive_block()
495 if (pInfo->flags & R3964_ERROR) { in on_receive_block()
497 pInfo->flags & R3964_ERROR); in on_receive_block()
499 put_char(pInfo, NAK); in on_receive_block()
500 flush(pInfo); in on_receive_block()
501 if (pInfo->nRetry < R3964_MAX_RETRIES) { in on_receive_block()
502 pInfo->state = R3964_WAIT_FOR_RX_REPEAT; in on_receive_block()
503 pInfo->nRetry++; in on_receive_block()
504 mod_timer(&pInfo->tmr, jiffies + R3964_TO_RX_PANIC); in on_receive_block()
507 pInfo->state = R3964_IDLE; in on_receive_block()
513 put_char(pInfo, DLE); in on_receive_block()
514 flush(pInfo); in on_receive_block()
515 del_timer_sync(&pInfo->tmr); in on_receive_block()
533 memcpy(pBlock->data, pInfo->rx_buf, length); in on_receive_block()
536 add_rx_queue(pInfo, pBlock); in on_receive_block()
539 for (pClient = pInfo->firstClient; pClient; pClient = pClient->next) { in on_receive_block()
545 wake_up_interruptible(&pInfo->read_wait); in on_receive_block()
547 pInfo->state = R3964_IDLE; in on_receive_block()
549 trigger_transmit(pInfo); in on_receive_block()
552 static void receive_char(struct r3964_info *pInfo, const unsigned char c) in receive_char() argument
554 switch (pInfo->state) { in receive_char()
559 pInfo->state = R3964_TRANSMITTING; in receive_char()
560 pInfo->tx_position = 0; in receive_char()
562 transmit_block(pInfo); in receive_char()
564 if (pInfo->nRetry == 0) { in receive_char()
566 if (pInfo->priority == R3964_SLAVE) { in receive_char()
577 retry_transmit(pInfo); in receive_char()
583 retry_transmit(pInfo); in receive_char()
587 pInfo->state = R3964_WAIT_ZVZ_BEFORE_TX_RETRY; in receive_char()
588 mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ); in receive_char()
594 remove_from_tx_queue(pInfo, R3964_OK); in receive_char()
596 pInfo->state = R3964_IDLE; in receive_char()
597 trigger_transmit(pInfo); in receive_char()
599 retry_transmit(pInfo); in receive_char()
607 if (pInfo->blocks_in_rx_queue >= in receive_char()
611 pInfo->state = R3964_WAIT_FOR_RX_BUF; in receive_char()
612 mod_timer(&pInfo->tmr, in receive_char()
619 pInfo->rx_position = 0; in receive_char()
620 pInfo->last_rx = 0; in receive_char()
621 pInfo->flags &= ~R3964_ERROR; in receive_char()
622 pInfo->state = R3964_RECEIVING; in receive_char()
623 mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ); in receive_char()
624 pInfo->nRetry = 0; in receive_char()
625 put_char(pInfo, DLE); in receive_char()
626 flush(pInfo); in receive_char()
627 pInfo->bcc = 0; in receive_char()
631 if (pInfo->rx_position < RX_BUF_SIZE) { in receive_char()
632 pInfo->bcc ^= c; in receive_char()
635 if (pInfo->last_rx == DLE) { in receive_char()
636 pInfo->last_rx = 0; in receive_char()
639 pInfo->last_rx = DLE; in receive_char()
641 } else if ((c == ETX) && (pInfo->last_rx == DLE)) { in receive_char()
642 if (pInfo->flags & R3964_BCC) { in receive_char()
643 pInfo->state = R3964_WAIT_FOR_BCC; in receive_char()
644 mod_timer(&pInfo->tmr, in receive_char()
647 on_receive_block(pInfo); in receive_char()
650 pInfo->last_rx = c; in receive_char()
652 pInfo->rx_buf[pInfo->rx_position++] = c; in receive_char()
653 mod_timer(&pInfo->tmr, jiffies + R3964_TO_ZVZ); in receive_char()
659 pInfo->last_rx = c; in receive_char()
660 on_receive_block(pInfo); in receive_char()
665 static void receive_error(struct r3964_info *pInfo, const char flag) in receive_error() argument
672 pInfo->flags |= R3964_BREAK; in receive_error()
676 pInfo->flags |= R3964_PARITY; in receive_error()
680 pInfo->flags |= R3964_FRAME; in receive_error()
684 pInfo->flags |= R3964_OVERRUN; in receive_error()
688 pInfo->flags |= R3964_UNKNOWN; in receive_error()
695 struct r3964_info *pInfo = (void *)priv; in on_timeout() local
697 switch (pInfo->state) { in on_timeout()
700 retry_transmit(pInfo); in on_timeout()
703 put_char(pInfo, NAK); in on_timeout()
704 flush(pInfo); in on_timeout()
705 retry_transmit(pInfo); in on_timeout()
709 retry_transmit(pInfo); in on_timeout()
713 put_char(pInfo, NAK); in on_timeout()
714 flush(pInfo); in on_timeout()
715 pInfo->state = R3964_IDLE; in on_timeout()
719 pInfo->rx_position); in on_timeout()
720 put_char(pInfo, NAK); in on_timeout()
721 flush(pInfo); in on_timeout()
722 pInfo->state = R3964_IDLE; in on_timeout()
726 pInfo->state = R3964_IDLE; in on_timeout()
730 put_char(pInfo, NAK); in on_timeout()
731 flush(pInfo); in on_timeout()
732 pInfo->state = R3964_IDLE; in on_timeout()
737 static struct r3964_client_info *findClient(struct r3964_info *pInfo, in findClient() argument
742 for (pClient = pInfo->firstClient; pClient; pClient = pClient->next) { in findClient()
750 static int enable_signals(struct r3964_info *pInfo, struct pid *pid, int arg) in enable_signals() argument
758 for (ppClient = &pInfo->firstClient; *ppClient; in enable_signals()
767 pMsg = remove_msg(pInfo, pClient); in enable_signals()
782 pClient = findClient(pInfo, pid); in enable_signals()
798 pClient->next = pInfo->firstClient; in enable_signals()
803 pInfo->firstClient = pClient; in enable_signals()
810 static int read_telegram(struct r3964_info *pInfo, struct pid *pid, in read_telegram() argument
820 pClient = findClient(pInfo, pid); in read_telegram()
832 remove_client_block(pInfo, pClient); in read_telegram()
896 static struct r3964_message *remove_msg(struct r3964_info *pInfo, in remove_msg() argument
913 remove_client_block(pInfo, pClient); in remove_msg()
921 static void remove_client_block(struct r3964_info *pInfo, in remove_client_block() argument
932 remove_from_rx_queue(pInfo, block); in remove_client_block()
944 struct r3964_info *pInfo; in r3964_open() local
950 pInfo = kmalloc(sizeof(struct r3964_info), GFP_KERNEL); in r3964_open()
951 TRACE_M("r3964_open - info kmalloc %p", pInfo); in r3964_open()
953 if (!pInfo) { in r3964_open()
958 pInfo->rx_buf = kmalloc(RX_BUF_SIZE, GFP_KERNEL); in r3964_open()
959 TRACE_M("r3964_open - rx_buf kmalloc %p", pInfo->rx_buf); in r3964_open()
961 if (!pInfo->rx_buf) { in r3964_open()
963 kfree(pInfo); in r3964_open()
964 TRACE_M("r3964_open - info kfree %p", pInfo); in r3964_open()
968 pInfo->tx_buf = kmalloc(TX_BUF_SIZE, GFP_KERNEL); in r3964_open()
969 TRACE_M("r3964_open - tx_buf kmalloc %p", pInfo->tx_buf); in r3964_open()
971 if (!pInfo->tx_buf) { in r3964_open()
973 kfree(pInfo->rx_buf); in r3964_open()
974 TRACE_M("r3964_open - rx_buf kfree %p", pInfo->rx_buf); in r3964_open()
975 kfree(pInfo); in r3964_open()
976 TRACE_M("r3964_open - info kfree %p", pInfo); in r3964_open()
980 spin_lock_init(&pInfo->lock); in r3964_open()
981 pInfo->tty = tty; in r3964_open()
982 init_waitqueue_head(&pInfo->read_wait); in r3964_open()
983 pInfo->priority = R3964_MASTER; in r3964_open()
984 pInfo->rx_first = pInfo->rx_last = NULL; in r3964_open()
985 pInfo->tx_first = pInfo->tx_last = NULL; in r3964_open()
986 pInfo->rx_position = 0; in r3964_open()
987 pInfo->tx_position = 0; in r3964_open()
988 pInfo->last_rx = 0; in r3964_open()
989 pInfo->blocks_in_rx_queue = 0; in r3964_open()
990 pInfo->firstClient = NULL; in r3964_open()
991 pInfo->state = R3964_IDLE; in r3964_open()
992 pInfo->flags = R3964_DEBUG; in r3964_open()
993 pInfo->nRetry = 0; in r3964_open()
995 tty->disc_data = pInfo; in r3964_open()
998 setup_timer(&pInfo->tmr, on_timeout, (unsigned long)pInfo); in r3964_open()
1005 struct r3964_info *pInfo = tty->disc_data; in r3964_close() local
1017 del_timer_sync(&pInfo->tmr); in r3964_close()
1020 pClient = pInfo->firstClient; in r3964_close()
1024 pMsg = remove_msg(pInfo, pClient); in r3964_close()
1036 spin_lock_irqsave(&pInfo->lock, flags); in r3964_close()
1037 pHeader = pInfo->tx_first; in r3964_close()
1038 pInfo->tx_first = pInfo->tx_last = NULL; in r3964_close()
1039 spin_unlock_irqrestore(&pInfo->lock, flags); in r3964_close()
1048 wake_up_interruptible(&pInfo->read_wait); in r3964_close()
1049 kfree(pInfo->rx_buf); in r3964_close()
1050 TRACE_M("r3964_close - rx_buf kfree %p", pInfo->rx_buf); in r3964_close()
1051 kfree(pInfo->tx_buf); in r3964_close()
1052 TRACE_M("r3964_close - tx_buf kfree %p", pInfo->tx_buf); in r3964_close()
1053 kfree(pInfo); in r3964_close()
1054 TRACE_M("r3964_close - info kfree %p", pInfo); in r3964_close()
1060 struct r3964_info *pInfo = tty->disc_data; in r3964_read() local
1070 pClient = findClient(pInfo, task_pid(current)); in r3964_read()
1072 pMsg = remove_msg(pInfo, pClient); in r3964_read()
1080 wait_event_interruptible_tty(tty, pInfo->read_wait, in r3964_read()
1081 (pMsg = remove_msg(pInfo, pClient))); in r3964_read()
1117 struct r3964_info *pInfo = tty->disc_data; in r3964_write() local
1127 if (!pInfo) in r3964_write()
1134 if (pInfo->flags & R3964_DEBUG) { in r3964_write()
1147 if (pInfo->flags & R3964_DEBUG) { in r3964_write()
1161 pClient = findClient(pInfo, task_pid(current)); in r3964_write()
1168 if (pInfo->flags & R3964_DEBUG) { in r3964_write()
1175 add_tx_queue(pInfo, pHeader); in r3964_write()
1176 trigger_transmit(pInfo); in r3964_write()
1186 struct r3964_info *pInfo = tty->disc_data; in r3964_ioctl() local
1187 if (pInfo == NULL) in r3964_ioctl()
1191 return enable_signals(pInfo, task_pid(current), arg); in r3964_ioctl()
1195 pInfo->priority = arg & 0xff; in r3964_ioctl()
1199 pInfo->flags |= R3964_BCC; in r3964_ioctl()
1201 pInfo->flags &= ~R3964_BCC; in r3964_ioctl()
1204 return read_telegram(pInfo, task_pid(current), in r3964_ioctl()
1220 struct r3964_info *pInfo = tty->disc_data; in r3964_poll() local
1228 pClient = findClient(pInfo, task_pid(current)); in r3964_poll()
1230 poll_wait(file, &pInfo->read_wait, wait); in r3964_poll()
1231 spin_lock_irqsave(&pInfo->lock, flags); in r3964_poll()
1233 spin_unlock_irqrestore(&pInfo->lock, flags); in r3964_poll()
1245 struct r3964_info *pInfo = tty->disc_data; in r3964_receive_buf() local
1254 receive_char(pInfo, *p); in r3964_receive_buf()
1256 receive_error(pInfo, flags); in r3964_receive_buf()