Lines Matching refs:pktp

111 static void hnd_pktpool_heap_pkt_release(osl_t *osh, pktpool_t *pktp, uint32 flag);
112 static void hnd_pktpool_heap_pkt_retrieve(pktpool_t *pktp, uint32 flag);
123 static void pktpool_avail_notify(pktpool_t *pktp);
259 pktpool_t *pktp, in BCMATTACHFN()
272 ASSERT(pktp != NULL); in BCMATTACHFN()
278 bzero(pktp, sizeof(pktpool_t)); in BCMATTACHFN()
281 if ((pktp_id = (uint8) pktpool_register(pktp)) == PKTPOOL_INVALID_ID) { in BCMATTACHFN()
284 POOLSETID(pktp, pktp_id); in BCMATTACHFN()
286 pktp->inited = TRUE; in BCMATTACHFN()
287 pktp->istx = istx ? TRUE : FALSE; in BCMATTACHFN()
288 pktp->max_pkt_bytes = (uint16)max_pkt_bytes; in BCMATTACHFN()
289 pktp->type = type; in BCMATTACHFN()
292 pktp->poolheap_flag = heap_pool_flag; in BCMATTACHFN()
293 pktp->poolheap_count = 0; in BCMATTACHFN()
294 pktp->min_backup_buf = min_backup_buf; in BCMATTACHFN()
296 if (rte_freelist_mgr_register(&pktp->mem_handle, in BCMATTACHFN()
299 pktp) != BCME_OK) { in BCMATTACHFN()
303 pktp->is_heap_pool = is_heap_pool; in BCMATTACHFN()
305 if (HND_PKTPOOL_MUTEX_CREATE("pktpool", &pktp->mutex) != OSL_EXT_SUCCESS) { in BCMATTACHFN()
309 pktp->maxlen = PKTPOOL_LEN_MAX; in BCMATTACHFN()
310 pktplen = LIMIT_TO_MAX(pktplen, pktp->maxlen); in BCMATTACHFN()
329 if (pktp->freelist == NULL) /* pktpool free list is empty */ in BCMATTACHFN()
335 PKTSETPOOL(osh, p, TRUE, pktp); /* Tag packet with pool ID */ in BCMATTACHFN()
337 PKTSETFREELIST(p, pktp->freelist); /* insert p at head of free list */ in BCMATTACHFN()
338 pktp->freelist = p; in BCMATTACHFN()
340 pktp->avail++; in BCMATTACHFN()
346 pktp->dbg_q[pktp->dbg_qlen++].p = p; in BCMATTACHFN()
351 pktp->n_pkts = pktp->avail; in BCMATTACHFN()
353 *n_pkts = pktp->n_pkts; /* number of packets managed by pool */ in BCMATTACHFN()
366 BCMATTACHFN(pktpool_deinit)(osl_t *osh, pktpool_t *pktp) in BCMATTACHFN()
371 ASSERT(pktp != NULL); in BCMATTACHFN()
376 for (i = 0; i <= pktp->n_pkts; i++) { in BCMATTACHFN()
377 pktp->dbg_q[i].p = NULL; in BCMATTACHFN()
382 while (pktp->freelist != NULL) { in BCMATTACHFN()
383 void * p = pktp->freelist; in BCMATTACHFN()
385 pktp->freelist = PKTFREELIST(p); /* unlink head packet from free list */ in BCMATTACHFN()
391 PKTFREE(osh, p, pktp->istx); /* free the packet */ in BCMATTACHFN()
394 ASSERT(freed <= pktp->n_pkts); in BCMATTACHFN()
397 pktp->avail -= freed; in BCMATTACHFN()
398 ASSERT(pktp->avail == 0); in BCMATTACHFN()
400 pktp->n_pkts -= freed; in BCMATTACHFN()
402 pktpool_deregister(pktp); /* release previously acquired unique pool id */ in BCMATTACHFN()
403 POOLSETID(pktp, PKTPOOL_INVALID_ID); in BCMATTACHFN()
405 if (HND_PKTPOOL_MUTEX_DELETE(&pktp->mutex) != OSL_EXT_SUCCESS) in BCMATTACHFN()
408 pktp->inited = FALSE; in BCMATTACHFN()
411 ASSERT(pktp->n_pkts == 0); in BCMATTACHFN()
417 pktpool_fill(osl_t *osh, pktpool_t *pktp, bool minimal) in pktpool_fill() argument
424 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in pktpool_fill()
428 ASSERT((pktp->max_pkt_bytes != 0) || (pktp->type == lbuf_rxfrag)); in pktpool_fill()
430 ASSERT(pktp->max_pkt_bytes != 0); in pktpool_fill()
433 maxlen = pktp->maxlen; in pktpool_fill()
435 n_pkts = (int)pktp->n_pkts; in pktpool_fill()
441 n_pkts += pktp->is_heap_pool ? in pktpool_fill()
442 pktp->poolheap_count : 0; in pktpool_fill()
451 p = PKTALLOC(osh, pktp->max_pkt_bytes, pktp->type); in pktpool_fill()
453 p = PKTGET(osh, pktp->n_pkts, TRUE); in pktpool_fill()
461 if (pktpool_add(pktp, p) != BCME_OK) { in pktpool_fill()
471 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in pktpool_fill()
474 if (pktp->cbcnt) { in pktpool_fill()
475 if (pktp->empty == FALSE) in pktpool_fill()
476 pktpool_avail_notify(pktp); in pktpool_fill()
486 pktpool_reclaim(osl_t *osh, pktpool_t *pktp, uint16 free_cnt, uint8 action) in pktpool_reclaim() argument
497 ASSERT(pktp != NULL); in pktpool_reclaim()
500 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) { in pktpool_reclaim()
504 if (pktp->avail < free_cnt) { in pktpool_reclaim()
505 free_cnt = pktp->avail; in pktpool_reclaim()
508 if (BCMSPLITRX_ENAB() && (pktp->type == lbuf_rxfrag)) { in pktpool_reclaim()
512 ASSERT(pktp->cbext.cb != NULL); in pktpool_reclaim()
514 cb = pktp->cbext.cb; in pktpool_reclaim()
515 arg = pktp->cbext.arg; in pktpool_reclaim()
517 } else if ((pktp->type == lbuf_basic) && (pktp->rxcplidfn.cb != NULL)) { in pktpool_reclaim()
521 cb = pktp->rxcplidfn.cb; in pktpool_reclaim()
522 arg = pktp->rxcplidfn.arg; in pktpool_reclaim()
525 while ((pktp->freelist != NULL) && (free_cnt)) { in pktpool_reclaim()
526 void * p = pktp->freelist; in pktpool_reclaim()
528 pktp->freelist = PKTFREELIST(p); /* unlink head packet from free list */ in pktpool_reclaim()
550 if (cb(pktp, arg, p, REMOVE_RXCPLID, NULL)) { in pktpool_reclaim()
551 PKTSETFREELIST(p, pktp->freelist); in pktpool_reclaim()
552 pktp->freelist = p; in pktpool_reclaim()
559 pktp->avail--; in pktpool_reclaim()
560 pktp->n_pkts--; in pktpool_reclaim()
563 PKTFREE(osh, p, pktp->istx); /* free the packet */ in pktpool_reclaim()
570 PKTSETFREELIST(rem_list_tail, pktp->freelist); in pktpool_reclaim()
571 pktp->freelist = rem_list_head; in pktpool_reclaim()
575 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) { in pktpool_reclaim()
588 pktpool_empty(osl_t *osh, pktpool_t *pktp) in pktpool_empty() argument
593 ASSERT(pktp != NULL); in pktpool_empty()
596 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in pktpool_empty()
602 for (i = 0; i <= pktp->n_pkts; i++) { in pktpool_empty()
603 pktp->dbg_q[i].p = NULL; in pktpool_empty()
608 while (pktp->freelist != NULL) { in pktpool_empty()
609 void * p = pktp->freelist; in pktpool_empty()
611 pktp->freelist = PKTFREELIST(p); /* unlink head packet from free list */ in pktpool_empty()
617 PKTFREE(osh, p, pktp->istx); /* free the packet */ in pktpool_empty()
620 ASSERT(freed <= pktp->n_pkts); in pktpool_empty()
623 pktp->avail -= freed; in pktpool_empty()
624 ASSERT(pktp->avail == 0); in pktpool_empty()
626 pktp->n_pkts -= freed; in pktpool_empty()
628 ASSERT(pktp->n_pkts == 0); in pktpool_empty()
631 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in pktpool_empty()
650 BCMPOSTTRAPFASTPATH(pktpool_deq)(pktpool_t *pktp) in BCMPOSTTRAPFASTPATH()
654 if (pktp->avail == 0) in BCMPOSTTRAPFASTPATH()
657 ASSERT_FP(pktp->freelist != NULL); in BCMPOSTTRAPFASTPATH()
659 p = pktp->freelist; /* dequeue packet from head of pktpool free list */ in BCMPOSTTRAPFASTPATH()
660 pktp->freelist = PKTFREELIST(p); /* free list points to next packet */ in BCMPOSTTRAPFASTPATH()
670 pktp->avail--; in BCMPOSTTRAPFASTPATH()
676 BCMPOSTTRAPFASTPATH(pktpool_enq)(pktpool_t *pktp, void *p) in BCMPOSTTRAPFASTPATH()
680 PKTSETFREELIST(p, pktp->freelist); /* insert at head of pktpool free list */ in BCMPOSTTRAPFASTPATH()
681 pktp->freelist = p; /* free list points to newly inserted packet */ in BCMPOSTTRAPFASTPATH()
689 pktp->avail++; in BCMPOSTTRAPFASTPATH()
690 ASSERT_FP(pktp->avail <= pktp->n_pkts); in BCMPOSTTRAPFASTPATH()
695 BCMATTACHFN(pktpool_hostaddr_fill_register)(pktpool_t *pktp, pktpool_cb_extn_t cb, void *arg) in BCMATTACHFN()
700 ASSERT(pktp->cbext.cb == NULL); in BCMATTACHFN()
701 pktp->cbext.cb = cb; in BCMATTACHFN()
702 pktp->cbext.arg = arg; in BCMATTACHFN()
707 BCMATTACHFN(pktpool_rxcplid_fill_register)(pktpool_t *pktp, pktpool_cb_extn_t cb, void *arg) in BCMATTACHFN()
712 if (pktp == NULL) in BCMATTACHFN()
714 ASSERT(pktp->rxcplidfn.cb == NULL); in BCMATTACHFN()
715 pktp->rxcplidfn.cb = cb; in BCMATTACHFN()
716 pktp->rxcplidfn.arg = arg; in BCMATTACHFN()
722 pktpool_invoke_dmarxfill(pktpool_t *pktp) in pktpool_invoke_dmarxfill() argument
724 ASSERT(pktp->dmarxfill.cb); in pktpool_invoke_dmarxfill()
725 ASSERT(pktp->dmarxfill.arg); in pktpool_invoke_dmarxfill()
727 if (pktp->dmarxfill.cb) in pktpool_invoke_dmarxfill()
728 pktp->dmarxfill.cb(pktp, pktp->dmarxfill.arg); in pktpool_invoke_dmarxfill()
733 BCMATTACHFN(pkpool_haddr_avail_register_cb)(pktpool_t *pktp, pktpool_cb_t cb, void *arg) in BCMATTACHFN()
738 pktp->dmarxfill.cb = cb; in BCMATTACHFN()
739 pktp->dmarxfill.arg = arg; in BCMATTACHFN()
749 pktpool_avail_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg) in pktpool_avail_register() argument
755 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in pktpool_avail_register()
760 for (i = 0; i < pktp->cbcnt; i++) { in pktpool_avail_register()
761 ASSERT(pktp->cbs[i].cb != NULL); in pktpool_avail_register()
762 if ((cb == pktp->cbs[i].cb) && (arg == pktp->cbs[i].arg)) { in pktpool_avail_register()
763 pktp->cbs[i].refcnt++; in pktpool_avail_register()
768 i = pktp->cbcnt; in pktpool_avail_register()
774 ASSERT(pktp->cbs[i].cb == NULL); in pktpool_avail_register()
775 pktp->cbs[i].cb = cb; in pktpool_avail_register()
776 pktp->cbs[i].arg = arg; in pktpool_avail_register()
777 pktp->cbs[i].refcnt++; in pktpool_avail_register()
778 pktp->cbcnt++; in pktpool_avail_register()
781 pktpool_emptycb_disable(pktp, FALSE); in pktpool_avail_register()
784 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in pktpool_avail_register()
792 pktpool_avail_deregister(pktpool_t *pktp, pktpool_cb_t cb, void *arg) in pktpool_avail_deregister() argument
798 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) { in pktpool_avail_deregister()
804 for (i = 0; i < pktp->cbcnt; i++) { in pktpool_avail_deregister()
805 ASSERT(pktp->cbs[i].cb != NULL); in pktpool_avail_deregister()
806 if ((cb == pktp->cbs[i].cb) && (arg == pktp->cbs[i].arg)) { in pktpool_avail_deregister()
807 pktp->cbs[i].refcnt--; in pktpool_avail_deregister()
808 if (pktp->cbs[i].refcnt) { in pktpool_avail_deregister()
813 for (k = i+1; k < pktp->cbcnt; i++, k++) { in pktpool_avail_deregister()
814 pktp->cbs[i].cb = pktp->cbs[k].cb; in pktpool_avail_deregister()
815 pktp->cbs[i].arg = pktp->cbs[k].arg; in pktpool_avail_deregister()
816 pktp->cbs[i].refcnt = pktp->cbs[k].refcnt; in pktpool_avail_deregister()
820 pktp->cbs[i].cb = NULL; in pktpool_avail_deregister()
821 pktp->cbs[i].arg = NULL; in pktpool_avail_deregister()
822 pktp->cbs[i].refcnt = 0; in pktpool_avail_deregister()
824 pktp->cbcnt--; in pktpool_avail_deregister()
831 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) { in pktpool_avail_deregister()
840 BCMATTACHFN(pktpool_empty_register)(pktpool_t *pktp, pktpool_cb_t cb, void *arg) in BCMATTACHFN()
846 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in BCMATTACHFN()
851 i = pktp->ecbcnt; in BCMATTACHFN()
857 ASSERT(pktp->ecbs[i].cb == NULL); in BCMATTACHFN()
858 pktp->ecbs[i].cb = cb; in BCMATTACHFN()
859 pktp->ecbs[i].arg = arg; in BCMATTACHFN()
860 pktp->ecbcnt++; in BCMATTACHFN()
864 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in BCMATTACHFN()
872 BCMPOSTTRAPFN(pktpool_empty_notify)(pktpool_t *pktp) in BCMPOSTTRAPFN()
876 pktp->empty = TRUE; in BCMPOSTTRAPFN()
877 for (i = 0; i < pktp->ecbcnt; i++) { in BCMPOSTTRAPFN()
878 ASSERT(pktp->ecbs[i].cb != NULL); in BCMPOSTTRAPFN()
879 pktp->ecbs[i].cb(pktp, pktp->ecbs[i].arg); in BCMPOSTTRAPFN()
881 pktp->empty = FALSE; in BCMPOSTTRAPFN()
888 pktpool_dbg_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg) in pktpool_dbg_register() argument
894 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in pktpool_dbg_register()
899 i = pktp->dbg_cbcnt; in pktpool_dbg_register()
905 ASSERT(pktp->dbg_cbs[i].cb == NULL); in pktpool_dbg_register()
906 pktp->dbg_cbs[i].cb = cb; in pktpool_dbg_register()
907 pktp->dbg_cbs[i].arg = arg; in pktpool_dbg_register()
908 pktp->dbg_cbcnt++; in pktpool_dbg_register()
912 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in pktpool_dbg_register()
918 int pktpool_dbg_notify(pktpool_t *pktp);
921 pktpool_dbg_notify(pktpool_t *pktp) in pktpool_dbg_notify() argument
926 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in pktpool_dbg_notify()
929 for (i = 0; i < pktp->dbg_cbcnt; i++) { in pktpool_dbg_notify()
930 ASSERT(pktp->dbg_cbs[i].cb); in pktpool_dbg_notify()
931 pktp->dbg_cbs[i].cb(pktp, pktp->dbg_cbs[i].arg); in pktpool_dbg_notify()
935 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in pktpool_dbg_notify()
942 pktpool_dbg_dump(pktpool_t *pktp) in pktpool_dbg_dump() argument
947 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in pktpool_dbg_dump()
950 printf("pool len=%d maxlen=%d\n", pktp->dbg_qlen, pktp->maxlen); in pktpool_dbg_dump()
951 for (i = 0; i < pktp->dbg_qlen; i++) { in pktpool_dbg_dump()
952 ASSERT(pktp->dbg_q[i].p); in pktpool_dbg_dump()
954 pktp->dbg_q[i].p, pktp->dbg_q[i].dur/100, PKTPOOLSTATE(pktp->dbg_q[i].p)); in pktpool_dbg_dump()
958 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in pktpool_dbg_dump()
965 pktpool_stats_dump(pktpool_t *pktp, pktpool_stats_t *stats) in pktpool_stats_dump() argument
971 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in pktpool_stats_dump()
975 for (i = 0; i < pktp->dbg_qlen; i++) { in pktpool_stats_dump()
976 ASSERT(pktp->dbg_q[i].p != NULL); in pktpool_stats_dump()
978 state = PKTPOOLSTATE(pktp->dbg_q[i].p); in pktpool_stats_dump()
998 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in pktpool_stats_dump()
1005 pktpool_start_trigger(pktpool_t *pktp, void *p) in pktpool_start_trigger() argument
1010 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in pktpool_start_trigger()
1018 for (i = 0; i < pktp->dbg_qlen; i++) { in pktpool_start_trigger()
1019 ASSERT(pktp->dbg_q[i].p != NULL); in pktpool_start_trigger()
1021 if (pktp->dbg_q[i].p == p) { in pktpool_start_trigger()
1022 pktp->dbg_q[i].cycles = cycles; in pktpool_start_trigger()
1029 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in pktpool_start_trigger()
1035 int pktpool_stop_trigger(pktpool_t *pktp, void *p);
1038 pktpool_stop_trigger(pktpool_t *pktp, void *p) in pktpool_stop_trigger() argument
1043 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in pktpool_stop_trigger()
1051 for (i = 0; i < pktp->dbg_qlen; i++) { in pktpool_stop_trigger()
1052 ASSERT(pktp->dbg_q[i].p != NULL); in pktpool_stop_trigger()
1054 if (pktp->dbg_q[i].p == p) { in pktpool_stop_trigger()
1055 if (pktp->dbg_q[i].cycles == 0) in pktpool_stop_trigger()
1058 if (cycles >= pktp->dbg_q[i].cycles) in pktpool_stop_trigger()
1059 pktp->dbg_q[i].dur = cycles - pktp->dbg_q[i].cycles; in pktpool_stop_trigger()
1061 pktp->dbg_q[i].dur = in pktpool_stop_trigger()
1062 (((uint32)-1) - pktp->dbg_q[i].cycles) + cycles + 1; in pktpool_stop_trigger()
1064 pktp->dbg_q[i].cycles = 0; in pktpool_stop_trigger()
1071 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in pktpool_stop_trigger()
1079 pktpool_avail_notify_normal(osl_t *osh, pktpool_t *pktp) in pktpool_avail_notify_normal() argument
1082 ASSERT(pktp); in pktpool_avail_notify_normal()
1085 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in pktpool_avail_notify_normal()
1088 pktp->availcb_excl = NULL; in pktpool_avail_notify_normal()
1091 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in pktpool_avail_notify_normal()
1098 pktpool_avail_notify_exclusive(osl_t *osh, pktpool_t *pktp, pktpool_cb_t cb) in pktpool_avail_notify_exclusive() argument
1104 ASSERT(pktp); in pktpool_avail_notify_exclusive()
1107 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in pktpool_avail_notify_exclusive()
1110 ASSERT(pktp->availcb_excl == NULL); in pktpool_avail_notify_exclusive()
1111 for (i = 0; i < pktp->cbcnt; i++) { in pktpool_avail_notify_exclusive()
1112 if (cb == pktp->cbs[i].cb) { in pktpool_avail_notify_exclusive()
1113 pktp->availcb_excl = &pktp->cbs[i]; in pktpool_avail_notify_exclusive()
1118 if (pktp->availcb_excl == NULL) in pktpool_avail_notify_exclusive()
1124 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in pktpool_avail_notify_exclusive()
1131 BCMPOSTTRAPFN(pktpool_avail_notify)(pktpool_t *pktp) in BCMPOSTTRAPFN()
1135 ASSERT(pktp); in BCMPOSTTRAPFN()
1136 pktpool_emptycb_disable(pktp, TRUE); in BCMPOSTTRAPFN()
1138 if (pktp->availcb_excl != NULL) { in BCMPOSTTRAPFN()
1139 pktp->availcb_excl->cb(pktp, pktp->availcb_excl->arg); in BCMPOSTTRAPFN()
1143 k = pktp->cbcnt - 1; in BCMPOSTTRAPFN()
1144 for (i = 0; i < pktp->cbcnt; i++) { in BCMPOSTTRAPFN()
1154 if (pktp->cbtoggle) in BCMPOSTTRAPFN()
1159 ASSERT(pktp->cbs[idx].cb != NULL); in BCMPOSTTRAPFN()
1160 pktp->cbs[idx].cb(pktp, pktp->cbs[idx].arg); in BCMPOSTTRAPFN()
1165 pktp->cbtoggle ^= 1; in BCMPOSTTRAPFN()
1173 BCMFASTPATH(pktpool_update_freelist)(pktpool_t *pktp, void *p, uint pkts_consumed) in BCMFASTPATH()
1175 ASSERT_FP(pktp->avail >= pkts_consumed); in BCMFASTPATH()
1177 pktp->freelist = p; in BCMFASTPATH()
1178 pktp->avail -= pkts_consumed; in BCMFASTPATH()
1184 BCMPOSTTRAPFASTPATH(pktpool_get_ext)(pktpool_t *pktp, uint8 type, uint *pktcnt) in BCMPOSTTRAPFASTPATH()
1190 bool rxcpl = (pktp->rxcplidfn.cb != NULL) ? TRUE : FALSE; in BCMPOSTTRAPFASTPATH()
1205 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in BCMPOSTTRAPFASTPATH()
1211 if (pktp->avail < pkts_requested) { in BCMPOSTTRAPFASTPATH()
1213 if (pktp->ecbcnt) { in BCMPOSTTRAPFASTPATH()
1214 pktpool_empty_notify(pktp); in BCMPOSTTRAPFASTPATH()
1217 if (pktp->avail < pkts_requested) { in BCMPOSTTRAPFASTPATH()
1218 pktpool_emptycb_disable(pktp, FALSE); in BCMPOSTTRAPFASTPATH()
1219 if (pktp->avail == 0) { in BCMPOSTTRAPFASTPATH()
1227 p = pktp->freelist; in BCMPOSTTRAPFASTPATH()
1228 if (pktp->avail < pkts_requested) { in BCMPOSTTRAPFASTPATH()
1229 pkts_avail = pktp->avail; in BCMPOSTTRAPFASTPATH()
1244 p = pktpool_deq(pktp); in BCMPOSTTRAPFASTPATH()
1258 ASSERT_FP(pktp->cbext.cb != NULL); in BCMPOSTTRAPFASTPATH()
1259 if (pktp->cbext.cb(pktp, pktp->cbext.arg, p, rxcpl, &pkts_avail)) { in BCMPOSTTRAPFASTPATH()
1260 pktpool_enq(pktp, p); in BCMPOSTTRAPFASTPATH()
1268 ASSERT_FP(pktp->rxcplidfn.cb != NULL); in BCMPOSTTRAPFASTPATH()
1270 if (pktp->rxcplidfn.cb(pktp, pktp->rxcplidfn.arg, p, TRUE, NULL)) { in BCMPOSTTRAPFASTPATH()
1271 pktpool_enq(pktp, p); in BCMPOSTTRAPFASTPATH()
1278 if ((pktp->avail == 0) && (pktp->emptycb_disable == EMPTYCB_SKIPPED)) { in BCMPOSTTRAPFASTPATH()
1279 pktp->emptycb_disable = EMPTYCB_DISABLED; in BCMPOSTTRAPFASTPATH()
1282 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in BCMPOSTTRAPFASTPATH()
1289 BCMFASTPATH(pktpool_nfree)(pktpool_t *pktp, void *head, void *tail, uint count) in BCMFASTPATH()
1296 pktp->avail += (count - 1); in BCMFASTPATH()
1306 PKTSETFREELIST(tail, pktp->freelist); in BCMFASTPATH()
1307 pktp->freelist = PKTLINK(head); in BCMFASTPATH()
1310 pktpool_free(pktp, head); in BCMFASTPATH()
1314 BCMPOSTTRAPFASTPATH(pktpool_free)(pktpool_t *pktp, void *p) in BCMPOSTTRAPFASTPATH()
1317 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in BCMPOSTTRAPFASTPATH()
1337 pktpool_enq(pktp, p); in BCMPOSTTRAPFASTPATH()
1344 if (pktp->cbcnt) { in BCMPOSTTRAPFASTPATH()
1348 if (pktp->emptycb_disable == EMPTYCB_ENABLED) { in BCMPOSTTRAPFASTPATH()
1354 if (pktp->empty == FALSE) in BCMPOSTTRAPFASTPATH()
1355 pktpool_avail_notify(pktp); in BCMPOSTTRAPFASTPATH()
1360 pktp->emptycb_disable = EMPTYCB_SKIPPED; in BCMPOSTTRAPFASTPATH()
1365 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in BCMPOSTTRAPFASTPATH()
1371 pktpool_add(pktpool_t *pktp, void *p) in pktpool_add() argument
1376 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in pktpool_add()
1381 if (pktp->n_pkts == pktp->maxlen) { in pktpool_add()
1387 ASSERT(pktp->max_pkt_bytes == PKTLEN(OSH_NULL, p)); in pktpool_add()
1388 PKTSETPOOL(OSH_NULL, p, TRUE, pktp); in pktpool_add()
1390 pktp->n_pkts++; in pktpool_add()
1391 pktpool_enq(pktp, p); in pktpool_add()
1394 pktp->dbg_q[pktp->dbg_qlen++].p = p; in pktpool_add()
1399 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in pktpool_add()
1410 BCMRAMFN(pktpool_setmaxlen)(pktpool_t *pktp, uint16 maxlen) in BCMRAMFN()
1413 if (HND_PKTPOOL_MUTEX_ACQUIRE(&pktp->mutex, OSL_EXT_TIME_FOREVER) != OSL_EXT_SUCCESS) in BCMRAMFN()
1423 pktp->maxlen = (pktp->n_pkts > maxlen) ? pktp->n_pkts : maxlen; in BCMRAMFN()
1426 if (HND_PKTPOOL_MUTEX_RELEASE(&pktp->mutex) != OSL_EXT_SUCCESS) in BCMRAMFN()
1429 return pktp->maxlen; in BCMRAMFN()
1433 BCMPOSTTRAPFN(pktpool_emptycb_disable)(pktpool_t *pktp, bool disable) in BCMPOSTTRAPFN()
1436 ASSERT(pktp); in BCMPOSTTRAPFN()
1445 if ((!disable) && (pktp->cbcnt) && (pktp->empty == FALSE) && in BCMPOSTTRAPFN()
1446 (pktp->emptycb_disable == EMPTYCB_SKIPPED)) { in BCMPOSTTRAPFN()
1452 if (pktp->emptycb_disable == EMPTYCB_ENABLED) { in BCMPOSTTRAPFN()
1458 pktp->emptycb_disable = EMPTYCB_DISABLED; in BCMPOSTTRAPFN()
1461 pktp->emptycb_disable = EMPTYCB_ENABLED; in BCMPOSTTRAPFN()
1470 pktpool_avail_notify(pktp); in BCMPOSTTRAPFN()
1475 pktpool_emptycb_disabled(pktpool_t *pktp) in pktpool_emptycb_disabled() argument
1477 ASSERT(pktp); in pktpool_emptycb_disabled()
1478 return pktp->emptycb_disable != EMPTYCB_ENABLED; in pktpool_emptycb_disabled()
1549 pktpool_resv_lfrag = resv_pool_info->pktp; in BCMATTACHFN()
1887 #define hnd_pktpool_release_active_set(pktp) (pktpool_heap_rel_active |= (1 << pktp->id)) argument
1888 #define hnd_pktpool_release_active_reset(pktp) (pktpool_heap_rel_active &= ~(1 << pktp->id)) argument
1895 pktpool_t *pktp; in hnd_pktpool_heap_handle() local
1902 if ((pktp = get_pktpools_registry(i)) != NULL) { in hnd_pktpool_heap_handle()
1903 if ((flag == pktp->poolheap_flag) && pktp->is_heap_pool) { in hnd_pktpool_heap_handle()
1905 hnd_pktpool_heap_pkt_release(pktpool_osh, pktp, flag); in hnd_pktpool_heap_handle()
1907 hnd_pktpool_heap_pkt_retrieve(pktp, flag); in hnd_pktpool_heap_handle()
1919 pktpool_t *pktp; in hnd_pktpool_freelist_alloc() local
1922 if ((pktp = get_pktpools_registry(i)) != NULL) { in hnd_pktpool_freelist_alloc()
1923 if ((flag == pktp->poolheap_flag) && pktp->is_heap_pool) { in hnd_pktpool_freelist_alloc()
1924 p = rte_freelist_mgr_alloc(size, alignbits, pktp->mem_handle); in hnd_pktpool_freelist_alloc()
1935 hnd_pktpool_heap_pkt_release(osl_t *osh, pktpool_t *pktp, uint32 flag) in hnd_pktpool_heap_pkt_release() argument
1942 pktp->release_active = FALSE; in hnd_pktpool_heap_pkt_release()
1943 hnd_pktpool_release_active_reset(pktp); in hnd_pktpool_heap_pkt_release()
1945 if (pktp->n_pkts <= pktp->min_backup_buf) in hnd_pktpool_heap_pkt_release()
1948 if (BCMSPLITRX_ENAB() && (pktp->type == lbuf_rxfrag)) { in hnd_pktpool_heap_pkt_release()
1952 ASSERT(pktp->cbext.cb != NULL); in hnd_pktpool_heap_pkt_release()
1953 cb = pktp->cbext.cb; in hnd_pktpool_heap_pkt_release()
1954 arg = pktp->cbext.arg; in hnd_pktpool_heap_pkt_release()
1955 } else if ((pktp->type == lbuf_basic) && (pktp->rxcplidfn.cb != NULL)) { in hnd_pktpool_heap_pkt_release()
1959 cb = pktp->rxcplidfn.cb; in hnd_pktpool_heap_pkt_release()
1960 arg = pktp->rxcplidfn.arg; in hnd_pktpool_heap_pkt_release()
1963 while (pktp->avail > pktp->min_backup_buf) { in hnd_pktpool_heap_pkt_release()
1964 void * p = pktp->freelist; in hnd_pktpool_heap_pkt_release()
1966 pktp->freelist = PKTFREELIST(p); /* unlink head packet from free list */ in hnd_pktpool_heap_pkt_release()
1970 if (cb(pktp, arg, p, REMOVE_RXCPLID, NULL)) { in hnd_pktpool_heap_pkt_release()
1971 PKTSETFREELIST(p, pktp->freelist); in hnd_pktpool_heap_pkt_release()
1972 pktp->freelist = p; in hnd_pktpool_heap_pkt_release()
1981 PKTFREE(osh, p, pktp->istx); /* free the packet */ in hnd_pktpool_heap_pkt_release()
1983 rte_freelist_mgr_add(p, pktp->mem_handle); in hnd_pktpool_heap_pkt_release()
1984 pktp->avail--; in hnd_pktpool_heap_pkt_release()
1985 pktp->n_pkts--; in hnd_pktpool_heap_pkt_release()
1986 pktp->poolheap_count++; in hnd_pktpool_heap_pkt_release()
2008 pktpool_t *pktp; in BCMFASTPATH() local
2012 if ((pktp = get_pktpools_registry(i)) != NULL) { in BCMFASTPATH()
2013 if (pktp->is_heap_pool && (pktp->release_active)) { in BCMFASTPATH()
2014 rte_freelist_mgr_release(pktp->mem_handle); in BCMFASTPATH()
2023 hnd_pktpool_heap_pkt_retrieve(pktpool_t *pktp, uint32 flag) in hnd_pktpool_heap_pkt_retrieve() argument
2027 pktp->release_active = TRUE; in hnd_pktpool_heap_pkt_retrieve()
2028 hnd_pktpool_release_active_set(pktp); in hnd_pktpool_heap_pkt_retrieve()
2037 rte_freelist_mgr_release(pktp->mem_handle); in hnd_pktpool_heap_pkt_retrieve()
2044 pktpool_t *pktp = (pktpool_t *)ctxt; in hnd_pktpool_heap_get_cb() local
2047 if (pktp != NULL) { in hnd_pktpool_heap_get_cb()
2048 if ((lb = PKTALLOC_ON_LOC(pktpool_osh, pktp->max_pkt_bytes, in hnd_pktpool_heap_get_cb()
2049 pktp->type, pkt, pktsize)) != NULL) { in hnd_pktpool_heap_get_cb()
2050 if ((ret = pktpool_add(pktp, lb)) == BCME_OK) { in hnd_pktpool_heap_get_cb()
2051 pktp->poolheap_count--; in hnd_pktpool_heap_get_cb()
2054 if (pktp->poolheap_count == 0) { in hnd_pktpool_heap_get_cb()
2055 pktp->release_active = FALSE; in hnd_pktpool_heap_get_cb()
2056 hnd_pktpool_release_active_reset(pktp); in hnd_pktpool_heap_get_cb()
2058 if (pktp->cbcnt) { in hnd_pktpool_heap_get_cb()
2059 if (pktp->empty == FALSE) in hnd_pktpool_heap_get_cb()
2060 pktpool_avail_notify(pktp); in hnd_pktpool_heap_get_cb()
2119 hnd_pktpool_get_min_bkup_buf(pktpool_t *pktp) in hnd_pktpool_get_min_bkup_buf() argument
2121 return pktp->min_backup_buf; in hnd_pktpool_get_min_bkup_buf()