Commit e972e78e authored by Philippe Gerum's avatar Philippe Gerum Committed by Jan Kiszka
Browse files

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 217706f7
...@@ -45,6 +45,7 @@ struct rtnet_device *rtnet_devices[MAX_RT_DEVICES]; ...@@ -45,6 +45,7 @@ struct rtnet_device *rtnet_devices[MAX_RT_DEVICES];
static struct rtnet_device *loopback_device; static struct rtnet_device *loopback_device;
static DEFINE_RTDM_LOCK(rtnet_devices_rt_lock); static DEFINE_RTDM_LOCK(rtnet_devices_rt_lock);
static LIST_HEAD(rtskb_mapped_list); static LIST_HEAD(rtskb_mapped_list);
static LIST_HEAD(rtskb_mapwait_list);
LIST_HEAD(event_hook_list); LIST_HEAD(event_hook_list);
DEFINE_MUTEX(rtnet_devices_nrt_lock); DEFINE_MUTEX(rtnet_devices_nrt_lock);
...@@ -459,8 +460,12 @@ int rtdev_map_rtskb(struct rtskb *skb) ...@@ -459,8 +460,12 @@ int rtdev_map_rtskb(struct rtskb *skb)
} }
} }
if (!err && skb->buf_dma_addr != RTSKB_UNMAPPED) if (!err) {
list_add(&skb->entry, &rtskb_mapped_list); 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); mutex_unlock(&rtnet_devices_nrt_lock);
...@@ -471,7 +476,7 @@ int rtdev_map_rtskb(struct rtskb *skb) ...@@ -471,7 +476,7 @@ int rtdev_map_rtskb(struct rtskb *skb)
static int rtdev_map_all_rtskbs(struct rtnet_device *rtdev) static int rtdev_map_all_rtskbs(struct rtnet_device *rtdev)
{ {
struct rtskb *skb; struct rtskb *skb, *n;
int err = 0; int err = 0;
if (!rtdev->map_rtskb) if (!rtdev->map_rtskb)
...@@ -483,6 +488,14 @@ static int rtdev_map_all_rtskbs(struct rtnet_device *rtdev) ...@@ -483,6 +488,14 @@ static int rtdev_map_all_rtskbs(struct rtnet_device *rtdev)
break; 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; return err;
} }
...@@ -580,7 +593,7 @@ int rt_register_rtnetdev(struct rtnet_device *rtdev) ...@@ -580,7 +593,7 @@ int rt_register_rtnetdev(struct rtnet_device *rtdev)
if (err) if (err)
goto fail_link; goto fail_link;
} }
err = rtdev_map_all_rtskbs(rtdev); err = rtdev_map_all_rtskbs(rtdev);
if (err) if (err)
goto fail_map; goto fail_map;
......
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