On 2021/3/24 15:33, Viresh Kumar wrote:
+static int vi2c_parse(VuI2c *i2c) +{
- uint16_t client_addr[MAX_I2C_VDEV];
- int32_t n_adapter = 0, n_client;
- int64_t addr, bus;
- const char *cp, *t;
- while (device_list) {
/* Read <bus>:<client_addr>[:<client_addr>] entries one by one */cp = strsep(&device_list, ",");if (!cp || *cp =='\0') {break;}if (n_adapter == MAX_I2C_ADAPTER) {g_printerr("too many adapter (%d), only support %d \n", n_adapter,MAX_I2C_ADAPTER);goto out;}if (qemu_strtol(cp, &t, 10, &bus) || bus < 0) {g_printerr("Invalid bus number %s\n", cp);goto out;}cp = t;n_client = 0;/* Parse clients <client_addr>[:<client_addr>] entries one by one */while (cp != NULL && *cp !='\0') {if (*cp == ':')cp++;if (n_client == MAX_I2C_VDEV) {g_printerr("too many devices (%d), only support %d \n",n_client, MAX_I2C_VDEV);goto out;}if (qemu_strtol(cp, &t, 16, &addr) || addr < 0 || addr > MAX_I2C_VDEV) {g_printerr("Invalid address %s : %lx\n", cp, addr);goto out;}client_addr[n_client++] = addr;cp = t;if (verbose) {g_print("i2c adapter %ld:0x%lx\n", bus, addr);}}i2c->adapter[n_adapter] = vi2c_create_adapter(bus, client_addr, n_client);if (!i2c->adapter[n_adapter])goto out;n_adapter++;- }
- if (!n_adapter) {
g_printerr("Failed to add any adapters\n");return -1;- }
- i2c->adapter_num = n_adapter;
i2c->adapter_num is set here, but used in vi2c_remove_adapters. when you goto out from while {...}, i2c->adapter_num is always 0, May be a bug ?
- if (!vi2c_map_adapters(i2c)) {
return 0;- }
+out:
- vi2c_remove_adapters(i2c);
- return -1;
+}