Lines Matching refs:di

38 #define DMA64TXREGOFFS(di, field)	(di->d64txregbase + DMA64REGOFFS(field))  argument
39 #define DMA64RXREGOFFS(di, field) (di->d64rxregbase + DMA64REGOFFS(field)) argument
313 static uint txd(struct dma_info *di, uint x) in txd() argument
315 return xxd(x, di->ntxd); in txd()
318 static uint rxd(struct dma_info *di, uint x) in rxd() argument
320 return xxd(x, di->nrxd); in rxd()
323 static uint nexttxd(struct dma_info *di, uint i) in nexttxd() argument
325 return txd(di, i + 1); in nexttxd()
328 static uint prevtxd(struct dma_info *di, uint i) in prevtxd() argument
330 return txd(di, i - 1); in prevtxd()
333 static uint nextrxd(struct dma_info *di, uint i) in nextrxd() argument
335 return rxd(di, i + 1); in nextrxd()
338 static uint ntxdactive(struct dma_info *di, uint h, uint t) in ntxdactive() argument
340 return txd(di, t-h); in ntxdactive()
343 static uint nrxdactive(struct dma_info *di, uint h, uint t) in nrxdactive() argument
345 return rxd(di, t-h); in nrxdactive()
348 static uint _dma_ctrlflags(struct dma_info *di, uint mask, uint flags) in _dma_ctrlflags() argument
352 if (di == NULL) in _dma_ctrlflags()
355 dmactrlflags = di->dma.dmactrlflags; in _dma_ctrlflags()
363 control = bcma_read32(di->core, DMA64TXREGOFFS(di, control)); in _dma_ctrlflags()
364 bcma_write32(di->core, DMA64TXREGOFFS(di, control), in _dma_ctrlflags()
366 if (bcma_read32(di->core, DMA64TXREGOFFS(di, control)) & in _dma_ctrlflags()
371 bcma_write32(di->core, DMA64TXREGOFFS(di, control), in _dma_ctrlflags()
378 di->dma.dmactrlflags = dmactrlflags; in _dma_ctrlflags()
383 static bool _dma64_addrext(struct dma_info *di, uint ctrl_offset) in _dma64_addrext() argument
386 bcma_set32(di->core, ctrl_offset, D64_XC_AE); in _dma64_addrext()
387 w = bcma_read32(di->core, ctrl_offset); in _dma64_addrext()
388 bcma_mask32(di->core, ctrl_offset, ~D64_XC_AE); in _dma64_addrext()
396 static bool _dma_isaddrext(struct dma_info *di) in _dma_isaddrext() argument
401 if (di->d64txregbase != 0) { in _dma_isaddrext()
402 if (!_dma64_addrext(di, DMA64TXREGOFFS(di, control))) in _dma_isaddrext()
403 brcms_dbg_dma(di->core, in _dma_isaddrext()
405 di->name); in _dma_isaddrext()
407 } else if (di->d64rxregbase != 0) { in _dma_isaddrext()
408 if (!_dma64_addrext(di, DMA64RXREGOFFS(di, control))) in _dma_isaddrext()
409 brcms_dbg_dma(di->core, in _dma_isaddrext()
411 di->name); in _dma_isaddrext()
418 static bool _dma_descriptor_align(struct dma_info *di) in _dma_descriptor_align() argument
423 if (di->d64txregbase != 0) { in _dma_descriptor_align()
424 bcma_write32(di->core, DMA64TXREGOFFS(di, addrlow), 0xff0); in _dma_descriptor_align()
425 addrl = bcma_read32(di->core, DMA64TXREGOFFS(di, addrlow)); in _dma_descriptor_align()
428 } else if (di->d64rxregbase != 0) { in _dma_descriptor_align()
429 bcma_write32(di->core, DMA64RXREGOFFS(di, addrlow), 0xff0); in _dma_descriptor_align()
430 addrl = bcma_read32(di->core, DMA64RXREGOFFS(di, addrlow)); in _dma_descriptor_align()
441 static void *dma_alloc_consistent(struct dma_info *di, uint size, in dma_alloc_consistent() argument
451 return dma_alloc_coherent(di->dmadev, size, pap, GFP_ATOMIC); in dma_alloc_consistent()
469 static void *dma_ringalloc(struct dma_info *di, u32 boundary, uint size, in dma_ringalloc() argument
477 va = dma_alloc_consistent(di, size, *alignbits, alloced, descpa); in dma_ringalloc()
486 dma_free_coherent(di->dmadev, size, va, *descpa); in dma_ringalloc()
487 va = dma_alloc_consistent(di, size, *alignbits, in dma_ringalloc()
493 static bool dma64_alloc(struct dma_info *di, uint direction) in dma64_alloc() argument
504 size = (direction == DMA_TX) ? (di->ntxd * ddlen) : (di->nrxd * ddlen); in dma64_alloc()
505 align_bits = di->dmadesc_align; in dma64_alloc()
509 va = dma_ringalloc(di, D64RINGALIGN, size, &align_bits, in dma64_alloc()
510 &alloced, &di->txdpaorig); in dma64_alloc()
512 brcms_dbg_dma(di->core, in dma64_alloc()
514 di->name); in dma64_alloc()
518 di->txd64 = (struct dma64desc *) in dma64_alloc()
520 di->txdalign = (uint) ((s8 *)di->txd64 - (s8 *) va); in dma64_alloc()
521 di->txdpa = di->txdpaorig + di->txdalign; in dma64_alloc()
522 di->txdalloc = alloced; in dma64_alloc()
524 va = dma_ringalloc(di, D64RINGALIGN, size, &align_bits, in dma64_alloc()
525 &alloced, &di->rxdpaorig); in dma64_alloc()
527 brcms_dbg_dma(di->core, in dma64_alloc()
529 di->name); in dma64_alloc()
533 di->rxd64 = (struct dma64desc *) in dma64_alloc()
535 di->rxdalign = (uint) ((s8 *)di->rxd64 - (s8 *) va); in dma64_alloc()
536 di->rxdpa = di->rxdpaorig + di->rxdalign; in dma64_alloc()
537 di->rxdalloc = alloced; in dma64_alloc()
543 static bool _dma_alloc(struct dma_info *di, uint direction) in _dma_alloc() argument
545 return dma64_alloc(di, direction); in _dma_alloc()
555 struct dma_info *di; in dma_attach() local
561 di = kzalloc(sizeof(struct dma_info), GFP_ATOMIC); in dma_attach()
562 if (di == NULL) in dma_attach()
565 di->dma64 = in dma_attach()
569 di->core = core; in dma_attach()
570 di->d64txregbase = txregbase; in dma_attach()
571 di->d64rxregbase = rxregbase; in dma_attach()
578 _dma_ctrlflags(di, DMA_CTRL_ROC | DMA_CTRL_PEN, 0); in dma_attach()
580 brcms_dbg_dma(di->core, "%s: %s flags 0x%x ntxd %d nrxd %d " in dma_attach()
583 di->dma.dmactrlflags, ntxd, nrxd, rxbufsize, in dma_attach()
587 strncpy(di->name, name, MAXNAMEL); in dma_attach()
588 di->name[MAXNAMEL - 1] = '\0'; in dma_attach()
590 di->dmadev = core->dma_dev; in dma_attach()
593 di->ntxd = (u16) ntxd; in dma_attach()
594 di->nrxd = (u16) nrxd; in dma_attach()
597 di->rxextrahdrroom = in dma_attach()
600 di->rxbufsize = (u16) (rxbufsize - di->rxextrahdrroom); in dma_attach()
602 di->rxbufsize = (u16) rxbufsize; in dma_attach()
604 di->nrxpost = (u16) nrxpost; in dma_attach()
605 di->rxoffset = (u8) rxoffset; in dma_attach()
614 di->ddoffsetlow = 0; in dma_attach()
615 di->dataoffsetlow = 0; in dma_attach()
619 di->ddoffsetlow = 0; in dma_attach()
620 di->ddoffsethigh = SI_PCIE_DMA_H32; in dma_attach()
622 di->dataoffsetlow = di->ddoffsetlow; in dma_attach()
623 di->dataoffsethigh = di->ddoffsethigh; in dma_attach()
628 di->addrext = false; in dma_attach()
631 di->addrext = false; in dma_attach()
633 di->addrext = _dma_isaddrext(di); in dma_attach()
636 di->aligndesc_4k = _dma_descriptor_align(di); in dma_attach()
637 if (di->aligndesc_4k) { in dma_attach()
638 di->dmadesc_align = D64RINGALIGN_BITS; in dma_attach()
641 di->dmadesc_align = D64RINGALIGN_BITS - 1; in dma_attach()
643 di->dmadesc_align = 4; /* 16 byte alignment */ in dma_attach()
646 brcms_dbg_dma(di->core, "DMA descriptor align_needed %d, align %d\n", in dma_attach()
647 di->aligndesc_4k, di->dmadesc_align); in dma_attach()
652 di->txp = kzalloc(size, GFP_ATOMIC); in dma_attach()
653 if (di->txp == NULL) in dma_attach()
660 di->rxp = kzalloc(size, GFP_ATOMIC); in dma_attach()
661 if (di->rxp == NULL) in dma_attach()
670 if (!_dma_alloc(di, DMA_TX)) in dma_attach()
679 if (!_dma_alloc(di, DMA_RX)) in dma_attach()
683 if ((di->ddoffsetlow != 0) && !di->addrext) { in dma_attach()
684 if (di->txdpa > SI_PCI_DMA_SZ) { in dma_attach()
685 brcms_dbg_dma(di->core, in dma_attach()
687 di->name, (u32)di->txdpa); in dma_attach()
690 if (di->rxdpa > SI_PCI_DMA_SZ) { in dma_attach()
691 brcms_dbg_dma(di->core, in dma_attach()
693 di->name, (u32)di->rxdpa); in dma_attach()
699 brcms_c_ampdu_reset_session(&di->ampdu_session, wlc); in dma_attach()
701 brcms_dbg_dma(di->core, in dma_attach()
703 di->ddoffsetlow, di->ddoffsethigh, in dma_attach()
704 di->dataoffsetlow, di->dataoffsethigh, in dma_attach()
705 di->addrext); in dma_attach()
707 return (struct dma_pub *) di; in dma_attach()
710 dma_detach((struct dma_pub *)di); in dma_attach()
715 dma64_dd_upd(struct dma_info *di, struct dma64desc *ddring, in dma64_dd_upd() argument
721 if ((di->dataoffsetlow == 0) || !(pa & PCI32ADDR_HIGH)) { in dma64_dd_upd()
722 ddring[outidx].addrlow = cpu_to_le32(pa + di->dataoffsetlow); in dma64_dd_upd()
723 ddring[outidx].addrhigh = cpu_to_le32(di->dataoffsethigh); in dma64_dd_upd()
734 ddring[outidx].addrlow = cpu_to_le32(pa + di->dataoffsetlow); in dma64_dd_upd()
735 ddring[outidx].addrhigh = cpu_to_le32(di->dataoffsethigh); in dma64_dd_upd()
739 if (di->dma.dmactrlflags & DMA_CTRL_PEN) { in dma64_dd_upd()
749 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_detach() local
751 brcms_dbg_dma(di->core, "%s:\n", di->name); in dma_detach()
754 if (di->txd64) in dma_detach()
755 dma_free_coherent(di->dmadev, di->txdalloc, in dma_detach()
756 ((s8 *)di->txd64 - di->txdalign), in dma_detach()
757 (di->txdpaorig)); in dma_detach()
758 if (di->rxd64) in dma_detach()
759 dma_free_coherent(di->dmadev, di->rxdalloc, in dma_detach()
760 ((s8 *)di->rxd64 - di->rxdalign), in dma_detach()
761 (di->rxdpaorig)); in dma_detach()
764 kfree(di->txp); in dma_detach()
765 kfree(di->rxp); in dma_detach()
768 kfree(di); in dma_detach()
774 _dma_ddtable_init(struct dma_info *di, uint direction, dma_addr_t pa) in _dma_ddtable_init() argument
776 if (!di->aligndesc_4k) { in _dma_ddtable_init()
778 di->xmtptrbase = pa; in _dma_ddtable_init()
780 di->rcvptrbase = pa; in _dma_ddtable_init()
783 if ((di->ddoffsetlow == 0) in _dma_ddtable_init()
786 bcma_write32(di->core, DMA64TXREGOFFS(di, addrlow), in _dma_ddtable_init()
787 pa + di->ddoffsetlow); in _dma_ddtable_init()
788 bcma_write32(di->core, DMA64TXREGOFFS(di, addrhigh), in _dma_ddtable_init()
789 di->ddoffsethigh); in _dma_ddtable_init()
791 bcma_write32(di->core, DMA64RXREGOFFS(di, addrlow), in _dma_ddtable_init()
792 pa + di->ddoffsetlow); in _dma_ddtable_init()
793 bcma_write32(di->core, DMA64RXREGOFFS(di, addrhigh), in _dma_ddtable_init()
794 di->ddoffsethigh); in _dma_ddtable_init()
805 bcma_write32(di->core, DMA64TXREGOFFS(di, addrlow), in _dma_ddtable_init()
806 pa + di->ddoffsetlow); in _dma_ddtable_init()
807 bcma_write32(di->core, DMA64TXREGOFFS(di, addrhigh), in _dma_ddtable_init()
808 di->ddoffsethigh); in _dma_ddtable_init()
809 bcma_maskset32(di->core, DMA64TXREGOFFS(di, control), in _dma_ddtable_init()
812 bcma_write32(di->core, DMA64RXREGOFFS(di, addrlow), in _dma_ddtable_init()
813 pa + di->ddoffsetlow); in _dma_ddtable_init()
814 bcma_write32(di->core, DMA64RXREGOFFS(di, addrhigh), in _dma_ddtable_init()
815 di->ddoffsethigh); in _dma_ddtable_init()
816 bcma_maskset32(di->core, DMA64RXREGOFFS(di, control), in _dma_ddtable_init()
822 static void _dma_rxenable(struct dma_info *di) in _dma_rxenable() argument
824 uint dmactrlflags = di->dma.dmactrlflags; in _dma_rxenable()
827 brcms_dbg_dma(di->core, "%s:\n", di->name); in _dma_rxenable()
829 control = D64_RC_RE | (bcma_read32(di->core, in _dma_rxenable()
830 DMA64RXREGOFFS(di, control)) & in _dma_rxenable()
839 bcma_write32(di->core, DMA64RXREGOFFS(di, control), in _dma_rxenable()
840 ((di->rxoffset << D64_RC_RO_SHIFT) | control)); in _dma_rxenable()
845 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_rxinit() local
847 brcms_dbg_dma(di->core, "%s:\n", di->name); in dma_rxinit()
849 if (di->nrxd == 0) in dma_rxinit()
852 di->rxin = di->rxout = 0; in dma_rxinit()
855 memset(di->rxd64, '\0', di->nrxd * sizeof(struct dma64desc)); in dma_rxinit()
860 if (!di->aligndesc_4k) in dma_rxinit()
861 _dma_ddtable_init(di, DMA_RX, di->rxdpa); in dma_rxinit()
863 _dma_rxenable(di); in dma_rxinit()
865 if (di->aligndesc_4k) in dma_rxinit()
866 _dma_ddtable_init(di, DMA_RX, di->rxdpa); in dma_rxinit()
869 static struct sk_buff *dma64_getnextrxp(struct dma_info *di, bool forceall) in dma64_getnextrxp() argument
875 i = di->rxin; in dma64_getnextrxp()
878 if (i == di->rxout) in dma64_getnextrxp()
882 B2I(((bcma_read32(di->core, in dma64_getnextrxp()
883 DMA64RXREGOFFS(di, status0)) & D64_RS0_CD_MASK) - in dma64_getnextrxp()
884 di->rcvptrbase) & D64_RS0_CD_MASK, struct dma64desc); in dma64_getnextrxp()
891 rxp = di->rxp[i]; in dma64_getnextrxp()
892 di->rxp[i] = NULL; in dma64_getnextrxp()
894 pa = le32_to_cpu(di->rxd64[i].addrlow) - di->dataoffsetlow; in dma64_getnextrxp()
897 dma_unmap_single(di->dmadev, pa, di->rxbufsize, DMA_FROM_DEVICE); in dma64_getnextrxp()
899 di->rxd64[i].addrlow = cpu_to_le32(0xdeadbeef); in dma64_getnextrxp()
900 di->rxd64[i].addrhigh = cpu_to_le32(0xdeadbeef); in dma64_getnextrxp()
902 di->rxin = nextrxd(di, i); in dma64_getnextrxp()
907 static struct sk_buff *_dma_getnextrxp(struct dma_info *di, bool forceall) in _dma_getnextrxp() argument
909 if (di->nrxd == 0) in _dma_getnextrxp()
912 return dma64_getnextrxp(di, forceall); in _dma_getnextrxp()
927 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_rx() local
937 p = _dma_getnextrxp(di, false); in dma_rx()
942 brcms_dbg_dma(di->core, "%s: dma_rx len %d\n", di->name, len); in dma_rx()
946 pkt_len = min((di->rxoffset + len), di->rxbufsize); in dma_rx()
949 resid = len - (di->rxbufsize - di->rxoffset); in dma_rx()
953 while ((resid > 0) && (p = _dma_getnextrxp(di, false))) { in dma_rx()
954 pkt_len = min_t(uint, resid, di->rxbufsize); in dma_rx()
957 resid -= di->rxbufsize; in dma_rx()
965 B2I(((bcma_read32(di->core, in dma_rx()
966 DMA64RXREGOFFS(di, status0)) & in dma_rx()
967 D64_RS0_CD_MASK) - di->rcvptrbase) & in dma_rx()
969 brcms_dbg_dma(di->core, in dma_rx()
971 di->rxin, di->rxout, cur); in dma_rx()
975 if ((di->dma.dmactrlflags & DMA_CTRL_RXMULTI) == 0) { in dma_rx()
976 brcms_dbg_dma(di->core, "%s: bad frame length (%d)\n", in dma_rx()
977 di->name, len); in dma_rx()
982 di->dma.rxgiants++; in dma_rx()
992 static bool dma64_rxidle(struct dma_info *di) in dma64_rxidle() argument
994 brcms_dbg_dma(di->core, "%s:\n", di->name); in dma64_rxidle()
996 if (di->nrxd == 0) in dma64_rxidle()
999 return ((bcma_read32(di->core, in dma64_rxidle()
1000 DMA64RXREGOFFS(di, status0)) & D64_RS0_CD_MASK) == in dma64_rxidle()
1001 (bcma_read32(di->core, DMA64RXREGOFFS(di, ptr)) & in dma64_rxidle()
1005 static bool dma64_txidle(struct dma_info *di) in dma64_txidle() argument
1007 if (di->ntxd == 0) in dma64_txidle()
1010 return ((bcma_read32(di->core, in dma64_txidle()
1011 DMA64TXREGOFFS(di, status0)) & D64_XS0_CD_MASK) == in dma64_txidle()
1012 (bcma_read32(di->core, DMA64TXREGOFFS(di, ptr)) & in dma64_txidle()
1025 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_rxfill() local
1043 rxin = di->rxin; in dma_rxfill()
1044 rxout = di->rxout; in dma_rxfill()
1046 n = di->nrxpost - nrxdactive(di, rxin, rxout); in dma_rxfill()
1048 brcms_dbg_dma(di->core, "%s: post %d\n", di->name, n); in dma_rxfill()
1050 if (di->rxbufsize > BCMEXTRAHDROOM) in dma_rxfill()
1051 extra_offset = di->rxextrahdrroom; in dma_rxfill()
1058 p = brcmu_pkt_buf_get_skb(di->rxbufsize + extra_offset); in dma_rxfill()
1061 brcms_dbg_dma(di->core, "%s: out of rxbufs\n", in dma_rxfill()
1062 di->name); in dma_rxfill()
1063 if (i == 0 && dma64_rxidle(di)) { in dma_rxfill()
1064 brcms_dbg_dma(di->core, "%s: ring is empty !\n", in dma_rxfill()
1065 di->name); in dma_rxfill()
1068 di->dma.rxnobuf++; in dma_rxfill()
1080 pa = dma_map_single(di->dmadev, p->data, di->rxbufsize, in dma_rxfill()
1082 if (dma_mapping_error(di->dmadev, pa)) { in dma_rxfill()
1088 di->rxp[rxout] = p; in dma_rxfill()
1092 if (rxout == (di->nrxd - 1)) in dma_rxfill()
1095 dma64_dd_upd(di, di->rxd64, pa, rxout, &flags, in dma_rxfill()
1096 di->rxbufsize); in dma_rxfill()
1097 rxout = nextrxd(di, rxout); in dma_rxfill()
1100 di->rxout = rxout; in dma_rxfill()
1103 bcma_write32(di->core, DMA64RXREGOFFS(di, ptr), in dma_rxfill()
1104 di->rcvptrbase + I2B(rxout, struct dma64desc)); in dma_rxfill()
1111 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_rxreclaim() local
1114 brcms_dbg_dma(di->core, "%s:\n", di->name); in dma_rxreclaim()
1116 while ((p = _dma_getnextrxp(di, true))) in dma_rxreclaim()
1131 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_getvar() local
1134 return (unsigned long)&(di->dma.txavail); in dma_getvar()
1142 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_txinit() local
1145 brcms_dbg_dma(di->core, "%s:\n", di->name); in dma_txinit()
1147 if (di->ntxd == 0) in dma_txinit()
1150 di->txin = di->txout = 0; in dma_txinit()
1151 di->dma.txavail = di->ntxd - 1; in dma_txinit()
1154 memset(di->txd64, '\0', (di->ntxd * sizeof(struct dma64desc))); in dma_txinit()
1159 if (!di->aligndesc_4k) in dma_txinit()
1160 _dma_ddtable_init(di, DMA_TX, di->txdpa); in dma_txinit()
1162 if ((di->dma.dmactrlflags & DMA_CTRL_PEN) == 0) in dma_txinit()
1164 bcma_set32(di->core, DMA64TXREGOFFS(di, control), control); in dma_txinit()
1169 if (di->aligndesc_4k) in dma_txinit()
1170 _dma_ddtable_init(di, DMA_TX, di->txdpa); in dma_txinit()
1175 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_txsuspend() local
1177 brcms_dbg_dma(di->core, "%s:\n", di->name); in dma_txsuspend()
1179 if (di->ntxd == 0) in dma_txsuspend()
1182 bcma_set32(di->core, DMA64TXREGOFFS(di, control), D64_XC_SE); in dma_txsuspend()
1187 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_txresume() local
1189 brcms_dbg_dma(di->core, "%s:\n", di->name); in dma_txresume()
1191 if (di->ntxd == 0) in dma_txresume()
1194 bcma_mask32(di->core, DMA64TXREGOFFS(di, control), ~D64_XC_SE); in dma_txresume()
1199 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_txsuspended() local
1201 return (di->ntxd == 0) || in dma_txsuspended()
1202 ((bcma_read32(di->core, in dma_txsuspended()
1203 DMA64TXREGOFFS(di, control)) & D64_XC_SE) == in dma_txsuspended()
1209 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_txreclaim() local
1212 brcms_dbg_dma(di->core, "%s: %s\n", in dma_txreclaim()
1213 di->name, in dma_txreclaim()
1218 if (di->txin == di->txout) in dma_txreclaim()
1223 if (!(di->dma.dmactrlflags & DMA_CTRL_UNFRAMED)) in dma_txreclaim()
1230 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_txreset() local
1233 if (di->ntxd == 0) in dma_txreset()
1237 bcma_write32(di->core, DMA64TXREGOFFS(di, control), D64_XC_SE); in dma_txreset()
1239 (bcma_read32(di->core, DMA64TXREGOFFS(di, status0)) & in dma_txreset()
1244 bcma_write32(di->core, DMA64TXREGOFFS(di, control), 0); in dma_txreset()
1246 (bcma_read32(di->core, DMA64TXREGOFFS(di, status0)) & in dma_txreset()
1257 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_rxreset() local
1260 if (di->nrxd == 0) in dma_rxreset()
1263 bcma_write32(di->core, DMA64RXREGOFFS(di, control), 0); in dma_rxreset()
1265 (bcma_read32(di->core, DMA64RXREGOFFS(di, status0)) & in dma_rxreset()
1271 static void dma_txenq(struct dma_info *di, struct sk_buff *p) in dma_txenq() argument
1279 txout = di->txout; in dma_txenq()
1281 if (WARN_ON(nexttxd(di, txout) == di->txin)) in dma_txenq()
1291 pa = dma_map_single(di->dmadev, data, len, DMA_TO_DEVICE); in dma_txenq()
1293 if (dma_mapping_error(di->dmadev, pa)) { in dma_txenq()
1303 if (txout == (di->ntxd - 1)) in dma_txenq()
1306 dma64_dd_upd(di, di->txd64, pa, txout, &flags, len); in dma_txenq()
1308 txout = nexttxd(di, txout); in dma_txenq()
1311 di->txp[prevtxd(di, txout)] = p; in dma_txenq()
1314 di->txout = txout; in dma_txenq()
1317 static void ampdu_finalize(struct dma_info *di) in ampdu_finalize() argument
1319 struct brcms_ampdu_session *session = &di->ampdu_session; in ampdu_finalize()
1336 dma_txenq(di, p); in ampdu_finalize()
1339 bcma_write32(di->core, DMA64TXREGOFFS(di, ptr), in ampdu_finalize()
1340 di->xmtptrbase + I2B(di->txout, struct dma64desc)); in ampdu_finalize()
1344 static void prep_ampdu_frame(struct dma_info *di, struct sk_buff *p) in prep_ampdu_frame() argument
1346 struct brcms_ampdu_session *session = &di->ampdu_session; in prep_ampdu_frame()
1355 ampdu_finalize(di); in prep_ampdu_frame()
1363 static void dma_update_txavail(struct dma_info *di) in dma_update_txavail() argument
1369 di->dma.txavail = di->ntxd - ntxdactive(di, di->txin, di->txout) - in dma_update_txavail()
1370 skb_queue_len(&di->ampdu_session.skb_list) - 1; in dma_update_txavail()
1382 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_txfast() local
1383 struct brcms_ampdu_session *session = &di->ampdu_session; in dma_txfast()
1392 if (di->dma.txavail == 0 || nexttxd(di, di->txout) == di->txin) in dma_txfast()
1398 prep_ampdu_frame(di, p); in dma_txfast()
1400 dma_txenq(di, p); in dma_txfast()
1403 dma_update_txavail(di); in dma_txfast()
1413 di->dma.txavail == 0 || dma64_txidle(di)) in dma_txfast()
1414 ampdu_finalize(di); in dma_txfast()
1416 bcma_write32(di->core, DMA64TXREGOFFS(di, ptr), in dma_txfast()
1417 di->xmtptrbase + I2B(di->txout, struct dma64desc)); in dma_txfast()
1423 brcms_dbg_dma(di->core, "%s: out of txds !!!\n", di->name); in dma_txfast()
1425 di->dma.txavail = 0; in dma_txfast()
1426 di->dma.txnobuf++; in dma_txfast()
1432 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_txflush() local
1433 struct brcms_ampdu_session *session = &di->ampdu_session; in dma_txflush()
1436 ampdu_finalize(di); in dma_txflush()
1441 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_txpending() local
1442 return ntxdactive(di, di->txin, di->txout); in dma_txpending()
1451 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_kick_tx() local
1452 struct brcms_ampdu_session *session = &di->ampdu_session; in dma_kick_tx()
1454 if (!skb_queue_empty(&session->skb_list) && dma64_txidle(di)) in dma_kick_tx()
1455 ampdu_finalize(di); in dma_kick_tx()
1470 struct dma_info *di = container_of(pub, struct dma_info, dma); in dma_getnexttxp() local
1475 brcms_dbg_dma(di->core, "%s: %s\n", in dma_getnexttxp()
1476 di->name, in dma_getnexttxp()
1481 if (di->ntxd == 0) in dma_getnexttxp()
1486 start = di->txin; in dma_getnexttxp()
1488 end = di->txout; in dma_getnexttxp()
1490 end = (u16) (B2I(((bcma_read32(di->core, in dma_getnexttxp()
1491 DMA64TXREGOFFS(di, status0)) & in dma_getnexttxp()
1492 D64_XS0_CD_MASK) - di->xmtptrbase) & in dma_getnexttxp()
1497 (u16)(bcma_read32(di->core, in dma_getnexttxp()
1498 DMA64TXREGOFFS(di, status1)) & in dma_getnexttxp()
1501 (active_desc - di->xmtptrbase) & D64_XS0_CD_MASK; in dma_getnexttxp()
1504 end = prevtxd(di, active_desc); in dma_getnexttxp()
1508 if ((start == 0) && (end > di->txout)) in dma_getnexttxp()
1511 for (i = start; i != end && !txp; i = nexttxd(di, i)) { in dma_getnexttxp()
1515 pa = le32_to_cpu(di->txd64[i].addrlow) - di->dataoffsetlow; in dma_getnexttxp()
1518 (le32_to_cpu(di->txd64[i].ctrl2) & in dma_getnexttxp()
1521 di->txd64[i].addrlow = cpu_to_le32(0xdeadbeef); in dma_getnexttxp()
1522 di->txd64[i].addrhigh = cpu_to_le32(0xdeadbeef); in dma_getnexttxp()
1524 txp = di->txp[i]; in dma_getnexttxp()
1525 di->txp[i] = NULL; in dma_getnexttxp()
1527 dma_unmap_single(di->dmadev, pa, size, DMA_TO_DEVICE); in dma_getnexttxp()
1530 di->txin = i; in dma_getnexttxp()
1533 dma_update_txavail(di); in dma_getnexttxp()
1538 brcms_dbg_dma(di->core, "bogus curr: start %d end %d txout %d\n", in dma_getnexttxp()
1539 start, end, di->txout); in dma_getnexttxp()
1552 struct dma_info *di = container_of(dmah, struct dma_info, dma); in dma_walk_packets() local
1553 uint i = di->txin; in dma_walk_packets()
1554 uint end = di->txout; in dma_walk_packets()
1559 skb = di->txp[i]; in dma_walk_packets()
1564 i = nexttxd(di, i); in dma_walk_packets()