mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
Sync with sys/i386/isa/sio.c revision 1.220.
This commit is contained in:
parent
390d616e16
commit
d35502a380
2 changed files with 2 additions and 316 deletions
|
|
@ -31,7 +31,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)com.c 7.5 (Berkeley) 5/16/91
|
||||
* $Id: sio.c,v 1.69 1998/11/23 07:49:03 kato Exp $
|
||||
* $Id: sio.c,v 1.70 1998/12/08 08:18:59 kato Exp $
|
||||
*/
|
||||
|
||||
#include "opt_comconsole.h"
|
||||
|
|
@ -416,9 +416,6 @@ static timeout_t comwakeup;
|
|||
static void disc_optim __P((struct tty *tp, struct termios *t,
|
||||
struct com_s *com));
|
||||
|
||||
#ifdef DSI_SOFT_MODEM
|
||||
static int LoadSoftModem __P((int unit,int base_io, u_long size, u_char *ptr));
|
||||
#endif /* DSI_SOFT_MODEM */
|
||||
|
||||
static char driver_name[] = "sio";
|
||||
|
||||
|
|
@ -1274,12 +1271,6 @@ sioattach(isdp)
|
|||
/* attempt to determine UART type */
|
||||
printf("sio%d: type", unit);
|
||||
|
||||
#ifdef DSI_SOFT_MODEM
|
||||
if((inb(iobase+7) ^ inb(iobase+7)) & 0x80) {
|
||||
printf(" Digicom Systems, Inc. SoftModem");
|
||||
goto determined_type;
|
||||
}
|
||||
#endif /* DSI_SOFT_MODEM */
|
||||
|
||||
#ifndef PC98
|
||||
#ifdef COM_MULTIPORT
|
||||
|
|
@ -2251,34 +2242,6 @@ sioioctl(dev, cmd, data, flag, p)
|
|||
case TIOCGWINSZ:
|
||||
bzero(data, sizeof(struct winsize));
|
||||
return (0);
|
||||
#ifdef DSI_SOFT_MODEM
|
||||
/*
|
||||
* Download micro-code to Digicom modem.
|
||||
*/
|
||||
case TIOCDSIMICROCODE:
|
||||
{
|
||||
u_long l;
|
||||
u_char *p,*pi;
|
||||
|
||||
pi = (u_char*)(*(caddr_t*)data);
|
||||
error = copyin(pi,&l,sizeof l);
|
||||
if(error)
|
||||
{return error;};
|
||||
pi += sizeof l;
|
||||
|
||||
p = malloc(l,M_TEMP,M_NOWAIT);
|
||||
if(!p)
|
||||
{return ENOBUFS;}
|
||||
error = copyin(pi,p,l);
|
||||
if(error)
|
||||
{free(p,M_TEMP); return error;};
|
||||
if(error = LoadSoftModem(
|
||||
MINOR_TO_UNIT(mynor),iobase,l,p))
|
||||
{free(p,M_TEMP); return error;}
|
||||
free(p,M_TEMP);
|
||||
return(0);
|
||||
}
|
||||
#endif /* DSI_SOFT_MODEM */
|
||||
default:
|
||||
return (ENOTTY);
|
||||
}
|
||||
|
|
@ -3494,126 +3457,6 @@ siocnputc(dev, c)
|
|||
splx(s);
|
||||
}
|
||||
|
||||
#ifdef DSI_SOFT_MODEM
|
||||
/*
|
||||
* The magic code to download microcode to a "Connection 14.4+Fax"
|
||||
* modem from Digicom Systems Inc. Very magic.
|
||||
*/
|
||||
|
||||
#define DSI_ERROR(str) { ptr = str; goto error; }
|
||||
static int
|
||||
LoadSoftModem(int unit, int base_io, u_long size, u_char *ptr)
|
||||
{
|
||||
int int_c,int_k;
|
||||
int data_0188, data_0187;
|
||||
|
||||
/*
|
||||
* First see if it is a DSI SoftModem
|
||||
*/
|
||||
if(!((inb(base_io+7) ^ inb(base_io+7)) & 0x80))
|
||||
return ENODEV;
|
||||
|
||||
data_0188 = inb(base_io+4);
|
||||
data_0187 = inb(base_io+3);
|
||||
outb(base_io+3,0x80);
|
||||
outb(base_io+4,0x0C);
|
||||
outb(base_io+0,0x31);
|
||||
outb(base_io+1,0x8C);
|
||||
outb(base_io+7,0x10);
|
||||
outb(base_io+7,0x19);
|
||||
|
||||
if(0x18 != (inb(base_io+7) & 0x1A))
|
||||
DSI_ERROR("dsp bus not granted");
|
||||
|
||||
if(0x01 != (inb(base_io+7) & 0x01)) {
|
||||
outb(base_io+7,0x18);
|
||||
outb(base_io+7,0x19);
|
||||
if(0x01 != (inb(base_io+7) & 0x01))
|
||||
DSI_ERROR("program mem not granted");
|
||||
}
|
||||
|
||||
int_c = 0;
|
||||
|
||||
while(1) {
|
||||
if(int_c >= 7 || size <= 0x1800)
|
||||
break;
|
||||
|
||||
for(int_k = 0 ; int_k < 0x800; int_k++) {
|
||||
outb(base_io+0,*ptr++);
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,*ptr++);
|
||||
}
|
||||
|
||||
size -= 0x1800;
|
||||
int_c++;
|
||||
}
|
||||
|
||||
if(size > 0x1800) {
|
||||
outb(base_io+7,0x18);
|
||||
outb(base_io+7,0x19);
|
||||
if(0x00 != (inb(base_io+7) & 0x01))
|
||||
DSI_ERROR("program data not granted");
|
||||
|
||||
for(int_k = 0 ; int_k < 0x800; int_k++) {
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,0);
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,*ptr++);
|
||||
}
|
||||
|
||||
size -= 0x1800;
|
||||
|
||||
while(size > 0x1800) {
|
||||
for(int_k = 0 ; int_k < 0xC00; int_k++) {
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,*ptr++);
|
||||
}
|
||||
size -= 0x1800;
|
||||
}
|
||||
|
||||
if(size < 0x1800) {
|
||||
for(int_k=0;int_k<size/2;int_k++) {
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,*ptr++);
|
||||
}
|
||||
}
|
||||
|
||||
} else if (size > 0) {
|
||||
if(int_c == 7) {
|
||||
outb(base_io+7,0x18);
|
||||
outb(base_io+7,0x19);
|
||||
if(0x00 != (inb(base_io+7) & 0x01))
|
||||
DSI_ERROR("program data not granted");
|
||||
for(int_k = 0 ; int_k < size/3; int_k++) {
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,0);
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,*ptr++);
|
||||
}
|
||||
} else {
|
||||
for(int_k = 0 ; int_k < size/3; int_k++) {
|
||||
outb(base_io+0,*ptr++);
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,*ptr++);
|
||||
}
|
||||
}
|
||||
}
|
||||
outb(base_io+7,0x11);
|
||||
outb(base_io+7,3);
|
||||
|
||||
outb(base_io+4,data_0188 & 0xfb);
|
||||
|
||||
outb(base_io+3,data_0187);
|
||||
|
||||
return 0;
|
||||
error:
|
||||
printf("sio%d: DSI SoftModem microcode load failed: <%s>\n",unit,ptr);
|
||||
outb(base_io+7,0x00); \
|
||||
outb(base_io+3,data_0187); \
|
||||
outb(base_io+4,data_0188); \
|
||||
return EIO;
|
||||
}
|
||||
#endif /* DSI_SOFT_MODEM */
|
||||
|
||||
/*
|
||||
* support PnP cards if we are using 'em
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)com.c 7.5 (Berkeley) 5/16/91
|
||||
* $Id: sio.c,v 1.69 1998/11/23 07:49:03 kato Exp $
|
||||
* $Id: sio.c,v 1.70 1998/12/08 08:18:59 kato Exp $
|
||||
*/
|
||||
|
||||
#include "opt_comconsole.h"
|
||||
|
|
@ -416,9 +416,6 @@ static timeout_t comwakeup;
|
|||
static void disc_optim __P((struct tty *tp, struct termios *t,
|
||||
struct com_s *com));
|
||||
|
||||
#ifdef DSI_SOFT_MODEM
|
||||
static int LoadSoftModem __P((int unit,int base_io, u_long size, u_char *ptr));
|
||||
#endif /* DSI_SOFT_MODEM */
|
||||
|
||||
static char driver_name[] = "sio";
|
||||
|
||||
|
|
@ -1274,12 +1271,6 @@ sioattach(isdp)
|
|||
/* attempt to determine UART type */
|
||||
printf("sio%d: type", unit);
|
||||
|
||||
#ifdef DSI_SOFT_MODEM
|
||||
if((inb(iobase+7) ^ inb(iobase+7)) & 0x80) {
|
||||
printf(" Digicom Systems, Inc. SoftModem");
|
||||
goto determined_type;
|
||||
}
|
||||
#endif /* DSI_SOFT_MODEM */
|
||||
|
||||
#ifndef PC98
|
||||
#ifdef COM_MULTIPORT
|
||||
|
|
@ -2251,34 +2242,6 @@ sioioctl(dev, cmd, data, flag, p)
|
|||
case TIOCGWINSZ:
|
||||
bzero(data, sizeof(struct winsize));
|
||||
return (0);
|
||||
#ifdef DSI_SOFT_MODEM
|
||||
/*
|
||||
* Download micro-code to Digicom modem.
|
||||
*/
|
||||
case TIOCDSIMICROCODE:
|
||||
{
|
||||
u_long l;
|
||||
u_char *p,*pi;
|
||||
|
||||
pi = (u_char*)(*(caddr_t*)data);
|
||||
error = copyin(pi,&l,sizeof l);
|
||||
if(error)
|
||||
{return error;};
|
||||
pi += sizeof l;
|
||||
|
||||
p = malloc(l,M_TEMP,M_NOWAIT);
|
||||
if(!p)
|
||||
{return ENOBUFS;}
|
||||
error = copyin(pi,p,l);
|
||||
if(error)
|
||||
{free(p,M_TEMP); return error;};
|
||||
if(error = LoadSoftModem(
|
||||
MINOR_TO_UNIT(mynor),iobase,l,p))
|
||||
{free(p,M_TEMP); return error;}
|
||||
free(p,M_TEMP);
|
||||
return(0);
|
||||
}
|
||||
#endif /* DSI_SOFT_MODEM */
|
||||
default:
|
||||
return (ENOTTY);
|
||||
}
|
||||
|
|
@ -3494,126 +3457,6 @@ siocnputc(dev, c)
|
|||
splx(s);
|
||||
}
|
||||
|
||||
#ifdef DSI_SOFT_MODEM
|
||||
/*
|
||||
* The magic code to download microcode to a "Connection 14.4+Fax"
|
||||
* modem from Digicom Systems Inc. Very magic.
|
||||
*/
|
||||
|
||||
#define DSI_ERROR(str) { ptr = str; goto error; }
|
||||
static int
|
||||
LoadSoftModem(int unit, int base_io, u_long size, u_char *ptr)
|
||||
{
|
||||
int int_c,int_k;
|
||||
int data_0188, data_0187;
|
||||
|
||||
/*
|
||||
* First see if it is a DSI SoftModem
|
||||
*/
|
||||
if(!((inb(base_io+7) ^ inb(base_io+7)) & 0x80))
|
||||
return ENODEV;
|
||||
|
||||
data_0188 = inb(base_io+4);
|
||||
data_0187 = inb(base_io+3);
|
||||
outb(base_io+3,0x80);
|
||||
outb(base_io+4,0x0C);
|
||||
outb(base_io+0,0x31);
|
||||
outb(base_io+1,0x8C);
|
||||
outb(base_io+7,0x10);
|
||||
outb(base_io+7,0x19);
|
||||
|
||||
if(0x18 != (inb(base_io+7) & 0x1A))
|
||||
DSI_ERROR("dsp bus not granted");
|
||||
|
||||
if(0x01 != (inb(base_io+7) & 0x01)) {
|
||||
outb(base_io+7,0x18);
|
||||
outb(base_io+7,0x19);
|
||||
if(0x01 != (inb(base_io+7) & 0x01))
|
||||
DSI_ERROR("program mem not granted");
|
||||
}
|
||||
|
||||
int_c = 0;
|
||||
|
||||
while(1) {
|
||||
if(int_c >= 7 || size <= 0x1800)
|
||||
break;
|
||||
|
||||
for(int_k = 0 ; int_k < 0x800; int_k++) {
|
||||
outb(base_io+0,*ptr++);
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,*ptr++);
|
||||
}
|
||||
|
||||
size -= 0x1800;
|
||||
int_c++;
|
||||
}
|
||||
|
||||
if(size > 0x1800) {
|
||||
outb(base_io+7,0x18);
|
||||
outb(base_io+7,0x19);
|
||||
if(0x00 != (inb(base_io+7) & 0x01))
|
||||
DSI_ERROR("program data not granted");
|
||||
|
||||
for(int_k = 0 ; int_k < 0x800; int_k++) {
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,0);
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,*ptr++);
|
||||
}
|
||||
|
||||
size -= 0x1800;
|
||||
|
||||
while(size > 0x1800) {
|
||||
for(int_k = 0 ; int_k < 0xC00; int_k++) {
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,*ptr++);
|
||||
}
|
||||
size -= 0x1800;
|
||||
}
|
||||
|
||||
if(size < 0x1800) {
|
||||
for(int_k=0;int_k<size/2;int_k++) {
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,*ptr++);
|
||||
}
|
||||
}
|
||||
|
||||
} else if (size > 0) {
|
||||
if(int_c == 7) {
|
||||
outb(base_io+7,0x18);
|
||||
outb(base_io+7,0x19);
|
||||
if(0x00 != (inb(base_io+7) & 0x01))
|
||||
DSI_ERROR("program data not granted");
|
||||
for(int_k = 0 ; int_k < size/3; int_k++) {
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,0);
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,*ptr++);
|
||||
}
|
||||
} else {
|
||||
for(int_k = 0 ; int_k < size/3; int_k++) {
|
||||
outb(base_io+0,*ptr++);
|
||||
outb(base_io+1,*ptr++);
|
||||
outb(base_io+2,*ptr++);
|
||||
}
|
||||
}
|
||||
}
|
||||
outb(base_io+7,0x11);
|
||||
outb(base_io+7,3);
|
||||
|
||||
outb(base_io+4,data_0188 & 0xfb);
|
||||
|
||||
outb(base_io+3,data_0187);
|
||||
|
||||
return 0;
|
||||
error:
|
||||
printf("sio%d: DSI SoftModem microcode load failed: <%s>\n",unit,ptr);
|
||||
outb(base_io+7,0x00); \
|
||||
outb(base_io+3,data_0187); \
|
||||
outb(base_io+4,data_0188); \
|
||||
return EIO;
|
||||
}
|
||||
#endif /* DSI_SOFT_MODEM */
|
||||
|
||||
/*
|
||||
* support PnP cards if we are using 'em
|
||||
|
|
|
|||
Loading…
Reference in a new issue