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 = fws->drvr->iflist[!if_id ? 0 : if_id + 1]; 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 if (brcmf_proto_hdrpull(fws->drvr, false, &ifidx, skb)) { in brcmf_fws_txs_process()
1505 ret = brcmf_fws_txstatus_suppressed(fws, fifo, skb, ifidx, in brcmf_fws_txs_process()
1508 brcmf_txfinalize(fws->drvr, skb, ifidx, true); in brcmf_fws_txs_process()
1513 static int brcmf_fws_fifocreditback_indicate(struct brcmf_fws_info *fws, in brcmf_fws_fifocreditback_indicate() argument
1518 if (fws->fcmode != BRCMF_FWS_FCMODE_EXPLICIT_CREDIT) { in brcmf_fws_fifocreditback_indicate()
1524 brcmf_fws_lock(fws); in brcmf_fws_fifocreditback_indicate()
1526 brcmf_fws_return_credits(fws, i, data[i]); in brcmf_fws_fifocreditback_indicate()
1528 brcmf_dbg(DATA, "map: credit %x delay %x\n", fws->fifo_credit_map, in brcmf_fws_fifocreditback_indicate()
1529 fws->fifo_delay_map); in brcmf_fws_fifocreditback_indicate()
1530 brcmf_fws_unlock(fws); in brcmf_fws_fifocreditback_indicate()
1534 static int brcmf_fws_txstatus_indicate(struct brcmf_fws_info *fws, u8 *data) in brcmf_fws_txstatus_indicate() argument
1544 fws->stats.txs_indicate++; in brcmf_fws_txstatus_indicate()
1550 if (BRCMF_FWS_MODE_GET_REUSESEQ(fws->mode)) { in brcmf_fws_txstatus_indicate()
1558 brcmf_fws_lock(fws); in brcmf_fws_txstatus_indicate()
1559 brcmf_fws_txs_process(fws, flags, hslot, genbit, seq); in brcmf_fws_txstatus_indicate()
1560 brcmf_fws_unlock(fws); in brcmf_fws_txstatus_indicate()
1564 static int brcmf_fws_dbg_seqnum_check(struct brcmf_fws_info *fws, u8 *data) in brcmf_fws_dbg_seqnum_check() argument
1578 struct brcmf_fws_info *fws = ifp->drvr->fws; in brcmf_fws_notify_credit_map() local
1586 if (fws->creditmap_received) in brcmf_fws_notify_credit_map()
1589 fws->creditmap_received = true; in brcmf_fws_notify_credit_map()
1592 brcmf_fws_lock(fws); in brcmf_fws_notify_credit_map()
1593 for (i = 0; i < ARRAY_SIZE(fws->fifo_credit); i++) { in brcmf_fws_notify_credit_map()
1595 fws->fifo_credit_map |= 1 << i; in brcmf_fws_notify_credit_map()
1597 fws->fifo_credit_map &= ~(1 << i); in brcmf_fws_notify_credit_map()
1598 fws->fifo_credit[i] = *credits++; in brcmf_fws_notify_credit_map()
1600 brcmf_fws_schedule_deq(fws); in brcmf_fws_notify_credit_map()
1601 brcmf_fws_unlock(fws); in brcmf_fws_notify_credit_map()
1609 struct brcmf_fws_info *fws = ifp->drvr->fws; in brcmf_fws_notify_bcmc_credit_support() local
1611 brcmf_fws_lock(fws); in brcmf_fws_notify_bcmc_credit_support()
1612 if (fws) in brcmf_fws_notify_bcmc_credit_support()
1613 fws->bcmc_credit_check = true; in brcmf_fws_notify_bcmc_credit_support()
1614 brcmf_fws_unlock(fws); in brcmf_fws_notify_bcmc_credit_support()
1622 struct brcmf_fws_info *fws = 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()
1743 static u8 brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo, in brcmf_fws_precommit_skb() argument
1761 return brcmf_fws_hdrpush(fws, p); in brcmf_fws_precommit_skb()
1764 static void brcmf_fws_rollback_toq(struct brcmf_fws_info *fws, in brcmf_fws_rollback_toq() argument
1789 fws->stats.rollback_failed++; in brcmf_fws_rollback_toq()
1791 brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED, in brcmf_fws_rollback_toq()
1794 fws->stats.rollback_success++; in brcmf_fws_rollback_toq()
1795 brcmf_fws_return_credits(fws, fifo, 1); in brcmf_fws_rollback_toq()
1800 static int brcmf_fws_borrow_credit(struct brcmf_fws_info *fws) in brcmf_fws_borrow_credit() argument
1804 if (time_after(fws->borrow_defer_timestamp, jiffies)) { in brcmf_fws_borrow_credit()
1805 fws->fifo_credit_map &= ~(1 << BRCMF_FWS_FIFO_AC_BE); in brcmf_fws_borrow_credit()
1810 if (fws->fifo_credit[lender_ac]) { in brcmf_fws_borrow_credit()
1811 fws->credits_borrowed[lender_ac]++; in brcmf_fws_borrow_credit()
1812 fws->fifo_credit[lender_ac]--; in brcmf_fws_borrow_credit()
1813 if (fws->fifo_credit[lender_ac] == 0) in brcmf_fws_borrow_credit()
1814 fws->fifo_credit_map &= ~(1 << lender_ac); in brcmf_fws_borrow_credit()
1815 fws->fifo_credit_map |= (1 << BRCMF_FWS_FIFO_AC_BE); in brcmf_fws_borrow_credit()
1820 fws->fifo_credit_map &= ~(1 << BRCMF_FWS_FIFO_AC_BE); in brcmf_fws_borrow_credit()
1824 static int brcmf_fws_commit_skb(struct brcmf_fws_info *fws, int fifo, in brcmf_fws_commit_skb() argument
1837 data_offset = brcmf_fws_precommit_skb(fws, fifo, skb); in brcmf_fws_commit_skb()
1842 brcmf_fws_unlock(fws); in brcmf_fws_commit_skb()
1843 rc = brcmf_proto_txdata(fws->drvr, ifidx, data_offset, skb); in brcmf_fws_commit_skb()
1844 brcmf_fws_lock(fws); in brcmf_fws_commit_skb()
1851 brcmf_proto_hdrpull(fws->drvr, false, &ifidx, skb); in brcmf_fws_commit_skb()
1855 fws->stats.pkt2bus++; in brcmf_fws_commit_skb()
1856 fws->stats.send_pkts[fifo]++; in brcmf_fws_commit_skb()
1858 fws->stats.requested_sent[fifo]++; in brcmf_fws_commit_skb()
1863 brcmf_fws_rollback_toq(fws, skb, fifo); in brcmf_fws_commit_skb()
1867 static int brcmf_fws_assign_htod(struct brcmf_fws_info *fws, struct sk_buff *p, in brcmf_fws_assign_htod() argument
1875 hslot = brcmf_fws_hanger_get_free_slot(&fws->hanger); in brcmf_fws_assign_htod()
1879 rc = brcmf_fws_hanger_pushpkt(&fws->hanger, p, hslot); in brcmf_fws_assign_htod()
1883 fws->stats.generic_error++; in brcmf_fws_assign_htod()
1890 struct brcmf_fws_info *fws = drvr->fws; in brcmf_fws_process_skb() local
1904 if (fws->avoid_queueing) { in brcmf_fws_process_skb()
1918 brcmf_fws_lock(fws); in brcmf_fws_process_skb()
1920 fws->borrow_defer_timestamp = jiffies + in brcmf_fws_process_skb()
1923 skcb->mac = brcmf_fws_macdesc_find(fws, ifp, eh->h_dest); in brcmf_fws_process_skb()
1926 if (!brcmf_fws_assign_htod(fws, skb, fifo)) { in brcmf_fws_process_skb()
1927 brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_DELAYED, fifo, skb); in brcmf_fws_process_skb()
1928 brcmf_fws_schedule_deq(fws); in brcmf_fws_process_skb()
1934 brcmf_fws_unlock(fws); in brcmf_fws_process_skb()
1952 struct brcmf_fws_info *fws = ifp->drvr->fws; in brcmf_fws_add_interface() local
1958 entry = &fws->desc.iface[ifp->ifidx]; in brcmf_fws_add_interface()
1961 brcmf_fws_macdesc_set_name(fws, entry); in brcmf_fws_add_interface()
1974 brcmf_fws_lock(ifp->drvr->fws); in brcmf_fws_del_interface()
1978 brcmf_fws_cleanup(ifp->drvr->fws, ifp->ifidx); in brcmf_fws_del_interface()
1979 brcmf_fws_unlock(ifp->drvr->fws); in brcmf_fws_del_interface()
1984 struct brcmf_fws_info *fws; in brcmf_fws_dequeue_worker() local
1992 fws = container_of(worker, struct brcmf_fws_info, fws_dequeue_work); in brcmf_fws_dequeue_worker()
1993 drvr = fws->drvr; in brcmf_fws_dequeue_worker()
1995 brcmf_fws_lock(fws); in brcmf_fws_dequeue_worker()
1996 for (fifo = BRCMF_FWS_FIFO_BCMC; fifo >= 0 && !fws->bus_flow_blocked; in brcmf_fws_dequeue_worker()
1998 if (!brcmf_fws_fc_active(fws)) { in brcmf_fws_dequeue_worker()
1999 while ((skb = brcmf_fws_deq(fws, fifo)) != NULL) { in brcmf_fws_dequeue_worker()
2002 brcmf_fws_hanger_poppkt(&fws->hanger, hslot, in brcmf_fws_dequeue_worker()
2007 brcmf_fws_unlock(fws); in brcmf_fws_dequeue_worker()
2009 brcmf_fws_lock(fws); in brcmf_fws_dequeue_worker()
2013 if (fws->bus_flow_blocked) in brcmf_fws_dequeue_worker()
2018 while ((fws->fifo_credit[fifo]) || ((!fws->bcmc_credit_check) && in brcmf_fws_dequeue_worker()
2020 skb = brcmf_fws_deq(fws, fifo); in brcmf_fws_dequeue_worker()
2023 fws->fifo_credit[fifo]--; in brcmf_fws_dequeue_worker()
2024 if (brcmf_fws_commit_skb(fws, fifo, skb)) in brcmf_fws_dequeue_worker()
2026 if (fws->bus_flow_blocked) in brcmf_fws_dequeue_worker()
2030 (fws->fifo_credit[fifo] == 0) && in brcmf_fws_dequeue_worker()
2031 (!fws->bus_flow_blocked)) { in brcmf_fws_dequeue_worker()
2032 while (brcmf_fws_borrow_credit(fws) == 0) { in brcmf_fws_dequeue_worker()
2033 skb = brcmf_fws_deq(fws, fifo); in brcmf_fws_dequeue_worker()
2035 brcmf_fws_return_credits(fws, fifo, 1); in brcmf_fws_dequeue_worker()
2038 if (brcmf_fws_commit_skb(fws, fifo, skb)) in brcmf_fws_dequeue_worker()
2040 if (fws->bus_flow_blocked) in brcmf_fws_dequeue_worker()
2045 brcmf_fws_unlock(fws); in brcmf_fws_dequeue_worker()
2052 struct brcmf_fws_stats *fwstats = &bus_if->drvr->fws->stats; in brcmf_debugfs_fws_stats_read()
2119 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()
2181 fws->fcmode = BRCMF_FWS_FCMODE_NONE; in brcmf_fws_init()
2182 fws->fw_signals = false; in brcmf_fws_init()
2195 BRCMF_FWS_MODE_SET_REUSESEQ(fws->mode, 1); in brcmf_fws_init()
2200 brcmf_fws_hanger_init(&fws->hanger); in brcmf_fws_init()
2201 brcmf_fws_macdesc_init(&fws->desc.other, NULL, 0); in brcmf_fws_init()
2202 brcmf_fws_macdesc_set_name(fws, &fws->desc.other); in brcmf_fws_init()
2203 brcmu_pktq_init(&fws->desc.other.psq, BRCMF_FWS_PSQ_PREC_COUNT, in brcmf_fws_init()
2211 fws->fw_signals ? "enabled" : "disabled", tlv); in brcmf_fws_init()
2221 struct brcmf_fws_info *fws = drvr->fws; in brcmf_fws_deinit() local
2223 if (!fws) in brcmf_fws_deinit()
2226 if (drvr->fws->fws_wq) in brcmf_fws_deinit()
2227 destroy_workqueue(drvr->fws->fws_wq); in brcmf_fws_deinit()
2230 brcmf_fws_lock(fws); in brcmf_fws_deinit()
2231 brcmf_fws_cleanup(fws, -1); in brcmf_fws_deinit()
2232 drvr->fws = NULL; in brcmf_fws_deinit()
2233 brcmf_fws_unlock(fws); in brcmf_fws_deinit()
2236 kfree(fws); in brcmf_fws_deinit()
2239 bool brcmf_fws_fc_active(struct brcmf_fws_info *fws) in brcmf_fws_fc_active() argument
2241 if (!fws->creditmap_received) in brcmf_fws_fc_active()
2244 return fws->fcmode != BRCMF_FWS_FCMODE_NONE; in brcmf_fws_fc_active()
2247 void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb) in brcmf_fws_bustxfail() argument
2255 brcmf_fws_lock(fws); in brcmf_fws_bustxfail()
2257 brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED, hslot, 0, 0); in brcmf_fws_bustxfail()
2258 brcmf_fws_unlock(fws); in brcmf_fws_bustxfail()
2263 struct brcmf_fws_info *fws = drvr->fws; in brcmf_fws_bus_blocked() local
2265 fws->bus_flow_blocked = flow_blocked; in brcmf_fws_bus_blocked()
2267 brcmf_fws_schedule_deq(fws); in brcmf_fws_bus_blocked()
2269 fws->stats.bus_flow_block++; in brcmf_fws_bus_blocked()