Lines Matching refs:fws
519 static int brcmf_fws_get_tlv_len(struct brcmf_fws_info *fws, in brcmf_fws_get_tlv_len() argument
525 fws->stats.tlv_invalid_type++; in brcmf_fws_get_tlv_len()
532 static void brcmf_fws_lock(struct brcmf_fws_info *fws) in brcmf_fws_lock() argument
533 __acquires(&fws->spinlock) in brcmf_fws_lock()
535 spin_lock_irqsave(&fws->spinlock, fws->flags); in brcmf_fws_lock()
538 static void brcmf_fws_unlock(struct brcmf_fws_info *fws) in brcmf_fws_unlock() argument
539 __releases(&fws->spinlock) in brcmf_fws_unlock()
541 spin_unlock_irqrestore(&fws->spinlock, fws->flags); in brcmf_fws_unlock()
621 static void brcmf_fws_psq_flush(struct brcmf_fws_info *fws, struct pktq *q, in brcmf_fws_psq_flush() argument
636 hi = &fws->hanger.items[hslot]; in brcmf_fws_psq_flush()
639 brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb, in brcmf_fws_psq_flush()
662 static void brcmf_fws_hanger_cleanup(struct brcmf_fws_info *fws, in brcmf_fws_hanger_cleanup() argument
666 struct brcmf_fws_hanger *h = &fws->hanger; in brcmf_fws_hanger_cleanup()
687 static void brcmf_fws_macdesc_set_name(struct brcmf_fws_info *fws, in brcmf_fws_macdesc_set_name() argument
690 if (desc == &fws->desc.other) in brcmf_fws_macdesc_set_name()
728 brcmf_fws_macdesc_lookup(struct brcmf_fws_info *fws, u8 *ea) in brcmf_fws_macdesc_lookup() argument
736 entry = &fws->desc.nodes[0]; in brcmf_fws_macdesc_lookup()
737 for (i = 0; i < ARRAY_SIZE(fws->desc.nodes); i++) { in brcmf_fws_macdesc_lookup()
747 brcmf_fws_macdesc_find(struct brcmf_fws_info *fws, struct brcmf_if *ifp, u8 *da) in brcmf_fws_macdesc_find() argument
763 entry = brcmf_fws_macdesc_lookup(fws, da); in brcmf_fws_macdesc_find()
771 static bool brcmf_fws_macdesc_closed(struct brcmf_fws_info *fws, in brcmf_fws_macdesc_closed() argument
782 if_entry = &fws->desc.iface[entry->interface_id]; in brcmf_fws_macdesc_closed()
796 static void brcmf_fws_macdesc_cleanup(struct brcmf_fws_info *fws, in brcmf_fws_macdesc_cleanup() argument
801 brcmf_fws_psq_flush(fws, &entry->psq, ifidx); in brcmf_fws_macdesc_cleanup()
806 static void brcmf_fws_bus_txq_cleanup(struct brcmf_fws_info *fws, in brcmf_fws_bus_txq_cleanup() argument
816 txq = brcmf_bus_gettxq(fws->drvr->bus_if); in brcmf_fws_bus_txq_cleanup()
826 hi = &fws->hanger.items[hslot]; in brcmf_fws_bus_txq_cleanup()
835 static void brcmf_fws_cleanup(struct brcmf_fws_info *fws, int ifidx) in brcmf_fws_cleanup() argument
841 if (fws == NULL) in brcmf_fws_cleanup()
848 table = &fws->desc.nodes[0]; in brcmf_fws_cleanup()
849 for (i = 0; i < ARRAY_SIZE(fws->desc.nodes); i++) in brcmf_fws_cleanup()
850 brcmf_fws_macdesc_cleanup(fws, &table[i], ifidx); in brcmf_fws_cleanup()
852 brcmf_fws_macdesc_cleanup(fws, &fws->desc.other, ifidx); in brcmf_fws_cleanup()
853 brcmf_fws_bus_txq_cleanup(fws, matchfn, ifidx); in brcmf_fws_cleanup()
854 brcmf_fws_hanger_cleanup(fws, matchfn, ifidx); in brcmf_fws_cleanup()
857 static u8 brcmf_fws_hdrpush(struct brcmf_fws_info *fws, struct sk_buff *skb) in brcmf_fws_hdrpush() argument
872 if (BRCMF_FWS_MODE_GET_REUSESEQ(fws->mode)) in brcmf_fws_hdrpush()
885 if (BRCMF_FWS_MODE_GET_REUSESEQ(fws->mode)) { in brcmf_fws_hdrpush()
909 static bool brcmf_fws_tim_update(struct brcmf_fws_info *fws, in brcmf_fws_tim_update() argument
936 4 + fws->drvr->hdrlen; in brcmf_fws_tim_update()
946 data_offset = brcmf_fws_hdrpush(fws, skb); in brcmf_fws_tim_update()
948 brcmf_fws_unlock(fws); in brcmf_fws_tim_update()
949 err = brcmf_proto_txdata(fws->drvr, ifidx, data_offset, skb); in brcmf_fws_tim_update()
950 brcmf_fws_lock(fws); in brcmf_fws_tim_update()
959 brcmf_fws_flow_control_check(struct brcmf_fws_info *fws, struct pktq *pq, in brcmf_fws_flow_control_check() argument
962 struct brcmf_if *ifp = brcmf_get_ifp(fws->drvr, if_id); in brcmf_fws_flow_control_check()
973 fws->stats.fws_flow_block++; in brcmf_fws_flow_control_check()
979 static int brcmf_fws_rssi_indicate(struct brcmf_fws_info *fws, s8 rssi) in brcmf_fws_rssi_indicate() argument
986 int brcmf_fws_macdesc_indicate(struct brcmf_fws_info *fws, u8 type, u8 *data) in brcmf_fws_macdesc_indicate() argument
997 entry = &fws->desc.nodes[mac_handle & 0x1F]; in brcmf_fws_macdesc_indicate()
1002 brcmf_fws_lock(fws); in brcmf_fws_macdesc_indicate()
1003 brcmf_fws_macdesc_cleanup(fws, entry, -1); in brcmf_fws_macdesc_indicate()
1005 brcmf_fws_unlock(fws); in brcmf_fws_macdesc_indicate()
1007 fws->stats.mac_update_failed++; in brcmf_fws_macdesc_indicate()
1011 existing = brcmf_fws_macdesc_lookup(fws, addr); in brcmf_fws_macdesc_indicate()
1014 brcmf_fws_lock(fws); in brcmf_fws_macdesc_indicate()
1017 brcmf_fws_macdesc_set_name(fws, entry); in brcmf_fws_macdesc_indicate()
1020 brcmf_fws_unlock(fws); in brcmf_fws_macdesc_indicate()
1023 fws->stats.mac_update_failed++; in brcmf_fws_macdesc_indicate()
1028 brcmf_fws_lock(fws); in brcmf_fws_macdesc_indicate()
1033 brcmf_fws_macdesc_set_name(fws, entry); in brcmf_fws_macdesc_indicate()
1034 brcmf_fws_unlock(fws); in brcmf_fws_macdesc_indicate()
1046 static int brcmf_fws_macdesc_state_indicate(struct brcmf_fws_info *fws, in brcmf_fws_macdesc_state_indicate() argument
1054 entry = &fws->desc.nodes[mac_handle & 0x1F]; in brcmf_fws_macdesc_state_indicate()
1056 fws->stats.mac_ps_update_failed++; in brcmf_fws_macdesc_state_indicate()
1059 brcmf_fws_lock(fws); in brcmf_fws_macdesc_state_indicate()
1068 brcmf_fws_tim_update(fws, entry, BRCMF_FWS_FIFO_AC_BK, false); in brcmf_fws_macdesc_state_indicate()
1069 brcmf_fws_tim_update(fws, entry, BRCMF_FWS_FIFO_AC_BE, false); in brcmf_fws_macdesc_state_indicate()
1070 brcmf_fws_tim_update(fws, entry, BRCMF_FWS_FIFO_AC_VI, false); in brcmf_fws_macdesc_state_indicate()
1071 brcmf_fws_tim_update(fws, entry, BRCMF_FWS_FIFO_AC_VO, true); in brcmf_fws_macdesc_state_indicate()
1074 brcmf_fws_unlock(fws); in brcmf_fws_macdesc_state_indicate()
1078 static int brcmf_fws_interface_state_indicate(struct brcmf_fws_info *fws, in brcmf_fws_interface_state_indicate() argument
1092 entry = &fws->desc.iface[ifidx]; in brcmf_fws_interface_state_indicate()
1100 brcmf_fws_lock(fws); in brcmf_fws_interface_state_indicate()
1112 brcmf_fws_unlock(fws); in brcmf_fws_interface_state_indicate()
1115 brcmf_fws_unlock(fws); in brcmf_fws_interface_state_indicate()
1119 fws->stats.if_update_failed++; in brcmf_fws_interface_state_indicate()
1123 static int brcmf_fws_request_indicate(struct brcmf_fws_info *fws, u8 type, in brcmf_fws_request_indicate() argument
1128 entry = &fws->desc.nodes[data[1] & 0x1F]; in brcmf_fws_request_indicate()
1131 fws->stats.credit_request_failed++; in brcmf_fws_request_indicate()
1133 fws->stats.packet_request_failed++; in brcmf_fws_request_indicate()
1140 brcmf_fws_lock(fws); in brcmf_fws_request_indicate()
1147 brcmf_fws_unlock(fws); in brcmf_fws_request_indicate()
1182 static void brcmf_fws_return_credits(struct brcmf_fws_info *fws, in brcmf_fws_return_credits() argument
1192 fws->fifo_credit_map |= 1 << fifo; in brcmf_fws_return_credits()
1198 borrowed = &fws->credits_borrowed[fifo][lender_ac]; in brcmf_fws_return_credits()
1200 fws->fifo_credit_map |= (1 << lender_ac); in brcmf_fws_return_credits()
1201 fifo_credit = &fws->fifo_credit[lender_ac]; in brcmf_fws_return_credits()
1216 fws->fifo_credit[fifo] += credits; in brcmf_fws_return_credits()
1219 if (fws->fifo_credit[fifo] > fws->init_fifo_credit[fifo]) in brcmf_fws_return_credits()
1220 fws->fifo_credit[fifo] = fws->init_fifo_credit[fifo]; in brcmf_fws_return_credits()
1224 static void brcmf_fws_schedule_deq(struct brcmf_fws_info *fws) in brcmf_fws_schedule_deq() argument
1227 if ((fws->fifo_credit_map & fws->fifo_delay_map) || in brcmf_fws_schedule_deq()
1228 (!brcmf_fws_fc_active(fws) && fws->fifo_delay_map)) in brcmf_fws_schedule_deq()
1229 queue_work(fws->fws_wq, &fws->fws_dequeue_work); in brcmf_fws_schedule_deq()
1232 static int brcmf_fws_enq(struct brcmf_fws_info *fws, in brcmf_fws_enq() argument
1236 struct brcmf_pub *drvr = fws->drvr; in brcmf_fws_enq()
1238 u32 *qfull_stat = &fws->stats.delayq_full_error; in brcmf_fws_enq()
1256 qfull_stat = &fws->stats.supprq_full_error; in brcmf_fws_enq()
1311 fws->fifo_delay_map |= 1 << fifo; in brcmf_fws_enq()
1312 fws->fifo_enqpkt[fifo]++; in brcmf_fws_enq()
1321 brcmf_fws_tim_update(fws, entry, fifo, true); in brcmf_fws_enq()
1322 brcmf_fws_flow_control_check(fws, &entry->psq, in brcmf_fws_enq()
1327 static struct sk_buff *brcmf_fws_deq(struct brcmf_fws_info *fws, int fifo) in brcmf_fws_deq() argument
1338 table = (struct brcmf_fws_mac_descriptor *)&fws->desc; in brcmf_fws_deq()
1339 num_nodes = sizeof(fws->desc) / sizeof(struct brcmf_fws_mac_descriptor); in brcmf_fws_deq()
1340 node_pos = fws->deq_node_pos[fifo]; in brcmf_fws_deq()
1345 brcmf_fws_macdesc_closed(fws, entry, fifo)) in brcmf_fws_deq()
1368 fws->deq_node_pos[fifo] = (node_pos + i + 1) % num_nodes; in brcmf_fws_deq()
1369 brcmf_fws_flow_control_check(fws, &entry->psq, in brcmf_fws_deq()
1377 brcmf_fws_tim_update(fws, entry, fifo, false); in brcmf_fws_deq()
1383 fws->fifo_enqpkt[fifo]--; in brcmf_fws_deq()
1384 if (fws->fifo_enqpkt[fifo] == 0) in brcmf_fws_deq()
1385 fws->fifo_delay_map &= ~(1 << fifo); in brcmf_fws_deq()
1394 static int brcmf_fws_txstatus_suppressed(struct brcmf_fws_info *fws, int fifo, in brcmf_fws_txstatus_suppressed() argument
1422 ret = brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_SUPPRESSED, fifo, skb); in brcmf_fws_txstatus_suppressed()
1426 brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb, true); in brcmf_fws_txstatus_suppressed()
1429 brcmf_fws_hanger_mark_suppressed(&fws->hanger, hslot); in brcmf_fws_txstatus_suppressed()
1436 brcmf_fws_txs_process(struct brcmf_fws_info *fws, u8 flags, u32 hslot, in brcmf_fws_txs_process() argument
1439 struct brcmf_pub *drvr = fws->drvr; in brcmf_fws_txs_process()
1452 fws->stats.txs_discard += compcnt; in brcmf_fws_txs_process()
1454 fws->stats.txs_supp_core += compcnt; in brcmf_fws_txs_process()
1457 fws->stats.txs_supp_ps += compcnt; in brcmf_fws_txs_process()
1460 fws->stats.txs_tossed += compcnt; in brcmf_fws_txs_process()
1462 fws->stats.txs_discard += compcnt; in brcmf_fws_txs_process()
1464 fws->stats.txs_discard += compcnt; in brcmf_fws_txs_process()
1466 fws->stats.txs_host_tossed += compcnt; in brcmf_fws_txs_process()
1471 ret = brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb, in brcmf_fws_txs_process()
1494 if (fws->fcmode == BRCMF_FWS_FCMODE_IMPLIED_CREDIT || in brcmf_fws_txs_process()
1497 brcmf_fws_return_credits(fws, fifo, 1); in brcmf_fws_txs_process()
1498 brcmf_fws_schedule_deq(fws); in brcmf_fws_txs_process()
1502 ret = brcmf_proto_hdrpull(fws->drvr, false, skb, &ifp); in brcmf_fws_txs_process()
1508 ret = brcmf_fws_txstatus_suppressed(fws, fifo, skb, in brcmf_fws_txs_process()
1516 if (BRCMF_FWS_MODE_GET_REUSESEQ(fws->mode)) in brcmf_fws_txs_process()
1525 static int brcmf_fws_fifocreditback_indicate(struct brcmf_fws_info *fws, in brcmf_fws_fifocreditback_indicate() argument
1530 if (fws->fcmode != BRCMF_FWS_FCMODE_EXPLICIT_CREDIT) { in brcmf_fws_fifocreditback_indicate()
1536 brcmf_fws_lock(fws); in brcmf_fws_fifocreditback_indicate()
1538 brcmf_fws_return_credits(fws, i, data[i]); in brcmf_fws_fifocreditback_indicate()
1540 brcmf_dbg(DATA, "map: credit %x delay %x\n", fws->fifo_credit_map, in brcmf_fws_fifocreditback_indicate()
1541 fws->fifo_delay_map); in brcmf_fws_fifocreditback_indicate()
1542 brcmf_fws_unlock(fws); in brcmf_fws_fifocreditback_indicate()
1546 static int brcmf_fws_txstatus_indicate(struct brcmf_fws_info *fws, u8 type, in brcmf_fws_txstatus_indicate() argument
1564 if (BRCMF_FWS_MODE_GET_REUSESEQ(fws->mode)) { in brcmf_fws_txstatus_indicate()
1577 fws->stats.txs_indicate += compcnt; in brcmf_fws_txstatus_indicate()
1579 brcmf_fws_lock(fws); in brcmf_fws_txstatus_indicate()
1580 brcmf_fws_txs_process(fws, flags, hslot, genbit, seq, compcnt); in brcmf_fws_txstatus_indicate()
1581 brcmf_fws_unlock(fws); in brcmf_fws_txstatus_indicate()
1585 static int brcmf_fws_dbg_seqnum_check(struct brcmf_fws_info *fws, u8 *data) in brcmf_fws_dbg_seqnum_check() argument
1600 struct brcmf_fws_info *fws = drvr_to_fws(drvr); in brcmf_fws_notify_credit_map() local
1609 fws->creditmap_received = true; in brcmf_fws_notify_credit_map()
1612 brcmf_fws_lock(fws); in brcmf_fws_notify_credit_map()
1613 for (i = 0; i < ARRAY_SIZE(fws->fifo_credit); i++) { in brcmf_fws_notify_credit_map()
1614 fws->fifo_credit[i] += credits[i] - fws->init_fifo_credit[i]; in brcmf_fws_notify_credit_map()
1615 fws->init_fifo_credit[i] = credits[i]; in brcmf_fws_notify_credit_map()
1616 if (fws->fifo_credit[i] > 0) in brcmf_fws_notify_credit_map()
1617 fws->fifo_credit_map |= 1 << i; in brcmf_fws_notify_credit_map()
1619 fws->fifo_credit_map &= ~(1 << i); in brcmf_fws_notify_credit_map()
1620 WARN_ONCE(fws->fifo_credit[i] < 0, in brcmf_fws_notify_credit_map()
1622 fws->fifo_credit[i]); in brcmf_fws_notify_credit_map()
1624 brcmf_fws_schedule_deq(fws); in brcmf_fws_notify_credit_map()
1625 brcmf_fws_unlock(fws); in brcmf_fws_notify_credit_map()
1633 struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr); in brcmf_fws_notify_bcmc_credit_support() local
1635 if (fws) { in brcmf_fws_notify_bcmc_credit_support()
1636 brcmf_fws_lock(fws); in brcmf_fws_notify_bcmc_credit_support()
1637 fws->bcmc_credit_check = true; in brcmf_fws_notify_bcmc_credit_support()
1638 brcmf_fws_unlock(fws); in brcmf_fws_notify_bcmc_credit_support()
1843 struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr); in brcmf_fws_hdrpull() local
1863 if ((!fws) || (!fws->fw_signals)) { in brcmf_fws_hdrpull()
1868 fws->stats.header_pulls++; in brcmf_fws_hdrpull()
1890 brcmf_fws_get_tlv_len(fws, type)); in brcmf_fws_hdrpull()
1896 if (len < brcmf_fws_get_tlv_len(fws, type)) in brcmf_fws_hdrpull()
1907 brcmf_fws_macdesc_indicate(fws, type, data); in brcmf_fws_hdrpull()
1911 err = brcmf_fws_macdesc_state_indicate(fws, type, data); in brcmf_fws_hdrpull()
1915 err = brcmf_fws_interface_state_indicate(fws, type, in brcmf_fws_hdrpull()
1920 err = brcmf_fws_request_indicate(fws, type, data); in brcmf_fws_hdrpull()
1924 brcmf_fws_txstatus_indicate(fws, type, data); in brcmf_fws_hdrpull()
1927 err = brcmf_fws_fifocreditback_indicate(fws, data); in brcmf_fws_hdrpull()
1930 brcmf_fws_rssi_indicate(fws, *data); in brcmf_fws_hdrpull()
1933 brcmf_fws_dbg_seqnum_check(fws, data); in brcmf_fws_hdrpull()
1938 fws->stats.tlv_invalid_type++; in brcmf_fws_hdrpull()
1948 fws->stats.tlv_parse_failed++; in brcmf_fws_hdrpull()
1951 brcmf_fws_schedule_deq(fws); in brcmf_fws_hdrpull()
1961 fws->stats.header_only_pkt++; in brcmf_fws_hdrpull()
1964 static u8 brcmf_fws_precommit_skb(struct brcmf_fws_info *fws, int fifo, in brcmf_fws_precommit_skb() argument
1982 return brcmf_fws_hdrpush(fws, p); in brcmf_fws_precommit_skb()
1985 static void brcmf_fws_rollback_toq(struct brcmf_fws_info *fws, in brcmf_fws_rollback_toq() argument
1988 struct brcmf_pub *drvr = fws->drvr; in brcmf_fws_rollback_toq()
2011 fws->stats.rollback_failed++; in brcmf_fws_rollback_toq()
2013 brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED, in brcmf_fws_rollback_toq()
2016 fws->stats.rollback_success++; in brcmf_fws_rollback_toq()
2017 brcmf_fws_return_credits(fws, fifo, 1); in brcmf_fws_rollback_toq()
2022 static int brcmf_fws_borrow_credit(struct brcmf_fws_info *fws, in brcmf_fws_borrow_credit() argument
2032 fws->init_fifo_credit[lender_ac] / BRCMF_BORROW_RATIO; in brcmf_fws_borrow_credit()
2036 if (fws->fifo_credit[lender_ac] > borrow_limit) { in brcmf_fws_borrow_credit()
2037 fws->credits_borrowed[borrower_ac][lender_ac]++; in brcmf_fws_borrow_credit()
2038 fws->fifo_credit[lender_ac]--; in brcmf_fws_borrow_credit()
2039 if (fws->fifo_credit[lender_ac] == 0) in brcmf_fws_borrow_credit()
2040 fws->fifo_credit_map &= ~(1 << lender_ac); in brcmf_fws_borrow_credit()
2041 fws->fifo_credit_map |= (1 << borrower_ac); in brcmf_fws_borrow_credit()
2046 fws->fifo_credit_map &= ~(1 << borrower_ac); in brcmf_fws_borrow_credit()
2050 static int brcmf_fws_commit_skb(struct brcmf_fws_info *fws, int fifo, in brcmf_fws_commit_skb() argument
2063 data_offset = brcmf_fws_precommit_skb(fws, fifo, skb); in brcmf_fws_commit_skb()
2068 brcmf_fws_unlock(fws); in brcmf_fws_commit_skb()
2069 rc = brcmf_proto_txdata(fws->drvr, ifidx, data_offset, skb); in brcmf_fws_commit_skb()
2070 brcmf_fws_lock(fws); in brcmf_fws_commit_skb()
2077 (void)brcmf_proto_hdrpull(fws->drvr, false, skb, NULL); in brcmf_fws_commit_skb()
2081 fws->stats.pkt2bus++; in brcmf_fws_commit_skb()
2082 fws->stats.send_pkts[fifo]++; in brcmf_fws_commit_skb()
2084 fws->stats.requested_sent[fifo]++; in brcmf_fws_commit_skb()
2089 brcmf_fws_rollback_toq(fws, skb, fifo); in brcmf_fws_commit_skb()
2093 static int brcmf_fws_assign_htod(struct brcmf_fws_info *fws, struct sk_buff *p, in brcmf_fws_assign_htod() argument
2101 hslot = brcmf_fws_hanger_get_free_slot(&fws->hanger); in brcmf_fws_assign_htod()
2105 rc = brcmf_fws_hanger_pushpkt(&fws->hanger, p, hslot); in brcmf_fws_assign_htod()
2109 fws->stats.generic_error++; in brcmf_fws_assign_htod()
2116 struct brcmf_fws_info *fws = drvr_to_fws(drvr); in brcmf_fws_process_skb() local
2134 brcmf_fws_lock(fws); in brcmf_fws_process_skb()
2136 fws->borrow_defer_timestamp = jiffies + in brcmf_fws_process_skb()
2139 skcb->mac = brcmf_fws_macdesc_find(fws, ifp, eh->h_dest); in brcmf_fws_process_skb()
2142 if (!brcmf_fws_assign_htod(fws, skb, fifo)) { in brcmf_fws_process_skb()
2143 brcmf_fws_enq(fws, BRCMF_FWS_SKBSTATE_DELAYED, fifo, skb); in brcmf_fws_process_skb()
2144 brcmf_fws_schedule_deq(fws); in brcmf_fws_process_skb()
2149 brcmf_fws_unlock(fws); in brcmf_fws_process_skb()
2167 struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr); in brcmf_fws_add_interface() local
2170 if (!ifp->ndev || !brcmf_fws_queue_skbs(fws)) in brcmf_fws_add_interface()
2173 entry = &fws->desc.iface[ifp->ifidx]; in brcmf_fws_add_interface()
2176 brcmf_fws_macdesc_set_name(fws, entry); in brcmf_fws_add_interface()
2185 struct brcmf_fws_info *fws = drvr_to_fws(ifp->drvr); in brcmf_fws_del_interface() local
2190 brcmf_fws_lock(fws); in brcmf_fws_del_interface()
2193 brcmf_fws_macdesc_cleanup(fws, &fws->desc.iface[ifp->ifidx], in brcmf_fws_del_interface()
2196 brcmf_fws_cleanup(fws, ifp->ifidx); in brcmf_fws_del_interface()
2197 brcmf_fws_unlock(fws); in brcmf_fws_del_interface()
2202 struct brcmf_fws_info *fws; in brcmf_fws_dequeue_worker() local
2210 fws = container_of(worker, struct brcmf_fws_info, fws_dequeue_work); in brcmf_fws_dequeue_worker()
2211 drvr = fws->drvr; in brcmf_fws_dequeue_worker()
2213 brcmf_fws_lock(fws); in brcmf_fws_dequeue_worker()
2214 for (fifo = BRCMF_FWS_FIFO_BCMC; fifo >= 0 && !fws->bus_flow_blocked; in brcmf_fws_dequeue_worker()
2216 if (!brcmf_fws_fc_active(fws)) { in brcmf_fws_dequeue_worker()
2217 while ((skb = brcmf_fws_deq(fws, fifo)) != NULL) { in brcmf_fws_dequeue_worker()
2220 brcmf_fws_hanger_poppkt(&fws->hanger, hslot, in brcmf_fws_dequeue_worker()
2225 brcmf_fws_unlock(fws); in brcmf_fws_dequeue_worker()
2227 brcmf_fws_lock(fws); in brcmf_fws_dequeue_worker()
2232 if (fws->bus_flow_blocked) in brcmf_fws_dequeue_worker()
2238 while ((fws->fifo_credit[fifo]) || in brcmf_fws_dequeue_worker()
2239 ((!fws->bcmc_credit_check) && in brcmf_fws_dequeue_worker()
2241 skb = brcmf_fws_deq(fws, fifo); in brcmf_fws_dequeue_worker()
2244 fws->fifo_credit[fifo]--; in brcmf_fws_dequeue_worker()
2245 if (brcmf_fws_commit_skb(fws, fifo, skb)) in brcmf_fws_dequeue_worker()
2247 if (fws->bus_flow_blocked) in brcmf_fws_dequeue_worker()
2253 fws->fifo_credit[fifo] == 0 && in brcmf_fws_dequeue_worker()
2254 !fws->bus_flow_blocked) { in brcmf_fws_dequeue_worker()
2255 while (brcmf_fws_borrow_credit(fws, in brcmf_fws_dequeue_worker()
2258 skb = brcmf_fws_deq(fws, fifo); in brcmf_fws_dequeue_worker()
2260 brcmf_fws_return_credits(fws, fifo, 1); in brcmf_fws_dequeue_worker()
2263 if (brcmf_fws_commit_skb(fws, fifo, skb)) in brcmf_fws_dequeue_worker()
2265 if (fws->bus_flow_blocked) in brcmf_fws_dequeue_worker()
2270 brcmf_fws_unlock(fws); in brcmf_fws_dequeue_worker()
2344 struct brcmf_fws_info *fws; in brcmf_fws_attach() local
2350 fws = kzalloc(sizeof(*fws), GFP_KERNEL); in brcmf_fws_attach()
2351 if (!fws) { in brcmf_fws_attach()
2356 spin_lock_init(&fws->spinlock); in brcmf_fws_attach()
2359 fws->drvr = drvr; in brcmf_fws_attach()
2360 fws->fcmode = drvr->settings->fcmode; in brcmf_fws_attach()
2363 (fws->fcmode == BRCMF_FWS_FCMODE_NONE)) { in brcmf_fws_attach()
2364 fws->avoid_queueing = true; in brcmf_fws_attach()
2366 return fws; in brcmf_fws_attach()
2369 fws->fws_wq = create_singlethread_workqueue("brcmf_fws_wq"); in brcmf_fws_attach()
2370 if (fws->fws_wq == NULL) { in brcmf_fws_attach()
2375 INIT_WORK(&fws->fws_dequeue_work, brcmf_fws_dequeue_worker); in brcmf_fws_attach()
2378 if (fws->fcmode != BRCMF_FWS_FCMODE_NONE) in brcmf_fws_attach()
2402 fws->fw_signals = true; in brcmf_fws_attach()
2406 fws->fcmode = BRCMF_FWS_FCMODE_NONE; in brcmf_fws_attach()
2407 fws->fw_signals = false; in brcmf_fws_attach()
2420 BRCMF_FWS_MODE_SET_REUSESEQ(fws->mode, 1); in brcmf_fws_attach()
2425 brcmf_fws_hanger_init(&fws->hanger); in brcmf_fws_attach()
2426 brcmf_fws_macdesc_init(&fws->desc.other, NULL, 0); in brcmf_fws_attach()
2427 brcmf_fws_macdesc_set_name(fws, &fws->desc.other); in brcmf_fws_attach()
2428 brcmf_dbg(INFO, "added %s\n", fws->desc.other.name); in brcmf_fws_attach()
2429 brcmu_pktq_init(&fws->desc.other.psq, BRCMF_FWS_PSQ_PREC_COUNT, in brcmf_fws_attach()
2433 fws->fw_signals ? "enabled" : "disabled", tlv); in brcmf_fws_attach()
2434 return fws; in brcmf_fws_attach()
2437 brcmf_fws_detach(fws); in brcmf_fws_attach()
2441 void brcmf_fws_detach(struct brcmf_fws_info *fws) in brcmf_fws_detach() argument
2443 if (!fws) in brcmf_fws_detach()
2446 if (fws->fws_wq) in brcmf_fws_detach()
2447 destroy_workqueue(fws->fws_wq); in brcmf_fws_detach()
2450 brcmf_fws_lock(fws); in brcmf_fws_detach()
2451 brcmf_fws_cleanup(fws, -1); in brcmf_fws_detach()
2452 brcmf_fws_unlock(fws); in brcmf_fws_detach()
2455 kfree(fws); in brcmf_fws_detach()
2465 bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws) in brcmf_fws_queue_skbs() argument
2467 return !fws->avoid_queueing; in brcmf_fws_queue_skbs()
2470 bool brcmf_fws_fc_active(struct brcmf_fws_info *fws) in brcmf_fws_fc_active() argument
2472 if (!fws->creditmap_received) in brcmf_fws_fc_active()
2475 return fws->fcmode != BRCMF_FWS_FCMODE_NONE; in brcmf_fws_fc_active()
2478 void brcmf_fws_bustxcomplete(struct brcmf_fws_info *fws, struct sk_buff *skb, in brcmf_fws_bustxcomplete() argument
2489 brcmf_fws_lock(fws); in brcmf_fws_bustxcomplete()
2491 brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED, hslot, in brcmf_fws_bustxcomplete()
2493 brcmf_fws_unlock(fws); in brcmf_fws_bustxcomplete()
2499 struct brcmf_fws_info *fws = drvr_to_fws(drvr); in brcmf_fws_bus_blocked() local
2503 if (fws->avoid_queueing) { in brcmf_fws_bus_blocked()
2512 fws->bus_flow_blocked = flow_blocked; in brcmf_fws_bus_blocked()
2514 brcmf_fws_schedule_deq(fws); in brcmf_fws_bus_blocked()
2516 fws->stats.bus_flow_block++; in brcmf_fws_bus_blocked()