我为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;
}发布于 2014-02-27 17:07:46
参见__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函数返回错误代码。
发布于 2016-07-07 04:55:34
注意,在模块和设备之间不一定存在1:1的关系。一个模块可用于多个设备。例如,通过使用设备树,一个设备树可以声明多个车载UART,所有这些都使用一个串行设备内核模块。该模块的probe函数将被多次调用,每个设备都调用一次。仅仅因为一个probe调用失败,并不一定意味着模块应该被卸载。
https://stackoverflow.com/questions/22065711
复制相似问题