xref: /plan9-contrib/sys/src/9/vt4/words/etherlltemac.kprocs.c (revision d6dfd9ef91cf0fa8514a249d5f2a550978c19369)
1*d6dfd9efSDavid du Colombier /*
2*d6dfd9efSDavid du Colombier  * alternate implementation with kprocs (TODO)
3*d6dfd9efSDavid du Colombier  */
4*d6dfd9efSDavid du Colombier 
5*d6dfd9efSDavid du Colombier Rendez oqgotpkt;
6*d6dfd9efSDavid du Colombier Rendez txdmadone;
7*d6dfd9efSDavid du Colombier Rendez gotfifotxq;
8*d6dfd9efSDavid du Colombier Rendez txdone;
9*d6dfd9efSDavid du Colombier 
10*d6dfd9efSDavid du Colombier int
isdmaready(Ether * ether)11*d6dfd9efSDavid du Colombier isdmaready(Ether *ether)
12*d6dfd9efSDavid du Colombier {
13*d6dfd9efSDavid du Colombier 	Block *bp;
14*d6dfd9efSDavid du Colombier 	Queue *q;
15*d6dfd9efSDavid du Colombier 
16*d6dfd9efSDavid du Colombier 	q = ether->oq;
17*d6dfd9efSDavid du Colombier 	if (!qcanread(q))
18*d6dfd9efSDavid du Colombier 		return 0;
19*d6dfd9efSDavid du Colombier 	bp = qget(q);
20*d6dfd9efSDavid du Colombier 	qputback(q, bp);
21*d6dfd9efSDavid du Colombier 	return (frp->tdfv & Wordcnt) >=
22*d6dfd9efSDavid du Colombier 		ROUNDUP(padpktlen(BLEN(bp)), BY2WD) / BY2WD;
23*d6dfd9efSDavid du Colombier }
24*d6dfd9efSDavid du Colombier 
25*d6dfd9efSDavid du Colombier void
txdmaproc(Ether * ether)26*d6dfd9efSDavid du Colombier txdmaproc(Ether *ether)			/* owns dma chan 1 */
27*d6dfd9efSDavid du Colombier {
28*d6dfd9efSDavid du Colombier 	unsigned ruplen;
29*d6dfd9efSDavid du Colombier 	Block *bp;
30*d6dfd9efSDavid du Colombier 
31*d6dfd9efSDavid du Colombier 	for(;;) {
32*d6dfd9efSDavid du Colombier 		/* sleep until oq has pkt & tx fifo has room for it */
33*d6dfd9efSDavid du Colombier 		sleep(&oqgotpkt, isdmaready, ether);
34*d6dfd9efSDavid du Colombier 
35*d6dfd9efSDavid du Colombier 		bp = qget(ether->oq);
36*d6dfd9efSDavid du Colombier 		ruplen = ROUNDUP(padpktlen(BLEN(bp)), BY2WD);
37*d6dfd9efSDavid du Colombier 
38*d6dfd9efSDavid du Colombier 		dmastart(Chan1, &frp->tdfd, bp->rp, ruplen, Sinc, dmatxdone);
39*d6dfd9efSDavid du Colombier 		sleep(&txdmadone);
40*d6dfd9efSDavid du Colombier 
41*d6dfd9efSDavid du Colombier 		addfifotxq(ether, bp);
42*d6dfd9efSDavid du Colombier 		wakeup(&gotfifotxq);	/* have work for temac now */
43*d6dfd9efSDavid du Colombier 	}
44*d6dfd9efSDavid du Colombier }
45*d6dfd9efSDavid du Colombier 
46*d6dfd9efSDavid du Colombier int
istemacready(Ether * ether)47*d6dfd9efSDavid du Colombier istemacready(Ether *ether)
48*d6dfd9efSDavid du Colombier {
49*d6dfd9efSDavid du Colombier 	Ctlr *ctlr;
50*d6dfd9efSDavid du Colombier 
51*d6dfd9efSDavid du Colombier 	ctlr = ether->ctlr;
52*d6dfd9efSDavid du Colombier 	return ether->fifotxq != nil && !ctlr->xmitting;
53*d6dfd9efSDavid du Colombier }
54*d6dfd9efSDavid du Colombier 
55*d6dfd9efSDavid du Colombier void
txtemacproc(Ether * ether)56*d6dfd9efSDavid du Colombier txtemacproc(Ether *ether)		/* owns temac transmitter */
57*d6dfd9efSDavid du Colombier {
58*d6dfd9efSDavid du Colombier 	Block *bp;
59*d6dfd9efSDavid du Colombier 
60*d6dfd9efSDavid du Colombier 	for(;;) {
61*d6dfd9efSDavid du Colombier 		/* sleep until txq has pkt & tx is idle */
62*d6dfd9efSDavid du Colombier 		sleep(&gotfifotxq, istemacready, ether);
63*d6dfd9efSDavid du Colombier 
64*d6dfd9efSDavid du Colombier 		bp = ether->fifotxq;
65*d6dfd9efSDavid du Colombier 		ether->fifotxq = bp->next;
66*d6dfd9efSDavid du Colombier 
67*d6dfd9efSDavid du Colombier 		kicktemac(ether);
68*d6dfd9efSDavid du Colombier 		sleep(&txdone);
69*d6dfd9efSDavid du Colombier 
70*d6dfd9efSDavid du Colombier 		free(bp);
71*d6dfd9efSDavid du Colombier 		wakeup(&oqgotpkt);	/* might be work for dma1 now */
72*d6dfd9efSDavid du Colombier 	}
73*d6dfd9efSDavid du Colombier }
74*d6dfd9efSDavid du Colombier 
dmatxdone()75*d6dfd9efSDavid du Colombier dmatxdone()
76*d6dfd9efSDavid du Colombier {
77*d6dfd9efSDavid du Colombier 	// ...
78*d6dfd9efSDavid du Colombier 	wakeup(&txdmadone);
79*d6dfd9efSDavid du Colombier 	// ...
80*d6dfd9efSDavid du Colombier }
81*d6dfd9efSDavid du Colombier 
temactransmit(Ether * ether)82*d6dfd9efSDavid du Colombier temactransmit(Ether *ether)
83*d6dfd9efSDavid du Colombier {
84*d6dfd9efSDavid du Colombier 	// ...
85*d6dfd9efSDavid du Colombier 	wakeup(&oqgotpkt);
86*d6dfd9efSDavid du Colombier 	// ...
87*d6dfd9efSDavid du Colombier }
88*d6dfd9efSDavid du Colombier 
dmaintr()89*d6dfd9efSDavid du Colombier dmaintr()
90*d6dfd9efSDavid du Colombier {
91*d6dfd9efSDavid du Colombier 	// ...
92*d6dfd9efSDavid du Colombier 	wakeup(&oqgotpkt);		/* if txfifo now has room */
93*d6dfd9efSDavid du Colombier 	wakeup(&txdmadone);
94*d6dfd9efSDavid du Colombier 	// ...
95*d6dfd9efSDavid du Colombier }
96*d6dfd9efSDavid du Colombier 
fifointr()97*d6dfd9efSDavid du Colombier fifointr()
98*d6dfd9efSDavid du Colombier {
99*d6dfd9efSDavid du Colombier 	// ...
100*d6dfd9efSDavid du Colombier 	wakeup(&txdone);
101*d6dfd9efSDavid du Colombier 	// ...
102*d6dfd9efSDavid du Colombier }
103