Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a7f68bb9 authored by Linux Build Service Account's avatar Linux Build Service Account
Browse files

Merge 5ec748e3 on remote branch

Change-Id: Ic85b50f916efcb0cd2a8b8b6b027c956d2c10391
parents 5cd4a4cf 5ec748e3
Loading
Loading
Loading
Loading
+19 −11
Original line number Diff line number Diff line
@@ -2783,18 +2783,26 @@ uint32_t dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl,
		 * Check if DMA completed -- msdu_done is the last bit
		 * to be written
		 */
		if (qdf_unlikely(!qdf_nbuf_is_rx_chfrag_cont(nbuf) &&
				 !hal_rx_attn_msdu_done_get(rx_tlv_hdr))) {
			dp_err("MSDU DONE failure");
		if (qdf_likely(!qdf_nbuf_is_rx_chfrag_cont(nbuf))) {
			if (qdf_unlikely(!hal_rx_attn_msdu_done_get(
								 rx_tlv_hdr))) {
				dp_err_rl("MSDU DONE failure");
				DP_STATS_INC(soc, rx.err.msdu_done_fail, 1);
				hal_rx_dump_pkt_tlvs(hal_soc, rx_tlv_hdr,
						     QDF_TRACE_LEVEL_INFO);
				tid_stats->fail_cnt[MSDU_DONE_FAILURE]++;
			qdf_nbuf_free(nbuf);
				qdf_assert(0);
				qdf_nbuf_free(nbuf);
				nbuf = next;
				continue;
			} else if (qdf_unlikely(hal_rx_attn_msdu_len_err_get(
								 rx_tlv_hdr))) {
				DP_STATS_INC(soc, rx.err.msdu_len_err, 1);
				qdf_nbuf_free(nbuf);
				nbuf = next;
				continue;
			}
		}

		DP_HIST_PACKET_COUNT_INC(vdev->pdev->pdev_id);
		/*
+57 −0
Original line number Diff line number Diff line
@@ -51,6 +51,17 @@ const struct dp_rx_defrag_cipher dp_f_wep = {
	0,
};

/*
 * The header and mic length are same for both
 * GCMP-128 and GCMP-256.
 */
const struct dp_rx_defrag_cipher dp_f_gcmp = {
	"AES-GCMP",
	WLAN_IEEE80211_GCMP_HEADERLEN,
	WLAN_IEEE80211_GCMP_MICLEN,
	WLAN_IEEE80211_GCMP_MICLEN,
};

/*
 * dp_rx_defrag_frames_free(): Free fragment chain
 * @frames: Fragment chain
@@ -1419,6 +1430,36 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer,
}
#endif

/*
 * dp_rx_defrag_gcmp_demic(): Remove MIC information from GCMP fragment
 * @nbuf: Pointer to the fragment buffer
 * @hdrlen: 802.11 header length
 *
 * Remove MIC information from GCMP fragment
 *
 * Returns: QDF_STATUS
 */
static QDF_STATUS dp_rx_defrag_gcmp_demic(qdf_nbuf_t nbuf, uint16_t hdrlen)
{
	uint8_t *ivp, *orig_hdr;
	int rx_desc_len = SIZE_OF_DATA_RX_TLV;

	/* start of the 802.11 header */
	orig_hdr = (uint8_t *)(qdf_nbuf_data(nbuf) + rx_desc_len);

	/*
	 * GCMP header is located after 802.11 header and EXTIV
	 * field should always be set to 1 for GCMP protocol.
	 */
	ivp = orig_hdr + hdrlen;
	if (!(ivp[IEEE80211_WEP_IVLEN] & IEEE80211_WEP_EXTIV))
		return QDF_STATUS_E_DEFRAG_ERROR;

	qdf_nbuf_trim_tail(nbuf, dp_f_gcmp.ic_trailer);

	return QDF_STATUS_SUCCESS;
}

/*
 * dp_rx_defrag(): Defragment the fragment chain
 * @peer: Pointer to the peer
@@ -1528,6 +1569,22 @@ static QDF_STATUS dp_rx_defrag(struct dp_peer *peer, unsigned tid,
		/* If success, increment header to be stripped later */
		hdr_space += dp_f_wep.ic_header;
		break;
	case cdp_sec_type_aes_gcmp:
	case cdp_sec_type_aes_gcmp_256:
		while (cur) {
			tmp_next = qdf_nbuf_next(cur);
			if (dp_rx_defrag_gcmp_demic(cur, hdr_space)) {
				QDF_TRACE(QDF_MODULE_ID_TXRX,
					  QDF_TRACE_LEVEL_ERROR,
					  "dp_rx_defrag: GCMP demic failed");

				return QDF_STATUS_E_DEFRAG_ERROR;
			}
			cur = tmp_next;
		}

		hdr_space += dp_f_gcmp.ic_header;
		break;
	default:
		break;
	}
+2 −0
Original line number Diff line number Diff line
@@ -1036,6 +1036,8 @@ struct dp_soc_stats {
			uint32_t intrabss_eapol_drop;
			/* Non Eapol pkt drop cnt due to peer not authorized */
			uint32_t peer_unauth_rx_pkt_drop;
			/* MSDU len err count */
			uint32_t msdu_len_err;
		} err;

		/* packet count per core - per ring */
+7 −0
Original line number Diff line number Diff line
@@ -290,12 +290,14 @@ struct hal_reg_write_q_elem {
 * @dequeues: writes dequeued from delayed work (not written yet)
 * @coalesces: writes not enqueued since srng is already queued up
 * @direct: writes not enqueued and written to register directly
 * @dequeue_delay: dequeue operation be delayed
 */
struct hal_reg_write_srng_stats {
	uint32_t enqueues;
	uint32_t dequeues;
	uint32_t coalesces;
	uint32_t direct;
	uint32_t dequeue_delay;
};

/**
@@ -324,6 +326,7 @@ enum hal_reg_sched_delay {
 * @q_depth: current queue depth in delayed register write queue
 * @max_q_depth: maximum queue for delayed register write queue
 * @sched_delay: = kernel work sched delay + bus wakeup delay, histogram
 * @dequeue_delay: dequeue operation be delayed
 */
struct hal_reg_write_soc_stats {
	qdf_atomic_t enqueues;
@@ -334,6 +337,7 @@ struct hal_reg_write_soc_stats {
	qdf_atomic_t q_depth;
	uint32_t max_q_depth;
	uint32_t sched_delay[REG_WRITE_SCHED_DELAY_HIST_MAX];
	uint32_t dequeue_delay;
};

#ifdef FEATURE_HAL_DELAYED_REG_WRITE_V2
@@ -474,6 +478,9 @@ struct hal_srng {
	uint32_t last_reg_wr_val;
	/* flag to indicate whether srng is already queued for delayed write */
	uint8_t reg_write_in_progress;
	/* last dequeue elem time stamp */
	qdf_time_t last_dequeue_time;

	/* srng specific delayed write stats */
	struct hal_reg_write_srng_stats wstats;
#endif
+22 −0
Original line number Diff line number Diff line
@@ -4035,4 +4035,26 @@ uint32_t hal_rx_attn_offset_get(hal_soc_handle_t hal_soc_hdl)

	return hal_soc->ops->hal_rx_attn_offset_get();
}

#define HAL_RX_ATTN_MSDU_LEN_ERR_GET(_rx_attn)		\
	(_HAL_MS((*_OFFSET_TO_WORD_PTR(_rx_attn,	\
		RX_ATTENTION_1_MSDU_LENGTH_ERR_OFFSET)),	\
		RX_ATTENTION_1_MSDU_LENGTH_ERR_MASK,		\
		RX_ATTENTION_1_MSDU_LENGTH_ERR_LSB))

/**
 * hal_rx_attn_msdu_len_err_get(): Get msdu_len_err value from
 *  rx attention tlvs
 * @buf: pointer to rx pkt tlvs hdr
 *
 * Return: msdu_len_err value
 */
static inline uint32_t
hal_rx_attn_msdu_len_err_get(uint8_t *buf)
{
	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
	struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;

	return HAL_RX_ATTN_MSDU_LEN_ERR_GET(rx_attn);
}
#endif /* _HAL_RX_H */
Loading