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