Annotation of embedtools/src/athctl.c, revision 1.1.2.12
1.1.2.2 misho 1: /*************************************************************************
2: * (C) 2010 AITNET - Sofia/Bulgaria - <office@aitbg.com>
3: * by Michael Pounov <misho@aitbg.com>
4: *
5: * $Author: misho $
1.1.2.12! misho 6: * $Id: athctl.c,v 1.1.2.11 2010/11/05 00:43:27 misho Exp $
1.1.2.2 misho 7: *
8: *************************************************************************/
1.1.2.1 misho 9: #include "global.h"
1.1.2.2 misho 10: #include "athctl.h"
1.1.2.1 misho 11:
12:
1.1.2.2 misho 13: int Verbose;
14: extern char compiled[], compiledby[], compilehost[];
15:
16:
17: static void
18: Usage()
19: {
20: printf( "athCtl is tool for Atheros WiFi cards managment \n"
21: "=== %s === %s@%s ===\n\n"
1.1.2.4 misho 22: " Syntax: athctl [options] [[0xMemory_Address] new_value]\n"
1.1.2.3 misho 23: " athctl [-v] -t [-i <iface_no>]\n"
24: " athctl [-v] -c <timeout> [-i <iface_no>]\n"
25: " athctl [-v] -d <distance> [-i <iface_no>]\n"
26: " athctl [-v] -r <0xoffset> <0xMemory_Address>\n"
1.1.2.4 misho 27: " athctl [-v] -w <0xoffset> <0xMemory_Address> <uint16_value>\n"
1.1.2.3 misho 28: " athctl [-v] -s <file> <0xMemory_Address>\n"
1.1.2.11 misho 29: " athctl [-v] -u <file> <0xMemory_Address>\n"
30: " athctl [-v] -R <0xMemory_Address> [new_regdomain]\n"
1.1.2.3 misho 31: "\n"
1.1.2.2 misho 32: "\t-v\t\tVerbose ...\n"
33: "\t-t\t\tGet current Atheros maximum range in meters\n"
34: "\t-i <iface_no>\tApply to this Atheros interface number (like ath0 == 0)\n"
35: "\t-d <distance>\tMode distance, meters to target\n"
36: "\t-c <timeout>\tMode distance, mS timeouts correction\n"
1.1.2.11 misho 37: "\t-R\t\tRead or Write EEPROM Regulatory domain\n"
1.1.2.3 misho 38: "\t-s <file>\tDump EEPROM to file\n"
39: "\t-u <file>\tUpdate EEPROM from file\n"
40: "\t-r <offset>\tRead EEPROM word from PCI mapped memory address\n"
41: "\t-w <offset>\tWrite EEPROM word to PCI mapped memory address\n"
1.1.2.2 misho 42: "\n", compiled, compiledby, compilehost);
43: }
44:
45: static int
46: calcDistance(int ifid, int dist, int cor)
47: {
48: int slottime[2], timeout[2];
49: size_t len;
50: char szStr[STRSIZ];
51:
52: slottime[0] = 9 + (dist / 300) + (dist % 300 ? 1 : 0);
53: timeout[0] = slottime[0] * 2 + 3 + cor;
54: VERB(3) printf("Info:: slottime=%d timeout=%d\n", slottime[0], timeout[0]);
55:
56: memset(szStr, 0, STRSIZ);
57: snprintf(szStr, STRSIZ, SC_SLOTTIME, ifid);
58: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
59: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
60: return -1;
61: } else if (sysctlbyname(szStr, &slottime[1], &len, NULL, 0) == -1) {
62: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
63: return -1;
64: } else if (sysctlbyname(szStr, NULL, NULL, &slottime[0], sizeof slottime[0]) == -1) {
65: printf("Error:: set sysctl %s from %d #%d - %s\n", szStr, slottime[1],
66: errno, strerror(errno));
67: return -1;
68: } else
69: VERB(1) printf("Info:: set slottime(%d) from %d to %d ... OK!\n", len,
70: slottime[1], slottime[0]);
71:
72: memset(szStr, 0, STRSIZ);
73: snprintf(szStr, STRSIZ, SC_ACKTIMEOUT, ifid);
74: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
75: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
76: return -1;
77: } else if (sysctlbyname(szStr, &timeout[1], &len, NULL, 0) == -1) {
78: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
79: return -1;
80: } else if (sysctlbyname(szStr, NULL, NULL, &timeout[0], sizeof timeout[0]) == -1) {
81: printf("Error:: set sysctl %s from %d #%d - %s\n", szStr, timeout[1],
82: errno, strerror(errno));
83: return -1;
84: } else
85: VERB(1) printf("Info:: set acktimeout(%d) from %d to %d ... OK!\n", len,
86: timeout[1], timeout[0]);
87:
88: memset(szStr, 0, STRSIZ);
89: snprintf(szStr, STRSIZ, SC_CTSTIMEOUT, ifid);
90: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
91: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
92: return -1;
93: } else if (sysctlbyname(szStr, &timeout[1], &len, NULL, 0) == -1) {
94: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
95: return -1;
96: } else if (sysctlbyname(szStr, NULL, NULL, &timeout[0], sizeof timeout[0]) == -1) {
97: printf("Error:: set sysctl %s from %d #%d - %s\n", szStr, timeout[1],
98: errno, strerror(errno));
99: return -1;
100: } else
101: VERB(1) printf("Info:: set ctstimeout(%d) from %d to %d ... OK!\n", len,
102: timeout[1], timeout[0]);
103:
104: return timeout[0];
105: }
106:
107:
108: static int
109: calcTimeout(int ifid, int cor)
110: {
111: int slottime[2], timeout[2];
112: size_t len;
113: char szStr[STRSIZ];
114:
115: memset(szStr, 0, STRSIZ);
116: snprintf(szStr, STRSIZ, SC_SLOTTIME, ifid);
117: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
118: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
119: return -1;
120: } else if (sysctlbyname(szStr, &slottime[1], &len, NULL, 0) == -1) {
121: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
122: return -1;
123: } else
124: VERB(1) printf("Info:: get slottime(%d) %d ... OK!\n", len, slottime[1]);
125:
126: memset(szStr, 0, STRSIZ);
127: snprintf(szStr, STRSIZ, SC_ACKTIMEOUT, ifid);
128: if (sysctlbyname(szStr, NULL, &len, NULL, 0) == -1) {
129: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
130: return -1;
131: } else if (sysctlbyname(szStr, &timeout[1], &len, NULL, 0) == -1) {
132: printf("Error:: get sysctl %s #%d - %s\n", szStr, errno, strerror(errno));
133: return -1;
134: } else
135: VERB(1) printf("Info:: get acktimeout(%d) %d ... OK!\n", len, timeout[1]);
136:
137: slottime[0] = (timeout[1] - 3 - cor) / 2;
138: VERB(3) printf("Info:: calculated slottime=%d\n", slottime[0]);
139: timeout[0] = (slottime[0] - 10) * 300;
140: VERB(3) printf("Info:: calculated timeout=%d\n", timeout[0]);
141:
142: return timeout[0];
143: }
1.1.2.3 misho 144:
145:
146: static inline void *
147: devOpen(u_long baseaddr)
148: {
149: int fd;
150: void *basemem;
151:
152: fd = open("/dev/mem", O_RDWR);
153: if (fd == -1) {
154: printf("Error:: open device #%d - %s\n", errno, strerror(errno));
155: return NULL;
156: }
157: basemem = mmap(NULL, ATH_PCI_MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, baseaddr);
158: if (basemem == MAP_FAILED) {
159: printf("Error:: map device #%d - %s\n", errno, strerror(errno));
160: close(fd);
161: return NULL;
162: } else
163: close(fd);
164:
165: return basemem;
166: }
167:
168: static inline void
169: devClose(void *basemem)
170: {
171: if (basemem)
172: munmap(basemem, ATH_PCI_MEM_SIZE);
173: }
174:
1.1.2.8 misho 175: static inline int
1.1.2.4 misho 176: readWord(u_char *mem, u_long offset)
177: {
178: register int timeout = ATH_ACCESS_TIMEOUT;
179: u_long stat;
180:
1.1.2.11 misho 181: VERB(9) printf("Reading EEPROM memory %p+%lx ...\n", mem, offset);
1.1.2.4 misho 182: ATH_OUT(mem, AR5211_EEPROM_CONF, 0);
183: usleep(ATH_ACCESS_WAIT);
184: /* enable eeprom access */
185: ATH_OUT(mem, AR5211_EEPROM_COMD, ATH_IN(mem, AR5211_EEPROM_COMD) | AR5211_EEPROM_COMD_RESET);
186: usleep(ATH_ACCESS_WAIT);
187: /* set address */
188: ATH_OUT(mem, AR5211_EEPROM_ADDR, offset);
189: usleep(ATH_ACCESS_WAIT);
190: /* enable eeprom read access */
191: ATH_OUT(mem, AR5211_EEPROM_COMD, ATH_IN(mem, AR5211_EEPROM_COMD) | AR5211_EEPROM_COMD_READ);
192: usleep(ATH_ACCESS_WAIT);
193:
194: while (timeout--) {
195: usleep(1);
196: stat = ATH_IN(mem, AR5211_EEPROM_STATUS);
197: if (stat & AR5211_EEPROM_STAT_RDDONE) {
198: if (stat & AR5211_EEPROM_STAT_RDERR) {
199: printf("Error:: EEPROM read failed!\n");
200: return -1;
201: }
202:
203: stat = ATH_IN(mem, AR5211_EEPROM_DATA);
1.1.2.8 misho 204: return (stat & 0x0000ffff) << 16;
1.1.2.4 misho 205: }
206: }
207:
208: printf("Error:: EEPROM read timeout!\n");
1.1.2.7 misho 209: return -1;
1.1.2.4 misho 210: }
211:
1.1.2.8 misho 212: static inline int
1.1.2.4 misho 213: writeWord(u_char *mem, u_long offset, u_short newval)
214: {
215: register int i = ATH_WRITE_RETRY, timeout;
216: u_long pcicfg, stat;
1.1.2.11 misho 217: int chk;
1.1.2.4 misho 218:
1.1.2.11 misho 219: VERB(9) printf("Writing EEPROM memory %p+%lx ...\n", mem, offset);
1.1.2.4 misho 220: /* enable pci write access */
221: pcicfg = ATH_IN(mem, AR5K_PCICFG);
222: ATH_OUT(mem, AR5K_PCICFG, (pcicfg & ~AR5K_PCICFG_SPWR_DN));
223: usleep(ATH_ACCESS_WAITDOWN);
224: ATH_OUT(mem, AR5K_PCICFG, pcicfg | AR5K_PCICFG_EEAE /* | 0x2 */);
225: usleep(ATH_ACCESS_WAITPCI);
226: ATH_OUT(mem, AR5211_EEPROM_STATUS, 0);
227: usleep(ATH_ACCESS_WAITPCI);
228: /* ATH_OUT(mem, AR5211_EEPROM_CONF, 1); */
229: ATH_OUT(mem, AR5211_EEPROM_CONF, 0);
230:
231: do {
232: /* enable eeprom write access */
233: ATH_OUT(mem, AR5211_EEPROM_COMD, AR5211_EEPROM_COMD_RESET);
234: usleep(ATH_ACCESS_WAITDOWN);
235: ATH_OUT(mem, AR5211_EEPROM_DATA, newval);
236: usleep(ATH_ACCESS_WAIT);
237: ATH_OUT(mem, AR5211_EEPROM_ADDR, offset);
238: usleep(ATH_ACCESS_WAIT);
239: ATH_OUT(mem, AR5211_EEPROM_COMD, AR5211_EEPROM_COMD_WRITE);
240: usleep(ATH_ACCESS_WAIT);
241:
242: for (timeout = ATH_ACCESS_TIMEOUT; timeout; timeout--) {
243: stat = ATH_IN(mem, AR5211_EEPROM_STATUS);
244: if (stat & 0xc) {
245: if (stat & AR5211_EEPROM_STAT_WRERR) {
246: printf("Error:: EEPROM write failed!\n");
247: return -1;
248: }
249:
250: ATH_OUT(mem, AR5211_EEPROM_STATUS, 0);
251: usleep(ATH_ACCESS_WAIT * 2);
252: break;
253: }
254: usleep(ATH_ACCESS_WAIT * 2);
255: }
256:
257: chk = readWord(mem, offset);
258: if (chk == (u_short) -1)
259: return -1;
1.1.2.11 misho 260: if ((u_short) (chk >> 16) == newval)
261: return chk;
1.1.2.5 misho 262: else
1.1.2.11 misho 263: VERB(1) printf("Write & Read don`t match 0x%04X != 0x%04X\n", newval, (u_short) (chk >> 16));
1.1.2.4 misho 264: if (i)
265: printf("Warning:: Retrying EEPROM write ...\n");
266: } while (--i);
267:
268: printf("Error:: EEPROM write timeout!\n");
1.1.2.7 misho 269: return -1;
1.1.2.4 misho 270: }
271:
1.1.2.3 misho 272: static int
1.1.2.5 misho 273: dumpFile(const char *csName, u_char *mem)
1.1.2.3 misho 274: {
275: register u_long i;
1.1.2.8 misho 276: u_short d1, d2;
1.1.2.11 misho 277: u_char eeprom[ATH_EEPROM_SIZE] = { 0 };
1.1.2.8 misho 278: int f, data;
1.1.2.3 misho 279:
1.1.2.8 misho 280: VERB(2) printf("Reading EEPROM memory %p ::\n", mem);
1.1.2.3 misho 281: for (i = 0; i < ATH_EEPROM_SIZE / 2; i++) {
1.1.2.5 misho 282: if (!(i % 0x40)) {
283: if (i)
284: printf("]\n");
1.1.2.9 misho 285: printf("0x%04lX [", i * 2);
1.1.2.5 misho 286: }
287:
1.1.2.8 misho 288: if ((data = readWord(mem, i)) == -1)
1.1.2.5 misho 289: return -1;
290: else {
1.1.2.11 misho 291: d1 = ((u_short)(data >> 16)) / 0x100;
292: d2 = ((u_short)(data >> 16)) % 0x100;
293:
294: VERB(5) printf( "Current value 0x%04X on position 0x%04lX will change 0x%02X 0x%02X\n",
295: (u_short) (data >> 16), i, d1, d2);
1.1.2.5 misho 296: }
297:
298: eeprom[i * 2] = d2;
299: eeprom[i * 2 + 1] = d1;
300:
301: printf(".");
302: usleep(ATH_ACCESS_WAITDOWN);
303: }
304: printf("]\n");
305:
1.1.2.8 misho 306: VERB(2) printf("Saving EEPROM to file %s ... ", csName);
1.1.2.5 misho 307: f = open(csName, O_WRONLY | O_CREAT | O_TRUNC, 0644);
308: if (f == -1) {
309: printf("Failed!\nError:: in create file %s #%d - %s\n", csName,
310: errno, strerror(errno));
311: return 0;
312: }
313: if (write(f, eeprom, ATH_EEPROM_SIZE) == -1) {
314: printf("Failed!\nError:: in write to file %s #%d - %s\n", csName,
315: errno, strerror(errno));
316: close(f);
317: return 0;
1.1.2.3 misho 318: }
1.1.2.5 misho 319: close(f);
320: printf("OK!\n");
321: return 1;
322: }
323:
324: static int
325: flashFile(const char *csName, u_char *mem)
326: {
327: register u_long i;
1.1.2.8 misho 328: u_short d1;
1.1.2.11 misho 329: u_char eeprom[ATH_EEPROM_SIZE] = { 0 };
1.1.2.8 misho 330: int f, data;
1.1.2.5 misho 331:
1.1.2.8 misho 332: VERB(2) printf("Reading EEPROM from file %s ... ", csName);
1.1.2.5 misho 333: f = open(csName, O_RDONLY);
334: if (f == -1) {
335: printf("Failed!\nError:: in open file %s #%d - %s\n", csName,
336: errno, strerror(errno));
337: return 0;
338: }
339: if (read(f, eeprom, ATH_EEPROM_SIZE) != ATH_EEPROM_SIZE) {
340: printf("Failed!\nError:: failed load image from file %s\n", csName);
341: close(f);
342: return 0;
343: }
344: close(f);
1.1.2.11 misho 345: VERB(2) printf("OK!\n");
1.1.2.5 misho 346:
1.1.2.8 misho 347: VERB(2) printf("Writing EEPROM memory %p ::\n", mem);
1.1.2.5 misho 348: for (i = 0; i < ATH_EEPROM_SIZE / 2; i++) {
349: if (!(i % 0x40)) {
350: if (i)
351: printf("]\n");
1.1.2.9 misho 352: printf("0x%04lX [", i * 2);
1.1.2.5 misho 353: }
354:
1.1.2.8 misho 355: if ((data = readWord(mem, i)) == -1)
1.1.2.5 misho 356: return -1;
357: else
358: d1 = eeprom[i * 2 + 1] * 0x100 + eeprom[i * 2];
1.1.2.11 misho 359: VERB(5) printf("eeprom_data=0x%04X read_d1=0x%04X\n", (u_char) (data >> 16), d1);
1.1.2.5 misho 360:
1.1.2.11 misho 361: if (((u_short) (data >> 16)) == d1)
1.1.2.5 misho 362: printf(".");
363: else {
364:
365: if (writeWord(mem, i, d1) < 1)
1.1.2.11 misho 366: printf("!");
367: else
368: printf("x");
1.1.2.5 misho 369: }
370:
371: usleep(ATH_ACCESS_WAITDOWN);
372: }
373: printf("]\n");
374:
375: return 0;
1.1.2.3 misho 376: }
377:
1.1.2.12! misho 378: static int
! 379: regDomain(u_char *mem, u_short newval)
! 380: {
! 381: int ret, data;
! 382:
! 383: if ((data = readWord(mem, ATH_OFFSET_REGDOMAIN)) == -1)
! 384: return -1;
! 385:
! 386: printf("Current value 0x%04X ", (u_short) (data >> 16));
! 387: if (newval != (u_short) -1) {
! 388: printf("will change to 0x%04X\n", newval);
! 389:
! 390: if ((ret = writeWord(mem, ATH_OFFSET_REGDOMAIN, newval)) == -1)
! 391: return -1;
! 392:
! 393: printf("Updated regulatory domain is 0x%04X\n", (u_short) (ret >> 16));
! 394: } else
! 395: printf("\nCurrent regulatory domain is 0x%04X\n", (u_short) (data >> 16));
! 396:
! 397: return 0;
! 398: }
! 399:
1.1.2.2 misho 400: // ----------------------------------------------------
401:
1.1.2.1 misho 402: int
403: main(int argc, char **argv)
404: {
1.1.2.3 misho 405: char ch, szName[MAXPATHLEN] = { 0 }, mode = 0;
1.1.2.2 misho 406: int ret = 0, dist = 0, cor = 0, ino = 0;
1.1.2.4 misho 407: u_long offset = 0, baseaddr = (u_long) -1;
408: u_short newval = 0;
1.1.2.3 misho 409: void *basemem = NULL;
1.1.2.2 misho 410:
1.1.2.11 misho 411: while ((ch = getopt(argc, argv, "hvRtr:w:i:d:c:u:s:")) != -1)
1.1.2.2 misho 412: switch (ch) {
413: case 'v':
414: Verbose++;
415: break;
416: case 't':
417: mode |= 2;
418: break;
419: case 'i':
420: ino = strtol(optarg, NULL, 0);
421: if (ino < 0) {
422: printf("Error:: in interface number %d\n", ino);
423: return 1;
424: }
425: break;
426: case 'd':
427: mode |= 1;
428: dist = strtol(optarg, NULL, 0);
429: if (dist < 1) {
430: printf("Error:: in distance meters %d\n", dist);
431: return 1;
432: }
433: break;
434: case 'c':
435: mode |= 1;
436: cor = strtol(optarg, NULL, 0);
437: break;
1.1.2.3 misho 438: case 's':
439: mode = 0x10;
440: strlcpy(szName, optarg, MAXPATHLEN);
441: break;
442: case 'u':
443: mode = 0x20;
444: strlcpy(szName, optarg, MAXPATHLEN);
445: break;
1.1.2.11 misho 446: case 'R':
447: mode = 0x40;
448: break;
1.1.2.3 misho 449: case 'r':
450: mode = 4;
451: offset = strtoul(optarg, NULL, 0);
452: break;
453: case 'w':
454: mode = 8;
455: offset = strtoul(optarg, NULL, 0);
456: break;
1.1.2.2 misho 457: case 'h':
458: default:
459: Usage();
460: return 1;
461: }
462: argc -= optind;
463: argv += optind;
1.1.2.3 misho 464: if (argc && *argv)
465: baseaddr = strtoul(*argv, NULL, 0);
1.1.2.2 misho 466: if (!mode) {
467: printf("Error:: not selected mode for operation ...\n");
468: return 1;
469: }
1.1.2.3 misho 470: if (mode > 3 && baseaddr == (u_long) -1) {
471: printf("Error:: in this mode for operation, must give memory mapped address ...\n");
472: return 1;
473: }
1.1.2.4 misho 474: if (mode & 8) {
475: if (!argv[1]) {
476: printf("Error:: in write word mode, must give memory mapped address and new value ...\n");
477: return 1;
478: } else
479: newval = (u_short) strtoul(argv[1], NULL, 0);
480: }
1.1.2.12! misho 481: if (mode & 0x40) {
! 482: if (argv[1])
! 483: newval = (u_short) strtoul(argv[1], NULL, 0);
! 484: else
! 485: newval = (u_short) -1;
! 486: }
1.1.2.2 misho 487:
488: if (mode & 1)
489: if ((ret = calcDistance(ino, dist, cor)) < 1)
490: return 2;
491: if (mode & 2) {
492: if ((ret = calcTimeout(ino, cor)) < 1)
493: return 2;
494: else {
495: VERB(1)
496: printf("Maximum approximate distance ~%d meters\n", ret);
497: else
498: printf("~%d\n", ret);
499: }
500: }
501:
1.1.2.3 misho 502: if (mode & 4) {
503: if (!(basemem = devOpen(baseaddr)))
504: return 2;
1.1.2.7 misho 505: if ((ret = readWord(basemem, offset)) == -1) {
1.1.2.4 misho 506: devClose(basemem);
507: return 3;
1.1.2.6 misho 508: } else
1.1.2.11 misho 509: printf("EEPROM readed value 0x%04X\n", (u_short) (ret >> 16));
1.1.2.4 misho 510: devClose(basemem);
511: }
512: if (mode & 8) {
513: if (!(basemem = devOpen(baseaddr)))
514: return 2;
1.1.2.7 misho 515: if ((ret = writeWord(basemem, offset, newval)) == -1) {
1.1.2.4 misho 516: devClose(basemem);
517: return 3;
1.1.2.7 misho 518: } else
1.1.2.11 misho 519: printf("EEPROM writed value 0x%04X\n", (u_short) (ret >> 16));
1.1.2.3 misho 520: devClose(basemem);
521: }
522:
1.1.2.5 misho 523: if (mode & 0x10) {
1.1.2.10 misho 524: if (!(basemem = devOpen(baseaddr)))
525: return 2;
1.1.2.5 misho 526: if ((ret = dumpFile(szName, basemem)) < 1) {
1.1.2.10 misho 527: devClose(basemem);
1.1.2.5 misho 528: return 3;
529: }
1.1.2.10 misho 530: devClose(basemem);
1.1.2.5 misho 531: }
532: if (mode & 0x20) {
533: if (!(basemem = devOpen(baseaddr)))
534: return 2;
535: if ((ret = flashFile(szName, basemem)) < 1) {
536: devClose(basemem);
537: return 3;
538: }
539: devClose(basemem);
540: }
541:
1.1.2.11 misho 542: if (mode & 0x40) {
543: if (!(basemem = devOpen(baseaddr)))
544: return 2;
545: if ((ret = regDomain(basemem, newval)) < 1) {
546: devClose(basemem);
547: return 3;
548: }
549: devClose(basemem);
550: }
551:
1.1.2.1 misho 552: return 0;
553: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>