Lines Matching refs:chan

149 	struct channel_data *chan;
260 static void cosa_enable_rx(struct channel_data *chan);
261 static void cosa_disable_rx(struct channel_data *chan);
264 static int cosa_dma_able(struct channel_data *chan, char *buf, int data);
405 unregister_hdlc_device(cosa->chan[i].netdev);
406 free_netdev(cosa->chan[i].netdev);
409 kfree(cosa->chan);
548 cosa->chan = kcalloc(cosa->nchannels, sizeof(struct channel_data), GFP_KERNEL);
549 if (!cosa->chan) {
555 struct channel_data *chan = &cosa->chan[i];
557 chan->cosa = cosa;
558 chan->num = i;
559 sprintf(chan->name, "cosa%dc%d", chan->cosa->num, i);
562 mutex_init(&chan->rlock);
563 sema_init(&chan->wsem, 1);
566 if (!(chan->netdev = alloc_hdlcdev(chan))) {
567 pr_warn("%s: alloc_hdlcdev failed\n", chan->name);
571 dev_to_hdlc(chan->netdev)->attach = cosa_net_attach;
572 dev_to_hdlc(chan->netdev)->xmit = cosa_net_tx;
573 chan->netdev->netdev_ops = &cosa_ops;
574 chan->netdev->watchdog_timeo = TX_TIMEOUT;
575 chan->netdev->base_addr = chan->cosa->datareg;
576 chan->netdev->irq = chan->cosa->irq;
577 chan->netdev->dma = chan->cosa->dma;
578 err = register_hdlc_device(chan->netdev);
580 netdev_warn(chan->netdev,
582 free_netdev(chan->netdev);
595 unregister_hdlc_device(cosa->chan[i].netdev);
596 free_netdev(cosa->chan[i].netdev);
598 kfree(cosa->chan);
625 struct channel_data *chan = dev_to_chan(dev);
629 if (!(chan->cosa->firmware_status & COSA_FW_START)) {
631 chan->cosa->name, chan->cosa->firmware_status);
634 spin_lock_irqsave(&chan->cosa->lock, flags);
635 if (chan->usage != 0) {
637 chan->name, chan->usage);
638 spin_unlock_irqrestore(&chan->cosa->lock, flags);
641 chan->setup_rx = cosa_net_setup_rx;
642 chan->tx_done = cosa_net_tx_done;
643 chan->rx_done = cosa_net_rx_done;
644 chan->usage = -1;
645 chan->cosa->usage++;
646 spin_unlock_irqrestore(&chan->cosa->lock, flags);
650 spin_lock_irqsave(&chan->cosa->lock, flags);
651 chan->usage = 0;
652 chan->cosa->usage--;
653 spin_unlock_irqrestore(&chan->cosa->lock, flags);
658 cosa_enable_rx(chan);
665 struct channel_data *chan = dev_to_chan(dev);
669 chan->tx_skb = skb;
670 cosa_start_tx(chan, skb->data, skb->len);
676 struct channel_data *chan = dev_to_chan(dev);
678 if (test_bit(RXBIT, &chan->cosa->rxtx)) {
679 chan->netdev->stats.rx_errors++;
680 chan->netdev->stats.rx_missed_errors++;
682 chan->netdev->stats.tx_errors++;
683 chan->netdev->stats.tx_aborted_errors++;
685 cosa_kick(chan->cosa);
686 if (chan->tx_skb) {
687 dev_kfree_skb(chan->tx_skb);
688 chan->tx_skb = NULL;
695 struct channel_data *chan = dev_to_chan(dev);
700 cosa_disable_rx(chan);
701 spin_lock_irqsave(&chan->cosa->lock, flags);
702 if (chan->rx_skb) {
703 kfree_skb(chan->rx_skb);
704 chan->rx_skb = NULL;
706 if (chan->tx_skb) {
707 kfree_skb(chan->tx_skb);
708 chan->tx_skb = NULL;
710 chan->usage = 0;
711 chan->cosa->usage--;
712 spin_unlock_irqrestore(&chan->cosa->lock, flags);
716 static char *cosa_net_setup_rx(struct channel_data *chan, int size)
722 kfree_skb(chan->rx_skb);
723 chan->rx_skb = dev_alloc_skb(size);
724 if (chan->rx_skb == NULL) {
725 pr_notice("%s: Memory squeeze, dropping packet\n", chan->name);
726 chan->netdev->stats.rx_dropped++;
729 netif_trans_update(chan->netdev);
730 return skb_put(chan->rx_skb, size);
733 static int cosa_net_rx_done(struct channel_data *chan)
735 if (!chan->rx_skb) {
736 pr_warn("%s: rx_done with empty skb!\n", chan->name);
737 chan->netdev->stats.rx_errors++;
738 chan->netdev->stats.rx_frame_errors++;
741 chan->rx_skb->protocol = hdlc_type_trans(chan->rx_skb, chan->netdev);
742 chan->rx_skb->dev = chan->netdev;
743 skb_reset_mac_header(chan->rx_skb);
744 chan->netdev->stats.rx_packets++;
745 chan->netdev->stats.rx_bytes += chan->cosa->rxsize;
746 netif_rx(chan->rx_skb);
747 chan->rx_skb = NULL;
752 static int cosa_net_tx_done(struct channel_data *chan, int size)
754 if (!chan->tx_skb) {
755 pr_warn("%s: tx_done with empty skb!\n", chan->name);
756 chan->netdev->stats.tx_errors++;
757 chan->netdev->stats.tx_aborted_errors++;
760 dev_consume_skb_irq(chan->tx_skb);
761 chan->tx_skb = NULL;
762 chan->netdev->stats.tx_packets++;
763 chan->netdev->stats.tx_bytes += size;
764 netif_wake_queue(chan->netdev);
775 struct channel_data *chan = file->private_data;
776 struct cosa_data *cosa = chan->cosa;
784 if (mutex_lock_interruptible(&chan->rlock))
787 chan->rxdata = kmalloc(COSA_MTU, GFP_DMA|GFP_KERNEL);
788 if (chan->rxdata == NULL) {
789 mutex_unlock(&chan->rlock);
793 chan->rx_status = 0;
794 cosa_enable_rx(chan);
796 add_wait_queue(&chan->rxwaitq, &wait);
797 while (!chan->rx_status) {
802 if (signal_pending(current) && chan->rx_status == 0) {
803 chan->rx_status = 1;
804 remove_wait_queue(&chan->rxwaitq, &wait);
807 mutex_unlock(&chan->rlock);
811 remove_wait_queue(&chan->rxwaitq, &wait);
813 kbuf = chan->rxdata;
814 count = chan->rxsize;
816 mutex_unlock(&chan->rlock);
826 static char *chrdev_setup_rx(struct channel_data *chan, int size)
829 chan->rxsize = size;
830 return chan->rxdata;
833 static int chrdev_rx_done(struct channel_data *chan)
835 if (chan->rx_status) { /* Reader has died */
836 kfree(chan->rxdata);
837 up(&chan->wsem);
839 chan->rx_status = 1;
840 wake_up_interruptible(&chan->rxwaitq);
849 struct channel_data *chan = file->private_data;
850 struct cosa_data *cosa = chan->cosa;
859 if (down_interruptible(&chan->wsem))
868 up(&chan->wsem);
872 up(&chan->wsem);
876 chan->tx_status=0;
877 cosa_start_tx(chan, kbuf, count);
880 add_wait_queue(&chan->txwaitq, &wait);
881 while (!chan->tx_status) {
886 if (signal_pending(current) && chan->tx_status == 0) {
887 chan->tx_status = 1;
888 remove_wait_queue(&chan->txwaitq, &wait);
890 chan->tx_status = 1;
892 up(&chan->wsem);
897 remove_wait_queue(&chan->txwaitq, &wait);
899 up(&chan->wsem);
905 static int chrdev_tx_done(struct channel_data *chan, int size)
907 if (chan->tx_status) { /* Writer was interrupted */
908 kfree(chan->txbuf);
909 up(&chan->wsem);
911 chan->tx_status = 1;
912 wake_up_interruptible(&chan->txwaitq);
925 struct channel_data *chan;
943 chan = cosa->chan + n;
945 file->private_data = chan;
949 if (chan->usage < 0) { /* in netdev mode */
955 chan->usage++;
957 chan->tx_done = chrdev_tx_done;
958 chan->setup_rx = chrdev_setup_rx;
959 chan->rx_done = chrdev_rx_done;
1180 struct channel_data *chan = dev_to_chan(dev);
1181 rv = cosa_ioctl_common(chan->cosa, chan, cmd,
1210 static void cosa_enable_rx(struct channel_data *chan)
1212 struct cosa_data *cosa = chan->cosa;
1214 if (!test_and_set_bit(chan->num, &cosa->rxbitmap))
1218 static void cosa_disable_rx(struct channel_data *chan)
1220 struct cosa_data *cosa = chan->cosa;
1222 if (test_and_clear_bit(chan->num, &cosa->rxbitmap))
1232 static int cosa_start_tx(struct channel_data *chan, char *buf, int len)
1234 struct cosa_data *cosa = chan->cosa;
1240 chan->cosa->num, chan->num, len);
1246 chan->txbuf = buf;
1247 chan->txsize = len;
1249 chan->txsize = COSA_MTU;
1253 set_bit(chan->num, &cosa->txbitmap);
1363 static int cosa_dma_able(struct channel_data *chan, char *buf, int len)
1372 chan->name);
1706 cosa->txsize = cosa->chan[cosa->txchan].txsize;
1707 if (cosa_dma_able(cosa->chan+cosa->txchan,
1708 cosa->chan[cosa->txchan].txbuf, cosa->txsize)) {
1709 cosa->txbuf = cosa->chan[cosa->txchan].txbuf;
1711 memcpy(cosa->bouncebuf, cosa->chan[cosa->txchan].txbuf,
1848 cosa->rxchan = cosa->chan + ((cosa->rxsize & 0xe000) >> 13);
1897 struct channel_data *chan = cosa->chan+cosa->txchan;
1898 if (chan->tx_done)
1899 if (chan->tx_done(chan, cosa->txsize))
1900 clear_bit(chan->num, &cosa->txbitmap);