int hysdn_net_create(hysdn_card * card) { struct net_device *dev; int i; struct net_local *lp; if(!card) { printk(KERN_WARNING "No card-pt in hysdn_net_create!\n"); return (-ENOMEM); } hysdn_net_release(card); /* release an existing net device */ dev = alloc_etherdev(sizeof(struct net_local)); if (!dev) { printk(KERN_WARNING "HYSDN: unable to allocate mem\n"); return (-ENOMEM); } lp = netdev_priv(dev); lp->dev = dev; dev->netdev_ops = &hysdn_netdev_ops; spin_lock_init(&((struct net_local *) dev)->lock); /* initialise necessary or informing fields */ dev->base_addr = card->iobase; /* IO address */ dev->irq = card->irq; /* irq */ dev->netdev_ops = &hysdn_netdev_ops; if ((i = register_netdev(dev))) { printk(KERN_WARNING "HYSDN: unable to create network device\n"); free_netdev(dev); return (i); } dev->ml_priv = card; /* remember pointer to own data structure */ card->netif = dev; /* setup the local pointer */ if (card->debug_flags & LOG_NET_INIT) hysdn_addlog(card, "network device created"); return (0); /* and return success */ } /* hysdn_net_create */
static void ergo_stopcard(hysdn_card * card) { unsigned long flags; unsigned char val; hysdn_net_release(card); /* first release the net device if existing */ #ifdef CONFIG_HYSDN_CAPI hycapi_capi_stop(card); #endif /* CONFIG_HYSDN_CAPI */ spin_lock_irqsave(&card->hysdn_lock, flags); val = bytein(card->iobase + PCI9050_INTR_REG); /* get actual value */ val &= ~(PCI9050_INTR_REG_ENPCI | PCI9050_INTR_REG_EN1); /* mask irq */ byteout(card->iobase + PCI9050_INTR_REG, val); card->irq_enabled = 0; byteout(card->iobase + PCI9050_USER_IO, PCI9050_E1_RESET); /* reset E1 processor */ card->state = CARD_STATE_UNUSED; card->err_log_state = ERRLOG_STATE_OFF; /* currently no log active */ spin_unlock_irqrestore(&card->hysdn_lock, flags); } /* ergo_stopcard */
static void ergo_stopcard(hysdn_card * card) { unsigned long flags; unsigned char val; hysdn_net_release(card); #ifdef CONFIG_HYSDN_CAPI hycapi_capi_stop(card); #endif spin_lock_irqsave(&card->hysdn_lock, flags); val = bytein(card->iobase + PCI9050_INTR_REG); val &= ~(PCI9050_INTR_REG_ENPCI | PCI9050_INTR_REG_EN1); byteout(card->iobase + PCI9050_INTR_REG, val); card->irq_enabled = 0; byteout(card->iobase + PCI9050_USER_IO, PCI9050_E1_RESET); card->state = CARD_STATE_UNUSED; card->err_log_state = ERRLOG_STATE_OFF; spin_unlock_irqrestore(&card->hysdn_lock, flags); }
int hysdn_net_create(hysdn_card * card) { struct net_device *dev; int i; if(!card) { printk(KERN_WARNING "No card-pt in hysdn_net_create!\n"); return (-ENOMEM); } hysdn_net_release(card); /* release an existing net device */ if ((dev = kmalloc(sizeof(struct net_local), GFP_KERNEL)) == NULL) { printk(KERN_WARNING "HYSDN: unable to allocate mem\n"); return (-ENOMEM); } memset(dev, 0, sizeof(struct net_local)); /* clean the structure */ spin_lock_init(&((struct net_local *) dev)->lock); /* initialise necessary or informing fields */ dev->base_addr = card->iobase; /* IO address */ dev->irq = card->irq; /* irq */ dev->init = net_init; /* the init function of the device */ if(dev->name) { strcpy(dev->name, ((struct net_local *) dev)->dev_name); } if ((i = register_netdev(dev))) { printk(KERN_WARNING "HYSDN: unable to create network device\n"); kfree(dev); return (i); } dev->priv = card; /* remember pointer to own data structure */ card->netif = dev; /* setup the local pointer */ if (card->debug_flags & LOG_NET_INIT) hysdn_addlog(card, "network device created"); return (0); /* and return success */ } /* hysdn_net_create */