]> git.droids-corp.org - dpdk.git/commitdiff
net/ice: send driver version to firmware
authorQi Zhang <qi.z.zhang@intel.com>
Fri, 29 Mar 2019 01:29:53 +0000 (09:29 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 5 Apr 2019 15:45:22 +0000 (17:45 +0200)
The driver must send its version information to the firmware, so
the firmware knows the driver is up. Otherwise, it will cause unexpected
OS package downloading when multiple driver instances running on the
same device.

Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
Acked-by: Qiming Yang <qiming.yang@intel.com>
drivers/net/ice/base/ice_adminq_cmd.h
drivers/net/ice/base/ice_common.c
drivers/net/ice/base/ice_common.h
drivers/net/ice/base/ice_type.h
drivers/net/ice/ice_ethdev.c

index d2ab9eeff59c9680b6d637f68c179e1d5e9a56f8..bbdca83fc8bb774385dd85eb8cc1f2dadbc7f55c 100644 (file)
@@ -38,6 +38,17 @@ struct ice_aqc_get_ver {
 };
 
 
+/* Send driver version (indirect 0x0002) */
+struct ice_aqc_driver_ver {
+       u8 major_ver;
+       u8 minor_ver;
+       u8 build_ver;
+       u8 subbuild_ver;
+       u8 reserved[4];
+       __le32 addr_high;
+       __le32 addr_low;
+};
+
 
 /* Queue Shutdown (direct 0x0003) */
 struct ice_aqc_q_shutdown {
@@ -2182,6 +2193,7 @@ struct ice_aq_desc {
                u8 raw[16];
                struct ice_aqc_generic generic;
                struct ice_aqc_get_ver get_ver;
+               struct ice_aqc_driver_ver driver_ver;
                struct ice_aqc_q_shutdown q_shutdown;
                struct ice_aqc_req_res res_owner;
                struct ice_aqc_manage_mac_read mac_read;
index 3d2e5f3478eb2235b81d8951df74e3046b4a746a..c74e4e1d4b059fb6486de99602d086c741838de4 100644 (file)
@@ -1512,6 +1512,42 @@ enum ice_status ice_aq_get_fw_ver(struct ice_hw *hw, struct ice_sq_cd *cd)
        return status;
 }
 
+/**
+ * ice_aq_send_driver_ver
+ * @hw: pointer to the HW struct
+ * @dv: driver's major, minor version
+ * @cd: pointer to command details structure or NULL
+ *
+ * Send the driver version (0x0002) to the firmware
+ */
+enum ice_status
+ice_aq_send_driver_ver(struct ice_hw *hw, struct ice_driver_ver *dv,
+                      struct ice_sq_cd *cd)
+{
+       struct ice_aqc_driver_ver *cmd;
+       struct ice_aq_desc desc;
+       u16 len;
+
+       cmd = &desc.params.driver_ver;
+
+       if (!dv)
+               return ICE_ERR_PARAM;
+
+       ice_fill_dflt_direct_cmd_desc(&desc, ice_aqc_opc_driver_ver);
+
+       desc.flags |= CPU_TO_LE16(ICE_AQ_FLAG_RD);
+       cmd->major_ver = dv->major_ver;
+       cmd->minor_ver = dv->minor_ver;
+       cmd->build_ver = dv->build_ver;
+       cmd->subbuild_ver = dv->subbuild_ver;
+
+       len = 0;
+       while (len < sizeof(dv->driver_string) &&
+              IS_ASCII(dv->driver_string[len]) && dv->driver_string[len])
+               len++;
+
+       return ice_aq_send_cmd(hw, &desc, dv->driver_string, len, cd);
+}
 
 /**
  * ice_aq_q_shutdown
index e8f2ce9d8cc148571c07e23e0836f001cb5cb84b..58c66fdc00f4d8a610af80650f51dfa7dd238109 100644 (file)
@@ -118,6 +118,9 @@ ice_aq_send_cmd(struct ice_hw *hw, struct ice_aq_desc *desc,
                void *buf, u16 buf_size, struct ice_sq_cd *cd);
 enum ice_status ice_aq_get_fw_ver(struct ice_hw *hw, struct ice_sq_cd *cd);
 
+enum ice_status
+ice_aq_send_driver_ver(struct ice_hw *hw, struct ice_driver_ver *dv,
+                      struct ice_sq_cd *cd);
 enum ice_status
 ice_aq_get_phy_caps(struct ice_port_info *pi, bool qual_mods, u8 report_mode,
                    struct ice_aqc_get_phy_caps_data *caps,
index b0bdec2dfff06becead005a6377a9120f1b338b4..e4979b832bbe0ef191adf222a83315a93326e672 100644 (file)
 #define MIN_T(_t, _a, _b)      min((_t)(_a), (_t)(_b))
 #endif
 
+#ifndef IS_ASCII
+#define IS_ASCII(_ch)  ((_ch) < 0x80)
+#endif
+
 #include "ice_status.h"
 #include "ice_hw_autogen.h"
 #include "ice_devids.h"
index a06ebdadf6417b080302b224a96a2889915f4b48..9d0101870d10a9db1344f2e7d3c391540a1c93f3 100644 (file)
@@ -1244,6 +1244,21 @@ fail_mem:
        return NULL;
 }
 
+static int
+ice_send_driver_ver(struct ice_hw *hw)
+{
+       struct ice_driver_ver dv;
+
+       /* we don't have driver version use 0 for dummy */
+       dv.major_ver = 0;
+       dv.minor_ver = 0;
+       dv.build_ver = 0;
+       dv.subbuild_ver = 0;
+       strncpy((char *)dv.driver_string, "dpdk", sizeof(dv.driver_string));
+
+       return ice_aq_send_driver_ver(hw, &dv, NULL);
+}
+
 static int
 ice_pf_setup(struct ice_pf *pf)
 {
@@ -1402,6 +1417,12 @@ ice_dev_init(struct rte_eth_dev *dev)
                goto err_pf_setup;
        }
 
+       ret = ice_send_driver_ver(hw);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "Failed to send driver version");
+               goto err_pf_setup;
+       }
+
        vsi = pf->main_vsi;
 
        /* Disable double vlan by default */