diff -uprN Dev.orig/ser/32/Makefile Dev.AD/ser/32/Makefile --- Dev.orig/ser/32/Makefile 1996-04-12 19:29:02.000000000 +0200 +++ Dev.AD/ser/32/Makefile 2017-01-10 17:14:03.609526000 +0100 @@ -1,8 +1,8 @@ ifndef VER -VER = 423 +VER = 20 endif ifndef REL -REL = X +REL = AD endif .SUFFIXES: diff -uprN Dev.orig/ser/async.c Dev.AD/ser/async.c --- Dev.orig/ser/async.c 1996-10-04 16:58:53.000000000 +0200 +++ Dev.AD/ser/async.c 2017-01-10 17:14:03.609526000 +0100 @@ -34,7 +34,13 @@ static void test_tx(struct dev_entry *de return; if((lsr & 0x20) == 0) return; - outp(dev->iobase+1, 0x0f); + if (dev->base_type == BASE_TYPE_IO) + outp(((unsigned)(dev->iobase))+1, 0x0f); + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + iobase[1] = 0x0f; + } return; } @@ -53,26 +59,32 @@ static pid_t process_lsr(struct dev_entr * buffer (to "eat" the spurious data associated * with break, parity error, etc.) */ - key = inp(dev->iobase); + if (dev->base_type == BASE_TYPE_IO) + key = inp((unsigned)dev->iobase); + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + key = iobase[0]; + } if(lsr & 0x10) { - Trace1( (long)_TRACE_DEV_SER_HUP+1, _TRACE_TRANSIENT, dev->iobase ); + Trace1( (long)_TRACE_DEV_SER_HUP+1, _TRACE_TRANSIENT, (unsigned) dev->iobase); key |= RCV_BREAK; } else { if(lsr & 0x04) { key |= RCV_PARITY; - Trace1( (long)_TRACE_DEV_SER_PARITY, _TRACE_TRANSIENT, dev->iobase ); + Trace1( (long)_TRACE_DEV_SER_PARITY, _TRACE_TRANSIENT, (unsigned) dev->iobase); } if(lsr & 0x08) { key |= RCV_FRAME; - Trace1( (long)_TRACE_DEV_SER_FRAME, _TRACE_TRANSIENT, dev->iobase ); + Trace1( (long)_TRACE_DEV_SER_FRAME, _TRACE_TRANSIENT, (unsigned) dev->iobase); } } if(lsr & 0x02) { key |= RCV_OVERRUN; - Trace1( (long)_TRACE_DEV_SER_OVERRUN, _TRACE_TRANSIENT, dev->iobase ); + Trace1( (long)_TRACE_DEV_SER_OVERRUN, _TRACE_TRANSIENT, (unsigned) dev->iobase); } return( (*tti) (key, dev->tty, tti_ds) ); } @@ -112,7 +124,14 @@ pid_t async_int(int irq) { for(dev = dev_list[irq]; dev != 0; dev = dev->link) { if(dev->iobase == 0) continue; - iir = inp(dev->iobase+2); + if (dev->base_type == BASE_TYPE_IO) + iir = inp(((unsigned)(dev->iobase))+2); + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + iir = iobase[2]; + } + if((iir & 0x01) != 0) continue; /* @@ -125,9 +144,23 @@ pid_t async_int(int irq) { * Input Interrupt */ while(1) { - status |= (*tti) (inp(dev->iobase), dev->tty, tti_ds); + if (dev->base_type == BASE_TYPE_IO) + status |= (*tti) (inp((unsigned)dev->iobase), dev->tty, tti_ds); + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + status |= (*tti) (iobase[0], dev->tty, tti_ds); + } + ++dev->rx_count; - lsr = inp(dev->iobase+5); + if (dev->base_type == BASE_TYPE_IO) + lsr = inp(((unsigned)(dev->iobase))+5); + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + lsr = iobase[5]; + } + status |= process_lsr(dev, lsr); if((lsr & 0x01) == 0) { test_tx(dev, lsr); @@ -147,7 +180,14 @@ pid_t async_int(int irq) { /* * Modem change */ - msr = inp(dev->iobase+6); + if (dev->base_type == BASE_TYPE_IO) + msr = inp(((unsigned)(dev->iobase))+6); + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + msr = iobase[6]; + } + dev->modem_status = (dev->modem_status & 0x0F) | (msr & 0xF0); if(dev->mode & MODE_PKT) /* Special mode for custom hardware */ @@ -156,11 +196,11 @@ pid_t async_int(int irq) { if((msr & 0x08) != 0 && (dev->mode & MODE_NOHUP) == 0) { if(msr & 0x80) { status |= (*tti) (RCV_CARRIER, dev->tty, tti_ds); - Trace1( _TRACE_DEV_SER_CARRIER, _TRACE_EXPECTED, dev->iobase ); + Trace1( _TRACE_DEV_SER_CARRIER, _TRACE_EXPECTED, (unsigned)dev->iobase); } else { status |= (*tti) (RCV_HNGUP, dev->tty, tti_ds); - Trace1( _TRACE_DEV_SER_HUP, _TRACE_EXPECTED, dev->iobase ); + Trace1( _TRACE_DEV_SER_HUP, _TRACE_EXPECTED, (unsigned)dev->iobase); } } @@ -193,7 +233,14 @@ pid_t async_int(int irq) { /* * Line status change */ - lsr = inp(dev->iobase+5); + if (dev->base_type == BASE_TYPE_IO) + lsr = inp(((unsigned)(dev->iobase))+5); + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + lsr = iobase[5]; + } + status |= process_lsr(dev, lsr); test_tx(dev, lsr); } Binärdateien Dev.orig/ser/Dev32.ser.10AD and Dev.AD/ser/Dev32.ser.10AD sind verschieden. diff -uprN Dev.orig/ser/init.c Dev.AD/ser/init.c --- Dev.orig/ser/init.c 1996-08-13 18:49:03.000000000 +0200 +++ Dev.AD/ser/init.c 2017-01-10 17:14:03.609526000 +0100 @@ -1,6 +1,9 @@ #include "struct.h" #include +#include +#include +#include #include #include #include @@ -44,9 +47,11 @@ void init_tables() { async_irq[15] = &async_irq15; } -void init(index, base, irq, baud, mode) +void init(baseType, index, base, irq, baud, mode) +unsigned char baseType; int index; -unsigned base, irq; +unsigned int base; +unsigned irq; long baud; int mode; { @@ -58,6 +63,7 @@ int mode; */ ttp = &dev_table[index]; + ttp->base_type = baseType; ttp->iobase = base; ttp->irq = irq; ttp->busy = 0; @@ -66,7 +72,14 @@ int mode; ttp->stop_bits = 1; ttp->data_bits = 8; ttp->mode = mode; - ttp->modem_control = (inp(ttp->iobase+4) & 0xE4) | 0x08; + if (ttp->base_type == BASE_TYPE_IO) + ttp->modem_control = (inp(((unsigned)(ttp->iobase))+4) & 0xE4) | 0x08; + else + { + unsigned char *iobase = (unsigned char *)ttp->iobase; + ttp->modem_control = (iobase[4] & 0xE4) | 0x08; + } + if(mode & MODE_DTR) ttp->modem_control |= 1; if(mode & MODE_RTS) @@ -88,11 +101,19 @@ int mode; } if(timer_enabled == 0) { + int isr_id = -1; + timer_enabled = 1; /* * Link into 100 msec timer chain */ - qnx_hint_attach( -1, &poll_devices, FP_SEG(&dev_table) ); + isr_id = qnx_hint_attach( -1, &poll_devices, FP_SEG(&dev_table) ); + if (isr_id == -1) { + printf ("Failed to attach poll_devices interrupt handler\n"); + exit (EXIT_FAILURE); + } + delay(100); + } } @@ -104,9 +125,9 @@ int mode; int find_asyncs() { if(check_async(0x3f8)) - new_async(num_asyncs++, 0x3f8, 4, 0); + new_async(BASE_TYPE_IO, num_asyncs++, 0x3f8, 4, 0); if(check_async(0x2f8)) - new_async(num_asyncs++, 0x2f8, 3, 0); + new_async(BASE_TYPE_IO, num_asyncs++, 0x2f8, 3, 0); return(num_asyncs); } @@ -144,12 +165,24 @@ static int check_async(unsigned port) */ #pragma off (check_stack); -static void set_port(port, mask, data) -unsigned port, mask, data; +static void set_port(baseType, port, offset, mask, data) +unsigned char baseType; +unsigned int port; +unsigned offset; +unsigned mask, data; { unsigned char c; - c = inp(port); - outp(port, (c & ~mask) | (data & mask)); + if (baseType == BASE_TYPE_IO) + { + c = inp(port + offset); + outp(port + offset, (c & ~mask) | (data & mask)); + } + else + { + unsigned char *iobase = (unsigned char *)port; + c = iobase[offset]; + iobase[offset] = ((c & ~mask) | (data & mask)); + } } int reset_async(index, init) @@ -157,7 +190,7 @@ int index; int init; { register struct dev_entry *ttp; - unsigned port; + unsigned int port; unsigned value; ttp = &dev_table[index]; @@ -175,14 +208,14 @@ int init; value = divisor / ttp->baud; /* calculate divisor for baud rate */ _disable(); - set_port(port + 3, 0x80, 0x80); - set_port(port + 0, 0xff, value & 0xff); - set_port(port + 1, 0xff, value >> 8); - set_port(port + 3, 0x80, 0); + set_port(ttp->base_type, port, 3, 0x80, 0x80); + set_port(ttp->base_type, port, 0, 0xff, value & 0xff); + set_port(ttp->base_type, port, 1, 0xff, value >> 8); + set_port(ttp->base_type, port, 3, 0x80, 0); /* * Set parity, stop bits and data bits */ - set_port(port + 3, 0xFF, ((ttp->parity & 7) << 3) + set_port(ttp->base_type, port, 3, 0xFF, ((ttp->parity & 7) << 3) | (((ttp->stop_bits - 1) & 1) << 2) | ((ttp->data_bits - 5) & 3) ); @@ -190,15 +223,34 @@ int init; /* * Save initial modem status, and also clear all interrupts */ - outp(port + 1, 0x00); /* Disable all interrupts */ - inp(port + 5); /* Clear Line Status Interrupt */ - inp(port + 0); /* Clear RX Interrupt */ - inp(port + 2); /* Clear TX Interrupt */ - ttp->modem_status = inp(port + 6) & 0xF0; /* Clear Modem Interrupt */ - /* - * turn on DTR, RTS - */ - outp(port+4, ttp->modem_control); + if (ttp->base_type == BASE_TYPE_IO) + { + outp(port + 1, 0x00); /* Disable all interrupts */ + inp(port + 5); /* Clear Line Status Interrupt */ + inp(port + 0); /* Clear RX Interrupt */ + inp(port + 2); /* Clear TX Interrupt */ + ttp->modem_status = inp(port + 6) & 0xF0; /* Clear Modem Interrupt */ + /* + * turn on DTR, RTS + */ + outp(port+4, ttp->modem_control); + } + else + { + unsigned char *iobase = (unsigned char *)port; + unsigned tmp = 0; + + iobase[1] = 0x00; /* Disable all interrupts */ + tmp = iobase[5]; /* Clear Line Status Interrupt */ + tmp = iobase[0]; /* Clear RX Interrupt */ + tmp = iobase[2]; /* Clear TX Interrupt */ + ttp->modem_status = iobase[6] & 0xF0; /* Clear Modem Interrupt */ + /* + * turn on DTR, RTS + */ + iobase[4] = ttp->modem_control; + } + switch(ttp->threshold) { case 1: value = 0x01; break; @@ -218,14 +270,32 @@ int init; * is still very useful, since it SHOULD buffer * up to 16 received characters even when FIFO is off) */ - outp(port+2, value); - if((inp(port+2) & 0xC0) != 0xC0) - outp(port+2, 0x00); + if (ttp->base_type == BASE_TYPE_IO) + { + outp(port+2, value); + if((inp(port+2) & 0xC0) != 0xC0) + outp(port+2, 0x00); + } + else + { + unsigned char *iobase = (unsigned char *)port; + iobase[2] = value; + if((iobase[2] & 0xC0) != 0xC0) + iobase[2] = 0x00; + } } /* * Enable ALL interrupt sources */ - outp(port+1, 0x0f); + /* + if (ttp->base_type == BASE_TYPE_IO) + outp(port+1, 0x0f); + else + { + unsigned char *iobase = (unsigned char *)port; + iobase[1] = 0x0f; + } + */ if((ttp->mode & MODE_IRQ_LINKED) == 0) { ttp->mode |= MODE_IRQ_LINKED; @@ -236,14 +306,34 @@ int init; dev_list[ttp->irq] = ttp; if(int_enabled[ttp->irq] == 0) { + int isr_id = -1; + /* * Vector IRQ to our async handler */ _enable(); - irq_hdl[ttp->irq] = qnx_hint_attach(ttp->irq, async_irq[ttp->irq], FP_SEG(&drv_ctrl)); + isr_id = qnx_hint_attach(ttp->irq, async_irq[ttp->irq], FP_SEG(&drv_ctrl)); + if (isr_id == -1) { + printf ("Failed to attach async_irq interrupt handler\n"); + exit (EXIT_FAILURE); + } + delay(100); + irq_hdl[ttp->irq] = isr_id; + int_enabled[ttp->irq] = 1; } } + + /* + * Enable ALL interrupt sources + */ + if (ttp->base_type == BASE_TYPE_IO) + outp(port+1, 0x0f); + else + { + unsigned char *iobase = (unsigned char *)port; + iobase[1] = 0x0f; + } } _enable(); @@ -294,8 +384,15 @@ pid_t far poll_devices() { * missed Tx interrupts. * Rely on periodic "polling" to reset the chip. */ - outp(dev->iobase+1, 0x0f); - Trace1( (long)_TRACE_DEV_SER_TIMEOUT, _TRACE_TRANSIENT, dev->iobase ); + if (dev->base_type == BASE_TYPE_IO) + outp(dev->iobase+1, 0x0f); + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + iobase[1] = 0x0f; + } + + Trace1( (long)_TRACE_DEV_SER_TIMEOUT, _TRACE_TRANSIENT, (unsigned)dev->iobase ); } ++dev; } @@ -312,7 +409,13 @@ shutdown_async(int index) { iobase = dev_table[index].iobase; if(iobase != 0) - outp(iobase + 1, 0x00); /* Disable IER */ + if (dev_table[index].base_type == BASE_TYPE_IO) + outp(iobase + 1, 0x00); /* Disable IER */ + else + { + unsigned char *iobase = (unsigned char *)dev_table[index].iobase; + iobase[1] = 0x00; + } } #pragma on (check_stack); diff -uprN Dev.orig/ser/main.c Dev.AD/ser/main.c --- Dev.orig/ser/main.c 1996-10-10 14:58:40.000000000 +0200 +++ Dev.AD/ser/main.c 2017-01-10 17:14:03.609526000 +0100 @@ -9,9 +9,18 @@ #include #include #include + +#include +#include +#include +#include +#include +#include +#include + #include "struct.h" -#define PCMCIA +#undef PCMCIA #ifdef PCMCIA #include @@ -118,6 +127,10 @@ int argc; char *argv[]; struct dev_entry *dev; #endif + char *page_ptr = NULL; + char *mem_base = NULL; + int fd = 0; + setscheduler(0, SCHED_RR, 20); /* @@ -288,7 +301,36 @@ int argc; char *argv[]; slot = -1; } } - new_async(num_asyncs++, base, irq, slot); + + // Memory base address + if (base > 0xFFFF) + { + // Map in the memory area + fd = shm_open( "Physical", O_RDWR, 0777 ); + if ( fd == -1 ) + { + perror("Error shm_open:"); + exit( EXIT_FAILURE ); + } + + // One UART addressing range = 0x200 + page_ptr = mmap( 0, 0x200, PROT_READ | PROT_WRITE | PROT_NOCACHE, MAP_SHARED, + fd, PCI_MEM_ADDR( base ) & ~0xfff ); + + if(page_ptr == (char *) -1) + { + perror("Error mmap:"); + exit( EXIT_FAILURE ); + } + + mem_base = page_ptr + (PCI_MEM_ADDR( base ) & 0xfff); + + close(fd); + + new_async(BASE_TYPE_MEM, num_asyncs++, (unsigned int)mem_base, irq, slot); + } + else + new_async(BASE_TYPE_IO, num_asyncs++, base, irq, slot); } } /* for */ @@ -411,7 +453,7 @@ int argc; char *argv[]; /* * Initialize Device */ - init(index, dev_table[index].iobase, dev_table[index].irq, + init(dev_table[index].base_type, index, dev_table[index].iobase, dev_table[index].irq, dev_table[index].baud, dmode[index].mode); /* @@ -576,7 +618,7 @@ int argc; char *argv[]; struct dev_entry *dev; dev = &dev_table[index]; msg.query_reply.status = EOK; - msg.query_reply.iobase = dev->iobase; + msg.query_reply.iobase = (unsigned int)dev->iobase; msg.query_reply.irq = dev->irq; msg.query_reply.mode = dev->mode; msg.query_reply.slots = dev->slots; @@ -604,9 +646,10 @@ int argc; char *argv[]; * in global variables */ -new_async(index, iobase, irq, slots) +new_async(baseType, index, iobase, irq, slots) +unsigned char baseType; int index; -unsigned iobase, irq; +unsigned int iobase, irq; unsigned slots; { @@ -640,6 +683,7 @@ unsigned slots; dmode[index].low = low; dev_table[index].threshold = threshold; + dev_table[index].base_type = baseType; dev_table[index].iobase = iobase; dev_table[index].irq = irq; dev_table[index].baud = baud; diff -uprN Dev.orig/ser/struct.h Dev.AD/ser/struct.h --- Dev.orig/ser/struct.h 1996-10-04 16:41:55.000000000 +0200 +++ Dev.AD/ser/struct.h 2017-01-10 17:14:03.609526000 +0100 @@ -5,13 +5,17 @@ #include #endif +#define BASE_TYPE_IO 0 +#define BASE_TYPE_MEM 1 + #define MAX_ASYNCS 64 #define MAX_IRQS 16 struct dev_entry { struct dev_entry *link; unsigned tty; - unsigned iobase; + unsigned char base_type; + unsigned int iobase; unsigned char irq; unsigned char busy; unsigned char modem_status; @@ -77,9 +81,9 @@ pid_t far async_irq13(); pid_t far async_irq14(); pid_t far async_irq15(); int reset_async(int, int); -void init(int, unsigned, unsigned, long, int); +void init(unsigned char, int, unsigned int, unsigned, long, int); int find_asyncs(); -new_async(int, unsigned, unsigned, unsigned); +new_async(unsigned char, int, unsigned int, unsigned, unsigned); shutdown_async(int); void init_tables(); void disable_irq(int); diff -uprN Dev.orig/ser/tto.c Dev.AD/ser/tto.c --- Dev.orig/ser/tto.c 1994-03-24 15:02:24.000000000 +0100 +++ Dev.AD/ser/tto.c 2017-01-10 17:14:03.609526000 +0100 @@ -37,17 +37,36 @@ pid_t tto(struct dev_entry *dev, struct unsigned c, i, n; int sig = 0; - if(obuf->mode & OUTPUT_XOFF) { - obuf->mode &= ~OUTPUT_XOFF; - outp(dev->iobase, 0x13); - return(0); - } + if (dev->base_type == BASE_TYPE_IO) + { + if(obuf->mode & OUTPUT_XOFF) { + obuf->mode &= ~OUTPUT_XOFF; + outp(dev->iobase, 0x13); + return(0); + } - if(obuf->mode & OUTPUT_XON) { - obuf->mode &= ~OUTPUT_XON; - outp(dev->iobase, 0x11); - return(0); - } + if(obuf->mode & OUTPUT_XON) { + obuf->mode &= ~OUTPUT_XON; + outp(dev->iobase, 0x11); + return(0); + } + } + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + + if(obuf->mode & OUTPUT_XOFF) { + obuf->mode &= ~OUTPUT_XOFF; + iobase[0] = 0x13; + return(0); + } + + if(obuf->mode & OUTPUT_XON) { + obuf->mode &= ~OUTPUT_XON; + iobase[0] = 0x11; + return(0); + } + } if(obuf->mode & OUTPUT_STOPPED) { dev->busy = 0; @@ -102,7 +121,14 @@ pid_t tto(struct dev_entry *dev, struct */ _disable(); dev->tx_pending = 10; /* Timeout */ - outp(dev->iobase, c); + if (dev->base_type == BASE_TYPE_IO) + outp(dev->iobase, c); + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + iobase[0] = c; + } + _enable(); } else @@ -140,23 +166,48 @@ int far Kick(struct output_buffer far *o dev = &dev_table[obuf->handle]; - if(obuf->mode & OUTPUT_HFLOW_OFF) { - obuf->mode &= ~OUTPUT_HFLOW_OFF; - /* - * turn off RTS - */ - dev->modem_control &= ~0x02; - outp(dev->iobase+4, dev->modem_control); - } + if (dev->base_type == BASE_TYPE_IO) + { + if(obuf->mode & OUTPUT_HFLOW_OFF) { + obuf->mode &= ~OUTPUT_HFLOW_OFF; + /* + * turn off RTS + */ + dev->modem_control &= ~0x02; + outp(dev->iobase+4, dev->modem_control); + } - if(obuf->mode & OUTPUT_HFLOW_ON) { - obuf->mode &= ~OUTPUT_HFLOW_ON; - /* - * turn on RTS - */ - dev->modem_control |= 0x02; - outp(dev->iobase+4, dev->modem_control); - } + if(obuf->mode & OUTPUT_HFLOW_ON) { + obuf->mode &= ~OUTPUT_HFLOW_ON; + /* + * turn on RTS + */ + dev->modem_control |= 0x02; + outp(dev->iobase+4, dev->modem_control); + } + } + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + + if(obuf->mode & OUTPUT_HFLOW_OFF) { + obuf->mode &= ~OUTPUT_HFLOW_OFF; + /* + * turn off RTS + */ + dev->modem_control &= ~0x02; + iobase[4] = dev->modem_control; + } + + if(obuf->mode & OUTPUT_HFLOW_ON) { + obuf->mode &= ~OUTPUT_HFLOW_ON; + /* + * turn on RTS + */ + dev->modem_control |= 0x02; + iobase[4] = dev->modem_control; + } + } if(dev->busy) return(0); @@ -252,17 +303,36 @@ int far Ctrl(union ioctl_entry far *ioc) mask = ioc->user.data[4] & 0x03; bits = ioc->user.data[0]; _disable(); - oldbits = inp( dev->iobase + 4 ); - dev->modem_control = (oldbits & ~mask & 0xE7) | (bits & mask) | 0x08; - outp( dev->iobase + 4, dev->modem_control); + if (dev->base_type == BASE_TYPE_IO) + { + oldbits = inp( dev->iobase + 4 ); + dev->modem_control = (oldbits & ~mask & 0xE7) | (bits & mask) | 0x08; + outp( dev->iobase + 4, dev->modem_control); + } + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + oldbits = iobase[4]; + dev->modem_control = (oldbits & ~mask & 0xE7) | (bits & mask) | 0x08; + iobase[4] = dev->modem_control; + } _enable(); ioc->user_return.data[0] = oldbits; mask = ioc->user.data[5] & 0x40; bits = ioc->user.data[1]; _disable(); - oldbits = inp( dev->iobase + 3 ); - outp( dev->iobase + 3, (oldbits & ~mask) | (bits & mask)); + if (dev->base_type == BASE_TYPE_IO) + { + oldbits = inp( dev->iobase + 3 ); + outp( dev->iobase + 3, (oldbits & ~mask) | (bits & mask)); + } + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + oldbits = iobase[3]; + iobase[3] = ((oldbits & ~mask) | (bits & mask)); + } _enable(); ioc->user_return.data[1] = oldbits; @@ -280,7 +350,13 @@ int far Ctrl(union ioctl_entry far *ioc) return(0); } dev = &dev_table[unit-1]; - outp( dev->iobase + 3, inp( dev->iobase + 3 ) | 0x40); + if (dev->base_type == BASE_TYPE_IO) + outp( dev->iobase + 3, inp( dev->iobase + 3 ) | 0x40); + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + iobase[3] = (iobase[3] | 0x40); + } ioc->status = IOCTL_OK; return(0); } @@ -291,7 +367,13 @@ int far Ctrl(union ioctl_entry far *ioc) return(0); } dev = &dev_table[unit-1]; - outp( dev->iobase + 3, inp( dev->iobase + 3 ) & ~0x40); + if (dev->base_type == BASE_TYPE_IO) + outp( dev->iobase + 3, inp( dev->iobase + 3 ) & ~0x40); + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + iobase[3] = (iobase[3] & ~0x40); + } ioc->status = IOCTL_OK; return(0); } @@ -303,7 +385,13 @@ int far Ctrl(union ioctl_entry far *ioc) } dev = &dev_table[unit-1]; dev->modem_control &= ~0x01; - outp(dev->iobase+4, dev->modem_control); + if (dev->base_type == BASE_TYPE_IO) + outp(dev->iobase+4, dev->modem_control); + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + iobase[4] = dev->modem_control; + } ioc->status = IOCTL_OK; return(0); } @@ -315,7 +403,13 @@ int far Ctrl(union ioctl_entry far *ioc) } dev = &dev_table[unit-1]; dev->modem_control |= 0x01; - outp(dev->iobase+4, dev->modem_control); + if (dev->base_type == BASE_TYPE_IO) + outp(dev->iobase+4, dev->modem_control); + else + { + unsigned char *iobase = (unsigned char *)dev->iobase; + iobase[4] = dev->modem_control; + } ioc->status = IOCTL_OK; return(0); }