From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-eopbgr00121.outbound.protection.outlook.com ([40.107.0.121]:65481 "EHLO EUR02-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758049AbdKGQYy (ORCPT ); Tue, 7 Nov 2017 11:24:54 -0500 Reply-To: stephend@adiengineering.com Subject: Re: [PATCH 3.16 167/294] i2c: ismt: Don't duplicate the receive length for block reads To: Ben Hutchings , linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: akpm@linux-foundation.org, Dan Priamo , Neil Horman , Wolfram Sang , Pontus Andersson References: From: Stephen Douthit Message-ID: <0648c7a9-a683-46f1-55b5-ac9faa194262@adiengineering.com> Date: Tue, 7 Nov 2017 11:24:36 -0500 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: stable-owner@vger.kernel.org List-ID: On 11/06/2017 06:03 PM, Ben Hutchings wrote: > 3.16.50-rc1 review patch. If anyone has any objections, please let me know. Pontus found that this patch trades one bug for another (fixes SMBus reads, breaks I2C reads) and provided a fix. You'll also want c6ebcedbab7ca78984959386012a17b21183e1a3 from upstream. -Steve > ------------------ > > From: Stephen Douthit > > commit b6c159a9cb69c2cf0bf59d4e12c3a2da77e4d994 upstream. > > According to Table 15-14 of the C2000 EDS (Intel doc #510524) the > rx data pointed to by the descriptor dptr contains the byte count. > > desc->rxbytes reports all bytes read on the wire, including the > "byte count" byte. So if a device sends 4 bytes in response to a > block read, on the wire and in the DMA buffer we see: > > count data1 data2 data3 data4 > 0x04 0xde 0xad 0xbe 0xef > > That's what we want to return in data->block to the next level. > > Instead we were actually prefixing that with desc->rxbytes: > > bad > count count data1 data2 data3 data4 > 0x05 0x04 0xde 0xad 0xbe 0xef > > This was discovered while developing a BMC solution relying on the > ipmi_ssif.c driver which was trying to interpret the bogus length > field as part of the IPMI response. > > Signed-off-by: Stephen Douthit > Tested-by: Dan Priamo > Acked-by: Neil Horman > Signed-off-by: Wolfram Sang > Signed-off-by: Ben Hutchings > --- > drivers/i2c/busses/i2c-ismt.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > --- a/drivers/i2c/busses/i2c-ismt.c > +++ b/drivers/i2c/busses/i2c-ismt.c > @@ -344,8 +344,8 @@ static int ismt_process_desc(const struc > break; > case I2C_SMBUS_BLOCK_DATA: > case I2C_SMBUS_I2C_BLOCK_DATA: > - memcpy(&data->block[1], dma_buffer, desc->rxbytes); > - data->block[0] = desc->rxbytes; > + memcpy(data->block, dma_buffer, desc->rxbytes); > + data->block[0] = desc->rxbytes - 1; > break; > } > return 0; >