Sync with sys/i386/isa/sio.c revision 1.220.

This commit is contained in:
KATO Takenori 1998-12-30 08:09:11 +00:00
parent 390d616e16
commit d35502a380
2 changed files with 2 additions and 316 deletions

View file

@ -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

View file

@ -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