Lines Matching refs:pktp
388 BCMATTACHFN(pktpool_init)(osl_t *osh, pktpool_t *pktp, int *pplen, int plen, bool istx, uint8 type)
394 ASSERT(pktp != NULL);
400 bzero(pktp, sizeof(pktpool_t));
403 if ((pktp_id = (uint8) pktpool_register(pktp)) == PKTPOOL_INVALID_ID) {
406 POOLSETID(pktp, pktp_id);
408 pktp->inited = TRUE;
409 pktp->istx = istx ? TRUE : FALSE;
410 pktp->plen = (uint16)plen;
411 pktp->type = type;
413 pktp->maxlen = PKTPOOL_LEN_MAX;
414 pktplen = LIMIT_TO_MAX(pktplen, pktp->maxlen);
425 if (pktp->freelist == NULL) /* pktpool free list is empty */
431 PKTSETPOOL(osh, p, TRUE, pktp); /* Tag packet with pool ID */
433 PKTSETFREELIST(p, pktp->freelist); /* insert p at head of free list */
434 pktp->freelist = p;
436 pktp->avail++;
439 pktp->dbg_q[pktp->dbg_qlen++].p = p;
444 pktp->len = pktp->avail;
446 *pplen = pktp->len;
459 BCMATTACHFN(pktpool_deinit)(osl_t *osh, pktpool_t *pktp)
464 ASSERT(pktp != NULL);
469 for (i = 0; i <= pktp->len; i++) {
470 pktp->dbg_q[i].p = NULL;
475 while (pktp->freelist != NULL) {
476 void * p = pktp->freelist;
478 pktp->freelist = PKTFREELIST(p); /* unlink head packet from free list */
483 PKTFREE(osh, p, pktp->istx); /* free the packet */
486 ASSERT(freed <= pktp->len);
489 pktp->avail -= freed;
490 ASSERT(pktp->avail == 0);
492 pktp->len -= freed;
494 pktpool_deregister(pktp); /* release previously acquired unique pool id */
495 POOLSETID(pktp, PKTPOOL_INVALID_ID);
497 pktp->inited = FALSE;
500 ASSERT(pktp->len == 0);
506 pktpool_fill(osl_t *osh, pktpool_t *pktp, bool minimal)
512 ASSERT(pktp->plen != 0);
514 maxlen = pktp->maxlen;
516 for (len = (int)pktp->len; len < psize; len++) {
518 p = PKTGET(osh, pktp->len, TRUE);
525 if (pktpool_add(pktp, p) != BCME_OK) {
536 pktpool_deq(pktpool_t *pktp)
540 if (pktp->avail == 0)
543 ASSERT(pktp->freelist != NULL);
545 p = pktp->freelist; /* dequeue packet from head of pktpool free list */
546 pktp->freelist = PKTFREELIST(p); /* free list points to next packet */
549 pktp->avail--;
555 pktpool_enq(pktpool_t *pktp, void *p)
559 PKTSETFREELIST(p, pktp->freelist); /* insert at head of pktpool free list */
560 pktp->freelist = p; /* free list points to newly inserted packet */
562 pktp->avail++;
563 ASSERT(pktp->avail <= pktp->len);
567 BCMATTACHFN(pktpool_hostaddr_fill_register)(pktpool_t *pktp, pktpool_cb_extn_t cb, void *arg)
572 ASSERT(pktp->cbext.cb == NULL);
573 pktp->cbext.cb = cb;
574 pktp->cbext.arg = arg;
579 BCMATTACHFN(pktpool_rxcplid_fill_register)(pktpool_t *pktp, pktpool_cb_extn_t cb, void *arg)
584 ASSERT(pktp->rxcplidfn.cb == NULL);
585 pktp->rxcplidfn.cb = cb;
586 pktp->rxcplidfn.arg = arg;
591 BCMATTACHFN(pktpool_avail_register)(pktpool_t *pktp, pktpool_cb_t cb, void *arg)
597 i = pktp->cbcnt;
601 ASSERT(pktp->cbs[i].cb == NULL);
602 pktp->cbs[i].cb = cb;
603 pktp->cbs[i].arg = arg;
604 pktp->cbcnt++;
610 BCMATTACHFN(pktpool_empty_register)(pktpool_t *pktp, pktpool_cb_t cb, void *arg)
616 i = pktp->ecbcnt;
620 ASSERT(pktp->ecbs[i].cb == NULL);
621 pktp->ecbs[i].cb = cb;
622 pktp->ecbs[i].arg = arg;
623 pktp->ecbcnt++;
629 pktpool_empty_notify(pktpool_t *pktp)
633 pktp->empty = TRUE;
634 for (i = 0; i < pktp->ecbcnt; i++) {
635 ASSERT(pktp->ecbs[i].cb != NULL);
636 pktp->ecbs[i].cb(pktp, pktp->ecbs[i].arg);
638 pktp->empty = FALSE;
645 pktpool_dbg_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg)
651 i = pktp->dbg_cbcnt;
655 ASSERT(pktp->dbg_cbs[i].cb == NULL);
656 pktp->dbg_cbs[i].cb = cb;
657 pktp->dbg_cbs[i].arg = arg;
658 pktp->dbg_cbcnt++;
663 int pktpool_dbg_notify(pktpool_t *pktp);
666 pktpool_dbg_notify(pktpool_t *pktp)
670 for (i = 0; i < pktp->dbg_cbcnt; i++) {
671 ASSERT(pktp->dbg_cbs[i].cb);
672 pktp->dbg_cbs[i].cb(pktp, pktp->dbg_cbs[i].arg);
679 pktpool_dbg_dump(pktpool_t *pktp)
683 printf("pool len=%d maxlen=%d\n", pktp->dbg_qlen, pktp->maxlen);
684 for (i = 0; i < pktp->dbg_qlen; i++) {
685 ASSERT(pktp->dbg_q[i].p);
687 pktp->dbg_q[i].p, pktp->dbg_q[i].dur/100, PKTPOOLSTATE(pktp->dbg_q[i].p));
694 pktpool_stats_dump(pktpool_t *pktp, pktpool_stats_t *stats)
700 for (i = 0; i < pktp->dbg_qlen; i++) {
701 ASSERT(pktp->dbg_q[i].p != NULL);
703 state = PKTPOOLSTATE(pktp->dbg_q[i].p);
726 pktpool_start_trigger(pktpool_t *pktp, void *p)
735 for (i = 0; i < pktp->dbg_qlen; i++) {
736 ASSERT(pktp->dbg_q[i].p != NULL);
738 if (pktp->dbg_q[i].p == p) {
739 pktp->dbg_q[i].cycles = cycles;
747 int pktpool_stop_trigger(pktpool_t *pktp, void *p);
749 pktpool_stop_trigger(pktpool_t *pktp, void *p)
758 for (i = 0; i < pktp->dbg_qlen; i++) {
759 ASSERT(pktp->dbg_q[i].p != NULL);
761 if (pktp->dbg_q[i].p == p) {
762 if (pktp->dbg_q[i].cycles == 0)
765 if (cycles >= pktp->dbg_q[i].cycles)
766 pktp->dbg_q[i].dur = cycles - pktp->dbg_q[i].cycles;
768 pktp->dbg_q[i].dur =
769 (((uint32)-1) - pktp->dbg_q[i].cycles) + cycles + 1;
771 pktp->dbg_q[i].cycles = 0;
781 pktpool_avail_notify_normal(osl_t *osh, pktpool_t *pktp)
783 ASSERT(pktp);
784 pktp->availcb_excl = NULL;
789 pktpool_avail_notify_exclusive(osl_t *osh, pktpool_t *pktp, pktpool_cb_t cb)
793 ASSERT(pktp);
794 ASSERT(pktp->availcb_excl == NULL);
795 for (i = 0; i < pktp->cbcnt; i++) {
796 if (cb == pktp->cbs[i].cb) {
797 pktp->availcb_excl = &pktp->cbs[i];
802 if (pktp->availcb_excl == NULL)
809 pktpool_avail_notify(pktpool_t *pktp)
814 ASSERT(pktp);
815 if (pktp->availcb_excl != NULL) {
816 pktp->availcb_excl->cb(pktp, pktp->availcb_excl->arg);
820 k = pktp->cbcnt - 1;
821 for (i = 0; i < pktp->cbcnt; i++) {
822 avail = pktp->avail;
825 if (pktp->cbtoggle)
830 ASSERT(pktp->cbs[idx].cb != NULL);
831 pktp->cbs[idx].cb(pktp, pktp->cbs[idx].arg);
837 pktp->cbtoggle ^= 1;
843 pktpool_get(pktpool_t *pktp)
847 p = pktpool_deq(pktp);
851 if (pktp->ecbcnt)
852 pktpool_empty_notify(pktp);
854 p = pktpool_deq(pktp);
863 pktpool_free(pktpool_t *pktp, void *p)
867 /* pktpool_stop_trigger(pktp, p); */
870 pktpool_enq(pktp, p);
872 if (pktp->emptycb_disable)
875 if (pktp->cbcnt) {
876 if (pktp->empty == FALSE)
877 pktpool_avail_notify(pktp);
882 pktpool_add(pktpool_t *pktp, void *p)
886 if (pktp->len == pktp->maxlen)
890 ASSERT(pktp->plen == PKTLEN(OSH_NULL, p));
891 PKTSETPOOL(OSH_NULL, p, TRUE, pktp);
893 pktp->len++;
894 pktpool_enq(pktp, p);
897 pktp->dbg_q[pktp->dbg_qlen++].p = p;
904 BCMRAMFN(pktpool_setmaxlen)(pktpool_t *pktp, uint16 maxlen)
913 pktp->maxlen = (pktp->len > maxlen) ? pktp->len : maxlen;
915 return pktp->maxlen;
919 pktpool_emptycb_disable(pktpool_t *pktp, bool disable)
921 ASSERT(pktp);
923 pktp->emptycb_disable = disable;
927 pktpool_emptycb_disabled(pktpool_t *pktp)
929 ASSERT(pktp);
930 return pktp->emptycb_disable;