xref: /plan9-contrib/sys/src/9/pc/pcmciamodem.c (revision 883a8c51bed350ea85a0220461d31e311550db04)
17dd7cddfSDavid du Colombier #include "u.h"
27dd7cddfSDavid du Colombier #include "../port/lib.h"
37dd7cddfSDavid du Colombier #include "mem.h"
47dd7cddfSDavid du Colombier #include "dat.h"
57dd7cddfSDavid du Colombier #include "fns.h"
67dd7cddfSDavid du Colombier #include "io.h"
77dd7cddfSDavid du Colombier #include "ureg.h"
87dd7cddfSDavid du Colombier #include "../port/error.h"
97dd7cddfSDavid du Colombier 
107dd7cddfSDavid du Colombier /*
117dd7cddfSDavid du Colombier  *  PCMCIA modem.
127dd7cddfSDavid du Colombier  *  By default, this will set it up with the port and irq of
137dd7cddfSDavid du Colombier  *  COM2 unless a serialx=type=com line is found in plan9.ini.
147dd7cddfSDavid du Colombier  *  The assumption is that a laptop with a pcmcia will have only
157dd7cddfSDavid du Colombier  *  one com port.
167dd7cddfSDavid du Colombier  */
177dd7cddfSDavid du Colombier 
187dd7cddfSDavid du Colombier enum {
197dd7cddfSDavid du Colombier 	Maxcard=	8,
207dd7cddfSDavid du Colombier };
217dd7cddfSDavid du Colombier 
227dd7cddfSDavid du Colombier static char* modems[] = {
237dd7cddfSDavid du Colombier 	"IBM 33.6 Data/Fax/Voice Modem",
247dd7cddfSDavid du Colombier 	"CM-56G",			/* Xircom CreditCard Modem 56 - GlobalACCESS */
257dd7cddfSDavid du Colombier 	"KeepInTouch",
267dd7cddfSDavid du Colombier 	"CEM56",
279a747e4fSDavid du Colombier 	"MONTANA V.34 FAX/MODEM",	/* Motorola */
283ff48bf5SDavid du Colombier 	"REM10",
29d9306527SDavid du Colombier 	"GSM/GPRS",
30d9306527SDavid du Colombier 	"AirCard 555",
31fb7f0c93SDavid du Colombier 	"Gold Card Global",		/* Psion V90 Gold card */
3215174232SDavid du Colombier 	"Merlin UMTS Modem",		/* Novatel card */
337dd7cddfSDavid du Colombier 	0,
347dd7cddfSDavid du Colombier };
357dd7cddfSDavid du Colombier 
367dd7cddfSDavid du Colombier void
pcmciamodemlink(void)377dd7cddfSDavid du Colombier pcmciamodemlink(void)
387dd7cddfSDavid du Colombier {
397dd7cddfSDavid du Colombier 	ISAConf isa;
409a747e4fSDavid du Colombier 	int i, j, slot, com2used, usingcom2;
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier 	i = 0;
4359cc4ca5SDavid du Colombier 	com2used = 0;
4459cc4ca5SDavid du Colombier 	for(j = 0; modems[j]; j++){
457dd7cddfSDavid du Colombier 		memset(&isa, 0, sizeof(isa));
467dd7cddfSDavid du Colombier 
477dd7cddfSDavid du Colombier 		/* look for a configuration line */
487dd7cddfSDavid du Colombier 		for(; i < Maxcard; i++){
497dd7cddfSDavid du Colombier 			if(isaconfig("serial", i, &isa))
507dd7cddfSDavid du Colombier 			if(cistrcmp(isa.type, "com") == 0)
517dd7cddfSDavid du Colombier 				break;
527dd7cddfSDavid du Colombier 			memset(&isa, 0, sizeof(isa));
537dd7cddfSDavid du Colombier 		}
547dd7cddfSDavid du Colombier 
559a747e4fSDavid du Colombier 		usingcom2 = 0;
5659cc4ca5SDavid du Colombier 		if (isa.irq == 0 && isa.port == 0) {
5759cc4ca5SDavid du Colombier 			if (com2used == 0) {
587dd7cddfSDavid du Colombier 				/* default is COM2 */
597dd7cddfSDavid du Colombier 				isa.irq = 3;
607dd7cddfSDavid du Colombier 				isa.port = 0x2F8;
619a747e4fSDavid du Colombier 				usingcom2 = 1;
6259cc4ca5SDavid du Colombier 			} else
6359cc4ca5SDavid du Colombier 				break;
6459cc4ca5SDavid du Colombier 		}
657dd7cddfSDavid du Colombier 		slot = pcmspecial(modems[j], &isa);
667dd7cddfSDavid du Colombier 		if(slot >= 0){
679a747e4fSDavid du Colombier 			if(usingcom2)
689a747e4fSDavid du Colombier 				com2used = 1;
699a747e4fSDavid du Colombier 			if(ioalloc(isa.port, 8, 0, modems[j]) < 0)
70*883a8c51SDavid du Colombier 				print("%s port %lux already in use\n",
71*883a8c51SDavid du Colombier 					modems[j], isa.port);
72fb7f0c93SDavid du Colombier 			print("%s in pcmcia slot %d port 0x%lux irq %d\n",
737dd7cddfSDavid du Colombier 				modems[j], slot, isa.port, isa.irq);
747dd7cddfSDavid du Colombier 		}
757dd7cddfSDavid du Colombier 	}
767dd7cddfSDavid du Colombier }
77