diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 1f3ebaa3d0..a7a0d265fd 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -1125,6 +1125,8 @@ enum cdp_pdev_param_type { * * @cdp_psoc_param_en_rate_stats: set rate stats enable/disable * @cdp_psoc_param_en_nss_cfg: set nss cfg + * + * @cdp_enable_tx_checksum: Flag to specify if HW Tx checksum enabled */ typedef union cdp_config_param_t { /* peer params */ @@ -1190,6 +1192,8 @@ typedef union cdp_config_param_t { int cdp_psoc_param_en_nss_cfg; int cdp_psoc_param_preferred_hw_mode; bool cdp_psoc_param_pext_stats; + + bool cdp_enable_tx_checksum; } cdp_config_param_type; /** @@ -1284,6 +1288,7 @@ enum cdp_vdev_param_type { #endif CDP_SAFEMODE, CDP_DROP_UNENC, + CDP_ENABLE_CSUM, }; /* @@ -2219,6 +2224,8 @@ struct cdp_rx_indication_msdu { * @p2p_tcp_udp_checksumoffload: Enable/Disable TCP/UDP Checksum Offload for P2P * @nan_tcp_udp_checksumoffload: Enable/Disable TCP/UDP Checksum Offload for NAN * @tcp_udp_checksumoffload: Enable/Disable TCP/UDP Checksum Offload + * @legacy_mode_checksumoffload_disable: Disable TCP/UDP Checksum Offload for + * legacy modes. * @napi_enable: Enable/Disable Napi * @ipa_enable: Flag indicating if IPA is enabled or not * @tx_flow_stop_queue_threshold: Value to Pause tx queues @@ -2236,6 +2243,7 @@ struct cdp_config_params { unsigned int p2p_tcp_udp_checksumoffload:1; unsigned int nan_tcp_udp_checksumoffload:1; unsigned int tcp_udp_checksumoffload:1; + unsigned int legacy_mode_checksumoffload_disable:1; unsigned int napi_enable:1; unsigned int ipa_enable:1; /* Set when QCA_LL_TX_FLOW_CONTROL_V2 is enabled */ @@ -2314,6 +2322,8 @@ enum cdp_dp_cfg { cfg_dp_enable_p2p_ip_tcp_udp_checksum_offload, cfg_dp_enable_nan_ip_tcp_udp_checksum_offload, cfg_dp_enable_ip_tcp_udp_checksum_offload, + /* Disable checksum offload for legacy modes */ + cfg_dp_disable_legacy_mode_csum_offload, cfg_dp_tso_enable, cfg_dp_lro_enable, cfg_dp_gro_enable, diff --git a/dp/inc/cdp_txrx_ctrl.h b/dp/inc/cdp_txrx_ctrl.h index 46f4ccc9cf..82aec55190 100644 --- a/dp/inc/cdp_txrx_ctrl.h +++ b/dp/inc/cdp_txrx_ctrl.h @@ -272,8 +272,11 @@ cdp_txrx_set_vdev_param(ol_txrx_soc_handle soc, } if (!soc->ops->ctrl_ops || - !soc->ops->ctrl_ops->txrx_set_vdev_param) + !soc->ops->ctrl_ops->txrx_set_vdev_param) { + QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, + "NULL vdev params callback"); return QDF_STATUS_E_FAILURE; + } return soc->ops->ctrl_ops->txrx_set_vdev_param(soc, vdev_id, type, val); diff --git a/dp/inc/cdp_txrx_mob_def.h b/dp/inc/cdp_txrx_mob_def.h index 91f4be1051..b68867f289 100644 --- a/dp/inc/cdp_txrx_mob_def.h +++ b/dp/inc/cdp_txrx_mob_def.h @@ -285,10 +285,12 @@ struct txrx_pdev_cfg_param_t { uint32_t uc_tx_partition_base; /* IP, TCP and UDP checksum offload */ bool ip_tcp_udp_checksum_offload; - /* IP, TCP and UDP checksum offload for NAN Mode*/ + /* IP, TCP and UDP checksum offload for NAN Mode */ bool nan_ip_tcp_udp_checksum_offload; /* IP, TCP and UDP checksum offload for P2P Mode*/ bool p2p_ip_tcp_udp_checksum_offload; + /* Checksum offload override flag for Legcay modes */ + bool legacy_mode_csum_disable; /* Rx processing in thread from TXRX */ bool enable_rxthread; /* CE classification enabled through INI */ diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index e0f06879fe..0ad93ed27e 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -8578,6 +8578,11 @@ dp_set_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, val.cdp_vdev_param_mesh_mode); break; #endif + case CDP_ENABLE_CSUM: + dp_info("vdev_id %d enable Checksum %d", vdev_id, + val.cdp_enable_tx_checksum); + vdev->csum_enabled = val.cdp_enable_tx_checksum; + break; default: break; } @@ -10142,6 +10147,10 @@ static uint32_t dp_get_cfg(struct cdp_soc_t *soc, enum cdp_dp_cfg cfg) case cfg_dp_enable_ip_tcp_udp_checksum_offload: value = dpsoc->wlan_cfg_ctx->tcp_udp_checksumoffload; break; + case cfg_dp_disable_legacy_mode_csum_offload: + value = dpsoc->wlan_cfg_ctx-> + legacy_mode_checksumoffload_disable; + break; case cfg_dp_tso_enable: value = dpsoc->wlan_cfg_ctx->tso_enabled; break; diff --git a/wlan_cfg/cfg_dp.h b/wlan_cfg/cfg_dp.h index 65703ccc69..af64ccc66b 100644 --- a/wlan_cfg/cfg_dp.h +++ b/wlan_cfg/cfg_dp.h @@ -940,6 +940,26 @@ #define CFG_DP_PEER_EXT_STATS \ CFG_INI_BOOL("peer_ext_stats", \ false, "Peer extended stats") +/* + * + * legacy_mode_csum_disable - Disable csum offload for legacy 802.11abg modes + * @Min: 0 + * @Max: 1 + * @Default: 0 + * + * This ini is used to disable HW checksum offload capability for legacy + * connections + * + * Related: gEnableIpTcpUdpChecksumOffload should be enabled + * + * Usage: Internal + * + * + */ + +#define CFG_DP_LEGACY_MODE_CSUM_DISABLE \ + CFG_INI_BOOL("legacy_mode_csum_disable", false, \ + "Enable/Disable legacy mode checksum") #define CFG_DP_RX_BUFF_POOL_ENABLE \ CFG_INI_BOOL("dp_rx_buff_prealloc_pool", false, \ @@ -1026,6 +1046,6 @@ CFG(CFG_DP_PEER_EXT_STATS) \ CFG(CFG_DP_RX_BUFF_POOL_ENABLE) \ CFG(CFG_DP_RX_PENDING_HL_THRESHOLD) \ - CFG(CFG_DP_RX_PENDING_LO_THRESHOLD) - + CFG(CFG_DP_RX_PENDING_LO_THRESHOLD) \ + CFG(CFG_DP_LEGACY_MODE_CSUM_DISABLE) #endif /* _CFG_DP_H_ */ diff --git a/wlan_cfg/wlan_cfg.c b/wlan_cfg/wlan_cfg.c index 3327b4a2fe..0e09e50638 100644 --- a/wlan_cfg/wlan_cfg.c +++ b/wlan_cfg/wlan_cfg.c @@ -547,6 +547,8 @@ wlan_cfg_soc_attach(struct cdp_ctrl_objmgr_psoc *psoc) cfg_get(psoc, CFG_DP_NAN_TCP_UDP_CKSUM_OFFLOAD); wlan_cfg_ctx->tcp_udp_checksumoffload = cfg_get(psoc, CFG_DP_TCP_UDP_CKSUM_OFFLOAD); + wlan_cfg_ctx->legacy_mode_checksumoffload_disable = + cfg_get(psoc, CFG_DP_LEGACY_MODE_CSUM_DISABLE); wlan_cfg_ctx->per_pkt_trace = cfg_get(psoc, CFG_DP_PER_PKT_LOGGING); wlan_cfg_ctx->defrag_timeout_check = cfg_get(psoc, CFG_DP_DEFRAG_TIMEOUT_CHECK); diff --git a/wlan_cfg/wlan_cfg.h b/wlan_cfg/wlan_cfg.h index 5605cb65a0..8ddd527ee5 100644 --- a/wlan_cfg/wlan_cfg.h +++ b/wlan_cfg/wlan_cfg.h @@ -244,6 +244,7 @@ struct wlan_cfg_dp_soc_ctxt { bool p2p_tcp_udp_checksumoffload; bool nan_tcp_udp_checksumoffload; bool tcp_udp_checksumoffload; + bool legacy_mode_checksumoffload_disable; bool defrag_timeout_check; int nss_cfg; uint32_t tx_flow_stop_queue_threshold;