Merge branch 'bnxt_en-Bug-fixes'
Michael Chan says: ==================== bnxt_en: Bug fixes. 2 Bug fixes related to 57500 shutdown sequence and doorbell sequence, 2 TC Flower bug fixes related to the setting of the flow direction, 1 NVRAM update bug fix, and a minor fix to suppress an unnecessary error message. Please queue for -stable as well. Thanks. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
37b0a733c1
|
@ -2021,9 +2021,9 @@ static void __bnxt_poll_work_done(struct bnxt *bp, struct bnxt_napi *bnapi)
|
|||
if (bnapi->events & BNXT_RX_EVENT) {
|
||||
struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
|
||||
|
||||
bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
|
||||
if (bnapi->events & BNXT_AGG_EVENT)
|
||||
bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod);
|
||||
bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
|
||||
}
|
||||
bnapi->events = 0;
|
||||
}
|
||||
|
@ -5064,6 +5064,7 @@ static void bnxt_set_db(struct bnxt *bp, struct bnxt_db_info *db, u32 ring_type,
|
|||
|
||||
static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
|
||||
{
|
||||
bool agg_rings = !!(bp->flags & BNXT_FLAG_AGG_RINGS);
|
||||
int i, rc = 0;
|
||||
u32 type;
|
||||
|
||||
|
@ -5139,7 +5140,9 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
|
|||
if (rc)
|
||||
goto err_out;
|
||||
bnxt_set_db(bp, &rxr->rx_db, type, map_idx, ring->fw_ring_id);
|
||||
bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
|
||||
/* If we have agg rings, post agg buffers first. */
|
||||
if (!agg_rings)
|
||||
bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
|
||||
bp->grp_info[map_idx].rx_fw_ring_id = ring->fw_ring_id;
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5) {
|
||||
struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
|
||||
|
@ -5158,7 +5161,7 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
|
|||
}
|
||||
}
|
||||
|
||||
if (bp->flags & BNXT_FLAG_AGG_RINGS) {
|
||||
if (agg_rings) {
|
||||
type = HWRM_RING_ALLOC_AGG;
|
||||
for (i = 0; i < bp->rx_nr_rings; i++) {
|
||||
struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
|
||||
|
@ -5174,6 +5177,7 @@ static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
|
|||
bnxt_set_db(bp, &rxr->rx_agg_db, type, map_idx,
|
||||
ring->fw_ring_id);
|
||||
bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod);
|
||||
bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
|
||||
bp->grp_info[grp_idx].agg_fw_ring_id = ring->fw_ring_id;
|
||||
}
|
||||
}
|
||||
|
@ -7016,19 +7020,29 @@ static void bnxt_hwrm_clear_vnic_rss(struct bnxt *bp)
|
|||
bnxt_hwrm_vnic_set_rss(bp, i, false);
|
||||
}
|
||||
|
||||
static void bnxt_hwrm_resource_free(struct bnxt *bp, bool close_path,
|
||||
bool irq_re_init)
|
||||
static void bnxt_clear_vnic(struct bnxt *bp)
|
||||
{
|
||||
if (bp->vnic_info) {
|
||||
bnxt_hwrm_clear_vnic_filter(bp);
|
||||
if (!bp->vnic_info)
|
||||
return;
|
||||
|
||||
bnxt_hwrm_clear_vnic_filter(bp);
|
||||
if (!(bp->flags & BNXT_FLAG_CHIP_P5)) {
|
||||
/* clear all RSS setting before free vnic ctx */
|
||||
bnxt_hwrm_clear_vnic_rss(bp);
|
||||
bnxt_hwrm_vnic_ctx_free(bp);
|
||||
/* before free the vnic, undo the vnic tpa settings */
|
||||
if (bp->flags & BNXT_FLAG_TPA)
|
||||
bnxt_set_tpa(bp, false);
|
||||
bnxt_hwrm_vnic_free(bp);
|
||||
}
|
||||
/* before free the vnic, undo the vnic tpa settings */
|
||||
if (bp->flags & BNXT_FLAG_TPA)
|
||||
bnxt_set_tpa(bp, false);
|
||||
bnxt_hwrm_vnic_free(bp);
|
||||
if (bp->flags & BNXT_FLAG_CHIP_P5)
|
||||
bnxt_hwrm_vnic_ctx_free(bp);
|
||||
}
|
||||
|
||||
static void bnxt_hwrm_resource_free(struct bnxt *bp, bool close_path,
|
||||
bool irq_re_init)
|
||||
{
|
||||
bnxt_clear_vnic(bp);
|
||||
bnxt_hwrm_ring_free(bp, close_path);
|
||||
bnxt_hwrm_ring_grp_free(bp);
|
||||
if (irq_re_init) {
|
||||
|
|
|
@ -98,10 +98,13 @@ static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg,
|
|||
if (idx)
|
||||
req->dimensions = cpu_to_le16(1);
|
||||
|
||||
if (req->req_type == cpu_to_le16(HWRM_NVM_SET_VARIABLE))
|
||||
if (req->req_type == cpu_to_le16(HWRM_NVM_SET_VARIABLE)) {
|
||||
memcpy(data_addr, buf, bytesize);
|
||||
|
||||
rc = hwrm_send_message(bp, msg, msg_len, HWRM_CMD_TIMEOUT);
|
||||
rc = hwrm_send_message(bp, msg, msg_len, HWRM_CMD_TIMEOUT);
|
||||
} else {
|
||||
rc = hwrm_send_message_silent(bp, msg, msg_len,
|
||||
HWRM_CMD_TIMEOUT);
|
||||
}
|
||||
if (!rc && req->req_type == cpu_to_le16(HWRM_NVM_GET_VARIABLE))
|
||||
memcpy(buf, data_addr, bytesize);
|
||||
|
||||
|
|
|
@ -2016,21 +2016,19 @@ static int bnxt_flash_package_from_file(struct net_device *dev,
|
|||
mutex_lock(&bp->hwrm_cmd_lock);
|
||||
hwrm_err = _hwrm_send_message(bp, &install, sizeof(install),
|
||||
INSTALL_PACKAGE_TIMEOUT);
|
||||
if (hwrm_err)
|
||||
goto flash_pkg_exit;
|
||||
|
||||
if (resp->error_code) {
|
||||
if (hwrm_err) {
|
||||
u8 error_code = ((struct hwrm_err_output *)resp)->cmd_err;
|
||||
|
||||
if (error_code == NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR) {
|
||||
if (resp->error_code && error_code ==
|
||||
NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR) {
|
||||
install.flags |= cpu_to_le16(
|
||||
NVM_INSTALL_UPDATE_REQ_FLAGS_ALLOWED_TO_DEFRAG);
|
||||
hwrm_err = _hwrm_send_message(bp, &install,
|
||||
sizeof(install),
|
||||
INSTALL_PACKAGE_TIMEOUT);
|
||||
if (hwrm_err)
|
||||
goto flash_pkg_exit;
|
||||
}
|
||||
if (hwrm_err)
|
||||
goto flash_pkg_exit;
|
||||
}
|
||||
|
||||
if (resp->result) {
|
||||
|
|
|
@ -1236,7 +1236,7 @@ static int __bnxt_tc_del_flow(struct bnxt *bp,
|
|||
static void bnxt_tc_set_flow_dir(struct bnxt *bp, struct bnxt_tc_flow *flow,
|
||||
u16 src_fid)
|
||||
{
|
||||
flow->dir = (bp->pf.fw_fid == src_fid) ? BNXT_DIR_RX : BNXT_DIR_TX;
|
||||
flow->l2_key.dir = (bp->pf.fw_fid == src_fid) ? BNXT_DIR_RX : BNXT_DIR_TX;
|
||||
}
|
||||
|
||||
static void bnxt_tc_set_src_fid(struct bnxt *bp, struct bnxt_tc_flow *flow,
|
||||
|
@ -1285,9 +1285,7 @@ static int bnxt_tc_add_flow(struct bnxt *bp, u16 src_fid,
|
|||
goto free_node;
|
||||
|
||||
bnxt_tc_set_src_fid(bp, flow, src_fid);
|
||||
|
||||
if (bp->fw_cap & BNXT_FW_CAP_OVS_64BIT_HANDLE)
|
||||
bnxt_tc_set_flow_dir(bp, flow, src_fid);
|
||||
bnxt_tc_set_flow_dir(bp, flow, flow->src_fid);
|
||||
|
||||
if (!bnxt_tc_can_offload(bp, flow)) {
|
||||
rc = -EOPNOTSUPP;
|
||||
|
@ -1407,7 +1405,7 @@ static void bnxt_fill_cfa_stats_req(struct bnxt *bp,
|
|||
* 2. 15th bit of flow_handle must specify the flow
|
||||
* direction (TX/RX).
|
||||
*/
|
||||
if (flow_node->flow.dir == BNXT_DIR_RX)
|
||||
if (flow_node->flow.l2_key.dir == BNXT_DIR_RX)
|
||||
handle = CFA_FLOW_INFO_REQ_FLOW_HANDLE_DIR_RX |
|
||||
CFA_FLOW_INFO_REQ_FLOW_HANDLE_MAX_MASK;
|
||||
else
|
||||
|
|
|
@ -23,6 +23,9 @@ struct bnxt_tc_l2_key {
|
|||
__be16 inner_vlan_tci;
|
||||
__be16 ether_type;
|
||||
u8 num_vlans;
|
||||
u8 dir;
|
||||
#define BNXT_DIR_RX 1
|
||||
#define BNXT_DIR_TX 0
|
||||
};
|
||||
|
||||
struct bnxt_tc_l3_key {
|
||||
|
@ -98,9 +101,6 @@ struct bnxt_tc_flow {
|
|||
|
||||
/* flow applicable to pkts ingressing on this fid */
|
||||
u16 src_fid;
|
||||
u8 dir;
|
||||
#define BNXT_DIR_RX 1
|
||||
#define BNXT_DIR_TX 0
|
||||
struct bnxt_tc_l2_key l2_key;
|
||||
struct bnxt_tc_l2_key l2_mask;
|
||||
struct bnxt_tc_l3_key l3_key;
|
||||
|
|
Loading…
Reference in New Issue