Merge "qcacmn: Increase scan cancel sync time"

This commit is contained in:
Linux Build Service Account 2017-06-06 14:23:17 -07:00 • committed by Gerrit - the friendly Code Review server
commit 4c48decbce
19 changed files with 641 additions and 322 deletions

View file

@ -1445,8 +1445,8 @@ hif_send_head(struct hif_opaque_softc *hif_ctx,
QDF_NBUF_UPDATE_TX_PKT_COUNT(nbuf, QDF_NBUF_TX_PKT_HIF);
DPTRACE(qdf_dp_trace(nbuf, QDF_DP_TRACE_HIF_PACKET_PTR_RECORD,
qdf_nbuf_data_addr(nbuf),
sizeof(qdf_nbuf_data(nbuf)), QDF_TX));
QDF_TRACE_DEFAULT_PDEV_ID, qdf_nbuf_data_addr(nbuf),
sizeof(qdf_nbuf_data(nbuf)), QDF_TX));
status = ce_sendlist_send(ce_hdl, nbuf, &sendlist, transfer_id);
QDF_ASSERT(status == QDF_STATUS_SUCCESS);

View file

@ -572,6 +572,7 @@ ce_sendlist_send_legacy(struct CE_handle *copyeng,
QDF_NBUF_TX_PKT_CE);
DPTRACE(qdf_dp_trace((qdf_nbuf_t)per_transfer_context,
QDF_DP_TRACE_CE_PACKET_PTR_RECORD,
QDF_TRACE_DEFAULT_PDEV_ID,
(uint8_t *)&(((qdf_nbuf_t)per_transfer_context)->data),
sizeof(((qdf_nbuf_t)per_transfer_context)->data),
QDF_TX));
@ -756,7 +757,7 @@ int ce_send_fast(struct CE_handle *copyeng, qdf_nbuf_t msdu,
DPTRACE(qdf_dp_trace(msdu,
QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD,
qdf_nbuf_data_addr(msdu),
QDF_TRACE_DEFAULT_PDEV_ID, qdf_nbuf_data_addr(msdu),
sizeof(qdf_nbuf_data(msdu)), QDF_TX));
}

View file

@ -206,6 +206,7 @@ ce_sendlist_send_srng(struct CE_handle *copyeng,
QDF_NBUF_TX_PKT_CE);
DPTRACE(qdf_dp_trace((qdf_nbuf_t)per_transfer_context,
QDF_DP_TRACE_CE_PACKET_PTR_RECORD,
QDF_TRACE_DEFAULT_PDEV_ID,
(uint8_t *)(((qdf_nbuf_t)per_transfer_context)->data),
sizeof(((qdf_nbuf_t)per_transfer_context)->data), QDF_TX));
} else {

View file

@ -1636,8 +1636,8 @@ A_STATUS htc_send_data_pkt(HTC_HANDLE HTCHandle, qdf_nbuf_t netbuf, int Epid,
QDF_NBUF_UPDATE_TX_PKT_COUNT(netbuf, QDF_NBUF_TX_PKT_HTC);
DPTRACE(qdf_dp_trace(netbuf, QDF_DP_TRACE_HTC_PACKET_PTR_RECORD,
qdf_nbuf_data_addr(netbuf),
sizeof(qdf_nbuf_data(netbuf)), QDF_TX));
QDF_TRACE_DEFAULT_PDEV_ID, qdf_nbuf_data_addr(netbuf),
sizeof(qdf_nbuf_data(netbuf)), QDF_TX));
status = hif_send_head(target->hif_dev,
pEndpoint->UL_PipeID,
pEndpoint->Id, ActualLength, netbuf, data_attr);
@ -1793,8 +1793,8 @@ A_STATUS htc_send_data_pkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket,
}
QDF_NBUF_UPDATE_TX_PKT_COUNT(netbuf, QDF_NBUF_TX_PKT_HTC);
DPTRACE(qdf_dp_trace(netbuf, QDF_DP_TRACE_HTC_PACKET_PTR_RECORD,
qdf_nbuf_data_addr(netbuf),
sizeof(qdf_nbuf_data(netbuf)), QDF_TX));
QDF_TRACE_DEFAULT_PDEV_ID, qdf_nbuf_data_addr(netbuf),
sizeof(qdf_nbuf_data(netbuf)), QDF_TX));
/* send what we can */
while (true) {

View file

@ -100,6 +100,7 @@
#define QDF_NBUF_TX_PKT_CE 8
#define QDF_NBUF_TX_PKT_FREE 9
#define QDF_NBUF_TX_PKT_STATE_MAX 10
#define QDF_NBUF_TX_PKT_LI_DP 11
/* Enable flag to print TSO specific prints in datapath */
#ifdef TSO_DEBUG_LOG_ENABLE

View file

@ -69,7 +69,17 @@ typedef int (qdf_abstract_print)(void *priv, const char *fmt, ...);
#define QDF_DEBUG_ERROR 0x20
#define QDF_DEBUG_CFG 0x40
/* DP Trace Implementation */
#ifdef CONFIG_DP_TRACE
#define DPTRACE(p) p
#else
#define DPTRACE(p)
#endif
#ifdef CONFIG_MCL
void qdf_trace(uint8_t module, uint8_t code, uint16_t session, uint32_t data);
#endif
/* By default Data Path module will have all log levels enabled, except debug
* log level. Debug level will be left up to the framework or user space modules
@ -84,6 +94,7 @@ typedef int (qdf_abstract_print)(void *priv, const char *fmt, ...);
/* Preprocessor definitions and constants */
#define ASSERT_BUFFER_SIZE (512)
#define QDF_TRACE_DEFAULT_PDEV_ID 0xff
#define MAX_QDF_TRACE_RECORDS 4000
#define INVALID_QDF_TRACE_ADDR 0xffffffff
#define DEFAULT_QDF_TRACE_DUMP_COUNT 0
@ -142,12 +153,6 @@ typedef struct s_qdf_trace_data {
#define CASE_RETURN_STRING(str) case ((str)): return (uint8_t *)(# str);
/* DP Trace Implementation */
#ifdef FEATURE_DP_TRACE
#define DPTRACE(p) p
#else
#define DPTRACE(p)
#endif
#define MAX_QDF_DP_TRACE_RECORDS 4000
#define QDF_DP_TRACE_RECORD_SIZE 16
@ -170,12 +175,14 @@ typedef struct s_qdf_trace_data {
* @QDF_DP_TRACE_HDD_TX_TIMEOUT - HDD tx timeout
* @QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT- SOFTAP HDD tx timeout
* @QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD - HDD layer ptr record
* @QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD - Lithium DP layer ptr record
* @QDF_DP_TRACE_CE_PACKET_PTR_RECORD - CE layer ptr record
* @QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD- CE fastpath ptr record
* @QDF_DP_TRACE_FREE_PACKET_PTR_RECORD - tx completion ptr record
* @QDF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD - HTT RX record
* @QDF_DP_TRACE_RX_OFFLOAD_HTT_PACKET_PTR_RECORD- HTT RX offload record
* @QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD - HDD RX record
* @QDF_DP_TRACE_RX_LI_DP_PACKET_PTR_RECORD - Lithium DP RX record
* @QDF_DP_TRACE_LOW_VERBOSITY - below this are part of low verbosity
* @QDF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD -tx queue ptr record
* @QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD - txrx packet ptr record
@ -187,6 +194,10 @@ typedef struct s_qdf_trace_data {
* @QDF_DP_TRACE_MED_VERBOSITY - below this are part of med verbosity
* @QDF_DP_TRACE_HDD_TX_PACKET_RECORD - record 32 bytes of tx pkt at HDD
* @QDF_DP_TRACE_HDD_RX_PACKET_RECORD - record 32 bytes of rx pkt at HDD
* @QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD - record 32 bytes of tx pkt at LI_DP
* @QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD - record 32 bytes of rx pkt at LI_DP
* @QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD
* - record 32 bytes of rx null_queue pkt at LI_DP
* @QDF_DP_TRACE_HIGH_VERBOSITY - below this are part of high verbosity
*/
enum QDF_DP_TRACE_ID {
@ -201,12 +212,14 @@ enum QDF_DP_TRACE_ID {
QDF_DP_TRACE_HDD_TX_TIMEOUT,
QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT,
QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD,
QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD,
QDF_DP_TRACE_CE_PACKET_PTR_RECORD,
QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD,
QDF_DP_TRACE_FREE_PACKET_PTR_RECORD,
QDF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD,
QDF_DP_TRACE_RX_OFFLOAD_HTT_PACKET_PTR_RECORD,
QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD,
QDF_DP_TRACE_RX_LI_DP_PACKET_PTR_RECORD,
QDF_DP_TRACE_LOW_VERBOSITY,
QDF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD,
QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD,
@ -218,6 +231,9 @@ enum QDF_DP_TRACE_ID {
QDF_DP_TRACE_MED_VERBOSITY,
QDF_DP_TRACE_HDD_TX_PACKET_RECORD,
QDF_DP_TRACE_HDD_RX_PACKET_RECORD,
QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD,
QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD,
QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD,
QDF_DP_TRACE_HIGH_VERBOSITY,
QDF_DP_TRACE_MAX
};
@ -302,6 +318,7 @@ struct qdf_dp_trace_record_s {
uint8_t data[QDF_DP_TRACE_RECORD_SIZE];
uint8_t size;
uint32_t pid;
uint8_t pdev_id;
};
/**
@ -371,7 +388,6 @@ void qdf_register_debug_callback(QDF_MODULE_ID module_id,
tp_qdf_state_info_cb qdf_state_infocb);
QDF_STATUS qdf_state_info_dump_all(char *buf, uint16_t size,
uint16_t *driver_dump_size);
void qdf_trace(uint8_t module, uint8_t code, uint16_t session, uint32_t data);
void qdf_trace_register(QDF_MODULE_ID, tp_qdf_trace_cb);
QDF_STATUS qdf_trace_spin_lock_init(void);
void qdf_trace_init(void);
@ -379,46 +395,56 @@ void qdf_trace_enable(uint32_t, uint8_t enable);
void qdf_trace_dump_all(void *, uint8_t, uint8_t, uint32_t, uint32_t);
#ifdef FEATURE_DP_TRACE
#ifdef CONFIG_DP_TRACE
void qdf_dp_set_proto_bitmap(uint32_t val);
void qdf_dp_trace_set_verbosity(uint32_t val);
void qdf_dp_set_no_of_record(uint32_t val);
void qdf_dp_trace_log_pkt(uint8_t session_id, struct sk_buff *skb,
enum qdf_proto_dir dir);
enum qdf_proto_dir dir, uint8_t pdev_id);
void qdf_dp_trace_init(void);
void qdf_dp_trace_spin_lock_init(void);
void qdf_dp_trace_set_value(uint8_t proto_bitmap, uint8_t no_of_records,
uint8_t verbosity);
void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir);
void qdf_dp_trace(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
void qdf_dp_trace(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code, uint8_t pdev_id,
uint8_t *data, uint8_t size, enum qdf_proto_dir dir);
void qdf_dp_trace_dump_all(uint32_t count);
typedef void (*tp_qdf_dp_trace_cb)(struct qdf_dp_trace_record_s* , uint16_t);
void qdf_dp_trace_dump_all(uint32_t count, uint8_t pdev_id);
typedef void (*tp_qdf_dp_trace_cb)(struct qdf_dp_trace_record_s*,
uint16_t, uint8_t);
void qdf_dp_display_record(struct qdf_dp_trace_record_s *record,
uint16_t index);
uint16_t index, uint8_t pdev_id);
void qdf_dp_trace_ptr(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
uint8_t *data, uint8_t size, uint16_t msdu_id, uint16_t status);
uint8_t pdev_id, uint8_t *data, uint8_t size, uint16_t msdu_id,
uint16_t status);
void qdf_dp_display_ptr_record(struct qdf_dp_trace_record_s *pRecord,
uint16_t recIndex);
uint16_t recIndex, uint8_t pdev_id);
uint8_t qdf_dp_get_proto_bitmap(void);
uint8_t qdf_dp_get_verbosity(void);
uint8_t qdf_dp_get_no_of_record(void);
void
qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
uint8_t *sa, uint8_t *da, enum qdf_proto_type type,
enum qdf_proto_subtype subtype, enum qdf_proto_dir dir);
uint8_t *sa, uint8_t *da, enum qdf_proto_type type,
enum qdf_proto_subtype subtype, enum qdf_proto_dir dir,
uint8_t pdev_id);
void qdf_dp_display_proto_pkt(struct qdf_dp_trace_record_s *record,
uint16_t index);
uint16_t index, uint8_t pdev_id);
void qdf_dp_trace_enable_live_mode(void);
void qdf_dp_trace_clear_buffer(void);
void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
enum qdf_proto_type type, enum qdf_proto_subtype subtype);
uint8_t pdev_id, enum qdf_proto_type type,
enum qdf_proto_subtype subtype);
void qdf_dp_display_mgmt_pkt(struct qdf_dp_trace_record_s *record,
uint16_t index);
uint16_t index, uint8_t pdev_id);
void qdf_dp_display_event_record(struct qdf_dp_trace_record_s *record,
uint16_t index);
uint16_t index, uint8_t pdev_id);
void qdf_dp_trace_record_event(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
enum qdf_proto_type type, enum qdf_proto_subtype subtype);
uint8_t pdev_id, enum qdf_proto_type type,
enum qdf_proto_subtype subtype);
#else
static inline
void qdf_dp_trace_log_pkt(uint8_t session_id, struct sk_buff *skb,
enum qdf_proto_dir dir)
enum qdf_proto_dir dir, uint8_t pdev_id)
{
}
static inline
@ -435,7 +461,7 @@ void qdf_dp_trace_set_value(uint8_t proto_bitmap, uint8_t no_of_records,
{
}
static inline
void qdf_dp_trace_dump_all(uint32_t count)
void qdf_dp_trace_dump_all(uint32_t count, uint8_t pdev_id)
{
}
@ -452,8 +478,6 @@ void qdf_dp_trace_clear_buffer(void)
#endif
void qdf_trace_hex_dump(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
void *data, int buf_len);
void qdf_trace_display(void);
@ -467,14 +491,6 @@ void __printf(3, 4) qdf_snprintf(char *str_buffer, unsigned int size,
#define QDF_SNPRINTF qdf_snprintf
#else
#define DPTRACE(x)
#define qdf_trace_hex_dump(x, y, z, q)
#endif /* CONFIG_MCL */
#ifdef TSOSEG_DEBUG
static inline
int qdf_tso_seg_dbg_record(struct qdf_tso_seg_elem_t *tsoseg,
@ -531,6 +547,9 @@ qdf_tso_seg_dbg_zero(struct qdf_tso_seg_elem_t *tsoseg)
#endif /* TSOSEG_DEBUG */
void qdf_trace_hex_dump(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
void *data, int buf_len);
#define ERROR_CODE -1
#define QDF_MAX_NAME_SIZE 32
#define MAX_PRINT_CONFIG_SUPPORTED 32

View file

@ -394,6 +394,7 @@ typedef enum {
QDF_MODULE_ID_OFFCHAN_TXRX,
QDF_MODULE_ID_SON,
QDF_MODULE_ID_SPECTRAL,
QDF_MODULE_ID_OBJ_MGR,
QDF_MODULE_ID_ANY,
QDF_MODULE_ID_MAX,
} QDF_MODULE_ID;

View file

@ -177,10 +177,26 @@ struct qdf_nbuf_cb {
} extra_frag; /* 19 bytes */
union {
struct {
uint8_t ftype;
uint32_t submit_ts;
union {
struct {
uint8_t packet_state:7,
is_packet_priv:1;
uint8_t packet_track:4,
proto_type:4;
uint8_t dp_trace:1,
is_bcast:1,
is_mcast:1,
packet_type:3,
/* used only for hl*/
htt2_frm:1,
print:1;
uint8_t vdev_id;
} trace; /* 4 bytes */
uint32_t submit_ts;
} u;
void *fctx;
void *vdev_ctx;
uint8_t ftype;
} win; /* 21 bytes*/
struct {
uint32_t data_attr; /* 4 bytes */
@ -281,6 +297,34 @@ struct qdf_nbuf_cb {
((skb)->cb))->u.tx.extra_frag.flags.bits.flag_nbuf)
#define QDF_NBUF_CB_TX_DATA_ATTR(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.mcl.data_attr)
#define QDF_NBUF_UPDATE_TX_PKT_COUNT(skb, PACKET_STATE) \
qdf_nbuf_set_state(skb, PACKET_STATE)
#define QDF_NBUF_CB_TX_IPA_OWNED(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.mcl.ipa.owned)
#define QDF_NBUF_CB_TX_IPA_PRIV(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.mcl.ipa.priv)
#define QDF_NBUF_CB_TX_FTYPE(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.ftype)
#define QDF_NBUF_CB_TX_FCTX(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.fctx)
#define QDF_NBUF_CB_TX_VDEV_CTX(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.vdev_ctx)
#ifndef CONFIG_WIN
#define QDF_NBUF_CB_TX_IS_PACKET_PRIV(skb) \
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.tx.dev.mcl.trace.is_packet_priv)
#define QDF_NBUF_CB_TX_DESC_ID(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.mcl.desc_id)
#define QDF_NBUF_CB_TX_PACKET_STATE(skb) \
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.tx.dev.mcl.trace.packet_state)
@ -290,8 +334,6 @@ struct qdf_nbuf_cb {
#define QDF_NBUF_CB_TX_PROTO_TYPE(skb) \
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.tx.dev.mcl.trace.proto_type)
#define QDF_NBUF_UPDATE_TX_PKT_COUNT(skb, PACKET_STATE) \
qdf_nbuf_set_state(skb, PACKET_STATE)
#define QDF_NBUF_GET_PACKET_TRACK(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.mcl.trace.packet_track)
#define QDF_NBUF_CB_TX_DP_TRACE(skb) \
@ -302,27 +344,77 @@ struct qdf_nbuf_cb {
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.mcl.trace.htt2_frm)
#define QDF_NBUF_CB_TX_VDEV_ID(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.mcl.trace.vdev_id)
#define QDF_NBUF_CB_GET_IS_BCAST(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.mcl.trace.is_bcast)
#define QDF_NBUF_CB_GET_IS_MCAST(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.mcl.trace.is_mcast)
#define QDF_NBUF_CB_GET_PACKET_TYPE(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.mcl.trace.packet_type)
#define QDF_NBUF_CB_TX_IPA_OWNED(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.mcl.ipa.owned)
#define QDF_NBUF_CB_TX_IPA_PRIV(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.mcl.ipa.priv)
#define QDF_NBUF_CB_TX_DESC_ID(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.mcl.desc_id)
#define QDF_NBUF_CB_TX_FTYPE(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.ftype)
#define QDF_NBUF_CB_TX_SUBMIT_TS(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.submit_ts)
#define QDF_NBUF_CB_TX_FCTX(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.fctx)
#define QDF_NBUF_CB_TX_VDEV_CTX(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.vdev_ctx)
#define QDF_NBUF_CB_SET_BCAST(skb) \
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.tx.dev.mcl.trace.is_bcast = true)
#define QDF_NBUF_CB_SET_MCAST(skb) \
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.tx.dev.mcl.trace.is_mcast = true)
#else
#define QDF_NBUF_CB_TX_DESC_ID(skb)\
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.desc_id)
#define QDF_NBUF_CB_TX_PACKET_STATE(skb)\
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.tx.dev.win.u.trace.packet_state)
#define QDF_NBUF_CB_TX_IS_PACKET_PRIV(skb) \
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.tx.dev.win.u.trace.is_packet_priv)
#define QDF_NBUF_CB_TX_PACKET_TRACK(skb)\
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.tx.dev.win.u.trace.packet_track)
#define QDF_NBUF_CB_TX_SUBMIT_TS(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.submit_ts)
#define QDF_NBUF_CB_TX_PROTO_TYPE(skb)\
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.tx.dev.win.u.trace.proto_type)
#define QDF_NBUF_GET_PACKET_TRACK(skb)\
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.trace.packet_track)
#define QDF_NBUF_CB_TX_DP_TRACE(skb)\
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.dp_trace)
#define QDF_NBUF_CB_DP_TRACE_PRINT(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.print)
#define QDF_NBUF_CB_TX_HL_HTT2_FRM(skb) \
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.htt2_frm)
#define QDF_NBUF_CB_TX_VDEV_ID(skb)\
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.vdev_id)
#define QDF_NBUF_CB_GET_IS_BCAST(skb)\
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.is_bcast)
#define QDF_NBUF_CB_GET_IS_MCAST(skb)\
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.is_mcast)
#define QDF_NBUF_CB_GET_PACKET_TYPE(skb)\
(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.win.u.trace.packet_type)
#define QDF_NBUF_CB_SET_BCAST(skb) \
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.tx.dev.win.u.trace.is_bcast = true)
#define QDF_NBUF_CB_SET_MCAST(skb) \
(((struct qdf_nbuf_cb *) \
((skb)->cb))->u.tx.dev.win.u.trace.is_mcast = true)
#endif
/* assume the OS provides a single fragment */
#define __qdf_nbuf_get_num_frags(skb) \
@ -538,6 +630,7 @@ void __qdf_nbuf_frag_info(struct sk_buff *skb, qdf_sglist_t *sg);
QDF_STATUS __qdf_nbuf_frag_map(
qdf_device_t osdev, __qdf_nbuf_t nbuf,
int offset, qdf_dma_dir_t dir, int cur_frag);
void qdf_nbuf_classify_pkt(struct sk_buff *skb);
bool __qdf_nbuf_is_ipv4_wapi_pkt(struct sk_buff *skb);
bool __qdf_nbuf_data_is_ipv4_pkt(uint8_t *data);

View file

@ -95,7 +95,8 @@
/* This code will be used for compilation if tracing is to be compiled out */
/* of the code so these functions/macros are 'do nothing' */
static inline void qdf_trace_msg(QDF_MODULE_ID module, ...)
static inline void qdf_trace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
char *str_format, ...)
{
}

View file

@ -2788,3 +2788,35 @@ void __qdf_nbuf_reg_free_cb(qdf_nbuf_free_t cb_func_ptr)
nbuf_free_cb = cb_func_ptr;
return;
}
/**
* qdf_nbuf_classify_pkt() - classify packet
* @skb - sk buff
*
* Return: none
*/
void qdf_nbuf_classify_pkt(struct sk_buff *skb)
{
struct ethhdr *eh = (struct ethhdr *)skb->data;
qdf_mem_set(skb->cb, sizeof(skb->cb), 0);
/* check destination mac address is broadcast/multicast */
if (is_broadcast_ether_addr((uint8_t *)eh))
QDF_NBUF_CB_SET_BCAST(skb);
else if (is_multicast_ether_addr((uint8_t *)eh))
QDF_NBUF_CB_SET_MCAST(skb);
if (qdf_nbuf_is_ipv4_arp_pkt(skb))
QDF_NBUF_CB_GET_PACKET_TYPE(skb) =
QDF_NBUF_CB_PACKET_TYPE_ARP;
else if (qdf_nbuf_is_ipv4_dhcp_pkt(skb))
QDF_NBUF_CB_GET_PACKET_TYPE(skb) =
QDF_NBUF_CB_PACKET_TYPE_DHCP;
else if (qdf_nbuf_is_ipv4_eapol_pkt(skb))
QDF_NBUF_CB_GET_PACKET_TYPE(skb) =
QDF_NBUF_CB_PACKET_TYPE_EAPOL;
else if (qdf_nbuf_is_ipv4_wapi_pkt(skb))
QDF_NBUF_CB_GET_PACKET_TYPE(skb) =
QDF_NBUF_CB_PACKET_TYPE_WAPI;
}
EXPORT_SYMBOL(qdf_nbuf_classify_pkt);

View file

@ -41,7 +41,6 @@
#include <wlan_logging_sock_svc.h>
#include <qdf_module.h>
static int qdf_pidx = -1;
#ifdef CONFIG_MCL
#include "qdf_time.h"
#include "qdf_mc_timer.h"
@ -110,7 +109,7 @@ static tp_qdf_trace_cb qdf_trace_cb_table[QDF_MODULE_ID_MAX];
static tp_qdf_trace_cb qdf_trace_restore_cb_table[QDF_MODULE_ID_MAX];
static tp_qdf_state_info_cb qdf_state_info_table[QDF_MODULE_ID_MAX];
#ifdef FEATURE_DP_TRACE
#ifdef CONFIG_DP_TRACE
/* Static and Global variables */
static spinlock_t l_dp_trace_lock;
@ -441,6 +440,8 @@ void qdf_trace_init(void)
}
EXPORT_SYMBOL(qdf_trace_init);
#ifdef CONFIG_MCL
/**
* qdf_trace() - puts the messages in to ring-buffer
* @module: Enum of module, basically module id.
@ -510,6 +511,8 @@ void qdf_trace(uint8_t module, uint8_t code, uint16_t session, uint32_t data)
}
EXPORT_SYMBOL(qdf_trace);
#endif
/**
* qdf_trace_spin_lock_init() - initializes the lock variable before use
*
@ -567,7 +570,7 @@ EXPORT_SYMBOL(qdf_trace_register);
* Return: None
*/
void qdf_trace_dump_all(void *p_mac, uint8_t code, uint8_t session,
uint32_t count, uint32_t bitmask_of_module)
uint32_t count, uint32_t bitmask_of_module)
{
qdf_trace_record_t p_record;
int32_t i, tail;
@ -713,9 +716,9 @@ QDF_STATUS qdf_state_info_dump_all(char *buf, uint16_t size,
}
EXPORT_SYMBOL(qdf_state_info_dump_all);
#ifdef FEATURE_DP_TRACE
#ifdef CONFIG_DP_TRACE
static void qdf_dp_unused(struct qdf_dp_trace_record_s *record,
uint16_t index)
uint16_t index, uint8_t pdev_id)
{
qdf_print("%s: QDF_DP_TRACE_MAX event should not be generated",
__func__);
@ -784,6 +787,68 @@ void qdf_dp_trace_set_value(uint8_t proto_bitmap, uint8_t no_of_record,
}
EXPORT_SYMBOL(qdf_dp_trace_set_value);
/**
* qdf_dp_trace_set_verbosity() - set verbosity value
*
* @val: Value to set
*
* Return: Null
*/
void qdf_dp_trace_set_verbosity(uint32_t val)
{
g_qdf_dp_trace_data.verbosity = val;
}
EXPORT_SYMBOL(qdf_dp_trace_set_verbosity);
/**
* qdf_dp_get_verbosity) - get verbosity value
*
* Return: int
*/
uint8_t qdf_dp_get_verbosity(void)
{
return g_qdf_dp_trace_data.verbosity;
}
EXPORT_SYMBOL(qdf_dp_get_verbosity);
/**
* qdf_dp_set_proto_bitmap() - set dp trace proto bitmap
*
* @val : unsigned bitmap to set
*
* Return: proto bitmap
*/
void qdf_dp_set_proto_bitmap(uint32_t val)
{
g_qdf_dp_trace_data.proto_bitmap = val;
}
EXPORT_SYMBOL(qdf_dp_set_proto_bitmap);
/**
* qdf_dp_set_no_of_record() - set dp trace no_of_record
*
* @val : unsigned no_of_record to set
*
* Return: null
*/
void qdf_dp_set_no_of_record(uint32_t val)
{
g_qdf_dp_trace_data.no_of_record = val;
}
EXPORT_SYMBOL(qdf_dp_set_no_of_record);
/**
* qdf_dp_get_no_of_record() - get dp trace no_of_record
*
* Return: number of records
*/
uint8_t qdf_dp_get_no_of_record(void)
{
return g_qdf_dp_trace_data.no_of_record;
}
EXPORT_SYMBOL(qdf_dp_get_no_of_record);
/**
* qdf_dp_trace_enable_track() - enable the tracing for netbuf
* @code: defines the event
@ -859,9 +924,13 @@ void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir)
return;
}
EXPORT_SYMBOL(qdf_dp_trace_set_track);
#if CONFIG_MCL
#define DPTRACE_PRINT(args...) \
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_INFO, ## args)
#else
#define DPTRACE_PRINT(args...) \
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_NONE, ## args)
#endif
/**
* dump_hex_trace() - Display the data in buffer
@ -913,8 +982,12 @@ const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code)
return "EVENT:";
case QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD:
return "HDD: TX: PTR:";
case QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD:
return "LI_DP: TX: PTR:";
case QDF_DP_TRACE_HDD_TX_PACKET_RECORD:
return "HDD: TX: DATA:";
case QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD:
return "LI_DP: TX: DATA:";
case QDF_DP_TRACE_CE_PACKET_PTR_RECORD:
return "CE: TX: PTR:";
case QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD:
@ -927,8 +1000,14 @@ const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code)
return "HTT: RX: OF: PTR:";
case QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD:
return "HDD: RX: PTR:";
case QDF_DP_TRACE_RX_LI_DP_PACKET_PTR_RECORD:
return "LI_DP: RX: PTR:";
case QDF_DP_TRACE_HDD_RX_PACKET_RECORD:
return "HDD: RX: DATA:";
case QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD:
return "LI_DP: RX: DATA:";
case QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD:
return "LI_DP_NULL: RX: DATA:";
case QDF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD:
return "TXRX: TX: Q: PTR:";
case QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD:
@ -1081,12 +1160,13 @@ static bool qdf_dp_enable_check(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
* @code: dptrace code
* @data: data pointer
* @size: size of buffer
* @pdev_id: pdev_id
* @print: true to print it in kmsg
*
* Return: none
*/
static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code,
uint8_t *data, uint8_t size, bool print)
static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code, uint8_t *data,
uint8_t size, uint8_t pdev_id, bool print)
{
struct qdf_dp_trace_record_s *rec = NULL;
int index;
@ -1119,6 +1199,7 @@ static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code,
rec = &g_qdf_dp_trace_tbl[g_qdf_dp_trace_data.tail];
index = g_qdf_dp_trace_data.tail;
rec->code = code;
rec->pdev_id = pdev_id;
rec->size = 0;
if (data != NULL && size > 0) {
if (size > QDF_DP_TRACE_RECORD_SIZE)
@ -1134,7 +1215,8 @@ static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code,
if ((g_qdf_dp_trace_data.live_mode || (print == true)) &&
(rec->code < QDF_DP_TRACE_MAX))
qdf_dp_trace_cb_table[rec->code] (rec, index);
qdf_dp_trace_cb_table[rec->code] (rec, index,
QDF_TRACE_DEFAULT_PDEV_ID);
}
@ -1143,11 +1225,12 @@ static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code,
* @session_id: vdev_id
* @skb: skb pointer
* @dir: direction
* @pdev_id: pdev_id
*
* Return: true/false
*/
static bool qdf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb,
enum qdf_proto_dir dir)
enum qdf_proto_dir dir, uint8_t pdev_id)
{
enum qdf_proto_subtype subtype;
@ -1160,7 +1243,7 @@ static bool qdf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb,
DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_EAPOL_PACKET_RECORD,
session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
(skb->data + QDF_NBUF_DEST_MAC_OFFSET),
QDF_PROTO_TYPE_EAPOL, subtype, dir));
QDF_PROTO_TYPE_EAPOL, subtype, dir, pdev_id));
if (QDF_TX == dir)
QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
else if (QDF_RX == dir)
@ -1177,11 +1260,12 @@ static bool qdf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb,
* @session_id: vdev_id
* @skb: skb pointer
* @dir: direction
* @pdev_id: pdev_id
*
* Return: true/false
*/
static bool qdf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb,
enum qdf_proto_dir dir)
enum qdf_proto_dir dir, uint8_t pdev_id)
{
enum qdf_proto_subtype subtype = QDF_PROTO_INVALID;
@ -1194,7 +1278,7 @@ static bool qdf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb,
DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_DHCP_PACKET_RECORD,
session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
(skb->data + QDF_NBUF_DEST_MAC_OFFSET),
QDF_PROTO_TYPE_DHCP, subtype, dir));
QDF_PROTO_TYPE_DHCP, subtype, dir, pdev_id));
if (QDF_TX == dir)
QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
else if (QDF_RX == dir)
@ -1211,11 +1295,12 @@ static bool qdf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb,
* @session_id: vdev_id
* @skb: skb pointer
* @dir: direction
* @pdev_id: pdev_id
*
* Return: true/false
*/
static bool qdf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb,
enum qdf_proto_dir dir)
enum qdf_proto_dir dir, uint8_t pdev_id)
{
enum qdf_proto_subtype proto_subtype;
@ -1228,7 +1313,7 @@ static bool qdf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb,
DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ARP_PACKET_RECORD,
session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
(skb->data + QDF_NBUF_DEST_MAC_OFFSET),
QDF_PROTO_TYPE_ARP, proto_subtype, dir));
QDF_PROTO_TYPE_ARP, proto_subtype, dir, pdev_id));
if (QDF_TX == dir)
QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
else if (QDF_RX == dir)
@ -1245,19 +1330,20 @@ static bool qdf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb,
* @session_id: vdev_id
* @skb: skb pointer
* @dir: direction
* @pdev_id: pdev_id
*
* Return: none
*/
void qdf_dp_trace_log_pkt(uint8_t session_id, struct sk_buff *skb,
enum qdf_proto_dir dir)
enum qdf_proto_dir dir, uint8_t pdev_id)
{
if (qdf_dp_get_proto_bitmap()) {
if (qdf_log_arp_pkt(session_id,
skb, dir) == false) {
skb, dir, pdev_id) == false) {
if (qdf_log_dhcp_pkt(session_id,
skb, dir) == false) {
skb, dir, pdev_id) == false) {
if (qdf_log_eapol_pkt(session_id,
skb, dir) == false) {
skb, dir, pdev_id) == false) {
return;
}
}
@ -1274,7 +1360,7 @@ EXPORT_SYMBOL(qdf_dp_trace_log_pkt);
* Return: none
*/
void qdf_dp_display_mgmt_pkt(struct qdf_dp_trace_record_s *record,
uint16_t index)
uint16_t index, uint8_t pdev_id)
{
struct qdf_dp_trace_mgmt_buf *buf =
(struct qdf_dp_trace_mgmt_buf *)record->data;
@ -1291,13 +1377,15 @@ EXPORT_SYMBOL(qdf_dp_display_mgmt_pkt);
* qdf_dp_trace_mgmt_pkt() - record mgmt packet
* @code: dptrace code
* @vdev_id: vdev id
* @pdev_id: pdev_id
* @type: proto type
* @subtype: proto subtype
*
* Return: none
*/
void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
enum qdf_proto_type type, enum qdf_proto_subtype subtype)
uint8_t pdev_id, enum qdf_proto_type type,
enum qdf_proto_subtype subtype)
{
struct qdf_dp_trace_mgmt_buf buf;
int buf_size = sizeof(struct qdf_dp_trace_mgmt_buf);
@ -1311,7 +1399,7 @@ void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
buf.type = type;
buf.subtype = subtype;
buf.vdev_id = vdev_id;
qdf_dp_add_record(code, (uint8_t *)&buf, buf_size, true);
qdf_dp_add_record(code, (uint8_t *)&buf, buf_size, pdev_id, true);
}
EXPORT_SYMBOL(qdf_dp_trace_mgmt_pkt);
@ -1323,7 +1411,7 @@ EXPORT_SYMBOL(qdf_dp_trace_mgmt_pkt);
* Return: none
*/
void qdf_dp_display_event_record(struct qdf_dp_trace_record_s *record,
uint16_t index)
uint16_t index, uint8_t pdev_id)
{
struct qdf_dp_trace_event_buf *buf =
(struct qdf_dp_trace_event_buf *)record->data;
@ -1340,13 +1428,15 @@ EXPORT_SYMBOL(qdf_dp_display_event_record);
* qdf_dp_trace_record_event() - record events
* @code: dptrace code
* @vdev_id: vdev id
* @pdev_id: pdev_id
* @type: proto type
* @subtype: proto subtype
*
* Return: none
*/
void qdf_dp_trace_record_event(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
enum qdf_proto_type type, enum qdf_proto_subtype subtype)
uint8_t pdev_id, enum qdf_proto_type type,
enum qdf_proto_subtype subtype)
{
struct qdf_dp_trace_event_buf buf;
int buf_size = sizeof(struct qdf_dp_trace_event_buf);
@ -1360,7 +1450,7 @@ void qdf_dp_trace_record_event(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
buf.type = type;
buf.subtype = subtype;
buf.vdev_id = vdev_id;
qdf_dp_add_record(code, (uint8_t *)&buf, buf_size, true);
qdf_dp_add_record(code, (uint8_t *)&buf, buf_size, pdev_id, true);
}
EXPORT_SYMBOL(qdf_dp_trace_record_event);
@ -1372,7 +1462,7 @@ EXPORT_SYMBOL(qdf_dp_trace_record_event);
* Return: none
*/
void qdf_dp_display_proto_pkt(struct qdf_dp_trace_record_s *record,
uint16_t index)
uint16_t index, uint8_t pdev_id)
{
struct qdf_dp_trace_proto_buf *buf =
(struct qdf_dp_trace_proto_buf *)record->data;
@ -1398,12 +1488,14 @@ EXPORT_SYMBOL(qdf_dp_display_proto_pkt);
* @type: proto type
* @subtype: proto subtype
* @dir: direction
* @pdev_id: pdev id
*
* Return: none
*/
void qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
uint8_t *sa, uint8_t *da, enum qdf_proto_type type,
enum qdf_proto_subtype subtype, enum qdf_proto_dir dir)
enum qdf_proto_subtype subtype, enum qdf_proto_dir dir,
uint8_t pdev_id)
{
struct qdf_dp_trace_proto_buf buf;
int buf_size = sizeof(struct qdf_dp_trace_ptr_buf);
@ -1420,7 +1512,7 @@ void qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
buf.type = type;
buf.subtype = subtype;
buf.vdev_id = vdev_id;
qdf_dp_add_record(code, (uint8_t *)&buf, buf_size, true);
qdf_dp_add_record(code, (uint8_t *)&buf, buf_size, pdev_id, true);
}
EXPORT_SYMBOL(qdf_dp_trace_proto_pkt);
@ -1432,7 +1524,7 @@ EXPORT_SYMBOL(qdf_dp_trace_proto_pkt);
* Return: none
*/
void qdf_dp_display_ptr_record(struct qdf_dp_trace_record_s *record,
uint16_t index)
uint16_t index, uint8_t pdev_id)
{
struct qdf_dp_trace_ptr_buf *buf =
(struct qdf_dp_trace_ptr_buf *)record->data;
@ -1454,6 +1546,7 @@ EXPORT_SYMBOL(qdf_dp_display_ptr_record);
/**
* qdf_dp_trace_ptr() - record dptrace
* @code: dptrace code
* @pdev_id: pdev_id
* @data: data
* @size: size of data
* @msdu_id: msdu_id
@ -1462,7 +1555,8 @@ EXPORT_SYMBOL(qdf_dp_display_ptr_record);
* Return: none
*/
void qdf_dp_trace_ptr(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
uint8_t *data, uint8_t size, uint16_t msdu_id, uint16_t status)
uint8_t pdev_id, uint8_t *data, uint8_t size,
uint16_t msdu_id, uint16_t status)
{
struct qdf_dp_trace_ptr_buf buf;
int buf_size = sizeof(struct qdf_dp_trace_ptr_buf);
@ -1476,7 +1570,7 @@ void qdf_dp_trace_ptr(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
qdf_mem_copy(&buf.cookie, data, size);
buf.msdu_id = msdu_id;
buf.status = status;
qdf_dp_add_record(code, (uint8_t *)&buf, buf_size,
qdf_dp_add_record(code, (uint8_t *)&buf, buf_size, pdev_id,
QDF_NBUF_CB_DP_TRACE_PRINT(nbuf));
}
EXPORT_SYMBOL(qdf_dp_trace_ptr);
@ -1489,23 +1583,31 @@ EXPORT_SYMBOL(qdf_dp_trace_ptr);
* Return: None
*/
void qdf_dp_display_record(struct qdf_dp_trace_record_s *pRecord,
uint16_t recIndex)
uint16_t recIndex, uint8_t pdev_id)
{
DPTRACE_PRINT("DPT: %04d: %s: %s", recIndex,
pRecord->time, qdf_dp_code_to_string(pRecord->code));
switch (pRecord->code) {
case QDF_DP_TRACE_HDD_TX_TIMEOUT:
DPTRACE_PRINT("DPT: HDD TX Timeout\n");
break;
case QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT:
DPTRACE_PRINT("DPT: HDD SoftAP TX Timeout\n");
break;
case QDF_DP_TRACE_HDD_TX_PACKET_RECORD:
case QDF_DP_TRACE_HDD_RX_PACKET_RECORD:
dump_hex_trace("DATA", pRecord->data, pRecord->size);
break;
default:
dump_hex_trace("cookie", pRecord->data, pRecord->size);
if (pdev_id == QDF_TRACE_DEFAULT_PDEV_ID ||
pdev_id == pRecord->pdev_id) {
DPTRACE_PRINT("DPT: %04d: PDEV_ID = %d: %s: %s", recIndex,
pRecord->pdev_id, pRecord->time,
qdf_dp_code_to_string(pRecord->code));
switch (pRecord->code) {
case QDF_DP_TRACE_HDD_TX_TIMEOUT:
DPTRACE_PRINT("DPT: HDD TX Timeout\n");
break;
case QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT:
DPTRACE_PRINT("DPT: HDD SoftAP TX Timeout\n");
break;
case QDF_DP_TRACE_HDD_TX_PACKET_RECORD:
case QDF_DP_TRACE_HDD_RX_PACKET_RECORD:
case QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD:
case QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD:
case QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD:
dump_hex_trace("DATA", pRecord->data, pRecord->size);
break;
default:
dump_hex_trace("cookie", pRecord->data, pRecord->size);
}
}
}
EXPORT_SYMBOL(qdf_dp_display_record);
@ -1515,19 +1617,20 @@ EXPORT_SYMBOL(qdf_dp_display_record);
* qdf_dp_trace() - Stores the data in buffer
* @nbuf : defines the netbuf
* @code : defines the event
* @pdev_id: pdev_id
* @data : defines the data to be stored
* @size : defines the size of the data record
*
* Return: None
*/
void qdf_dp_trace(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
uint8_t *data, uint8_t size, enum qdf_proto_dir dir)
void qdf_dp_trace(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code, uint8_t pdev_id,
uint8_t *data, uint8_t size, enum qdf_proto_dir dir)
{
if (qdf_dp_enable_check(nbuf, code, dir) == false)
return;
qdf_dp_add_record(code, data, size,
qdf_dp_add_record(code, data, size, pdev_id,
(nbuf != NULL) ? QDF_NBUF_CB_DP_TRACE_PRINT(nbuf) : false);
}
EXPORT_SYMBOL(qdf_dp_trace);
@ -1587,12 +1690,12 @@ EXPORT_SYMBOL(qdf_dp_trace_clear_buffer);
/**
* qdf_dp_trace_dump_all() - Dump data from ring buffer via call back functions
* registered with QDF
* @code: Reason code
* @count: Number of lines to dump starting from tail to head
* @pdev_id: pdev_id
*
* Return: None
*/
void qdf_dp_trace_dump_all(uint32_t count)
void qdf_dp_trace_dump_all(uint32_t count, uint8_t pdev_id)
{
struct qdf_dp_trace_record_s p_record;
int32_t i, tail;
@ -1632,7 +1735,7 @@ void qdf_dp_trace_dump_all(uint32_t count)
for (;; ) {
qdf_dp_trace_cb_table[p_record.
code] (&p_record, (uint16_t)i);
code] (&p_record, (uint16_t)i, pdev_id);
if (i == tail)
break;
i += 1;
@ -1652,26 +1755,6 @@ EXPORT_SYMBOL(qdf_dp_trace_dump_all);
#endif
#else /* CONFIG_MCL */
void qdf_trace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
char *str_format, ...)
{
va_list val;
va_start(val, str_format);
/*
* TODO: remove this hack when modules start using the qdf_print_ctrl
* framework.
* Any newly added code that wishes to use QDF_TRACE needs to adapt
* to the framework, and using it this way is not encouraged.
*/
qdf_trace_msg_cmn(qdf_pidx, module, level, str_format, val);
va_end(val);
}
EXPORT_SYMBOL(qdf_trace_msg);
#endif /* CONFIG_MCL */
struct qdf_print_ctrl print_ctrl_obj[MAX_PRINT_CONFIG_SUPPORTED];
struct category_name_info g_qdf_category_name[MAX_SUPPORTED_CATEGORY] = {
@ -1757,6 +1840,7 @@ struct category_name_info g_qdf_category_name[MAX_SUPPORTED_CATEGORY] = {
[QDF_MODULE_ID_P2P] = {"P2P"},
[QDF_MODULE_ID_OFFCHAN_TXRX] = {"OFFCHAN"},
[QDF_MODULE_ID_REGULATORY] = {"REGULATORY"},
[QDF_MODULE_ID_OBJ_MGR] = {"OBJMGR"},
[QDF_MODULE_ID_ANY] = {"ANY"},
};
EXPORT_SYMBOL(g_qdf_category_name);
@ -2173,6 +2257,7 @@ static void set_default_trace_levels(struct category_info *cinfo)
[QDF_MODULE_ID_NAN] = QDF_TRACE_LEVEL_NONE,
[QDF_MODULE_ID_P2P] = QDF_TRACE_LEVEL_NONE,
[QDF_MODULE_ID_OFFCHAN_TXRX] = QDF_TRACE_LEVEL_NONE,
[QDF_MODULE_ID_OBJ_MGR] = QDF_TRACE_LEVEL_INFO,
[QDF_MODULE_ID_ANY] = QDF_TRACE_LEVEL_NONE,
};

View file

@ -38,6 +38,28 @@
#define WLAN_PEER_HASH(addr) \
(((const uint8_t *)(addr))[WLAN_MACADDR_LEN - 1] % WLAN_PEER_HASHSIZE)
#define obj_mgr_log(level, args...) \
QDF_TRACE(QDF_MODULE_ID_OBJ_MGR, level, ## args)
#define obj_mgr_logfl(level, format, args...) \
obj_mgr_log(level, FL(format), ## args)
#define obj_mgr_alert(format, args...) \
obj_mgr_logfl(QDF_TRACE_LEVEL_FATAL, format, ## args)
#define obj_mgr_err(format, args...) \
obj_mgr_logfl(QDF_TRACE_LEVEL_ERROR, format, ## args)
#define obj_mgr_warn(format, args...) \
obj_mgr_logfl(QDF_TRACE_LEVEL_WARN, format, ## args)
#define obj_mgr_info(format, args...) \
obj_mgr_logfl(QDF_TRACE_LEVEL_INFO, format, ## args)
#define obj_mgr_debug(format, args...) \
obj_mgr_logfl(QDF_TRACE_LEVEL_DEBUG, format, ## args)
/**
* enum WLAN_OBJ_STATE - State of Object
* @WLAN_OBJ_STATE_CREATED: All component objects are created
@ -249,6 +271,8 @@ static inline char *string_from_dbgid(wlan_objmgr_ref_dbgid id)
"WLAN_NAN_ID",
"WLAN_REGULATORY_SB_ID",
"WLAN_REGULATORY_NB_ID",
"WLAN_OFFCHAN_TXRX_ID",
"WLAN_POLICY_MGR_ID",
"WLAN_SON_ID",
"WLAN_SPECTRAL_ID",
"WLAN_REF_ID_MAX" };

View file

@ -762,12 +762,10 @@ static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev)
struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev);
/* This API is invoked with lock acquired, do not add log prints */
if (pdev != NULL) {
if (pdev != NULL)
return wlan_pdev_get_hw_macaddr(pdev);
} else {
qdf_print("%s:pdev is NULL\n", __func__);
else
return NULL;
}
}
/**

View file

@ -26,7 +26,7 @@
/* Global object, it is declared globally */
struct wlan_objmgr_global *g_umac_glb_obj;
/* Component Name table */
const char *wlan_umac_component_name[] = {
const char *wlan_umac_Component_name[] = {
"MLME",
"SCAN_MGR",
"SCAN_CACHE",
@ -42,7 +42,7 @@ QDF_STATUS wlan_objmgr_global_obj_init(void)
/* If it is already created, ignore */
if (g_umac_glb_obj != NULL) {
qdf_print("%s: Global object is already created\n", __func__);
obj_mgr_err("Global object is already created");
return QDF_STATUS_E_FAILURE;
}
@ -50,8 +50,7 @@ QDF_STATUS wlan_objmgr_global_obj_init(void)
umac_global_obj = (struct wlan_objmgr_global *)qdf_mem_malloc(
sizeof(*umac_global_obj));
if (umac_global_obj == NULL) {
qdf_print("%s: Global object alloc failed due to malloc\n",
__func__);
obj_mgr_err("Global object alloc failed due to malloc");
return QDF_STATUS_E_NOMEM;
}
/* Store Global object pointer in Global variable */
@ -67,7 +66,7 @@ QDF_STATUS wlan_objmgr_global_obj_deinit(void)
{
/* If it is already destroyed */
if (g_umac_glb_obj == NULL) {
qdf_print("%s: Global object is not allocated\n", __func__);
obj_mgr_err("Global object is not allocated");
return QDF_STATUS_E_FAILURE;
}
@ -76,7 +75,7 @@ QDF_STATUS wlan_objmgr_global_obj_deinit(void)
qdf_mem_free(g_umac_glb_obj);
g_umac_glb_obj = NULL;
} else {
qdf_print("PSOCs are leaked can't free global objmgr ctx\n");
obj_mgr_err("PSOCs are leaked can't free global objmgr ctx");
WLAN_OBJMGR_BUG(0);
}
@ -94,7 +93,7 @@ QDF_STATUS wlan_objmgr_register_psoc_create_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
@ -102,8 +101,7 @@ QDF_STATUS wlan_objmgr_register_psoc_create_handler(
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->psoc_create_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is already registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is already registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -122,15 +120,14 @@ QDF_STATUS wlan_objmgr_unregister_psoc_create_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->psoc_create_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is not registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is not registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -149,15 +146,14 @@ QDF_STATUS wlan_objmgr_register_psoc_destroy_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->psoc_destroy_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is already registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is already registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -176,15 +172,14 @@ QDF_STATUS wlan_objmgr_unregister_psoc_destroy_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->psoc_destroy_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is not registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is not registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -203,15 +198,14 @@ QDF_STATUS wlan_objmgr_register_psoc_status_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->psoc_status_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is already registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is already registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -229,15 +223,14 @@ QDF_STATUS wlan_objmgr_unregister_psoc_status_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->psoc_status_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is not registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is not registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -256,15 +249,14 @@ QDF_STATUS wlan_objmgr_register_pdev_create_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->pdev_create_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is already registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is already registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -283,15 +275,14 @@ QDF_STATUS wlan_objmgr_unregister_pdev_create_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->pdev_create_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is not registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is not registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -310,15 +301,14 @@ QDF_STATUS wlan_objmgr_register_pdev_destroy_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->pdev_destroy_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is already registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is already registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -337,15 +327,14 @@ QDF_STATUS wlan_objmgr_unregister_pdev_destroy_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->pdev_destroy_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for component %d is not registered\n",
__func__, id);
obj_mgr_err("Callback for Component %d is not registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -364,15 +353,14 @@ QDF_STATUS wlan_objmgr_register_pdev_status_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->pdev_status_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is already registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is already registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -390,15 +378,14 @@ QDF_STATUS wlan_objmgr_unregister_pdev_status_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->pdev_status_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for component %d is not registered\n",
__func__, id);
obj_mgr_err("Callback for Component %d is not registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -417,15 +404,14 @@ QDF_STATUS wlan_objmgr_register_vdev_create_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->vdev_create_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is already registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is already registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -443,15 +429,14 @@ QDF_STATUS wlan_objmgr_unregister_vdev_create_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->vdev_create_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is not registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is not registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -469,15 +454,14 @@ QDF_STATUS wlan_objmgr_register_vdev_destroy_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->vdev_destroy_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is already registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is already registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -495,15 +479,14 @@ QDF_STATUS wlan_objmgr_unregister_vdev_destroy_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->vdev_destroy_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is not registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is not registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -521,15 +504,14 @@ QDF_STATUS wlan_objmgr_register_vdev_status_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->vdev_status_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is already registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is already registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -547,15 +529,14 @@ QDF_STATUS wlan_objmgr_unregister_vdev_status_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->vdev_status_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for component %d is not registered\n",
__func__, id);
obj_mgr_err("Callback for Component %d is not registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -574,15 +555,14 @@ QDF_STATUS wlan_objmgr_register_peer_create_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->peer_create_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is already registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is already registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -601,15 +581,14 @@ QDF_STATUS wlan_objmgr_unregister_peer_create_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->peer_create_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is not registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is not registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -627,15 +606,14 @@ QDF_STATUS wlan_objmgr_register_peer_destroy_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->peer_destroy_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is already registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is already registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -653,15 +631,14 @@ QDF_STATUS wlan_objmgr_unregister_peer_destroy_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->peer_destroy_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is not registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is not registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -679,15 +656,14 @@ QDF_STATUS wlan_objmgr_register_peer_status_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->peer_status_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is already registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is already registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -705,15 +681,14 @@ QDF_STATUS wlan_objmgr_unregister_peer_status_handler(
{
/* If id is not within valid range, return */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component %d is out of range\n", __func__, id);
obj_mgr_err("Component %d is out of range", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
qdf_spin_lock_bh(&g_umac_glb_obj->global_lock);
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->peer_status_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
qdf_print("%s:callback for comp %d is not registered\n",
__func__, id);
obj_mgr_err("Callback for comp %d is not registered", id);
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -789,12 +764,11 @@ void wlan_objmgr_print_ref_ids(qdf_atomic_t *id)
uint32_t i;
uint32_t pending_ref;
qdf_print(" Pending references of object\n");
obj_mgr_info("Pending references of object");
for (i = 0; i < WLAN_REF_ID_MAX; i++) {
pending_ref = qdf_atomic_read(&id[i]);
if (pending_ref)
qdf_print(" %s -- %d\n", string_from_dbgid(i), pending_ref);
obj_mgr_info("%s -- %d", string_from_dbgid(i), pending_ref);
}
return;
}

View file

@ -66,10 +66,21 @@ static QDF_STATUS wlan_objmgr_pdev_object_status(
static QDF_STATUS wlan_objmgr_pdev_obj_free(struct wlan_objmgr_pdev *pdev)
{
uint8_t pdev_id;
if (pdev == NULL) {
obj_mgr_err("pdev obj is NULL");
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
/* Detach PDEV from PSOC PDEV's list */
if (wlan_objmgr_psoc_pdev_detach(pdev->pdev_objmgr.wlan_psoc, pdev) ==
QDF_STATUS_E_FAILURE) {
qdf_print("%s: PSOC PDEV detach failed\n", __func__);
obj_mgr_err("PSOC PDEV detach failed: pdev-id: %d", pdev_id);
return QDF_STATUS_E_FAILURE;
}
qdf_spinlock_destroy(&pdev->pdev_lock);
@ -90,19 +101,19 @@ struct wlan_objmgr_pdev *wlan_objmgr_pdev_obj_create(
QDF_STATUS obj_status;
if (psoc == NULL) {
qdf_print("%s:psoc is NULL\n", __func__);
obj_mgr_err("psoc is NULL");
return NULL;
}
/* Allocate PDEV object's memory */
pdev = qdf_mem_malloc(sizeof(*pdev));
if (pdev == NULL) {
qdf_print("%s:pdev alloc failed\n", __func__);
obj_mgr_err("pdev alloc failed");
return NULL;
}
/* Attach PDEV with PSOC */
if (wlan_objmgr_psoc_pdev_attach(psoc, pdev)
!= QDF_STATUS_SUCCESS) {
qdf_print("%s:pdev psoc attach failed\n", __func__);
obj_mgr_err("pdev psoc attach failed");
qdf_mem_free(pdev);
return NULL;
}
@ -150,8 +161,7 @@ struct wlan_objmgr_pdev *wlan_objmgr_pdev_obj_create(
/* Component object failed to be created, clean up the object */
} else if (obj_status == QDF_STATUS_E_FAILURE) {
/* Clean up the psoc */
qdf_print("%s: PDEV component objects allocation failed\n",
__func__);
obj_mgr_err("PDEV component objects allocation failed");
wlan_objmgr_pdev_obj_delete(pdev);
return NULL;
}
@ -165,14 +175,17 @@ static QDF_STATUS wlan_objmgr_pdev_obj_destroy(struct wlan_objmgr_pdev *pdev)
wlan_objmgr_pdev_destroy_handler handler;
QDF_STATUS obj_status;
void *arg;
uint8_t pdev_id;
if (pdev == NULL) {
qdf_print("%s:pdev is NULL\n", __func__);
obj_mgr_err("pdev is NULL");
return QDF_STATUS_E_FAILURE;
}
pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
if (pdev->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED) {
qdf_print("%s:pdev object delete is not invoked\n", __func__);
obj_mgr_err("pdev object delete is not invoked: pdev-id:%d", pdev_id);
WLAN_OBJMGR_BUG(0);
}
@ -189,8 +202,8 @@ static QDF_STATUS wlan_objmgr_pdev_obj_destroy(struct wlan_objmgr_pdev *pdev)
obj_status = wlan_objmgr_pdev_object_status(pdev);
if (obj_status == QDF_STATUS_E_FAILURE) {
qdf_print("%s: PDEV component objects destroy failed\n",
__func__);
obj_mgr_err("PDEV component objects destroy failed: pdev-id:%d",
pdev_id);
/* Ideally should not happen */
/* This leads to memleak ??? how to handle */
QDF_BUG(0);
@ -209,7 +222,7 @@ static QDF_STATUS wlan_objmgr_pdev_obj_destroy(struct wlan_objmgr_pdev *pdev)
QDF_STATUS wlan_objmgr_pdev_obj_delete(struct wlan_objmgr_pdev *pdev)
{
if (pdev == NULL) {
qdf_print("%s:pdev is NULL\n", __func__);
obj_mgr_err("pdev is NULL");
return QDF_STATUS_E_FAILURE;
}
/*
@ -241,15 +254,13 @@ QDF_STATUS wlan_objmgr_pdev_component_obj_attach(
/* component id is invalid */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
qdf_print("%s: component-id %d is not supported\n",
__func__, id);
obj_mgr_err("component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
wlan_pdev_obj_lock(pdev);
/* If there is a valid entry, return failure */
if (pdev->pdev_comp_priv_obj[id] != NULL) {
qdf_print("%s: component-%d already have valid pointer\n",
__func__, id);
obj_mgr_err("component-%d already have valid pointer", id);
wlan_pdev_obj_unlock(pdev);
return QDF_STATUS_E_FAILURE;
}
@ -776,7 +787,7 @@ void wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev,
wlan_objmgr_ref_dbgid id)
{
if (pdev == NULL) {
qdf_print("%s: pdev obj is NULL\n", __func__);
obj_mgr_err("pdev obj is NULL");
QDF_ASSERT(0);
return;
}
@ -790,17 +801,20 @@ EXPORT_SYMBOL(wlan_objmgr_pdev_get_ref);
QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev,
wlan_objmgr_ref_dbgid id)
{
uint8_t pdev_id;
if (pdev == NULL) {
qdf_print("%s: pdev obj is NULL\n", __func__);
obj_mgr_err("pdev obj is NULL");
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
wlan_pdev_obj_lock(pdev);
pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
if (pdev->obj_state == WLAN_OBJ_STATE_LOGICALLY_DELETED) {
wlan_pdev_obj_unlock(pdev);
qdf_print("%s: pdev obj is in Deletion Progress state\n",
__func__);
obj_mgr_err("pdev obj is in Deletion Progress state: pdev-id: %d",
pdev_id) ;
return QDF_STATUS_E_RESOURCES;
}
@ -814,21 +828,24 @@ EXPORT_SYMBOL(wlan_objmgr_pdev_try_get_ref);
void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev,
wlan_objmgr_ref_dbgid id)
{
uint8_t pdev_id;
if (pdev == NULL) {
qdf_print("%s: pdev obj is NULL\n", __func__);
obj_mgr_err("pdev obj is NULL");
QDF_ASSERT(0);
return;
}
pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
if (!qdf_atomic_read(&pdev->pdev_objmgr.ref_id_dbg[id])) {
qdf_print("%s: pdev ref cnt was not taken by %d\n",
__func__, id);
obj_mgr_err("pdev (id:%d)ref cnt was not taken by %d", pdev_id, id);
wlan_objmgr_print_ref_ids(pdev->pdev_objmgr.ref_id_dbg);
WLAN_OBJMGR_BUG(0);
}
if (!qdf_atomic_read(&pdev->pdev_objmgr.ref_cnt)) {
qdf_print("%s: pdev ref cnt is 0\n", __func__);
obj_mgr_err("pdev ref cnt is 0: pdev-id:%d", pdev_id);
WLAN_OBJMGR_BUG(0);
return;
}

View file

@ -69,17 +69,32 @@ static QDF_STATUS wlan_objmgr_peer_obj_free(struct wlan_objmgr_peer *peer)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_vdev *vdev;
uint8_t *macaddr;
uint8_t vdev_id;
if (peer == NULL) {
obj_mgr_err("PEER is NULL");
return QDF_STATUS_E_FAILURE;
}
macaddr = wlan_peer_get_macaddr(peer);
vdev = wlan_peer_get_vdev(peer);
if (vdev == NULL) {
qdf_print("%s: VDEV is NULL\n", __func__);
obj_mgr_err("VDEV is NULL for peer(%02x:%02x:%02x:%02x:%02x:%02x)",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
return QDF_STATUS_E_FAILURE;
}
vdev_id = wlan_vdev_get_id(vdev);
/* get PSOC from VDEV, if it is NULL, return */
psoc = wlan_vdev_get_psoc(vdev);
if (psoc == NULL) {
qdf_print("%s: PSOC is NULL\n", __func__);
obj_mgr_err("PSOC is NULL for peer(%02x:%02x:%02x:%02x:%02x:%02x)",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
return QDF_STATUS_E_FAILURE;
}
@ -91,12 +106,17 @@ static QDF_STATUS wlan_objmgr_peer_obj_free(struct wlan_objmgr_peer *peer)
/* Detach peer from VDEV's peer list */
if (wlan_objmgr_vdev_peer_detach(vdev, peer) == QDF_STATUS_E_FAILURE) {
qdf_print("%s: Peer VDEV detach failure\n", __func__);
obj_mgr_err("Peer(%02x:%02x:%02x:%02x:%02x:%02x) VDEV detach failure \
for vdev-id: %d",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5], vdev_id);
return QDF_STATUS_E_FAILURE;
}
/* Detach peer from PSOC's peer list */
if (wlan_objmgr_psoc_peer_detach(psoc, peer) == QDF_STATUS_E_FAILURE) {
qdf_print("%s: Peer PSOC detach failure\n", __func__);
obj_mgr_err("Peer(%02x:%02x:%02x:%02x:%02x:%02x) PSOC detach failure",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
return QDF_STATUS_E_FAILURE;
}
qdf_spinlock_destroy(&peer->peer_lock);
@ -120,19 +140,25 @@ struct wlan_objmgr_peer *wlan_objmgr_peer_obj_create(
uint8_t id;
if (vdev == NULL) {
qdf_print("%s: VDEV is NULL\n", __func__);
obj_mgr_err("VDEV is NULL for peer (%02x:%02x:%02x:%02x:%02x:%02x)",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
return NULL;
}
/* Get psoc, if psoc is NULL, return */
psoc = wlan_vdev_get_psoc(vdev);
if (psoc == NULL) {
qdf_print("%s: PSOC is NULL\n", __func__);
obj_mgr_err("PSOC is NULL for peer (%02x:%02x:%02x:%02x:%02x:%02x)",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
return NULL;
}
/* Allocate memory for peer object */
peer = qdf_mem_malloc(sizeof(*peer));
if (peer == NULL) {
qdf_print("%s: Peer allocation failure\n", __func__);
obj_mgr_err("Peer(%02x:%02x:%02x:%02x:%02x:%02x) allocation failure",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
return NULL;
}
/* set vdev to peer */
@ -148,14 +174,20 @@ struct wlan_objmgr_peer *wlan_objmgr_peer_obj_create(
/* Attach peer to psoc, psoc maintains the node table for the device */
if (wlan_objmgr_psoc_peer_attach(psoc, peer) !=
QDF_STATUS_SUCCESS) {
qdf_print("%s: Peer PSOC attach failure\n", __func__);
obj_mgr_err("Peer(%02x:%02x:%02x:%02x:%02x:%02x) \
PSOC attach failure",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
qdf_mem_free(peer);
return NULL;
}
/* Attach peer to vdev peer table */
if (wlan_objmgr_vdev_peer_attach(vdev, peer) !=
QDF_STATUS_SUCCESS) {
qdf_print("%s: Peer VDEV attach failure\n", __func__);
obj_mgr_err("Peer(%02x:%02x:%02x:%02x:%02x:%02x) \
VDEV attach failure",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
/* if attach fails, detach from psoc table before free */
wlan_objmgr_psoc_peer_detach(psoc, peer);
qdf_mem_free(peer);
@ -196,8 +228,10 @@ struct wlan_objmgr_peer *wlan_objmgr_peer_obj_create(
peer->obj_state = WLAN_OBJ_STATE_PARTIALLY_CREATED;
} else if (obj_status == QDF_STATUS_E_FAILURE) {
/* Clean up the peer */
qdf_print("%s: Peer component object alloc failure\n",
__func__);
obj_mgr_err("Peer(%02x:%02x:%02x:%02x:%02x:%02x) \
component object alloc failure",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
wlan_objmgr_peer_obj_delete(peer);
return NULL;
}
@ -210,14 +244,20 @@ static QDF_STATUS wlan_objmgr_peer_obj_destroy(struct wlan_objmgr_peer *peer)
wlan_objmgr_peer_destroy_handler handler;
QDF_STATUS obj_status;
void *arg;
uint8_t *macaddr;
if (peer == NULL) {
qdf_print("%s: PEER is NULL\n", __func__);
obj_mgr_err("PEER is NULL");
return QDF_STATUS_E_FAILURE;
}
macaddr = wlan_peer_get_macaddr(peer);
if (peer->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED) {
qdf_print("%s:peer object delete is not invoked\n", __func__);
obj_mgr_err("peer(%02x:%02x:%02x:%02x:%02x:%02x) \
object delete is not invoked",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
WLAN_OBJMGR_BUG(0);
}
@ -250,7 +290,7 @@ static QDF_STATUS wlan_objmgr_peer_obj_destroy(struct wlan_objmgr_peer *peer)
QDF_STATUS wlan_objmgr_peer_obj_delete(struct wlan_objmgr_peer *peer)
{
if (peer == NULL) {
qdf_print("%s: PEER is NULL\n", __func__);
obj_mgr_err("PEER is NULL");
return QDF_STATUS_E_FAILURE;
}
@ -501,7 +541,7 @@ void wlan_objmgr_peer_get_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id)
{
if (peer == NULL) {
qdf_print("%s: peer obj is NULL\n", __func__);
obj_mgr_err("peer obj is NULL for %d", id);
QDF_ASSERT(0);
return;
}
@ -516,17 +556,23 @@ EXPORT_SYMBOL(wlan_objmgr_peer_get_ref);
QDF_STATUS wlan_objmgr_peer_try_get_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id)
{
uint8_t *macaddr;
if (peer == NULL) {
qdf_print("%s: peer obj is NULL\n", __func__);
obj_mgr_err("peer obj is NULL for %d", id);
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
wlan_peer_obj_lock(peer);
macaddr = wlan_peer_get_macaddr(peer);
if (peer->obj_state == WLAN_OBJ_STATE_LOGICALLY_DELETED) {
wlan_peer_obj_unlock(peer);
qdf_print("%s: peer obj is in Deletion Progress state\n",
__func__);
obj_mgr_err("peer(%02x:%02x:%02x:%02x:%02x:%02x) obj \
is in Deletion Progress state",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
return QDF_STATUS_E_RESOURCES;
}
@ -540,21 +586,30 @@ EXPORT_SYMBOL(wlan_objmgr_peer_try_get_ref);
void wlan_objmgr_peer_release_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id)
{
uint8_t *macaddr;
if (peer == NULL) {
qdf_print("%s: peer obj is NULL\n", __func__);
obj_mgr_err("peer obj is NULL for %d", id);
QDF_ASSERT(0);
return;
}
macaddr = wlan_peer_get_macaddr(peer);
if (!qdf_atomic_read(&peer->peer_objmgr.ref_id_dbg[id])) {
qdf_print("%s: peer ref cnt was not taken by %d\n",
__func__, id);
obj_mgr_err("peer(%02x:%02x:%02x:%02x:%02x:%02x) \
ref cnt was not taken by %d",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5], id);
wlan_objmgr_print_ref_ids(peer->peer_objmgr.ref_id_dbg);
WLAN_OBJMGR_BUG(0);
}
if (!qdf_atomic_read(&peer->peer_objmgr.ref_cnt)) {
qdf_print("%s: peer ref cnt is 0\n", __func__);
obj_mgr_err("peer(%02x:%02x:%02x:%02x:%02x:%02x) ref cnt is 0",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
WLAN_OBJMGR_BUG(0);
return;
}

View file

@ -95,7 +95,7 @@ static QDF_STATUS wlan_objmgr_psoc_obj_free(struct wlan_objmgr_psoc *psoc)
/* Detach PSOC from global object's psoc list */
if (wlan_objmgr_psoc_object_detach(psoc) == QDF_STATUS_E_FAILURE) {
qdf_print("%s: PSOC object detach failed\n", __func__);
obj_mgr_err("PSOC object detach failed");
return QDF_STATUS_E_FAILURE;
}
wlan_objmgr_psoc_peer_list_deinit(&psoc->soc_objmgr.peer_list);
@ -120,7 +120,7 @@ struct wlan_objmgr_psoc *wlan_objmgr_psoc_obj_create(uint32_t phy_version,
psoc = qdf_mem_malloc(sizeof(*psoc));
if (psoc == NULL) {
qdf_print("%s: PSOC allocation failed\n", __func__);
obj_mgr_err("PSOC allocation failed");
return NULL;
}
qdf_spinlock_create(&psoc->psoc_lock);
@ -167,8 +167,7 @@ struct wlan_objmgr_psoc *wlan_objmgr_psoc_obj_create(uint32_t phy_version,
psoc->obj_state = WLAN_OBJ_STATE_PARTIALLY_CREATED;
} else if (obj_status == QDF_STATUS_E_FAILURE) {
/* Component object failed to be created, clean up the object */
qdf_print("%s: PSOC component objects allocation failed\n",
__func__);
obj_mgr_err("PSOC component objects allocation failed");
/* Clean up the psoc */
wlan_objmgr_psoc_obj_delete(psoc);
return NULL;
@ -176,7 +175,7 @@ struct wlan_objmgr_psoc *wlan_objmgr_psoc_obj_create(uint32_t phy_version,
if (wlan_objmgr_psoc_object_attach(psoc) !=
QDF_STATUS_SUCCESS) {
qdf_print("%s: PSOC object attach failed\n", __func__);
obj_mgr_err("PSOC object attach failed");
wlan_objmgr_psoc_obj_delete(psoc);
return NULL;
}
@ -193,12 +192,12 @@ static QDF_STATUS wlan_objmgr_psoc_obj_destroy(struct wlan_objmgr_psoc *psoc)
void *arg;
if (psoc == NULL) {
qdf_print("%s:psoc is NULL\n", __func__);
obj_mgr_err("psoc is NULL");
return QDF_STATUS_E_FAILURE;
}
if (psoc->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED) {
qdf_print("%s:psoc object delete is not invoked\n", __func__);
obj_mgr_err("psoc object delete is not invoked");
WLAN_OBJMGR_BUG(0);
}
@ -215,7 +214,7 @@ static QDF_STATUS wlan_objmgr_psoc_obj_destroy(struct wlan_objmgr_psoc *psoc)
obj_status = wlan_objmgr_psoc_object_status(psoc);
if (obj_status == QDF_STATUS_E_FAILURE) {
qdf_print("%s: PSOC component object free failed\n", __func__);
obj_mgr_err("PSOC component object free failed");
/* Ideally should not happen
* This leads to memleak, BUG_ON to find which component
* delete notification failed and fix it.
@ -237,7 +236,7 @@ static QDF_STATUS wlan_objmgr_psoc_obj_destroy(struct wlan_objmgr_psoc *psoc)
QDF_STATUS wlan_objmgr_psoc_obj_delete(struct wlan_objmgr_psoc *psoc)
{
if (psoc == NULL) {
qdf_print("%s:psoc is NULL\n", __func__);
obj_mgr_err("psoc is NULL");
return QDF_STATUS_E_FAILURE;
}
/*
@ -1353,7 +1352,7 @@ QDF_STATUS wlan_objmgr_psoc_peer_detach(struct wlan_objmgr_psoc *psoc,
QDF_STATUS_E_FAILURE) {
qdf_spin_unlock_bh(&peer_list->peer_list_lock);
wlan_psoc_obj_unlock(psoc);
qdf_print("%s: Failed to detach peer\n", __func__);
obj_mgr_err("Failed to detach peer");
return QDF_STATUS_E_FAILURE;
}
qdf_spin_unlock_bh(&peer_list->peer_list_lock);
@ -1622,7 +1621,7 @@ void wlan_objmgr_psoc_get_ref(struct wlan_objmgr_psoc *psoc,
wlan_objmgr_ref_dbgid id)
{
if (psoc == NULL) {
qdf_print("%s: psoc obj is NULL\n", __func__);
obj_mgr_err("psoc obj is NULL for id:%d", id);
QDF_ASSERT(0);
return;
}
@ -1637,7 +1636,7 @@ QDF_STATUS wlan_objmgr_psoc_try_get_ref(struct wlan_objmgr_psoc *psoc,
wlan_objmgr_ref_dbgid id)
{
if (psoc == NULL) {
qdf_print("%s: psoc obj is NULL\n", __func__);
obj_mgr_err("psoc obj is NULL for id:%d", id);
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -1645,8 +1644,7 @@ QDF_STATUS wlan_objmgr_psoc_try_get_ref(struct wlan_objmgr_psoc *psoc,
wlan_psoc_obj_lock(psoc);
if (psoc->obj_state == WLAN_OBJ_STATE_LOGICALLY_DELETED) {
wlan_psoc_obj_unlock(psoc);
qdf_print("%s: psoc obj is in Deletion Progress staet\n",
__func__);
obj_mgr_err("Called by %d, psoc obj is in Deletion Progress state", id);
return QDF_STATUS_E_RESOURCES;
}
@ -1662,20 +1660,19 @@ void wlan_objmgr_psoc_release_ref(struct wlan_objmgr_psoc *psoc,
wlan_objmgr_ref_dbgid id)
{
if (psoc == NULL) {
qdf_print("%s: psoc obj is NULL\n", __func__);
obj_mgr_err("psoc obj is NULLi for id:%d", id);
QDF_ASSERT(0);
return;
}
if (!qdf_atomic_read(&psoc->soc_objmgr.ref_id_dbg[id])) {
qdf_print("%s: psoc ref cnt was not taken by %d\n",
__func__, id);
obj_mgr_err("psoc ref cnt was not taken by %d", id);
wlan_objmgr_print_ref_ids(psoc->soc_objmgr.ref_id_dbg);
WLAN_OBJMGR_BUG(0);
}
if (!qdf_atomic_read(&psoc->soc_objmgr.ref_cnt)) {
qdf_print("%s: psoc ref cnt is 0\n", __func__);
obj_mgr_err("psoc ref cnt is 0");
WLAN_OBJMGR_BUG(0);
return;
}
@ -1699,7 +1696,7 @@ static void wlan_objmgr_psoc_peer_ref_print(struct wlan_objmgr_psoc *psoc,
macaddr = wlan_peer_get_macaddr(peer);
wlan_peer_obj_unlock(peer);
qdf_print(" Peer MAC is %02x:%02x:%02x:%02x:%02x:%02x\n",
obj_mgr_info("Peer MAC is %02x:%02x:%02x:%02x:%02x:%02x",
macaddr[0], macaddr[1], macaddr[2], macaddr[3],
macaddr[4], macaddr[5]);
wlan_objmgr_print_ref_ids(peer->peer_objmgr.ref_id_dbg);
@ -1714,7 +1711,7 @@ static void wlan_objmgr_psoc_vdev_ref_print(struct wlan_objmgr_psoc *psoc,
wlan_vdev_obj_lock(vdev);
id = wlan_vdev_get_id(vdev);
wlan_vdev_obj_unlock(vdev);
qdf_print(" Vdev ID is %d\n", id);
obj_mgr_info("Vdev ID is %d", id);
wlan_objmgr_print_ref_ids(vdev->vdev_objmgr.ref_id_dbg);
}
@ -1726,9 +1723,9 @@ static void wlan_objmgr_psoc_pdev_ref_print(struct wlan_objmgr_psoc *psoc,
uint8_t id;
wlan_pdev_obj_lock(pdev);
id = pdev->pdev_objmgr.wlan_pdev_id;
id = wlan_objmgr_pdev_get_pdev_id(pdev);
wlan_pdev_obj_unlock(pdev);
qdf_print(" pdev ID is %d\n", id);
obj_mgr_info("pdev ID is %d", id);
wlan_objmgr_print_ref_ids(pdev->pdev_objmgr.ref_id_dbg);
}
@ -1736,20 +1733,20 @@ static void wlan_objmgr_psoc_pdev_ref_print(struct wlan_objmgr_psoc *psoc,
QDF_STATUS wlan_objmgr_print_ref_all_objects_per_psoc(
struct wlan_objmgr_psoc *psoc)
{
qdf_print(" Ref counts of PEER\n");
wlan_objmgr_iterate_obj_list_all(psoc, WLAN_PEER_OP,
wlan_objmgr_psoc_peer_ref_print, NULL, 1,
WLAN_OBJMGR_ID);
qdf_print(" Ref counts of VDEV\n");
wlan_objmgr_iterate_obj_list_all(psoc, WLAN_VDEV_OP,
wlan_objmgr_psoc_vdev_ref_print, NULL, 1,
WLAN_OBJMGR_ID);
qdf_print(" Ref counts of PDEV\n");
wlan_objmgr_iterate_obj_list_all(psoc, WLAN_PDEV_OP,
wlan_objmgr_psoc_pdev_ref_print, NULL, 1,
WLAN_OBJMGR_ID);
obj_mgr_info("Ref counts of PEER");
wlan_objmgr_iterate_obj_list(psoc, WLAN_PEER_OP,
wlan_objmgr_psoc_peer_ref_print, NULL, 1,
WLAN_OBJMGR_ID);
obj_mgr_info("Ref counts of VDEV");
wlan_objmgr_iterate_obj_list(psoc, WLAN_VDEV_OP,
wlan_objmgr_psoc_vdev_ref_print, NULL, 1,
WLAN_OBJMGR_ID);
obj_mgr_info("Ref counts of PDEV");
wlan_objmgr_iterate_obj_list(psoc, WLAN_PDEV_OP,
wlan_objmgr_psoc_pdev_ref_print, NULL, 1,
WLAN_OBJMGR_ID);
qdf_print(" Ref counts of PSOC\n");
obj_mgr_info(" Ref counts of PSOC");
wlan_objmgr_print_ref_ids(psoc->soc_objmgr.ref_id_dbg);
return QDF_STATUS_SUCCESS;
@ -1760,7 +1757,7 @@ QDF_STATUS wlan_objmgr_psoc_set_user_config(struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_psoc_user_config *user_config_data)
{
if (user_config_data == NULL) {
qdf_print("%s:user_config_data is NULL\n", __func__);
obj_mgr_err("user_config_data is NULL");
QDF_BUG(0);
return QDF_STATUS_E_FAILURE;
}

View file

@ -75,10 +75,15 @@ static QDF_STATUS wlan_objmgr_vdev_obj_free(struct wlan_objmgr_vdev *vdev)
{
struct wlan_objmgr_pdev *pdev;
if (vdev == NULL) {
obj_mgr_err("vdev is NULL");
return QDF_STATUS_E_FAILURE;
}
/* if PDEV is NULL, return */
pdev = wlan_vdev_get_pdev(vdev);
if (pdev == NULL) {
qdf_print("%s:pdev is NULL\n", __func__);
obj_mgr_err("pdev is NULL for vdev-id: %d",
vdev->vdev_objmgr.vdev_id);
return QDF_STATUS_E_FAILURE;
}
@ -113,26 +118,28 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
QDF_STATUS obj_status;
if (pdev == NULL) {
qdf_print("%s: pdev is NULL\n", __func__);
obj_mgr_err("pdev is NULL");
return NULL;
}
psoc = wlan_pdev_get_psoc(pdev);
/* PSOC is NULL */
if (psoc == NULL) {
qdf_print("%s: psoc is NULL\n", __func__);
obj_mgr_err("psoc is NULL for pdev-id:%d",
pdev->pdev_objmgr.wlan_pdev_id);
return NULL;
}
/* Allocate vdev object memory */
vdev = qdf_mem_malloc(sizeof(*vdev));
if (vdev == NULL) {
qdf_print("%s: Memory allocation failure\n", __func__);
obj_mgr_err("Memory allocation failure");
return NULL;
}
/* Attach VDEV to PSOC VDEV's list */
if (wlan_objmgr_psoc_vdev_attach(psoc, vdev) !=
QDF_STATUS_SUCCESS) {
obj_mgr_err("psoc vdev attach failed for vdev-id:%d",
vdev->vdev_objmgr.vdev_id);
qdf_mem_free(vdev);
qdf_print("%s: psoc vdev attach failed\n", __func__);
return NULL;
}
/* Store pdev in vdev */
@ -140,7 +147,8 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
/* Attach vdev to PDEV */
if (wlan_objmgr_pdev_vdev_attach(pdev, vdev) !=
QDF_STATUS_SUCCESS) {
qdf_print("%s: pdev vdev attach failed\n", __func__);
obj_mgr_err("pdev vdev attach failed for vdev-id:%d",
vdev->vdev_objmgr.vdev_id);
wlan_objmgr_psoc_vdev_detach(psoc, vdev);
qdf_mem_free(vdev);
return NULL;
@ -207,8 +215,8 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
} else if (obj_status == QDF_STATUS_E_FAILURE) {
/* Clean up the psoc */
wlan_objmgr_vdev_obj_delete(vdev);
qdf_print("%s:VDEV component objects creation failed\n",
__func__);
obj_mgr_err("VDEV component objects creation failed for vdev-id:%d",
vdev->vdev_objmgr.vdev_id);
return NULL;
}
return vdev;
@ -221,14 +229,18 @@ static QDF_STATUS wlan_objmgr_vdev_obj_destroy(struct wlan_objmgr_vdev *vdev)
wlan_objmgr_vdev_destroy_handler handler;
QDF_STATUS obj_status;
void *arg;
uint8_t vdev_id;
if (vdev == NULL) {
qdf_print("%s:vdev is NULL\n", __func__);
obj_mgr_err("vdev is NULL");
return QDF_STATUS_E_FAILURE;
}
vdev_id = wlan_vdev_get_id(vdev);
if (vdev->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED) {
qdf_print("%s:vdev object delete is not invoked\n", __func__);
obj_mgr_err("vdev object delete is not invoked: vdev-id:%d",
wlan_vdev_get_id(vdev));
WLAN_OBJMGR_BUG(0);
}
@ -245,7 +257,7 @@ static QDF_STATUS wlan_objmgr_vdev_obj_destroy(struct wlan_objmgr_vdev *vdev)
obj_status = wlan_objmgr_vdev_object_status(vdev);
if (obj_status == QDF_STATUS_E_FAILURE) {
qdf_print("%s: VDEV object deletion failed\n", __func__);
obj_mgr_err("VDEV object deletion failed: vdev-id: %d", vdev_id);
/* Ideally should not happen */
/* This leads to memleak ??? how to handle */
QDF_BUG(0);
@ -265,7 +277,7 @@ static QDF_STATUS wlan_objmgr_vdev_obj_destroy(struct wlan_objmgr_vdev *vdev)
QDF_STATUS wlan_objmgr_vdev_obj_delete(struct wlan_objmgr_vdev *vdev)
{
if (vdev == NULL) {
qdf_print("%s:vdev is NULL\n", __func__);
obj_mgr_err("vdev is NULL");
return QDF_STATUS_E_FAILURE;
}
/*
@ -424,17 +436,19 @@ QDF_STATUS wlan_objmgr_iterate_peerobj_list(
qdf_list_t *peer_list = NULL;
struct wlan_objmgr_peer *peer = NULL;
struct wlan_objmgr_peer *peer_next = NULL;
uint8_t vdev_id;
if (vdev == NULL) {
qdf_print("%s: VDEV NULL\n", __func__);
obj_mgr_err("VDEV is NULL");
return QDF_STATUS_E_FAILURE;
}
wlan_vdev_obj_lock(vdev);
vdev_id = wlan_vdev_get_id(vdev);
if (vdev->obj_state ==
WLAN_OBJ_STATE_LOGICALLY_DELETED) {
wlan_vdev_obj_unlock(vdev);
qdf_print("%s: VDEV is in delete progress\n", __func__);
obj_mgr_err("VDEV is in delete progress: vdev-id:%d", vdev_id);
return QDF_STATUS_E_FAILURE;
}
wlan_objmgr_vdev_get_ref(vdev, dbg_id);
@ -684,7 +698,7 @@ void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid id)
{
if (vdev == NULL) {
qdf_print("%s: vdev obj is NULL\n", __func__);
obj_mgr_err("vdev obj is NULL for id:%d", id);
QDF_ASSERT(0);
return;
}
@ -699,17 +713,20 @@ EXPORT_SYMBOL(wlan_objmgr_vdev_get_ref);
QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid id)
{
uint8_t vdev_id;
if (vdev == NULL) {
qdf_print("%s: vdev obj is NULL\n", __func__);
obj_mgr_err("vdev obj is NULL for id:%d", id);
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
wlan_vdev_obj_lock(vdev);
vdev_id = wlan_vdev_get_id(vdev);
if (vdev->obj_state == WLAN_OBJ_STATE_LOGICALLY_DELETED) {
wlan_vdev_obj_unlock(vdev);
qdf_print("%s: vdev obj is in Deletion Progress state\n",
__func__);
obj_mgr_err("called by %d, vdev obj is in Deletion Progress state: \
vdev-id:%d", id, vdev_id);
return QDF_STATUS_E_RESOURCES;
}
@ -724,21 +741,24 @@ EXPORT_SYMBOL(wlan_objmgr_vdev_try_get_ref);
void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid id)
{
uint8_t vdev_id;
if (vdev == NULL) {
qdf_print("%s: vdev obj is NULL\n", __func__);
obj_mgr_err("vdev obj is NULL for id:%d", id);
QDF_ASSERT(0);
return;
}
vdev_id = wlan_vdev_get_id(vdev);
if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_id_dbg[id])) {
qdf_print("%s: vdev ref cnt was not taken by %d\n",
__func__, id);
obj_mgr_err("vdev (id:%d)ref cnt was not taken by %d", vdev_id, id);
wlan_objmgr_print_ref_ids(vdev->vdev_objmgr.ref_id_dbg);
WLAN_OBJMGR_BUG(0);
}
if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_cnt)) {
qdf_print("%s: vdev ref cnt is 0\n", __func__);
obj_mgr_err("vdev ref cnt is 0");
WLAN_OBJMGR_BUG(0);
return;
}

View file

@ -47,7 +47,7 @@ typedef uint32_t wlan_scan_id;
#define SCM_BSS_CAP_VALUE_5GHZ 2
#define SCM_CANCEL_SCAN_WAIT_TIME 50
#define SCM_CANCEL_SCAN_WAIT_ITERATION 100
#define SCM_CANCEL_SCAN_WAIT_ITERATION 600
#define INVAL_SCAN_ID 0xFFFFFFFF
#define INVAL_VDEV_ID 0xFFFFFFFF