|
From: | Jie Deng |
Subject: | Re: [PATCH V2 4/6] tools/vhost-user-i2c: Add backend driver |
Date: | Fri, 2 Apr 2021 10:55:16 +0800 |
User-agent: | Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0 Thunderbird/78.7.0 |
On 2021/4/1 20:12, Viresh Kumar wrote:
+ +/* vhost-user-i2c definitions */ + +#define MAX_I2C_VDEV (1 << 7) +#define MAX_I2C_ADAPTER 16
Generally speaking, 16 is big enough for most cases. But comparing with static configuration, I think it is better if we can check how many adapters in the host when doing initialization and
use that number as "MAX_I2C_ADAPTER".
+ +static VI2cAdapter *vi2c_create_adapter(int32_t bus, uint16_t client_addr[], + int32_t n_client) +{ + VI2cAdapter *adapter; + char path[20]; + uint64_t funcs; + int32_t fd, i; + + if (bus < 0) { + return NULL; + } + + adapter = g_malloc0(sizeof(*adapter)); + if (!adapter) { + g_printerr("failed to alloc adapter"); + return NULL; + } + + snprintf(path, sizeof(path), "/dev/i2c-%d", bus); + path[sizeof(path) - 1] = '\0'; + + fd = open(path, O_RDWR); + if (fd < 0) { + g_printerr("virtio_i2c: failed to open %s\n", path); + goto fail; + } + + adapter->fd = fd; + adapter->bus = bus; + + if (ioctl(fd, I2C_FUNCS, &funcs) < 0) { + g_printerr("virtio_i2c: failed to get functionality %s: %d\n", path, + errno); + goto close_fd; + } + + if (funcs & I2C_FUNC_I2C) { + adapter->smbus = false; + } else if (funcs & I2C_FUNC_SMBUS_WORD_DATA) {
Only I2C_FUNC_SMBUS_WORD_DATA is checked here. But in addition to it, the smbus_xfer seems support I2C_FUNC_SMBUS_BYTE, I2C_FUNC_SMBUS_BYTE_DATA. So if an adapter only
support the latter two, it will never go to smbus_xfer.
+ adapter->smbus = true; + } else { + g_printerr("virtio_i2c: invalid functionality %lx\n", funcs); + goto close_fd; + } +
[Prev in Thread] | Current Thread | [Next in Thread] |