Lines Matching full:map
93 static int tso_dma_iova_try(struct device *dev, struct tso_dma_map *map, in tso_dma_iova_try() argument
101 if (!dma_iova_try_alloc(dev, &map->iova_state, phys, total_len)) in tso_dma_iova_try()
104 skb = map->skb; in tso_dma_iova_try()
108 if (dma_iova_link(dev, &map->iova_state, in tso_dma_iova_try()
112 map->linear_len = linear_len; in tso_dma_iova_try()
120 if (dma_iova_link(dev, &map->iova_state, in tso_dma_iova_try()
123 map->nr_frags = i; in tso_dma_iova_try()
126 map->frags[i].len = frag_len; in tso_dma_iova_try()
128 map->nr_frags = i + 1; in tso_dma_iova_try()
131 if (dma_iova_sync(dev, &map->iova_state, 0, total_len)) in tso_dma_iova_try()
137 dma_iova_destroy(dev, &map->iova_state, *offset, in tso_dma_iova_try()
139 memset(&map->iova_state, 0, sizeof(map->iova_state)); in tso_dma_iova_try()
141 /* reset map state */ in tso_dma_iova_try()
142 map->frag_idx = -1; in tso_dma_iova_try()
143 map->offset = 0; in tso_dma_iova_try()
144 map->linear_len = 0; in tso_dma_iova_try()
145 map->nr_frags = 0; in tso_dma_iova_try()
151 * tso_dma_map_init - DMA-map GSO payload regions
152 * @map: map struct to initialize
165 int tso_dma_map_init(struct tso_dma_map *map, struct device *dev, in tso_dma_map_init() argument
175 map->dev = dev; in tso_dma_map_init()
176 map->skb = skb; in tso_dma_map_init()
177 map->hdr_len = hdr_len; in tso_dma_map_init()
178 map->frag_idx = -1; in tso_dma_map_init()
179 map->offset = 0; in tso_dma_map_init()
180 map->iova_offset = 0; in tso_dma_map_init()
181 map->total_len = total_len; in tso_dma_map_init()
182 map->linear_len = 0; in tso_dma_map_init()
183 map->nr_frags = 0; in tso_dma_map_init()
184 memset(&map->iova_state, 0, sizeof(map->iova_state)); in tso_dma_map_init()
194 if (tso_dma_iova_try(dev, map, phys, linear_len, total_len, &offset)) { in tso_dma_map_init()
195 /* IOVA path failed, map state was reset. Fallback to in tso_dma_map_init()
199 map->linear_dma = dma_map_phys(dev, phys, linear_len, in tso_dma_map_init()
201 if (dma_mapping_error(dev, map->linear_dma)) in tso_dma_map_init()
203 map->linear_len = linear_len; in tso_dma_map_init()
210 map->frags[i].len = frag_len; in tso_dma_map_init()
211 map->frags[i].dma = dma_map_phys(dev, skb_frag_phys(frag), in tso_dma_map_init()
213 if (dma_mapping_error(dev, map->frags[i].dma)) { in tso_dma_map_init()
214 tso_dma_map_cleanup(map); in tso_dma_map_init()
217 map->nr_frags = i + 1; in tso_dma_map_init()
222 map->frag_idx = 0; in tso_dma_map_init()
230 * @map: the map to clean up
235 void tso_dma_map_cleanup(struct tso_dma_map *map) in tso_dma_map_cleanup() argument
239 if (dma_use_iova(&map->iova_state)) { in tso_dma_map_cleanup()
240 dma_iova_destroy(map->dev, &map->iova_state, map->total_len, in tso_dma_map_cleanup()
242 memset(&map->iova_state, 0, sizeof(map->iova_state)); in tso_dma_map_cleanup()
244 if (map->linear_len) in tso_dma_map_cleanup()
245 dma_unmap_phys(map->dev, map->linear_dma, in tso_dma_map_cleanup()
246 map->linear_len, DMA_TO_DEVICE, 0); in tso_dma_map_cleanup()
248 for (i = 0; i < map->nr_frags; i++) in tso_dma_map_cleanup()
249 dma_unmap_phys(map->dev, map->frags[i].dma, in tso_dma_map_cleanup()
250 map->frags[i].len, DMA_TO_DEVICE, 0); in tso_dma_map_cleanup()
253 map->linear_len = 0; in tso_dma_map_cleanup()
254 map->nr_frags = 0; in tso_dma_map_cleanup()
260 * @map: the payload map
270 unsigned int tso_dma_map_count(struct tso_dma_map *map, unsigned int len) in tso_dma_map_count() argument
272 unsigned int offset = map->offset; in tso_dma_map_count()
273 int idx = map->frag_idx; in tso_dma_map_count()
279 if (dma_use_iova(&map->iova_state)) in tso_dma_map_count()
286 region_len = map->linear_len; in tso_dma_map_count()
288 region_len = map->frags[idx].len; in tso_dma_map_count()
303 * @map: the payload map
318 bool tso_dma_map_next(struct tso_dma_map *map, dma_addr_t *addr, in tso_dma_map_next() argument
328 if (dma_use_iova(&map->iova_state)) { in tso_dma_map_next()
329 *addr = map->iova_state.addr + map->iova_offset; in tso_dma_map_next()
332 map->iova_offset += seg_remaining; in tso_dma_map_next()
338 if (map->frag_idx == -1) { in tso_dma_map_next()
339 region_len = map->linear_len; in tso_dma_map_next()
340 chunk = min(seg_remaining, region_len - map->offset); in tso_dma_map_next()
341 *addr = map->linear_dma + map->offset; in tso_dma_map_next()
343 region_len = map->frags[map->frag_idx].len; in tso_dma_map_next()
344 chunk = min(seg_remaining, region_len - map->offset); in tso_dma_map_next()
345 *addr = map->frags[map->frag_idx].dma + map->offset; in tso_dma_map_next()
348 *mapping_len = (map->offset == 0) ? region_len : 0; in tso_dma_map_next()
350 map->offset += chunk; in tso_dma_map_next()
352 if (map->offset >= region_len) { in tso_dma_map_next()
353 map->frag_idx++; in tso_dma_map_next()
354 map->offset = 0; in tso_dma_map_next()