qcacmn: Add HTC Credit History Feature flag
Add compilation flag to compile out HTC credit History feature cleanly from the cld-3.2 driver binary Change-Id: I615f0e4d6de150924b99b3444cebf00571ddc088 CRs-Fixed: 2190546
This commit is contained in:
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "htc_debug.h"
|
#include "htc_debug.h"
|
||||||
#include "htc_internal.h"
|
#include "htc_internal.h"
|
||||||
|
#include "htc_credit_history.h"
|
||||||
#include <hif.h>
|
#include <hif.h>
|
||||||
#include <qdf_nbuf.h> /* qdf_nbuf_t */
|
#include <qdf_nbuf.h> /* qdf_nbuf_t */
|
||||||
#include <qdf_types.h> /* qdf_print */
|
#include <qdf_types.h> /* qdf_print */
|
||||||
@@ -274,10 +275,10 @@ HTC_HANDLE htc_create(void *ol_sc, struct htc_init_info *pInfo,
|
|||||||
}
|
}
|
||||||
|
|
||||||
htc_runtime_pm_init(target);
|
htc_runtime_pm_init(target);
|
||||||
|
htc_credit_history_init();
|
||||||
qdf_spinlock_create(&target->HTCLock);
|
qdf_spinlock_create(&target->HTCLock);
|
||||||
qdf_spinlock_create(&target->HTCRxLock);
|
qdf_spinlock_create(&target->HTCRxLock);
|
||||||
qdf_spinlock_create(&target->HTCTxLock);
|
qdf_spinlock_create(&target->HTCTxLock);
|
||||||
qdf_spinlock_create(&target->HTCCreditLock);
|
|
||||||
for (i = 0; i < ENDPOINT_MAX; i++) {
|
for (i = 0; i < ENDPOINT_MAX; i++) {
|
||||||
pEndpoint = &target->endpoint[i];
|
pEndpoint = &target->endpoint[i];
|
||||||
qdf_spinlock_create(&pEndpoint->lookup_queue_lock);
|
qdf_spinlock_create(&pEndpoint->lookup_queue_lock);
|
||||||
|
@@ -815,9 +815,24 @@ void htc_set_wmi_endpoint_count(HTC_HANDLE htc_handle, uint8_t wmi_ep_count);
|
|||||||
*/
|
*/
|
||||||
uint8_t htc_get_wmi_endpoint_count(HTC_HANDLE htc_handle);
|
uint8_t htc_get_wmi_endpoint_count(HTC_HANDLE htc_handle);
|
||||||
|
|
||||||
#ifdef WMI_INTERFACE_EVENT_LOGGING
|
/**
|
||||||
|
* htc_print_credit_history: print HTC credit history in buffer
|
||||||
|
* @htc: HTC handle
|
||||||
|
* @count: Number of lines to be copied
|
||||||
|
* @print: Print callback to print in the buffer
|
||||||
|
* @print_priv: any data required by the print method, e.g. a file handle
|
||||||
|
*
|
||||||
|
* return: None
|
||||||
|
*/
|
||||||
|
#ifdef FEATURE_HTC_CREDIT_HISTORY
|
||||||
void htc_print_credit_history(HTC_HANDLE htc, uint32_t count,
|
void htc_print_credit_history(HTC_HANDLE htc, uint32_t count,
|
||||||
qdf_abstract_print * print, void *print_priv);
|
qdf_abstract_print * print, void *print_priv);
|
||||||
|
#else
|
||||||
|
static inline
|
||||||
|
void htc_print_credit_history(HTC_HANDLE htc, uint32_t count,
|
||||||
|
qdf_abstract_print *print, void *print_priv)
|
||||||
|
{
|
||||||
|
print(print_priv, "HTC Credit History Feature is disabled");
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _HTC_API_H_ */
|
#endif /* _HTC_API_H_ */
|
||||||
|
146
htc/htc_credit_history.c
Normal file
146
htc/htc_credit_history.c
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
|
* above copyright notice and this permission notice appear in all
|
||||||
|
* copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
|
||||||
|
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
||||||
|
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||||
|
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||||
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was originally distributed by Qualcomm Atheros, Inc.
|
||||||
|
* under proprietary terms before Copyright ownership was assigned
|
||||||
|
* to the Linux Foundation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "htc_debug.h"
|
||||||
|
#include "htc_internal.h"
|
||||||
|
#include "htc_credit_history.h"
|
||||||
|
#include <qdf_lock.h>
|
||||||
|
|
||||||
|
struct HTC_CREDIT_HISTORY {
|
||||||
|
enum htc_credit_exchange_type type;
|
||||||
|
uint64_t time;
|
||||||
|
uint32_t tx_credit;
|
||||||
|
uint32_t htc_tx_queue_depth;
|
||||||
|
};
|
||||||
|
|
||||||
|
static qdf_spinlock_t g_htc_credit_lock;
|
||||||
|
static uint32_t g_htc_credit_history_idx;
|
||||||
|
static uint32_t g_htc_credit_history_length;
|
||||||
|
static
|
||||||
|
struct HTC_CREDIT_HISTORY htc_credit_history_buffer[HTC_CREDIT_HISTORY_MAX];
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef QCA_WIFI_NAPIER_EMULATION
|
||||||
|
#define HTC_EMULATION_DELAY_IN_MS 20
|
||||||
|
/**
|
||||||
|
* htc_add_delay(): Adds a delay in before proceeding, only for emulation
|
||||||
|
*
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
static inline void htc_add_emulation_delay(void)
|
||||||
|
{
|
||||||
|
qdf_mdelay(HTC_EMULATION_DELAY_IN_MS);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void htc_add_emulation_delay(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void htc_credit_history_init(void)
|
||||||
|
{
|
||||||
|
qdf_spinlock_create(&g_htc_credit_lock);
|
||||||
|
g_htc_credit_history_idx = 0;
|
||||||
|
g_htc_credit_history_length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* htc_credit_record() - records tx que state & credit transactions
|
||||||
|
* @type: type of echange can be HTC_REQUEST_CREDIT
|
||||||
|
* or HTC_PROCESS_CREDIT_REPORT
|
||||||
|
* @tx_credits: current number of tx_credits
|
||||||
|
* @htc_tx_queue_depth: current hct tx queue depth
|
||||||
|
*
|
||||||
|
* This function records the credits and pending commands whenever a command is
|
||||||
|
* sent or credits are returned. Call this after the credits have been updated
|
||||||
|
* according to the transaction. Call this before dequeing commands.
|
||||||
|
*
|
||||||
|
* Consider making this function accept an HTC_ENDPOINT and find the current
|
||||||
|
* credits and queue depth itself.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void htc_credit_record(enum htc_credit_exchange_type type, uint32_t tx_credit,
|
||||||
|
uint32_t htc_tx_queue_depth)
|
||||||
|
{
|
||||||
|
qdf_spin_lock_bh(&g_htc_credit_lock);
|
||||||
|
if (g_htc_credit_history_idx >= HTC_CREDIT_HISTORY_MAX)
|
||||||
|
g_htc_credit_history_idx = 0;
|
||||||
|
|
||||||
|
htc_credit_history_buffer[g_htc_credit_history_idx].type = type;
|
||||||
|
htc_credit_history_buffer[g_htc_credit_history_idx].time =
|
||||||
|
qdf_get_log_timestamp();
|
||||||
|
htc_credit_history_buffer[g_htc_credit_history_idx].tx_credit =
|
||||||
|
tx_credit;
|
||||||
|
htc_credit_history_buffer[g_htc_credit_history_idx].htc_tx_queue_depth =
|
||||||
|
htc_tx_queue_depth;
|
||||||
|
|
||||||
|
g_htc_credit_history_idx++;
|
||||||
|
g_htc_credit_history_length++;
|
||||||
|
htc_add_emulation_delay();
|
||||||
|
qdf_spin_unlock_bh(&g_htc_credit_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void htc_print_credit_history(HTC_HANDLE htc, uint32_t count,
|
||||||
|
qdf_abstract_print *print, void *print_priv)
|
||||||
|
{
|
||||||
|
uint32_t idx;
|
||||||
|
|
||||||
|
print(print_priv, "HTC Credit History (count %u)", count);
|
||||||
|
qdf_spin_lock_bh(&g_htc_credit_lock);
|
||||||
|
|
||||||
|
if (count > HTC_CREDIT_HISTORY_MAX)
|
||||||
|
count = HTC_CREDIT_HISTORY_MAX;
|
||||||
|
if (count > g_htc_credit_history_length)
|
||||||
|
count = g_htc_credit_history_length;
|
||||||
|
|
||||||
|
/* subtract count from index, and wrap if necessary */
|
||||||
|
idx = HTC_CREDIT_HISTORY_MAX + g_htc_credit_history_idx - count;
|
||||||
|
idx %= HTC_CREDIT_HISTORY_MAX;
|
||||||
|
|
||||||
|
print(print_priv,
|
||||||
|
"Time (seconds) Type Credits Queue Depth");
|
||||||
|
while (count) {
|
||||||
|
struct HTC_CREDIT_HISTORY *hist =
|
||||||
|
&htc_credit_history_buffer[idx];
|
||||||
|
uint64_t secs, usecs;
|
||||||
|
|
||||||
|
qdf_log_timestamp_to_secs(hist->time, &secs, &usecs);
|
||||||
|
print(print_priv, "% 8lld.%06lld %-25s %-7.d %d",
|
||||||
|
secs,
|
||||||
|
usecs,
|
||||||
|
htc_credit_exchange_type_str(hist->type),
|
||||||
|
hist->tx_credit,
|
||||||
|
hist->htc_tx_queue_depth);
|
||||||
|
|
||||||
|
--count;
|
||||||
|
++idx;
|
||||||
|
if (idx >= HTC_CREDIT_HISTORY_MAX)
|
||||||
|
idx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
qdf_spin_unlock_bh(&g_htc_credit_lock);
|
||||||
|
}
|
57
htc/htc_credit_history.h
Normal file
57
htc/htc_credit_history.h
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
|
||||||
|
*
|
||||||
|
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
|
* above copyright notice and this permission notice appear in all
|
||||||
|
* copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
|
||||||
|
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
|
||||||
|
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||||
|
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||||
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
* PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file was originally distributed by Qualcomm Atheros, Inc.
|
||||||
|
* under proprietary terms before Copyright ownership was assigned
|
||||||
|
* to the Linux Foundation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HTC_CREDIT_HISTORY_H_
|
||||||
|
#define _HTC_CREDIT_HISTORY_H_
|
||||||
|
|
||||||
|
#include "htc_internal.h"
|
||||||
|
|
||||||
|
#ifdef FEATURE_HTC_CREDIT_HISTORY
|
||||||
|
|
||||||
|
/**
|
||||||
|
* htc_credit_history_init(): Init helper function to initialize HTC credit
|
||||||
|
* history buffers and variable.
|
||||||
|
* Return: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void htc_credit_history_init(void);
|
||||||
|
void htc_credit_record(enum htc_credit_exchange_type type, uint32_t tx_credit,
|
||||||
|
uint32_t htc_tx_queue_depth);
|
||||||
|
|
||||||
|
#else /* FEATURE_HTC_CREDIT_HISTORY */
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void htc_credit_history_init(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline
|
||||||
|
void htc_credit_record(enum htc_credit_exchange_type type, uint32_t tx_credit,
|
||||||
|
uint32_t htc_tx_queue_depth)
|
||||||
|
{ }
|
||||||
|
#endif /* FEATURE_HTC_CREDIT_HISTORY */
|
||||||
|
#endif /* _HTC_CREDIT_HISTORY_H_ */
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
|
||||||
*
|
*
|
||||||
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
|
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
|
||||||
*
|
*
|
||||||
@@ -118,13 +118,6 @@ htc_credit_exchange_type_str(enum htc_credit_exchange_type type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct HTC_CREDIT_HISTORY {
|
|
||||||
enum htc_credit_exchange_type type;
|
|
||||||
uint64_t time;
|
|
||||||
uint32_t tx_credit;
|
|
||||||
uint32_t htc_tx_queue_depth;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct _HTC_ENDPOINT {
|
typedef struct _HTC_ENDPOINT {
|
||||||
HTC_ENDPOINT_ID Id;
|
HTC_ENDPOINT_ID Id;
|
||||||
|
|
||||||
@@ -275,8 +268,6 @@ do { \
|
|||||||
#define UNLOCK_HTC_RX(t) qdf_spin_unlock_bh(&(t)->HTCRxLock)
|
#define UNLOCK_HTC_RX(t) qdf_spin_unlock_bh(&(t)->HTCRxLock)
|
||||||
#define LOCK_HTC_TX(t) qdf_spin_lock_bh(&(t)->HTCTxLock)
|
#define LOCK_HTC_TX(t) qdf_spin_lock_bh(&(t)->HTCTxLock)
|
||||||
#define UNLOCK_HTC_TX(t) qdf_spin_unlock_bh(&(t)->HTCTxLock)
|
#define UNLOCK_HTC_TX(t) qdf_spin_unlock_bh(&(t)->HTCTxLock)
|
||||||
#define LOCK_HTC_CREDIT(t) qdf_spin_lock_bh(&(t)->HTCCreditLock)
|
|
||||||
#define UNLOCK_HTC_CREDIT(t) qdf_spin_unlock_bh(&(t)->HTCCreditLock)
|
|
||||||
#define LOCK_HTC_EP_TX_LOOKUP(t) qdf_spin_lock_bh(&(t)->lookup_queue_lock)
|
#define LOCK_HTC_EP_TX_LOOKUP(t) qdf_spin_lock_bh(&(t)->lookup_queue_lock)
|
||||||
#define UNLOCK_HTC_EP_TX_LOOKUP(t) qdf_spin_unlock_bh(&(t)->lookup_queue_lock)
|
#define UNLOCK_HTC_EP_TX_LOOKUP(t) qdf_spin_unlock_bh(&(t)->lookup_queue_lock)
|
||||||
|
|
||||||
@@ -328,9 +319,6 @@ void htc_send_complete_check_cleanup(void *context);
|
|||||||
void htc_kick_queues(void *context);
|
void htc_kick_queues(void *context);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void htc_credit_record(enum htc_credit_exchange_type type, uint32_t tx_credit,
|
|
||||||
uint32_t htc_tx_queue_depth);
|
|
||||||
|
|
||||||
static inline void htc_send_complete_poll_timer_stop(HTC_ENDPOINT *
|
static inline void htc_send_complete_poll_timer_stop(HTC_ENDPOINT *
|
||||||
pEndpoint) {
|
pEndpoint) {
|
||||||
LOCK_HTC_TX(pEndpoint->target);
|
LOCK_HTC_TX(pEndpoint->target);
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "htc_debug.h"
|
#include "htc_debug.h"
|
||||||
#include "htc_internal.h"
|
#include "htc_internal.h"
|
||||||
|
#include "htc_credit_history.h"
|
||||||
#include <qdf_nbuf.h> /* qdf_nbuf_t */
|
#include <qdf_nbuf.h> /* qdf_nbuf_t */
|
||||||
|
|
||||||
/* HTC Control message receive timeout msec */
|
/* HTC Control message receive timeout msec */
|
||||||
@@ -428,12 +429,10 @@ QDF_STATUS htc_rx_completion_handler(void *Context, qdf_nbuf_t netbuf,
|
|||||||
case HTC_MSG_WAKEUP_FROM_SUSPEND_ID:
|
case HTC_MSG_WAKEUP_FROM_SUSPEND_ID:
|
||||||
AR_DEBUG_PRINTF(ATH_DEBUG_ANY,
|
AR_DEBUG_PRINTF(ATH_DEBUG_ANY,
|
||||||
("Received initial wake up"));
|
("Received initial wake up"));
|
||||||
LOCK_HTC_CREDIT(target);
|
|
||||||
htc_credit_record(HTC_INITIAL_WAKE_UP,
|
htc_credit_record(HTC_INITIAL_WAKE_UP,
|
||||||
pEndpoint->TxCredits,
|
pEndpoint->TxCredits,
|
||||||
HTC_PACKET_QUEUE_DEPTH(
|
HTC_PACKET_QUEUE_DEPTH(
|
||||||
&pEndpoint->TxQueue));
|
&pEndpoint->TxQueue));
|
||||||
UNLOCK_HTC_CREDIT(target);
|
|
||||||
info = &target->HTCInitInfo;
|
info = &target->HTCInitInfo;
|
||||||
if (info && info->target_initial_wakeup_cb)
|
if (info && info->target_initial_wakeup_cb)
|
||||||
info->target_initial_wakeup_cb(
|
info->target_initial_wakeup_cb(
|
||||||
@@ -445,12 +444,10 @@ QDF_STATUS htc_rx_completion_handler(void *Context, qdf_nbuf_t netbuf,
|
|||||||
#endif
|
#endif
|
||||||
case HTC_MSG_SEND_SUSPEND_COMPLETE:
|
case HTC_MSG_SEND_SUSPEND_COMPLETE:
|
||||||
wow_nack = false;
|
wow_nack = false;
|
||||||
LOCK_HTC_CREDIT(target);
|
|
||||||
htc_credit_record(HTC_SUSPEND_ACK,
|
htc_credit_record(HTC_SUSPEND_ACK,
|
||||||
pEndpoint->TxCredits,
|
pEndpoint->TxCredits,
|
||||||
HTC_PACKET_QUEUE_DEPTH(
|
HTC_PACKET_QUEUE_DEPTH(
|
||||||
&pEndpoint->TxQueue));
|
&pEndpoint->TxQueue));
|
||||||
UNLOCK_HTC_CREDIT(target);
|
|
||||||
target->HTCInitInfo.TargetSendSuspendComplete(
|
target->HTCInitInfo.TargetSendSuspendComplete(
|
||||||
target->HTCInitInfo.target_psoc,
|
target->HTCInitInfo.target_psoc,
|
||||||
wow_nack);
|
wow_nack);
|
||||||
@@ -458,13 +455,10 @@ QDF_STATUS htc_rx_completion_handler(void *Context, qdf_nbuf_t netbuf,
|
|||||||
break;
|
break;
|
||||||
case HTC_MSG_NACK_SUSPEND:
|
case HTC_MSG_NACK_SUSPEND:
|
||||||
wow_nack = true;
|
wow_nack = true;
|
||||||
LOCK_HTC_CREDIT(target);
|
|
||||||
htc_credit_record(HTC_SUSPEND_ACK,
|
htc_credit_record(HTC_SUSPEND_ACK,
|
||||||
pEndpoint->TxCredits,
|
pEndpoint->TxCredits,
|
||||||
HTC_PACKET_QUEUE_DEPTH(
|
HTC_PACKET_QUEUE_DEPTH(
|
||||||
&pEndpoint->TxQueue));
|
&pEndpoint->TxQueue));
|
||||||
UNLOCK_HTC_CREDIT(target);
|
|
||||||
|
|
||||||
target->HTCInitInfo.TargetSendSuspendComplete(
|
target->HTCInitInfo.TargetSendSuspendComplete(
|
||||||
target->HTCInitInfo.target_psoc,
|
target->HTCInitInfo.target_psoc,
|
||||||
wow_nack);
|
wow_nack);
|
||||||
|
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "htc_debug.h"
|
#include "htc_debug.h"
|
||||||
#include "htc_internal.h"
|
#include "htc_internal.h"
|
||||||
|
#include "htc_credit_history.h"
|
||||||
#include <qdf_mem.h> /* qdf_mem_malloc */
|
#include <qdf_mem.h> /* qdf_mem_malloc */
|
||||||
#include <qdf_nbuf.h> /* qdf_nbuf_t */
|
#include <qdf_nbuf.h> /* qdf_nbuf_t */
|
||||||
#include "qdf_module.h"
|
#include "qdf_module.h"
|
||||||
@@ -53,11 +54,6 @@ static unsigned int ep_debug_mask =
|
|||||||
(1 << ENDPOINT_0) | (1 << ENDPOINT_1) | (1 << ENDPOINT_2);
|
(1 << ENDPOINT_0) | (1 << ENDPOINT_1) | (1 << ENDPOINT_2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* HTC Control Path Credit History */
|
|
||||||
uint32_t g_htc_credit_history_idx;
|
|
||||||
uint32_t g_htc_credit_history_length;
|
|
||||||
struct HTC_CREDIT_HISTORY htc_credit_history_buffer[HTC_CREDIT_HISTORY_MAX];
|
|
||||||
|
|
||||||
#ifdef QCA_WIFI_NAPIER_EMULATION
|
#ifdef QCA_WIFI_NAPIER_EMULATION
|
||||||
#define HTC_EMULATION_DELAY_IN_MS 20
|
#define HTC_EMULATION_DELAY_IN_MS 20
|
||||||
/**
|
/**
|
||||||
@@ -75,84 +71,6 @@ static inline void htc_add_emulation_delay(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
|
||||||
* htc_credit_record() - records tx que state & credit transactions
|
|
||||||
* @type: type of echange can be HTC_REQUEST_CREDIT
|
|
||||||
* or HTC_PROCESS_CREDIT_REPORT
|
|
||||||
* @tx_credits: current number of tx_credits
|
|
||||||
* @htc_tx_queue_depth: current hct tx queue depth
|
|
||||||
*
|
|
||||||
* This function records the credits and pending commands whenever a command is
|
|
||||||
* sent or credits are returned. Call this after the credits have been updated
|
|
||||||
* according to the transaction. Call this before dequeing commands.
|
|
||||||
*
|
|
||||||
* Consider making this function accept an HTC_ENDPOINT and find the current
|
|
||||||
* credits and queue depth itself.
|
|
||||||
*
|
|
||||||
* Consider moving the LOCK_HTC_CREDIT(target); logic into this func as well
|
|
||||||
*/
|
|
||||||
void htc_credit_record(enum htc_credit_exchange_type type, uint32_t tx_credit,
|
|
||||||
uint32_t htc_tx_queue_depth) {
|
|
||||||
if (HTC_CREDIT_HISTORY_MAX <= g_htc_credit_history_idx)
|
|
||||||
g_htc_credit_history_idx = 0;
|
|
||||||
|
|
||||||
htc_credit_history_buffer[g_htc_credit_history_idx].type = type;
|
|
||||||
htc_credit_history_buffer[g_htc_credit_history_idx].time =
|
|
||||||
qdf_get_log_timestamp();
|
|
||||||
htc_credit_history_buffer[g_htc_credit_history_idx].tx_credit =
|
|
||||||
tx_credit;
|
|
||||||
htc_credit_history_buffer[g_htc_credit_history_idx].htc_tx_queue_depth =
|
|
||||||
htc_tx_queue_depth;
|
|
||||||
|
|
||||||
g_htc_credit_history_idx++;
|
|
||||||
g_htc_credit_history_length++;
|
|
||||||
htc_add_emulation_delay();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef WMI_INTERFACE_EVENT_LOGGING
|
|
||||||
void htc_print_credit_history(HTC_HANDLE htc, uint32_t count,
|
|
||||||
qdf_abstract_print *print, void *print_priv)
|
|
||||||
{
|
|
||||||
uint32_t idx;
|
|
||||||
HTC_TARGET *target;
|
|
||||||
|
|
||||||
target = GET_HTC_TARGET_FROM_HANDLE(htc);
|
|
||||||
LOCK_HTC_CREDIT(target);
|
|
||||||
|
|
||||||
if (count > HTC_CREDIT_HISTORY_MAX)
|
|
||||||
count = HTC_CREDIT_HISTORY_MAX;
|
|
||||||
if (count > g_htc_credit_history_length)
|
|
||||||
count = g_htc_credit_history_length;
|
|
||||||
|
|
||||||
/* subtract count from index, and wrap if necessary */
|
|
||||||
idx = HTC_CREDIT_HISTORY_MAX + g_htc_credit_history_idx - count;
|
|
||||||
idx %= HTC_CREDIT_HISTORY_MAX;
|
|
||||||
|
|
||||||
print(print_priv,
|
|
||||||
"Time (seconds) Type Credits Queue Depth");
|
|
||||||
while (count) {
|
|
||||||
struct HTC_CREDIT_HISTORY *hist =
|
|
||||||
&htc_credit_history_buffer[idx];
|
|
||||||
uint64_t secs, usecs;
|
|
||||||
|
|
||||||
qdf_log_timestamp_to_secs(hist->time, &secs, &usecs);
|
|
||||||
print(print_priv, "% 8lld.%06lld %-25s %-7.d %d",
|
|
||||||
secs,
|
|
||||||
usecs,
|
|
||||||
htc_credit_exchange_type_str(hist->type),
|
|
||||||
hist->tx_credit,
|
|
||||||
hist->htc_tx_queue_depth);
|
|
||||||
|
|
||||||
--count;
|
|
||||||
++idx;
|
|
||||||
if (idx >= HTC_CREDIT_HISTORY_MAX)
|
|
||||||
idx = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
UNLOCK_HTC_CREDIT(target);
|
|
||||||
}
|
|
||||||
#endif /* WMI_INTERFACE_EVENT_LOGGING */
|
|
||||||
|
|
||||||
void htc_dump_counter_info(HTC_HANDLE HTCHandle)
|
void htc_dump_counter_info(HTC_HANDLE HTCHandle)
|
||||||
{
|
{
|
||||||
HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
|
HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
|
||||||
@@ -909,16 +827,12 @@ static void get_htc_send_packets_credit_based(HTC_TARGET *target,
|
|||||||
pEndpoint->TxCreditsPerMaxMsg) {
|
pEndpoint->TxCreditsPerMaxMsg) {
|
||||||
/* tell the target we need credits ASAP! */
|
/* tell the target we need credits ASAP! */
|
||||||
sendFlags |= HTC_FLAGS_NEED_CREDIT_UPDATE;
|
sendFlags |= HTC_FLAGS_NEED_CREDIT_UPDATE;
|
||||||
|
|
||||||
if (pEndpoint->service_id == WMI_CONTROL_SVC) {
|
if (pEndpoint->service_id == WMI_CONTROL_SVC) {
|
||||||
LOCK_HTC_CREDIT(target);
|
|
||||||
htc_credit_record(HTC_REQUEST_CREDIT,
|
htc_credit_record(HTC_REQUEST_CREDIT,
|
||||||
pEndpoint->TxCredits,
|
pEndpoint->TxCredits,
|
||||||
HTC_PACKET_QUEUE_DEPTH
|
HTC_PACKET_QUEUE_DEPTH
|
||||||
(tx_queue));
|
(tx_queue));
|
||||||
UNLOCK_HTC_CREDIT(target);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
INC_HTC_EP_STAT(pEndpoint,
|
INC_HTC_EP_STAT(pEndpoint,
|
||||||
TxCreditLowIndications, 1);
|
TxCreditLowIndications, 1);
|
||||||
#if DEBUG_CREDIT
|
#if DEBUG_CREDIT
|
||||||
@@ -2241,16 +2155,12 @@ void htc_process_credit_rpt(HTC_TARGET *target, HTC_CREDIT_REPORT *pRpt,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
pEndpoint->TxCredits += rpt_credits;
|
pEndpoint->TxCredits += rpt_credits;
|
||||||
|
|
||||||
if (pEndpoint->service_id == WMI_CONTROL_SVC) {
|
if (pEndpoint->service_id == WMI_CONTROL_SVC) {
|
||||||
LOCK_HTC_CREDIT(target);
|
|
||||||
htc_credit_record(HTC_PROCESS_CREDIT_REPORT,
|
htc_credit_record(HTC_PROCESS_CREDIT_REPORT,
|
||||||
pEndpoint->TxCredits,
|
pEndpoint->TxCredits,
|
||||||
HTC_PACKET_QUEUE_DEPTH(&pEndpoint->
|
HTC_PACKET_QUEUE_DEPTH(&pEndpoint->
|
||||||
TxQueue));
|
TxQueue));
|
||||||
UNLOCK_HTC_CREDIT(target);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pEndpoint->TxCredits
|
if (pEndpoint->TxCredits
|
||||||
&& HTC_PACKET_QUEUE_DEPTH(&pEndpoint->TxQueue)) {
|
&& HTC_PACKET_QUEUE_DEPTH(&pEndpoint->TxQueue)) {
|
||||||
UNLOCK_HTC_TX(target);
|
UNLOCK_HTC_TX(target);
|
||||||
|
Reference in New Issue
Block a user