diff options
author | Maarten Lankhorst <maarten.lankhorst@canonical.com> | 2013-03-25 13:55:37 +0100 |
---|---|---|
committer | Maarten Lankhorst <maarten.lankhorst@canonical.com> | 2013-03-25 13:55:37 +0100 |
commit | 84998320162a74a0861b7be1fcc230e50f08424a (patch) | |
tree | 1817ac3bf4d276369f6bb9f93b05ac61cd5d9e6c | |
parent | a80785f79268ed3701fc69cbd9194ad12822c82c (diff) | |
download | xorg-driver-xf86-video-nouveau-84998320162a74a0861b7be1fcc230e50f08424a.tar.gz |
Clean up some errors on closing.
If forced close happens, all ioctl's will fail. Some of the handlers
also need to be unregistered before the module is unloaded entirely.
-rw-r--r-- | src/drmmode_display.c | 16 | ||||
-rw-r--r-- | src/nv_driver.c | 7 |
2 files changed, 20 insertions, 3 deletions
diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 9eca60f..6033a6d 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -627,6 +627,9 @@ drmmode_output_detect(xf86OutputPtr output) drmmode_output->mode_output = drmModeGetConnector(drmmode->fd, drmmode_output->output_id); + if (!drmmode_output->mode_output) + return XF86OutputStatusDisconnected; + switch (drmmode_output->mode_output->connection) { case DRM_MODE_CONNECTED: status = XF86OutputStatusConnected; @@ -663,6 +666,9 @@ drmmode_output_get_modes(xf86OutputPtr output) drmModePropertyPtr props; xf86MonPtr ddc_mon = NULL; + if (!koutput) + return NULL; + /* look for an EDID property */ for (i = 0; i < koutput->count_props; i++) { props = drmModeGetProperty(drmmode->fd, koutput->props[i]); @@ -927,6 +933,9 @@ drmmode_output_get_property(xf86OutputPtr output, Atom property) drmModeGetConnector(drmmode->fd, drmmode_output->output_id); } + if (!drmmode_output->mode_output) + return FALSE; + for (i = 0; i < drmmode_output->num_props; i++) { drmmode_prop_ptr p = &drmmode_output->props[i]; if (p->atoms[0] != property) @@ -1437,6 +1446,7 @@ drmmode_uevent_fini(ScrnInfoPtr scrn) if (drmmode->uevent_monitor) { struct udev *u = udev_monitor_get_udev(drmmode->uevent_monitor); + RemoveGeneralSocket(udev_monitor_get_fd(drmmode->uevent_monitor)); udev_monitor_unref(drmmode->uevent_monitor); udev_unref(u); } @@ -1524,6 +1534,12 @@ void drmmode_screen_fini(ScreenPtr pScreen) { ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen); + drmmode_ptr drmmode = drmmode_from_scrn(scrn); drmmode_uevent_fini(scrn); + + /* Register a wakeup handler to get informed on DRM events */ + RemoveBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA, + drmmode_wakeup_handler, scrn); + RemoveGeneralSocket(drmmode->fd); } diff --git a/src/nv_driver.c b/src/nv_driver.c index 9f62fe2..2b74fc6 100644 --- a/src/nv_driver.c +++ b/src/nv_driver.c @@ -432,8 +432,8 @@ NVLeaveVT(VT_FUNC_ARGS_DECL) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NVLeaveVT is called.\n"); ret = drmDropMaster(pNv->dev->fd); - if (ret) - ErrorF("Error dropping master: %d\n", ret); + if (ret && errno != EIO && errno != ENODEV) + ErrorF("Error dropping master: %i(%m)\n", -errno); } static void @@ -624,8 +624,9 @@ NVCloseDRM(ScrnInfoPtr pScrn) { NVPtr pNv = NVPTR(pScrn); - nouveau_device_del(&pNv->dev); drmFree(pNv->drm_device_name); + nouveau_client_del(&pNv->client); + nouveau_device_del(&pNv->dev); } static Bool |