Commit ed517f82 authored by Philippe Gerum's avatar Philippe Gerum Committed by Jan Kiszka

net/rtdev: ensure per-device skbs get mapped at registration

This patch works around a regression introduced by #74464ee3,
causing a new device's skbs not to be passed to its ->map_rtskb()
handler when registered, breaking further DMA inits in the driver.
Signed-off-by: Philippe Gerum's avatarPhilippe Gerum <rpm@xenomai.org>
Signed-off-by: Jan Kiszka's avatarJan Kiszka <jan.kiszka@siemens.com>
parent 7711a534
......@@ -45,6 +45,7 @@ struct rtnet_device *rtnet_devices[MAX_RT_DEVICES];
static struct rtnet_device *loopback_device;
static DEFINE_RTDM_LOCK(rtnet_devices_rt_lock);
static LIST_HEAD(rtskb_mapped_list);
static LIST_HEAD(rtskb_mapwait_list);
LIST_HEAD(event_hook_list);
DEFINE_MUTEX(rtnet_devices_nrt_lock);
......@@ -412,8 +413,12 @@ int rtdev_map_rtskb(struct rtskb *skb)
}
}
if (!err && skb->buf_dma_addr != RTSKB_UNMAPPED)
list_add(&skb->entry, &rtskb_mapped_list);
if (!err) {
if (skb->buf_dma_addr != RTSKB_UNMAPPED)
list_add(&skb->entry, &rtskb_mapped_list);
else
list_add(&skb->entry, &rtskb_mapwait_list);
}
mutex_unlock(&rtnet_devices_nrt_lock);
......@@ -424,7 +429,7 @@ int rtdev_map_rtskb(struct rtskb *skb)
static int rtdev_map_all_rtskbs(struct rtnet_device *rtdev)
{
struct rtskb *skb;
struct rtskb *skb, *n;
int err = 0;
if (!rtdev->map_rtskb)
......@@ -436,6 +441,14 @@ static int rtdev_map_all_rtskbs(struct rtnet_device *rtdev)
break;
}
list_for_each_entry_safe(skb, n, &rtskb_mapwait_list, entry) {
err = rtskb_map(rtdev, skb);
if (err)
break;
list_del(&skb->entry);
list_add(&skb->entry, &rtskb_mapped_list);
}
return err;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment