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); }
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 AVM_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); }
static void b1dma_queue_tx(avmcard *card, struct sk_buff *skb) { unsigned long flags; spin_lock_irqsave(&card->lock, flags); skb_queue_tail(&card->dma->send_queue, skb); if (!(card->csr & EN_TX_TC_INT)) { b1dma_dispatch_tx(card); b1dma_writel(card, card->csr, AMCC_INTCSR); } spin_unlock_irqrestore(&card->lock, flags); }
static void queue_pollack(avmcard *card) { struct sk_buff *skb; void *p; skb = alloc_skb(3, GFP_ATOMIC); if (!skb) { printk(KERN_CRIT "%s: no memory, lost poll ack\n", card->name); return; } p = skb->data; _put_byte(&p, 0); _put_byte(&p, 0); _put_byte(&p, SEND_POLLACK); skb_put(skb, (__u8 *)p - (__u8 *)skb->data); skb_queue_tail(&card->dma->send_queue, skb); b1dma_dispatch_tx(card); }
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); }
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); }
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); }
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); }