mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-09 14:50:19 +00:00
TTY / Serial driver fixes for 5.13-rc4
Here are some small fixes for reported problems for tty and serial drivers for 5.13-rc4. They consist of: - 8250 bugfixes and new device support - lockdown security mode fixup - syzbot found problems fixed - 8250_omap fix for interrupt storm - revert of 8250_omap driver fix as it caused worse problem than the original issue All but the last patch have been in linux-next for a while, the last one is a revert of a problem found in linux-next with the 8250_omap driver change. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYLJODQ8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+yna7gCgmKIssymva29JpQb54HuzRooD8jcAn3XeMVWI E4TQzaTFC1mNAQy8GU4F =cLjq -----END PGP SIGNATURE----- Merge tag 'tty-5.13-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty Pull tty / serial driver fixes from Greg KH: "Here are some small fixes for reported problems for tty and serial drivers for 5.13-rc4. They consist of: - 8250 bugfixes and new device support - lockdown security mode fixup - syzbot found problems fixed - 8250_omap fix for interrupt storm - revert of 8250_omap driver fix as it caused worse problem than the original issue All but the last patch have been in linux-next for a while, the last one is a revert of a problem found in linux-next with the 8250_omap driver change" * tag 'tty-5.13-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: Revert "serial: 8250: 8250_omap: Fix possible interrupt storm" serial: 8250_pci: handle FL_NOIRQ board flag serial: rp2: use 'request_firmware' instead of 'request_firmware_nowait' serial: 8250_pci: Add support for new HPE serial device serial: 8250: 8250_omap: Fix possible interrupt storm serial: 8250: Use BIT(x) for UART_{CAP,BUG}_* serial: 8250: Add UART_BUG_TXRACE workaround for Aspeed VUART serial: 8250_dw: Add device HID for new AMD UART controller serial: sh-sci: Fix off-by-one error in FIFO threshold register setting serial: core: fix suspicious security_locked_down() call serial: tegra: Fix a mask operation that is always true
This commit is contained in:
commit
3837f9a08b
@ -226,6 +226,7 @@ static const struct acpi_device_id acpi_apd_device_ids[] = {
|
|||||||
{ "AMDI0010", APD_ADDR(wt_i2c_desc) },
|
{ "AMDI0010", APD_ADDR(wt_i2c_desc) },
|
||||||
{ "AMD0020", APD_ADDR(cz_uart_desc) },
|
{ "AMD0020", APD_ADDR(cz_uart_desc) },
|
||||||
{ "AMDI0020", APD_ADDR(cz_uart_desc) },
|
{ "AMDI0020", APD_ADDR(cz_uart_desc) },
|
||||||
|
{ "AMDI0022", APD_ADDR(cz_uart_desc) },
|
||||||
{ "AMD0030", },
|
{ "AMD0030", },
|
||||||
{ "AMD0040", APD_ADDR(fch_misc_desc)},
|
{ "AMD0040", APD_ADDR(fch_misc_desc)},
|
||||||
{ "HYGO0010", APD_ADDR(wt_i2c_desc) },
|
{ "HYGO0010", APD_ADDR(wt_i2c_desc) },
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
* Copyright (C) 2001 Russell King.
|
* Copyright (C) 2001 Russell King.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <linux/bits.h>
|
||||||
#include <linux/serial_8250.h>
|
#include <linux/serial_8250.h>
|
||||||
#include <linux/serial_reg.h>
|
#include <linux/serial_reg.h>
|
||||||
#include <linux/dmaengine.h>
|
#include <linux/dmaengine.h>
|
||||||
@ -70,24 +71,25 @@ struct serial8250_config {
|
|||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define UART_CAP_FIFO (1 << 8) /* UART has FIFO */
|
#define UART_CAP_FIFO BIT(8) /* UART has FIFO */
|
||||||
#define UART_CAP_EFR (1 << 9) /* UART has EFR */
|
#define UART_CAP_EFR BIT(9) /* UART has EFR */
|
||||||
#define UART_CAP_SLEEP (1 << 10) /* UART has IER sleep */
|
#define UART_CAP_SLEEP BIT(10) /* UART has IER sleep */
|
||||||
#define UART_CAP_AFE (1 << 11) /* MCR-based hw flow control */
|
#define UART_CAP_AFE BIT(11) /* MCR-based hw flow control */
|
||||||
#define UART_CAP_UUE (1 << 12) /* UART needs IER bit 6 set (Xscale) */
|
#define UART_CAP_UUE BIT(12) /* UART needs IER bit 6 set (Xscale) */
|
||||||
#define UART_CAP_RTOIE (1 << 13) /* UART needs IER bit 4 set (Xscale, Tegra) */
|
#define UART_CAP_RTOIE BIT(13) /* UART needs IER bit 4 set (Xscale, Tegra) */
|
||||||
#define UART_CAP_HFIFO (1 << 14) /* UART has a "hidden" FIFO */
|
#define UART_CAP_HFIFO BIT(14) /* UART has a "hidden" FIFO */
|
||||||
#define UART_CAP_RPM (1 << 15) /* Runtime PM is active while idle */
|
#define UART_CAP_RPM BIT(15) /* Runtime PM is active while idle */
|
||||||
#define UART_CAP_IRDA (1 << 16) /* UART supports IrDA line discipline */
|
#define UART_CAP_IRDA BIT(16) /* UART supports IrDA line discipline */
|
||||||
#define UART_CAP_MINI (1 << 17) /* Mini UART on BCM283X family lacks:
|
#define UART_CAP_MINI BIT(17) /* Mini UART on BCM283X family lacks:
|
||||||
* STOP PARITY EPAR SPAR WLEN5 WLEN6
|
* STOP PARITY EPAR SPAR WLEN5 WLEN6
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define UART_BUG_QUOT (1 << 0) /* UART has buggy quot LSB */
|
#define UART_BUG_QUOT BIT(0) /* UART has buggy quot LSB */
|
||||||
#define UART_BUG_TXEN (1 << 1) /* UART has buggy TX IIR status */
|
#define UART_BUG_TXEN BIT(1) /* UART has buggy TX IIR status */
|
||||||
#define UART_BUG_NOMSR (1 << 2) /* UART has buggy MSR status bits (Au1x00) */
|
#define UART_BUG_NOMSR BIT(2) /* UART has buggy MSR status bits (Au1x00) */
|
||||||
#define UART_BUG_THRE (1 << 3) /* UART has buggy THRE reassertion */
|
#define UART_BUG_THRE BIT(3) /* UART has buggy THRE reassertion */
|
||||||
#define UART_BUG_PARITY (1 << 4) /* UART mishandles parity if FIFO enabled */
|
#define UART_BUG_PARITY BIT(4) /* UART mishandles parity if FIFO enabled */
|
||||||
|
#define UART_BUG_TXRACE BIT(5) /* UART Tx fails to set remote DR */
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_SERIAL_8250_SHARE_IRQ
|
#ifdef CONFIG_SERIAL_8250_SHARE_IRQ
|
||||||
|
@ -437,6 +437,7 @@ static int aspeed_vuart_probe(struct platform_device *pdev)
|
|||||||
port.port.status = UPSTAT_SYNC_FIFO;
|
port.port.status = UPSTAT_SYNC_FIFO;
|
||||||
port.port.dev = &pdev->dev;
|
port.port.dev = &pdev->dev;
|
||||||
port.port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_8250_CONSOLE);
|
port.port.has_sysrq = IS_ENABLED(CONFIG_SERIAL_8250_CONSOLE);
|
||||||
|
port.bugs |= UART_BUG_TXRACE;
|
||||||
|
|
||||||
rc = sysfs_create_group(&vuart->dev->kobj, &aspeed_vuart_attr_group);
|
rc = sysfs_create_group(&vuart->dev->kobj, &aspeed_vuart_attr_group);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
|
@ -714,6 +714,7 @@ static const struct acpi_device_id dw8250_acpi_match[] = {
|
|||||||
{ "APMC0D08", 0},
|
{ "APMC0D08", 0},
|
||||||
{ "AMD0020", 0 },
|
{ "AMD0020", 0 },
|
||||||
{ "AMDI0020", 0 },
|
{ "AMDI0020", 0 },
|
||||||
|
{ "AMDI0022", 0 },
|
||||||
{ "BRCM2032", 0 },
|
{ "BRCM2032", 0 },
|
||||||
{ "HISI0031", 0 },
|
{ "HISI0031", 0 },
|
||||||
{ },
|
{ },
|
||||||
|
@ -56,6 +56,8 @@ struct serial_private {
|
|||||||
int line[];
|
int line[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define PCI_DEVICE_ID_HPE_PCI_SERIAL 0x37e
|
||||||
|
|
||||||
static const struct pci_device_id pci_use_msi[] = {
|
static const struct pci_device_id pci_use_msi[] = {
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900,
|
||||||
0xA000, 0x1000) },
|
0xA000, 0x1000) },
|
||||||
@ -63,6 +65,8 @@ static const struct pci_device_id pci_use_msi[] = {
|
|||||||
0xA000, 0x1000) },
|
0xA000, 0x1000) },
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9922,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9922,
|
||||||
0xA000, 0x1000) },
|
0xA000, 0x1000) },
|
||||||
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_HP_3PAR, PCI_DEVICE_ID_HPE_PCI_SERIAL,
|
||||||
|
PCI_ANY_ID, PCI_ANY_ID) },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1997,6 +2001,16 @@ static struct pci_serial_quirk pci_serial_quirks[] = {
|
|||||||
.init = pci_hp_diva_init,
|
.init = pci_hp_diva_init,
|
||||||
.setup = pci_hp_diva_setup,
|
.setup = pci_hp_diva_setup,
|
||||||
},
|
},
|
||||||
|
/*
|
||||||
|
* HPE PCI serial device
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
.vendor = PCI_VENDOR_ID_HP_3PAR,
|
||||||
|
.device = PCI_DEVICE_ID_HPE_PCI_SERIAL,
|
||||||
|
.subvendor = PCI_ANY_ID,
|
||||||
|
.subdevice = PCI_ANY_ID,
|
||||||
|
.setup = pci_hp_diva_setup,
|
||||||
|
},
|
||||||
/*
|
/*
|
||||||
* Intel
|
* Intel
|
||||||
*/
|
*/
|
||||||
@ -3944,6 +3958,9 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board)
|
|||||||
uart.port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
|
uart.port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
|
||||||
uart.port.uartclk = board->base_baud * 16;
|
uart.port.uartclk = board->base_baud * 16;
|
||||||
|
|
||||||
|
if (board->flags & FL_NOIRQ) {
|
||||||
|
uart.port.irq = 0;
|
||||||
|
} else {
|
||||||
if (pci_match_id(pci_use_msi, dev)) {
|
if (pci_match_id(pci_use_msi, dev)) {
|
||||||
dev_dbg(&dev->dev, "Using MSI(-X) interrupts\n");
|
dev_dbg(&dev->dev, "Using MSI(-X) interrupts\n");
|
||||||
pci_set_master(dev);
|
pci_set_master(dev);
|
||||||
@ -3959,6 +3976,8 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board)
|
|||||||
}
|
}
|
||||||
|
|
||||||
uart.port.irq = pci_irq_vector(dev, 0);
|
uart.port.irq = pci_irq_vector(dev, 0);
|
||||||
|
}
|
||||||
|
|
||||||
uart.port.dev = &dev->dev;
|
uart.port.dev = &dev->dev;
|
||||||
|
|
||||||
for (i = 0; i < nr_ports; i++) {
|
for (i = 0; i < nr_ports; i++) {
|
||||||
@ -4973,6 +4992,10 @@ static const struct pci_device_id serial_pci_tbl[] = {
|
|||||||
{ PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA_AUX,
|
{ PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA_AUX,
|
||||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
|
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
|
||||||
pbn_b2_1_115200 },
|
pbn_b2_1_115200 },
|
||||||
|
/* HPE PCI serial device */
|
||||||
|
{ PCI_VENDOR_ID_HP_3PAR, PCI_DEVICE_ID_HPE_PCI_SERIAL,
|
||||||
|
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
|
||||||
|
pbn_b1_1_115200 },
|
||||||
|
|
||||||
{ PCI_VENDOR_ID_DCI, PCI_DEVICE_ID_DCI_PCCOM2,
|
{ PCI_VENDOR_ID_DCI, PCI_DEVICE_ID_DCI_PCCOM2,
|
||||||
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
|
PCI_ANY_ID, PCI_ANY_ID, 0, 0,
|
||||||
|
@ -1809,6 +1809,18 @@ void serial8250_tx_chars(struct uart_8250_port *up)
|
|||||||
count = up->tx_loadsz;
|
count = up->tx_loadsz;
|
||||||
do {
|
do {
|
||||||
serial_out(up, UART_TX, xmit->buf[xmit->tail]);
|
serial_out(up, UART_TX, xmit->buf[xmit->tail]);
|
||||||
|
if (up->bugs & UART_BUG_TXRACE) {
|
||||||
|
/*
|
||||||
|
* The Aspeed BMC virtual UARTs have a bug where data
|
||||||
|
* may get stuck in the BMC's Tx FIFO from bursts of
|
||||||
|
* writes on the APB interface.
|
||||||
|
*
|
||||||
|
* Delay back-to-back writes by a read cycle to avoid
|
||||||
|
* stalling the VUART. Read a register that won't have
|
||||||
|
* side-effects and discard the result.
|
||||||
|
*/
|
||||||
|
serial_in(up, UART_SCR);
|
||||||
|
}
|
||||||
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
|
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
|
||||||
port->icount.tx++;
|
port->icount.tx++;
|
||||||
if (uart_circ_empty(xmit))
|
if (uart_circ_empty(xmit))
|
||||||
|
@ -195,7 +195,6 @@ struct rp2_card {
|
|||||||
void __iomem *bar0;
|
void __iomem *bar0;
|
||||||
void __iomem *bar1;
|
void __iomem *bar1;
|
||||||
spinlock_t card_lock;
|
spinlock_t card_lock;
|
||||||
struct completion fw_loaded;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define RP_ID(prod) PCI_VDEVICE(RP, (prod))
|
#define RP_ID(prod) PCI_VDEVICE(RP, (prod))
|
||||||
@ -662,17 +661,10 @@ static void rp2_remove_ports(struct rp2_card *card)
|
|||||||
card->initialized_ports = 0;
|
card->initialized_ports = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rp2_fw_cb(const struct firmware *fw, void *context)
|
static int rp2_load_firmware(struct rp2_card *card, const struct firmware *fw)
|
||||||
{
|
{
|
||||||
struct rp2_card *card = context;
|
|
||||||
resource_size_t phys_base;
|
resource_size_t phys_base;
|
||||||
int i, rc = -ENOENT;
|
int i, rc = 0;
|
||||||
|
|
||||||
if (!fw) {
|
|
||||||
dev_err(&card->pdev->dev, "cannot find '%s' firmware image\n",
|
|
||||||
RP2_FW_NAME);
|
|
||||||
goto no_fw;
|
|
||||||
}
|
|
||||||
|
|
||||||
phys_base = pci_resource_start(card->pdev, 1);
|
phys_base = pci_resource_start(card->pdev, 1);
|
||||||
|
|
||||||
@ -718,23 +710,13 @@ static void rp2_fw_cb(const struct firmware *fw, void *context)
|
|||||||
card->initialized_ports++;
|
card->initialized_ports++;
|
||||||
}
|
}
|
||||||
|
|
||||||
release_firmware(fw);
|
return rc;
|
||||||
no_fw:
|
|
||||||
/*
|
|
||||||
* rp2_fw_cb() is called from a workqueue long after rp2_probe()
|
|
||||||
* has already returned success. So if something failed here,
|
|
||||||
* we'll just leave the now-dormant device in place until somebody
|
|
||||||
* unbinds it.
|
|
||||||
*/
|
|
||||||
if (rc)
|
|
||||||
dev_warn(&card->pdev->dev, "driver initialization failed\n");
|
|
||||||
|
|
||||||
complete(&card->fw_loaded);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rp2_probe(struct pci_dev *pdev,
|
static int rp2_probe(struct pci_dev *pdev,
|
||||||
const struct pci_device_id *id)
|
const struct pci_device_id *id)
|
||||||
{
|
{
|
||||||
|
const struct firmware *fw;
|
||||||
struct rp2_card *card;
|
struct rp2_card *card;
|
||||||
struct rp2_uart_port *ports;
|
struct rp2_uart_port *ports;
|
||||||
void __iomem * const *bars;
|
void __iomem * const *bars;
|
||||||
@ -745,7 +727,6 @@ static int rp2_probe(struct pci_dev *pdev,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
pci_set_drvdata(pdev, card);
|
pci_set_drvdata(pdev, card);
|
||||||
spin_lock_init(&card->card_lock);
|
spin_lock_init(&card->card_lock);
|
||||||
init_completion(&card->fw_loaded);
|
|
||||||
|
|
||||||
rc = pcim_enable_device(pdev);
|
rc = pcim_enable_device(pdev);
|
||||||
if (rc)
|
if (rc)
|
||||||
@ -778,22 +759,24 @@ static int rp2_probe(struct pci_dev *pdev,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
card->ports = ports;
|
card->ports = ports;
|
||||||
|
|
||||||
|
rc = request_firmware(&fw, RP2_FW_NAME, &pdev->dev);
|
||||||
|
if (rc < 0) {
|
||||||
|
dev_err(&pdev->dev, "cannot find '%s' firmware image\n",
|
||||||
|
RP2_FW_NAME);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = rp2_load_firmware(card, fw);
|
||||||
|
|
||||||
|
release_firmware(fw);
|
||||||
|
if (rc < 0)
|
||||||
|
return rc;
|
||||||
|
|
||||||
rc = devm_request_irq(&pdev->dev, pdev->irq, rp2_uart_interrupt,
|
rc = devm_request_irq(&pdev->dev, pdev->irq, rp2_uart_interrupt,
|
||||||
IRQF_SHARED, DRV_NAME, card);
|
IRQF_SHARED, DRV_NAME, card);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
/*
|
|
||||||
* Only catastrophic errors (e.g. ENOMEM) are reported here.
|
|
||||||
* If the FW image is missing, we'll find out in rp2_fw_cb()
|
|
||||||
* and print an error message.
|
|
||||||
*/
|
|
||||||
rc = request_firmware_nowait(THIS_MODULE, 1, RP2_FW_NAME, &pdev->dev,
|
|
||||||
GFP_KERNEL, card, rp2_fw_cb);
|
|
||||||
if (rc)
|
|
||||||
return rc;
|
|
||||||
dev_dbg(&pdev->dev, "waiting for firmware blob...\n");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -801,7 +784,6 @@ static void rp2_remove(struct pci_dev *pdev)
|
|||||||
{
|
{
|
||||||
struct rp2_card *card = pci_get_drvdata(pdev);
|
struct rp2_card *card = pci_get_drvdata(pdev);
|
||||||
|
|
||||||
wait_for_completion(&card->fw_loaded);
|
|
||||||
rp2_remove_ports(card);
|
rp2_remove_ports(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,7 +338,7 @@ static void tegra_uart_fifo_reset(struct tegra_uart_port *tup, u8 fcr_bits)
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
lsr = tegra_uart_read(tup, UART_LSR);
|
lsr = tegra_uart_read(tup, UART_LSR);
|
||||||
if ((lsr | UART_LSR_TEMT) && !(lsr & UART_LSR_DR))
|
if ((lsr & UART_LSR_TEMT) && !(lsr & UART_LSR_DR))
|
||||||
break;
|
break;
|
||||||
udelay(1);
|
udelay(1);
|
||||||
} while (--tmout);
|
} while (--tmout);
|
||||||
|
@ -863,9 +863,11 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
|
|||||||
goto check_and_exit;
|
goto check_and_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (change_irq || change_port) {
|
||||||
retval = security_locked_down(LOCKDOWN_TIOCSSERIAL);
|
retval = security_locked_down(LOCKDOWN_TIOCSSERIAL);
|
||||||
if (retval && (change_irq || change_port))
|
if (retval)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ask the low level driver to verify the settings.
|
* Ask the low level driver to verify the settings.
|
||||||
|
@ -1023,10 +1023,10 @@ static int scif_set_rtrg(struct uart_port *port, int rx_trig)
|
|||||||
{
|
{
|
||||||
unsigned int bits;
|
unsigned int bits;
|
||||||
|
|
||||||
|
if (rx_trig >= port->fifosize)
|
||||||
|
rx_trig = port->fifosize - 1;
|
||||||
if (rx_trig < 1)
|
if (rx_trig < 1)
|
||||||
rx_trig = 1;
|
rx_trig = 1;
|
||||||
if (rx_trig >= port->fifosize)
|
|
||||||
rx_trig = port->fifosize;
|
|
||||||
|
|
||||||
/* HSCIF can be set to an arbitrary level. */
|
/* HSCIF can be set to an arbitrary level. */
|
||||||
if (sci_getreg(port, HSRTRGR)->size) {
|
if (sci_getreg(port, HSRTRGR)->size) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user