From d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 11 Dec 2023 02:45:28 +0000 Subject: [PATCH] add boot partition size --- kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_wlfc.c | 355 ++++++++++++++++++++++++++++------------------------------- 1 files changed, 168 insertions(+), 187 deletions(-) diff --git a/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_wlfc.c b/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_wlfc.c index f8f1595..ba83762 100644 --- a/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_wlfc.c +++ b/kernel/drivers/net/wireless/rockchip_wlan/cywdhd/bcmdhd/dhd_wlfc.c @@ -1,15 +1,16 @@ -/* SPDX-License-Identifier: GPL-2.0 */ /* * DHD PROP_TXSTATUS Module. * - * Copyright (C) 1999-2019, Broadcom Corporation - * + * Portions of this code are copyright (c) 2022 Cypress Semiconductor Corporation + * + * Copyright (C) 1999-2017, Broadcom Corporation + * * Unless you and Broadcom execute a separate written software license * agreement governing use of this software, this software is licensed to you * under the terms of the GNU General Public License version 2 (the "GPL"), * available at http://www.broadcom.com/licenses/GPLv2.php, with the * following added to such license: - * + * * As a special exception, the copyright holders of this software give you * permission to link this software with independent modules, and to copy and * distribute the resulting executable under terms of your choice, provided that @@ -17,7 +18,7 @@ * the license of that module. An independent module is a module which is not * derived from this software. The special exception does not apply to any * modifications of the software. - * + * * Notwithstanding the above, under no circumstances may you combine this * software in any way with any other Broadcom software provided under a license * other than the GPL, without Broadcom's express prior written consent. @@ -25,10 +26,9 @@ * * <<Broadcom-WL-IPTag/Open:>> * - * $Id: dhd_wlfc.c 606400 2015-12-15 09:59:42Z $ + * $Id: dhd_wlfc.c 700323 2017-05-18 16:12:11Z $ * */ - #include <typedefs.h> #include <osl.h> @@ -39,24 +39,18 @@ #include <dngl_stats.h> #include <dhd.h> -#ifdef BCMDBUS /* an abstraction layer that hides details of the underlying bus, eg \ - Linux USB */ -#include <dbus.h> -#else #include <dhd_bus.h> -#endif /* BCMDBUS */ #include <dhd_dbg.h> #ifdef PROP_TXSTATUS /* a form of flow control between host and dongle */ #include <wlfc_proto.h> #include <dhd_wlfc.h> -#endif +#endif // endif #ifdef DHDTCPACK_SUPPRESS #include <dhd_ip.h> #endif /* DHDTCPACK_SUPPRESS */ - /* * wlfc naming and lock rules: @@ -72,14 +66,9 @@ #define WLFC_THREAD_RETRY_WAIT_MS 10000 /* 10 sec */ #endif /* defined (DHD_WLFC_THREAD) */ -#if defined(BCMDBUS) -extern int dhd_dbus_txdata(dhd_pub_t *dhdp, void *pktbuf); -#endif - #ifdef PROP_TXSTATUS #define DHD_WLFC_QMON_COMPLETE(entry) - /** reordering related */ @@ -132,15 +121,13 @@ return; ASSERT(prec >= 0 && prec < pq->num_prec); - /* queueing chains not allowed and no segmented SKB (Kernel-3.18.y) */ - ASSERT(!((PKTLINK(p) != NULL) && (PKTLINK(p) != p))); + ASSERT(PKTLINK(p) == NULL); /* queueing chains not allowed */ ASSERT(!pktq_full(pq)); - ASSERT(!pktq_pfull(pq, prec)); + ASSERT(!pktqprec_full(pq, prec)); q = &pq->q[prec]; - PKTSETLINK(p, NULL); if (q->head == NULL) { /* empty queue */ q->head = p; @@ -194,8 +181,8 @@ exit: - q->len++; - pq->len++; + q->n_pkts++; + pq->n_pkts_tot++; if (pq->hi_prec < prec) pq->hi_prec = (uint8)prec; @@ -504,8 +491,12 @@ } } - q->len--; - pq->len--; + q->n_pkts--; + pq->n_pkts_tot--; + +#ifdef WL_TXQ_STALL + q->dequeue_count++; +#endif // endif PKTSETLINK(p, NULL); @@ -593,7 +584,6 @@ h->flags = (BDC_PROTO_VER << BDC_FLAG_VER_SHIFT); if (PKTSUMNEEDED(p)) h->flags |= BDC_FLAG_SUM_NEEDED; - h->priority = (PKTPRIO(p) & BDC_PRIORITY_MASK); h->flags2 = 0; @@ -699,7 +689,10 @@ void *pout = NULL; ASSERT(dhdp && p); - ASSERT(prec >= 0 && prec <= WLFC_PSQ_PREC_COUNT); + if (prec < 0 || prec >= WLFC_PSQ_PREC_COUNT) { + ASSERT(0); + return BCME_BADARG; + } ctx = (athost_wl_status_info_t*)dhdp->wlfc_state; @@ -774,12 +767,12 @@ /* Fast case, precedence queue is not full and we are also not * exceeding total queue length */ - if (!pktq_pfull(pq, prec) && !pktq_full(pq)) { + if (!pktqprec_full(pq, prec) && !pktq_full(pq)) { goto exit; } /* Determine precedence from which to evict packet, if any */ - if (pktq_pfull(pq, prec)) { + if (pktqprec_full(pq, prec)) { eprec = prec; } else if (pktq_full(pq)) { p = pktq_peek_tail(pq, &eprec); @@ -788,7 +781,7 @@ return FALSE; } if ((eprec > prec) || (eprec < 0)) { - if (!pktq_pempty(pq, prec)) { + if (!pktqprec_empty(pq, prec)) { eprec = prec; } else { return FALSE; @@ -799,7 +792,7 @@ /* Evict if needed */ if (eprec >= 0) { /* Detect queueing to unconfigured precedence */ - ASSERT(!pktq_pempty(pq, eprec)); + ASSERT(!pktqprec_empty(pq, eprec)); /* Evict all fragmented frames */ dhd_prec_drop_pkts(dhdp, pq, eprec, _dhd_wlfc_prec_drop); } @@ -940,18 +933,21 @@ dhdp = (dhd_pub_t *)ctx->dhdp; ASSERT(dhdp); - if (dhdp->skip_fc && dhdp->skip_fc()) + if (if_id >= 255) + return; + + if (dhdp->skip_fc && dhdp->skip_fc((void *)dhdp, if_id)) return; if ((ctx->hostif_flow_state[if_id] == OFF) && !_dhd_wlfc_allow_fc(ctx, if_id)) return; - if ((pq->len <= WLFC_FLOWCONTROL_LOWATER) && (ctx->hostif_flow_state[if_id] == ON)) { + if ((pq->n_pkts_tot <= WLFC_FLOWCONTROL_LOWATER) && (ctx->hostif_flow_state[if_id] == ON)) { /* start traffic */ ctx->hostif_flow_state[if_id] = OFF; /* WLFC_DBGMESG(("qlen:%02d, if:%02d, ->OFF, start traffic %s()\n", - pq->len, if_id, __FUNCTION__)); + pq->n_pkts_tot, if_id, __FUNCTION__)); */ WLFC_DBGMESG(("F")); @@ -960,12 +956,12 @@ ctx->toggle_host_if = 0; } - if ((pq->len >= WLFC_FLOWCONTROL_HIWATER) && (ctx->hostif_flow_state[if_id] == OFF)) { + if (pq->n_pkts_tot >= WLFC_FLOWCONTROL_HIWATER && ctx->hostif_flow_state[if_id] == OFF) { /* stop traffic */ ctx->hostif_flow_state[if_id] = ON; /* WLFC_DBGMESG(("qlen:%02d, if:%02d, ->ON, stop traffic %s()\n", - pq->len, if_id, __FUNCTION__)); + pq->n_pkts_tot, if_id, __FUNCTION__)); */ WLFC_DBGMESG(("N")); @@ -1002,15 +998,13 @@ DHD_PKTTAG_WLFCPKT_SET(PKTTAG(p), 1); #ifdef PROP_TXSTATUS_DEBUG ctx->stats.signal_only_pkts_sent++; -#endif +#endif // endif #if defined(BCMPCIE) rc = dhd_bus_txdata(dhdp->bus, p, ctx->host_ifidx); -#elif defined(BCMDBUS) - rc = dhd_dbus_txdata(dhdp, p); #else rc = dhd_bus_txdata(dhdp->bus, p); -#endif +#endif // endif if (rc != BCME_OK) { _dhd_wlfc_pullheader(ctx, p); PKTFREE(ctx->osh, p, TRUE); @@ -1041,8 +1035,8 @@ bool rc = FALSE; if (entry->state == WLFC_STATE_CLOSE) { - if ((pktq_plen(&entry->psq, (prec << 1)) == 0) && - (pktq_plen(&entry->psq, ((prec << 1) + 1)) == 0)) { + if ((pktqprec_n_pkts(&entry->psq, (prec << 1)) == 0) && + (pktqprec_n_pkts(&entry->psq, ((prec << 1) + 1)) == 0)) { /* no packets in both 'normal' and 'suspended' queues */ if (entry->traffic_pending_bmp & NBITVAL(prec)) { rc = TRUE; @@ -1218,7 +1212,7 @@ #ifdef PROP_TXSTATUS_DEBUG h->items[hslot].push_time = OSL_SYSUPTIME(); -#endif +#endif // endif } else { DHD_ERROR(("%s() hanger_pushpkt() failed, rc: %d\n", __FUNCTION__, rc)); @@ -1235,10 +1229,6 @@ h->items[hslot].pkt_txstatus = 0; h->items[hslot].state = WLFC_HANGER_ITEM_STATE_INUSE; } - } else if (!WLFC_GET_AFQ(dhdp->wlfc_mode)) { - /* clear hanger state */ - ((wlfc_hanger_t*)(ctx->hanger))->items[hslot].pkt_state = 0; - ((wlfc_hanger_t*)(ctx->hanger))->items[hslot].pkt_txstatus = 0; } if ((rc == BCME_OK) && header_needed) { @@ -1259,12 +1249,14 @@ _dhd_wlfc_is_destination_open(athost_wl_status_info_t* ctx, wlfc_mac_descriptor_t* entry, int prec) { + wlfc_mac_descriptor_t* interfaces = ctx->destination_entries.interfaces; + if (entry->interface_id >= WLFC_MAX_IFNUM) { ASSERT(&ctx->destination_entries.other == entry); return 1; } - if (ctx->destination_entries.interfaces[entry->interface_id].iftype == + if (interfaces[entry->interface_id].iftype == WLC_E_IF_ROLE_P2P_GO) { /* - destination interface is of type p2p GO. For a p2pGO interface, if the destination is OPEN but the interface is @@ -1279,7 +1271,9 @@ } /* AP, p2p_go -> unicast desc entry, STA/p2p_cl -> interface desc. entry */ - if (((entry->state == WLFC_STATE_CLOSE) && (entry->requested_credit == 0) && + if ((((entry->state == WLFC_STATE_CLOSE) || + (interfaces[entry->interface_id].state == WLFC_STATE_CLOSE)) && + (entry->requested_credit == 0) && (entry->requested_packet == 0)) || (!(entry->ac_bitmap & (1 << prec)))) { return 0; @@ -1357,7 +1351,7 @@ entry->requested_credit--; #ifdef PROP_TXSTATUS_DEBUG entry->dstncredit_sent_packets++; -#endif +#endif // endif } else if (entry->requested_packet > 0) { entry->requested_packet--; DHD_PKTTAG_SETONETIMEPKTRQST(PKTTAG(p)); @@ -1406,7 +1400,6 @@ ctx->stats.delayq_full_error++; return BCME_ERROR; } - /* A packet has been pushed, update traffic availability bitmap, if applicable */ _dhd_wlfc_traffic_pending_check(ctx, entry, prec); @@ -1543,7 +1536,7 @@ /* Optimize flush, if pktq len = 0, just return. * pktq len of 0 means pktq's prec q's are all empty. */ - if (pq->len == 0) { + if (pq->n_pkts_tot == 0) { return; } @@ -1608,8 +1601,12 @@ } PKTFREE(ctx->osh, p, dir); - q->len--; - pq->len--; + q->n_pkts--; + pq->n_pkts_tot--; +#ifdef WL_TXQ_STALL + q->dequeue_count++; +#endif // endif + p = (head ? q->head : PKTLINK(prev)); } else { prev = p; @@ -1618,17 +1615,15 @@ } if (q->head == NULL) { - ASSERT(q->len == 0); + ASSERT(q->n_pkts == 0); q->tail = NULL; } } if (fn == NULL) - ASSERT(pq->len == 0); + ASSERT(pq->n_pkts_tot == 0); } /* _dhd_wlfc_pktq_flush */ - -#ifndef BCMDBUS /** !BCMDBUS specific function. Dequeues a packet from the caller supplied queue. */ static void* @@ -1666,9 +1661,13 @@ } } - q->len--; + q->n_pkts--; - pq->len--; + pq->n_pkts_tot--; + +#ifdef WL_TXQ_STALL + q->dequeue_count++; +#endif // endif PKTSETLINK(p, NULL); @@ -1707,7 +1706,6 @@ } dhd_os_sdunlock_txq(dhd); - while ((pkt = head)) { head = PKTLINK(pkt); PKTSETLINK(pkt, NULL); @@ -1736,8 +1734,6 @@ } } /* _dhd_wlfc_cleanup_txq */ -#endif /* !BCMDBUS */ - /** called during eg detach */ void _dhd_wlfc_cleanup(dhd_pub_t *dhd, f_processpkt_t fn, void *arg) @@ -1755,10 +1751,8 @@ /* * flush sequence should be txq -> psq -> hanger/afq, hanger has to be last one */ -#ifndef BCMDBUS /* flush bus->txq */ _dhd_wlfc_cleanup_txq(dhd, fn, arg); -#endif /* BCMDBUS */ /* flush psq, search all entries, include nodes as well as interfaces */ total_entries = sizeof(wlfc->destination_entries)/sizeof(wlfc_mac_descriptor_t); @@ -1767,15 +1761,15 @@ for (i = 0; i < total_entries; i++) { if (table[i].occupied) { /* release packets held in PSQ (both delayed and suppressed) */ - if (table[i].psq.len) { + if (table[i].psq.n_pkts_tot) { WLFC_DBGMESG(("%s(): PSQ[%d].len = %d\n", - __FUNCTION__, i, table[i].psq.len)); + __FUNCTION__, i, table[i].psq.n_pkts_tot)); _dhd_wlfc_pktq_flush(wlfc, &table[i].psq, TRUE, fn, arg, Q_TYPE_PSQ); } /* free packets held in AFQ */ - if (WLFC_GET_AFQ(dhd->wlfc_mode) && (table[i].afq.len)) { + if (WLFC_GET_AFQ(dhd->wlfc_mode) && (table[i].afq.n_pkts_tot)) { _dhd_wlfc_pktq_flush(wlfc, &table[i].afq, TRUE, fn, arg, Q_TYPE_AFQ); } @@ -1819,7 +1813,6 @@ { int rc = BCME_OK; - if ((action == eWLFC_MAC_ENTRY_ACTION_ADD) || (action == eWLFC_MAC_ENTRY_ACTION_UPDATE)) { entry->occupied = 1; entry->state = WLFC_STATE_OPEN; @@ -1843,6 +1836,7 @@ dhd_pub_t *dhdp = (dhd_pub_t *)(ctx->dhdp); pktq_init(&entry->psq, WLFC_PSQ_PREC_COUNT, WLFC_PSQ_LEN); + _dhd_wlfc_flow_control_check(ctx, &entry->psq, ifid); if (WLFC_GET_AFQ(dhdp->wlfc_mode)) { pktq_init(&entry->afq, WLFC_AFQ_PREC_COUNT, WLFC_PSQ_LEN); @@ -1898,7 +1892,6 @@ } return rc; } /* _dhd_wlfc_mac_entry_update */ - #ifdef LIMIT_BORROW @@ -2189,8 +2182,13 @@ } } - q->len--; - pq->len--; + q->n_pkts--; + pq->n_pkts_tot--; + +#ifdef WL_TXQ_STALL + q->dequeue_count++; +#endif // endif + ctx->pkt_cnt_in_q[DHD_PKTTAG_IF(PKTTAG(p))][prec]--; ctx->pkt_cnt_per_ac[prec]--; @@ -2232,7 +2230,7 @@ if (WLFC_GET_REUSESEQ(dhd->wlfc_mode)) { memcpy(&seq, pkt_info + WLFC_CTL_VALUE_LEN_TXSTATUS, WLFC_CTL_VALUE_LEN_SEQ); seq = ltoh16(seq); - seq_fromfw = WL_SEQ_GET_FROMFW(seq); + seq_fromfw = GET_WL_HAS_ASSIGNED_SEQ(seq); seq_num = WL_SEQ_GET_NUM(seq); } @@ -2250,10 +2248,12 @@ remove_from_hanger = 0; } else if (status_flag == WLFC_CTL_PKTFLAG_TOSSED_BYWLC) { wlfc->stats.wlc_tossed_pkts += len; - } - - else if (status_flag == WLFC_CTL_PKTFLAG_SUPPRESS_ACKED) { + } else if (status_flag == WLFC_CTL_PKTFLAG_SUPPRESS_ACKED) { wlfc->stats.pkt_freed += len; + } else if (status_flag == WLFC_CTL_PKTFLAG_EXPIRED) { + wlfc->stats.pkt_exptime += len; + } else if (status_flag == WLFC_CTL_PKTFLAG_DROPPED) { + wlfc->stats.pkt_dropped += len; } if (dhd->proptxstatus_txstatus_ignore) { @@ -2326,7 +2326,6 @@ uint32 delta; old_t = ((wlfc_hanger_t*)(wlfc->hanger))->items[hslot].push_time; - wlfc->stats.latency_sample_count++; if (new_t > old_t) delta = new_t - old_t; @@ -2357,7 +2356,7 @@ } #ifdef PROP_TXSTATUS_DEBUG entry->dstncredit_acks++; -#endif +#endif // endif } if ((status_flag == WLFC_CTL_PKTFLAG_D11SUPPRESS) || @@ -2366,7 +2365,7 @@ WL_TXSTATUS_SET_GENERATION(DHD_PKTTAG_H2DTAG(PKTTAG(pktbuf)), gen); if (WLFC_GET_REUSESEQ(dhd->wlfc_mode)) { - WL_SEQ_SET_FROMDRV(DHD_PKTTAG_H2DSEQ(PKTTAG(pktbuf)), seq_fromfw); + WL_SEQ_SET_REUSE(DHD_PKTTAG_H2DSEQ(PKTTAG(pktbuf)), seq_fromfw); WL_SEQ_SET_NUM(DHD_PKTTAG_H2DSEQ(PKTTAG(pktbuf)), seq_num); } @@ -2438,7 +2437,7 @@ for (i = 0; i < WLFC_CTL_VALUE_LEN_FIFO_CREDITBACK; i++) { #ifdef PROP_TXSTATUS_DEBUG wlfc->stats.fifo_credits_back[i] += credits[i]; -#endif +#endif // endif /* update FIFO credits */ if (dhd->proptxstatus_mode == WLFC_FCMODE_EXPLICIT_CREDIT) @@ -2480,8 +2479,6 @@ return BCME_OK; } /* _dhd_wlfc_fifocreditback_indicate */ -#ifndef BCMDBUS - /** !BCMDBUS specific function */ static void _dhd_wlfc_suppress_txq(dhd_pub_t *dhd, f_processpkt_t fn, void *arg) @@ -2516,15 +2513,18 @@ PKTSETLINK(pkt, NULL); entry = _dhd_wlfc_find_table_entry(wlfc, pkt); - if (entry) { - if (entry->onbus_pkts_count > 0) - entry->onbus_pkts_count--; - if (entry->suppressed && - (!entry->onbus_pkts_count) && - (!entry->suppr_transit_count)) - entry->suppressed = FALSE; + if (!entry) { + PKTFREE(dhd->osh, pkt, TRUE); + continue; } - + if (entry->onbus_pkts_count > 0) { + entry->onbus_pkts_count--; + } + if (entry->suppressed && + (!entry->onbus_pkts_count) && + (!entry->suppr_transit_count)) { + entry->suppressed = FALSE; + } /* fake a suppression txstatus */ htod = DHD_PKTTAG_H2DTAG(PKTTAG(pkt)); WL_TXSTATUS_SET_FLAGS(htod, WLFC_CTL_PKTFLAG_WLSUPPRESS); @@ -2533,9 +2533,9 @@ memcpy(results, &htod, WLFC_CTL_VALUE_LEN_TXSTATUS); if (WLFC_GET_REUSESEQ(dhd->wlfc_mode)) { htodseq = DHD_PKTTAG_H2DSEQ(PKTTAG(pkt)); - if (WL_SEQ_GET_FROMDRV(htodseq)) { - WL_SEQ_SET_FROMFW(htodseq, 1); - WL_SEQ_SET_FROMDRV(htodseq, 0); + if (IS_WL_TO_REUSE_SEQ(htodseq)) { + SET_WL_HAS_ASSIGNED_SEQ(htodseq); + RESET_WL_TO_REUSE_SEQ(htodseq); } htodseq = htol16(htodseq); memcpy(results + WLFC_CTL_VALUE_LEN_TXSTATUS, &htodseq, @@ -2557,8 +2557,6 @@ _dhd_wlfc_fifocreditback_indicate(dhd, credits); } } /* _dhd_wlfc_suppress_txq */ - -#endif /* !BCMDBUS */ static int _dhd_wlfc_dbg_senum_check(dhd_pub_t *dhd, uint8 *value) @@ -2643,8 +2641,8 @@ uint8 ifid; uint8* ea; - WLFC_DBGMESG(("%s(), mac [%02x:%02x:%02x:%02x:%02x:%02x],%s,idx:%d,id:0x%02x\n", - __FUNCTION__, value[2], value[3], value[4], value[5], value[6], value[7], + WLFC_DBGMESG(("%s(), mac ["MACDBG"],%s,idx:%d,id:0x%02x\n", + __FUNCTION__, MAC2STRDBG(&value[2]), ((type == WLFC_CTL_TYPE_MACDESC_ADD) ? "ADD":"DEL"), WLFC_MAC_DESC_GET_LOOKUP_INDEX(value[0]), value[0])); @@ -2828,7 +2826,11 @@ _dhd_wlfc_reorderinfo_indicate(uint8 *val, uint8 len, uchar *info_buf, uint *info_len) { if (info_len) { - if (info_buf) { + /* Check copy length to avoid buffer overrun. In case of length exceeding + * WLHOST_REORDERDATA_TOTLEN, return failure instead sending incomplete result + * of length WLHOST_REORDERDATA_TOTLEN + */ + if ((info_buf) && (len <= WLHOST_REORDERDATA_TOTLEN)) { bcopy(val, info_buf, len); *info_len = len; } else { @@ -2923,7 +2925,6 @@ wlfc->allow_credit_borrow = 0; wlfc->single_ac = 0; wlfc->single_ac_timestamp = 0; - exit: dhd_os_wlfc_unblock(dhd); @@ -3082,12 +3083,10 @@ _dhd_wlfc_interface_update(dhd, value, type); } -#ifndef BCMDBUS if (entry && WLFC_GET_REORDERSUPP(dhd->wlfc_mode)) { /* suppress all packets for this mac entry from bus->txq */ _dhd_wlfc_suppress_txq(dhd, _dhd_wlfc_entrypkt_fn, entry); } -#endif /* !BCMDBUS */ } /* while */ if (remainder != 0 && wlfc) { @@ -3101,7 +3100,7 @@ dhd_os_wlfc_unblock(dhd); return BCME_OK; -} /* dhd_wlfc_parse_header_info */ +} KERNEL_THREAD_RETURN_TYPE dhd_wlfc_transfer_packets(void *data) @@ -3112,6 +3111,7 @@ athost_wl_status_info_t* ctx; int bus_retry_count = 0; int pkt_send = 0; + int pkt_send_per_ac = 0; uint8 tx_map = 0; /* packets (send + in queue), Bitmask for 4 ACs + BC/MC */ uint8 rx_map = 0; /* received packets, Bitmask for 4 ACs + BC/MC */ @@ -3179,7 +3179,9 @@ tx_map |= (1 << ac); single_ac = ac + 1; - while (FALSE == dhdp->proptxstatus_txoff) { + pkt_send_per_ac = 0; + while ((FALSE == dhdp->proptxstatus_txoff) && + (pkt_send_per_ac < WLFC_PACKET_BOUND)) { /* packets from delayQ with less priority are fresh and * they'd need header and have no MAC entry */ @@ -3199,7 +3201,7 @@ no_credit = FALSE; } } -#endif +#endif // endif commit_info.needs_hdr = 1; commit_info.mac_entry = NULL; commit_info.p = _dhd_wlfc_deque_delayedq(ctx, ac, @@ -3215,7 +3217,7 @@ if (lender != -1 && dhdp->wlfc_borrow_allowed) { _dhd_wlfc_return_credit(ctx, lender, ac); } -#endif +#endif // endif break; } @@ -3229,6 +3231,7 @@ /* Bus commits may fail (e.g. flow control); abort after retries */ if (rc == BCME_OK) { pkt_send++; + pkt_send_per_ac++; if (commit_info.ac_fifo_credit_spent && (lender == -1)) { ctx->FIFO_credit[ac]--; } @@ -3237,13 +3240,13 @@ dhdp->wlfc_borrow_allowed) { _dhd_wlfc_return_credit(ctx, lender, ac); } -#endif +#endif // endif } else { #ifdef LIMIT_BORROW if (lender != -1 && dhdp->wlfc_borrow_allowed) { _dhd_wlfc_return_credit(ctx, lender, ac); } -#endif +#endif // endif bus_retry_count++; if (bus_retry_count >= BUS_RETRIES) { DHD_ERROR(("%s: bus error %d\n", __FUNCTION__, rc)); @@ -3316,7 +3319,7 @@ } else break; -#endif +#endif // endif commit_info.p = _dhd_wlfc_deque_delayedq(ctx, ac, &(commit_info.ac_fifo_credit_spent), &(commit_info.needs_hdr), @@ -3326,7 +3329,7 @@ /* before borrow only one ac exists and now this only ac is empty */ #ifdef LIMIT_BORROW _dhd_wlfc_return_credit(ctx, lender, ac); -#endif +#endif // endif break; } @@ -3342,16 +3345,16 @@ if (commit_info.ac_fifo_credit_spent) { #ifndef LIMIT_BORROW ctx->FIFO_credit[ac]--; -#endif +#endif // endif } else { #ifdef LIMIT_BORROW _dhd_wlfc_return_credit(ctx, lender, ac); -#endif +#endif // endif } } else { #ifdef LIMIT_BORROW _dhd_wlfc_return_credit(ctx, lender, ac); -#endif +#endif // endif bus_retry_count++; if (bus_retry_count >= BUS_RETRIES) { DHD_ERROR(("%s: bus error %d\n", __FUNCTION__, rc)); @@ -3414,16 +3417,6 @@ } ctx = (athost_wl_status_info_t*)dhdp->wlfc_state; - -#ifdef BCMDBUS - if (!dhdp->up || (dhdp->busstate == DHD_BUS_DOWN)) { - if (pktbuf) { - PKTFREE(ctx->osh, pktbuf, TRUE); - rc = BCME_OK; - } - goto exit; - } -#endif if (dhdp->proptxstatus_module_ignore) { if (pktbuf) { @@ -3503,7 +3496,7 @@ if (DHD_PKTTAG_SIGNALONLY(PKTTAG(txp))) { #ifdef PROP_TXSTATUS_DEBUG wlfc->stats.signal_only_pkts_freed++; -#endif +#endif // endif /* is this a signal-only packet? */ _dhd_wlfc_pullheader(wlfc, txp); PKTFREE(wlfc->osh, txp, TRUE); @@ -3546,7 +3539,6 @@ } } - ASSERT(entry->onbus_pkts_count > 0); if (entry->onbus_pkts_count > 0) entry->onbus_pkts_count--; if (entry->suppressed && @@ -3585,7 +3577,6 @@ WLFC_FLAGS_HOST_PROPTXSTATUS_ACTIVE | WLFC_FLAGS_HOST_RXRERODER_ACTIVE; - /* try to enable/disable signaling by sending "tlv" iovar. if that fails, fallback to no flow control? Print a message for now. @@ -3610,18 +3601,10 @@ DHD_INFO(("%s: query wlfc_mode succeed, fw_caps=0x%x\n", __FUNCTION__, fw_caps)); if (WLFC_IS_OLD_DEF(fw_caps)) { -#ifdef BCMDBUS - mode = WLFC_MODE_HANGER; -#else /* enable proptxtstatus v2 by default */ mode = WLFC_MODE_AFQ; -#endif /* BCMDBUS */ } else { WLFC_SET_AFQ(mode, WLFC_GET_AFQ(fw_caps)); -#ifdef BCMDBUS - WLFC_SET_AFQ(mode, 0); -#endif /* BCMDBUS */ - WLFC_SET_REUSESEQ(mode, WLFC_GET_REUSESEQ(fw_caps)); WLFC_SET_REORDERSUPP(mode, WLFC_GET_REORDERSUPP(fw_caps)); } ret = dhd_wl_ioctl_set_intiovar(dhd, "wlfc_mode", mode, WLC_SET_VAR, TRUE, 0); @@ -3641,7 +3624,7 @@ DHD_INFO(("dhd_wlfc_init(): wlfc_mode=0x%x, ret=%d\n", dhd->wlfc_mode, ret)); #ifdef LIMIT_BORROW dhd->wlfc_borrow_allowed = TRUE; -#endif +#endif // endif dhd_os_wlfc_unblock(dhd); if (dhd->plat_init) @@ -3701,9 +3684,7 @@ return WLFC_UNSUPPORTED; } -#ifndef BCMDBUS _dhd_wlfc_cleanup_txq(dhd, fn, arg); -#endif /* !BCMDBUS */ dhd_os_wlfc_unblock(dhd); @@ -3794,7 +3775,6 @@ _dhd_wlfc_hanger_delete(dhd, h); } - /* free top structure */ DHD_OS_PREFREE(dhd, dhd->wlfc_state, sizeof(athost_wl_status_info_t)); @@ -3862,8 +3842,7 @@ #ifdef LIMIT_BORROW int dhd_wlfc_disable_credit_borrow_event(dhd_pub_t *dhdp, uint8* event_data) { - int rc; - if (dhdp == NULL) { + if (dhdp == NULL || event_data == NULL) { DHD_ERROR(("Error: %s():%d\n", __FUNCTION__, __LINE__)); return BCME_BADARG; } @@ -3871,7 +3850,7 @@ dhdp->wlfc_borrow_allowed = (bool)(*(uint32 *)event_data); dhd_os_wlfc_unblock(dhdp); - return rc; + return BCME_OK; } #endif /* LIMIT_BORROW */ @@ -3987,10 +3966,9 @@ ea = interfaces[i].ea; bcm_bprintf(strbuf, "INTERFACE[%d].ea = " - "[%02x:%02x:%02x:%02x:%02x:%02x], if:%d, type: %s " + "["MACDBG"], if:%d, type: %s " "netif_flow_control:%s\n", i, - ea[0], ea[1], ea[2], ea[3], ea[4], ea[5], - interfaces[i].interface_id, + MAC2STRDBG(ea), interfaces[i].interface_id, iftype_desc, ((wlfc->hostif_flow_state[i] == OFF) ? " OFF":" ON")); @@ -3998,7 +3976,7 @@ "(trans,supp_trans,onbus)" "= (%d,%s,%d),(%d,%d,%d)\n", i, - interfaces[i].psq.len, + interfaces[i].psq.n_pkts_tot, ((interfaces[i].state == WLFC_STATE_OPEN) ? "OPEN":"CLOSE"), interfaces[i].requested_credit, @@ -4011,21 +3989,21 @@ "(delay3,sup3,afq3),(delay4,sup4,afq4) = (%d,%d,%d)," "(%d,%d,%d),(%d,%d,%d),(%d,%d,%d),(%d,%d,%d)\n", i, - interfaces[i].psq.q[0].len, - interfaces[i].psq.q[1].len, - interfaces[i].afq.q[0].len, - interfaces[i].psq.q[2].len, - interfaces[i].psq.q[3].len, - interfaces[i].afq.q[1].len, - interfaces[i].psq.q[4].len, - interfaces[i].psq.q[5].len, - interfaces[i].afq.q[2].len, - interfaces[i].psq.q[6].len, - interfaces[i].psq.q[7].len, - interfaces[i].afq.q[3].len, - interfaces[i].psq.q[8].len, - interfaces[i].psq.q[9].len, - interfaces[i].afq.q[4].len); + interfaces[i].psq.q[0].n_pkts, + interfaces[i].psq.q[1].n_pkts, + interfaces[i].afq.q[0].n_pkts, + interfaces[i].psq.q[2].n_pkts, + interfaces[i].psq.q[3].n_pkts, + interfaces[i].afq.q[1].n_pkts, + interfaces[i].psq.q[4].n_pkts, + interfaces[i].psq.q[5].n_pkts, + interfaces[i].afq.q[2].n_pkts, + interfaces[i].psq.q[6].n_pkts, + interfaces[i].psq.q[7].n_pkts, + interfaces[i].afq.q[3].n_pkts, + interfaces[i].psq.q[8].n_pkts, + interfaces[i].psq.q[9].n_pkts, + interfaces[i].afq.q[4].n_pkts); } } @@ -4034,15 +4012,14 @@ if (mac_table[i].occupied) { ea = mac_table[i].ea; bcm_bprintf(strbuf, "MAC_table[%d].ea = " - "[%02x:%02x:%02x:%02x:%02x:%02x], if:%d \n", i, - ea[0], ea[1], ea[2], ea[3], ea[4], ea[5], - mac_table[i].interface_id); + "["MACDBG"], if:%d \n", i, + MAC2STRDBG(ea), mac_table[i].interface_id); bcm_bprintf(strbuf, "MAC_table[%d].PSQ(len,state,credit)," "(trans,supp_trans,onbus)" "= (%d,%s,%d),(%d,%d,%d)\n", i, - mac_table[i].psq.len, + mac_table[i].psq.n_pkts_tot, ((mac_table[i].state == WLFC_STATE_OPEN) ? " OPEN":"CLOSE"), mac_table[i].requested_credit, @@ -4052,27 +4029,27 @@ #ifdef PROP_TXSTATUS_DEBUG bcm_bprintf(strbuf, "MAC_table[%d]: (opened, closed) = (%d, %d)\n", i, mac_table[i].opened_ct, mac_table[i].closed_ct); -#endif +#endif // endif bcm_bprintf(strbuf, "MAC_table[%d].PSQ" "(delay0,sup0,afq0),(delay1,sup1,afq1),(delay2,sup2,afq2)," "(delay3,sup3,afq3),(delay4,sup4,afq4) =(%d,%d,%d)," "(%d,%d,%d),(%d,%d,%d),(%d,%d,%d),(%d,%d,%d)\n", i, - mac_table[i].psq.q[0].len, - mac_table[i].psq.q[1].len, - mac_table[i].afq.q[0].len, - mac_table[i].psq.q[2].len, - mac_table[i].psq.q[3].len, - mac_table[i].afq.q[1].len, - mac_table[i].psq.q[4].len, - mac_table[i].psq.q[5].len, - mac_table[i].afq.q[2].len, - mac_table[i].psq.q[6].len, - mac_table[i].psq.q[7].len, - mac_table[i].afq.q[3].len, - mac_table[i].psq.q[8].len, - mac_table[i].psq.q[9].len, - mac_table[i].afq.q[4].len); + mac_table[i].psq.q[0].n_pkts, + mac_table[i].psq.q[1].n_pkts, + mac_table[i].afq.q[0].n_pkts, + mac_table[i].psq.q[2].n_pkts, + mac_table[i].psq.q[3].n_pkts, + mac_table[i].afq.q[1].n_pkts, + mac_table[i].psq.q[4].n_pkts, + mac_table[i].psq.q[5].n_pkts, + mac_table[i].afq.q[2].n_pkts, + mac_table[i].psq.q[6].n_pkts, + mac_table[i].psq.q[7].n_pkts, + mac_table[i].afq.q[3].n_pkts, + mac_table[i].psq.q[8].n_pkts, + mac_table[i].psq.q[9].n_pkts, + mac_table[i].afq.q[4].n_pkts); } } @@ -4164,9 +4141,10 @@ } #endif /* PROP_TXSTATUS_DEBUG */ bcm_bprintf(strbuf, "\n"); - bcm_bprintf(strbuf, "wlfc- pkt((in,2bus,txstats,hdrpull,out),(dropped,hdr_only,wlc_tossed)" + bcm_bprintf(strbuf, "wlfc- pkt((in,2bus,txstats,hdrpull,out)," + "(dropped,hdr_only,wlc_tossed,wlc_dropped,wlc_exptime)" "(freed,free_err,rollback)) = " - "((%d,%d,%d,%d,%d),(%d,%d,%d),(%d,%d,%d))\n", + "((%d,%d,%d,%d,%d),(%d,%d,%d,%d,%d),(%d,%d,%d))\n", wlfc->stats.pktin, wlfc->stats.pkt2bus, wlfc->stats.txstatus_in, @@ -4176,6 +4154,8 @@ wlfc->stats.pktdropped, wlfc->stats.wlfc_header_only_pkt, wlfc->stats.wlc_tossed_pkts, + wlfc->stats.pkt_dropped, + wlfc->stats.pkt_exptime, wlfc->stats.pkt_freed, wlfc->stats.pkt_free_err, wlfc->stats.rollback); @@ -4362,10 +4342,6 @@ dhd_os_wlfc_unblock(dhdp); } -#if defined(DHD_WLFC_THREAD) - _dhd_wlfc_thread_wakeup(dhd); -#endif /* defined(DHD_WLFC_THREAD) */ - return BCME_OK; } @@ -4459,6 +4435,11 @@ __FUNCTION__, tlv)); } } + +#if defined(DHD_WLFC_THREAD) + _dhd_wlfc_thread_wakeup(dhd); +#endif /* defined(DHD_WLFC_THREAD) */ + return BCME_OK; } -- Gitblit v1.6.2