Разработих периферен драйвер за 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;
}