LINUX.ORG.RU

DKMS не собирает модуль ddcci на ядрах старше 5.15.5

 , ,


0

1

Нагуглить ничего не получается, как будто проблемы и нет ни у кого.

Может я что-то очевидное делаю не так?

Building module:
cleaning build area...
make -j8 KERNELRELEASE=6.1.1-060101-generic KVER=6.1.1-060101-generic -C /var/lib/dkms/ddcci/0.4.2/build...(bad exit status: 2)
ERROR (dkms apport): kernel package linux-headers-6.1.1-060101-generic is not supported
Error! Bad return status for module build on kernel: 6.1.1-060101-generic (x86_64)
Consult /var/lib/dkms/ddcci/0.4.2/build/make.log for more information.
в /var/lib/dkms/ddcci/0.4.2/build/make.log
DKMS make.log for ddcci-0.4.2 for kernel 6.1.1-060101-generic (x86_64)
Сб 07 янв 2023 12:43:11 MSK
make: вход в каталог «/var/lib/dkms/ddcci/0.4.2/build»
make -C "ddcci"
make[1]: вход в каталог «/var/lib/dkms/ddcci/0.4.2/build/ddcci»
make -C "/lib/modules/6.1.1-060101-generic/build" M="/var/lib/dkms/ddcci/0.4.2/build/ddcci" modules
make[2]: вход в каталог «/usr/src/linux-headers-6.1.1-060101-generic»
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.2.0-9ubuntu1) 12.2.0
  You are using:           gcc-12 (Ubuntu 12.1.0-2ubuntu1~22.04) 12.1.0
  CC [M]  /var/lib/dkms/ddcci/0.4.2/build/ddcci/ddcci.o
/var/lib/dkms/ddcci/0.4.2/build/ddcci/ddcci.c:1813:27: error: initialization of ‘void (*)(struct i2c_client *)’ from incompatible pointer type ‘int (*)(struct i2c_client *)’ [-Werror=incompatible-pointer-types]
 1813 |         .remove         = ddcci_remove,
      |                           ^~~~~~~~~~~~
/var/lib/dkms/ddcci/0.4.2/build/ddcci/ddcci.c:1813:27: note: (near initialization for ‘ddcci_driver.remove’)
cc1: some warnings being treated as errors
make[3]: *** [scripts/Makefile.build:250: /var/lib/dkms/ddcci/0.4.2/build/ddcci/ddcci.o] Ошибка 1
make[2]: *** [Makefile:1998: /var/lib/dkms/ddcci/0.4.2/build/ddcci] Ошибка 2
make[2]: выход из каталога «/usr/src/linux-headers-6.1.1-060101-generic»
make[1]: *** [Makefile:38: ddcci.ko] Ошибка 2
make[1]: выход из каталога «/var/lib/dkms/ddcci/0.4.2/build/ddcci»
make: *** [Makefile:28: ddcci] Ошибка 2
make: выход из каталога «/var/lib/dkms/ddcci/0.4.2/build»

Решение:

в файле /usr/src/ddcci-0.4.2/ddcci/ddcci.c в строке 1774 заменить тип int на void и в этой же функции убрать return, т.е. функция ddcci_remove должна принять такой вид:

static void ddcci_remove(struct i2c_client *client)
{
	struct ddcci_bus_drv_data *drv_data = i2c_get_clientdata(client);
	struct device *dev;

	down(&drv_data->sem);
	while (1) {
		dev = bus_find_device(&ddcci_bus_type, NULL, client,
				      ddcci_remove_helper);
		if (!dev)
			break;
		device_unregister(dev);
		put_device(dev);
	}
	up(&drv_data->sem);
}

★★★★★

Последнее исправление: Suntechnic (всего исправлений: 1)

Ответ на: комментарий от alegz

Нет, с gcc все ок. Изменения именно в ядре начиная с 6.1.

https://github.com/torvalds/linux/commit/ed5c2f5fd10dda07263f79f338a512c0f49f76f5

ТС, поправьте код, как это сделано в остальнвх драйверах по ссылке.

i586 ★★★★★
()

Нагуглить ничего не получается, как будто проблемы и нет ни у кого.

В оригинальном репо есть merge request-ы на исправление компиляции под 6.1: https://gitlab.com/ddcci-driver-linux/ddcci-driver-linux/-/merge_requests/11

https://gitlab.com/ddcci-driver-linux/ddcci-driver-linux/-/merge_requests/10.patch

VladMesh
()
Ответ на: комментарий от VladMesh

Ну не додумался в mr глянуть.

Кстати, просто из любопытства (так то я вообще не знаком с C). Вот это: #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) - это работает типа только при компиляции?

Тогда почему он не сделал:

	#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
	static void ddcci_remove(struct i2c_client *client)
	#else
	static int ddcci_remove(struct i2c_client *client)
	#endif

?

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Да, это работает только при компиляции (препроцессинге).

Вопрос «стиля программирования». Но так было бы не достаточно - ругнулось бы чуть ниже при return:

	up(&drv_data->sem);
	return 0;
}

Т.е. это тоже надо было править

        up(&drv_data->sem);
#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0)
	return 0;
#endif
}
VladMesh
()
Ответ на: комментарий от VladMesh

Ну да - очевидно что и ретарн надо обернуть. Думал это не требует упоминания. Для краткости просто показал. Удобно у вас там всё устроено.

Suntechnic ★★★★★
() автор топика