1 #include "soc/lldesc.h" 2 lldesc_setup_link(lldesc_t * dmadesc,const void * data,int len,bool isrx)3void 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)32int 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