liquidio: copperhead LED identification
authorRaghu Vatsavayi <raghu.vatsavayi@cavium.com>
Thu, 9 Aug 2018 20:54:12 +0000 (13:54 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 10 Aug 2018 21:43:46 +0000 (14:43 -0700)
Add LED identification support for liquidio TP copperhead cards.

Signed-off-by: Raghu Vatsavayi <raghu.vatsavayi@cavium.com>
Acked-by: Derek Chickles <derek.chickles@cavium.com>
Signed-off-by: Felix Manlunas <felix.manlunas@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/cavium/liquidio/lio_ethtool.c
drivers/net/ethernet/cavium/liquidio/liquidio_common.h

index 06f7449c569d5cdc03051b1f8e5617643a910406..807ea2c618774f4327e303194a5ebb2371d6bfe8 100644 (file)
@@ -857,7 +857,14 @@ static int lio_set_phys_id(struct net_device *netdev,
 {
        struct lio *lio = GET_LIO(netdev);
        struct octeon_device *oct = lio->oct_dev;
+       struct oct_link_info *linfo;
        int value, ret;
+       u32 cur_ver;
+
+       linfo = &lio->linfo;
+       cur_ver = OCT_FW_VER(oct->fw_info.ver.maj,
+                            oct->fw_info.ver.min,
+                            oct->fw_info.ver.rev);
 
        switch (state) {
        case ETHTOOL_ID_ACTIVE:
@@ -896,16 +903,22 @@ static int lio_set_phys_id(struct net_device *netdev,
                                return ret;
                } else if (oct->chip_id == OCTEON_CN23XX_PF_VID) {
                        octnet_id_active(netdev, LED_IDENTIFICATION_ON);
-
-                       /* returns 0 since updates are asynchronous */
-                       return 0;
+                       if (linfo->link.s.phy_type == LIO_PHY_PORT_TP &&
+                           cur_ver > OCT_FW_VER(1, 7, 2))
+                               return 2;
+                       else
+                               return 0;
                } else {
                        return -EINVAL;
                }
                break;
 
        case ETHTOOL_ID_ON:
-               if (oct->chip_id == OCTEON_CN66XX)
+               if (oct->chip_id == OCTEON_CN23XX_PF_VID &&
+                   linfo->link.s.phy_type == LIO_PHY_PORT_TP &&
+                   cur_ver > OCT_FW_VER(1, 7, 2))
+                       octnet_id_active(netdev, LED_IDENTIFICATION_ON);
+               else if (oct->chip_id == OCTEON_CN66XX)
                        octnet_gpio_access(netdev, VITESSE_PHY_GPIO_CFG,
                                           VITESSE_PHY_GPIO_HIGH);
                else
@@ -914,7 +927,11 @@ static int lio_set_phys_id(struct net_device *netdev,
                break;
 
        case ETHTOOL_ID_OFF:
-               if (oct->chip_id == OCTEON_CN66XX)
+               if (oct->chip_id == OCTEON_CN23XX_PF_VID &&
+                   linfo->link.s.phy_type == LIO_PHY_PORT_TP &&
+                   cur_ver > OCT_FW_VER(1, 7, 2))
+                       octnet_id_active(netdev, LED_IDENTIFICATION_OFF);
+               else if (oct->chip_id == OCTEON_CN66XX)
                        octnet_gpio_access(netdev, VITESSE_PHY_GPIO_CFG,
                                           VITESSE_PHY_GPIO_LOW);
                else
index 690424b6781ad4378a6dfdeac73325b53ec9b5ee..7407fcd338e9fd716346a607542cb4cdb3fe56bb 100644 (file)
@@ -907,6 +907,7 @@ static inline int opcode_slow_path(union octeon_rh *rh)
 #define VITESSE_PHY_GPIO_LOW      0x3
 #define LED_IDENTIFICATION_ON     0x1
 #define LED_IDENTIFICATION_OFF    0x0
+#define LIO23XX_COPPERHEAD_LED_GPIO 0x2
 
 struct oct_mdio_cmd {
        u64 op;