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