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

📄 b1dma.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
						     CAPIMSG_MSGID(skb->data));			capi_ctr_handle_message(ctrl, ApplId, skb);		}		break;	case RECEIVE_NEW_NCCI:		ApplId = _get_word(&p);		NCCI = _get_word(&p);		WindowSize = _get_word(&p);		capilib_new_ncci(&cinfo->ncci_head, ApplId, NCCI, WindowSize);		break;	case RECEIVE_FREE_NCCI:		ApplId = _get_word(&p);		NCCI = _get_word(&p);		if (NCCI != 0xffffffff)			capilib_free_ncci(&cinfo->ncci_head, ApplId, NCCI);		break;	case RECEIVE_START:#ifdef CONFIG_B1DMA_POLLDEBUG		printk(KERN_INFO "%s: receive poll\n", card->name);#endif		if (!suppress_pollack)			queue_pollack(card);		capi_ctr_resume_output(ctrl);		break;	case RECEIVE_STOP:		capi_ctr_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]);		capi_ctr_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;	u32 newcsr;	spin_lock(&card->lock);	status = b1dma_readl(card, AMCC_INTCSR);	if ((status & ANY_S5933_INT) == 0) {		spin_unlock(&card->lock);		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;	b1dma_writel(card, newcsr, AMCC_INTCSR);	if ((status & RX_TC_INT) != 0) {		struct avmcard_dmainfo *dma = card->dma;		u32 rxlen;	   	if (card->dma->recvlen == 0) {	        	rxlen = b1dma_readl(card, AMCC_RXLEN);			if (rxlen == 0) {				dma->recvlen = *((u32 *)dma->recvbuf.dmabuf);				rxlen = (dma->recvlen + 3) & ~3;				b1dma_writel(card, dma->recvbuf.dmaaddr+4, AMCC_RXPTR);				b1dma_writel(card, rxlen, AMCC_RXLEN);#ifdef CONFIG_B1DMA_DEBUG			} else {				printk(KERN_ERR "%s: rx not complete (%d).\n",					card->name, rxlen);#endif			}		} else {			spin_unlock(&card->lock);			b1dma_handle_rx(card);	   		dma->recvlen = 0;			spin_lock(&card->lock);			b1dma_writel(card, dma->recvbuf.dmaaddr, AMCC_RXPTR);			b1dma_writel(card, 4, AMCC_RXLEN);		}	}	if ((status & TX_TC_INT) != 0) {		if (skb_queue_empty(&card->dma->send_queue))			card->csr &= ~EN_TX_TC_INT;		else			b1dma_dispatch_tx(card);	}	b1dma_writel(card, card->csr, AMCC_INTCSR);	spin_unlock(&card->lock);}irqreturn_t b1dma_interrupt(int interrupt, void *devptr, struct pt_regs *regs){	avmcard *card = devptr;	b1dma_handle_interrupt(card);	return IRQ_HANDLED;}/* ------------------------------------------------------------- */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);	b1dma_queue_tx(card, skb);}int b1dma_load_firmware(struct capi_ctr *ctrl, capiloaddata *data){	avmctrl_info *cinfo = (avmctrl_info *)(ctrl->driverdata);	avmcard *card = cinfo->card;	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;	}	card->csr = AVM_FLAG;	b1dma_writel(card, card->csr, AMCC_INTCSR);	b1dma_writel(card, EN_A2P_TRANSFERS|EN_P2A_TRANSFERS|A2P_HI_PRIORITY|		     P2A_HI_PRIORITY|RESET_A2P_FLAGS|RESET_P2A_FLAGS, 		     AMCC_MCSR);	t1outp(card->port, 0x07, 0x30);	t1outp(card->port, 0x10, 0xF0);	card->dma->recvlen = 0;	b1dma_writel(card, card->dma->recvbuf.dmaaddr, AMCC_RXPTR);	b1dma_writel(card, 4, AMCC_RXLEN);	card->csr |= EN_RX_TC_INT;	b1dma_writel(card, card->csr, AMCC_INTCSR);        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;	unsigned long flags;	spin_lock_irqsave(&card->lock, flags); 	b1dma_reset(card);	spin_unlock_irqrestore(&card->lock, flags);	memset(cinfo->version, 0, sizeof(cinfo->version));	capilib_release(&cinfo->ncci_head);	capi_ctr_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);	b1dma_queue_tx(card, skb);}/* ------------------------------------------------------------- */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;	capilib_release_appl(&cinfo->ncci_head, appl);	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);	b1dma_queue_tx(card, skb);}/* ------------------------------------------------------------- */u16 b1dma_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; 	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) 		b1dma_queue_tx(card, skb);	return retval;}/* ------------------------------------------------------------- */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;	u8 flag;	int len = 0;	char *s;	u32 txoff, txlen, rxoff, rxlen, csr;	unsigned long flags;	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);	spin_lock_irqsave(&card->lock, flags);	txoff = (dma_addr_t)b1dma_readl(card, AMCC_TXPTR)-card->dma->sendbuf.dmaaddr;	txlen = b1dma_readl(card, AMCC_TXLEN);	rxoff = (dma_addr_t)b1dma_readl(card, AMCC_RXPTR)-card->dma->recvbuf.dmaaddr;	rxlen = b1dma_readl(card, AMCC_RXLEN);	csr  = b1dma_readl(card, AMCC_INTCSR);	spin_unlock_irqrestore(&card->lock, 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)txoff);        len += sprintf(page+len, "%-16s %lu\n",				"txlen", (unsigned long)txlen);        len += sprintf(page+len, "%-16s %lu\n",				"rxoff", (unsigned long)rxoff);        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);static int __init b1dma_init(void){	char *p;	char rev[32];	if ((p = strchr(revision, ':')) != 0 && p[1]) {		strlcpy(rev, p + 2, sizeof(rev));		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;}static void __exit b1dma_exit(void){}module_init(b1dma_init);module_exit(b1dma_exit);

⌨️ 快捷键说明

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