From 473e45ee0f8b2c81e35c2cdaa889fbe9eb090a69 Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Thu, 11 Nov 2021 07:31:34 +0530 Subject: [PATCH] [i2c] Reorganize SmbusMsg::new() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reorganize SmbusMsg::new() to return Result<> from the match block itself. Suggested-by: Alex Bennée Signed-off-by: Viresh Kumar --- coverage_config_x86_64.json | 2 +- src/i2c/src/i2c.rs | 109 ++++++++++++++++++++---------------- 2 files changed, 63 insertions(+), 48 deletions(-) diff --git a/coverage_config_x86_64.json b/coverage_config_x86_64.json index 18b4906..de4f3b7 100644 --- a/coverage_config_x86_64.json +++ b/coverage_config_x86_64.json @@ -1,5 +1,5 @@ { - "coverage_score": 44.3, + "coverage_score": 43.2, "exclude_path": "", "crate_features": "" } diff --git a/src/i2c/src/i2c.rs b/src/i2c/src/i2c.rs index 63be576..472f69e 100644 --- a/src/i2c/src/i2c.rs +++ b/src/i2c/src/i2c.rs @@ -178,44 +178,65 @@ impl SmbusMsg { let mut data = I2cSmbusData { block: [0; I2C_SMBUS_BLOCK_MAX + 2], }; - let read_write: u8; - let mut smbus_data = None; // Write messages have only one request message, while read messages // will have two (except for few special cases of I2C_SMBUS_QUICK and // I2C_SMBUS_BYTE, where only one request messages is sent). - let size = match reqs.len() { + match reqs.len() { // Write requests (with some exceptions as mentioned above) 1 => { - if (reqs[0].flags & I2C_M_RD) != 0 { - // Special Read requests, reqs[0].len can be 0 or 1 only. - if reqs[0].len > 1 { - return Err(Error::MessageLengthInvalid("read", reqs[0].len as usize)); - } - read_write = I2C_SMBUS_READ; - } else { - read_write = I2C_SMBUS_WRITE; - } + let read_write = match reqs[0].flags & I2C_M_RD { + 0 => I2C_SMBUS_WRITE, + _ => I2C_SMBUS_READ, + }; match reqs[0].len { // Special Read requests - 0 => I2C_SMBUS_QUICK, - 1 => I2C_SMBUS_BYTE, + 0 => Ok(SmbusMsg { + read_write, + command: reqs[0].buf[0], + size: I2C_SMBUS_QUICK, + data: None, + }), + + 1 => Ok(SmbusMsg { + read_write, + command: reqs[0].buf[0], + size: I2C_SMBUS_BYTE, + data: None, + }), // Write requests 2 => { - data.byte = reqs[0].buf[1]; - smbus_data = Some(data); - I2C_SMBUS_BYTE_DATA + if read_write == I2C_SMBUS_READ { + // Special Read requests, reqs[0].len can be 0 or 1 only. + Err(Error::MessageLengthInvalid("read", 2)) + } else { + data.byte = reqs[0].buf[1]; + Ok(SmbusMsg { + read_write, + command: reqs[0].buf[0], + size: I2C_SMBUS_BYTE_DATA, + data: Some(data), + }) + } } + 3 => { - data.word = reqs[0].buf[1] as u16 | ((reqs[0].buf[2] as u16) << 8); - smbus_data = Some(data); - I2C_SMBUS_WORD_DATA - } - _ => { - return Err(Error::MessageLengthInvalid("write", reqs[0].len as usize)); + if read_write == I2C_SMBUS_READ { + // Special Read requests, reqs[0].len can be 0 or 1 only. + Err(Error::MessageLengthInvalid("read", 3)) + } else { + data.word = reqs[0].buf[1] as u16 | ((reqs[0].buf[2] as u16) << 8); + Ok(SmbusMsg { + read_write, + command: reqs[0].buf[0], + size: I2C_SMBUS_WORD_DATA, + data: Some(data), + }) + } } + _ => Err(Error::MessageLengthInvalid("write", reqs[0].len as usize)), } } @@ -232,37 +253,31 @@ impl SmbusMsg { || (reqs[0].len != 1) || (reqs[1].len > 2) { - return Err(Error::SMBusTransferInvalid( + Err(Error::SMBusTransferInvalid( reqs.len(), reqs[0].len, reqs[1].len, - )); - } - read_write = I2C_SMBUS_READ; - smbus_data = Some(data); - - if reqs[1].len == 1 { - I2C_SMBUS_BYTE_DATA + )) } else { - I2C_SMBUS_WORD_DATA + Ok(SmbusMsg { + read_write: I2C_SMBUS_READ, + command: reqs[0].buf[0], + size: if reqs[1].len == 1 { + I2C_SMBUS_BYTE_DATA + } else { + I2C_SMBUS_WORD_DATA + }, + data: Some(data), + }) } } - _ => { - return Err(Error::SMBusTransferInvalid( - reqs.len(), - reqs[0].len, - reqs[1].len, - )); - } - }; - - Ok(SmbusMsg { - read_write, - command: reqs[0].buf[0], - size, - data: smbus_data, - }) + _ => Err(Error::SMBusTransferInvalid( + reqs.len(), + reqs[0].len, + reqs[1].len, + )), + } } }