--- src/%%NVSRC%%/nvidia_ctl.c.orig 2017-09-14 20:46:30 UTC +++ src/%%NVSRC%%/nvidia_ctl.c @@ -13,6 +13,12 @@ #include "nv.h" #include "nv-freebsd.h" +#ifdef NV_SUPPORT_LINUX_COMPAT /* (COMPAT_LINUX || COMPAT_LINUX32) */ +#include + +const char nvidia_driver_name[] = "nvidia"; +#endif + static d_open_t nvidia_ctl_open; static void nvidia_ctl_dtor(void *arg); static d_ioctl_t nvidia_ctl_ioctl; @@ -65,13 +71,12 @@ static int nvidia_ctl_open( void nvidia_ctl_dtor(void *arg) { - int status; struct nvidia_filep *filep = arg; struct nvidia_event *et; nv_state_t *nv = filep->nv; nv_lock_api(nv); - status = nvidia_close_ctl(nv, filep); + nvidia_close_ctl(nv, filep); nv_unlock_api(nv); while ((et = STAILQ_FIRST(&filep->event_queue))) { @@ -138,6 +144,18 @@ static int nvidia_ctl_poll( int nvidia_ctl_attach(void) { +#ifdef NV_SUPPORT_LINUX_COMPAT + struct linux_device_handler nvidia_ctl_linux_handler = { + .bsd_driver_name = __DECONST(char *, nvidia_driver_name), + .linux_driver_name = __DECONST(char *, nvidia_driver_name), + .bsd_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name), + .linux_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name), + .linux_major = NV_MAJOR_DEVICE_NUMBER, + .linux_minor = 255, + .linux_char_device = 1 + }; +#endif + if (nvidia_count == 0) { nvidia_ctl_cdev = make_dev(&nvidia_ctl_cdevsw, CDEV_CTL_MINOR, @@ -145,6 +163,10 @@ int nvidia_ctl_attach(void) "%s", nvidia_ctl_cdevsw.d_name); if (nvidia_ctl_cdev == NULL) return ENOMEM; + +#ifdef NV_SUPPORT_LINUX_COMPAT + (void)linux_device_register_handler(&nvidia_ctl_linux_handler); +#endif } nvidia_count++; @@ -153,13 +175,25 @@ int nvidia_ctl_attach(void) int nvidia_ctl_detach(void) { - struct nvidia_softc *sc; - - sc = &nvidia_ctl_sc; +#ifdef NV_SUPPORT_LINUX_COMPAT + struct linux_device_handler nvidia_ctl_linux_handler = { + .bsd_driver_name = __DECONST(char *, nvidia_driver_name), + .linux_driver_name = __DECONST(char *, nvidia_driver_name), + .bsd_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name), + .linux_device_name = __DECONST(char *, nvidia_ctl_cdevsw.d_name), + .linux_major = NV_MAJOR_DEVICE_NUMBER, + .linux_minor = 255, + .linux_char_device = 1 + }; +#endif nvidia_count--; - if (nvidia_count == 0) + if (nvidia_count == 0) { +#ifdef NV_SUPPORT_LINUX_COMPAT + (void)linux_device_unregister_handler(&nvidia_ctl_linux_handler); +#endif destroy_dev(nvidia_ctl_cdev); + } return 0; }