OSDN Git Service

qed*: Fix size of config attribute dump.
authorSudarsana Reddy Kalluru <skalluru@marvell.com>
Wed, 11 Sep 2019 11:42:50 +0000 (04:42 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 11 Sep 2019 14:15:23 +0000 (15:15 +0100)
Driver currently returns max-buf-size as size of the config attribute.
This patch incorporates changes to read this value from MFW (if available)
and provide it to the user. Also did a trivial clean up in this path.

Fixes: d44a3ced7023 ("qede: Add support for reading the config id attributes.")
Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
Signed-off-by: Ariel Elior <aelior@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qed/qed_main.c
drivers/net/ethernet/qlogic/qede/qede_ethtool.c
include/linux/qed/qed_if.h

index ac1511a..38c0ec3 100644 (file)
@@ -2300,6 +2300,31 @@ static int qed_nvm_flash_cfg_write(struct qed_dev *cdev, const u8 **data)
        return rc;
 }
 
+#define QED_MAX_NVM_BUF_LEN    32
+static int qed_nvm_flash_cfg_len(struct qed_dev *cdev, u32 cmd)
+{
+       struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev);
+       u8 buf[QED_MAX_NVM_BUF_LEN];
+       struct qed_ptt *ptt;
+       u32 len;
+       int rc;
+
+       ptt = qed_ptt_acquire(hwfn);
+       if (!ptt)
+               return QED_MAX_NVM_BUF_LEN;
+
+       rc = qed_mcp_nvm_get_cfg(hwfn, ptt, cmd, 0, QED_NVM_CFG_GET_FLAGS, buf,
+                                &len);
+       if (rc || !len) {
+               DP_ERR(cdev, "Error %d reading %d\n", rc, cmd);
+               len = QED_MAX_NVM_BUF_LEN;
+       }
+
+       qed_ptt_release(hwfn, ptt);
+
+       return len;
+}
+
 static int qed_nvm_flash_cfg_read(struct qed_dev *cdev, u8 **data,
                                  u32 cmd, u32 entity_id)
 {
@@ -2657,6 +2682,7 @@ const struct qed_common_ops qed_common_ops_pass = {
        .read_module_eeprom = &qed_read_module_eeprom,
        .get_affin_hwfn_idx = &qed_get_affin_hwfn_idx,
        .read_nvm_cfg = &qed_nvm_flash_cfg_read,
+       .read_nvm_cfg_len = &qed_nvm_flash_cfg_len,
        .set_grc_config = &qed_set_grc_config,
 };
 
index ec27a43..8a426af 100644 (file)
@@ -49,7 +49,6 @@
 
 #define QEDE_SELFTEST_POLL_COUNT 100
 #define QEDE_DUMP_VERSION      0x1
-#define QEDE_DUMP_NVM_BUF_LEN  32
 #define QEDE_DUMP_NVM_ARG_COUNT        2
 
 static const struct {
@@ -2026,7 +2025,8 @@ static int qede_get_dump_flag(struct net_device *dev,
        switch (edev->dump_info.cmd) {
        case QEDE_DUMP_CMD_NVM_CFG:
                dump->flag = QEDE_DUMP_CMD_NVM_CFG;
-               dump->len = QEDE_DUMP_NVM_BUF_LEN;
+               dump->len = edev->ops->common->read_nvm_cfg_len(edev->cdev,
+                                               edev->dump_info.args[0]);
                break;
        case QEDE_DUMP_CMD_GRCDUMP:
                dump->flag = QEDE_DUMP_CMD_GRCDUMP;
@@ -2051,9 +2051,8 @@ static int qede_get_dump_data(struct net_device *dev,
 
        if (!edev->ops || !edev->ops->common) {
                DP_ERR(edev, "Edev ops not populated\n");
-               edev->dump_info.cmd = QEDE_DUMP_CMD_NONE;
-               edev->dump_info.num_args = 0;
-               return -EINVAL;
+               rc = -EINVAL;
+               goto err;
        }
 
        switch (edev->dump_info.cmd) {
@@ -2062,7 +2061,8 @@ static int qede_get_dump_data(struct net_device *dev,
                        DP_ERR(edev, "Arg count = %d required = %d\n",
                               edev->dump_info.num_args,
                               QEDE_DUMP_NVM_ARG_COUNT);
-                       return -EINVAL;
+                       rc = -EINVAL;
+                       goto err;
                }
                rc =  edev->ops->common->read_nvm_cfg(edev->cdev, (u8 **)&buf,
                                                      edev->dump_info.args[0],
@@ -2078,8 +2078,10 @@ static int qede_get_dump_data(struct net_device *dev,
                break;
        }
 
+err:
        edev->dump_info.cmd = QEDE_DUMP_CMD_NONE;
        edev->dump_info.num_args = 0;
+       memset(edev->dump_info.args, 0, sizeof(edev->dump_info.args));
 
        return rc;
 }
index e354638..b5db1ee 100644 (file)
@@ -1143,6 +1143,14 @@ struct qed_common_ops {
  */
        int (*read_nvm_cfg)(struct qed_dev *cdev, u8 **buf, u32 cmd,
                            u32 entity_id);
+/**
+ * @brief read_nvm_cfg - Read NVM config attribute value.
+ * @param cdev
+ * @param cmd - NVM CFG command id
+ *
+ * @return config id length, 0 on error.
+ */
+       int (*read_nvm_cfg_len)(struct qed_dev *cdev, u32 cmd);
 
 /**
  * @brief set_grc_config - Configure value for grc config id.