• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  *   Copyright (c) International Business Machines  Corp., 2001
4  *
5  *   This program is free software;  you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation; either version 2 of the License, or
8  *   (at your option) any later version.
9  *
10  *   This program is distributed in the hope that it will be useful,
11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
13  *   the GNU General Public License for more details.
14  *
15  *   You should have received a copy of the GNU General Public License
16  *   along with this program;  if not, write to the Free Software
17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  *
19 
20  * This is the main of your user space test program,
21  * which will open the correct kernel module, find the
22  * file descriptor value and use that value to make
23  * ioctl calls to the system
24  *
25  * Use the ki_generic and other ki_testname functions
26  * to abstract the calls from the main
27  *
28  * author: Sean Ruyle
29  * date:   06/11/2003
30  *
31  */
32 
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include <sys/stat.h>
36 #include <sys/ioctl.h>
37 #include <fcntl.h>
38 #include <linux/kernel.h>
39 #include <linux/errno.h>
40 #include <errno.h>
41 
42 #include "user_tbase.h"
43 #include "../tbase/tbase.h"
44 
45 static int tbase_fd = -1;	/* file descriptor */
46 
tbaseopen()47 int tbaseopen()
48 {
49 
50 	dev_t devt;
51 	struct stat st;
52 	int rc = 0;
53 
54 	devt = makedev(TBASEMAJOR, 0);
55 
56 	if (rc) {
57 		if (errno == ENOENT) {
58 			/* dev node does not exist. */
59 			rc = mkdir("/dev/tbase", (S_IFDIR | S_IRWXU |
60 						  S_IRGRP | S_IXGRP |
61 						  S_IROTH | S_IXOTH));
62 		} else {
63 			printf
64 			    ("ERROR: Problem with Base dev directory.  Error code from stat() is %d\n\n",
65 			     errno);
66 		}
67 
68 	} else {
69 		if (!(st.st_mode & S_IFDIR)) {
70 			rc = unlink("/dev/tbase");
71 			if (!rc) {
72 				rc = mkdir("/dev/tbase", (S_IFDIR | S_IRWXU |
73 							  S_IRGRP | S_IXGRP |
74 							  S_IROTH | S_IXOTH));
75 			}
76 		}
77 	}
78 
79 	/*
80 	 * Check for the /dev/tbase node, and create if it does not
81 	 * exist.
82 	 */
83 	rc = stat("/dev/tbase", &st);
84 	if (rc) {
85 		if (errno == ENOENT) {
86 			/* dev node does not exist */
87 			rc = mknod("/dev/tbase",
88 				   (S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP |
89 				    S_IWGRP), devt);
90 		} else {
91 			printf
92 			    ("ERROR:Problem with tbase device node directory.  Error code form stat() is %d\n\n",
93 			     errno);
94 		}
95 
96 	} else {
97 		/*
98 		 * /dev/tbase CHR device exists.  Check to make sure it is for a
99 		 * block device and that it has the right major and minor.
100 		 */
101 		if ((!(st.st_mode & S_IFCHR)) || (st.st_rdev != devt)) {
102 
103 			/* Recreate the dev node. */
104 			rc = unlink("/dev/tbase");
105 			if (!rc) {
106 				rc = mknod("/dev/tbase",
107 					   (S_IFCHR | S_IRUSR | S_IWUSR |
108 					    S_IRGRP | S_IWGRP), devt);
109 			}
110 		}
111 	}
112 
113 	tbase_fd = open("/dev/tbase", O_RDWR);
114 
115 	if (tbase_fd < 0) {
116 		printf("ERROR: Open of device %s failed %d errno = %d\n",
117 		       "/dev/tbase", tbase_fd, errno);
118 		return errno;
119 	} else {
120 		printf("Device opened successfully \n");
121 		return 0;
122 	}
123 
124 }
125 
tbaseclose()126 int tbaseclose()
127 {
128 
129 	if (tbase_fd != -1) {
130 		close(tbase_fd);
131 		tbase_fd = -1;
132 	}
133 
134 	return 0;
135 }
136 
main()137 int main()
138 {
139 	int rc;
140 
141 	/* open the module */
142 	rc = tbaseopen();
143 	if (rc) {
144 		printf("Test MOD Driver may not be loaded\n");
145 		exit(1);
146 	}
147 
148 	/* test bus rescan */
149 	if (ki_generic(tbase_fd, BUS_RESCAN))
150 		printf("Failed on bus rescan\n");
151 	else
152 		printf("Success on bus rescan\n");
153 
154 	/* test get driver */
155 	if (ki_generic(tbase_fd, GET_DRV))
156 		printf("Failed on get driver\n");
157 	else
158 		printf("Success on get driver\n");
159 
160 	/* test put driver */
161 	if (ki_generic(tbase_fd, PUT_DRV))
162 		printf("Failed on put driver\n");
163 	else
164 		printf("Success on put driver\n");
165 
166 	/* test register firmware, should return not 0 */
167 	if (ki_generic(tbase_fd, REG_FIRM))
168 		printf
169 		    ("Failed on register firmware\n\tPossibly because parent nodes already set\n");
170 	else
171 		printf("Success on register firmware\n");
172 
173 	/* test create driver file sysfs */
174 	if (ki_generic(tbase_fd, CREATE_FILE))
175 		printf("Failed on creating driver file\n");
176 	else
177 		printf("Success on creating driver file\n");
178 
179 	/* test device suspend and resume */
180 	if (ki_generic(tbase_fd, DEV_SUSPEND))
181 		printf("Failed on suspending device\n");
182 	else
183 		printf("Success on suspending device\n");
184 
185 	/* test device create file sysfs */
186 	if (ki_generic(tbase_fd, DEV_FILE))
187 		printf("Failed on creating device file\n");
188 	else
189 		printf("Success on creating device file\n");
190 
191 	/* test bus create file sysfs */
192 	if (ki_generic(tbase_fd, BUS_FILE))
193 		printf("Failed on creating bus file\n");
194 	else
195 		printf("Success on creating bus file\n");
196 
197 	/* test register class */
198 	if (ki_generic(tbase_fd, CLASS_REG))
199 		printf("Failed on registering class\n");
200 	else
201 		printf("Success on registering class\n");
202 
203 	/* test get class */
204 	if (ki_generic(tbase_fd, CLASS_GET))
205 		printf("Failed on get class\n");
206 	else
207 		printf("Success on get class\n");
208 
209 	/* test class create file sysfs */
210 	if (ki_generic(tbase_fd, CLASS_FILE))
211 		printf("Failed on creating class file\n");
212 	else
213 		printf("Success on creating class file\n");
214 
215 	/* test unregistering class */
216 	if (ki_generic(tbase_fd, CLASS_UNREG))
217 		printf("Failed on unregistering class\n");
218 	else
219 		printf("Success on unregistering class\n");
220 
221 	/* test register class device */
222 	if (ki_generic(tbase_fd, CLASSDEV_REG))
223 		printf
224 		    ("Failed on registering class device and creating sysfs file\n");
225 	else
226 		printf
227 		    ("Success on registering class device and creating sysfs file\n");
228 
229 	/* test register class interface */
230 	if (ki_generic(tbase_fd, CLASSINT_REG))
231 		printf("Failed on registering class interface\n");
232 	else
233 		printf("Success on registering class interface\n");
234 
235 	/* test register sysdev_class */
236 	if (ki_generic(tbase_fd, SYSDEV_CLS_REG))
237 		printf("Failed on registering sysdev_class\n");
238 	else
239 		printf("Success on registering sysdev_class\n");
240 
241 	/* test register sysdev */
242 	if (ki_generic(tbase_fd, SYSDEV_REG))
243 		printf("Failed on registering sysdev\n");
244 	else
245 		printf("Success on registering sysdev\n");
246 
247 	/* test unregister sysdev */
248 	if (ki_generic(tbase_fd, SYSDEV_UNREG))
249 		printf("Failed on unregistering sysdev\n");
250 	else
251 		printf("Success on unregistering sysdev\n");
252 
253 	/* test unregister sysdev_class */
254 	if (ki_generic(tbase_fd, SYSDEV_CLS_UNREG))
255 		printf("Failed on unregistering sysdev_class\n");
256 	else
257 		printf("Success on unregistering sysdev_class\n");
258 
259 	/* close the module */
260 	rc = tbaseclose();
261 	if (rc) {
262 		printf("Test MOD Driver may not be closed\n");
263 		exit(1);
264 	}
265 
266 	return 0;
267 }
268