• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "soc/lldesc.h"
2 
lldesc_setup_link(lldesc_t * dmadesc,const void * data,int len,bool isrx)3 void lldesc_setup_link(lldesc_t *dmadesc, const void *data, int len, bool isrx)
4 {
5     int n = 0;
6     while (len) {
7         int dmachunklen = len;
8         if (dmachunklen > LLDESC_MAX_NUM_PER_DESC) {
9             dmachunklen = LLDESC_MAX_NUM_PER_DESC;
10         }
11         if (isrx) {
12             //Receive needs DMA length rounded to next 32-bit boundary
13             dmadesc[n].size = (dmachunklen + 3) & (~3);
14             dmadesc[n].length = (dmachunklen + 3) & (~3);
15         } else {
16             dmadesc[n].size = dmachunklen;
17             dmadesc[n].length = dmachunklen;
18         }
19         dmadesc[n].buf = (uint8_t *)data;
20         dmadesc[n].eof = 0;
21         dmadesc[n].sosf = 0;
22         dmadesc[n].owner = 1;
23         dmadesc[n].qe.stqe_next = &dmadesc[n + 1];
24         len -= dmachunklen;
25         data += dmachunklen;
26         n++;
27     }
28     dmadesc[n - 1].eof = 1; //Mark last DMA desc as end of stream.
29     dmadesc[n - 1].qe.stqe_next = NULL;
30 }
31 
lldesc_get_received_len(lldesc_t * head,lldesc_t ** out_next)32 int lldesc_get_received_len(lldesc_t* head, lldesc_t** out_next)
33 {
34     lldesc_t* desc = head;
35     int len = 0;
36     while(desc) {
37         len += desc->length;
38         bool eof = desc->eof;
39         desc = STAILQ_NEXT(desc, qe);
40         if (eof) break;
41     }
42     if (out_next) {
43         *out_next = desc;
44     }
45     return len;
46 }
47