* [PATCH v4 1/2] dt-bindings: ufs: Document static TX Equalization settings properties [not found] <20260528100614.3386423-1-can.guo@oss.qualcomm.com> @ 2026-05-28 10:06 ` Can Guo 2026-05-28 15:57 ` Bean Huo 2026-05-28 10:06 ` [PATCH v4 2/2] scsi: ufs: core: Add support for static TX Equalization settings Can Guo 1 sibling, 1 reply; 6+ messages in thread From: Can Guo @ 2026-05-28 10:06 UTC (permalink / raw) To: bvanassche, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Can Guo, Alim Akhtar, Avri Altman, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Ram Kumar Dwivedi, Zhaoming Luo, open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS, open list UFS v5.0/UFSHCI v5.0 add HS-G6 support (46.6 Gbps/lane) via UniPro v3.0 and M-PHY v6.0. In these specs, TX Equalization is defined for all High Speed Gears (not only HS-G6) to compensate channel loss and improve signal integrity at high speed operation. For HS-G6, M-PHY uses PAM4 1b1b line coding, Pre-Coding may also be required depending on channel characteristics. Add vendor-neutral DT properties: - patternProperties for txeq-preshoot-g[1-6] and txeq-deemphasis-g[1-6] - fixed property tx-precode-enable-g6 Each property is a uint32 array of per-lane tuples: <Host_Lane0 Device_Lane0>, [<Host_Lane1 Device_Lane1>] Accept 2 or 4 values (x1/x2 lane configs). PreShoot and DeEmphasis values are 0..7. Precode enable values are 0/1 and only applicable to HS-G6. Acked-by: Manivannan Sadhasivam <mani@kernel.org> Signed-off-by: Can Guo <can.guo@oss.qualcomm.com> --- .../devicetree/bindings/ufs/ufs-common.yaml | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/Documentation/devicetree/bindings/ufs/ufs-common.yaml b/Documentation/devicetree/bindings/ufs/ufs-common.yaml index ed97f5682509..d90cf25adfa5 100644 --- a/Documentation/devicetree/bindings/ufs/ufs-common.yaml +++ b/Documentation/devicetree/bindings/ufs/ufs-common.yaml @@ -105,6 +105,51 @@ properties: Restricts the UFS controller to rate-a or rate-b for both TX and RX directions. + tx-precode-enable-g6: + $ref: /schemas/types.yaml#/definitions/uint32-array + oneOf: + - minItems: 2 + maxItems: 2 + - minItems: 4 + maxItems: 4 + items: + enum: [0, 1] + description: | + Static TX Precode enable values for HS-G6 only. + Values are specified as per-lane tuples: + <Host_Lane0 Device_Lane0>, [<Host_Lane1 Device_Lane1>]. + +patternProperties: + "^txeq-preshoot-g[1-6]$": + $ref: /schemas/types.yaml#/definitions/uint32-array + oneOf: + - minItems: 2 + maxItems: 2 + - minItems: 4 + maxItems: 4 + items: + minimum: 0 + maximum: 7 + description: | + Static TX Equalization PreShoot values for High Speed Gears. + Values are specified as per-lane tuples: + <Host_Lane0 Device_Lane0>, [<Host_Lane1 Device_Lane1>]. + + "^txeq-deemphasis-g[1-6]$": + $ref: /schemas/types.yaml#/definitions/uint32-array + oneOf: + - minItems: 2 + maxItems: 2 + - minItems: 4 + maxItems: 4 + items: + minimum: 0 + maximum: 7 + description: | + Static TX Equalization DeEmphasis values for High Speed Gears. + Values are specified as per-lane tuples: + <Host_Lane0 Device_Lane0>, [<Host_Lane1 Device_Lane1>]. + dependencies: freq-table-hz: [ clocks ] operating-points-v2: [ clocks, clock-names ] -- 2.34.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/2] dt-bindings: ufs: Document static TX Equalization settings properties 2026-05-28 10:06 ` [PATCH v4 1/2] dt-bindings: ufs: Document static TX Equalization settings properties Can Guo @ 2026-05-28 15:57 ` Bean Huo 0 siblings, 0 replies; 6+ messages in thread From: Bean Huo @ 2026-05-28 15:57 UTC (permalink / raw) To: Can Guo, bvanassche, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Alim Akhtar, Avri Altman, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Ram Kumar Dwivedi, Zhaoming Luo, open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS, open list On Thu, 2026-05-28 at 03:06 -0700, Can Guo wrote: > UFS v5.0/UFSHCI v5.0 add HS-G6 support (46.6 Gbps/lane) via UniPro v3.0 > and M-PHY v6.0. In these specs, TX Equalization is defined for all High > Speed Gears (not only HS-G6) to compensate channel loss and improve signal > integrity at high speed operation. > > For HS-G6, M-PHY uses PAM4 1b1b line coding, Pre-Coding may also be > required depending on channel characteristics. > > Add vendor-neutral DT properties: > > - patternProperties for txeq-preshoot-g[1-6] and txeq-deemphasis-g[1-6] > - fixed property tx-precode-enable-g6 > > Each property is a uint32 array of per-lane tuples: > <Host_Lane0 Device_Lane0>, [<Host_Lane1 Device_Lane1>] > > Accept 2 or 4 values (x1/x2 lane configs). PreShoot and DeEmphasis values > are 0..7. Precode enable values are 0/1 and only applicable to HS-G6. > > Acked-by: Manivannan Sadhasivam <mani@kernel.org> > Signed-off-by: Can Guo <can.guo@oss.qualcomm.com> Looks good to me! Reviewed-by: Bean Huo <beanhuo@micron.com> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v4 2/2] scsi: ufs: core: Add support for static TX Equalization settings [not found] <20260528100614.3386423-1-can.guo@oss.qualcomm.com> 2026-05-28 10:06 ` [PATCH v4 1/2] dt-bindings: ufs: Document static TX Equalization settings properties Can Guo @ 2026-05-28 10:06 ` Can Guo 2026-05-28 12:27 ` Manivannan Sadhasivam 2026-05-28 16:02 ` Bart Van Assche 1 sibling, 2 replies; 6+ messages in thread From: Can Guo @ 2026-05-28 10:06 UTC (permalink / raw) To: bvanassche, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Can Guo, Alim Akhtar, Avri Altman, James E.J. Bottomley, Ram Kumar Dwivedi, Nitin Rawat, open list Static TX Equalization settings and TX Precode enable indication from DT properties txeq-preshoot-g[1-6], txeq-deemphasis-g[1-6], and tx-precode-enable-g6 are board-specific baseline values. Values are provided as per-lane tuples: <Host_Lane0 Device_Lane0>, [<Host_Lane1 Device_Lane1>] Parse DT u32 properties with explicit range checks by using of_property_count_u32_elems()/of_property_read_u32_array(). When adaptive TX Equalization is used, these static settings are not final: - If valid settings are retrieved from qTxEQGnSettings/wTxEQGnSettingsExt, those retrieved settings override static DT settings. - If retrieval is not available/valid, TX EQTR runs and trained settings override static DT settings. So static DT settings are a fallback and are intended for cases where adaptive TX Equalization is not enabled/used. Adaptive TX Equalization remains the primary path when enabled. No behavior changes for platforms that do not provide these properties. Signed-off-by: Can Guo <can.guo@oss.qualcomm.com> --- drivers/ufs/core/ufs-txeq.c | 10 ++- drivers/ufs/host/ufshcd-pltfrm.c | 126 +++++++++++++++++++++++++++++++ include/ufs/ufshcd.h | 2 + 3 files changed, 137 insertions(+), 1 deletion(-) diff --git a/drivers/ufs/core/ufs-txeq.c b/drivers/ufs/core/ufs-txeq.c index 4b264adfdf49..b645fe5f6d95 100644 --- a/drivers/ufs/core/ufs-txeq.c +++ b/drivers/ufs/core/ufs-txeq.c @@ -1297,7 +1297,13 @@ int ufshcd_config_tx_eq_settings(struct ufs_hba *hba, } params = &hba->tx_eq_params[gear - 1]; - if (!params->is_valid || force_tx_eqtr) { + /* + * TX EQTR must run for the following cases: + * 1. TX EQ settings are invalid. + * 2. TX EQ settings are valid but static, i.e., populated from DT. + * 3. TX EQTR procedure is forced. + */ + if (!params->is_valid || params->is_static || force_tx_eqtr) { int ret; ret = ufshcd_tx_eqtr(hba, params, pwr_mode); @@ -1310,6 +1316,7 @@ int ufshcd_config_tx_eq_settings(struct ufs_hba *hba, /* Mark TX Equalization settings as valid */ params->is_valid = true; params->is_trained = true; + params->is_static = false; params->is_applied = false; } @@ -1495,6 +1502,7 @@ static void ufshcd_extract_tx_eq_settings_attrs(struct ufs_hba *hba, u8 gear) } params->is_valid = true; + params->is_static = false; } void ufshcd_retrieve_tx_eq_settings(struct ufs_hba *hba) diff --git a/drivers/ufs/host/ufshcd-pltfrm.c b/drivers/ufs/host/ufshcd-pltfrm.c index c2dafb583cf5..6fe360efa80a 100644 --- a/drivers/ufs/host/ufshcd-pltfrm.c +++ b/drivers/ufs/host/ufshcd-pltfrm.c @@ -210,6 +210,130 @@ static void ufshcd_init_lanes_per_dir(struct ufs_hba *hba) } } +static void ufshcd_parse_static_tx_eq_settings(struct ufs_hba *hba) +{ + size_t sz = hba->lanes_per_direction * 2; + u32 lpd = hba->lanes_per_direction; + struct ufshcd_tx_eq_params *params; + u32 deemphasis[UFS_MAX_LANES * 2]; + u32 precode_en[UFS_MAX_LANES * 2]; + u32 preshoot[UFS_MAX_LANES * 2]; + struct device *dev = hba->dev; + char prop_name[MAX_PROP_SIZE]; + int i, err, count, gear, lane; + + if (!lpd || lpd > UFS_MAX_LANES) + return; + + for (gear = UFS_HS_G1; gear <= UFS_HS_GEAR_MAX; gear++) { + snprintf(prop_name, MAX_PROP_SIZE, "txeq-preshoot-g%d", gear); + count = of_property_count_u32_elems(dev->of_node, prop_name); + if (count <= 0) + continue; + + if (count != sz) { + dev_err(dev, "Property %s has invalid count (%d), expecting %zu\n", + prop_name, count, sz); + continue; + } + + err = of_property_read_u32_array(dev->of_node, prop_name, preshoot, sz); + if (err) { + dev_err(dev, "Failed to read %s property, %d\n", + prop_name, err); + continue; + } + + for (i = 0; i < count; i++) { + if (preshoot[i] >= TX_HS_NUM_PRESHOOT) { + dev_err(dev, "An invalid TX EQ PreShoot (%d) provided in %s property\n", + preshoot[i], prop_name); + break; + } + } + + if (i != count) + continue; + + snprintf(prop_name, MAX_PROP_SIZE, "txeq-deemphasis-g%d", gear); + count = of_property_count_u32_elems(dev->of_node, prop_name); + if (count <= 0) { + dev_err(dev, "Missing required %s property\n", prop_name); + continue; + } + + if (count != sz) { + dev_err(dev, "Property %s has invalid count (%d), expecting %zu\n", + prop_name, count, sz); + continue; + } + + err = of_property_read_u32_array(dev->of_node, prop_name, deemphasis, sz); + if (err) { + dev_err(dev, "Failed to read %s property, %d\n", + prop_name, err); + continue; + } + + for (i = 0; i < count; i++) { + if (deemphasis[i] >= TX_HS_NUM_DEEMPHASIS) { + dev_err(dev, "An invalid TX EQ DeEmphasis (%d) provided in %s property\n", + deemphasis[i], prop_name); + break; + } + } + + if (i != count) + continue; + + memset(precode_en, 0, sizeof(precode_en)); + if (gear == UFS_HS_G6) { + snprintf(prop_name, MAX_PROP_SIZE, "tx-precode-enable-g%d", gear); + count = of_property_count_u32_elems(dev->of_node, prop_name); + if (count > 0) { + if (count != sz) { + dev_err(dev, "Property %s has invalid count (%d), expecting %zu\n", + prop_name, count, sz); + continue; + } + + err = of_property_read_u32_array(dev->of_node, prop_name, + precode_en, sz); + if (err) { + dev_err(dev, "Failed to read %s property, %d\n", + prop_name, err); + continue; + } + + for (i = 0; i < count; i++) { + if (precode_en[i] > 1) { + dev_err(dev, "An invalid PrecodeEn (%d) provided in %s property\n", + precode_en[i], prop_name); + break; + } + } + + if (i != count) + continue; + } + } + + params = &hba->tx_eq_params[gear - 1]; + for (lane = 0; lane < lpd; lane++) { + params->host[lane].preshoot = preshoot[lane * 2]; + params->host[lane].deemphasis = deemphasis[lane * 2]; + params->host[lane].precode_en = precode_en[lane * 2]; + + params->device[lane].preshoot = preshoot[lane * 2 + 1]; + params->device[lane].deemphasis = deemphasis[lane * 2 + 1]; + params->device[lane].precode_en = precode_en[lane * 2 + 1]; + } + + params->is_valid = true; + params->is_static = true; + } +} + /** * ufshcd_parse_clock_min_max_freq - Parse MIN and MAX clocks freq * @hba: per adapter instance @@ -528,6 +652,8 @@ int ufshcd_pltfrm_init(struct platform_device *pdev, ufshcd_init_lanes_per_dir(hba); + ufshcd_parse_static_tx_eq_settings(hba); + err = ufshcd_parse_operating_points(hba); if (err) { dev_err(dev, "%s: OPP parse failed %d\n", __func__, err); diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h index f48d6416e299..c01824576472 100644 --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h @@ -359,6 +359,7 @@ struct ufshcd_tx_eqtr_record { * @is_valid: True if parameter contains valid TX Equalization settings * @is_applied: True if settings have been applied to UniPro of both sides * @is_trained: True if parameters obtained from TX EQTR procedure + * @is_static: True if settings are static */ struct ufshcd_tx_eq_params { struct ufshcd_tx_eq_settings host[UFS_MAX_LANES]; @@ -367,6 +368,7 @@ struct ufshcd_tx_eq_params { bool is_valid; bool is_applied; bool is_trained; + bool is_static; }; /** -- 2.34.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 2/2] scsi: ufs: core: Add support for static TX Equalization settings 2026-05-28 10:06 ` [PATCH v4 2/2] scsi: ufs: core: Add support for static TX Equalization settings Can Guo @ 2026-05-28 12:27 ` Manivannan Sadhasivam 2026-05-28 16:02 ` Bart Van Assche 1 sibling, 0 replies; 6+ messages in thread From: Manivannan Sadhasivam @ 2026-05-28 12:27 UTC (permalink / raw) To: Can Guo Cc: bvanassche, beanhuo, peter.wang, martin.petersen, linux-scsi, Alim Akhtar, Avri Altman, James E.J. Bottomley, Ram Kumar Dwivedi, Nitin Rawat, open list On Thu, May 28, 2026 at 03:06:14AM -0700, Can Guo wrote: > Static TX Equalization settings and TX Precode enable indication from DT > properties txeq-preshoot-g[1-6], txeq-deemphasis-g[1-6], and > tx-precode-enable-g6 are board-specific baseline values. Values are > provided as per-lane tuples: > > <Host_Lane0 Device_Lane0>, [<Host_Lane1 Device_Lane1>] > > Parse DT u32 properties with explicit range checks by using > of_property_count_u32_elems()/of_property_read_u32_array(). > > When adaptive TX Equalization is used, these static settings are not final: > > - If valid settings are retrieved from qTxEQGnSettings/wTxEQGnSettingsExt, > those retrieved settings override static DT settings. > - If retrieval is not available/valid, TX EQTR runs and trained settings > override static DT settings. > > So static DT settings are a fallback and are intended for cases where > adaptive TX Equalization is not enabled/used. Adaptive TX Equalization > remains the primary path when enabled. > > No behavior changes for platforms that do not provide these properties. > > Signed-off-by: Can Guo <can.guo@oss.qualcomm.com> Reviewed-by: Manivannan Sadhasivam <mani@kernel.org> - Mani > --- > drivers/ufs/core/ufs-txeq.c | 10 ++- > drivers/ufs/host/ufshcd-pltfrm.c | 126 +++++++++++++++++++++++++++++++ > include/ufs/ufshcd.h | 2 + > 3 files changed, 137 insertions(+), 1 deletion(-) > > diff --git a/drivers/ufs/core/ufs-txeq.c b/drivers/ufs/core/ufs-txeq.c > index 4b264adfdf49..b645fe5f6d95 100644 > --- a/drivers/ufs/core/ufs-txeq.c > +++ b/drivers/ufs/core/ufs-txeq.c > @@ -1297,7 +1297,13 @@ int ufshcd_config_tx_eq_settings(struct ufs_hba *hba, > } > > params = &hba->tx_eq_params[gear - 1]; > - if (!params->is_valid || force_tx_eqtr) { > + /* > + * TX EQTR must run for the following cases: > + * 1. TX EQ settings are invalid. > + * 2. TX EQ settings are valid but static, i.e., populated from DT. > + * 3. TX EQTR procedure is forced. > + */ > + if (!params->is_valid || params->is_static || force_tx_eqtr) { > int ret; > > ret = ufshcd_tx_eqtr(hba, params, pwr_mode); > @@ -1310,6 +1316,7 @@ int ufshcd_config_tx_eq_settings(struct ufs_hba *hba, > /* Mark TX Equalization settings as valid */ > params->is_valid = true; > params->is_trained = true; > + params->is_static = false; > params->is_applied = false; > } > > @@ -1495,6 +1502,7 @@ static void ufshcd_extract_tx_eq_settings_attrs(struct ufs_hba *hba, u8 gear) > } > > params->is_valid = true; > + params->is_static = false; > } > > void ufshcd_retrieve_tx_eq_settings(struct ufs_hba *hba) > diff --git a/drivers/ufs/host/ufshcd-pltfrm.c b/drivers/ufs/host/ufshcd-pltfrm.c > index c2dafb583cf5..6fe360efa80a 100644 > --- a/drivers/ufs/host/ufshcd-pltfrm.c > +++ b/drivers/ufs/host/ufshcd-pltfrm.c > @@ -210,6 +210,130 @@ static void ufshcd_init_lanes_per_dir(struct ufs_hba *hba) > } > } > > +static void ufshcd_parse_static_tx_eq_settings(struct ufs_hba *hba) > +{ > + size_t sz = hba->lanes_per_direction * 2; > + u32 lpd = hba->lanes_per_direction; > + struct ufshcd_tx_eq_params *params; > + u32 deemphasis[UFS_MAX_LANES * 2]; > + u32 precode_en[UFS_MAX_LANES * 2]; > + u32 preshoot[UFS_MAX_LANES * 2]; > + struct device *dev = hba->dev; > + char prop_name[MAX_PROP_SIZE]; > + int i, err, count, gear, lane; > + > + if (!lpd || lpd > UFS_MAX_LANES) > + return; > + > + for (gear = UFS_HS_G1; gear <= UFS_HS_GEAR_MAX; gear++) { > + snprintf(prop_name, MAX_PROP_SIZE, "txeq-preshoot-g%d", gear); > + count = of_property_count_u32_elems(dev->of_node, prop_name); > + if (count <= 0) > + continue; > + > + if (count != sz) { > + dev_err(dev, "Property %s has invalid count (%d), expecting %zu\n", > + prop_name, count, sz); > + continue; > + } > + > + err = of_property_read_u32_array(dev->of_node, prop_name, preshoot, sz); > + if (err) { > + dev_err(dev, "Failed to read %s property, %d\n", > + prop_name, err); > + continue; > + } > + > + for (i = 0; i < count; i++) { > + if (preshoot[i] >= TX_HS_NUM_PRESHOOT) { > + dev_err(dev, "An invalid TX EQ PreShoot (%d) provided in %s property\n", > + preshoot[i], prop_name); > + break; > + } > + } > + > + if (i != count) > + continue; > + > + snprintf(prop_name, MAX_PROP_SIZE, "txeq-deemphasis-g%d", gear); > + count = of_property_count_u32_elems(dev->of_node, prop_name); > + if (count <= 0) { > + dev_err(dev, "Missing required %s property\n", prop_name); > + continue; > + } > + > + if (count != sz) { > + dev_err(dev, "Property %s has invalid count (%d), expecting %zu\n", > + prop_name, count, sz); > + continue; > + } > + > + err = of_property_read_u32_array(dev->of_node, prop_name, deemphasis, sz); > + if (err) { > + dev_err(dev, "Failed to read %s property, %d\n", > + prop_name, err); > + continue; > + } > + > + for (i = 0; i < count; i++) { > + if (deemphasis[i] >= TX_HS_NUM_DEEMPHASIS) { > + dev_err(dev, "An invalid TX EQ DeEmphasis (%d) provided in %s property\n", > + deemphasis[i], prop_name); > + break; > + } > + } > + > + if (i != count) > + continue; > + > + memset(precode_en, 0, sizeof(precode_en)); > + if (gear == UFS_HS_G6) { > + snprintf(prop_name, MAX_PROP_SIZE, "tx-precode-enable-g%d", gear); > + count = of_property_count_u32_elems(dev->of_node, prop_name); > + if (count > 0) { > + if (count != sz) { > + dev_err(dev, "Property %s has invalid count (%d), expecting %zu\n", > + prop_name, count, sz); > + continue; > + } > + > + err = of_property_read_u32_array(dev->of_node, prop_name, > + precode_en, sz); > + if (err) { > + dev_err(dev, "Failed to read %s property, %d\n", > + prop_name, err); > + continue; > + } > + > + for (i = 0; i < count; i++) { > + if (precode_en[i] > 1) { > + dev_err(dev, "An invalid PrecodeEn (%d) provided in %s property\n", > + precode_en[i], prop_name); > + break; > + } > + } > + > + if (i != count) > + continue; > + } > + } > + > + params = &hba->tx_eq_params[gear - 1]; > + for (lane = 0; lane < lpd; lane++) { > + params->host[lane].preshoot = preshoot[lane * 2]; > + params->host[lane].deemphasis = deemphasis[lane * 2]; > + params->host[lane].precode_en = precode_en[lane * 2]; > + > + params->device[lane].preshoot = preshoot[lane * 2 + 1]; > + params->device[lane].deemphasis = deemphasis[lane * 2 + 1]; > + params->device[lane].precode_en = precode_en[lane * 2 + 1]; > + } > + > + params->is_valid = true; > + params->is_static = true; > + } > +} > + > /** > * ufshcd_parse_clock_min_max_freq - Parse MIN and MAX clocks freq > * @hba: per adapter instance > @@ -528,6 +652,8 @@ int ufshcd_pltfrm_init(struct platform_device *pdev, > > ufshcd_init_lanes_per_dir(hba); > > + ufshcd_parse_static_tx_eq_settings(hba); > + > err = ufshcd_parse_operating_points(hba); > if (err) { > dev_err(dev, "%s: OPP parse failed %d\n", __func__, err); > diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h > index f48d6416e299..c01824576472 100644 > --- a/include/ufs/ufshcd.h > +++ b/include/ufs/ufshcd.h > @@ -359,6 +359,7 @@ struct ufshcd_tx_eqtr_record { > * @is_valid: True if parameter contains valid TX Equalization settings > * @is_applied: True if settings have been applied to UniPro of both sides > * @is_trained: True if parameters obtained from TX EQTR procedure > + * @is_static: True if settings are static > */ > struct ufshcd_tx_eq_params { > struct ufshcd_tx_eq_settings host[UFS_MAX_LANES]; > @@ -367,6 +368,7 @@ struct ufshcd_tx_eq_params { > bool is_valid; > bool is_applied; > bool is_trained; > + bool is_static; > }; > > /** > -- > 2.34.1 > -- மணிவண்ணன் சதாசிவம் ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 2/2] scsi: ufs: core: Add support for static TX Equalization settings 2026-05-28 10:06 ` [PATCH v4 2/2] scsi: ufs: core: Add support for static TX Equalization settings Can Guo 2026-05-28 12:27 ` Manivannan Sadhasivam @ 2026-05-28 16:02 ` Bart Van Assche 2026-05-29 1:11 ` Can Guo 1 sibling, 1 reply; 6+ messages in thread From: Bart Van Assche @ 2026-05-28 16:02 UTC (permalink / raw) To: Can Guo, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Alim Akhtar, Avri Altman, James E.J. Bottomley, Ram Kumar Dwivedi, Nitin Rawat, open list On 5/28/26 3:06 AM, Can Guo wrote: > +static void ufshcd_parse_static_tx_eq_settings(struct ufs_hba *hba) > +{ > + size_t sz = hba->lanes_per_direction * 2; Please mark constants with "const". Additionally, is "sz" a good name for this variable? The code below compares "count" and "sz". I haven't seen it before that a count and a size are compared with each other. Why "size_t" as data type? u32 should be sufficient, isn't it? > + u32 lpd = hba->lanes_per_direction; Is this another constant? > + if (!lpd || lpd > UFS_MAX_LANES) > + return; Should a kernel warning perhaps be issued if lpd > UFS_MAX_LANES? > + for (gear = UFS_HS_G1; gear <= UFS_HS_GEAR_MAX; gear++) { > + snprintf(prop_name, MAX_PROP_SIZE, "txeq-preshoot-g%d", gear); > + count = of_property_count_u32_elems(dev->of_node, prop_name); > + if (count <= 0) > + continue; The body of this for-loop is long. Please consider moving the body of this for-loop into a new function to reduce the indentation level of the code. > + for (i = 0; i < count; i++) { > + if (preshoot[i] >= TX_HS_NUM_PRESHOOT) { > + dev_err(dev, "An invalid TX EQ PreShoot (%d) provided in %s property\n", > + preshoot[i], prop_name); > + break; > + } > + } > + > + if (i != count) > + continue; The traditional way in the Linux kernel for breaking out of a nested loop is using a "goto" or "return" statement. Thanks, Bart. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 2/2] scsi: ufs: core: Add support for static TX Equalization settings 2026-05-28 16:02 ` Bart Van Assche @ 2026-05-29 1:11 ` Can Guo 0 siblings, 0 replies; 6+ messages in thread From: Can Guo @ 2026-05-29 1:11 UTC (permalink / raw) To: Bart Van Assche, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Alim Akhtar, Avri Altman, James E.J. Bottomley, Ram Kumar Dwivedi, Nitin Rawat, open list On 5/29/2026 12:02 AM, Bart Van Assche wrote: > On 5/28/26 3:06 AM, Can Guo wrote: >> +static void ufshcd_parse_static_tx_eq_settings(struct ufs_hba *hba) >> +{ >> + size_t sz = hba->lanes_per_direction * 2; > > Please mark constants with "const". Additionally, is "sz" a good name > for this variable? The code below compares "count" and "sz". I haven't > seen it before that a count and a size are compared with each other. > > Why "size_t" as data type? u32 should be sufficient, isn't it? > >> + u32 lpd = hba->lanes_per_direction; > > Is this another constant? > >> + if (!lpd || lpd > UFS_MAX_LANES) >> + return; > > Should a kernel warning perhaps be issued if lpd > UFS_MAX_LANES? > >> + for (gear = UFS_HS_G1; gear <= UFS_HS_GEAR_MAX; gear++) { >> + snprintf(prop_name, MAX_PROP_SIZE, "txeq-preshoot-g%d", gear); >> + count = of_property_count_u32_elems(dev->of_node, prop_name); >> + if (count <= 0) >> + continue; > > The body of this for-loop is long. Please consider moving the body of > this for-loop into a new function to reduce the indentation level of > the code. > >> + for (i = 0; i < count; i++) { >> + if (preshoot[i] >= TX_HS_NUM_PRESHOOT) { >> + dev_err(dev, "An invalid TX EQ PreShoot (%d) >> provided in %s property\n", >> + preshoot[i], prop_name); >> + break; >> + } >> + } >> + >> + if (i != count) >> + continue; > > The traditional way in the Linux kernel for breaking out of a nested > loop is using a "goto" or "return" statement. Hi Bart, Thanks for the review, I will address them in next version. Can Guo. > > Thanks, > > Bart. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-05-29 1:11 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20260528100614.3386423-1-can.guo@oss.qualcomm.com>
2026-05-28 10:06 ` [PATCH v4 1/2] dt-bindings: ufs: Document static TX Equalization settings properties Can Guo
2026-05-28 15:57 ` Bean Huo
2026-05-28 10:06 ` [PATCH v4 2/2] scsi: ufs: core: Add support for static TX Equalization settings Can Guo
2026-05-28 12:27 ` Manivannan Sadhasivam
2026-05-28 16:02 ` Bart Van Assche
2026-05-29 1:11 ` Can Guo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®