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

📄 b1.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
	return CAPI_NOERROR;}/* ------------------------------------------------------------- */void b1_parse_version(avmctrl_info *cinfo){	struct capi_ctr *ctrl = &cinfo->capi_ctrl;	avmcard *card = cinfo->card;	capi_profile *profp;	u8 *dversion;	u8 flag;	int i, j;	for (j = 0; j < AVM_MAXVERSION; j++)		cinfo->version[j] = "\0\0" + 1;	for (i = 0, j = 0;	     j < AVM_MAXVERSION && i < cinfo->versionlen;	     j++, i += cinfo->versionbuf[i] + 1)		cinfo->version[j] = &cinfo->versionbuf[i + 1];	strlcpy(ctrl->serial, cinfo->version[VER_SERIAL], sizeof(ctrl->serial));	memcpy(&ctrl->profile, cinfo->version[VER_PROFILE],sizeof(capi_profile));	strlcpy(ctrl->manu, "AVM GmbH", sizeof(ctrl->manu));	dversion = cinfo->version[VER_DRIVER];	ctrl->version.majorversion = 2;	ctrl->version.minorversion = 0;	ctrl->version.majormanuversion = (((dversion[0] - '0') & 0xf) << 4);	ctrl->version.majormanuversion |= ((dversion[2] - '0') & 0xf);	ctrl->version.minormanuversion = (dversion[3] - '0') << 4;	ctrl->version.minormanuversion |=			(dversion[5] - '0') * 10 + ((dversion[6] - '0') & 0xf);	profp = &ctrl->profile;	flag = ((u8 *)(profp->manu))[1];	switch (flag) {	case 0: if (cinfo->version[VER_CARDTYPE])	           strcpy(cinfo->cardname, cinfo->version[VER_CARDTYPE]);	        else strcpy(cinfo->cardname, "B1");		break;	case 3: strcpy(cinfo->cardname,"PCMCIA B"); break;	case 4: strcpy(cinfo->cardname,"PCMCIA M1"); break;	case 5: strcpy(cinfo->cardname,"PCMCIA M2"); break;	case 6: strcpy(cinfo->cardname,"B1 V3.0"); break;	case 7: strcpy(cinfo->cardname,"B1 PCI"); break;	default: sprintf(cinfo->cardname, "AVM?%u", (unsigned int)flag); break;        }        printk(KERN_NOTICE "%s: card %d \"%s\" ready.\n",				card->name, ctrl->cnr, cinfo->cardname);        flag = ((u8 *)(profp->manu))[3];        if (flag)		printk(KERN_NOTICE "%s: card %d Protocol:%s%s%s%s%s%s%s\n",			card->name,			ctrl->cnr,			(flag & 0x01) ? " DSS1" : "",			(flag & 0x02) ? " CT1" : "",			(flag & 0x04) ? " VN3" : "",			(flag & 0x08) ? " NI1" : "",			(flag & 0x10) ? " AUSTEL" : "",			(flag & 0x20) ? " ESS" : "",			(flag & 0x40) ? " 1TR6" : ""			);        flag = ((u8 *)(profp->manu))[5];	if (flag)		printk(KERN_NOTICE "%s: card %d Linetype:%s%s%s%s\n",			card->name,			ctrl->cnr,			(flag & 0x01) ? " point to point" : "",			(flag & 0x02) ? " point to multipoint" : "",			(flag & 0x08) ? " leased line without D-channel" : "",			(flag & 0x04) ? " leased line with D-channel" : ""			);}/* ------------------------------------------------------------- */irqreturn_t b1_interrupt(int interrupt, void *devptr, struct pt_regs *regs){	avmcard *card = devptr;	avmctrl_info *cinfo = &card->ctrlinfo[0];	struct capi_ctr *ctrl = &cinfo->capi_ctrl;	unsigned char b1cmd;	struct sk_buff *skb;	unsigned ApplId;	unsigned MsgLen;	unsigned DataB3Len;	unsigned NCCI;	unsigned WindowSize;	unsigned long flags;	spin_lock_irqsave(&card->lock, flags);	if (!b1_rx_full(card->port)) {		spin_unlock_irqrestore(&card->lock, flags);		return IRQ_NONE;	}	b1cmd = b1_get_byte(card->port);	switch (b1cmd) {	case RECEIVE_DATA_B3_IND:		ApplId = (unsigned) b1_get_word(card->port);		MsgLen = b1_get_slice(card->port, card->msgbuf);		DataB3Len = b1_get_slice(card->port, card->databuf);		spin_unlock_irqrestore(&card->lock, flags);		if (MsgLen < 30) { /* not CAPI 64Bit */			memset(card->msgbuf+MsgLen, 0, 30-MsgLen);			MsgLen = 30;			CAPIMSG_SETLEN(card->msgbuf, 30);		}		if (!(skb = alloc_skb(DataB3Len + MsgLen, GFP_ATOMIC))) {			printk(KERN_ERR "%s: incoming packet dropped\n",					card->name);		} else {			memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);			memcpy(skb_put(skb, DataB3Len), card->databuf, DataB3Len);			capi_ctr_handle_message(ctrl, ApplId, skb);		}		break;	case RECEIVE_MESSAGE:		ApplId = (unsigned) b1_get_word(card->port);		MsgLen = b1_get_slice(card->port, card->msgbuf);		spin_unlock_irqrestore(&card->lock, flags);		if (!(skb = alloc_skb(MsgLen, GFP_ATOMIC))) {			printk(KERN_ERR "%s: incoming packet dropped\n",					card->name);		} else {			memcpy(skb_put(skb, MsgLen), card->msgbuf, MsgLen);			if (CAPIMSG_CMD(skb->data) == CAPI_DATA_B3_CONF)				capilib_data_b3_conf(&cinfo->ncci_head, ApplId,						     CAPIMSG_NCCI(skb->data),						     CAPIMSG_MSGID(skb->data));			capi_ctr_handle_message(ctrl, ApplId, skb);		}		break;	case RECEIVE_NEW_NCCI:		ApplId = b1_get_word(card->port);		NCCI = b1_get_word(card->port);		WindowSize = b1_get_word(card->port);		spin_unlock_irqrestore(&card->lock, flags);		capilib_new_ncci(&cinfo->ncci_head, ApplId, NCCI, WindowSize);		break;	case RECEIVE_FREE_NCCI:		ApplId = b1_get_word(card->port);		NCCI = b1_get_word(card->port);		spin_unlock_irqrestore(&card->lock, flags);		if (NCCI != 0xffffffff)			capilib_free_ncci(&cinfo->ncci_head, ApplId, NCCI);	       		break;	case RECEIVE_START:	   	/* b1_put_byte(card->port, SEND_POLLACK); */		spin_unlock_irqrestore(&card->lock, flags);		capi_ctr_resume_output(ctrl);		break;	case RECEIVE_STOP:		spin_unlock_irqrestore(&card->lock, flags);		capi_ctr_suspend_output(ctrl);		break;	case RECEIVE_INIT:		cinfo->versionlen = b1_get_slice(card->port, cinfo->versionbuf);		spin_unlock_irqrestore(&card->lock, flags);		b1_parse_version(cinfo);		printk(KERN_INFO "%s: %s-card (%s) now active\n",		       card->name,		       cinfo->version[VER_CARDTYPE],		       cinfo->version[VER_DRIVER]);		capi_ctr_ready(ctrl);		break;	case RECEIVE_TASK_READY:		ApplId = (unsigned) b1_get_word(card->port);		MsgLen = b1_get_slice(card->port, card->msgbuf);		spin_unlock_irqrestore(&card->lock, flags);		card->msgbuf[MsgLen] = 0;		while (    MsgLen > 0		       && (   card->msgbuf[MsgLen-1] == '\n'			   || card->msgbuf[MsgLen-1] == '\r')) {			card->msgbuf[MsgLen-1] = 0;			MsgLen--;		}		printk(KERN_INFO "%s: task %d \"%s\" ready.\n",				card->name, ApplId, card->msgbuf);		break;	case RECEIVE_DEBUGMSG:		MsgLen = b1_get_slice(card->port, card->msgbuf);		spin_unlock_irqrestore(&card->lock, flags);		card->msgbuf[MsgLen] = 0;		while (    MsgLen > 0		       && (   card->msgbuf[MsgLen-1] == '\n'			   || card->msgbuf[MsgLen-1] == '\r')) {			card->msgbuf[MsgLen-1] = 0;			MsgLen--;		}		printk(KERN_INFO "%s: DEBUG: %s\n", card->name, card->msgbuf);		break;	case 0xff:		spin_unlock_irqrestore(&card->lock, flags);		printk(KERN_ERR "%s: card removed ?\n", card->name);		return IRQ_NONE;	default:		spin_unlock_irqrestore(&card->lock, flags);		printk(KERN_ERR "%s: b1_interrupt: 0x%x ???\n",				card->name, b1cmd);		return IRQ_HANDLED;	}	return IRQ_HANDLED;}/* ------------------------------------------------------------- */int b1ctl_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);	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 (card->cardtype == avm_t1isa)	   len += sprintf(page+len, "%-16s %d\n", "cardnr", card->cardnr);	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);}/* ------------------------------------------------------------- */#ifdef CONFIG_PCIavmcard_dmainfo *avmcard_dma_alloc(char *name, struct pci_dev *pdev, long rsize, long ssize){	avmcard_dmainfo *p;	void *buf;	p = kmalloc(sizeof(avmcard_dmainfo), GFP_KERNEL);	if (!p) {		printk(KERN_WARNING "%s: no memory.\n", name);		goto err;	}	memset(p, 0, sizeof(avmcard_dmainfo));	p->recvbuf.size = rsize;	buf = pci_alloc_consistent(pdev, rsize, &p->recvbuf.dmaaddr);	if (!buf) {		printk(KERN_WARNING "%s: allocation of receive dma buffer failed.\n", name);		goto err_kfree;	}	p->recvbuf.dmabuf = buf;	p->sendbuf.size = ssize;	buf = pci_alloc_consistent(pdev, ssize, &p->sendbuf.dmaaddr);	if (!buf) {		printk(KERN_WARNING "%s: allocation of send dma buffer failed.\n", name);		goto err_free_consistent;	}	p->sendbuf.dmabuf = buf;	skb_queue_head_init(&p->send_queue);	return p; err_free_consistent:	pci_free_consistent(p->pcidev, p->recvbuf.size,			    p->recvbuf.dmabuf, p->recvbuf.dmaaddr); err_kfree:	kfree(p); err:	return NULL;}void avmcard_dma_free(avmcard_dmainfo *p){	pci_free_consistent(p->pcidev, p->recvbuf.size,			    p->recvbuf.dmabuf, p->recvbuf.dmaaddr);	pci_free_consistent(p->pcidev, p->sendbuf.size,			    p->sendbuf.dmabuf, p->sendbuf.dmaaddr);	skb_queue_purge(&p->send_queue);	kfree(p);}EXPORT_SYMBOL(avmcard_dma_alloc);EXPORT_SYMBOL(avmcard_dma_free);#endifEXPORT_SYMBOL(b1_irq_table);EXPORT_SYMBOL(b1_alloc_card);EXPORT_SYMBOL(b1_free_card);EXPORT_SYMBOL(b1_detect);EXPORT_SYMBOL(b1_getrevision);EXPORT_SYMBOL(b1_load_t4file);EXPORT_SYMBOL(b1_load_config);EXPORT_SYMBOL(b1_loaded);EXPORT_SYMBOL(b1_load_firmware);EXPORT_SYMBOL(b1_reset_ctr);EXPORT_SYMBOL(b1_register_appl);EXPORT_SYMBOL(b1_release_appl);EXPORT_SYMBOL(b1_send_message);EXPORT_SYMBOL(b1_parse_version);EXPORT_SYMBOL(b1_interrupt);EXPORT_SYMBOL(b1ctl_read_proc);static int __init b1_init(void){	char *p;	char rev[32];	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");	printk(KERN_INFO "b1: revision %s\n", rev);	return 0;}static void __exit b1_exit(void){}module_init(b1_init);module_exit(b1_exit);

⌨️ 快捷键说明

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