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

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

Merge 8ef52729 on remote branch

Change-Id: I2d0495e2416b8e7823a7118930a2c1410366706b
parents b00e7430 8ef52729
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -2311,11 +2311,13 @@ dp_get_pdev_from_soc_pdev_id_wifi3(struct dp_soc *soc,
 * @tid: TID
 * @ba_window_size: BlockAck window size
 * @start_seq: Starting sequence number
 * @bar_update: BAR update triggered
 *
 * Return: QDF_STATUS code
 */
QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t
					 ba_window_size, uint32_t start_seq);
					 ba_window_size, uint32_t start_seq,
					 bool bar_update);

/**
 * dp_get_peer_mac_list(): function to get peer mac list of vdev
+11 −9
Original line number Diff line number Diff line
@@ -2325,7 +2325,8 @@ static bool dp_get_peer_vdev_roaming_in_progress(struct dp_peer *peer)
}

QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t
					 ba_window_size, uint32_t start_seq)
					 ba_window_size, uint32_t start_seq,
					 bool bar_update)
{
	struct dp_rx_tid *rx_tid = &peer->rx_tid[tid];
	struct dp_soc *soc = peer->vdev->pdev->soc;
@@ -2357,7 +2358,7 @@ QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t
	if (dp_get_peer_vdev_roaming_in_progress(peer))
		return QDF_STATUS_E_PERM;

	if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup)
	if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup && !bar_update)
		soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup(
			soc->ctrl_psoc, peer->vdev->pdev->pdev_id,
			peer->vdev->vdev_id, peer->mac_addr.raw,
@@ -2548,7 +2549,7 @@ QDF_STATUS dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid,
	rx_tid->ba_win_size = ba_window_size;
	if (rx_tid->hw_qdesc_vaddr_unaligned)
		return dp_rx_tid_update_wifi3(peer, tid, ba_window_size,
			start_seq);
			start_seq, false);
	rx_tid->delba_tx_status = 0;
	rx_tid->ppdu_id_2k = 0;
	rx_tid->num_of_addba_req = 0;
@@ -3297,7 +3298,7 @@ int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc,
	if (status) {
		rx_tid->num_addba_rsp_failed++;
		dp_rx_tid_update_wifi3(peer, tid, 1,
				       IEEE80211_SEQ_MAX);
				       IEEE80211_SEQ_MAX, false);
		rx_tid->ba_status = DP_RX_BA_INACTIVE;
		qdf_spin_unlock_bh(&rx_tid->tid_lock);
		dp_err("RxTid- %d addba rsp tx completion failed", tid);
@@ -3324,7 +3325,8 @@ int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc,

	if (dp_rx_tid_update_wifi3(peer, tid,
				   rx_tid->ba_win_size,
				   rx_tid->startseqnum)) {
				   rx_tid->startseqnum,
				   false)) {
		dp_err("Failed update REO SSN");
	}

@@ -3493,7 +3495,7 @@ int dp_addba_requestprocess_wifi3(struct cdp_soc_t *cdp_soc,
	rx_tid->num_of_addba_req++;
	if ((rx_tid->ba_status == DP_RX_BA_ACTIVE &&
	     rx_tid->hw_qdesc_vaddr_unaligned)) {
		dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX);
		dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false);
		rx_tid->ba_status = DP_RX_BA_INACTIVE;
		peer->active_ba_session_cnt--;
		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
@@ -3632,7 +3634,7 @@ int dp_delba_process_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
	 */
	rx_tid->delba_rcode = reasoncode;
	rx_tid->num_of_delba_req++;
	dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX);
	dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false);

	rx_tid->ba_status = DP_RX_BA_INACTIVE;
	peer->active_ba_session_cnt--;
@@ -3695,12 +3697,12 @@ int dp_delba_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
		rx_tid->delba_tx_status = 0;
	}
	if (rx_tid->ba_status == DP_RX_BA_ACTIVE) {
		dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX);
		dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false);
		rx_tid->ba_status = DP_RX_BA_INACTIVE;
		peer->active_ba_session_cnt--;
	}
	if (rx_tid->ba_status == DP_RX_BA_IN_PROGRESS) {
		dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX);
		dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false);
		rx_tid->ba_status = DP_RX_BA_INACTIVE;
	}
	qdf_spin_unlock_bh(&rx_tid->tid_lock);
+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;
	}
+3 −3
Original line number Diff line number Diff line
@@ -819,7 +819,8 @@ void dp_rx_err_handle_bar(struct dp_soc *soc,

	status = dp_rx_tid_update_wifi3(peer, tid,
					peer->rx_tid[tid].ba_win_size,
					start_seq_num);
					start_seq_num,
					true);
	if (status != QDF_STATUS_SUCCESS) {
		dp_err_rl("failed to handle bar frame update rx tid");
		DP_STATS_INC(soc, rx.err.bar_handle_fail_count, 1);
@@ -949,8 +950,7 @@ dp_2k_jump_handle(struct dp_soc *soc,

	peer = dp_peer_get_ref_by_id(soc, peer_id, DP_MOD_ID_RX_ERR);
	if (!peer) {
		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
			  "peer not found");
		dp_info_rl("%pK: peer not found", soc);
		goto free_nbuf;
	}

Loading