ref: 6045e58729088d695688ebf5f5168e577387badf
parent: 904e75f609795655e10c4d99d0a43da26d257f66
	author: cinap_lenrek <cinap_lenrek@felloff.net>
	date: Sun Nov 12 15:47:23 EST 2023
	
devuart: handle software flow control (XON/XOFF) in devuart alone No need for Physuart.kick() to check Uart.blocked state, already handled by devuart().
--- a/sys/src/9/arm64/uartqemu.c
+++ b/sys/src/9/arm64/uartqemu.c
@@ -173,8 +173,6 @@
 {u32int *reg = (u32int*)uart->regs;
- if(uart->blocked)
- return;
coherence();
 	while((reg[FR] & TXFF) == 0){if(uart->op >= uart->oe && uartstageoutput(uart) == 0)
--- a/sys/src/9/bcm/uartmini.c
+++ b/sys/src/9/bcm/uartmini.c
@@ -121,10 +121,8 @@
 {u32int *ap;
- ap = (u32int*)uart->regs;
- if(uart->blocked)
- return;
coherence();
+ ap = (u32int*)uart->regs;
 	while(ap[MuLsr] & TxRdy){if(uart->op >= uart->oe && uartstageoutput(uart) == 0)
break;
--- a/sys/src/9/bcm/uartpl011.c
+++ b/sys/src/9/bcm/uartpl011.c
@@ -173,8 +173,6 @@
 {u32int *reg = (u32int*)uart->regs;
- if(uart->blocked)
- return;
coherence();
 	while((reg[FR] & TXFF) == 0){if(uart->op >= uart->oe && uartstageoutput(uart) == 0)
--- a/sys/src/9/cycv/uartcycv.c
+++ b/sys/src/9/cycv/uartcycv.c
@@ -70,8 +70,6 @@
Ctlr *ct;
int i;
- if(uart->blocked)
- return;
ct = uart->regs;
if((ct->r[LSR] & LSR_THRE) == 0)
return;
@@ -102,7 +100,7 @@
}
break;
case 2:
- vuartkick(uart);
+ uartkick(uart);
break;
default:
return;
--- a/sys/src/9/imx8/uartimx.c
+++ b/sys/src/9/imx8/uartimx.c
@@ -167,8 +167,6 @@
u32int *regs = (u32int*)u->regs;
 	while(u->op < u->oe || uartstageoutput(u)){- if(u->blocked)
- break;
 		if((regs[USR1] & SR1_TRDY) == 0){regs[UCR1] |= CR1_TRDYEN;
return;
--- a/sys/src/9/kw/uartkw.c
+++ b/sys/src/9/kw/uartkw.c
@@ -195,9 +195,6 @@
UartReg *regs = ctlr->regs;
int i;
- if(uart->cts == 0 || uart->blocked)
- return;
-
 	for(i = 0; i < 16; i++) {if((regs->lsr & LSRthre) == 0 ||
uart->op >= uart->oe && uartstageoutput(uart) == 0)
--- a/sys/src/9/mt7688/uarti8250.c
+++ b/sys/src/9/mt7688/uarti8250.c
@@ -9,11 +9,6 @@
#include "fns.h"
#include "io.h"
-enum {- Pollstuckoutput = 1,
-};
-
-
 enum {					/* registers */Rbr = 0, /* Receiver Buffer (RO) */
Thr = 0, /* Transmitter Holding (WO) */
@@ -443,9 +438,6 @@
 {int i;
Ctlr *ctlr;
-
- if(/* uart->cts == 0 || */ uart->blocked)
- return;
/* nothing more to send? then disable xmit intr */
ctlr = uart->regs;
--- a/sys/src/9/mtx/uarti8250.c
+++ b/sys/src/9/mtx/uarti8250.c
@@ -419,7 +419,7 @@
int i;
Ctlr *ctlr;
- if(uart->cts == 0 || uart->blocked)
+ if(uart->cts == 0)
return;
/*
--- a/sys/src/9/omap/uarti8250.c
+++ b/sys/src/9/omap/uarti8250.c
@@ -467,9 +467,6 @@
int i;
Ctlr *ctlr;
- if(/* uart->cts == 0 || */ uart->blocked)
- return;
-
/* nothing more to send? then disable xmit intr */
ctlr = uart->regs;
if (uart->op >= uart->oe && qlen(uart->oq) == 0 &&
--- a/sys/src/9/pc/uartaxp.c
+++ b/sys/src/9/pc/uartaxp.c
@@ -545,7 +545,7 @@
Ccb *ccb;
uchar *ep, *mem, *rp, *wp, *bp;
- if(uart->cts == 0 || uart->blocked)
+ if(uart->cts == 0)
return;
cc = uart->regs;
--- a/sys/src/9/pc/uarti8250.c
+++ b/sys/src/9/pc/uarti8250.c
@@ -438,7 +438,7 @@
int i;
Ctlr *ctlr;
- if(uart->cts == 0 || uart->blocked)
+ if(uart->cts == 0)
return;
/*
--- a/sys/src/9/port/devuart.c
+++ b/sys/src/9/port/devuart.c
@@ -70,6 +70,7 @@
/* assume we can send */
p->cts = 1;
+ p->blocked = 0;
p->ctsbackoff = 0;
if(p->bits == 0)
@@ -655,6 +656,9 @@
 {int n;
+ if(!p->enabled || p->blocked)
+ return 0;
+
n = qconsume(p->oq, p->ostage, Stagesize);
if(n <= 0)
return 0;
@@ -779,7 +783,7 @@
 		if(p->ctsbackoff){ilock(&p->tlock);
 			if(p->ctsbackoff){- if(--(p->ctsbackoff) == 0)
+ if(--(p->ctsbackoff) == 0 && !p->blocked)
(*p->phys->kick)(p);
}
iunlock(&p->tlock);
--- a/sys/src/9/ppc/uartsaturn.c
+++ b/sys/src/9/ppc/uartsaturn.c
@@ -278,9 +278,6 @@
Saturnuart *su;
int i;
- if(uart->blocked)
- return;
-
su = ((UartData*)uart->regs)->su;
if((su->iir & Iir_txempty) == 0)
return;
--- a/sys/src/9/ppc/uartsmc.c
+++ b/sys/src/9/ppc/uartsmc.c
@@ -393,9 +393,6 @@
UartData *ud;
int i;
- if(uart->blocked)
- return;
-
ud = uart->regs;
txb = ud->txb;
--- a/sys/src/9/teg2/uarti8250.c
+++ b/sys/src/9/teg2/uarti8250.c
@@ -438,9 +438,6 @@
int i;
Ctlr *ctlr;
- if(/* uart->cts == 0 || */ uart->blocked)
- return;
-
/* nothing more to send? then disable xmit intr */
ctlr = uart->regs;
if (uart->op >= uart->oe && qlen(uart->oq) == 0 &&
--- a/sys/src/9/zynq/uartzynq.c
+++ b/sys/src/9/zynq/uartzynq.c
@@ -69,8 +69,6 @@
Ctlr *ct;
int i;
- if(uart->blocked)
- return;
ct = uart->regs;
 	for(i = 0; i < 128; i++){if((ct->r[CHANSTAT] & TXFULL) != 0)
@@ -99,7 +97,7 @@
uartrecv(uart, c);
}
if((fl & TXEMPTY) != 0)
- zuartkick(uart);
+ uartkick(uart);
}
static void
--
⑨