Как я могу убедиться, что insmod завершится с ошибкой?
Я разработал периферийный драйвер для Linux. Функция.probe выполняет обычные проверки ошибок, такие как сбои выделения памяти, а также пытается установить связь с оборудованием и при любых типах ошибок, освобождает любую память и возвращает код ошибки, например -ENOMEM или -EIO.
Проблема в том, что, хотя функция зонда модуля возвращает -EIO, когда оборудование недоступно, я все еще вижу, что модуль указан в lsmod
выход. Можно ли убедиться, что insmod
полностью терпит неудачу, когда есть проблема во время инициализации?
Вот моя текущая функция проверки. Все специфические функции устройства возвращают соответствующий код ошибки при сбое, обычно -EIO.
static int mlx90399_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
int err;
struct mlx90399_data *data;
data = kzalloc(sizeof(*data), GFP_KERNEL);
if (!data) {
dev_err(&client->dev, "Memory allocation fails\n");
err = -ENOMEM;
goto exit;
}
i2c_set_clientdata(client, data);
data->client = client;
mutex_init(&data->lock);
data->mode = MLX90399_MODE_OFF;
err = mlx90399_reset(client);
if (err < 0)
goto exit;
msleep(1); /* nominal 0.6ms from reset */
err = mlx90399_write_register_defaults(client);
if (err < 0)
goto exit;
err = mlx90399_update_scale(client);
if (err < 0)
goto exit;
data->indio_dev = iio_allocate_device(0);
if (data->indio_dev == NULL) {
err = -ENOMEM;
goto exit;
}
data->indio_dev->dev.parent = &client->dev;
data->indio_dev->info = &mlx90399_info;
data->indio_dev->dev_data = (void *)(data);
data->indio_dev->modes = INDIO_DIRECT_MODE;
mlx90399_setup_irq(client);
err = iio_device_register(data->indio_dev);
if(err < 0)
goto exit;
return 0;
exit:
kfree(data);
return err;
}
2 ответа
Смотрите комментарий в __driver_attach()
:
/*
* Lock device and try to bind to it. We drop the error
* here and always return 0, because we need to keep trying
* to bind to devices and some drivers will return an error
* simply if it didn't support the device.
*
* driver_probe_device() will spit a warning if there
* is an error.
*/
Для сбоя инициализации модуля отмените регистрацию драйвера и верните код ошибки из функции init.
Обратите внимание, что между модулем и устройством необязательно существует соотношение 1:1. Один модуль может использоваться для нескольких устройств. Например, при использовании деревьев устройств дерево устройств может объявлять несколько встроенных UART, причем все они используют один модуль ядра последовательного устройства. Модуля probe
Функция будет вызываться несколько раз, по одному разу для каждого устройства. Просто потому, что один probe
вызов завершается неудачно, это не обязательно означает, что модуль должен быть выгружен.