From 1c05315e960ea1c68351cf3416e4c6a26f1c4fbd Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Tue, 11 Apr 2006 14:39:17 +0000
Subject: [PATCH] Now fetching port physical layer from EEPROM

---
 master/slave.c | 23 ++++++++++++++++++++++-
 master/slave.h |  1 +
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/master/slave.c b/master/slave.c
index e5474c21..5a844eae 100644
--- a/master/slave.c
+++ b/master/slave.c
@@ -124,6 +124,7 @@ int ec_slave_init(ec_slave_t *slave, /**< EtherCAT-Slave */
         slave->dl_link[i] = 0;
         slave->dl_loop[i] = 0;
         slave->dl_signal[i] = 0;
+        slave->sii_physical_layer[i] = 0xFF;
     }
 
     return 0;
@@ -619,6 +620,8 @@ int ec_slave_fetch_general(ec_slave_t *slave, /**< EtherCAT-Slave */
                            const uint8_t *data /**< Kategorie-Daten */
                            )
 {
+    unsigned int i;
+
     if (ec_slave_locate_string(slave, data[0], &slave->eeprom_group))
         return -1;
     if (ec_slave_locate_string(slave, data[1], &slave->eeprom_name))
@@ -626,6 +629,9 @@ int ec_slave_fetch_general(ec_slave_t *slave, /**< EtherCAT-Slave */
     if (ec_slave_locate_string(slave, data[3], &slave->eeprom_desc))
         return -1;
 
+    for (i = 0; i < 4; i++)
+        slave->sii_physical_layer[i] = (data[4] & (0x03 << (i * 2))) >> (i * 2);
+
     return 0;
 }
 
@@ -1011,7 +1017,22 @@ void ec_slave_print(const ec_slave_t *slave, /**< EtherCAT-Slave */
 
     EC_INFO("  Data link status:\n");
     for (i = 0; i < 4; i++) {
-        EC_INFO("    Port %i: link %s, loop %s, %s\n", i,
+        EC_INFO("    Port %i (", i);
+        switch (slave->sii_physical_layer[i]) {
+            case 0x00:
+                printk("EBUS");
+                break;
+            case 0x01:
+                printk("100BASE-TX");
+                break;
+            case 0x02:
+                printk("100BASE-FX");
+                break;
+            default:
+                printk("unknown");
+        }
+        printk(")\n");
+        EC_INFO("      link %s, loop %s, %s\n",
                 slave->dl_link[i] ? "up" : "down",
                 slave->dl_loop[i] ? "closed" : "open",
                 slave->dl_signal[i] ? "signal detected" : "no signal");
diff --git a/master/slave.h b/master/slave.h
index baf93041..468d159a 100644
--- a/master/slave.h
+++ b/master/slave.h
@@ -222,6 +222,7 @@ struct ec_slave
     uint16_t sii_tx_mailbox_offset; /**< Adresse der Mailbox (Slave->Master) */
     uint16_t sii_tx_mailbox_size; /**< Adresse der Mailbox (Slave->Master) */
     uint16_t sii_mailbox_protocols; /**< Unterstützte Mailbox-Protokolle */
+    uint8_t sii_physical_layer[4]; /**< Uebertragungsarten der Ports */
 
     const ec_slave_type_t *type; /**< Zeiger auf die Beschreibung
                                     des Slave-Typs */
-- 
GitLab