Lines Matching refs:fws

540 static int brcmf_fws_get_tlv_len(struct brcmf_fws_info *fws,  in brcmf_fws_get_tlv_len()  argument
546 fws->stats.tlv_invalid_type++; in brcmf_fws_get_tlv_len()
553 static void brcmf_fws_lock(struct brcmf_fws_info *fws) in brcmf_fws_lock() argument
554 __acquires(&fws->spinlock) in brcmf_fws_lock()
556 spin_lock_irqsave(&fws->spinlock, fws->flags); in brcmf_fws_lock()
559 static void brcmf_fws_unlock(struct brcmf_fws_info *fws) in brcmf_fws_unlock() argument
560 __releases(&fws->spinlock) in brcmf_fws_unlock()
562 spin_unlock_irqrestore(&fws->spinlock, fws->flags); in brcmf_fws_unlock()
571 static void brcmf_fws_psq_flush(struct brcmf_fws_info *fws, struct pktq *q, in brcmf_fws_psq_flush() argument
675 static void brcmf_fws_hanger_cleanup(struct brcmf_fws_info *fws, in brcmf_fws_hanger_cleanup() argument
679 struct brcmf_fws_hanger *h = &fws->hanger; in brcmf_fws_hanger_cleanup()
700 static void brcmf_fws_macdesc_set_name(struct brcmf_fws_info *fws, in brcmf_fws_macdesc_set_name() argument
703 if (desc == &fws->desc.other) in brcmf_fws_macdesc_set_name()
741 brcmf_fws_macdesc_lookup(struct brcmf_fws_info *fws, u8 *ea) in brcmf_fws_macdesc_lookup() argument
749 entry = &fws->desc.nodes[0]; in brcmf_fws_macdesc_lookup()
750 for (i = 0; i < ARRAY_SIZE(fws->desc.nodes); i++) { in brcmf_fws_macdesc_lookup()
760 brcmf_fws_macdesc_find(struct brcmf_fws_info *fws, struct brcmf_if *ifp, u8 *da) in brcmf_fws_macdesc_find() argument
762 struct brcmf_fws_mac_descriptor *entry = &fws->desc.other; in brcmf_fws_macdesc_find()
776 entry = brcmf_fws_macdesc_lookup(fws, da); in brcmf_fws_macdesc_find()
784 static bool brcmf_fws_macdesc_closed(struct brcmf_fws_info *fws, in brcmf_fws_macdesc_closed() argument
795 if_entry = &fws->desc.iface[entry->interface_id]; in brcmf_fws_macdesc_closed()
809 static void brcmf_fws_macdesc_cleanup(struct brcmf_fws_info *fws, in brcmf_fws_macdesc_cleanup() argument
814 brcmf_fws_psq_flush(fws, &entry->psq, ifidx); in brcmf_fws_macdesc_cleanup()
819 static void brcmf_fws_bus_txq_cleanup(struct brcmf_fws_info *fws, in brcmf_fws_bus_txq_cleanup() argument
829 txq = brcmf_bus_gettxq(fws->drvr->bus_if); in brcmf_fws_bus_txq_cleanup()
839 hi = &fws->hanger.items[hslot]; in brcmf_fws_bus_txq_cleanup()
848 static void brcmf_fws_cleanup(struct brcmf_fws_info *fws, int ifidx) in brcmf_fws_cleanup() argument
854 if (fws == NULL) in brcmf_fws_cleanup()
861 table = &fws->desc.nodes[0]; in brcmf_fws_cleanup()
862 for (i = 0; i < ARRAY_SIZE(fws->desc.nodes); i++) in brcmf_fws_cleanup()
863 brcmf_fws_macdesc_cleanup(fws, &table[i], ifidx); in brcmf_fws_cleanup()
865 brcmf_fws_macdesc_cleanup(fws, &fws->desc.other, ifidx); in brcmf_fws_cleanup()
866 brcmf_fws_bus_txq_cleanup(fws, matchfn, ifidx); in brcmf_fws_cleanup()
867 brcmf_fws_hanger_cleanup(fws, matchfn, ifidx); in brcmf_fws_cleanup()
870 static u8 brcmf_fws_hdrpush(struct brcmf_fws_info *fws, struct sk_buff *skb) in brcmf_fws_hdrpush() argument
885 if (BRCMF_FWS_MODE_GET_REUSESEQ(fws->mode)) in brcmf_fws_hdrpush()
898 if (BRCMF_FWS_MODE_GET_REUSESEQ(fws->mode)) { in brcmf_fws_hdrpush()
922 static bool brcmf_fws_tim_update(struct brcmf_fws_info *fws, in brcmf_fws_tim_update() argument
949 4 + fws->drvr->hdrlen; in brcmf_fws_tim_update()
959 data_offset = brcmf_fws_hdrpush(fws, skb); in brcmf_fws_tim_update()
961 brcmf_fws_unlock(fws); in brcmf_fws_tim_update()
962 err = brcmf_proto_txdata(fws->drvr, ifidx, data_offset, skb); in brcmf_fws_tim_update()
963 brcmf_fws_lock(fws); in brcmf_fws_tim_update()
972 brcmf_fws_flow_control_check(struct brcmf_fws_info *fws, struct pktq *pq, in brcmf_fws_flow_control_check() argument
975 struct brcmf_if *ifp = brcmf_get_ifp(fws->drvr, if_id); in brcmf_fws_flow_control_check()
986 fws->stats.fws_flow_block++; in brcmf_fws_flow_control_check()
992 static int brcmf_fws_rssi_indicate(struct brcmf_fws_info *fws, s8 rssi) in brcmf_fws_rssi_indicate() argument
999 int brcmf_fws_macdesc_indicate(struct brcmf_fws_info *fws, u8 type, u8 *data) in brcmf_fws_macdesc_indicate() argument
1010 entry = &fws->desc.nodes[mac_handle & 0x1F]; in brcmf_fws_macdesc_indicate()
1015 brcmf_fws_lock(fws); in brcmf_fws_macdesc_indicate()
1016 brcmf_fws_macdesc_cleanup(fws, entry, -1); in brcmf_fws_macdesc_indicate()
1018 brcmf_fws_unlock(fws); in brcmf_fws_macdesc_indicate()
1020 fws->stats.mac_update_failed++; in brcmf_fws_macdesc_indicate()
1024 existing = brcmf_fws_macdesc_lookup(fws, addr); in brcmf_fws_macdesc_indicate()
1027 brcmf_fws_lock(fws); in brcmf_fws_macdesc_indicate()
1030 brcmf_fws_macdesc_set_name(fws, entry); in brcmf_fws_macdesc_indicate()
1033 brcmf_fws_unlock(fws); in brcmf_fws_macdesc_indicate()
1036 fws->stats.mac_update_failed++; in brcmf_fws_macdesc_indicate()
1041 brcmf_fws_lock(fws); in brcmf_fws_macdesc_indicate()
1046 brcmf_fws_macdesc_set_name(fws, entry); in brcmf_fws_macdesc_indicate()
1047 brcmf_fws_unlock(fws); in brcmf_fws_macdesc_indicate()
1059 static int brcmf_fws_macdesc_state_indicate(struct brcmf_fws_info *fws, in brcmf_fws_macdesc_state_indicate() argument
1067 entry = &fws->desc.nodes[mac_handle & 0x1F]; in brcmf_fws_macdesc_state_indicate()
1069 fws->stats.mac_ps_update_failed++; in brcmf_fws_macdesc_state_indicate()
1072 brcmf_fws_lock(fws); in brcmf_fws_macdesc_state_indicate()
1081 brcmf_fws_tim_update(fws, entry, BRCMF_FWS_FIFO_AC_BK, false); in brcmf_fws_macdesc_state_indicate()
1082 brcmf_fws_tim_update(fws, entry, BRCMF_FWS_FIFO_AC_BE, false); in brcmf_fws_macdesc_state_indicate()
1083 brcmf_fws_tim_update(fws, entry, BRCMF_FWS_FIFO_AC_VI, false); in brcmf_fws_macdesc_state_indicate()
1084 brcmf_fws_tim_update(fws, entry, BRCMF_FWS_FIFO_AC_VO, true); in brcmf_fws_macdesc_state_indicate()
1087 brcmf_fws_unlock(fws); in brcmf_fws_macdesc_state_indicate()
1091 static int brcmf_fws_interface_state_indicate(struct brcmf_fws_info *fws, in brcmf_fws_interface_state_indicate() argument
1105 entry = &fws->desc.iface[ifidx]; in brcmf_fws_interface_state_indicate()
1113 brcmf_fws_lock(fws); in brcmf_fws_interface_state_indicate()
1125 brcmf_fws_unlock(fws); in brcmf_fws_interface_state_indicate()
1128 brcmf_fws_unlock(fws); in brcmf_fws_interface_state_indicate()
1132 fws->stats.if_update_failed++; in brcmf_fws_interface_state_indicate()
1136 static int brcmf_fws_request_indicate(struct brcmf_fws_info *fws, u8 type, in brcmf_fws_request_indicate() argument
1141 entry = &fws->desc.nodes[data[1] & 0x1F]; in brcmf_fws_request_indicate()
1144 fws->stats.credit_request_failed++; in brcmf_fws_request_indicate()
1146 fws->stats.packet_request_failed++; in brcmf_fws_request_indicate()
1153 brcmf_fws_lock(fws); in brcmf_fws_request_indicate()
1160 brcmf_fws_unlock(fws); in brcmf_fws_request_indicate()
1195 static void brcmf_fws_return_credits(struct brcmf_fws_info *fws, in brcmf_fws_return_credits() argument
1205 fws->fifo_credit_map |= 1 << fifo; in brcmf_fws_return_credits()
1208 (fws->credits_borrowed[0])) { in brcmf_fws_return_credits()
1211 borrowed = &fws->credits_borrowed[lender_ac]; in brcmf_fws_return_credits()
1213 fws->fifo_credit_map |= (1 << lender_ac); in brcmf_fws_return_credits()
1214 fifo_credit = &fws->fifo_credit[lender_ac]; in brcmf_fws_return_credits()
1228 fws->fifo_credit[fifo] += credits; in brcmf_fws_return_credits()
1231 static void brcmf_fws_schedule_deq(struct brcmf_fws_info *fws) in brcmf_fws_schedule_deq() argument
1234 if ((fws->fifo_credit_map & fws->fifo_delay_map) || in brcmf_fws_schedule_deq()
1235 (!brcmf_fws_fc_active(fws) && fws->fifo_delay_map)) in brcmf_fws_schedule_deq()
1236 queue_work(fws->fws_wq, &fws->fws_dequeue_work); in brcmf_fws_schedule_deq()
1239 static int brcmf_fws_enq(struct brcmf_fws_info *fws, in brcmf_fws_enq() argument
1244 u32 *qfull_stat = &fws->stats.delayq_full_error; in brcmf_fws_enq()
1262 qfull_stat = &fws->stats.supprq_full_error; in brcmf_fws_enq()
1317 fws->fifo_delay_map |= 1 << fifo; in brcmf_fws_enq()
1318 fws->fifo_enqpkt[fifo]++; in brcmf_fws_enq()
1327 brcmf_fws_tim_update(fws, entry, fifo, true); in brcmf_fws_enq()
1328 brcmf_fws_flow_control_check(fws, &entry->psq, in brcmf_fws_enq()
1333 static struct sk_buff *brcmf_fws_deq(struct brcmf_fws_info *fws, int fifo) in brcmf_fws_deq() argument
1344 table = (struct brcmf_fws_mac_descriptor *)&fws->desc; in brcmf_fws_deq()
1345 num_nodes = sizeof(fws->desc) / sizeof(struct brcmf_fws_mac_descriptor); in brcmf_fws_deq()
1346 node_pos = fws->deq_node_pos[fifo]; in brcmf_fws_deq()
1351 brcmf_fws_macdesc_closed(fws, entry, fifo)) in brcmf_fws_deq()
1374 fws->deq_node_pos[fifo] = (node_pos + i + 1) % num_nodes; in brcmf_fws_deq()
1375 brcmf_fws_flow_control_check(fws, &entry->psq, in brcmf_fws_deq()
1383 brcmf_fws_tim_update(fws, entry, fifo, false); in brcmf_fws_deq()
1389 fws->fifo_enqpkt[fifo]--; in brcmf_fws_deq()
1390 if (fws->fifo_enqpkt[fifo] == 0) in brcmf_fws_deq()
1391 fws->fifo_delay_map &= ~(1 << fifo); in brcmf_fws_deq()
1400 static int brcmf_fws_txstatus_suppressed(struct brcmf_fws_info *fws, int fifo, in brcmf_fws_txstatus_suppressed() argument
1428 ret = brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_SUPPRESSED, fifo, skb); in brcmf_fws_txstatus_suppressed()
1432 brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb, true); in brcmf_fws_txstatus_suppressed()
1435 brcmf_fws_hanger_mark_suppressed(&fws->hanger, hslot); in brcmf_fws_txstatus_suppressed()
1442 brcmf_fws_txs_process(struct brcmf_fws_info *fws, u8 flags, u32 hslot, in brcmf_fws_txs_process() argument
1456 fws->stats.txs_discard++; in brcmf_fws_txs_process()
1458 fws->stats.txs_supp_core++; in brcmf_fws_txs_process()
1461 fws->stats.txs_supp_ps++; in brcmf_fws_txs_process()
1464 fws->stats.txs_tossed++; in brcmf_fws_txs_process()
1466 fws->stats.txs_host_tossed++; in brcmf_fws_txs_process()
1470 ret = brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb, in brcmf_fws_txs_process()
1492 if ((fws->fcmode == BRCMF_FWS_FCMODE_IMPLIED_CREDIT) || in brcmf_fws_txs_process()
1495 brcmf_fws_return_credits(fws, fifo, 1); in brcmf_fws_txs_process()
1496 brcmf_fws_schedule_deq(fws); in brcmf_fws_txs_process()
1500 ret = brcmf_proto_hdrpull(fws->drvr, false, skb, &ifp); in brcmf_fws_txs_process()
1506 ret = brcmf_fws_txstatus_suppressed(fws, fifo, skb, in brcmf_fws_txs_process()
1514 static int brcmf_fws_fifocreditback_indicate(struct brcmf_fws_info *fws, in brcmf_fws_fifocreditback_indicate() argument
1519 if (fws->fcmode != BRCMF_FWS_FCMODE_EXPLICIT_CREDIT) { in brcmf_fws_fifocreditback_indicate()
1525 brcmf_fws_lock(fws); in brcmf_fws_fifocreditback_indicate()
1527 brcmf_fws_return_credits(fws, i, data[i]); in brcmf_fws_fifocreditback_indicate()
1529 brcmf_dbg(DATA, "map: credit %x delay %x\n", fws->fifo_credit_map, in brcmf_fws_fifocreditback_indicate()
1530 fws->fifo_delay_map); in brcmf_fws_fifocreditback_indicate()
1531 brcmf_fws_unlock(fws); in brcmf_fws_fifocreditback_indicate()
1535 static int brcmf_fws_txstatus_indicate(struct brcmf_fws_info *fws, u8 *data) in brcmf_fws_txstatus_indicate() argument
1545 fws->stats.txs_indicate++; in brcmf_fws_txstatus_indicate()
1551 if (BRCMF_FWS_MODE_GET_REUSESEQ(fws->mode)) { in brcmf_fws_txstatus_indicate()
1559 brcmf_fws_lock(fws); in brcmf_fws_txstatus_indicate()
1560 brcmf_fws_txs_process(fws, flags, hslot, genbit, seq); in brcmf_fws_txstatus_indicate()
1561 brcmf_fws_unlock(fws); in brcmf_fws_txstatus_indicate()
1565 static int brcmf_fws_dbg_seqnum_check(struct brcmf_fws_info *fws, u8 *data) in brcmf_fws_dbg_seqnum_check() argument
1579 struct brcmf_fws_info *fws = ifp->drvr->fws; in brcmf_fws_notify_credit_map() local
1587 if (fws->creditmap_received) in brcmf_fws_notify_credit_map()
1590 fws->creditmap_received = true; in brcmf_fws_notify_credit_map()
1593 brcmf_fws_lock(fws); in brcmf_fws_notify_credit_map()
1594 for (i = 0; i < ARRAY_SIZE(fws->fifo_credit); i++) { in brcmf_fws_notify_credit_map()
1596 fws->fifo_credit_map |= 1 << i; in brcmf_fws_notify_credit_map()
1598 fws->fifo_credit_map &= ~(1 << i); in brcmf_fws_notify_credit_map()
1599 fws->fifo_credit[i] = *credits++; in brcmf_fws_notify_credit_map()
1601 brcmf_fws_schedule_deq(fws); in brcmf_fws_notify_credit_map()
1602 brcmf_fws_unlock(fws); in brcmf_fws_notify_credit_map()
1610 struct brcmf_fws_info *fws = ifp->drvr->fws; in brcmf_fws_notify_bcmc_credit_support() local
1612 brcmf_fws_lock(fws); in brcmf_fws_notify_bcmc_credit_support()
1613 if (fws) in brcmf_fws_notify_bcmc_credit_support()
1614 fws->bcmc_credit_check = true; in brcmf_fws_notify_bcmc_credit_support()
1615 brcmf_fws_unlock(fws); in brcmf_fws_notify_bcmc_credit_support()
1622 struct brcmf_fws_info *fws = ifp->drvr->fws; in brcmf_fws_hdrpull() local
1639 if ((!fws) || (!fws->fw_signals)) { in brcmf_fws_hdrpull()
1644 fws->stats.header_pulls++; in brcmf_fws_hdrpull()
1666 brcmf_fws_get_tlv_len(fws, type)); in brcmf_fws_hdrpull()
1672 if (len < brcmf_fws_get_tlv_len(fws, type)) in brcmf_fws_hdrpull()
1685 brcmf_fws_macdesc_indicate(fws, type, data); in brcmf_fws_hdrpull()
1689 err = brcmf_fws_macdesc_state_indicate(fws, type, data); in brcmf_fws_hdrpull()
1693 err = brcmf_fws_interface_state_indicate(fws, type, in brcmf_fws_hdrpull()
1698 err = brcmf_fws_request_indicate(fws, type, data); in brcmf_fws_hdrpull()
1701 brcmf_fws_txstatus_indicate(fws, data); in brcmf_fws_hdrpull()
1704 err = brcmf_fws_fifocreditback_indicate(fws, data); in brcmf_fws_hdrpull()
1707 brcmf_fws_rssi_indicate(fws, *data); in brcmf_fws_hdrpull()
1710 brcmf_fws_dbg_seqnum_check(fws, data); in brcmf_fws_hdrpull()
1715 fws->stats.tlv_invalid_type++; in brcmf_fws_hdrpull()
1725 fws->stats.tlv_parse_failed++; in brcmf_fws_hdrpull()
1728 brcmf_fws_schedule_deq(fws); in brcmf_fws_hdrpull()
1738 fws->stats.header_only_pkt++; in brcmf_fws_hdrpull()
1741 static u8 brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo, in brcmf_fws_precommit_skb() argument
1759 return brcmf_fws_hdrpush(fws, p); in brcmf_fws_precommit_skb()
1762 static void brcmf_fws_rollback_toq(struct brcmf_fws_info *fws, in brcmf_fws_rollback_toq() argument
1787 fws->stats.rollback_failed++; in brcmf_fws_rollback_toq()
1789 brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED, in brcmf_fws_rollback_toq()
1792 fws->stats.rollback_success++; in brcmf_fws_rollback_toq()
1793 brcmf_fws_return_credits(fws, fifo, 1); in brcmf_fws_rollback_toq()
1798 static int brcmf_fws_borrow_credit(struct brcmf_fws_info *fws) in brcmf_fws_borrow_credit() argument
1802 if (time_after(fws->borrow_defer_timestamp, jiffies)) { in brcmf_fws_borrow_credit()
1803 fws->fifo_credit_map &= ~(1 << BRCMF_FWS_FIFO_AC_BE); in brcmf_fws_borrow_credit()
1808 if (fws->fifo_credit[lender_ac]) { in brcmf_fws_borrow_credit()
1809 fws->credits_borrowed[lender_ac]++; in brcmf_fws_borrow_credit()
1810 fws->fifo_credit[lender_ac]--; in brcmf_fws_borrow_credit()
1811 if (fws->fifo_credit[lender_ac] == 0) in brcmf_fws_borrow_credit()
1812 fws->fifo_credit_map &= ~(1 << lender_ac); in brcmf_fws_borrow_credit()
1813 fws->fifo_credit_map |= (1 << BRCMF_FWS_FIFO_AC_BE); in brcmf_fws_borrow_credit()
1818 fws->fifo_credit_map &= ~(1 << BRCMF_FWS_FIFO_AC_BE); in brcmf_fws_borrow_credit()
1822 static int brcmf_fws_commit_skb(struct brcmf_fws_info *fws, int fifo, in brcmf_fws_commit_skb() argument
1835 data_offset = brcmf_fws_precommit_skb(fws, fifo, skb); in brcmf_fws_commit_skb()
1840 brcmf_fws_unlock(fws); in brcmf_fws_commit_skb()
1841 rc = brcmf_proto_txdata(fws->drvr, ifidx, data_offset, skb); in brcmf_fws_commit_skb()
1842 brcmf_fws_lock(fws); in brcmf_fws_commit_skb()
1849 (void)brcmf_proto_hdrpull(fws->drvr, false, skb, NULL); in brcmf_fws_commit_skb()
1853 fws->stats.pkt2bus++; in brcmf_fws_commit_skb()
1854 fws->stats.send_pkts[fifo]++; in brcmf_fws_commit_skb()
1856 fws->stats.requested_sent[fifo]++; in brcmf_fws_commit_skb()
1861 brcmf_fws_rollback_toq(fws, skb, fifo); in brcmf_fws_commit_skb()
1865 static int brcmf_fws_assign_htod(struct brcmf_fws_info *fws, struct sk_buff *p, in brcmf_fws_assign_htod() argument
1873 hslot = brcmf_fws_hanger_get_free_slot(&fws->hanger); in brcmf_fws_assign_htod()
1877 rc = brcmf_fws_hanger_pushpkt(&fws->hanger, p, hslot); in brcmf_fws_assign_htod()
1881 fws->stats.generic_error++; in brcmf_fws_assign_htod()
1888 struct brcmf_fws_info *fws = drvr->fws; in brcmf_fws_process_skb() local
1902 if (fws->avoid_queueing) { in brcmf_fws_process_skb()
1916 brcmf_fws_lock(fws); in brcmf_fws_process_skb()
1918 fws->borrow_defer_timestamp = jiffies + in brcmf_fws_process_skb()
1921 skcb->mac = brcmf_fws_macdesc_find(fws, ifp, eh->h_dest); in brcmf_fws_process_skb()
1924 if (!brcmf_fws_assign_htod(fws, skb, fifo)) { in brcmf_fws_process_skb()
1925 brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_DELAYED, fifo, skb); in brcmf_fws_process_skb()
1926 brcmf_fws_schedule_deq(fws); in brcmf_fws_process_skb()
1932 brcmf_fws_unlock(fws); in brcmf_fws_process_skb()
1950 struct brcmf_fws_info *fws = ifp->drvr->fws; in brcmf_fws_add_interface() local
1956 entry = &fws->desc.iface[ifp->ifidx]; in brcmf_fws_add_interface()
1959 brcmf_fws_macdesc_set_name(fws, entry); in brcmf_fws_add_interface()
1972 brcmf_fws_lock(ifp->drvr->fws); in brcmf_fws_del_interface()
1976 brcmf_fws_cleanup(ifp->drvr->fws, ifp->ifidx); in brcmf_fws_del_interface()
1977 brcmf_fws_unlock(ifp->drvr->fws); in brcmf_fws_del_interface()
1982 struct brcmf_fws_info *fws; in brcmf_fws_dequeue_worker() local
1990 fws = container_of(worker, struct brcmf_fws_info, fws_dequeue_work); in brcmf_fws_dequeue_worker()
1991 drvr = fws->drvr; in brcmf_fws_dequeue_worker()
1993 brcmf_fws_lock(fws); in brcmf_fws_dequeue_worker()
1994 for (fifo = BRCMF_FWS_FIFO_BCMC; fifo >= 0 && !fws->bus_flow_blocked; in brcmf_fws_dequeue_worker()
1996 if (!brcmf_fws_fc_active(fws)) { in brcmf_fws_dequeue_worker()
1997 while ((skb = brcmf_fws_deq(fws, fifo)) != NULL) { in brcmf_fws_dequeue_worker()
2000 brcmf_fws_hanger_poppkt(&fws->hanger, hslot, in brcmf_fws_dequeue_worker()
2005 brcmf_fws_unlock(fws); in brcmf_fws_dequeue_worker()
2007 brcmf_fws_lock(fws); in brcmf_fws_dequeue_worker()
2012 if (fws->bus_flow_blocked) in brcmf_fws_dequeue_worker()
2017 while ((fws->fifo_credit[fifo]) || ((!fws->bcmc_credit_check) && in brcmf_fws_dequeue_worker()
2019 skb = brcmf_fws_deq(fws, fifo); in brcmf_fws_dequeue_worker()
2022 fws->fifo_credit[fifo]--; in brcmf_fws_dequeue_worker()
2023 if (brcmf_fws_commit_skb(fws, fifo, skb)) in brcmf_fws_dequeue_worker()
2025 if (fws->bus_flow_blocked) in brcmf_fws_dequeue_worker()
2029 (fws->fifo_credit[fifo] == 0) && in brcmf_fws_dequeue_worker()
2030 (!fws->bus_flow_blocked)) { in brcmf_fws_dequeue_worker()
2031 while (brcmf_fws_borrow_credit(fws) == 0) { in brcmf_fws_dequeue_worker()
2032 skb = brcmf_fws_deq(fws, fifo); in brcmf_fws_dequeue_worker()
2034 brcmf_fws_return_credits(fws, fifo, 1); in brcmf_fws_dequeue_worker()
2037 if (brcmf_fws_commit_skb(fws, fifo, skb)) in brcmf_fws_dequeue_worker()
2039 if (fws->bus_flow_blocked) in brcmf_fws_dequeue_worker()
2044 brcmf_fws_unlock(fws); in brcmf_fws_dequeue_worker()
2051 struct brcmf_fws_stats *fwstats = &bus_if->drvr->fws->stats; in brcmf_debugfs_fws_stats_read()
2118 struct brcmf_fws_info *fws; in brcmf_fws_init() local
2124 drvr->fws = kzalloc(sizeof(*(drvr->fws)), GFP_KERNEL); in brcmf_fws_init()
2125 if (!drvr->fws) { in brcmf_fws_init()
2130 fws = drvr->fws; in brcmf_fws_init()
2132 spin_lock_init(&fws->spinlock); in brcmf_fws_init()
2135 fws->drvr = drvr; in brcmf_fws_init()
2136 fws->fcmode = fcmode; in brcmf_fws_init()
2140 fws->avoid_queueing = true; in brcmf_fws_init()
2145 fws->fws_wq = create_singlethread_workqueue("brcmf_fws_wq"); in brcmf_fws_init()
2146 if (fws->fws_wq == NULL) { in brcmf_fws_init()
2151 INIT_WORK(&fws->fws_dequeue_work, brcmf_fws_dequeue_worker); in brcmf_fws_init()
2154 if (fws->fcmode != BRCMF_FWS_FCMODE_NONE) in brcmf_fws_init()
2178 fws->fw_signals = true; in brcmf_fws_init()
2182 fws->fcmode = BRCMF_FWS_FCMODE_NONE; in brcmf_fws_init()
2183 fws->fw_signals = false; in brcmf_fws_init()
2196 BRCMF_FWS_MODE_SET_REUSESEQ(fws->mode, 1); in brcmf_fws_init()
2201 brcmf_fws_hanger_init(&fws->hanger); in brcmf_fws_init()
2202 brcmf_fws_macdesc_init(&fws->desc.other, NULL, 0); in brcmf_fws_init()
2203 brcmf_fws_macdesc_set_name(fws, &fws->desc.other); in brcmf_fws_init()
2204 brcmu_pktq_init(&fws->desc.other.psq, BRCMF_FWS_PSQ_PREC_COUNT, in brcmf_fws_init()
2212 fws->fw_signals ? "enabled" : "disabled", tlv); in brcmf_fws_init()
2222 struct brcmf_fws_info *fws = drvr->fws; in brcmf_fws_deinit() local
2224 if (!fws) in brcmf_fws_deinit()
2227 if (drvr->fws->fws_wq) in brcmf_fws_deinit()
2228 destroy_workqueue(drvr->fws->fws_wq); in brcmf_fws_deinit()
2231 brcmf_fws_lock(fws); in brcmf_fws_deinit()
2232 brcmf_fws_cleanup(fws, -1); in brcmf_fws_deinit()
2233 drvr->fws = NULL; in brcmf_fws_deinit()
2234 brcmf_fws_unlock(fws); in brcmf_fws_deinit()
2237 kfree(fws); in brcmf_fws_deinit()
2240 bool brcmf_fws_fc_active(struct brcmf_fws_info *fws) in brcmf_fws_fc_active() argument
2242 if (!fws->creditmap_received) in brcmf_fws_fc_active()
2245 return fws->fcmode != BRCMF_FWS_FCMODE_NONE; in brcmf_fws_fc_active()
2248 void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb) in brcmf_fws_bustxfail() argument
2256 brcmf_fws_lock(fws); in brcmf_fws_bustxfail()
2258 brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED, hslot, 0, 0); in brcmf_fws_bustxfail()
2259 brcmf_fws_unlock(fws); in brcmf_fws_bustxfail()
2264 struct brcmf_fws_info *fws = drvr->fws; in brcmf_fws_bus_blocked() local
2266 fws->bus_flow_blocked = flow_blocked; in brcmf_fws_bus_blocked()
2268 brcmf_fws_schedule_deq(fws); in brcmf_fws_bus_blocked()
2270 fws->stats.bus_flow_block++; in brcmf_fws_bus_blocked()