mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-11-30 00:02:44 +00:00
Use device flags instead of options for serial console configuration
(see LINT). There is a new low-level console type that is more suitable for use with gdb-remote. Fixed setting of speed at probe time for the serial console (if any). Reviewed by: dfr
This commit is contained in:
parent
44c1d774da
commit
de09b61a0c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=24651
@ -31,7 +31,7 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* from: @(#)com.c 7.5 (Berkeley) 5/16/91
|
* from: @(#)com.c 7.5 (Berkeley) 5/16/91
|
||||||
* $Id: sio.c,v 1.160 1997/03/23 03:35:04 bde Exp $
|
* $Id: sio.c,v 1.161 1997/03/24 11:24:04 bde Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "opt_comconsole.h"
|
#include "opt_comconsole.h"
|
||||||
@ -103,6 +103,9 @@
|
|||||||
#define COM_NOTAST4(dev) ((dev)->id_flags & 0x04)
|
#define COM_NOTAST4(dev) ((dev)->id_flags & 0x04)
|
||||||
#endif /* COM_MULTIPORT */
|
#endif /* COM_MULTIPORT */
|
||||||
|
|
||||||
|
#define COM_CONSOLE(dev) ((dev)->id_flags & 0x10)
|
||||||
|
#define COM_FORCECONSOLE(dev) ((dev)->id_flags & 0x20)
|
||||||
|
#define COM_LLCONSOLE(dev) ((dev)->id_flags & 0x40)
|
||||||
#define COM_LOSESOUTINTS(dev) ((dev)->id_flags & 0x08)
|
#define COM_LOSESOUTINTS(dev) ((dev)->id_flags & 0x08)
|
||||||
#define COM_NOFIFO(dev) ((dev)->id_flags & 0x02)
|
#define COM_NOFIFO(dev) ((dev)->id_flags & 0x02)
|
||||||
#define COM_VERBOSE(dev) ((dev)->id_flags & 0x80)
|
#define COM_VERBOSE(dev) ((dev)->id_flags & 0x80)
|
||||||
@ -328,8 +331,9 @@ static struct cdevsw sio_cdevsw = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int comconsole = -1;
|
static int comconsole = -1;
|
||||||
static speed_t comdefaultrate = CONSPEED;
|
static volatile speed_t comdefaultrate = CONSPEED;
|
||||||
static u_int com_events; /* input chars + weighted output completions */
|
static u_int com_events; /* input chars + weighted output completions */
|
||||||
|
static Port_t siocniobase;
|
||||||
static int sio_timeout;
|
static int sio_timeout;
|
||||||
static int sio_timeouts_until_log;
|
static int sio_timeouts_until_log;
|
||||||
#if 0 /* XXX */
|
#if 0 /* XXX */
|
||||||
@ -518,6 +522,11 @@ sioprobe(dev)
|
|||||||
already_init = TRUE;
|
already_init = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (COM_LLCONSOLE(dev)) {
|
||||||
|
printf("sio%d: reserved for low-level i/o\n", dev->id_unit);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the device is on a multiport card and has an AST/4
|
* If the device is on a multiport card and has an AST/4
|
||||||
* compatible interrupt control register, initialize this
|
* compatible interrupt control register, initialize this
|
||||||
@ -569,11 +578,15 @@ sioprobe(dev)
|
|||||||
* XXX what about the UART bug avoided by waiting in comparam()?
|
* XXX what about the UART bug avoided by waiting in comparam()?
|
||||||
* We don't want to to wait long enough to drain at 2 bps.
|
* We don't want to to wait long enough to drain at 2 bps.
|
||||||
*/
|
*/
|
||||||
outb(iobase + com_cfcr, CFCR_DLAB | CFCR_8BITS);
|
if (iobase == siocniobase)
|
||||||
outb(iobase + com_dlbl, COMBRD(9600) & 0xff);
|
DELAY((16 + 1) * 1000000 / (comdefaultrate / 10));
|
||||||
outb(iobase + com_dlbh, (u_int) COMBRD(9600) >> 8);
|
else {
|
||||||
outb(iobase + com_cfcr, CFCR_8BITS);
|
outb(iobase + com_cfcr, CFCR_DLAB | CFCR_8BITS);
|
||||||
DELAY((16 + 1) * 1000000 / (9600 / 10));
|
outb(iobase + com_dlbl, COMBRD(9600) & 0xff);
|
||||||
|
outb(iobase + com_dlbh, (u_int) COMBRD(9600) >> 8);
|
||||||
|
outb(iobase + com_cfcr, CFCR_8BITS);
|
||||||
|
DELAY((16 + 1) * 1000000 / (9600 / 10));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enable the interrupt gate and disable device interupts. This
|
* Enable the interrupt gate and disable device interupts. This
|
||||||
@ -2383,8 +2396,6 @@ struct siocnstate {
|
|||||||
u_char mcr;
|
u_char mcr;
|
||||||
};
|
};
|
||||||
|
|
||||||
static Port_t siocniobase;
|
|
||||||
|
|
||||||
static void siocnclose __P((struct siocnstate *sp));
|
static void siocnclose __P((struct siocnstate *sp));
|
||||||
static void siocnopen __P((struct siocnstate *sp));
|
static void siocnopen __P((struct siocnstate *sp));
|
||||||
static void siocntxwait __P((void));
|
static void siocntxwait __P((void));
|
||||||
@ -2478,21 +2489,40 @@ void
|
|||||||
siocnprobe(cp)
|
siocnprobe(cp)
|
||||||
struct consdev *cp;
|
struct consdev *cp;
|
||||||
{
|
{
|
||||||
int unit;
|
struct isa_device *dvp;
|
||||||
|
int s;
|
||||||
|
struct siocnstate sp;
|
||||||
|
|
||||||
/* XXX: ick */
|
/*
|
||||||
unit = DEV_TO_UNIT(CONUNIT);
|
* Find our first enabled console, if any. If it is a high-level
|
||||||
siocniobase = CONADDR;
|
* console device, then initialize it and return successfully.
|
||||||
|
* If it is a low-level console device, then initialize it and
|
||||||
/* make sure hardware exists? XXX */
|
* return unsuccessfully. It must be initialized in both cases
|
||||||
|
* for early use by console drivers and debuggers. Initializing
|
||||||
/* initialize required fields */
|
* the hardware is not necessary in all cases, since the i/o
|
||||||
cp->cn_dev = makedev(CDEV_MAJOR, unit);
|
* routines initialize it on the fly, but it is necessary if
|
||||||
#ifdef COMCONSOLE
|
* input might arrive while the hardware is switched back to an
|
||||||
cp->cn_pri = CN_REMOTE; /* Force a serial port console */
|
* uninitialized state. We can't handle multiple console devices
|
||||||
#else
|
* yet because our low-level routines don't take a device arg.
|
||||||
cp->cn_pri = (boothowto & RB_SERIAL) ? CN_REMOTE : CN_NORMAL;
|
* We trust the user to set the console flags properly so that we
|
||||||
#endif
|
* don't need to probe.
|
||||||
|
*/
|
||||||
|
cp->cn_pri = CN_DEAD;
|
||||||
|
for (dvp = isa_devtab_tty; dvp->id_driver != NULL; dvp++)
|
||||||
|
if (dvp->id_driver == &siodriver && dvp->id_enabled
|
||||||
|
&& COM_CONSOLE(dvp)) {
|
||||||
|
siocniobase = dvp->id_iobase;
|
||||||
|
s = spltty();
|
||||||
|
siocnopen(&sp);
|
||||||
|
splx(s);
|
||||||
|
if (!COM_LLCONSOLE(dvp)) {
|
||||||
|
cp->cn_dev = makedev(CDEV_MAJOR, dvp->id_unit);
|
||||||
|
cp->cn_pri = COM_FORCECONSOLE(dvp)
|
||||||
|
|| boothowto & RB_SERIAL
|
||||||
|
? CN_REMOTE : CN_NORMAL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* from: @(#)com.c 7.5 (Berkeley) 5/16/91
|
* from: @(#)com.c 7.5 (Berkeley) 5/16/91
|
||||||
* $Id: sio.c,v 1.160 1997/03/23 03:35:04 bde Exp $
|
* $Id: sio.c,v 1.161 1997/03/24 11:24:04 bde Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "opt_comconsole.h"
|
#include "opt_comconsole.h"
|
||||||
@ -103,6 +103,9 @@
|
|||||||
#define COM_NOTAST4(dev) ((dev)->id_flags & 0x04)
|
#define COM_NOTAST4(dev) ((dev)->id_flags & 0x04)
|
||||||
#endif /* COM_MULTIPORT */
|
#endif /* COM_MULTIPORT */
|
||||||
|
|
||||||
|
#define COM_CONSOLE(dev) ((dev)->id_flags & 0x10)
|
||||||
|
#define COM_FORCECONSOLE(dev) ((dev)->id_flags & 0x20)
|
||||||
|
#define COM_LLCONSOLE(dev) ((dev)->id_flags & 0x40)
|
||||||
#define COM_LOSESOUTINTS(dev) ((dev)->id_flags & 0x08)
|
#define COM_LOSESOUTINTS(dev) ((dev)->id_flags & 0x08)
|
||||||
#define COM_NOFIFO(dev) ((dev)->id_flags & 0x02)
|
#define COM_NOFIFO(dev) ((dev)->id_flags & 0x02)
|
||||||
#define COM_VERBOSE(dev) ((dev)->id_flags & 0x80)
|
#define COM_VERBOSE(dev) ((dev)->id_flags & 0x80)
|
||||||
@ -328,8 +331,9 @@ static struct cdevsw sio_cdevsw = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int comconsole = -1;
|
static int comconsole = -1;
|
||||||
static speed_t comdefaultrate = CONSPEED;
|
static volatile speed_t comdefaultrate = CONSPEED;
|
||||||
static u_int com_events; /* input chars + weighted output completions */
|
static u_int com_events; /* input chars + weighted output completions */
|
||||||
|
static Port_t siocniobase;
|
||||||
static int sio_timeout;
|
static int sio_timeout;
|
||||||
static int sio_timeouts_until_log;
|
static int sio_timeouts_until_log;
|
||||||
#if 0 /* XXX */
|
#if 0 /* XXX */
|
||||||
@ -518,6 +522,11 @@ sioprobe(dev)
|
|||||||
already_init = TRUE;
|
already_init = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (COM_LLCONSOLE(dev)) {
|
||||||
|
printf("sio%d: reserved for low-level i/o\n", dev->id_unit);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the device is on a multiport card and has an AST/4
|
* If the device is on a multiport card and has an AST/4
|
||||||
* compatible interrupt control register, initialize this
|
* compatible interrupt control register, initialize this
|
||||||
@ -569,11 +578,15 @@ sioprobe(dev)
|
|||||||
* XXX what about the UART bug avoided by waiting in comparam()?
|
* XXX what about the UART bug avoided by waiting in comparam()?
|
||||||
* We don't want to to wait long enough to drain at 2 bps.
|
* We don't want to to wait long enough to drain at 2 bps.
|
||||||
*/
|
*/
|
||||||
outb(iobase + com_cfcr, CFCR_DLAB | CFCR_8BITS);
|
if (iobase == siocniobase)
|
||||||
outb(iobase + com_dlbl, COMBRD(9600) & 0xff);
|
DELAY((16 + 1) * 1000000 / (comdefaultrate / 10));
|
||||||
outb(iobase + com_dlbh, (u_int) COMBRD(9600) >> 8);
|
else {
|
||||||
outb(iobase + com_cfcr, CFCR_8BITS);
|
outb(iobase + com_cfcr, CFCR_DLAB | CFCR_8BITS);
|
||||||
DELAY((16 + 1) * 1000000 / (9600 / 10));
|
outb(iobase + com_dlbl, COMBRD(9600) & 0xff);
|
||||||
|
outb(iobase + com_dlbh, (u_int) COMBRD(9600) >> 8);
|
||||||
|
outb(iobase + com_cfcr, CFCR_8BITS);
|
||||||
|
DELAY((16 + 1) * 1000000 / (9600 / 10));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enable the interrupt gate and disable device interupts. This
|
* Enable the interrupt gate and disable device interupts. This
|
||||||
@ -2383,8 +2396,6 @@ struct siocnstate {
|
|||||||
u_char mcr;
|
u_char mcr;
|
||||||
};
|
};
|
||||||
|
|
||||||
static Port_t siocniobase;
|
|
||||||
|
|
||||||
static void siocnclose __P((struct siocnstate *sp));
|
static void siocnclose __P((struct siocnstate *sp));
|
||||||
static void siocnopen __P((struct siocnstate *sp));
|
static void siocnopen __P((struct siocnstate *sp));
|
||||||
static void siocntxwait __P((void));
|
static void siocntxwait __P((void));
|
||||||
@ -2478,21 +2489,40 @@ void
|
|||||||
siocnprobe(cp)
|
siocnprobe(cp)
|
||||||
struct consdev *cp;
|
struct consdev *cp;
|
||||||
{
|
{
|
||||||
int unit;
|
struct isa_device *dvp;
|
||||||
|
int s;
|
||||||
|
struct siocnstate sp;
|
||||||
|
|
||||||
/* XXX: ick */
|
/*
|
||||||
unit = DEV_TO_UNIT(CONUNIT);
|
* Find our first enabled console, if any. If it is a high-level
|
||||||
siocniobase = CONADDR;
|
* console device, then initialize it and return successfully.
|
||||||
|
* If it is a low-level console device, then initialize it and
|
||||||
/* make sure hardware exists? XXX */
|
* return unsuccessfully. It must be initialized in both cases
|
||||||
|
* for early use by console drivers and debuggers. Initializing
|
||||||
/* initialize required fields */
|
* the hardware is not necessary in all cases, since the i/o
|
||||||
cp->cn_dev = makedev(CDEV_MAJOR, unit);
|
* routines initialize it on the fly, but it is necessary if
|
||||||
#ifdef COMCONSOLE
|
* input might arrive while the hardware is switched back to an
|
||||||
cp->cn_pri = CN_REMOTE; /* Force a serial port console */
|
* uninitialized state. We can't handle multiple console devices
|
||||||
#else
|
* yet because our low-level routines don't take a device arg.
|
||||||
cp->cn_pri = (boothowto & RB_SERIAL) ? CN_REMOTE : CN_NORMAL;
|
* We trust the user to set the console flags properly so that we
|
||||||
#endif
|
* don't need to probe.
|
||||||
|
*/
|
||||||
|
cp->cn_pri = CN_DEAD;
|
||||||
|
for (dvp = isa_devtab_tty; dvp->id_driver != NULL; dvp++)
|
||||||
|
if (dvp->id_driver == &siodriver && dvp->id_enabled
|
||||||
|
&& COM_CONSOLE(dvp)) {
|
||||||
|
siocniobase = dvp->id_iobase;
|
||||||
|
s = spltty();
|
||||||
|
siocnopen(&sp);
|
||||||
|
splx(s);
|
||||||
|
if (!COM_LLCONSOLE(dvp)) {
|
||||||
|
cp->cn_dev = makedev(CDEV_MAJOR, dvp->id_unit);
|
||||||
|
cp->cn_pri = COM_FORCECONSOLE(dvp)
|
||||||
|
|| boothowto & RB_SERIAL
|
||||||
|
? CN_REMOTE : CN_NORMAL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
* from: @(#)com.c 7.5 (Berkeley) 5/16/91
|
* from: @(#)com.c 7.5 (Berkeley) 5/16/91
|
||||||
* $Id: sio.c,v 1.160 1997/03/23 03:35:04 bde Exp $
|
* $Id: sio.c,v 1.161 1997/03/24 11:24:04 bde Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "opt_comconsole.h"
|
#include "opt_comconsole.h"
|
||||||
@ -103,6 +103,9 @@
|
|||||||
#define COM_NOTAST4(dev) ((dev)->id_flags & 0x04)
|
#define COM_NOTAST4(dev) ((dev)->id_flags & 0x04)
|
||||||
#endif /* COM_MULTIPORT */
|
#endif /* COM_MULTIPORT */
|
||||||
|
|
||||||
|
#define COM_CONSOLE(dev) ((dev)->id_flags & 0x10)
|
||||||
|
#define COM_FORCECONSOLE(dev) ((dev)->id_flags & 0x20)
|
||||||
|
#define COM_LLCONSOLE(dev) ((dev)->id_flags & 0x40)
|
||||||
#define COM_LOSESOUTINTS(dev) ((dev)->id_flags & 0x08)
|
#define COM_LOSESOUTINTS(dev) ((dev)->id_flags & 0x08)
|
||||||
#define COM_NOFIFO(dev) ((dev)->id_flags & 0x02)
|
#define COM_NOFIFO(dev) ((dev)->id_flags & 0x02)
|
||||||
#define COM_VERBOSE(dev) ((dev)->id_flags & 0x80)
|
#define COM_VERBOSE(dev) ((dev)->id_flags & 0x80)
|
||||||
@ -328,8 +331,9 @@ static struct cdevsw sio_cdevsw = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int comconsole = -1;
|
static int comconsole = -1;
|
||||||
static speed_t comdefaultrate = CONSPEED;
|
static volatile speed_t comdefaultrate = CONSPEED;
|
||||||
static u_int com_events; /* input chars + weighted output completions */
|
static u_int com_events; /* input chars + weighted output completions */
|
||||||
|
static Port_t siocniobase;
|
||||||
static int sio_timeout;
|
static int sio_timeout;
|
||||||
static int sio_timeouts_until_log;
|
static int sio_timeouts_until_log;
|
||||||
#if 0 /* XXX */
|
#if 0 /* XXX */
|
||||||
@ -518,6 +522,11 @@ sioprobe(dev)
|
|||||||
already_init = TRUE;
|
already_init = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (COM_LLCONSOLE(dev)) {
|
||||||
|
printf("sio%d: reserved for low-level i/o\n", dev->id_unit);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the device is on a multiport card and has an AST/4
|
* If the device is on a multiport card and has an AST/4
|
||||||
* compatible interrupt control register, initialize this
|
* compatible interrupt control register, initialize this
|
||||||
@ -569,11 +578,15 @@ sioprobe(dev)
|
|||||||
* XXX what about the UART bug avoided by waiting in comparam()?
|
* XXX what about the UART bug avoided by waiting in comparam()?
|
||||||
* We don't want to to wait long enough to drain at 2 bps.
|
* We don't want to to wait long enough to drain at 2 bps.
|
||||||
*/
|
*/
|
||||||
outb(iobase + com_cfcr, CFCR_DLAB | CFCR_8BITS);
|
if (iobase == siocniobase)
|
||||||
outb(iobase + com_dlbl, COMBRD(9600) & 0xff);
|
DELAY((16 + 1) * 1000000 / (comdefaultrate / 10));
|
||||||
outb(iobase + com_dlbh, (u_int) COMBRD(9600) >> 8);
|
else {
|
||||||
outb(iobase + com_cfcr, CFCR_8BITS);
|
outb(iobase + com_cfcr, CFCR_DLAB | CFCR_8BITS);
|
||||||
DELAY((16 + 1) * 1000000 / (9600 / 10));
|
outb(iobase + com_dlbl, COMBRD(9600) & 0xff);
|
||||||
|
outb(iobase + com_dlbh, (u_int) COMBRD(9600) >> 8);
|
||||||
|
outb(iobase + com_cfcr, CFCR_8BITS);
|
||||||
|
DELAY((16 + 1) * 1000000 / (9600 / 10));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Enable the interrupt gate and disable device interupts. This
|
* Enable the interrupt gate and disable device interupts. This
|
||||||
@ -2383,8 +2396,6 @@ struct siocnstate {
|
|||||||
u_char mcr;
|
u_char mcr;
|
||||||
};
|
};
|
||||||
|
|
||||||
static Port_t siocniobase;
|
|
||||||
|
|
||||||
static void siocnclose __P((struct siocnstate *sp));
|
static void siocnclose __P((struct siocnstate *sp));
|
||||||
static void siocnopen __P((struct siocnstate *sp));
|
static void siocnopen __P((struct siocnstate *sp));
|
||||||
static void siocntxwait __P((void));
|
static void siocntxwait __P((void));
|
||||||
@ -2478,21 +2489,40 @@ void
|
|||||||
siocnprobe(cp)
|
siocnprobe(cp)
|
||||||
struct consdev *cp;
|
struct consdev *cp;
|
||||||
{
|
{
|
||||||
int unit;
|
struct isa_device *dvp;
|
||||||
|
int s;
|
||||||
|
struct siocnstate sp;
|
||||||
|
|
||||||
/* XXX: ick */
|
/*
|
||||||
unit = DEV_TO_UNIT(CONUNIT);
|
* Find our first enabled console, if any. If it is a high-level
|
||||||
siocniobase = CONADDR;
|
* console device, then initialize it and return successfully.
|
||||||
|
* If it is a low-level console device, then initialize it and
|
||||||
/* make sure hardware exists? XXX */
|
* return unsuccessfully. It must be initialized in both cases
|
||||||
|
* for early use by console drivers and debuggers. Initializing
|
||||||
/* initialize required fields */
|
* the hardware is not necessary in all cases, since the i/o
|
||||||
cp->cn_dev = makedev(CDEV_MAJOR, unit);
|
* routines initialize it on the fly, but it is necessary if
|
||||||
#ifdef COMCONSOLE
|
* input might arrive while the hardware is switched back to an
|
||||||
cp->cn_pri = CN_REMOTE; /* Force a serial port console */
|
* uninitialized state. We can't handle multiple console devices
|
||||||
#else
|
* yet because our low-level routines don't take a device arg.
|
||||||
cp->cn_pri = (boothowto & RB_SERIAL) ? CN_REMOTE : CN_NORMAL;
|
* We trust the user to set the console flags properly so that we
|
||||||
#endif
|
* don't need to probe.
|
||||||
|
*/
|
||||||
|
cp->cn_pri = CN_DEAD;
|
||||||
|
for (dvp = isa_devtab_tty; dvp->id_driver != NULL; dvp++)
|
||||||
|
if (dvp->id_driver == &siodriver && dvp->id_enabled
|
||||||
|
&& COM_CONSOLE(dvp)) {
|
||||||
|
siocniobase = dvp->id_iobase;
|
||||||
|
s = spltty();
|
||||||
|
siocnopen(&sp);
|
||||||
|
splx(s);
|
||||||
|
if (!COM_LLCONSOLE(dvp)) {
|
||||||
|
cp->cn_dev = makedev(CDEV_MAJOR, dvp->id_unit);
|
||||||
|
cp->cn_pri = COM_FORCECONSOLE(dvp)
|
||||||
|
|| boothowto & RB_SERIAL
|
||||||
|
? CN_REMOTE : CN_NORMAL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user