Commit bbf33d1d authored by Edwin Peer's avatar Edwin Peer Committed by David S. Miller

bnxt_en: update all firmware calls to use the new APIs

The conversion follows this general pattern for most of the calls:

1. The input message is changed from a stack variable initialized
using bnxt_hwrm_cmd_hdr_init() to a pointer allocated and intialized
using hwrm_req_init().

2. If we don't need to read the firmware response, the hwrm_send_message()
call is replaced with hwrm_req_send().

3. If we need to read the firmware response, the mutex lock is replaced
by hwrm_req_hold() to hold the response.  When the response is read, the
mutex unlock is replaced by hwrm_req_drop().

If additional DMA buffers are needed for firmware response data, the
hwrm_req_dma_slice() is used instead of calling dma_alloc_coherent().

Some minor refactoring is also done while doing these conversions.

v2: Fix unintialized variable warnings in __bnxt_hwrm_get_tx_rings()
and bnxt_approve_mac()
Signed-off-by: default avatarEdwin Peer <edwin.peer@broadcom.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3c10ed49
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -355,28 +355,34 @@ static void bnxt_copy_from_nvm_data(union devlink_param_value *dst, ...@@ -355,28 +355,34 @@ static void bnxt_copy_from_nvm_data(union devlink_param_value *dst,
static int bnxt_hwrm_get_nvm_cfg_ver(struct bnxt *bp, static int bnxt_hwrm_get_nvm_cfg_ver(struct bnxt *bp,
union devlink_param_value *nvm_cfg_ver) union devlink_param_value *nvm_cfg_ver)
{ {
struct hwrm_nvm_get_variable_input req = {0}; struct hwrm_nvm_get_variable_input *req;
union bnxt_nvm_data *data; union bnxt_nvm_data *data;
dma_addr_t data_dma_addr; dma_addr_t data_dma_addr;
int rc; int rc;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_GET_VARIABLE, -1, -1); rc = hwrm_req_init(bp, req, HWRM_NVM_GET_VARIABLE);
data = dma_alloc_coherent(&bp->pdev->dev, sizeof(*data), if (rc)
&data_dma_addr, GFP_KERNEL); return rc;
if (!data)
return -ENOMEM; data = hwrm_req_dma_slice(bp, req, sizeof(*data), &data_dma_addr);
if (!data) {
rc = -ENOMEM;
goto exit;
}
req.dest_data_addr = cpu_to_le64(data_dma_addr); hwrm_req_hold(bp, req);
req.data_len = cpu_to_le16(BNXT_NVM_CFG_VER_BITS); req->dest_data_addr = cpu_to_le64(data_dma_addr);
req.option_num = cpu_to_le16(NVM_OFF_NVM_CFG_VER); req->data_len = cpu_to_le16(BNXT_NVM_CFG_VER_BITS);
req->option_num = cpu_to_le16(NVM_OFF_NVM_CFG_VER);
rc = hwrm_send_message_silent(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); rc = hwrm_req_send_silent(bp, req);
if (!rc) if (!rc)
bnxt_copy_from_nvm_data(nvm_cfg_ver, data, bnxt_copy_from_nvm_data(nvm_cfg_ver, data,
BNXT_NVM_CFG_VER_BITS, BNXT_NVM_CFG_VER_BITS,
BNXT_NVM_CFG_VER_BYTES); BNXT_NVM_CFG_VER_BYTES);
dma_free_coherent(&bp->pdev->dev, sizeof(*data), data, data_dma_addr); exit:
hwrm_req_drop(bp, req);
return rc; return rc;
} }
...@@ -563,17 +569,20 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req, ...@@ -563,17 +569,20 @@ static int bnxt_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
} }
static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg, static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
int msg_len, union devlink_param_value *val) union devlink_param_value *val)
{ {
struct hwrm_nvm_get_variable_input *req = msg; struct hwrm_nvm_get_variable_input *req = msg;
struct bnxt_dl_nvm_param nvm_param; struct bnxt_dl_nvm_param nvm_param;
struct hwrm_err_output *resp;
union bnxt_nvm_data *data; union bnxt_nvm_data *data;
dma_addr_t data_dma_addr; dma_addr_t data_dma_addr;
int idx = 0, rc, i; int idx = 0, rc, i;
/* Get/Set NVM CFG parameter is supported only on PFs */ /* Get/Set NVM CFG parameter is supported only on PFs */
if (BNXT_VF(bp)) if (BNXT_VF(bp)) {
hwrm_req_drop(bp, req);
return -EPERM; return -EPERM;
}
for (i = 0; i < ARRAY_SIZE(nvm_params); i++) { for (i = 0; i < ARRAY_SIZE(nvm_params); i++) {
if (nvm_params[i].id == param_id) { if (nvm_params[i].id == param_id) {
...@@ -582,18 +591,22 @@ static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg, ...@@ -582,18 +591,22 @@ static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
} }
} }
if (i == ARRAY_SIZE(nvm_params)) if (i == ARRAY_SIZE(nvm_params)) {
hwrm_req_drop(bp, req);
return -EOPNOTSUPP; return -EOPNOTSUPP;
}
if (nvm_param.dir_type == BNXT_NVM_PORT_CFG) if (nvm_param.dir_type == BNXT_NVM_PORT_CFG)
idx = bp->pf.port_id; idx = bp->pf.port_id;
else if (nvm_param.dir_type == BNXT_NVM_FUNC_CFG) else if (nvm_param.dir_type == BNXT_NVM_FUNC_CFG)
idx = bp->pf.fw_fid - BNXT_FIRST_PF_FID; idx = bp->pf.fw_fid - BNXT_FIRST_PF_FID;
data = dma_alloc_coherent(&bp->pdev->dev, sizeof(*data), data = hwrm_req_dma_slice(bp, req, sizeof(*data), &data_dma_addr);
&data_dma_addr, GFP_KERNEL);
if (!data) if (!data) {
hwrm_req_drop(bp, req);
return -ENOMEM; return -ENOMEM;
}
req->dest_data_addr = cpu_to_le64(data_dma_addr); req->dest_data_addr = cpu_to_le64(data_dma_addr);
req->data_len = cpu_to_le16(nvm_param.nvm_num_bits); req->data_len = cpu_to_le16(nvm_param.nvm_num_bits);
...@@ -602,26 +615,24 @@ static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg, ...@@ -602,26 +615,24 @@ static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
if (idx) if (idx)
req->dimensions = cpu_to_le16(1); req->dimensions = cpu_to_le16(1);
resp = hwrm_req_hold(bp, req);
if (req->req_type == cpu_to_le16(HWRM_NVM_SET_VARIABLE)) { if (req->req_type == cpu_to_le16(HWRM_NVM_SET_VARIABLE)) {
bnxt_copy_to_nvm_data(data, val, nvm_param.nvm_num_bits, bnxt_copy_to_nvm_data(data, val, nvm_param.nvm_num_bits,
nvm_param.dl_num_bytes); nvm_param.dl_num_bytes);
rc = hwrm_send_message(bp, msg, msg_len, HWRM_CMD_TIMEOUT); rc = hwrm_req_send(bp, msg);
} else { } else {
rc = hwrm_send_message_silent(bp, msg, msg_len, rc = hwrm_req_send_silent(bp, msg);
HWRM_CMD_TIMEOUT);
if (!rc) { if (!rc) {
bnxt_copy_from_nvm_data(val, data, bnxt_copy_from_nvm_data(val, data,
nvm_param.nvm_num_bits, nvm_param.nvm_num_bits,
nvm_param.dl_num_bytes); nvm_param.dl_num_bytes);
} else { } else {
struct hwrm_err_output *resp = bp->hwrm_cmd_resp_addr;
if (resp->cmd_err == if (resp->cmd_err ==
NVM_GET_VARIABLE_CMD_ERR_CODE_VAR_NOT_EXIST) NVM_GET_VARIABLE_CMD_ERR_CODE_VAR_NOT_EXIST)
rc = -EOPNOTSUPP; rc = -EOPNOTSUPP;
} }
} }
dma_free_coherent(&bp->pdev->dev, sizeof(*data), data, data_dma_addr); hwrm_req_drop(bp, req);
if (rc == -EACCES) if (rc == -EACCES)
netdev_err(bp->dev, "PF does not have admin privileges to modify NVM config\n"); netdev_err(bp->dev, "PF does not have admin privileges to modify NVM config\n");
return rc; return rc;
...@@ -630,15 +641,17 @@ static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg, ...@@ -630,15 +641,17 @@ static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
static int bnxt_dl_nvm_param_get(struct devlink *dl, u32 id, static int bnxt_dl_nvm_param_get(struct devlink *dl, u32 id,
struct devlink_param_gset_ctx *ctx) struct devlink_param_gset_ctx *ctx)
{ {
struct hwrm_nvm_get_variable_input req = {0};
struct bnxt *bp = bnxt_get_bp_from_dl(dl); struct bnxt *bp = bnxt_get_bp_from_dl(dl);
struct hwrm_nvm_get_variable_input *req;
int rc; int rc;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_GET_VARIABLE, -1, -1); rc = hwrm_req_init(bp, req, HWRM_NVM_GET_VARIABLE);
rc = bnxt_hwrm_nvm_req(bp, id, &req, sizeof(req), &ctx->val); if (rc)
if (!rc) return rc;
if (id == BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK)
ctx->val.vbool = !ctx->val.vbool; rc = bnxt_hwrm_nvm_req(bp, id, req, &ctx->val);
if (!rc && id == BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK)
ctx->val.vbool = !ctx->val.vbool;
return rc; return rc;
} }
...@@ -646,15 +659,18 @@ static int bnxt_dl_nvm_param_get(struct devlink *dl, u32 id, ...@@ -646,15 +659,18 @@ static int bnxt_dl_nvm_param_get(struct devlink *dl, u32 id,
static int bnxt_dl_nvm_param_set(struct devlink *dl, u32 id, static int bnxt_dl_nvm_param_set(struct devlink *dl, u32 id,
struct devlink_param_gset_ctx *ctx) struct devlink_param_gset_ctx *ctx)
{ {
struct hwrm_nvm_set_variable_input req = {0};
struct bnxt *bp = bnxt_get_bp_from_dl(dl); struct bnxt *bp = bnxt_get_bp_from_dl(dl);
struct hwrm_nvm_set_variable_input *req;
int rc;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_NVM_SET_VARIABLE, -1, -1); rc = hwrm_req_init(bp, req, HWRM_NVM_SET_VARIABLE);
if (rc)
return rc;
if (id == BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK) if (id == BNXT_DEVLINK_PARAM_ID_GRE_VER_CHECK)
ctx->val.vbool = !ctx->val.vbool; ctx->val.vbool = !ctx->val.vbool;
return bnxt_hwrm_nvm_req(bp, id, &req, sizeof(req), &ctx->val); return bnxt_hwrm_nvm_req(bp, id, req, &ctx->val);
} }
static int bnxt_dl_msix_validate(struct devlink *dl, u32 id, static int bnxt_dl_msix_validate(struct devlink *dl, u32 id,
......
...@@ -86,24 +86,28 @@ static void bnxt_ptp_get_current_time(struct bnxt *bp) ...@@ -86,24 +86,28 @@ static void bnxt_ptp_get_current_time(struct bnxt *bp)
static int bnxt_hwrm_port_ts_query(struct bnxt *bp, u32 flags, u64 *ts) static int bnxt_hwrm_port_ts_query(struct bnxt *bp, u32 flags, u64 *ts)
{ {
struct hwrm_port_ts_query_output *resp = bp->hwrm_cmd_resp_addr; struct hwrm_port_ts_query_output *resp;
struct hwrm_port_ts_query_input req = {0}; struct hwrm_port_ts_query_input *req;
int rc; int rc;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_PORT_TS_QUERY, -1, -1); rc = hwrm_req_init(bp, req, HWRM_PORT_TS_QUERY);
req.flags = cpu_to_le32(flags); if (rc)
return rc;
req->flags = cpu_to_le32(flags);
if ((flags & PORT_TS_QUERY_REQ_FLAGS_PATH) == if ((flags & PORT_TS_QUERY_REQ_FLAGS_PATH) ==
PORT_TS_QUERY_REQ_FLAGS_PATH_TX) { PORT_TS_QUERY_REQ_FLAGS_PATH_TX) {
req.enables = cpu_to_le16(BNXT_PTP_QTS_TX_ENABLES); req->enables = cpu_to_le16(BNXT_PTP_QTS_TX_ENABLES);
req.ptp_seq_id = cpu_to_le32(bp->ptp_cfg->tx_seqid); req->ptp_seq_id = cpu_to_le32(bp->ptp_cfg->tx_seqid);
req.ptp_hdr_offset = cpu_to_le16(bp->ptp_cfg->tx_hdr_off); req->ptp_hdr_offset = cpu_to_le16(bp->ptp_cfg->tx_hdr_off);
req.ts_req_timeout = cpu_to_le16(BNXT_PTP_QTS_TIMEOUT); req->ts_req_timeout = cpu_to_le16(BNXT_PTP_QTS_TIMEOUT);
} }
mutex_lock(&bp->hwrm_cmd_lock); resp = hwrm_req_hold(bp, req);
rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
rc = hwrm_req_send(bp, req);
if (!rc) if (!rc)
*ts = le64_to_cpu(resp->ptp_msg_ts); *ts = le64_to_cpu(resp->ptp_msg_ts);
mutex_unlock(&bp->hwrm_cmd_lock); hwrm_req_drop(bp, req);
return rc; return rc;
} }
...@@ -144,14 +148,17 @@ static int bnxt_ptp_adjfreq(struct ptp_clock_info *ptp_info, s32 ppb) ...@@ -144,14 +148,17 @@ static int bnxt_ptp_adjfreq(struct ptp_clock_info *ptp_info, s32 ppb)
{ {
struct bnxt_ptp_cfg *ptp = container_of(ptp_info, struct bnxt_ptp_cfg, struct bnxt_ptp_cfg *ptp = container_of(ptp_info, struct bnxt_ptp_cfg,
ptp_info); ptp_info);
struct hwrm_port_mac_cfg_input req = {0}; struct hwrm_port_mac_cfg_input *req;
struct bnxt *bp = ptp->bp; struct bnxt *bp = ptp->bp;
int rc; int rc;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_PORT_MAC_CFG, -1, -1); rc = hwrm_req_init(bp, req, HWRM_PORT_MAC_CFG);
req.ptp_freq_adj_ppb = cpu_to_le32(ppb); if (rc)
req.enables = cpu_to_le32(PORT_MAC_CFG_REQ_ENABLES_PTP_FREQ_ADJ_PPB); return rc;
rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
req->ptp_freq_adj_ppb = cpu_to_le32(ppb);
req->enables = cpu_to_le32(PORT_MAC_CFG_REQ_ENABLES_PTP_FREQ_ADJ_PPB);
rc = hwrm_req_send(ptp->bp, req);
if (rc) if (rc)
netdev_err(ptp->bp->dev, netdev_err(ptp->bp->dev,
"ptp adjfreq failed. rc = %d\n", rc); "ptp adjfreq failed. rc = %d\n", rc);
...@@ -187,7 +194,7 @@ void bnxt_ptp_pps_event(struct bnxt *bp, u32 data1, u32 data2) ...@@ -187,7 +194,7 @@ void bnxt_ptp_pps_event(struct bnxt *bp, u32 data1, u32 data2)
static int bnxt_ptp_cfg_pin(struct bnxt *bp, u8 pin, u8 usage) static int bnxt_ptp_cfg_pin(struct bnxt *bp, u8 pin, u8 usage)
{ {
struct hwrm_func_ptp_pin_cfg_input req = {0}; struct hwrm_func_ptp_pin_cfg_input *req;
struct bnxt_ptp_cfg *ptp = bp->ptp_cfg; struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
u8 state = usage != BNXT_PPS_PIN_NONE; u8 state = usage != BNXT_PPS_PIN_NONE;
u8 *pin_state, *pin_usg; u8 *pin_state, *pin_usg;
...@@ -199,18 +206,21 @@ static int bnxt_ptp_cfg_pin(struct bnxt *bp, u8 pin, u8 usage) ...@@ -199,18 +206,21 @@ static int bnxt_ptp_cfg_pin(struct bnxt *bp, u8 pin, u8 usage)
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_PTP_PIN_CFG, -1, -1); rc = hwrm_req_init(ptp->bp, req, HWRM_FUNC_PTP_PIN_CFG);
if (rc)
return rc;
enables = (FUNC_PTP_PIN_CFG_REQ_ENABLES_PIN0_STATE | enables = (FUNC_PTP_PIN_CFG_REQ_ENABLES_PIN0_STATE |
FUNC_PTP_PIN_CFG_REQ_ENABLES_PIN0_USAGE) << (pin * 2); FUNC_PTP_PIN_CFG_REQ_ENABLES_PIN0_USAGE) << (pin * 2);
req.enables = cpu_to_le32(enables); req->enables = cpu_to_le32(enables);
pin_state = &req.pin0_state; pin_state = &req->pin0_state;
pin_usg = &req.pin0_usage; pin_usg = &req->pin0_usage;
*(pin_state + (pin * 2)) = state; *(pin_state + (pin * 2)) = state;
*(pin_usg + (pin * 2)) = usage; *(pin_usg + (pin * 2)) = usage;
rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); rc = hwrm_req_send(ptp->bp, req);
if (rc) if (rc)
return rc; return rc;
...@@ -222,12 +232,16 @@ static int bnxt_ptp_cfg_pin(struct bnxt *bp, u8 pin, u8 usage) ...@@ -222,12 +232,16 @@ static int bnxt_ptp_cfg_pin(struct bnxt *bp, u8 pin, u8 usage)
static int bnxt_ptp_cfg_event(struct bnxt *bp, u8 event) static int bnxt_ptp_cfg_event(struct bnxt *bp, u8 event)
{ {
struct hwrm_func_ptp_cfg_input req = {0}; struct hwrm_func_ptp_cfg_input *req;
int rc;
rc = hwrm_req_init(bp, req, HWRM_FUNC_PTP_CFG);
if (rc)
return rc;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_PTP_CFG, -1, -1); req->enables = cpu_to_le16(FUNC_PTP_CFG_REQ_ENABLES_PTP_PPS_EVENT);
req.enables = cpu_to_le16(FUNC_PTP_CFG_REQ_ENABLES_PTP_PPS_EVENT); req->ptp_pps_event = event;
req.ptp_pps_event = event; return hwrm_req_send(bp, req);
return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
} }
void bnxt_ptp_reapply_pps(struct bnxt *bp) void bnxt_ptp_reapply_pps(struct bnxt *bp)
...@@ -278,7 +292,7 @@ static int bnxt_get_target_cycles(struct bnxt_ptp_cfg *ptp, u64 target_ns, ...@@ -278,7 +292,7 @@ static int bnxt_get_target_cycles(struct bnxt_ptp_cfg *ptp, u64 target_ns,
static int bnxt_ptp_perout_cfg(struct bnxt_ptp_cfg *ptp, static int bnxt_ptp_perout_cfg(struct bnxt_ptp_cfg *ptp,
struct ptp_clock_request *rq) struct ptp_clock_request *rq)
{ {
struct hwrm_func_ptp_cfg_input req = {0}; struct hwrm_func_ptp_cfg_input *req;
struct bnxt *bp = ptp->bp; struct bnxt *bp = ptp->bp;
struct timespec64 ts; struct timespec64 ts;
u64 target_ns, delta; u64 target_ns, delta;
...@@ -293,20 +307,22 @@ static int bnxt_ptp_perout_cfg(struct bnxt_ptp_cfg *ptp, ...@@ -293,20 +307,22 @@ static int bnxt_ptp_perout_cfg(struct bnxt_ptp_cfg *ptp,
if (rc) if (rc)
return rc; return rc;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_PTP_CFG, -1, -1); rc = hwrm_req_init(bp, req, HWRM_FUNC_PTP_CFG);
if (rc)
return rc;
enables = FUNC_PTP_CFG_REQ_ENABLES_PTP_FREQ_ADJ_EXT_PERIOD | enables = FUNC_PTP_CFG_REQ_ENABLES_PTP_FREQ_ADJ_EXT_PERIOD |
FUNC_PTP_CFG_REQ_ENABLES_PTP_FREQ_ADJ_EXT_UP | FUNC_PTP_CFG_REQ_ENABLES_PTP_FREQ_ADJ_EXT_UP |
FUNC_PTP_CFG_REQ_ENABLES_PTP_FREQ_ADJ_EXT_PHASE; FUNC_PTP_CFG_REQ_ENABLES_PTP_FREQ_ADJ_EXT_PHASE;
req.enables = cpu_to_le16(enables); req->enables = cpu_to_le16(enables);
req.ptp_pps_event = 0; req->ptp_pps_event = 0;
req.ptp_freq_adj_dll_source = 0; req->ptp_freq_adj_dll_source = 0;
req.ptp_freq_adj_dll_phase = 0; req->ptp_freq_adj_dll_phase = 0;
req.ptp_freq_adj_ext_period = cpu_to_le32(NSEC_PER_SEC); req->ptp_freq_adj_ext_period = cpu_to_le32(NSEC_PER_SEC);
req.ptp_freq_adj_ext_up = 0; req->ptp_freq_adj_ext_up = 0;
req.ptp_freq_adj_ext_phase_lower = cpu_to_le32(delta); req->ptp_freq_adj_ext_phase_lower = cpu_to_le32(delta);
return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); return hwrm_req_send(bp, req);
} }
static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info, static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
...@@ -363,11 +379,15 @@ static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info, ...@@ -363,11 +379,15 @@ static int bnxt_ptp_enable(struct ptp_clock_info *ptp_info,
static int bnxt_hwrm_ptp_cfg(struct bnxt *bp) static int bnxt_hwrm_ptp_cfg(struct bnxt *bp)
{ {
struct hwrm_port_mac_cfg_input req = {0};
struct bnxt_ptp_cfg *ptp = bp->ptp_cfg; struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
struct hwrm_port_mac_cfg_input *req;
u32 flags = 0; u32 flags = 0;
int rc;
rc = hwrm_req_init(bp, req, HWRM_PORT_MAC_CFG);
if (rc)
return rc;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_PORT_MAC_CFG, -1, -1);
if (ptp->rx_filter) if (ptp->rx_filter)
flags |= PORT_MAC_CFG_REQ_FLAGS_PTP_RX_TS_CAPTURE_ENABLE; flags |= PORT_MAC_CFG_REQ_FLAGS_PTP_RX_TS_CAPTURE_ENABLE;
else else
...@@ -376,11 +396,11 @@ static int bnxt_hwrm_ptp_cfg(struct bnxt *bp) ...@@ -376,11 +396,11 @@ static int bnxt_hwrm_ptp_cfg(struct bnxt *bp)
flags |= PORT_MAC_CFG_REQ_FLAGS_PTP_TX_TS_CAPTURE_ENABLE; flags |= PORT_MAC_CFG_REQ_FLAGS_PTP_TX_TS_CAPTURE_ENABLE;
else else
flags |= PORT_MAC_CFG_REQ_FLAGS_PTP_TX_TS_CAPTURE_DISABLE; flags |= PORT_MAC_CFG_REQ_FLAGS_PTP_TX_TS_CAPTURE_DISABLE;
req.flags = cpu_to_le32(flags); req->flags = cpu_to_le32(flags);
req.enables = cpu_to_le32(PORT_MAC_CFG_REQ_ENABLES_RX_TS_CAPTURE_PTP_MSG_TYPE); req->enables = cpu_to_le32(PORT_MAC_CFG_REQ_ENABLES_RX_TS_CAPTURE_PTP_MSG_TYPE);
req.rx_ts_capture_ptp_msg_type = cpu_to_le16(ptp->rxctl); req->rx_ts_capture_ptp_msg_type = cpu_to_le16(ptp->rxctl);
return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); return hwrm_req_send(bp, req);
} }
int bnxt_hwtstamp_set(struct net_device *dev, struct ifreq *ifr) int bnxt_hwtstamp_set(struct net_device *dev, struct ifreq *ifr)
...@@ -631,11 +651,10 @@ static int bnxt_ptp_verify(struct ptp_clock_info *ptp_info, unsigned int pin, ...@@ -631,11 +651,10 @@ static int bnxt_ptp_verify(struct ptp_clock_info *ptp_info, unsigned int pin,
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
/* bp->hwrm_cmd_lock held by the caller */
static int bnxt_ptp_pps_init(struct bnxt *bp) static int bnxt_ptp_pps_init(struct bnxt *bp)
{ {
struct hwrm_func_ptp_pin_qcfg_output *resp = bp->hwrm_cmd_resp_addr; struct hwrm_func_ptp_pin_qcfg_output *resp;
struct hwrm_func_ptp_pin_qcfg_input req = {0}; struct hwrm_func_ptp_pin_qcfg_input *req;
struct bnxt_ptp_cfg *ptp = bp->ptp_cfg; struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
struct ptp_clock_info *ptp_info; struct ptp_clock_info *ptp_info;
struct bnxt_pps *pps_info; struct bnxt_pps *pps_info;
...@@ -643,11 +662,16 @@ static int bnxt_ptp_pps_init(struct bnxt *bp) ...@@ -643,11 +662,16 @@ static int bnxt_ptp_pps_init(struct bnxt *bp)
u32 i, rc; u32 i, rc;
/* Query current/default PIN CFG */ /* Query current/default PIN CFG */
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_PTP_PIN_QCFG, -1, -1); rc = hwrm_req_init(bp, req, HWRM_FUNC_PTP_PIN_QCFG);
if (rc)
return rc;
rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); resp = hwrm_req_hold(bp, req);
if (rc || !resp->num_pins) rc = hwrm_req_send(bp, req);
if (rc || !resp->num_pins) {
hwrm_req_drop(bp, req);
return -EOPNOTSUPP; return -EOPNOTSUPP;
}
ptp_info = &ptp->ptp_info; ptp_info = &ptp->ptp_info;
pps_info = &ptp->pps_info; pps_info = &ptp->pps_info;
...@@ -656,8 +680,10 @@ static int bnxt_ptp_pps_init(struct bnxt *bp) ...@@ -656,8 +680,10 @@ static int bnxt_ptp_pps_init(struct bnxt *bp)
ptp_info->pin_config = kcalloc(ptp_info->n_pins, ptp_info->pin_config = kcalloc(ptp_info->n_pins,
sizeof(*ptp_info->pin_config), sizeof(*ptp_info->pin_config),
GFP_KERNEL); GFP_KERNEL);
if (!ptp_info->pin_config) if (!ptp_info->pin_config) {
hwrm_req_drop(bp, req);
return -ENOMEM; return -ENOMEM;
}
/* Report the TSIO capability to kernel */ /* Report the TSIO capability to kernel */
pin_usg = &resp->pin0_usage; pin_usg = &resp->pin0_usage;
...@@ -675,6 +701,7 @@ static int bnxt_ptp_pps_init(struct bnxt *bp) ...@@ -675,6 +701,7 @@ static int bnxt_ptp_pps_init(struct bnxt *bp)
pps_info->pins[i].usage = *pin_usg; pps_info->pins[i].usage = *pin_usg;
} }
hwrm_req_drop(bp, req);
/* Only 1 each of ext_ts and per_out pins is available in HW */ /* Only 1 each of ext_ts and per_out pins is available in HW */
ptp_info->n_ext_ts = 1; ptp_info->n_ext_ts = 1;
......
...@@ -238,27 +238,33 @@ static int bnxt_send_msg(struct bnxt_en_dev *edev, int ulp_id, ...@@ -238,27 +238,33 @@ static int bnxt_send_msg(struct bnxt_en_dev *edev, int ulp_id,
{ {
struct net_device *dev = edev->net; struct net_device *dev = edev->net;
struct bnxt *bp = netdev_priv(dev); struct bnxt *bp = netdev_priv(dev);
struct output *resp;
struct input *req; struct input *req;
u32 resp_len;
int rc; int rc;
if (ulp_id != BNXT_ROCE_ULP && bp->fw_reset_state) if (ulp_id != BNXT_ROCE_ULP && bp->fw_reset_state)
return -EBUSY; return -EBUSY;
mutex_lock(&bp->hwrm_cmd_lock); rc = hwrm_req_init(bp, req, 0 /* don't care */);
req = fw_msg->msg; if (rc)
req->resp_addr = cpu_to_le64(bp->hwrm_cmd_resp_dma_addr); return rc;
rc = _hwrm_send_message(bp, fw_msg->msg, fw_msg->msg_len,
fw_msg->timeout);
if (!rc) {
struct output *resp = bp->hwrm_cmd_resp_addr;
u32 len = le16_to_cpu(resp->resp_len);
if (fw_msg->resp_max_len < len) rc = hwrm_req_replace(bp, req, fw_msg->msg, fw_msg->msg_len);
len = fw_msg->resp_max_len; if (rc)
return rc;
memcpy(fw_msg->resp, resp, len); hwrm_req_timeout(bp, req, fw_msg->timeout);
resp = hwrm_req_hold(bp, req);
rc = hwrm_req_send(bp, req);
resp_len = le16_to_cpu(resp->resp_len);
if (resp_len) {
if (fw_msg->resp_max_len < resp_len)
resp_len = fw_msg->resp_max_len;
memcpy(fw_msg->resp, resp, resp_len);
} }
mutex_unlock(&bp->hwrm_cmd_lock); hwrm_req_drop(bp, req);
return rc; return rc;
} }
......
...@@ -28,38 +28,40 @@ ...@@ -28,38 +28,40 @@
static int hwrm_cfa_vfr_alloc(struct bnxt *bp, u16 vf_idx, static int hwrm_cfa_vfr_alloc(struct bnxt *bp, u16 vf_idx,
u16 *tx_cfa_action, u16 *rx_cfa_code) u16 *tx_cfa_action, u16 *rx_cfa_code)
{ {
struct hwrm_cfa_vfr_alloc_output *resp = bp->hwrm_cmd_resp_addr; struct hwrm_cfa_vfr_alloc_output *resp;
struct hwrm_cfa_vfr_alloc_input req = { 0 }; struct hwrm_cfa_vfr_alloc_input *req;
int rc; int rc;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_CFA_VFR_ALLOC, -1, -1); rc = hwrm_req_init(bp, req, HWRM_CFA_VFR_ALLOC);
req.vf_id = cpu_to_le16(vf_idx);
sprintf(req.vfr_name, "vfr%d", vf_idx);
mutex_lock(&bp->hwrm_cmd_lock);
rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
if (!rc) { if (!rc) {
*tx_cfa_action = le16_to_cpu(resp->tx_cfa_action); req->vf_id = cpu_to_le16(vf_idx);
*rx_cfa_code = le16_to_cpu(resp->rx_cfa_code); sprintf(req->vfr_name, "vfr%d", vf_idx);
netdev_dbg(bp->dev, "tx_cfa_action=0x%x, rx_cfa_code=0x%x",
*tx_cfa_action, *rx_cfa_code); resp = hwrm_req_hold(bp, req);
} else { rc = hwrm_req_send(bp, req);
netdev_info(bp->dev, "%s error rc=%d\n", __func__, rc); if (!rc) {
*tx_cfa_action = le16_to_cpu(resp->tx_cfa_action);
*rx_cfa_code = le16_to_cpu(resp->rx_cfa_code);
netdev_dbg(bp->dev, "tx_cfa_action=0x%x, rx_cfa_code=0x%x",
*tx_cfa_action, *rx_cfa_code);
}
hwrm_req_drop(bp, req);
} }
if (rc)
mutex_unlock(&bp->hwrm_cmd_lock); netdev_info(bp->dev, "%s error rc=%d\n", __func__, rc);
return rc; return rc;
} }
static int hwrm_cfa_vfr_free(struct bnxt *bp, u16 vf_idx) static int hwrm_cfa_vfr_free(struct bnxt *bp, u16 vf_idx)
{ {
struct hwrm_cfa_vfr_free_input req = { 0 }; struct hwrm_cfa_vfr_free_input *req;
int rc; int rc;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_CFA_VFR_FREE, -1, -1); rc = hwrm_req_init(bp, req, HWRM_CFA_VFR_FREE);
sprintf(req.vfr_name, "vfr%d", vf_idx); if (!rc) {
sprintf(req->vfr_name, "vfr%d", vf_idx);
rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); rc = hwrm_req_send(bp, req);
}
if (rc) if (rc)
netdev_info(bp->dev, "%s error rc=%d\n", __func__, rc); netdev_info(bp->dev, "%s error rc=%d\n", __func__, rc);
return rc; return rc;
...@@ -68,17 +70,18 @@ static int hwrm_cfa_vfr_free(struct bnxt *bp, u16 vf_idx) ...@@ -68,17 +70,18 @@ static int hwrm_cfa_vfr_free(struct bnxt *bp, u16 vf_idx)
static int bnxt_hwrm_vfr_qcfg(struct bnxt *bp, struct bnxt_vf_rep *vf_rep, static int bnxt_hwrm_vfr_qcfg(struct bnxt *bp, struct bnxt_vf_rep *vf_rep,
u16 *max_mtu) u16 *max_mtu)
{ {
struct hwrm_func_qcfg_output *resp = bp->hwrm_cmd_resp_addr; struct hwrm_func_qcfg_output *resp;
struct hwrm_func_qcfg_input req = {0}; struct hwrm_func_qcfg_input *req;
u16 mtu; u16 mtu;
int rc; int rc;
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_QCFG, -1, -1); rc = hwrm_req_init(bp, req, HWRM_FUNC_QCFG);
req.fid = cpu_to_le16(bp->pf.vf[vf_rep->vf_idx].fw_fid); if (rc)
return rc;
mutex_lock(&bp->hwrm_cmd_lock);
rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); req->fid = cpu_to_le16(bp->pf.vf[vf_rep->vf_idx].fw_fid);
resp = hwrm_req_hold(bp, req);
rc = hwrm_req_send(bp, req);
if (!rc) { if (!rc) {
mtu = le16_to_cpu(resp->max_mtu_configured); mtu = le16_to_cpu(resp->max_mtu_configured);
if (!mtu) if (!mtu)
...@@ -86,7 +89,7 @@ static int bnxt_hwrm_vfr_qcfg(struct bnxt *bp, struct bnxt_vf_rep *vf_rep, ...@@ -86,7 +89,7 @@ static int bnxt_hwrm_vfr_qcfg(struct bnxt *bp, struct bnxt_vf_rep *vf_rep,
else else
*max_mtu = mtu; *max_mtu = mtu;
} }
mutex_unlock(&bp->hwrm_cmd_lock); hwrm_req_drop(bp, req);
return rc; return rc;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment