Lines Matching refs:chan

162 	struct channel_data *chan;  member
273 static void cosa_enable_rx(struct channel_data *chan);
274 static void cosa_disable_rx(struct channel_data *chan);
277 static int cosa_dma_able(struct channel_data *chan, char *buf, int data);
418 unregister_hdlc_device(cosa->chan[i].netdev); in cosa_exit()
419 free_netdev(cosa->chan[i].netdev); in cosa_exit()
422 kfree(cosa->chan); in cosa_exit()
562 cosa->chan = kcalloc(cosa->nchannels, sizeof(struct channel_data), GFP_KERNEL); in cosa_probe()
563 if (!cosa->chan) { in cosa_probe()
569 struct channel_data *chan = &cosa->chan[i]; in cosa_probe() local
571 chan->cosa = cosa; in cosa_probe()
572 chan->num = i; in cosa_probe()
573 sprintf(chan->name, "cosa%dc%d", chan->cosa->num, i); in cosa_probe()
576 mutex_init(&chan->rlock); in cosa_probe()
577 sema_init(&chan->wsem, 1); in cosa_probe()
580 if (!(chan->netdev = alloc_hdlcdev(chan))) { in cosa_probe()
581 pr_warn("%s: alloc_hdlcdev failed\n", chan->name); in cosa_probe()
585 dev_to_hdlc(chan->netdev)->attach = cosa_net_attach; in cosa_probe()
586 dev_to_hdlc(chan->netdev)->xmit = cosa_net_tx; in cosa_probe()
587 chan->netdev->netdev_ops = &cosa_ops; in cosa_probe()
588 chan->netdev->watchdog_timeo = TX_TIMEOUT; in cosa_probe()
589 chan->netdev->base_addr = chan->cosa->datareg; in cosa_probe()
590 chan->netdev->irq = chan->cosa->irq; in cosa_probe()
591 chan->netdev->dma = chan->cosa->dma; in cosa_probe()
592 if (register_hdlc_device(chan->netdev)) { in cosa_probe()
593 netdev_warn(chan->netdev, in cosa_probe()
595 free_netdev(chan->netdev); in cosa_probe()
608 unregister_hdlc_device(cosa->chan[i].netdev); in cosa_probe()
609 free_netdev(cosa->chan[i].netdev); in cosa_probe()
611 kfree(cosa->chan); in cosa_probe()
637 struct channel_data *chan = dev_to_chan(dev); in cosa_net_open() local
641 if (!(chan->cosa->firmware_status & COSA_FW_START)) { in cosa_net_open()
643 chan->cosa->name, chan->cosa->firmware_status); in cosa_net_open()
646 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_open()
647 if (chan->usage != 0) { in cosa_net_open()
649 chan->name, chan->usage); in cosa_net_open()
650 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
653 chan->setup_rx = cosa_net_setup_rx; in cosa_net_open()
654 chan->tx_done = cosa_net_tx_done; in cosa_net_open()
655 chan->rx_done = cosa_net_rx_done; in cosa_net_open()
656 chan->usage = -1; in cosa_net_open()
657 chan->cosa->usage++; in cosa_net_open()
658 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
662 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_open()
663 chan->usage = 0; in cosa_net_open()
664 chan->cosa->usage--; in cosa_net_open()
665 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_open()
670 cosa_enable_rx(chan); in cosa_net_open()
677 struct channel_data *chan = dev_to_chan(dev); in cosa_net_tx() local
681 chan->tx_skb = skb; in cosa_net_tx()
682 cosa_start_tx(chan, skb->data, skb->len); in cosa_net_tx()
688 struct channel_data *chan = dev_to_chan(dev); in cosa_net_timeout() local
690 if (test_bit(RXBIT, &chan->cosa->rxtx)) { in cosa_net_timeout()
691 chan->netdev->stats.rx_errors++; in cosa_net_timeout()
692 chan->netdev->stats.rx_missed_errors++; in cosa_net_timeout()
694 chan->netdev->stats.tx_errors++; in cosa_net_timeout()
695 chan->netdev->stats.tx_aborted_errors++; in cosa_net_timeout()
697 cosa_kick(chan->cosa); in cosa_net_timeout()
698 if (chan->tx_skb) { in cosa_net_timeout()
699 dev_kfree_skb(chan->tx_skb); in cosa_net_timeout()
700 chan->tx_skb = NULL; in cosa_net_timeout()
707 struct channel_data *chan = dev_to_chan(dev); in cosa_net_close() local
712 cosa_disable_rx(chan); in cosa_net_close()
713 spin_lock_irqsave(&chan->cosa->lock, flags); in cosa_net_close()
714 if (chan->rx_skb) { in cosa_net_close()
715 kfree_skb(chan->rx_skb); in cosa_net_close()
716 chan->rx_skb = NULL; in cosa_net_close()
718 if (chan->tx_skb) { in cosa_net_close()
719 kfree_skb(chan->tx_skb); in cosa_net_close()
720 chan->tx_skb = NULL; in cosa_net_close()
722 chan->usage = 0; in cosa_net_close()
723 chan->cosa->usage--; in cosa_net_close()
724 spin_unlock_irqrestore(&chan->cosa->lock, flags); in cosa_net_close()
728 static char *cosa_net_setup_rx(struct channel_data *chan, int size) in cosa_net_setup_rx() argument
734 kfree_skb(chan->rx_skb); in cosa_net_setup_rx()
735 chan->rx_skb = dev_alloc_skb(size); in cosa_net_setup_rx()
736 if (chan->rx_skb == NULL) { in cosa_net_setup_rx()
737 pr_notice("%s: Memory squeeze, dropping packet\n", chan->name); in cosa_net_setup_rx()
738 chan->netdev->stats.rx_dropped++; in cosa_net_setup_rx()
741 chan->netdev->trans_start = jiffies; in cosa_net_setup_rx()
742 return skb_put(chan->rx_skb, size); in cosa_net_setup_rx()
745 static int cosa_net_rx_done(struct channel_data *chan) in cosa_net_rx_done() argument
747 if (!chan->rx_skb) { in cosa_net_rx_done()
748 pr_warn("%s: rx_done with empty skb!\n", chan->name); in cosa_net_rx_done()
749 chan->netdev->stats.rx_errors++; in cosa_net_rx_done()
750 chan->netdev->stats.rx_frame_errors++; in cosa_net_rx_done()
753 chan->rx_skb->protocol = hdlc_type_trans(chan->rx_skb, chan->netdev); in cosa_net_rx_done()
754 chan->rx_skb->dev = chan->netdev; in cosa_net_rx_done()
755 skb_reset_mac_header(chan->rx_skb); in cosa_net_rx_done()
756 chan->netdev->stats.rx_packets++; in cosa_net_rx_done()
757 chan->netdev->stats.rx_bytes += chan->cosa->rxsize; in cosa_net_rx_done()
758 netif_rx(chan->rx_skb); in cosa_net_rx_done()
759 chan->rx_skb = NULL; in cosa_net_rx_done()
764 static int cosa_net_tx_done(struct channel_data *chan, int size) in cosa_net_tx_done() argument
766 if (!chan->tx_skb) { in cosa_net_tx_done()
767 pr_warn("%s: tx_done with empty skb!\n", chan->name); in cosa_net_tx_done()
768 chan->netdev->stats.tx_errors++; in cosa_net_tx_done()
769 chan->netdev->stats.tx_aborted_errors++; in cosa_net_tx_done()
772 dev_kfree_skb_irq(chan->tx_skb); in cosa_net_tx_done()
773 chan->tx_skb = NULL; in cosa_net_tx_done()
774 chan->netdev->stats.tx_packets++; in cosa_net_tx_done()
775 chan->netdev->stats.tx_bytes += size; in cosa_net_tx_done()
776 netif_wake_queue(chan->netdev); in cosa_net_tx_done()
787 struct channel_data *chan = file->private_data; in cosa_read() local
788 struct cosa_data *cosa = chan->cosa; in cosa_read()
796 if (mutex_lock_interruptible(&chan->rlock)) in cosa_read()
799 chan->rxdata = kmalloc(COSA_MTU, GFP_DMA|GFP_KERNEL); in cosa_read()
800 if (chan->rxdata == NULL) { in cosa_read()
801 mutex_unlock(&chan->rlock); in cosa_read()
805 chan->rx_status = 0; in cosa_read()
806 cosa_enable_rx(chan); in cosa_read()
808 add_wait_queue(&chan->rxwaitq, &wait); in cosa_read()
809 while (!chan->rx_status) { in cosa_read()
814 if (signal_pending(current) && chan->rx_status == 0) { in cosa_read()
815 chan->rx_status = 1; in cosa_read()
816 remove_wait_queue(&chan->rxwaitq, &wait); in cosa_read()
819 mutex_unlock(&chan->rlock); in cosa_read()
823 remove_wait_queue(&chan->rxwaitq, &wait); in cosa_read()
825 kbuf = chan->rxdata; in cosa_read()
826 count = chan->rxsize; in cosa_read()
828 mutex_unlock(&chan->rlock); in cosa_read()
838 static char *chrdev_setup_rx(struct channel_data *chan, int size) in chrdev_setup_rx() argument
841 chan->rxsize = size; in chrdev_setup_rx()
842 return chan->rxdata; in chrdev_setup_rx()
845 static int chrdev_rx_done(struct channel_data *chan) in chrdev_rx_done() argument
847 if (chan->rx_status) { /* Reader has died */ in chrdev_rx_done()
848 kfree(chan->rxdata); in chrdev_rx_done()
849 up(&chan->wsem); in chrdev_rx_done()
851 chan->rx_status = 1; in chrdev_rx_done()
852 wake_up_interruptible(&chan->rxwaitq); in chrdev_rx_done()
861 struct channel_data *chan = file->private_data; in cosa_write() local
862 struct cosa_data *cosa = chan->cosa; in cosa_write()
871 if (down_interruptible(&chan->wsem)) in cosa_write()
880 up(&chan->wsem); in cosa_write()
884 up(&chan->wsem); in cosa_write()
888 chan->tx_status=0; in cosa_write()
889 cosa_start_tx(chan, kbuf, count); in cosa_write()
892 add_wait_queue(&chan->txwaitq, &wait); in cosa_write()
893 while (!chan->tx_status) { in cosa_write()
898 if (signal_pending(current) && chan->tx_status == 0) { in cosa_write()
899 chan->tx_status = 1; in cosa_write()
900 remove_wait_queue(&chan->txwaitq, &wait); in cosa_write()
902 chan->tx_status = 1; in cosa_write()
904 up(&chan->wsem); in cosa_write()
908 remove_wait_queue(&chan->txwaitq, &wait); in cosa_write()
910 up(&chan->wsem); in cosa_write()
916 static int chrdev_tx_done(struct channel_data *chan, int size) in chrdev_tx_done() argument
918 if (chan->tx_status) { /* Writer was interrupted */ in chrdev_tx_done()
919 kfree(chan->txbuf); in chrdev_tx_done()
920 up(&chan->wsem); in chrdev_tx_done()
922 chan->tx_status = 1; in chrdev_tx_done()
923 wake_up_interruptible(&chan->txwaitq); in chrdev_tx_done()
936 struct channel_data *chan; in cosa_open() local
954 chan = cosa->chan + n; in cosa_open()
956 file->private_data = chan; in cosa_open()
960 if (chan->usage < 0) { /* in netdev mode */ in cosa_open()
966 chan->usage++; in cosa_open()
968 chan->tx_done = chrdev_tx_done; in cosa_open()
969 chan->setup_rx = chrdev_setup_rx; in cosa_open()
970 chan->rx_done = chrdev_rx_done; in cosa_open()
1190 struct channel_data *chan = dev_to_chan(dev); in cosa_net_ioctl() local
1191 rv = cosa_ioctl_common(chan->cosa, chan, cmd, in cosa_net_ioctl()
1219 static void cosa_enable_rx(struct channel_data *chan) in cosa_enable_rx() argument
1221 struct cosa_data *cosa = chan->cosa; in cosa_enable_rx()
1223 if (!test_and_set_bit(chan->num, &cosa->rxbitmap)) in cosa_enable_rx()
1227 static void cosa_disable_rx(struct channel_data *chan) in cosa_disable_rx() argument
1229 struct cosa_data *cosa = chan->cosa; in cosa_disable_rx()
1231 if (test_and_clear_bit(chan->num, &cosa->rxbitmap)) in cosa_disable_rx()
1241 static int cosa_start_tx(struct channel_data *chan, char *buf, int len) in cosa_start_tx() argument
1243 struct cosa_data *cosa = chan->cosa; in cosa_start_tx()
1249 chan->cosa->num, chan->num, len); in cosa_start_tx()
1255 chan->txbuf = buf; in cosa_start_tx()
1256 chan->txsize = len; in cosa_start_tx()
1258 chan->txsize = COSA_MTU; in cosa_start_tx()
1262 set_bit(chan->num, &cosa->txbitmap); in cosa_start_tx()
1372 static int cosa_dma_able(struct channel_data *chan, char *buf, int len) in cosa_dma_able() argument
1381 chan->name); in cosa_dma_able()
1712 cosa->txsize = cosa->chan[cosa->txchan].txsize; in tx_interrupt()
1713 if (cosa_dma_able(cosa->chan+cosa->txchan, in tx_interrupt()
1714 cosa->chan[cosa->txchan].txbuf, cosa->txsize)) { in tx_interrupt()
1715 cosa->txbuf = cosa->chan[cosa->txchan].txbuf; in tx_interrupt()
1717 memcpy(cosa->bouncebuf, cosa->chan[cosa->txchan].txbuf, in tx_interrupt()
1854 cosa->rxchan = cosa->chan + ((cosa->rxsize & 0xe000) >> 13); in rx_interrupt()
1903 struct channel_data *chan = cosa->chan+cosa->txchan; in eot_interrupt() local
1904 if (chan->tx_done) in eot_interrupt()
1905 if (chan->tx_done(chan, cosa->txsize)) in eot_interrupt()
1906 clear_bit(chan->num, &cosa->txbitmap); in eot_interrupt()