static void syncppp_status_timerfun(unsigned long d) { struct net_device *dev=(struct net_device *)d; struct comx_channel *ch=dev->priv; struct syncppp_data *spch=ch->LINE_privdata; struct sppp *sp = (struct sppp *)sppp_of(dev); if(!(ch->line_status & PROTO_UP) && (sp->pp_link_state==SPPP_LINK_UP)) { comx_status(dev, ch->line_status | PROTO_UP); } if((ch->line_status & PROTO_UP) && (sp->pp_link_state==SPPP_LINK_DOWN)) { comx_status(dev, ch->line_status & ~PROTO_UP); } mod_timer(&spch->status_timer,jiffies + HZ*3); }
static void comxlapb_status(struct net_device *dev, unsigned short status) { struct comx_channel *ch; if (!dev || !(ch = dev->priv)) { return; } if (status & LINE_UP) { netif_wake_queue(dev); } comx_status(dev, status); }
static void syncppp_status(struct net_device *dev, unsigned short status) { status &= ~(PROTO_UP | PROTO_LOOP); if(status & LINE_UP) { netif_wake_queue(dev); sppp_open(dev); } else { /* Line went down */ netif_stop_queue(dev); sppp_close(dev); } comx_status(dev, status); }
static void comxlapb_connected(void *token, int reason) { struct comx_channel *ch = token; struct proc_dir_entry *comxdir = ch->procdir->subdir; if (ch->debug_flags & DEBUG_COMX_LAPB) { comx_debug(ch->dev, "%s: lapb connected, reason: %d\n", ch->dev->name, reason); } if (ch->dev->type == ARPHRD_X25) { unsigned char *p; struct sk_buff *skb; if ((skb = dev_alloc_skb(1)) == NULL) { printk(KERN_ERR "comxlapb: out of memory!\n"); return; } p = skb_put(skb,1); *p = 0x01; // link established skb->dev = ch->dev; skb->protocol = htons(ETH_P_X25); skb->mac.raw = skb->data; skb->pkt_type = PACKET_HOST; netif_rx(skb); ch->dev->last_rx = jiffies; } for (; comxdir; comxdir = comxdir->next) { if (strcmp(comxdir->name, FILENAME_MODE) == 0) { comxdir->mode = S_IFREG | 0444; } } ch->line_status |= PROTO_UP; comx_status(ch->dev, ch->line_status); }
static int LOCOMX_open(struct net_device *dev) { struct comx_channel *ch = netdev_priv(dev); struct locomx_data *hw = ch->HW_privdata; struct proc_dir_entry *procfile = ch->procdir->subdir; unsigned long flags; int ret; if (!dev->base_addr || !dev->irq) { return -ENODEV; } if (!request_region(dev->base_addr, hw->io_extent, dev->name)) { return -EAGAIN; } hw->board.chanA.ctrlio=dev->base_addr + 5; hw->board.chanA.dataio=dev->base_addr + 7; hw->board.irq=dev->irq; hw->board.chanA.netdevice=dev; hw->board.chanA.dev=&hw->board; hw->board.name=dev->name; hw->board.chanA.txdma=TX_DMA; hw->board.chanA.rxdma=RX_DMA; hw->board.chanA.irqs=&z8530_nop; hw->board.chanB.irqs=&z8530_nop; if(request_irq(dev->irq, z8530_interrupt, SA_INTERRUPT, dev->name, &hw->board)) { printk(KERN_ERR "%s: unable to obtain irq %d\n", dev->name, dev->irq); ret=-EAGAIN; goto irq_fail; } if(request_dma(TX_DMA,"LoCOMX (TX)")) { printk(KERN_ERR "%s: unable to obtain TX DMA (DMA channel %d)\n", dev->name, TX_DMA); ret=-EAGAIN; goto dma1_fail; } if(request_dma(RX_DMA,"LoCOMX (RX)")) { printk(KERN_ERR "%s: unable to obtain RX DMA (DMA channel %d)\n", dev->name, RX_DMA); ret=-EAGAIN; goto dma2_fail; } save_flags(flags); cli(); if(z8530_init(&hw->board)!=0) { printk(KERN_ERR "%s: Z8530 device not found.\n",dev->name); ret=-ENODEV; goto z8530_fail; } hw->board.chanA.dcdcheck=CTS; z8530_channel_load(&hw->board.chanA, z8530_hdlc_kilostream_85230); z8530_channel_load(&hw->board.chanA, z8530_locomx); z8530_channel_load(&hw->board.chanB, z8530_dead_port); z8530_describe(&hw->board, "I/O", dev->base_addr); if((ret=z8530_sync_dma_open(dev, &hw->board.chanA))!=0) { goto z8530_fail; } restore_flags(flags); hw->board.active=1; hw->board.chanA.rx_function=locomx_rx; ch->init_status |= HW_OPEN; if (hw->board.chanA.status & DCD) { ch->line_status |= LINE_UP; } else { ch->line_status &= ~LINE_UP; } comx_status(dev, ch->line_status); init_timer(&hw->status_timer); hw->status_timer.function=locomx_status_timerfun; hw->status_timer.data=(unsigned long)dev; hw->status_timer.expires=jiffies + ch->lineup_delay * HZ; add_timer(&hw->status_timer); for (; procfile ; procfile = procfile->next) { if (strcmp(procfile->name, FILENAME_IO) == 0 || strcmp(procfile->name, FILENAME_IRQ) == 0) { procfile->mode = S_IFREG | 0444; } } return 0; z8530_fail: restore_flags(flags); free_dma(RX_DMA); dma2_fail: free_dma(TX_DMA); dma1_fail: free_irq(dev->irq, &hw->board); irq_fail: release_region(dev->base_addr, hw->io_extent); return ret; }