> 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