⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c4.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 3 页
字号:
			printk(KERN_ERR "%s: failed to set config!!\n",					card->name);			c4_reset(card);			return retval;		}	}        c4_send_init(card);	return 0;}static void c4_reset_ctr(struct capi_ctr *ctrl){	avmcard *card = ((avmctrl_info *)(ctrl->driverdata))->card;	avmctrl_info *cinfo;	u_int i;	unsigned long flags;	spin_lock_irqsave(&card->lock, flags); 	c4_reset(card);	spin_unlock_irqrestore(&card->lock, flags);        for (i=0; i < card->nr_controllers; i++) {		cinfo = &card->ctrlinfo[i];		memset(cinfo->version, 0, sizeof(cinfo->version));		capi_ctr_reseted(&cinfo->capi_ctrl);	}	card->nlogcontr = 0;}static void c4_remove(struct pci_dev *pdev){	avmcard *card = pci_get_drvdata(pdev);	avmctrl_info *cinfo;	u_int i;	if (!card)		return; 	c4_reset(card);        for (i=0; i < card->nr_controllers; i++) {		cinfo = &card->ctrlinfo[i];		detach_capi_ctr(&cinfo->capi_ctrl);	}	free_irq(card->irq, card);	iounmap(card->mbase);	release_region(card->port, AVMB1_PORTLEN);        avmcard_dma_free(card->dma);        pci_set_drvdata(pdev, NULL);	b1_free_card(card);}/* ------------------------------------------------------------- */static void c4_register_appl(struct capi_ctr *ctrl,				u16 appl,				capi_register_params *rp){	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);	avmcard *card = cinfo->card;	struct sk_buff *skb;	int want = rp->level3cnt;	unsigned long flags;	int nconn;	void *p;	if (ctrl->cnr == card->cardnr) {		if (want > 0) nconn = want;		else nconn = ctrl->profile.nbchannel * 4 * -want;		if (nconn == 0) nconn = ctrl->profile.nbchannel * 4;		skb = alloc_skb(23, GFP_ATOMIC);		if (!skb) {			printk(KERN_CRIT "%s: no memory, lost register appl.\n",						card->name);			return;		}		p = skb->data;		_put_byte(&p, 0);		_put_byte(&p, 0);		_put_byte(&p, SEND_REGISTER);		_put_word(&p, appl);		_put_word(&p, 1024 * (nconn+1));		_put_word(&p, nconn);		_put_word(&p, rp->datablkcnt);		_put_word(&p, rp->datablklen);		skb_put(skb, (u8 *)p - (u8 *)skb->data);		skb_queue_tail(&card->dma->send_queue, skb);			spin_lock_irqsave(&card->lock, flags);		c4_dispatch_tx(card);		spin_unlock_irqrestore(&card->lock, flags);	}}/* ------------------------------------------------------------- */static void c4_release_appl(struct capi_ctr *ctrl, u16 appl){	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);	avmcard *card = cinfo->card;	unsigned long flags;	struct sk_buff *skb;	void *p;	capilib_release_appl(&cinfo->ncci_head, appl);	if (ctrl->cnr == card->cardnr) {		skb = alloc_skb(7, GFP_ATOMIC);		if (!skb) {			printk(KERN_CRIT "%s: no memory, lost release appl.\n",						card->name);			return;		}		p = skb->data;		_put_byte(&p, 0);		_put_byte(&p, 0);		_put_byte(&p, SEND_RELEASE);		_put_word(&p, appl);		skb_put(skb, (u8 *)p - (u8 *)skb->data);		skb_queue_tail(&card->dma->send_queue, skb);		spin_lock_irqsave(&card->lock, flags);		c4_dispatch_tx(card);		spin_unlock_irqrestore(&card->lock, flags);	}}/* ------------------------------------------------------------- */static u16 c4_send_message(struct capi_ctr *ctrl, struct sk_buff *skb){	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);	avmcard *card = cinfo->card;	u16 retval = CAPI_NOERROR;	unsigned long flags; 	if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_REQ) {		retval = capilib_data_b3_req(&cinfo->ncci_head,					     CAPIMSG_APPID(skb->data),					     CAPIMSG_NCCI(skb->data),					     CAPIMSG_MSGID(skb->data));	}	if (retval == CAPI_NOERROR) {		skb_queue_tail(&card->dma->send_queue, skb);		spin_lock_irqsave(&card->lock, flags);		c4_dispatch_tx(card);		spin_unlock_irqrestore(&card->lock, flags);	}	return retval;}/* ------------------------------------------------------------- */static char *c4_procinfo(struct capi_ctr *ctrl){	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);	if (!cinfo)		return "";	sprintf(cinfo->infobuf, "%s %s 0x%x %d 0x%lx",		cinfo->cardname[0] ? cinfo->cardname : "-",		cinfo->version[VER_DRIVER] ? cinfo->version[VER_DRIVER] : "-",		cinfo->card ? cinfo->card->port : 0x0,		cinfo->card ? cinfo->card->irq : 0,		cinfo->card ? cinfo->card->membase : 0		);	return cinfo->infobuf;}static int c4_read_proc(char *page, char **start, off_t off,        		int count, int *eof, struct capi_ctr *ctrl){	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);	avmcard *card = cinfo->card;	u8 flag;	int len = 0;	char *s;	len += sprintf(page+len, "%-16s %s\n", "name", card->name);	len += sprintf(page+len, "%-16s 0x%x\n", "io", card->port);	len += sprintf(page+len, "%-16s %d\n", "irq", card->irq);	len += sprintf(page+len, "%-16s 0x%lx\n", "membase", card->membase);	switch (card->cardtype) {	case avm_b1isa: s = "B1 ISA"; break;	case avm_b1pci: s = "B1 PCI"; break;	case avm_b1pcmcia: s = "B1 PCMCIA"; break;	case avm_m1: s = "M1"; break;	case avm_m2: s = "M2"; break;	case avm_t1isa: s = "T1 ISA (HEMA)"; break;	case avm_t1pci: s = "T1 PCI"; break;	case avm_c4: s = "C4"; break;	case avm_c2: s = "C2"; break;	default: s = "???"; break;	}	len += sprintf(page+len, "%-16s %s\n", "type", s);	if ((s = cinfo->version[VER_DRIVER]) != 0)	   len += sprintf(page+len, "%-16s %s\n", "ver_driver", s);	if ((s = cinfo->version[VER_CARDTYPE]) != 0)	   len += sprintf(page+len, "%-16s %s\n", "ver_cardtype", s);	if ((s = cinfo->version[VER_SERIAL]) != 0)	   len += sprintf(page+len, "%-16s %s\n", "ver_serial", s);	if (card->cardtype != avm_m1) {        	flag = ((u8 *)(ctrl->profile.manu))[3];        	if (flag)			len += sprintf(page+len, "%-16s%s%s%s%s%s%s%s\n",			"protocol",			(flag & 0x01) ? " DSS1" : "",			(flag & 0x02) ? " CT1" : "",			(flag & 0x04) ? " VN3" : "",			(flag & 0x08) ? " NI1" : "",			(flag & 0x10) ? " AUSTEL" : "",			(flag & 0x20) ? " ESS" : "",			(flag & 0x40) ? " 1TR6" : ""			);	}	if (card->cardtype != avm_m1) {        	flag = ((u8 *)(ctrl->profile.manu))[5];		if (flag)			len += sprintf(page+len, "%-16s%s%s%s%s\n",			"linetype",			(flag & 0x01) ? " point to point" : "",			(flag & 0x02) ? " point to multipoint" : "",			(flag & 0x08) ? " leased line without D-channel" : "",			(flag & 0x04) ? " leased line with D-channel" : ""			);	}	len += sprintf(page+len, "%-16s %s\n", "cardname", cinfo->cardname);	if (off+count >= len)	   *eof = 1;	if (len < off)           return 0;	*start = page + off;	return ((count < len-off) ? count : len-off);}/* ------------------------------------------------------------- */static int c4_add_card(struct capicardparams *p, struct pci_dev *dev,		       int nr_controllers){	avmcard *card;	avmctrl_info *cinfo;	int retval;	int i;	card = b1_alloc_card(nr_controllers);	if (!card) {		printk(KERN_WARNING "c4: no memory.\n");		retval = -ENOMEM;		goto err;	}        card->dma = avmcard_dma_alloc("c4", dev, 2048+128, 2048+128);	if (!card->dma) {		printk(KERN_WARNING "c4: no memory.\n");		retval = -ENOMEM;		goto err_free;	}	sprintf(card->name, "c%d-%x", nr_controllers, p->port);	card->port = p->port;	card->irq = p->irq;	card->membase = p->membase;	card->cardtype = (nr_controllers == 4) ? avm_c4 : avm_c2;	if (!request_region(card->port, AVMB1_PORTLEN, card->name)) {		printk(KERN_WARNING "c4: ports 0x%03x-0x%03x in use.\n",		       card->port, card->port + AVMB1_PORTLEN);		retval = -EBUSY;		goto err_free_dma;	}	card->mbase = ioremap(card->membase, 128);	if (card->mbase == 0) {		printk(KERN_NOTICE "c4: can't remap memory at 0x%lx\n",		       card->membase);		retval = -EIO;		goto err_release_region;	}	retval = c4_detect(card);	if (retval != 0) {		printk(KERN_NOTICE "c4: NO card at 0x%x error(%d)\n",		       card->port, retval);		retval = -EIO;		goto err_unmap;	}	c4_reset(card);	retval = request_irq(card->irq, c4_interrupt, SA_SHIRQ, card->name, card);	if (retval) {		printk(KERN_ERR "c4: unable to get IRQ %d.\n",card->irq);		retval = -EBUSY;		goto err_unmap;	}	for (i=0; i < nr_controllers ; i++) {		cinfo = &card->ctrlinfo[i];		cinfo->capi_ctrl.owner = THIS_MODULE;		cinfo->capi_ctrl.driver_name   = "c4";		cinfo->capi_ctrl.driverdata    = cinfo;		cinfo->capi_ctrl.register_appl = c4_register_appl;		cinfo->capi_ctrl.release_appl  = c4_release_appl;		cinfo->capi_ctrl.send_message  = c4_send_message;		cinfo->capi_ctrl.load_firmware = c4_load_firmware;		cinfo->capi_ctrl.reset_ctr     = c4_reset_ctr;		cinfo->capi_ctrl.procinfo      = c4_procinfo;		cinfo->capi_ctrl.ctr_read_proc = c4_read_proc;		strcpy(cinfo->capi_ctrl.name, card->name);		retval = attach_capi_ctr(&cinfo->capi_ctrl);		if (retval) {			printk(KERN_ERR "c4: attach controller failed (%d).\n", i);			for (i--; i >= 0; i--) {				cinfo = &card->ctrlinfo[i];				detach_capi_ctr(&cinfo->capi_ctrl);			}			goto err_free_irq;		}		if (i == 0)			card->cardnr = cinfo->capi_ctrl.cnr;	}	printk(KERN_INFO "c4: AVM C%d at i/o %#x, irq %d, mem %#lx\n",	       nr_controllers, card->port, card->irq,	       card->membase);	pci_set_drvdata(dev, card);	return 0; err_free_irq:	free_irq(card->irq, card); err_unmap:	iounmap(card->mbase); err_release_region:	release_region(card->port, AVMB1_PORTLEN); err_free_dma:	avmcard_dma_free(card->dma); err_free:	b1_free_card(card); err:	return retval;}/* ------------------------------------------------------------- */static int __devinit c4_probe(struct pci_dev *dev,			      const struct pci_device_id *ent){	int nr = ent->driver_data;	int retval = 0;	struct capicardparams param;	if (pci_enable_device(dev) < 0) {		printk(KERN_ERR "c4: failed to enable AVM-C%d\n", nr);		return -ENODEV;	}	pci_set_master(dev);	param.port = pci_resource_start(dev, 1);	param.irq = dev->irq;	param.membase = pci_resource_start(dev, 0);		printk(KERN_INFO "c4: PCI BIOS reports AVM-C%d at i/o %#x, irq %d, mem %#x\n",	       nr, param.port, param.irq, param.membase);		retval = c4_add_card(&param, dev, nr);	if (retval != 0) {		printk(KERN_ERR "c4: no AVM-C%d at i/o %#x, irq %d detected, mem %#x\n",		       nr, param.port, param.irq, param.membase);		return -ENODEV;	}	return 0;}static struct pci_driver c4_pci_driver = {       .name           = "c4",       .id_table       = c4_pci_tbl,       .probe          = c4_probe,       .remove         = c4_remove,};static struct capi_driver capi_driver_c2 = {	.name		= "c2",	.revision	= "1.0",};static struct capi_driver capi_driver_c4 = {	.name		= "c4",	.revision	= "1.0",};static int __init c4_init(void){	char *p;	char rev[32];	int err;	if ((p = strchr(revision, ':')) != 0 && p[1]) {		strlcpy(rev, p + 2, 32);		if ((p = strchr(rev, '$')) != 0 && p > rev)		   *(p-1) = 0;	} else		strcpy(rev, "1.0");	err = pci_register_driver(&c4_pci_driver);	if (!err) {		strlcpy(capi_driver_c2.revision, rev, 32);		register_capi_driver(&capi_driver_c2);		strlcpy(capi_driver_c4.revision, rev, 32);		register_capi_driver(&capi_driver_c4);		printk(KERN_INFO "c4: revision %s\n", rev);	}	return err;}static void __exit c4_exit(void){	unregister_capi_driver(&capi_driver_c2);	unregister_capi_driver(&capi_driver_c4);	pci_unregister_driver(&c4_pci_driver);}module_init(c4_init);module_exit(c4_exit);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -