gpt4 book ai didi

linux-kernel - 如何确保 insmod 因错误而失败?

转载 作者:行者123 更新时间:2023-12-04 05:06:10 27 4
gpt4 key购买 nike

我为 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;
}

最佳答案

__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 函数中返回错误代码。

关于linux-kernel - 如何确保 insmod 因错误而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22065711/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com