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