Ejemplo n.º 1
0
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);
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 5
0
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;
}