xref: /plan9-contrib/sys/src/9/pc/pcmciamodem.c (revision 883a8c51bed350ea85a0220461d31e311550db04)
1 #include "u.h"
2 #include "../port/lib.h"
3 #include "mem.h"
4 #include "dat.h"
5 #include "fns.h"
6 #include "io.h"
7 #include "ureg.h"
8 #include "../port/error.h"
9 
10 /*
11  *  PCMCIA modem.
12  *  By default, this will set it up with the port and irq of
13  *  COM2 unless a serialx=type=com line is found in plan9.ini.
14  *  The assumption is that a laptop with a pcmcia will have only
15  *  one com port.
16  */
17 
18 enum {
19 	Maxcard=	8,
20 };
21 
22 static char* modems[] = {
23 	"IBM 33.6 Data/Fax/Voice Modem",
24 	"CM-56G",			/* Xircom CreditCard Modem 56 - GlobalACCESS */
25 	"KeepInTouch",
26 	"CEM56",
27 	"MONTANA V.34 FAX/MODEM",	/* Motorola */
28 	"REM10",
29 	"GSM/GPRS",
30 	"AirCard 555",
31 	"Gold Card Global",		/* Psion V90 Gold card */
32 	"Merlin UMTS Modem",		/* Novatel card */
33 	0,
34 };
35 
36 void
pcmciamodemlink(void)37 pcmciamodemlink(void)
38 {
39 	ISAConf isa;
40 	int i, j, slot, com2used, usingcom2;
41 
42 	i = 0;
43 	com2used = 0;
44 	for(j = 0; modems[j]; j++){
45 		memset(&isa, 0, sizeof(isa));
46 
47 		/* look for a configuration line */
48 		for(; i < Maxcard; i++){
49 			if(isaconfig("serial", i, &isa))
50 			if(cistrcmp(isa.type, "com") == 0)
51 				break;
52 			memset(&isa, 0, sizeof(isa));
53 		}
54 
55 		usingcom2 = 0;
56 		if (isa.irq == 0 && isa.port == 0) {
57 			if (com2used == 0) {
58 				/* default is COM2 */
59 				isa.irq = 3;
60 				isa.port = 0x2F8;
61 				usingcom2 = 1;
62 			} else
63 				break;
64 		}
65 		slot = pcmspecial(modems[j], &isa);
66 		if(slot >= 0){
67 			if(usingcom2)
68 				com2used = 1;
69 			if(ioalloc(isa.port, 8, 0, modems[j]) < 0)
70 				print("%s port %lux already in use\n",
71 					modems[j], isa.port);
72 			print("%s in pcmcia slot %d port 0x%lux irq %d\n",
73 				modems[j], slot, isa.port, isa.irq);
74 		}
75 	}
76 }
77