X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbnxt%2Fbnxt_hwrm.c;h=931ecea77cc185eb13b3c55daa8d8ea798339d66;hb=89d2a1061df5b874a41739b146693b0d542aebd4;hp=5ef0845e8c7e5f3bee4ce328d6648d65f6722700;hpb=3972281f47b2cc0cf844698885f0e6b4228c0975;p=dpdk.git diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index 5ef0845e8c..931ecea77c 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -788,10 +788,16 @@ static int bnxt_hwrm_ptp_qcfg(struct bnxt *bp) return 0; } -void bnxt_hwrm_free_vf_info(struct bnxt *bp) +void bnxt_free_vf_info(struct bnxt *bp) { int i; + if (bp->pf == NULL) + return; + + if (bp->pf->vf_info == NULL) + return; + for (i = 0; i < bp->pf->max_vfs; i++) { rte_free(bp->pf->vf_info[i].vlan_table); bp->pf->vf_info[i].vlan_table = NULL; @@ -802,6 +808,50 @@ void bnxt_hwrm_free_vf_info(struct bnxt *bp) bp->pf->vf_info = NULL; } +static int bnxt_alloc_vf_info(struct bnxt *bp, uint16_t max_vfs) +{ + struct bnxt_child_vf_info *vf_info = bp->pf->vf_info; + int i; + + if (vf_info) + bnxt_free_vf_info(bp); + + vf_info = rte_zmalloc("bnxt_vf_info", sizeof(*vf_info) * max_vfs, 0); + if (vf_info == NULL) { + PMD_DRV_LOG(ERR, "Failed to alloc vf info\n"); + return -ENOMEM; + } + + bp->pf->max_vfs = max_vfs; + for (i = 0; i < max_vfs; i++) { + vf_info[i].fid = bp->pf->first_vf_id + i; + vf_info[i].vlan_table = rte_zmalloc("VF VLAN table", + getpagesize(), getpagesize()); + if (vf_info[i].vlan_table == NULL) { + PMD_DRV_LOG(ERR, "Failed to alloc VLAN table for VF %d\n", i); + goto err; + } + rte_mem_lock_page(vf_info[i].vlan_table); + + vf_info[i].vlan_as_table = rte_zmalloc("VF VLAN AS table", + getpagesize(), getpagesize()); + if (vf_info[i].vlan_as_table == NULL) { + PMD_DRV_LOG(ERR, "Failed to alloc VLAN AS table for VF %d\n", i); + goto err; + } + rte_mem_lock_page(vf_info[i].vlan_as_table); + + STAILQ_INIT(&vf_info[i].filter); + } + + bp->pf->vf_info = vf_info; + + return 0; +err: + bnxt_free_vf_info(bp); + return -ENOMEM; +} + static int __bnxt_hwrm_func_qcaps(struct bnxt *bp) { int rc = 0; @@ -809,7 +859,6 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp) struct hwrm_func_qcaps_output *resp = bp->hwrm_cmd_resp_addr; uint16_t new_max_vfs; uint32_t flags; - int i; HWRM_PREP(&req, HWRM_FUNC_QCAPS, BNXT_USE_CHIMP_MB); @@ -827,43 +876,9 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp) bp->pf->total_vfs = rte_le_to_cpu_16(resp->max_vfs); new_max_vfs = bp->pdev->max_vfs; if (new_max_vfs != bp->pf->max_vfs) { - if (bp->pf->vf_info) - bnxt_hwrm_free_vf_info(bp); - bp->pf->vf_info = rte_zmalloc("bnxt_vf_info", - sizeof(bp->pf->vf_info[0]) * new_max_vfs, 0); - if (bp->pf->vf_info == NULL) { - PMD_DRV_LOG(ERR, "Alloc vf info fail\n"); - HWRM_UNLOCK(); - return -ENOMEM; - } - bp->pf->max_vfs = new_max_vfs; - for (i = 0; i < new_max_vfs; i++) { - bp->pf->vf_info[i].fid = - bp->pf->first_vf_id + i; - bp->pf->vf_info[i].vlan_table = - rte_zmalloc("VF VLAN table", - getpagesize(), - getpagesize()); - if (bp->pf->vf_info[i].vlan_table == NULL) - PMD_DRV_LOG(ERR, - "Fail to alloc VLAN table for VF %d\n", - i); - else - rte_mem_lock_page( - bp->pf->vf_info[i].vlan_table); - bp->pf->vf_info[i].vlan_as_table = - rte_zmalloc("VF VLAN AS table", - getpagesize(), - getpagesize()); - if (bp->pf->vf_info[i].vlan_as_table == NULL) - PMD_DRV_LOG(ERR, - "Alloc VLAN AS table for VF %d fail\n", - i); - else - rte_mem_lock_page( - bp->pf->vf_info[i].vlan_as_table); - STAILQ_INIT(&bp->pf->vf_info[i].filter); - } + rc = bnxt_alloc_vf_info(bp, new_max_vfs); + if (rc) + goto unlock; } } @@ -922,6 +937,7 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp) if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_LINK_ADMIN_STATUS_SUPPORTED) bp->fw_cap |= BNXT_FW_CAP_LINK_ADMIN; +unlock: HWRM_UNLOCK(); return rc; @@ -932,6 +948,9 @@ int bnxt_hwrm_func_qcaps(struct bnxt *bp) int rc; rc = __bnxt_hwrm_func_qcaps(bp); + if (rc == -ENOMEM) + return rc; + if (!rc && bp->hwrm_spec_code >= HWRM_SPEC_CODE_1_8_3) { rc = bnxt_alloc_ctx_mem(bp); if (rc) @@ -1255,6 +1274,7 @@ int bnxt_hwrm_ver_get(struct bnxt *bp, uint32_t timeout) if (bp->max_req_len > resp->max_req_win_len) { PMD_DRV_LOG(ERR, "Unsupported request length\n"); rc = -EINVAL; + goto error; } bp->chip_num = rte_le_to_cpu_16(resp->chip_num); @@ -1267,28 +1287,8 @@ int bnxt_hwrm_ver_get(struct bnxt *bp, uint32_t timeout) max_resp_len = rte_le_to_cpu_16(resp->max_resp_len); dev_caps_cfg = rte_le_to_cpu_32(resp->dev_caps_cfg); - if (bp->max_resp_len != max_resp_len) { - sprintf(type, "bnxt_hwrm_" PCI_PRI_FMT, - bp->pdev->addr.domain, bp->pdev->addr.bus, - bp->pdev->addr.devid, bp->pdev->addr.function); - - rte_free(bp->hwrm_cmd_resp_addr); - - bp->hwrm_cmd_resp_addr = rte_malloc(type, max_resp_len, 0); - if (bp->hwrm_cmd_resp_addr == NULL) { - rc = -ENOMEM; - goto error; - } - bp->hwrm_cmd_resp_dma_addr = - rte_malloc_virt2iova(bp->hwrm_cmd_resp_addr); - if (bp->hwrm_cmd_resp_dma_addr == RTE_BAD_IOVA) { - PMD_DRV_LOG(ERR, - "Unable to map response buffer to physical memory.\n"); - rc = -ENOMEM; - goto error; - } - bp->max_resp_len = max_resp_len; - } + RTE_VERIFY(max_resp_len <= bp->max_resp_len); + bp->max_resp_len = max_resp_len; if ((dev_caps_cfg & HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_SHORT_CMD_SUPPORTED) && @@ -1367,6 +1367,9 @@ int bnxt_hwrm_func_driver_unregister(struct bnxt *bp, uint32_t flags) HWRM_CHECK_RESULT(); HWRM_UNLOCK(); + PMD_DRV_LOG(DEBUG, "Port %u: Unregistered with fw\n", + bp->eth_dev->data->port_id); + return rc; } @@ -1451,8 +1454,6 @@ static int bnxt_hwrm_port_phy_cfg(struct bnxt *bp, struct bnxt_link_info *conf) HWRM_CHECK_RESULT(); HWRM_UNLOCK(); - PMD_DRV_LOG(DEBUG, "Port %u: Unregistered with fw\n", - bp->eth_dev->data->port_id); return rc; } @@ -1525,7 +1526,7 @@ int bnxt_hwrm_port_phy_qcaps(struct bnxt *bp) rc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB); - HWRM_CHECK_RESULT(); + HWRM_CHECK_RESULT_SILENT(); bp->port_cnt = resp->port_cnt; if (resp->supported_speeds_auto_mode) @@ -1898,8 +1899,7 @@ int bnxt_hwrm_stat_clear(struct bnxt *bp, struct bnxt_cp_ring_info *cpr) return rc; } -int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, - unsigned int idx __rte_unused) +static int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp, struct bnxt_cp_ring_info *cpr) { int rc; struct hwrm_stat_ctx_alloc_input req = {.req_type = 0 }; @@ -1922,8 +1922,7 @@ int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, return rc; } -int bnxt_hwrm_stat_ctx_free(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, - unsigned int idx __rte_unused) +static int bnxt_hwrm_stat_ctx_free(struct bnxt *bp, struct bnxt_cp_ring_info *cpr) { int rc; struct hwrm_stat_ctx_free_input req = {.req_type = 0 }; @@ -2593,7 +2592,7 @@ bnxt_free_all_hwrm_stat_ctxs(struct bnxt *bp) bp->grp_info[i].fw_stats_ctx = -1; } if (cpr->hw_stats_ctx_id != HWRM_NA_SIGNATURE) { - rc = bnxt_hwrm_stat_ctx_free(bp, cpr, i); + rc = bnxt_hwrm_stat_ctx_free(bp, cpr); cpr->hw_stats_ctx_id = HWRM_NA_SIGNATURE; if (rc) return rc; @@ -2620,7 +2619,7 @@ int bnxt_alloc_all_hwrm_stat_ctxs(struct bnxt *bp) cpr = rxq->cp_ring; } - rc = bnxt_hwrm_stat_ctx_alloc(bp, cpr, i); + rc = bnxt_hwrm_stat_ctx_alloc(bp, cpr); if (rc) return rc; @@ -2787,7 +2786,7 @@ int bnxt_alloc_hwrm_resources(struct bnxt *bp) sprintf(type, "bnxt_hwrm_" PCI_PRI_FMT, pdev->addr.domain, pdev->addr.bus, pdev->addr.devid, pdev->addr.function); - bp->max_resp_len = HWRM_MAX_RESP_LEN; + bp->max_resp_len = BNXT_PAGE_SIZE; bp->hwrm_cmd_resp_addr = rte_malloc(type, bp->max_resp_len, 0); if (bp->hwrm_cmd_resp_addr == NULL) return -ENOMEM; @@ -3368,7 +3367,7 @@ int bnxt_hwrm_parent_pf_qcfg(struct bnxt *bp) rc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB); - HWRM_CHECK_RESULT(); + HWRM_CHECK_RESULT_SILENT(); memcpy(bp->parent->mac_addr, resp->mac_address, RTE_ETHER_ADDR_LEN); bp->parent->vnic = rte_le_to_cpu_16(resp->dflt_vnic_id); @@ -3377,7 +3376,7 @@ int bnxt_hwrm_parent_pf_qcfg(struct bnxt *bp) /* FIXME: Temporary workaround - remove when firmware issue is fixed. */ if (bp->parent->vnic == 0) { - PMD_DRV_LOG(ERR, "Error: parent VNIC unavailable.\n"); + PMD_DRV_LOG(DEBUG, "parent VNIC unavailable.\n"); /* Use hard-coded values appropriate for current Wh+ fw. */ if (bp->parent->fid == 2) bp->parent->vnic = 0x100; @@ -4381,7 +4380,7 @@ int bnxt_hwrm_port_led_qcaps(struct bnxt *bp) req.port_id = bp->pf->port_id; rc = bnxt_hwrm_send_message(bp, &req, sizeof(req), BNXT_USE_CHIMP_MB); - HWRM_CHECK_RESULT(); + HWRM_CHECK_RESULT_SILENT(); if (resp->num_leds > 0 && resp->num_leds < BNXT_MAX_LED) { unsigned int i; @@ -6040,6 +6039,7 @@ int bnxt_hwrm_poll_ver_get(struct bnxt *bp) int rc = 0; bp->max_req_len = HWRM_MAX_REQ_LEN; + bp->max_resp_len = BNXT_PAGE_SIZE; bp->hwrm_cmd_timeout = SHORT_HWRM_CMD_TIMEOUT; HWRM_PREP(&req, HWRM_VER_GET, BNXT_USE_CHIMP_MB);