MCPcopy Create free account
hub / github.com/F-Stack/f-stack / write_scatter_gather_list

Function write_scatter_gather_list

dpdk/drivers/net/mana/gdma.c:62–118  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

60}
61
62static uint32_t
63write_scatter_gather_list(uint8_t *work_queue_head_pointer,
64 uint8_t *work_queue_end_pointer,
65 uint8_t *work_queue_cur_pointer,
66 struct gdma_work_request *work_request)
67{
68 struct gdma_sgl_element *sge_list;
69 struct gdma_sgl_element dummy_sgl[1];
70 uint8_t *address;
71 uint32_t size;
72 uint32_t num_sge;
73 uint32_t size_to_queue_end;
74 uint32_t sge_list_size;
75
76 DP_LOG(DEBUG, "work_queue_cur_pointer %p work_request->flags %x",
77 work_queue_cur_pointer, work_request->flags);
78
79 num_sge = work_request->num_sgl_elements;
80 sge_list = work_request->sgl;
81 size_to_queue_end = (uint32_t)(work_queue_end_pointer -
82 work_queue_cur_pointer);
83
84 if (num_sge == 0) {
85 /* Per spec, the case of an empty SGL should be handled as
86 * follows to avoid corrupted WQE errors:
87 * Write one dummy SGL entry
88 * Set the address to 1, leave the rest as 0
89 */
90 dummy_sgl[num_sge].address = 1;
91 dummy_sgl[num_sge].size = 0;
92 dummy_sgl[num_sge].memory_key = 0;
93 num_sge++;
94 sge_list = dummy_sgl;
95 }
96
97 sge_list_size = 0;
98 {
99 address = (uint8_t *)sge_list;
100 size = sizeof(struct gdma_sgl_element) * num_sge;
101 if (size_to_queue_end < size) {
102 memcpy(work_queue_cur_pointer, address,
103 size_to_queue_end);
104 work_queue_cur_pointer = work_queue_head_pointer;
105 address += size_to_queue_end;
106 size -= size_to_queue_end;
107 }
108
109 memcpy(work_queue_cur_pointer, address, size);
110 sge_list_size = size;
111 }
112
113 DP_LOG(DEBUG, "sge %u address 0x%" PRIx64 " size %u key %u list_s %u",
114 num_sge, sge_list->address, sge_list->size,
115 sge_list->memory_key, sge_list_size);
116
117 return sge_list_size;
118}
119

Callers 1

gdma_post_work_requestFunction · 0.85

Calls 1

memcpyFunction · 0.50

Tested by

no test coverage detected