diff options
Diffstat (limited to 'os/pc/pcmciamodem.c')
| -rw-r--r-- | os/pc/pcmciamodem.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/os/pc/pcmciamodem.c b/os/pc/pcmciamodem.c new file mode 100644 index 00000000..800f406c --- /dev/null +++ b/os/pc/pcmciamodem.c @@ -0,0 +1,75 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "io.h" +#include "ureg.h" +#include "../port/error.h" + +/* + * PCMCIA modem. + * By default, this will set it up with the port and irq of + * COM2 unless a serialx=type=com line is found in plan9.ini. + * The assumption is that a laptop with a pcmcia will have only + * one com port. + */ + +enum { + Maxcard= 8, +}; + +static char* modems[] = { + "IBM 33.6 Data/Fax/Voice Modem", + "CM-56G", /* Xircom CreditCard Modem 56 - GlobalACCESS */ + "KeepInTouch", + "CEM56", + "MONTANA V.34 FAX/MODEM", /* Motorola */ + "REM10", + "GSM/GPRS", + "AirCard 555", + "Gold Card Global", /* Psion V90 Gold card */ + "Merlin UMTS Modem", /* Novatel card */ + 0, +}; + +void +pcmciamodemlink(void) +{ + ISAConf isa; + int i, j, slot, com2used, usingcom2; + + i = 0; + com2used = 0; + for(j = 0; modems[j]; j++){ + memset(&isa, 0, sizeof(isa)); + + /* look for a configuration line */ + for(; i < Maxcard; i++){ + if(isaconfig("serial", i, &isa)) + if(cistrcmp(isa.type, "com") == 0) + break; + memset(&isa, 0, sizeof(isa)); + } + + usingcom2 = 0; + if (isa.irq == 0 && isa.port == 0) { + if (com2used == 0) { + /* default is COM2 */ + isa.irq = 3; + isa.port = 0x2F8; + usingcom2 = 1; + } else + break; + } + slot = pcmspecial(modems[j], &isa); + if(slot >= 0){ + if(usingcom2) + com2used = 1; + if(ioalloc(isa.port, 8, 0, modems[j]) < 0) + print("%s port %lux already in use\n", modems[j], isa.port); + print("%s in pcmcia slot %d port 0x%lux irq %d\n", + modems[j], slot, isa.port, isa.irq); + } + } +} |
