Lines Matching refs:dhdp
57 static INLINE uint16 dhd_flowid_find(dhd_pub_t *dhdp, uint8 ifindex,
60 static INLINE uint16 dhd_flowid_alloc(dhd_pub_t *dhdp, uint8 ifindex,
63 static INLINE int dhd_flowid_lookup(dhd_pub_t *dhdp, uint8 ifindex,
88 dhd_flow_ring_node(dhd_pub_t *dhdp, uint16 flowid) in dhd_flow_ring_node() argument
92 ASSERT(dhdp != (dhd_pub_t*)NULL); in dhd_flow_ring_node()
93 ASSERT(flowid < dhdp->num_flow_rings); in dhd_flow_ring_node()
94 if (flowid >= dhdp->num_flow_rings) { in dhd_flow_ring_node()
98 flow_ring_node = &(((flow_ring_node_t*)(dhdp->flow_ring_table))[flowid]); in dhd_flow_ring_node()
106 dhd_flow_queue(dhd_pub_t *dhdp, uint16 flowid) in dhd_flow_queue() argument
110 flow_ring_node = dhd_flow_ring_node(dhdp, flowid); in dhd_flow_queue()
121 dhd_flow_queue_reinit(dhd_pub_t *dhdp, flow_queue_t *queue, int max) in dhd_flow_queue_reinit() argument
132 DHD_FLOW_QUEUE_SET_CLEN(queue, &dhdp->cumm_ctr); in dhd_flow_queue_reinit()
133 DHD_FLOW_QUEUE_SET_L2CLEN(queue, &dhdp->l2cumm_ctr); in dhd_flow_queue_reinit()
141 dhd_flow_queue_init(dhd_pub_t *dhdp, flow_queue_t *queue, int max) in dhd_flow_queue_init() argument
146 dhd_flow_queue_reinit(dhdp, queue, max); in dhd_flow_queue_init()
162 dhd_flow_queue_enqueue(dhd_pub_t *dhdp, flow_queue_t *queue, void *pkt) in dhd_flow_queue_enqueue() argument
196 dhd_flow_queue_dequeue(dhd_pub_t *dhdp, flow_queue_t *queue) in dhd_flow_queue_dequeue() argument
227 dhd_flow_queue_reinsert(dhd_pub_t *dhdp, flow_queue_t *queue, void *pkt) in dhd_flow_queue_reinsert() argument
244 dhd_flow_ring_config_thresholds(dhd_pub_t *dhdp, uint16 flowid, in dhd_flow_ring_config_thresholds() argument
250 ASSERT(dhdp != (dhd_pub_t*)NULL); in dhd_flow_ring_config_thresholds()
257 queue = dhd_flow_queue(dhdp, flowid); in dhd_flow_ring_config_thresholds()
272 dhd_num_prio_supported_per_flow_ring(dhd_pub_t *dhdp) in dhd_num_prio_supported_per_flow_ring() argument
282 if (dhdp->flow_prio_map[i] == dhdp->flow_prio_map[j]) { in dhd_num_prio_supported_per_flow_ring()
305 dhd_get_max_multi_client_flow_rings(dhd_pub_t *dhdp) in dhd_get_max_multi_client_flow_rings() argument
307 uint8 reserved_infra_sta_flow_rings = dhd_num_prio_supported_per_flow_ring(dhdp); in dhd_get_max_multi_client_flow_rings()
308 uint8 total_tx_flow_rings = dhdp->num_flow_rings - dhdp->bus->max_cmn_rings; in dhd_get_max_multi_client_flow_rings()
315 dhd_flow_rings_init(dhd_pub_t *dhdp, uint32 num_flow_rings) in dhd_flow_rings_init() argument
330 flowid_allocator = id16_map_init(dhdp->osh, in dhd_flow_rings_init()
331 num_flow_rings - dhdp->bus->max_cmn_rings, FLOWID_RESERVED); in dhd_flow_rings_init()
339 flow_ring_table = (flow_ring_table_t *)MALLOCZ(dhdp->osh, flow_ring_table_sz); in dhd_flow_rings_init()
346 DHD_CUMM_CTR_INIT(&dhdp->cumm_ctr); in dhd_flow_rings_init()
347 DHD_CUMM_CTR_INIT(&dhdp->l2cumm_ctr); in dhd_flow_rings_init()
352 flow_ring_table[idx].lock = dhd_os_spin_lock_init(dhdp->osh); in dhd_flow_rings_init()
364 dhd_flow_queue_init(dhdp, &flow_ring_table[idx].queue, in dhd_flow_rings_init()
370 if_flow_lkup = (if_flow_lkup_t *)DHD_OS_PREALLOC(dhdp, in dhd_flow_rings_init()
386 lock = dhd_os_spin_lock_init(dhdp->osh); in dhd_flow_rings_init()
390 list_lock = dhd_os_spin_lock_init(dhdp->osh); in dhd_flow_rings_init()
394 dhdp->flow_prio_map_type = DHD_FLOW_PRIO_AC_MAP; in dhd_flow_rings_init()
395 bcopy(prio2ac, dhdp->flow_prio_map, sizeof(uint8) * NUMPRIO); in dhd_flow_rings_init()
397 dhdp->max_multi_client_flow_rings = dhd_get_max_multi_client_flow_rings(dhdp); in dhd_flow_rings_init()
398 dhdp->multi_client_flow_rings = 0U; in dhd_flow_rings_init()
401 dhdp->dequeue_prec_map = ALLPRIO; in dhd_flow_rings_init()
405 dhdp->num_flow_rings = num_flow_rings; in dhd_flow_rings_init()
406 dhdp->flowid_allocator = (void *)flowid_allocator; in dhd_flow_rings_init()
407 dhdp->flow_ring_table = (void *)flow_ring_table; in dhd_flow_rings_init()
408 dhdp->if_flow_lkup = (void *)if_flow_lkup; in dhd_flow_rings_init()
409 dhdp->flowid_lock = lock; in dhd_flow_rings_init()
410 dhdp->flow_rings_inited = TRUE; in dhd_flow_rings_init()
411 dhdp->flowring_list_lock = list_lock; in dhd_flow_rings_init()
419 dhd_os_spin_lock_deinit(dhdp->osh, lock); in dhd_flow_rings_init()
424 DHD_OS_PREFREE(dhdp, if_flow_lkup, if_flow_lkup_sz); in dhd_flow_rings_init()
429 dhd_os_spin_lock_deinit(dhdp->osh, flow_ring_table[idx].lock); in dhd_flow_rings_init()
431 MFREE(dhdp->osh, flow_ring_table, flow_ring_table_sz); in dhd_flow_rings_init()
433 id16_map_fini(dhdp->osh, flowid_allocator); in dhd_flow_rings_init()
439 void dhd_flow_rings_deinit(dhd_pub_t *dhdp) in dhd_flow_rings_deinit() argument
450 if (!(dhdp->flow_rings_inited)) { in dhd_flow_rings_deinit()
455 if (dhdp->flow_ring_table != NULL) { in dhd_flow_rings_deinit()
457 ASSERT(dhdp->num_flow_rings > 0); in dhd_flow_rings_deinit()
459 DHD_FLOWID_LOCK(dhdp->flowid_lock, flags); in dhd_flow_rings_deinit()
460 flow_ring_table = (flow_ring_table_t *)dhdp->flow_ring_table; in dhd_flow_rings_deinit()
461 dhdp->flow_ring_table = NULL; in dhd_flow_rings_deinit()
462 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_flow_rings_deinit()
463 for (idx = 0; idx < dhdp->num_flow_rings; idx++) { in dhd_flow_rings_deinit()
465 dhd_bus_clean_flow_ring(dhdp->bus, &flow_ring_table[idx]); in dhd_flow_rings_deinit()
471 dhd_os_spin_lock_deinit(dhdp->osh, flow_ring_table[idx].lock); in dhd_flow_rings_deinit()
478 flow_ring_table_sz = dhdp->num_flow_rings * sizeof(flow_ring_table_t); in dhd_flow_rings_deinit()
479 MFREE(dhdp->osh, flow_ring_table, flow_ring_table_sz); in dhd_flow_rings_deinit()
482 DHD_FLOWID_LOCK(dhdp->flowid_lock, flags); in dhd_flow_rings_deinit()
485 if (dhdp->if_flow_lkup != NULL) { in dhd_flow_rings_deinit()
487 bzero((uchar *)dhdp->if_flow_lkup, if_flow_lkup_sz); in dhd_flow_rings_deinit()
488 DHD_OS_PREFREE(dhdp, dhdp->if_flow_lkup, if_flow_lkup_sz); in dhd_flow_rings_deinit()
489 dhdp->if_flow_lkup = NULL; in dhd_flow_rings_deinit()
493 if (dhdp->flowid_allocator != NULL) in dhd_flow_rings_deinit()
494 dhdp->flowid_allocator = id16_map_fini(dhdp->osh, dhdp->flowid_allocator); in dhd_flow_rings_deinit()
496 dhdp->num_flow_rings = 0U; in dhd_flow_rings_deinit()
497 bzero(dhdp->flow_prio_map, sizeof(uint8) * NUMPRIO); in dhd_flow_rings_deinit()
499 dhdp->max_multi_client_flow_rings = 0U; in dhd_flow_rings_deinit()
500 dhdp->multi_client_flow_rings = 0U; in dhd_flow_rings_deinit()
502 lock = dhdp->flowid_lock; in dhd_flow_rings_deinit()
503 dhdp->flowid_lock = NULL; in dhd_flow_rings_deinit()
507 dhd_os_spin_lock_deinit(dhdp->osh, lock); in dhd_flow_rings_deinit()
510 dhd_os_spin_lock_deinit(dhdp->osh, dhdp->flowring_list_lock); in dhd_flow_rings_deinit()
511 dhdp->flowring_list_lock = NULL; in dhd_flow_rings_deinit()
513 ASSERT(dhdp->if_flow_lkup == NULL); in dhd_flow_rings_deinit()
514 ASSERT(dhdp->flowid_allocator == NULL); in dhd_flow_rings_deinit()
515 ASSERT(dhdp->flow_ring_table == NULL); in dhd_flow_rings_deinit()
516 dhdp->flow_rings_inited = FALSE; in dhd_flow_rings_deinit()
521 dhd_flow_rings_ifindex2role(dhd_pub_t *dhdp, uint8 ifindex) in dhd_flow_rings_ifindex2role() argument
523 if_flow_lkup_t *if_flow_lkup = (if_flow_lkup_t *)dhdp->if_flow_lkup; in dhd_flow_rings_ifindex2role()
529 bool is_tdls_destination(dhd_pub_t *dhdp, uint8 *da) in is_tdls_destination() argument
534 DHD_TDLS_LOCK(&dhdp->tdls_lock, flags); in is_tdls_destination()
535 cur = dhdp->peer_tbl.node; in is_tdls_destination()
539 DHD_TDLS_UNLOCK(&dhdp->tdls_lock, flags); in is_tdls_destination()
544 DHD_TDLS_UNLOCK(&dhdp->tdls_lock, flags); in is_tdls_destination()
551 dhd_flowid_find(dhd_pub_t *dhdp, uint8 ifindex, uint8 prio, char *sa, char *da) in dhd_flowid_find() argument
563 DHD_FLOWID_LOCK(dhdp->flowid_lock, flags); in dhd_flowid_find()
564 if_flow_lkup = (if_flow_lkup_t *)dhdp->if_flow_lkup; in dhd_flowid_find()
568 if (DHD_IF_ROLE_GENERIC_STA(dhdp, ifindex)) { in dhd_flowid_find()
570 if (dhdp->peer_tbl.tdls_peer_count && !(ETHER_ISMULTI(da)) && in dhd_flowid_find()
571 is_tdls_destination(dhdp, da)) { in dhd_flowid_find()
576 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_flowid_find()
581 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_flowid_find()
588 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_flowid_find()
606 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_flowid_find()
612 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_flowid_find()
620 dhd_flowid_alloc(dhd_pub_t *dhdp, uint8 ifindex, uint8 prio, char *sa, char *da) in dhd_flowid_alloc() argument
628 fl_hash_node = (flow_hash_info_t *) MALLOCZ(dhdp->osh, sizeof(flow_hash_info_t)); in dhd_flowid_alloc()
635 DHD_FLOWID_LOCK(dhdp->flowid_lock, flags); in dhd_flowid_alloc()
636 ASSERT(dhdp->flowid_allocator != NULL); in dhd_flowid_alloc()
637 flowid = id16_map_alloc(dhdp->flowid_allocator); in dhd_flowid_alloc()
638 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_flowid_alloc()
641 MFREE(dhdp->osh, fl_hash_node, sizeof(flow_hash_info_t)); in dhd_flowid_alloc()
651 DHD_FLOWID_LOCK(dhdp->flowid_lock, flags); in dhd_flowid_alloc()
652 if_flow_lkup = (if_flow_lkup_t *)dhdp->if_flow_lkup; in dhd_flowid_alloc()
654 if (DHD_IF_ROLE_GENERIC_STA(dhdp, ifindex)) { in dhd_flowid_alloc()
657 if (dhdp->peer_tbl.tdls_peer_count && in dhd_flowid_alloc()
658 (is_tdls_destination(dhdp, da))) { in dhd_flowid_alloc()
685 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_flowid_alloc()
689 if (fl_hash_node->flowid >= dhdp->num_flow_rings) { in dhd_flowid_alloc()
691 __FUNCTION__, fl_hash_node->flowid, dhdp->num_flow_rings, in dhd_flowid_alloc()
703 dhd_flowid_lookup(dhd_pub_t *dhdp, uint8 ifindex, in dhd_flowid_lookup() argument
714 if (!dhdp->flow_ring_table) { in dhd_flowid_lookup()
722 flow_ring_table = (flow_ring_table_t *)dhdp->flow_ring_table; in dhd_flowid_lookup()
724 id = dhd_flowid_find(dhdp, ifindex, prio, sa, da); in dhd_flowid_lookup()
729 if_flow_lkup = (if_flow_lkup_t *)dhdp->if_flow_lkup; in dhd_flowid_lookup()
735 if_role_multi_client = DHD_IF_ROLE_MULTI_CLIENT(dhdp, ifindex); in dhd_flowid_lookup()
740 (dhdp->multi_client_flow_rings >= dhdp->max_multi_client_flow_rings)) { in dhd_flowid_lookup()
742 __FUNCTION__, dhdp->multi_client_flow_rings, in dhd_flowid_lookup()
743 dhdp->max_multi_client_flow_rings)); in dhd_flowid_lookup()
751 !dhd_sta_associated(dhdp, ifindex, (uint8 *)da)) { in dhd_flowid_lookup()
757 id = dhd_flowid_alloc(dhdp, ifindex, prio, sa, da); in dhd_flowid_lookup()
764 ASSERT(id < dhdp->num_flow_rings); in dhd_flowid_lookup()
768 dhdp->multi_client_flow_rings++; in dhd_flowid_lookup()
772 dhd_add_flowid(dhdp, ifindex, prio, da, id); in dhd_flowid_lookup()
794 if (dhd_bus_flow_ring_create_request(dhdp->bus, (void *)flow_ring_node) in dhd_flowid_lookup()
809 if (id >= dhdp->num_flow_rings) { in dhd_flowid_lookup()
811 __FUNCTION__, id, dhdp->num_flow_rings)); in dhd_flowid_lookup()
857 dhd_flowid_find_by_ifidx(dhd_pub_t *dhdp, uint8 ifindex, uint16 flowid) in dhd_flowid_find_by_ifidx() argument
865 if (!dhdp->flow_ring_table) { in dhd_flowid_find_by_ifidx()
870 DHD_FLOWID_LOCK(dhdp->flowid_lock, flags); in dhd_flowid_find_by_ifidx()
871 if_flow_lkup = (if_flow_lkup_t *)dhdp->if_flow_lkup; in dhd_flowid_find_by_ifidx()
888 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_flowid_find_by_ifidx()
893 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_flowid_find_by_ifidx()
899 dhd_flowid_debug_create(dhd_pub_t *dhdp, uint8 ifindex, in dhd_flowid_debug_create() argument
902 return dhd_flowid_lookup(dhdp, ifindex, prio, sa, da, flowid); in dhd_flowid_debug_create()
910 dhd_flowid_update(dhd_pub_t *dhdp, uint8 ifindex, uint8 prio, void *pktbuf) in dhd_flowid_update() argument
912 uint8 *pktdata = (uint8 *)PKTDATA(dhdp->osh, pktbuf); in dhd_flowid_update()
922 if (!dhdp->flowid_allocator) { in dhd_flowid_update()
927 if (dhd_flowid_lookup(dhdp, ifindex, prio, (char *)eh->ether_shost, (char *)eh->ether_dhost, in dhd_flowid_update()
940 dhd_flowid_free(dhd_pub_t *dhdp, uint8 ifindex, uint16 flowid) in dhd_flowid_free() argument
953 DHD_FLOWID_LOCK(dhdp->flowid_lock, flags); in dhd_flowid_free()
954 if_flow_lkup = (if_flow_lkup_t *)dhdp->if_flow_lkup; in dhd_flowid_free()
956 if_role_multi_client = DHD_IF_ROLE_MULTI_CLIENT(dhdp, ifindex); in dhd_flowid_free()
985 dhdp->multi_client_flow_rings--; in dhd_flowid_free()
989 dhd_del_flowid(dhdp, ifindex, flowid); in dhd_flowid_free()
991 id16_map_free(dhdp->flowid_allocator, flowid); in dhd_flowid_free()
992 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_flowid_free()
993 MFREE(dhdp->osh, cur, sizeof(flow_hash_info_t)); in dhd_flowid_free()
1000 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_flowid_free()
1010 dhd_flow_rings_delete(dhd_pub_t *dhdp, uint8 ifindex) in dhd_flow_rings_delete() argument
1021 if (!dhdp->flow_ring_table) in dhd_flow_rings_delete()
1024 flow_ring_table = (flow_ring_table_t *)dhdp->flow_ring_table; in dhd_flow_rings_delete()
1025 for (id = 0; id < dhdp->num_flow_rings; id++) { in dhd_flow_rings_delete()
1029 dhd_bus_flow_ring_delete_request(dhdp->bus, in dhd_flow_rings_delete()
1036 dhd_flow_rings_flush(dhd_pub_t *dhdp, uint8 ifindex) in dhd_flow_rings_flush() argument
1047 if (!dhdp->flow_ring_table) in dhd_flow_rings_flush()
1049 flow_ring_table = (flow_ring_table_t *)dhdp->flow_ring_table; in dhd_flow_rings_flush()
1051 for (id = 0; id < dhdp->num_flow_rings; id++) { in dhd_flow_rings_flush()
1055 dhd_bus_flow_ring_flush_request(dhdp->bus, in dhd_flow_rings_flush()
1063 dhd_flow_rings_delete_for_peer(dhd_pub_t *dhdp, uint8 ifindex, char *addr) in dhd_flow_rings_delete_for_peer() argument
1074 if (!dhdp->flow_ring_table) in dhd_flow_rings_delete_for_peer()
1077 flow_ring_table = (flow_ring_table_t *)dhdp->flow_ring_table; in dhd_flow_rings_delete_for_peer()
1078 for (id = 0; id < dhdp->num_flow_rings; id++) { in dhd_flow_rings_delete_for_peer()
1095 dhd_bus_flow_ring_delete_request(dhdp->bus, in dhd_flow_rings_delete_for_peer()
1103 dhd_update_interface_flow_info(dhd_pub_t *dhdp, uint8 ifindex, in dhd_update_interface_flow_info() argument
1115 if (!dhdp->flowid_allocator) { in dhd_update_interface_flow_info()
1120 DHD_FLOWID_LOCK(dhdp->flowid_lock, flags); in dhd_update_interface_flow_info()
1121 if_flow_lkup = (if_flow_lkup_t *)dhdp->if_flow_lkup; in dhd_update_interface_flow_info()
1144 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_update_interface_flow_info()
1149 dhd_update_interface_link_status(dhd_pub_t *dhdp, uint8 ifindex, uint8 status) in dhd_update_interface_link_status() argument
1160 DHD_FLOWID_LOCK(dhdp->flowid_lock, flags); in dhd_update_interface_link_status()
1161 if_flow_lkup = (if_flow_lkup_t *)dhdp->if_flow_lkup; in dhd_update_interface_link_status()
1169 DHD_FLOWID_UNLOCK(dhdp->flowid_lock, flags); in dhd_update_interface_link_status()
1175 int dhd_update_flow_prio_map(dhd_pub_t *dhdp, uint8 map) in dhd_update_flow_prio_map() argument
1184 if (map == dhdp->flow_prio_map_type) in dhd_update_flow_prio_map()
1188 for (flowid = 0; flowid < dhdp->num_flow_rings; flowid++) { in dhd_update_flow_prio_map()
1189 flow_ring_node = DHD_FLOW_RING(dhdp, flowid); in dhd_update_flow_prio_map()
1195 if (BCME_OK != dhd_flow_prio_map(dhdp, &map, TRUE)) in dhd_update_flow_prio_map()
1199 dhdp->flow_prio_map_type = map; in dhd_update_flow_prio_map()
1200 if (dhdp->flow_prio_map_type == DHD_FLOW_PRIO_TID_MAP) in dhd_update_flow_prio_map()
1201 bcopy(prio2tid, dhdp->flow_prio_map, sizeof(uint8) * NUMPRIO); in dhd_update_flow_prio_map()
1203 bcopy(prio2ac, dhdp->flow_prio_map, sizeof(uint8) * NUMPRIO); in dhd_update_flow_prio_map()
1205 dhdp->max_multi_client_flow_rings = dhd_get_max_multi_client_flow_rings(dhdp); in dhd_update_flow_prio_map()