forked from mirrors/linux
		
	i2c: ismt: Don't duplicate the receive length for block reads
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 <stephend@adiengineering.com> Tested-by: Dan Priamo <danp@adiengineering.com> Acked-by: Neil Horman <nhorman@tuxdriver.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de> Cc: stable@kernel.org
This commit is contained in:
		
							parent
							
								
									cc4a41fe55
								
							
						
					
					
						commit
						b6c159a9cb
					
				
					 1 changed files with 2 additions and 2 deletions
				
			
		|  | @ -341,8 +341,8 @@ static int ismt_process_desc(const struct ismt_desc *desc, | |||
| 			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; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Stephen Douthit
						Stephen Douthit