[PATCH] regmap: Account for register length when chunking

Jim Wylder posted 1 patch 2 years, 8 months ago
There is a newer version of this series
drivers/base/regmap/regmap.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
[PATCH] regmap: Account for register length when chunking
Posted by Jim Wylder 2 years, 8 months ago
Currently, when regmap_raw_write() splits the data, it uses the
max_raw_write value defined for the bus.  For any bus that includes
the target register address in the max_raw_write value, the chunked
transmission will always exceed the maximum transmission length.
To avoid this problem, subtract the length of the register from the
maximum transmission.

Signed-off-by: Jim Wylder <jwylder@google.com>
---
 drivers/base/regmap/regmap.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index db7851f0e3b8c..1d1496c253ca6 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -2083,14 +2083,15 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
 	size_t chunk_count, chunk_bytes;
 	size_t chunk_regs = val_count;
 	int ret, i;
+	size_t max_data = map->max_raw_write - map->format.reg_bytes;
 
 	if (!val_count)
 		return -EINVAL;
 
 	if (map->use_single_write)
 		chunk_regs = 1;
-	else if (map->max_raw_write && val_len > map->max_raw_write)
-		chunk_regs = map->max_raw_write / val_bytes;
+	else if (map->max_raw_write && val_len > max_data)
+		chunk_regs = max_data / val_bytes;
 
 	chunk_count = val_count / chunk_regs;
 	chunk_bytes = chunk_regs * val_bytes;

base-commit: ad2fd53a7870a395b8564697bef6c329d017c6c9
-- 
2.40.1.606.ga4b1b128d6-goog
Re: [PATCH] regmap: Account for register length when chunking
Posted by Mark Brown 2 years, 8 months ago
On Tue, May 16, 2023 at 10:52:23AM -0500, Jim Wylder wrote:

> +	size_t max_data = map->max_raw_write - map->format.reg_bytes;

This still doesn't take account of padding bytes.

Please don't ignore review comments, people are generally making them
for a reason and are likely to have the same concerns if issues remain
unaddressed.  Having to repeat the same comments can get repetitive and
make people question the value of time spent reviewing.  If you disagree
with the review comments that's fine but you need to reply and discuss
your concerns so that the reviewer can understand your decisions.
regmap: Account for register length when chunking
Posted by Jim Wylder 2 years, 8 months ago
Sorry, I didn't intend to ignore your point about pad_bytes.  I had
misread the second half of the sentences as being the result of the
first half - rather than as an additional correction needed.

Thanks for the feedback.
[PATCH] regmap: Account for register length when chunking
Posted by Jim Wylder 2 years, 8 months ago
Currently, when regmap_raw_write() splits the data, it uses the
max_raw_write value defined for the bus.  For any bus that includes
the target register address in the max_raw_write value, the chunked
transmission will always exceed the maximum transmission length.
To avoid this problem, subtract the length of the register and the
padding from the maximum transmission.

Signed-off-by: Jim Wylder <jwylder@google.com>
---
 drivers/base/regmap/regmap.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index db7851f0e3b8c..fa2d3fba6ac9d 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -2082,6 +2082,8 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
 	size_t val_count = val_len / val_bytes;
 	size_t chunk_count, chunk_bytes;
 	size_t chunk_regs = val_count;
+	size_t max_data = map->max_raw_write - map->format.reg_bytes -
+			map->format.pad_bytes;
 	int ret, i;
 
 	if (!val_count)
@@ -2089,8 +2091,8 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
 
 	if (map->use_single_write)
 		chunk_regs = 1;
-	else if (map->max_raw_write && val_len > map->max_raw_write)
-		chunk_regs = map->max_raw_write / val_bytes;
+	else if (map->max_raw_write && val_len > max_data)
+		chunk_regs = max_data / val_bytes;
 
 	chunk_count = val_count / chunk_regs;
 	chunk_bytes = chunk_regs * val_bytes;

base-commit: ad2fd53a7870a395b8564697bef6c329d017c6c9
-- 
2.40.1.606.ga4b1b128d6-goog
Re: [PATCH] regmap: Account for register length when chunking
Posted by Mark Brown 2 years, 8 months ago
On Wed, 17 May 2023 10:20:11 -0500, Jim Wylder wrote:
> Currently, when regmap_raw_write() splits the data, it uses the
> max_raw_write value defined for the bus.  For any bus that includes
> the target register address in the max_raw_write value, the chunked
> transmission will always exceed the maximum transmission length.
> To avoid this problem, subtract the length of the register and the
> padding from the maximum transmission.
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git for-next

Thanks!

[1/1] regmap: Account for register length when chunking
      commit: 3981514180c987a79ea98f0ae06a7cbf58a9ac0f

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark