aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/qlogic/qed/qed_dev.c
diff options
context:
space:
mode:
authorTomer Tayar <Tomer.Tayar@cavium.com>2017-03-28 08:12:52 -0400
committerDavid S. Miller <davem@davemloft.net>2017-03-28 21:05:23 -0400
commit5d24bcf1895cb5095ffb9e06a219a858abaa15da (patch)
treeca89979b4b7803309065b144e56515f99710cbdf /drivers/net/ethernet/qlogic/qed/qed_dev.c
parentc0c2d0b49edc3a11627ea63d3f1e4a2d91397792 (diff)
qed: Move to new load request scheme
Management firmware is used as an arbiter between the various PFs in regard to loading - it causes the various PFs to load/unload sequentially and informs each of its appropriate rule in the init. But the existing flow is too weak to handle some scenarios where PFs aren't properly cleaned prior to loading. The significant scenarios falling under this criteria: a. Preboot drivers in some environment can't properly unload. b. Unexpected driver replacement [kdump, PDA]. Modern management firmware supports a more intricate loading flow, where the driver has the ability to overcome previous limitations. This moves qed into using this newer scheme. Notice new scheme is backward compatible, so new drivers would still be able to load properly on top of older management firmwares and vice versa. Signed-off-by: Tomer Tayar <Tomer.Tayar@cavium.com> Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/qlogic/qed/qed_dev.c')
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_dev.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c
index 109299833b14..759b819935e4 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
@@ -1106,8 +1106,22 @@ static void qed_reset_mb_shadow(struct qed_hwfn *p_hwfn,
1106 p_hwfn->mcp_info->mfw_mb_cur, p_hwfn->mcp_info->mfw_mb_length); 1106 p_hwfn->mcp_info->mfw_mb_cur, p_hwfn->mcp_info->mfw_mb_length);
1107} 1107}
1108 1108
1109static void
1110qed_fill_load_req_params(struct qed_load_req_params *p_load_req,
1111 struct qed_drv_load_params *p_drv_load)
1112{
1113 memset(p_load_req, 0, sizeof(*p_load_req));
1114
1115 p_load_req->drv_role = p_drv_load->is_crash_kernel ?
1116 QED_DRV_ROLE_KDUMP : QED_DRV_ROLE_OS;
1117 p_load_req->timeout_val = p_drv_load->mfw_timeout_val;
1118 p_load_req->avoid_eng_reset = p_drv_load->avoid_eng_reset;
1119 p_load_req->override_force_load = p_drv_load->override_force_load;
1120}
1121
1109int qed_hw_init(struct qed_dev *cdev, struct qed_hw_init_params *p_params) 1122int qed_hw_init(struct qed_dev *cdev, struct qed_hw_init_params *p_params)
1110{ 1123{
1124 struct qed_load_req_params load_req_params;
1111 u32 load_code, param, drv_mb_param; 1125 u32 load_code, param, drv_mb_param;
1112 bool b_default_mtu = true; 1126 bool b_default_mtu = true;
1113 struct qed_hwfn *p_hwfn; 1127 struct qed_hwfn *p_hwfn;
@@ -1145,17 +1159,21 @@ int qed_hw_init(struct qed_dev *cdev, struct qed_hw_init_params *p_params)
1145 if (rc) 1159 if (rc)
1146 return rc; 1160 return rc;
1147 1161
1148 rc = qed_mcp_load_req(p_hwfn, p_hwfn->p_main_ptt, &load_code); 1162 qed_fill_load_req_params(&load_req_params,
1163 p_params->p_drv_load_params);
1164 rc = qed_mcp_load_req(p_hwfn, p_hwfn->p_main_ptt,
1165 &load_req_params);
1149 if (rc) { 1166 if (rc) {
1150 DP_NOTICE(p_hwfn, "Failed sending LOAD_REQ command\n"); 1167 DP_NOTICE(p_hwfn, "Failed sending a LOAD_REQ command\n");
1151 return rc; 1168 return rc;
1152 } 1169 }
1153 1170
1154 qed_reset_mb_shadow(p_hwfn, p_hwfn->p_main_ptt); 1171 load_code = load_req_params.load_code;
1155
1156 DP_VERBOSE(p_hwfn, QED_MSG_SP, 1172 DP_VERBOSE(p_hwfn, QED_MSG_SP,
1157 "Load request was sent. Resp:0x%x, Load code: 0x%x\n", 1173 "Load request was sent. Load code: 0x%x\n",
1158 rc, load_code); 1174 load_code);
1175
1176 qed_reset_mb_shadow(p_hwfn, p_hwfn->p_main_ptt);
1159 1177
1160 p_hwfn->first_on_engine = (load_code == 1178 p_hwfn->first_on_engine = (load_code ==
1161 FW_MSG_CODE_DRV_LOAD_ENGINE); 1179 FW_MSG_CODE_DRV_LOAD_ENGINE);
@@ -1224,10 +1242,7 @@ int qed_hw_init(struct qed_dev *cdev, struct qed_hw_init_params *p_params)
1224 1242
1225 if (IS_PF(cdev)) { 1243 if (IS_PF(cdev)) {
1226 p_hwfn = QED_LEADING_HWFN(cdev); 1244 p_hwfn = QED_LEADING_HWFN(cdev);
1227 drv_mb_param = (FW_MAJOR_VERSION << 24) | 1245 drv_mb_param = STORM_FW_VERSION;
1228 (FW_MINOR_VERSION << 16) |
1229 (FW_REVISION_VERSION << 8) |
1230 (FW_ENGINEERING_VERSION);
1231 rc = qed_mcp_cmd(p_hwfn, p_hwfn->p_main_ptt, 1246 rc = qed_mcp_cmd(p_hwfn, p_hwfn->p_main_ptt,
1232 DRV_MSG_CODE_OV_UPDATE_STORM_FW_VER, 1247 DRV_MSG_CODE_OV_UPDATE_STORM_FW_VER,
1233 drv_mb_param, &load_code, &param); 1248 drv_mb_param, &load_code, &param);