Wed Jan 15 13:54:03 2014 UTC ()
Clean up initialization failures in drm2_modcmd.


(riastradh)
diff -r1.1.2.7 -r1.1.2.8 src/sys/external/bsd/drm2/drm/drm_module.c

cvs diff -r1.1.2.7 -r1.1.2.8 src/sys/external/bsd/drm2/drm/drm_module.c (expand / switch to unified diff)

--- src/sys/external/bsd/drm2/drm/drm_module.c 2013/12/30 04:50:12 1.1.2.7
+++ src/sys/external/bsd/drm2/drm/drm_module.c 2014/01/15 13:54:03 1.1.2.8
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: drm_module.c,v 1.1.2.7 2013/12/30 04:50:12 riastradh Exp $ */ 1/* $NetBSD: drm_module.c,v 1.1.2.8 2014/01/15 13:54:03 riastradh Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2013 The NetBSD Foundation, Inc. 4 * Copyright (c) 2013 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Taylor R. Campbell. 8 * by Taylor R. Campbell.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions 11 * modification, are permitted provided that the following conditions
12 * are met: 12 * are met:
13 * 1. Redistributions of source code must retain the above copyright 13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer. 14 * notice, this list of conditions and the following disclaimer.
@@ -20,27 +20,27 @@ @@ -20,27 +20,27 @@
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE. 29 * POSSIBILITY OF SUCH DAMAGE.
30 */ 30 */
31 31
32#include <sys/cdefs.h> 32#include <sys/cdefs.h>
33__KERNEL_RCSID(0, "$NetBSD: drm_module.c,v 1.1.2.7 2013/12/30 04:50:12 riastradh Exp $"); 33__KERNEL_RCSID(0, "$NetBSD: drm_module.c,v 1.1.2.8 2014/01/15 13:54:03 riastradh Exp $");
34 34
35#include <sys/types.h> 35#include <sys/types.h>
36#include <sys/device.h> 36#include <sys/device.h>
37#include <sys/module.h> 37#include <sys/module.h>
38#include <sys/systm.h> 38#include <sys/systm.h>
39 39
40#include <linux/highmem.h> 40#include <linux/highmem.h>
41#include <linux/mutex.h> 41#include <linux/mutex.h>
42#include <linux/workqueue.h> 42#include <linux/workqueue.h>
43 43
44#include <drm/drmP.h> 44#include <drm/drmP.h>
45 45
46/* 46/*
@@ -64,59 +64,64 @@ drm2_modcmd(modcmd_t cmd, void *arg __un @@ -64,59 +64,64 @@ drm2_modcmd(modcmd_t cmd, void *arg __un
64{ 64{
65#ifdef _MODULE 65#ifdef _MODULE
66 devmajor_t bmajor = NODEVMAJOR, cmajor = NODEVMAJOR; 66 devmajor_t bmajor = NODEVMAJOR, cmajor = NODEVMAJOR;
67 int error; 67 int error;
68#endif 68#endif
69 69
70 switch (cmd) { 70 switch (cmd) {
71 case MODULE_CMD_INIT: 71 case MODULE_CMD_INIT:
72 linux_mutex_init(&drm_global_mutex); 72 linux_mutex_init(&drm_global_mutex);
73 error = linux_kmap_init(); 73 error = linux_kmap_init();
74 if (error) { 74 if (error) {
75 aprint_error("drm: unable to initialize linux kmap:" 75 aprint_error("drm: unable to initialize linux kmap:"
76 " %d", error); 76 " %d", error);
77 return error; 77 goto init_fail0;
78 } 78 }
79 error = linux_workqueue_init(); 79 error = linux_workqueue_init();
80 if (error) { 80 if (error) {
81 aprint_error("drm: unable to initialize workqueues:" 81 aprint_error("drm: unable to initialize workqueues:"
82 " %d", error); 82 " %d", error);
83 linux_kmap_fini(); 83 goto init_fail1;
84 return error; 
85 } 84 }
86#ifdef _MODULE 85#ifdef _MODULE
87 error = config_init_component(cfdriver_ioconf_drm, 86 error = config_init_component(cfdriver_ioconf_drm,
88 cfattach_ioconf_drm, cfdata_ioconf_drm); 87 cfattach_ioconf_drm, cfdata_ioconf_drm);
89 if (error) { 88 if (error) {
90 aprint_error("drm: unable to init component: %d\n", 89 aprint_error("drm: unable to init component: %d\n",
91 error); 90 error);
92 linux_workqueue_fini(); 91 goto init_fail2;
93 linux_kmap_fini(); 
94 return error; 
95 } 92 }
96 error = devsw_attach("drm", NULL, &bmajor, 93 error = devsw_attach("drm", NULL, &bmajor,
97 &drm_cdevsw, &cmajor); 94 &drm_cdevsw, &cmajor);
98 if (error) { 95 if (error) {
99 aprint_error("drm: unable to attach devsw: %d\n", 96 aprint_error("drm: unable to attach devsw: %d\n",
100 error); 97 error);
101 (void)config_fini_component(cfdriver_ioconf_drm, 98 goto init_fail3;
102 cfattach_ioconf_drm, cfdata_ioconf_drm); 
103 linux_workqueue_fini(); 
104 linux_kmap_fini(); 
105 return error; 
106 } 99 }
107#endif 100#endif
108 return 0; 101 return 0;
109 102
 103#ifdef _MODULE
 104#if 0
 105init_fail4: (void)devsw_detach(NULL, &drm_cdevsw);
 106#endif
 107init_fail3: (void)config_fini_component(cfdriver_ioconf_drm,
 108 cfattach_ioconf_drm, cfdata_ioconf_drm);
 109init_fail2: linux_workqueue_fini();
 110#endif /* _MODULE */
 111init_fail1: linux_kmap_fini();
 112init_fail0: linux_mutex_destroy(&drm_global_mutex);
 113 return error;
 114
110 case MODULE_CMD_FINI: 115 case MODULE_CMD_FINI:
111#ifdef _MODULE 116#ifdef _MODULE
112 error = devsw_detach(NULL, &drm_cdevsw); 117 error = devsw_detach(NULL, &drm_cdevsw);
113 if (error) 118 if (error)
114 return error; 119 return error;
115 error = config_fini_component(cfdriver_ioconf_drm, 120 error = config_fini_component(cfdriver_ioconf_drm,
116 cfattach_ioconf_drm, cfdata_ioconf_drm); 121 cfattach_ioconf_drm, cfdata_ioconf_drm);
117 if (error) 122 if (error)
118 /* XXX Now what? Reattach the devsw? */ 123 /* XXX Now what? Reattach the devsw? */
119 return error; 124 return error;
120#endif 125#endif
121 linux_workqueue_fini(); 126 linux_workqueue_fini();
122 linux_kmap_fini(); 127 linux_kmap_fini();