Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'i2c-for-6.17-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull i2c fixes from Wolfram Sang:

- hisi: update maintainership

- fix several issues in rtl9300 xfer:
- check message length boundaries
- correct multi-byte value composition on write
- increase polling timeout
- fix block transfer protocol

* tag 'i2c-for-6.17-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
i2c: rtl9300: Add missing count byte for SMBus Block Ops
i2c: rtl9300: Increase timeout for transfer polling
i2c: rtl9300: Fix multi-byte I2C write
i2c: rtl9300: Fix out-of-bounds bug in rtl9300_i2c_smbus_xfer
MAINTAINERS: i2c: Update i2c_hisi entry

+13 -9
+1 -1
MAINTAINERS
··· 11025 11025 F: drivers/perf/hisilicon/hns3_pmu.c 11026 11026 11027 11027 HISILICON I2C CONTROLLER DRIVER 11028 - M: Yicong Yang <yangyicong@hisilicon.com> 11028 + M: Devyn Liu <liudingyuan@h-partners.com> 11029 11029 L: linux-i2c@vger.kernel.org 11030 11030 S: Maintained 11031 11031 W: https://www.hisilicon.com
+12 -8
drivers/i2c/busses/i2c-rtl9300.c
··· 143 143 return -EIO; 144 144 145 145 for (i = 0; i < len; i++) { 146 - if (i % 4 == 0) 147 - vals[i/4] = 0; 148 - vals[i/4] <<= 8; 149 - vals[i/4] |= buf[i]; 146 + unsigned int shift = (i % 4) * 8; 147 + unsigned int reg = i / 4; 148 + 149 + vals[reg] |= buf[i] << shift; 150 150 } 151 151 152 152 return regmap_bulk_write(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_DATA_WORD0, ··· 175 175 return ret; 176 176 177 177 ret = regmap_read_poll_timeout(i2c->regmap, i2c->reg_base + RTL9300_I2C_MST_CTRL1, 178 - val, !(val & RTL9300_I2C_MST_CTRL1_I2C_TRIG), 100, 2000); 178 + val, !(val & RTL9300_I2C_MST_CTRL1_I2C_TRIG), 100, 100000); 179 179 if (ret) 180 180 return ret; 181 181 ··· 281 281 ret = rtl9300_i2c_reg_addr_set(i2c, command, 1); 282 282 if (ret) 283 283 goto out_unlock; 284 - ret = rtl9300_i2c_config_xfer(i2c, chan, addr, data->block[0]); 284 + if (data->block[0] < 1 || data->block[0] > I2C_SMBUS_BLOCK_MAX) { 285 + ret = -EINVAL; 286 + goto out_unlock; 287 + } 288 + ret = rtl9300_i2c_config_xfer(i2c, chan, addr, data->block[0] + 1); 285 289 if (ret) 286 290 goto out_unlock; 287 291 if (read_write == I2C_SMBUS_WRITE) { 288 - ret = rtl9300_i2c_write(i2c, &data->block[1], data->block[0]); 292 + ret = rtl9300_i2c_write(i2c, &data->block[0], data->block[0] + 1); 289 293 if (ret) 290 294 goto out_unlock; 291 295 } 292 - len = data->block[0]; 296 + len = data->block[0] + 1; 293 297 break; 294 298 295 299 default: