qcacmn: Add freeze_tlv_version in cfir_enh_dma_hdr

Add freeze_tlv_version in cfir_enh_dma_hdr where,
    version 1: Cypress/HastingsPrime which supports single user
               channel capture
    version 2: Maple/Spruce/Moselle which supports MU channel
               capture for up to 4 users
    version 3: Pine which supports MU channel capture for up to
               37 users

CRs-Fixed: 2741027
Change-Id: Iadd6dc2ff82030f502776ce35988b4472450337e
This commit is contained in:
Shwetha G K 2020-07-26 20:21:01 +05:30 • committed by snandini
commit 5ae97cd65b
2 changed files with 194 additions and 22 deletions

View file

@ -93,6 +93,18 @@
#define STREAMFS_NUM_SUBBUF_PINE 255
/* enum macrx_freeze_tlv_version: Reported by uCode in enh_dma_header
* MACRX_FREEZE_TLV_VERSION_1: Single MU UL user info reported by MAC
* MACRX_FREEZE_TLV_VERSION_2: Upto 4 MU UL user info reported by MAC
* MACRX_FREEZE_TLV_VERSION_3: Upto 37 MU UL user info reported by MAC
*/
enum macrx_freeze_tlv_version {
MACRX_FREEZE_TLV_VERSION_1 = 1,
MACRX_FREEZE_TLV_VERSION_2 = 2,
MACRX_FREEZE_TLV_VERSION_3 = 3,
MACRX_FREEZE_TLV_VERSION_MAX
};
/*
* @tag: ucode fills this with 0xBA
*
@ -169,6 +181,11 @@
* @freeze_data_incl: Indicates whether CFR header contains
* MACRX_FREEZE_CAPTURE_CHANNEL TLV
*
* @freeze_tlv_version: Indicates the version of freeze_tlv
* 1 - HSP, Cypress
* 2 - Maple/Spruce/Moselle
* 3 - Pine
*
* @decimation_factor: FFT bins decimation
* @mu_rx_num_users: Number of users in UL-MU-PPDU
*/
@ -191,21 +208,95 @@ struct whal_cfir_enhanced_hdr {
uint16_t total_bytes;
uint16_t header_version :4,
target_id :4,
cfr_fmt :1,
rsvd2 :1,
mu_rx_data_incl :1,
freeze_data_incl:1,
rsvd3 :4;
uint16_t header_version :4,
target_id :4,
cfr_fmt :1,
rsvd2 :1,
mu_rx_data_incl :1,
freeze_data_incl :1,
freeze_tlv_version :4;
uint16_t mu_rx_num_users :8,
decimation_factor :4,
rsvd4 :4;
rsvd3 :4;
uint16_t rsvd5;
uint16_t rsvd4;
};
/*
* freeze_tlv v1/v2 used by Hastings/Cypress/Maple/Spruce/Moselle supports upto
* 4 UL MU users
*
* @freeze:
* 0: Allow channel capture
* 1: Freeze channel capture
*
* @capture_reason: Field only valid when the freeze field is 1. Indicates why
* the MAC asked to capture the channel
* 0: freeze_reason_TM
* 1: freeze_reason_FTM
* 2: freeze_reason_ACK_resp_to_TM_FTM
* 3: freeze_reason_TA_RA_TYPE_FILTER
* 4: freeze readon NDP_NDP
* 5: freeze_reason_ALL_PACKET
*
* @packet_type: Packet type of captured packets.
* 0: Management
* 1: Control
* 2: Data
* 3: Extension
*
* @packet_sub_type: packet subtype of the captured packets.
* @sw_peer_id_valid: It is valid only when the freeze field is set to 1.
* 0: no TA address search on the received frame has been
* performed. This is due to the frame not having a TA address
* (like ACK frame), or the received frame being from an other
* AP to which this device is not associated.
* 1: field sw_peer_id will contain valid information.
* This implies that a (successful) address search has been
* performed on the TA address of the received frame.
*
* @sw_peer_id: Valid only when sw_peer_id_valid field is set. It is an
* identifier that allows SW to double check that the CSI info stored belongs
* to the device with this SW identifier.
*
* @phy_ppdu_id: ppdu_id of ppdu which has channel capture performed. Field
* only valid when the freeze field is set to 1.
*
* @packet_ta_lower_16: Packet’s lower 16bits transmit address in MAC header.
*
* @packet_ta_mid_16: Packet’s middle 16bits transmit address in MAC header.
*
* @packet_ta_upper_16: Packet’s upper 16bits transmit address in MAC header.
*
* @packet_ra_lower_16: Packet’s lower 16bits receive address in MAC header.
*
* @packet_ra_mid_16: Packet’s middle 16bits receive address in MAC header.
*
* @packet_ra_upper_16: Packet’s upper 16bits receive address in MAC header.
*
* @tsf_timestamp_15_0: MAC side 64bit TSF timestamp when this TLV is sent to
* PHY. Bits [15:0].
*
* @tsf_timestamp_31_16: MAC side 64bit TSF timestamp when this TLV is sent to
* PHY. Bits [31:16].
*
* @tsf_timestamp_47_32: MAC side 64bit TSF timestamp when this TLV is sent to
* PHY. Bits [47:32].
*
* @tsf_timestamp_63_48: MAC side 64bit TSF timestamp when this TLV is sent to
* PHY. Bits [63:48].
*
* @user_index_or_user_mask_5_0: When freeze_tlv_version is 1, this field from
* MAC, indicate to PHY which user's channel information need to be uploaded.
* When freeze_tlv_version is 2 & MU_SUPPORT_IN_TLV is 1, this field indicates
* bitmap of users upto 4 to which channel capture need to be uploaded. And if
* freeze_tlv_version is 2 & MU_SUPPORT_IN_TLV is 0, this field indicate to PHY
* which user's channel information need to be uploaded
*
* @directed: Indicate the frame is directed to us or not when NDPA/NDP capture
* or FTM/TM/ACK capture. 1=directed. For other modes, it is 0.
*/
struct macrx_freeze_capture_channel {
uint16_t freeze : 1, //[0]
capture_reason : 3, //[3:1]
@ -230,7 +321,83 @@ struct macrx_freeze_capture_channel {
reserved_13 : 9; //[15:7]
};
struct macrx_freeze_capture_channel_v2 {
/*
* freeze_tlv v3 used by Pine
*
* @freeze:
* 0: Allow channel capture
* 1: Freeze channel capture
*
* @capture_reason: Field only valid when the freeze field is 1. Indicates why
* the MAC asked to capture the channel
* 0: freeze_reason_TM
* 1: freeze_reason_FTM
* 2: freeze_reason_ACK_resp_to_TM_FTM
* 3: freeze_reason_TA_RA_TYPE_FILTER
* 4: freeze readon NDP_NDP
* 5: freeze_reason_ALL_PACKET
*
* @packet_type: Packet type of captured packets.
* 0: Management
* 1: Control
* 2: Data
* 3: Extension
*
* @packet_sub_type: packet subtype of the captured packets.
*
* @directed: Indicate the frame is directed to us or not when NDPA/NDP capture
* or FTM/TM/ACK capture. 1=directed. For other modes, it is 0.
*
* @sw_peer_id_valid: It is valid only when the freeze field is set to 1.
* 0: no TA address search on the received frame has been
* performed. This is due to the frame not having a TA address
* (like ACK frame), or the received frame being from an other
* AP to which this device is not associated.
* 1: field sw_peer_id will contain valid information.
* This implies that a (successful) address search has been
* performed on the TA address of the received frame.
*
* @sw_peer_id: Valid only when sw_peer_id_valid field is set. It is an
* identifier that allows SW to double check that the CSI info stored belongs
* to the device with this SW identifier.
*
* @phy_ppdu_id: ppdu_id of ppdu which has channel capture performed. Field
* only valid when the freeze field is set to 1.
*
* @packet_ta_lower_16: Packet’s lower 16bits transmit address in MAC header.
*
* @packet_ta_mid_16: Packet’s middle 16bits transmit address in MAC header.
*
* @packet_ta_upper_16: Packet’s upper 16bits transmit address in MAC header.
*
* @packet_ra_lower_16: Packet’s lower 16bits receive address in MAC header.
*
* @packet_ra_mid_16: Packet’s middle 16bits receive address in MAC header.
*
* @packet_ra_upper_16: Packet’s upper 16bits receive address in MAC header.
*
* @tsf_timestamp_15_0: MAC side 64bit TSF timestamp when this TLV is sent to
* PHY. Bits [15:0].
*
* @tsf_timestamp_31_16: MAC side 64bit TSF timestamp when this TLV is sent to
* PHY. Bits [31:16].
*
* @tsf_timestamp_47_32: MAC side 64bit TSF timestamp when this TLV is sent to
* PHY. Bits [47:32].
*
* @tsf_63_48_or_user_mask_36_32: Indicates to PHY which user's channel info
* need to be uploaded. Only valid in UL MU case with MU_SUPPORT_IN_TLV = 1.
* Otherwise this indicates to PHY MSBs 63:48 of the MAC side 64bit TSF
* timestamp when this TLV is sent to PHY.
*
* @user_index_or_user_mask_15_0: Indicate to PHY which user's channel info
* need to be uploaded in UL MU case with MU_SUPPORT_IN_TLV = 1. Otherwise it
* indicate PHY which user’s channel information need to be uploaded.
*
* @user_mask_31_16: Indicate to PHY which user’s channel information need to
* be uploaded. Only valid in UL MU case with MU_SUPPORT_IN_TLV = 1.
*/
struct macrx_freeze_capture_channel_v3 {
uint16_t freeze : 1, //[0]
capture_reason : 3, //[3:1]
packet_type : 2, //[5:4]

View file

@ -216,16 +216,16 @@ static void dump_freeze_tlv(void *freeze_tlv, uint32_t cookie)
}
/**
* dump_freeze_tlv_v2() - Dump freeze TLV v2 sent in enhanced DMA header
* dump_freeze_tlv_v3() - Dump freeze TLV v2 sent in enhanced DMA header
* @freeze_tlv: Freeze TLV sent from MAC to PHY
* @cookie: Index into lookup table
*
* Return: none
*/
static void dump_freeze_tlv_v2(void *freeze_tlv, uint32_t cookie)
static void dump_freeze_tlv_v3(void *freeze_tlv, uint32_t cookie)
{
struct macrx_freeze_capture_channel_v2 *freeze =
(struct macrx_freeze_capture_channel_v2 *)freeze_tlv;
struct macrx_freeze_capture_channel_v3 *freeze =
(struct macrx_freeze_capture_channel_v3 *)freeze_tlv;
cfr_debug("<DBRCOMP><FREEZE><%u>\n"
"freeze: %d capture_reason: %d packet_type: 0x%x\n"
@ -406,7 +406,8 @@ static void dump_enh_dma_hdr(struct whal_cfir_enhanced_hdr *dma_hdr,
"peer_id: %d ppdu_id: 0x%04x total_bytes: %d\n"
"header_version: %d target_id: %d cfr_fmt: %d\n"
"mu_rx_data_incl: %d freeze_data_incl: %d\n"
"mu_rx_num_users: %d decimation_factor: %d\n",
"mu_rx_num_users: %d decimation_factor: %d\n"
"freeze_tlv_version: %d\n",
cookie,
dma_hdr->tag,
dma_hdr->length,
@ -426,11 +427,13 @@ static void dump_enh_dma_hdr(struct whal_cfir_enhanced_hdr *dma_hdr,
dma_hdr->mu_rx_data_incl,
dma_hdr->freeze_data_incl,
dma_hdr->mu_rx_num_users,
dma_hdr->decimation_factor);
dma_hdr->decimation_factor,
dma_hdr->freeze_tlv_version);
if (dma_hdr->freeze_data_incl) {
if (header->chip_type == CFR_CAPTURE_RADIO_PINE)
dump_freeze_tlv_v2(freeze_tlv, cookie);
if (dma_hdr->freeze_tlv_version ==
MACRX_FREEZE_TLV_VERSION_3)
dump_freeze_tlv_v3(freeze_tlv, cookie);
else
dump_freeze_tlv(freeze_tlv, cookie);
}
@ -447,7 +450,8 @@ static void dump_enh_dma_hdr(struct whal_cfir_enhanced_hdr *dma_hdr,
"peer_id: %d ppdu_id: 0x%04x total_bytes: %d\n"
"header_version: %d target_id: %d cfr_fmt: %d\n"
"mu_rx_data_incl: %d freeze_data_incl: %d\n"
"mu_rx_num_users: %d decimation_factor: %d\n",
"mu_rx_num_users: %d decimation_factor: %d\n"
"freeze_tlv_version: %d\n",
cookie,
dma_hdr->tag,
dma_hdr->length,
@ -467,7 +471,8 @@ static void dump_enh_dma_hdr(struct whal_cfir_enhanced_hdr *dma_hdr,
dma_hdr->mu_rx_data_incl,
dma_hdr->freeze_data_incl,
dma_hdr->mu_rx_num_users,
dma_hdr->decimation_factor);
dma_hdr->decimation_factor,
dma_hdr->freeze_tlv_version);
}
}
@ -932,9 +937,9 @@ static bool enh_cfr_dbr_event_handler(struct wlan_objmgr_pdev *pdev,
if (dma_hdr.mu_rx_data_incl) {
uint8_t freeze_tlv_len;
if (pcfr->chip_type == CFR_CAPTURE_RADIO_PINE) {
if (dma_hdr.freeze_tlv_version == MACRX_FREEZE_TLV_VERSION_3) {
freeze_tlv_len =
sizeof(struct macrx_freeze_capture_channel_v2);
sizeof(struct macrx_freeze_capture_channel_v3);
} else {
freeze_tlv_len =
sizeof(struct macrx_freeze_capture_channel);