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

📄 b1dma.c

📁 内核linux2.4.20,可跟rtlinux3.2打补丁 组成实时linux系统,编译内核
💻 C
📖 第 1 页 / 共 2 页
字号:
	case RECEIVE_MESSAGE:		ApplId = (unsigned) _get_word(&p);		MsgLen = _get_slice(&p, card->msgbuf);		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);			ctrl->handle_capimsg(ctrl, ApplId, skb);		}		break;	case RECEIVE_NEW_NCCI:		ApplId = _get_word(&p);		NCCI = _get_word(&p);		WindowSize = _get_word(&p);		ctrl->new_ncci(ctrl, ApplId, NCCI, WindowSize);		break;	case RECEIVE_FREE_NCCI:		ApplId = _get_word(&p);		NCCI = _get_word(&p);		if (NCCI != 0xffffffff)			ctrl->free_ncci(ctrl, ApplId, NCCI);		else ctrl->appl_released(ctrl, ApplId);		break;	case RECEIVE_START:#ifdef CONFIG_B1DMA_POLLDEBUG		printk(KERN_INFO "%s: receive poll\n", card->name);#endif		if (!suppress_pollack)			queue_pollack(card);		ctrl->resume_output(ctrl);		break;	case RECEIVE_STOP:		ctrl->suspend_output(ctrl);		break;	case RECEIVE_INIT:		cinfo->versionlen = _get_slice(&p, cinfo->versionbuf);		b1_parse_version(cinfo);		printk(KERN_INFO "%s: %s-card (%s) now active\n",		       card->name,		       cinfo->version[VER_CARDTYPE],		       cinfo->version[VER_DRIVER]);		ctrl->ready(ctrl);		break;	case RECEIVE_TASK_READY:		ApplId = (unsigned) _get_word(&p);		MsgLen = _get_slice(&p, card->msgbuf);		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 = _get_slice(&p, card->msgbuf);		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;	default:		printk(KERN_ERR "%s: b1dma_interrupt: 0x%x ???\n",				card->name, b1cmd);		return;	}}/* ------------------------------------------------------------- */static void b1dma_handle_interrupt(avmcard *card){	__u32 status = b1dmainmeml(card->mbase+AMCC_INTCSR);	__u32 newcsr;	if ((status & ANY_S5933_INT) == 0) 		return;        newcsr = card->csr | (status & ALL_INT);	if (status & TX_TC_INT) newcsr &= ~EN_TX_TC_INT;	if (status & RX_TC_INT) newcsr &= ~EN_RX_TC_INT;	b1dmaoutmeml(card->mbase+AMCC_INTCSR, newcsr);	if ((status & RX_TC_INT) != 0) {		__u8 *recvbuf = card->dma->recvbuf;		__u32 rxlen;	   	if (card->dma->recvlen == 0) {			card->dma->recvlen = *((__u32 *)recvbuf);			rxlen = (card->dma->recvlen + 3) & ~3;			b1dmaoutmeml(card->mbase+AMCC_RXPTR,					virt_to_phys(recvbuf+4));			b1dmaoutmeml(card->mbase+AMCC_RXLEN, rxlen);		} else {			b1dma_handle_rx(card);	   		card->dma->recvlen = 0;			b1dmaoutmeml(card->mbase+AMCC_RXPTR, virt_to_phys(recvbuf));			b1dmaoutmeml(card->mbase+AMCC_RXLEN, 4);		}	}	if ((status & TX_TC_INT) != 0) {		card->csr &= ~EN_TX_TC_INT;	        b1dma_dispatch_tx(card);	}	b1dmaoutmeml(card->mbase+AMCC_INTCSR, card->csr);}void b1dma_interrupt(int interrupt, void *devptr, struct pt_regs *regs){	avmcard *card;	card = (avmcard *) devptr;	if (!card) {		printk(KERN_WARNING "b1dma: interrupt: wrong device\n");		return;	}	if (card->interrupt) {		printk(KERN_ERR "%s: reentering interrupt hander\n", card->name);		return;	}	card->interrupt = 1;	b1dma_handle_interrupt(card);	card->interrupt = 0;}/* ------------------------------------------------------------- */static int b1dma_loaded(avmcard *card){	unsigned long stop;	unsigned char ans;	unsigned long tout = 2;	unsigned int base = card->port;	for (stop = jiffies + tout * HZ; time_before(jiffies, stop);) {		if (b1_tx_empty(base))			break;	}	if (!b1_tx_empty(base)) {		printk(KERN_ERR "%s: b1dma_loaded: tx err, corrupted t4 file ?\n",				card->name);		return 0;	}	b1_put_byte(base, SEND_POLLACK);	for (stop = jiffies + tout * HZ; time_before(jiffies, stop);) {		if (b1_rx_full(base)) {			if ((ans = b1_get_byte(base)) == RECEIVE_POLLDWORD) {				return 1;			}			printk(KERN_ERR "%s: b1dma_loaded: got 0x%x, firmware not running in dword mode\n", card->name, ans);			return 0;		}	}	printk(KERN_ERR "%s: b1dma_loaded: firmware not running\n", card->name);	return 0;}/* ------------------------------------------------------------- */static void b1dma_send_init(avmcard *card){	struct sk_buff *skb;	void *p;	skb = alloc_skb(15, 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_INIT);	_put_word(&p, CAPI_MAXAPPL);	_put_word(&p, AVM_NCCI_PER_CHANNEL*30);	_put_word(&p, card->cardnr - 1);	skb_put(skb, (__u8 *)p - (__u8 *)skb->data);	skb_queue_tail(&card->dma->send_queue, skb);	b1dma_dispatch_tx(card);}int b1dma_load_firmware(struct capi_ctr *ctrl, capiloaddata *data){	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);	avmcard *card = cinfo->card;	unsigned long flags;	int retval;	b1dma_reset(card);	if ((retval = b1_load_t4file(card, &data->firmware))) {		b1dma_reset(card);		printk(KERN_ERR "%s: failed to load t4file!!\n",					card->name);		return retval;	}	if (data->configuration.len > 0 && data->configuration.data) {		if ((retval = b1_load_config(card, &data->configuration))) {			b1dma_reset(card);			printk(KERN_ERR "%s: failed to load config!!\n",					card->name);			return retval;		}	}	if (!b1dma_loaded(card)) {		b1dma_reset(card);		printk(KERN_ERR "%s: failed to load t4file.\n", card->name);		return -EIO;	}	save_flags(flags);	cli();	card->csr = AVM_FLAG;	b1dmaoutmeml(card->mbase+AMCC_INTCSR, card->csr);	b1dmaoutmeml(card->mbase+AMCC_MCSR,		EN_A2P_TRANSFERS|EN_P2A_TRANSFERS		|A2P_HI_PRIORITY|P2A_HI_PRIORITY		|RESET_A2P_FLAGS|RESET_P2A_FLAGS);	t1outp(card->port, 0x07, 0x30);	t1outp(card->port, 0x10, 0xF0);	card->dma->recvlen = 0;	b1dmaoutmeml(card->mbase+AMCC_RXPTR, virt_to_phys(card->dma->recvbuf));	b1dmaoutmeml(card->mbase+AMCC_RXLEN, 4);	card->csr |= EN_RX_TC_INT;	b1dmaoutmeml(card->mbase+AMCC_INTCSR, card->csr);	restore_flags(flags);        b1dma_send_init(card);	return 0;}void b1dma_reset_ctr(struct capi_ctr *ctrl){	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);	avmcard *card = cinfo->card; 	b1dma_reset(card);	memset(cinfo->version, 0, sizeof(cinfo->version));	ctrl->reseted(ctrl);}/* ------------------------------------------------------------- */void b1dma_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;	int nconn;	void *p;	if (want > 0) nconn = want;	else nconn = ctrl->profile.nbchannel * -want;	if (nconn == 0) nconn = ctrl->profile.nbchannel;	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);	b1dma_dispatch_tx(card);	ctrl->appl_registered(ctrl, appl);}/* ------------------------------------------------------------- */void b1dma_release_appl(struct capi_ctr *ctrl, __u16 appl){	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);	avmcard *card = cinfo->card;	struct sk_buff *skb;	void *p;	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);	b1dma_dispatch_tx(card);}/* ------------------------------------------------------------- */void b1dma_send_message(struct capi_ctr *ctrl, struct sk_buff *skb){	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);	avmcard *card = cinfo->card;	skb_queue_tail(&card->dma->send_queue, skb);	b1dma_dispatch_tx(card);}/* ------------------------------------------------------------- */int b1dmactl_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;	unsigned long flags;	__u8 flag;	int len = 0;	char *s;	__u32 txaddr, txlen, rxaddr, rxlen, csr;	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);	save_flags(flags);	cli();	txaddr = (__u32)phys_to_virt(b1dmainmeml(card->mbase+0x2c));	txaddr -= (__u32)card->dma->sendbuf;	txlen  = b1dmainmeml(card->mbase+0x30);	rxaddr = (__u32)phys_to_virt(b1dmainmeml(card->mbase+0x24));	rxaddr -= (__u32)card->dma->recvbuf;	rxlen  = b1dmainmeml(card->mbase+0x28);	csr  = b1dmainmeml(card->mbase+AMCC_INTCSR);	restore_flags(flags);        len += sprintf(page+len, "%-16s 0x%lx\n",				"csr (cached)", (unsigned long)card->csr);        len += sprintf(page+len, "%-16s 0x%lx\n",				"csr", (unsigned long)csr);        len += sprintf(page+len, "%-16s %lu\n",				"txoff", (unsigned long)txaddr);        len += sprintf(page+len, "%-16s %lu\n",				"txlen", (unsigned long)txlen);        len += sprintf(page+len, "%-16s %lu\n",				"rxoff", (unsigned long)rxaddr);        len += sprintf(page+len, "%-16s %lu\n",				"rxlen", (unsigned long)rxlen);	if (off+count >= len)	   *eof = 1;	if (len < off)           return 0;	*start = page + off;	return ((count < len-off) ? count : len-off);}/* ------------------------------------------------------------- */EXPORT_SYMBOL(b1dma_reset);EXPORT_SYMBOL(t1pci_detect);EXPORT_SYMBOL(b1pciv4_detect);EXPORT_SYMBOL(b1dma_interrupt);EXPORT_SYMBOL(b1dma_load_firmware);EXPORT_SYMBOL(b1dma_reset_ctr);EXPORT_SYMBOL(b1dma_register_appl);EXPORT_SYMBOL(b1dma_release_appl);EXPORT_SYMBOL(b1dma_send_message);EXPORT_SYMBOL(b1dmactl_read_proc);int b1dma_init(void){	char *p;	char rev[32];	if ((p = strchr(revision, ':')) != 0 && p[1]) {		strncpy(rev, p + 2, sizeof(rev));		rev[sizeof(rev)-1] = 0;		if ((p = strchr(rev, '$')) != 0 && p > rev)		   *(p-1) = 0;	} else		strcpy(rev, "1.0");	printk(KERN_INFO "b1dma: revision %s\n", rev);	return 0;}void b1dma_exit(void){}module_init(b1dma_init);module_exit(b1dma_exit);

⌨️ 快捷键说明

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