be2net: Enable VF link state setting for BE3
[cascardo/linux.git] / drivers / net / ethernet / emulex / benet / be_cmds.c
index 9cffe48..1fb5d72 100644 (file)
@@ -2728,6 +2728,26 @@ static int be_flash(struct be_adapter *adapter, const u8 *img,
        return 0;
 }
 
+#define NCSI_UPDATE_LOG        "NCSI section update is not supported in FW ver %s\n"
+static bool be_fw_ncsi_supported(char *ver)
+{
+       int v1[4] = {3, 102, 148, 0}; /* Min ver that supports NCSI FW */
+       int v2[4];
+       int i;
+
+       if (sscanf(ver, "%d.%d.%d.%d", &v2[0], &v2[1], &v2[2], &v2[3]) != 4)
+               return false;
+
+       for (i = 0; i < 4; i++) {
+               if (v1[i] < v2[i])
+                       return true;
+               else if (v1[i] > v2[i])
+                       return false;
+       }
+
+       return true;
+}
+
 /* For BE2, BE3 and BE3-R */
 static int be_flash_BEx(struct be_adapter *adapter,
                        const struct firmware *fw,
@@ -2805,8 +2825,10 @@ static int be_flash_BEx(struct be_adapter *adapter,
                        continue;
 
                if ((pflashcomp[i].optype == OPTYPE_NCSI_FW) &&
-                   memcmp(adapter->fw_ver, "3.102.148.0", 11) < 0)
+                   !be_fw_ncsi_supported(adapter->fw_ver)) {
+                       dev_info(dev, NCSI_UPDATE_LOG, adapter->fw_ver);
                        continue;
+               }
 
                if (pflashcomp[i].optype == OPTYPE_PHY_FW  &&
                    !phy_flashing_required(adapter))
@@ -3527,6 +3549,11 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
                for (i = 0; i < CNTL_SERIAL_NUM_WORDS; i++)
                        adapter->serial_num[i] = le32_to_cpu(serial_num[i]) &
                                (BIT_MASK(16) - 1);
+               /* For BEx, since GET_FUNC_CONFIG command is not
+                * supported, we read funcnum here as a workaround.
+                */
+               if (BEx_chip(adapter))
+                       adapter->pf_num = attribs->hba_attribs.pci_funcnum;
        }
 
 err:
@@ -4950,7 +4977,7 @@ int be_cmd_set_logical_link_config(struct be_adapter *adapter,
 {
        int status;
 
-       if (BEx_chip(adapter))
+       if (BE2_chip(adapter))
                return -EOPNOTSUPP;
 
        status = __be_cmd_set_logical_link_config(adapter, link_state,