> I also added a new device : devices/rtdmnet.c. It is really similar to
> devices/generic.c, but it uses RTDM's Net drivers instead of Linux
> drivers. This new device still needs fixing, and only works in idle mode
> for now - working on a fix right now.

Now fixed.

EtherLab master over real-time Ethernet drivers from Xenomai 3 just works !

For the record, and in case anyone would want to reproduce the
experiment on I.mx6 with real-time FEC driver, patches for Xenomai
3.0.7 to enable and fix FEC driver are attached. Tested with Linux
4.9.51.

Best regards

Edouard Tisserant
diff -ru xenomai-v3.0.6_orig/kernel/drivers/net/stack/include/rtskb.h xenomai-v3.0.6/kernel/drivers/net/stack/include/rtskb.h
--- xenomai-v3.0.6_pure/kernel/drivers/net/stack/include/rtskb.h	2017-11-19 18:11:53.000000000 +0100
+++ xenomai-v3.0.6/kernel/drivers/net/stack/include/rtskb.h	2018-09-14 22:54:36.463607115 +0200
@@ -272,7 +272,7 @@
 #define DEFAULT_SOCKET_RTSKBS       16      /* default number of rtskb's in socket pools */
 
 #define ALIGN_RTSKB_STRUCT_LEN      SKB_DATA_ALIGN(sizeof(struct rtskb))
-#define RTSKB_SIZE                  1544    /* maximum needed by pcnet32-rt */
+#define RTSKB_SIZE                  2048    /* power of two needed by rt_fec */
 
 extern unsigned int rtskb_pools;        /* current number of rtskb pools      */
 extern unsigned int rtskb_pools_max;    /* maximum number of rtskb pools      */
--- xenomai-3.0.7_orig/kernel/drivers/net/drivers/fec.c	2018-06-22 08:36:25.000000000 +0200
+++ xenomai-3.0.7/kernel/drivers/net/drivers/fec.c	2018-10-06 13:04:40.735735055 +0200
@@ -938,13 +938,22 @@
 	/* Link on or off change */
 	if (phy_dev->link != fep->link) {
 		fep->link = phy_dev->link;
-		if (phy_dev->link)
+		if (phy_dev->link) {
 			fec_restart(ndev, phy_dev->duplex);
-		else
+		} else {
 			fec_stop(ndev);
+        }
 		status_change = 1;
 	}
 
+    if (status_change) {
+        if (netif_carrier_ok(netdev)) {
+            rtnetif_carrier_on(ndev);
+        } else {
+            rtnetif_carrier_off(ndev);
+        }
+    }
+
 spin_unlock:
 	rtdm_lock_put_irqrestore(&fep->hw_lock, context);
 
@@ -1025,12 +1034,8 @@
 
 	/* check for attached phy */
 	for (phy_id = 0; (phy_id < PHY_MAX_ADDR); phy_id++) {
-		if ((fep->mii_bus->phy_mask & (1 << phy_id)))
-			continue;
-		if (fep->mii_bus->phy_map[phy_id] == NULL)
-			continue;
-		if (fep->mii_bus->phy_map[phy_id]->phy_id == 0)
-			continue;
+        if (!mdiobus_is_registered_device(fep->mii_bus, phy_id))
+            continue;
 		if (dev_id--)
 			continue;
 		strncpy(mdio_bus_id, fep->mii_bus->id, MII_BUS_ID_SIZE);
@@ -1047,7 +1052,7 @@
 
 	snprintf(phy_name, sizeof(phy_name), PHY_ID_FMT, mdio_bus_id, phy_id);
 	/* attach the mac to the phy using the dummy linux netdev */
-	phy_dev = phy_connect(fep->netdev, phy_name, &fec_enet_adjust_link, 0,
+	phy_dev = phy_connect(fep->netdev, phy_name, &fec_enet_adjust_link,
 			      fep->phy_interface);
 	if (IS_ERR(phy_dev)) {
 		printk(KERN_ERR "%s: could not attach to PHY\n", ndev->name);
@@ -1066,11 +1071,7 @@
 	fep->link = 0;
 	fep->full_duplex = 0;
 
-	printk(KERN_INFO
-		"%s: Freescale FEC PHY driver [%s] (mii_bus:phy_addr=%s, irq=%d)\n",
-		ndev->name,
-		fep->phy_dev->drv->name, dev_name(&fep->phy_dev->dev),
-		fep->phy_dev->irq);
+	phy_attached_info(phy_dev);
 
 	return 0;
 }
@@ -1082,7 +1083,7 @@
 	struct fec_enet_private *fep = rtnetdev_priv(ndev);
 	const struct platform_device_id *id_entry =
 				platform_get_device_id(fep->pdev);
-	int err = -ENXIO, i;
+	int err = -ENXIO;
 
 	/*
 	 * The dual fec interfaces are not equivalent with enet-mac.
@@ -1141,15 +1142,6 @@
 	fep->mii_bus->priv = fep;
 	fep->mii_bus->parent = &pdev->dev;
 
-	fep->mii_bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
-	if (!fep->mii_bus->irq) {
-		err = -ENOMEM;
-		goto err_out_free_mdiobus;
-	}
-
-	for (i = 0; i < PHY_MAX_ADDR; i++)
-		fep->mii_bus->irq[i] = PHY_POLL;
-
 	rtdm_nrtsig_init(&fep->mdio_done_sig, fec_enet_mdio_done, fep);
 
 	if (mdiobus_register(fep->mii_bus))
@@ -1166,7 +1158,6 @@
 err_out_destroy_nrt:
 	rtdm_nrtsig_destroy(&fep->mdio_done_sig);
 	kfree(fep->mii_bus->irq);
-err_out_free_mdiobus:
 	mdiobus_free(fep->mii_bus);
 err_out:
 	return err;
@@ -1183,11 +1174,10 @@
 }
 
 static int
-fec_enet_ioctl(struct rtnet_device *ndev, unsigned int request, void *arg)
+fec_enet_ioctl(struct rtnet_device *ndev, struct ifreq *ifr, int request)
 {
 	struct fec_enet_private *fep = rtnetdev_priv(ndev);
 	struct phy_device *phydev = fep->phy_dev;
-	struct ifreq *ifr = arg;
 	struct ethtool_value *value;
 	struct ethtool_cmd cmd;
 	int err = 0;
@@ -1266,7 +1256,7 @@
 
 	bdp = fep->rx_bd_base;
 	for (i = 0; i < RX_RING_SIZE; i++) {
-		skb = rtnetdev_alloc_rtskb(netdev, FEC_ENET_RX_FRSIZE); /* RTnet */
+		skb = rtnetdev_alloc_rtskb(ndev, FEC_ENET_RX_FRSIZE); /* RTnet */
 		if (!skb) {
 			fec_enet_free_buffers(ndev);
 			return -ENOMEM;
diff -u -r xenomai-3.0.6.orig/kernel/drivers/net/drivers/Kconfig xenomai-3.0.6/kernel/drivers/net/drivers/Kconfig
--- xenomai-3.0.6.orig/kernel/drivers/net/drivers/Kconfig	2017-08-31 16:24:44.000000000 +0200
+++ xenomai-3.0.6/kernel/drivers/net/drivers/Kconfig	2018-06-13 17:07:39.523932714 +0200
@@ -118,6 +118,10 @@
 
 if ARCH = arm
 
+config XENO_DRIVERS_NET_DRV_FEC
+    depends on XENO_DRIVERS_NET
+    tristate "iMx familly FEC Ethernet"
+
 config XENO_DRIVERS_NET_DRV_AT91_ETHER
     depends on XENO_DRIVERS_NET && SOC_AT91RM9200
     select XENO_DRIVERS_NET_DRV_MACB
_______________________________________________
etherlab-users mailing list
[email protected]
http://lists.etherlab.org/mailman/listinfo/etherlab-users

Reply via email to