Print this page
6064 ixgbe needs X550 support

@@ -24,10 +24,11 @@
  */
 
 /*
  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
+ * Copyright 2016 OmniTI Computer Consulting, Inc. All rights reserved.
  */
 
 #include "ixgbe_sw.h"
 
 /*

@@ -112,10 +113,12 @@
                             IXGBE_READ_REG(hw, IXGBE_QBTC(i));
                         break;
 
                 case ixgbe_mac_82599EB:
                 case ixgbe_mac_X540:
+                case ixgbe_mac_X550:
+                case ixgbe_mac_X550EM_x:
                         ixgbe_ks->qbtc[i].value.ui64 +=
                             IXGBE_READ_REG(hw, IXGBE_QBTC_L(i));
                         ixgbe_ks->qbtc[i].value.ui64 +=
                             ((uint64_t)((IXGBE_READ_REG(hw,
                             IXGBE_QBTC_H(i))) & 0xF) << 32);

@@ -166,10 +169,12 @@
                     IXGBE_LXONRXC);
                 break;
 
         case ixgbe_mac_82599EB:
         case ixgbe_mac_X540:
+        case ixgbe_mac_X550:
+        case ixgbe_mac_X550EM_x:
                 ixgbe_ks->lxonrxc.value.ui64 += IXGBE_READ_REG(hw,
                     IXGBE_LXONRXCNT);
                 break;
 
         default:

@@ -182,10 +187,12 @@
                     IXGBE_LXOFFRXC);
                 break;
 
         case ixgbe_mac_82599EB:
         case ixgbe_mac_X540:
+        case ixgbe_mac_X550:
+        case ixgbe_mac_X550EM_x:
                 ixgbe_ks->lxoffrxc.value.ui64 += IXGBE_READ_REG(hw,
                     IXGBE_LXOFFRXCNT);
                 break;
 
         default:

@@ -475,15 +482,26 @@
 {
         ixgbe_t *ixgbe = (ixgbe_t *)arg;
         struct ixgbe_hw *hw = &ixgbe->hw;
         ixgbe_stat_t *ixgbe_ks;
         int i;
+        ixgbe_link_speed speeds = 0;
 
         ixgbe_ks = (ixgbe_stat_t *)ixgbe->ixgbe_ks->ks_data;
 
         mutex_enter(&ixgbe->gen_lock);
 
+        /*
+         * We cannot always rely on the common code maintaining
+         * hw->phy.speeds_supported, therefore we fall back to use the recorded
+         * supported speeds which were obtained during instance init in
+         * ixgbe_init_params().
+         */
+        speeds = hw->phy.speeds_supported;
+        if (speeds == 0)
+                speeds = ixgbe->speeds_supported;
+
         if (ixgbe->ixgbe_state & IXGBE_SUSPENDED) {
                 mutex_exit(&ixgbe->gen_lock);
                 return (ECANCELED);
         }
 

@@ -559,10 +577,12 @@
                                     IXGBE_READ_REG(hw, IXGBE_QBTC(i));
                                 break;
 
                         case ixgbe_mac_82599EB:
                         case ixgbe_mac_X540:
+                        case ixgbe_mac_X550:
+                        case ixgbe_mac_X550EM_x:
                                 ixgbe_ks->qbtc[i].value.ui64 +=
                                     IXGBE_READ_REG(hw, IXGBE_QBTC_L(i));
                                 ixgbe_ks->qbtc[i].value.ui64 +=
                                     ((uint64_t)((IXGBE_READ_REG(hw,
                                     IXGBE_QBTC_H(i))) & 0xF) << 32);

@@ -643,19 +663,27 @@
                         break;
                 }
                 break;
 
         case ETHER_STAT_CAP_10GFDX:
-                *val = 1;
+                *val = (speeds & IXGBE_LINK_SPEED_10GB_FULL) ? 1 : 0;
                 break;
 
+        case ETHER_STAT_CAP_5000FDX:
+                *val = (speeds & IXGBE_LINK_SPEED_5GB_FULL) ? 1 : 0;
+                break;
+
+        case ETHER_STAT_CAP_2500FDX:
+                *val = (speeds & IXGBE_LINK_SPEED_2_5GB_FULL) ? 1 : 0;
+                break;
+
         case ETHER_STAT_CAP_1000FDX:
-                *val = 1;
+                *val = (speeds & IXGBE_LINK_SPEED_1GB_FULL) ? 1 : 0;
                 break;
 
         case ETHER_STAT_CAP_100FDX:
-                *val = 1;
+                *val = (speeds & IXGBE_LINK_SPEED_100_FULL) ? 1 : 0;
                 break;
 
         case ETHER_STAT_CAP_ASMPAUSE:
                 *val = ixgbe->param_asym_pause_cap;
                 break;

@@ -670,10 +698,18 @@
 
         case ETHER_STAT_ADV_CAP_10GFDX:
                 *val = ixgbe->param_adv_10000fdx_cap;
                 break;
 
+        case ETHER_STAT_ADV_CAP_5000FDX:
+                *val = ixgbe->param_adv_5000fdx_cap;
+                break;
+
+        case ETHER_STAT_ADV_CAP_2500FDX:
+                *val = ixgbe->param_adv_2500fdx_cap;
+                break;
+
         case ETHER_STAT_ADV_CAP_1000FDX:
                 *val = ixgbe->param_adv_1000fdx_cap;
                 break;
 
         case ETHER_STAT_ADV_CAP_100FDX:

@@ -694,10 +730,18 @@
 
         case ETHER_STAT_LP_CAP_10GFDX:
                 *val = ixgbe->param_lp_10000fdx_cap;
                 break;
 
+        case ETHER_STAT_LP_CAP_5000FDX:
+                *val = ixgbe->param_lp_5000fdx_cap;
+                break;
+
+        case ETHER_STAT_LP_CAP_2500FDX:
+                *val = ixgbe->param_lp_2500fdx_cap;
+                break;
+
         case ETHER_STAT_LP_CAP_1000FDX:
                 *val = ixgbe->param_lp_1000fdx_cap;
                 break;
 
         case ETHER_STAT_LP_CAP_100FDX: