X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbnx2x%2Fbnx2x_vfpf.c;h=c8bcc69bab91af2e9165d603e6b8b96a2bd9f42d;hb=1b437b977552fa5e491b5faaf390f4ed9baeb2cc;hp=b3fcceb750384c845f3fce2f6d11c9db48b97d20;hpb=059113cced1c6a1ee98eb4e0446fe541f286691c;p=dpdk.git diff --git a/drivers/net/bnx2x/bnx2x_vfpf.c b/drivers/net/bnx2x/bnx2x_vfpf.c index b3fcceb750..c8bcc69bab 100644 --- a/drivers/net/bnx2x/bnx2x_vfpf.c +++ b/drivers/net/bnx2x/bnx2x_vfpf.c @@ -64,25 +64,32 @@ bnx2x_check_bull(struct bnx2x_softc *sc) return TRUE; } -/* add tlv to a buffer */ -#define BNX2X_TLV_APPEND(_tlvs, _offset, _type, _length) \ - ((struct vf_first_tlv *)((uint64_t)_tlvs + _offset))->type = _type; \ - ((struct vf_first_tlv *)((uint64_t)_tlvs + _offset))->length = _length +/* place a given tlv on the tlv buffer at a given offset */ +static void +bnx2x_add_tlv(__rte_unused struct bnx2x_softc *sc, void *tlvs_list, + uint16_t offset, uint16_t type, uint16_t length) +{ + struct channel_tlv *tl = (struct channel_tlv *) + ((unsigned long)tlvs_list + offset); + + tl->type = type; + tl->length = length; +} /* Initiliaze header of the first tlv and clear mailbox*/ static void -bnx2x_init_first_tlv(struct bnx2x_softc *sc, struct vf_first_tlv *tlv, - uint16_t type, uint16_t len) +bnx2x_init_first_tlv(struct bnx2x_softc *sc, struct vf_first_tlv *first_tlv, + uint16_t type, uint16_t length) { struct bnx2x_vf_mbx_msg *mbox = sc->vf2pf_mbox; PMD_DRV_LOG(DEBUG, "Preparing %d tlv for sending", type); memset(mbox, 0, sizeof(struct bnx2x_vf_mbx_msg)); - BNX2X_TLV_APPEND(tlv, 0, type, len); + bnx2x_add_tlv(sc, &first_tlv->tl, 0, type, length); /* Initialize header of the first tlv */ - tlv->reply_offset = sizeof(mbox->query); + first_tlv->reply_offset = sizeof(mbox->query); } #define BNX2X_VF_CMD_ADDR_LO PXP_VF_ADDR_CSDM_GLOBAL_START @@ -122,16 +129,10 @@ bnx2x_do_req4pf(struct bnx2x_softc *sc, phys_addr_t phys_addr) break; } - if (i == BNX2X_VF_CHANNEL_TRIES) { + if (!*status) { PMD_DRV_LOG(ERR, "Response from PF timed out"); return -EAGAIN; } - - if (BNX2X_VF_STATUS_SUCCESS != *status) { - PMD_DRV_LOG(ERR, "Bad reply from PF : %u", - *status); - return -EINVAL; - } } else { PMD_DRV_LOG(ERR, "status should be zero before message" "to pf was sent"); @@ -193,10 +194,10 @@ struct bnx2x_obtain_status bnx2x_loop_obtain_resources(struct bnx2x_softc *sc) do { PMD_DRV_LOG(DEBUG, "trying to get resources"); - if ( bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr) ) { + if (bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr)) { /* timeout */ status.success = 0; - status.err_code = 0; + status.err_code = -EAGAIN; return status; } @@ -262,14 +263,14 @@ int bnx2x_vf_get_resources(struct bnx2x_softc *sc, uint8_t tx_count, uint8_t rx_ acq->bulletin_addr = sc->pf2vf_bulletin_mapping.paddr; /* Request physical port identifier */ - BNX2X_TLV_APPEND(acq, acq->first_tlv.length, - BNX2X_VF_TLV_PHYS_PORT_ID, - sizeof(struct channel_tlv)); + bnx2x_add_tlv(sc, acq, acq->first_tlv.tl.length, + BNX2X_VF_TLV_PHYS_PORT_ID, + sizeof(struct channel_tlv)); - BNX2X_TLV_APPEND(acq, - (acq->first_tlv.length + sizeof(struct channel_tlv)), - BNX2X_VF_TLV_LIST_END, - sizeof(struct channel_list_end_tlv)); + bnx2x_add_tlv(sc, acq, + (acq->first_tlv.tl.length + sizeof(struct channel_tlv)), + BNX2X_VF_TLV_LIST_END, + sizeof(struct channel_list_end_tlv)); /* requesting the resources in loop */ obtain_status = bnx2x_loop_obtain_resources(sc); @@ -288,6 +289,8 @@ int bnx2x_vf_get_resources(struct bnx2x_softc *sc, uint8_t tx_count, uint8_t rx_ sc->igu_sb_cnt = sc_resp.resc.num_sbs; sc->igu_base_sb = sc_resp.resc.hw_sbs[0] & 0xFF; sc->igu_dsb_id = -1; + sc->max_tx_queues = sc_resp.resc.num_txqs; + sc->max_rx_queues = sc_resp.resc.num_rxqs; sc->link_params.chip_id = sc->devinfo.chip_id; sc->doorbell_size = sc_resp.db_size; @@ -297,10 +300,11 @@ int bnx2x_vf_get_resources(struct bnx2x_softc *sc, uint8_t tx_count, uint8_t rx_ sc->igu_sb_cnt, sc->igu_base_sb); strncpy(sc->fw_ver, sc_resp.fw_ver, sizeof(sc->fw_ver)); - if (is_valid_ether_addr(sc_resp.resc.current_mac_addr)) - (void)rte_memcpy(sc->link_params.mac_addr, - sc_resp.resc.current_mac_addr, - ETH_ALEN); + if (is_valid_assigned_ether_addr(&sc_resp.resc.current_mac_addr)) + ether_addr_copy(&sc_resp.resc.current_mac_addr, + (struct ether_addr *)sc->link_params.mac_addr); + else + eth_random_addr(sc->link_params.mac_addr); return 0; } @@ -310,8 +314,8 @@ void bnx2x_vf_close(struct bnx2x_softc *sc) { struct vf_release_tlv *query; + struct vf_common_reply_tlv *reply = &sc->vf2pf_mbox->resp.common_reply; int vf_id = bnx2x_read_vf_id(sc); - int ret; if (vf_id >= 0) { query = &sc->vf2pf_mbox->query[0].release; @@ -319,14 +323,13 @@ bnx2x_vf_close(struct bnx2x_softc *sc) sizeof(*query)); query->vf_id = vf_id; - BNX2X_TLV_APPEND(query, query->first_tlv.length, BNX2X_VF_TLV_LIST_END, - sizeof(struct channel_list_end_tlv)); - - ret = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); + bnx2x_add_tlv(sc, query, query->first_tlv.tl.length, + BNX2X_VF_TLV_LIST_END, + sizeof(struct channel_list_end_tlv)); - if (ret) { + bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); + if (reply->status != BNX2X_VF_STATUS_SUCCESS) PMD_DRV_LOG(ERR, "Failed to release VF"); - } } } @@ -335,7 +338,8 @@ int bnx2x_vf_init(struct bnx2x_softc *sc) { struct vf_init_tlv *query; - int i, ret; + struct vf_common_reply_tlv *reply = &sc->vf2pf_mbox->resp.common_reply; + int i; query = &sc->vf2pf_mbox->query[0].init; bnx2x_init_first_tlv(sc, &query->first_tlv, BNX2X_VF_TLV_INIT, @@ -349,14 +353,14 @@ bnx2x_vf_init(struct bnx2x_softc *sc) query->stats_addr = sc->fw_stats_data_mapping + offsetof(struct bnx2x_fw_stats_data, queue_stats); - BNX2X_TLV_APPEND(query, query->first_tlv.length, BNX2X_VF_TLV_LIST_END, - sizeof(struct channel_list_end_tlv)); + bnx2x_add_tlv(sc, query, query->first_tlv.tl.length, + BNX2X_VF_TLV_LIST_END, + sizeof(struct channel_list_end_tlv)); - ret = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); - - if (ret) { + bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); + if (reply->status != BNX2X_VF_STATUS_SUCCESS) { PMD_DRV_LOG(ERR, "Failed to init VF"); - return ret; + return -EINVAL; } PMD_DRV_LOG(DEBUG, "VF was initialized"); @@ -367,8 +371,9 @@ void bnx2x_vf_unload(struct bnx2x_softc *sc) { struct vf_close_tlv *query; + struct vf_common_reply_tlv *reply = &sc->vf2pf_mbox->resp.common_reply; struct vf_q_op_tlv *query_op; - int i, vf_id, ret; + int i, vf_id; vf_id = bnx2x_read_vf_id(sc); if (vf_id > 0) { @@ -380,14 +385,15 @@ bnx2x_vf_unload(struct bnx2x_softc *sc) query_op->vf_qid = i; - BNX2X_TLV_APPEND(query_op, query_op->first_tlv.length, - BNX2X_VF_TLV_LIST_END, - sizeof(struct channel_list_end_tlv)); + bnx2x_add_tlv(sc, query_op, + query_op->first_tlv.tl.length, + BNX2X_VF_TLV_LIST_END, + sizeof(struct channel_list_end_tlv)); - ret = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); - if (ret) + bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); + if (reply->status != BNX2X_VF_STATUS_SUCCESS) PMD_DRV_LOG(ERR, - "Bad reply for vf_q %d teardown", i); + "Bad reply for vf_q %d teardown", i); } bnx2x_vf_set_mac(sc, false); @@ -398,15 +404,14 @@ bnx2x_vf_unload(struct bnx2x_softc *sc) query->vf_id = vf_id; - BNX2X_TLV_APPEND(query, query->first_tlv.length, - BNX2X_VF_TLV_LIST_END, - sizeof(struct channel_list_end_tlv)); + bnx2x_add_tlv(sc, query, query->first_tlv.tl.length, + BNX2X_VF_TLV_LIST_END, + sizeof(struct channel_list_end_tlv)); - ret = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); - - if (ret) + bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); + if (reply->status != BNX2X_VF_STATUS_SUCCESS) PMD_DRV_LOG(ERR, - "Bad reply from PF for close message"); + "Bad reply from PF for close message"); } } @@ -469,8 +474,8 @@ int bnx2x_vf_setup_queue(struct bnx2x_softc *sc, struct bnx2x_fastpath *fp, int leading) { struct vf_setup_q_tlv *query; + struct vf_common_reply_tlv *reply = &sc->vf2pf_mbox->resp.common_reply; uint16_t flags = bnx2x_vf_q_flags(leading); - int ret; query = &sc->vf2pf_mbox->query[0].setup_q; bnx2x_init_first_tlv(sc, &query->first_tlv, BNX2X_VF_TLV_SETUP_Q, @@ -482,14 +487,14 @@ bnx2x_vf_setup_queue(struct bnx2x_softc *sc, struct bnx2x_fastpath *fp, int lead bnx2x_vf_rx_q_prep(sc, fp, &query->rxq, flags); bnx2x_vf_tx_q_prep(sc, fp, &query->txq, flags); - BNX2X_TLV_APPEND(query, query->first_tlv.length, BNX2X_VF_TLV_LIST_END, - sizeof(struct channel_list_end_tlv)); - - ret = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); + bnx2x_add_tlv(sc, query, query->first_tlv.tl.length, + BNX2X_VF_TLV_LIST_END, + sizeof(struct channel_list_end_tlv)); - if (ret) { + bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); + if (reply->status != BNX2X_VF_STATUS_SUCCESS) { PMD_DRV_LOG(ERR, "Failed to setup VF queue[%d]", - fp->index); + fp->index); return -EINVAL; } @@ -517,8 +522,9 @@ bnx2x_vf_set_mac(struct bnx2x_softc *sc, int set) rte_memcpy(query->filters[0].mac, sc->link_params.mac_addr, ETH_ALEN); - BNX2X_TLV_APPEND(query, query->first_tlv.length, BNX2X_VF_TLV_LIST_END, - sizeof(struct channel_list_end_tlv)); + bnx2x_add_tlv(sc, query, query->first_tlv.tl.length, + BNX2X_VF_TLV_LIST_END, + sizeof(struct channel_list_end_tlv)); bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); reply = &sc->vf2pf_mbox->resp.common_reply; @@ -548,7 +554,7 @@ bnx2x_vf_config_rss(struct bnx2x_softc *sc, struct ecore_config_rss_params *params) { struct vf_rss_tlv *query; - int ret; + struct vf_common_reply_tlv *reply = &sc->vf2pf_mbox->resp.common_reply; query = &sc->vf2pf_mbox->query[0].update_rss; @@ -556,8 +562,9 @@ bnx2x_vf_config_rss(struct bnx2x_softc *sc, sizeof(*query)); /* add list termination tlv */ - BNX2X_TLV_APPEND(query, query->first_tlv.length, BNX2X_VF_TLV_LIST_END, - sizeof(struct channel_list_end_tlv)); + bnx2x_add_tlv(sc, query, query->first_tlv.tl.length, + BNX2X_VF_TLV_LIST_END, + sizeof(struct channel_list_end_tlv)); rte_memcpy(query->rss_key, params->rss_key, sizeof(params->rss_key)); query->rss_key_size = T_ETH_RSS_KEY; @@ -568,10 +575,10 @@ bnx2x_vf_config_rss(struct bnx2x_softc *sc, query->rss_result_mask = params->rss_result_mask; query->rss_flags = params->rss_flags; - ret = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); - if (ret) { - PMD_DRV_LOG(ERR, "Failed to send message to PF, rc %d", ret); - return ret; + bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); + if (reply->status != BNX2X_VF_STATUS_SUCCESS) { + PMD_DRV_LOG(ERR, "Failed to configure RSS"); + return -EINVAL; } return 0; @@ -581,8 +588,7 @@ int bnx2x_vf_set_rx_mode(struct bnx2x_softc *sc) { struct vf_set_q_filters_tlv *query; - unsigned long tx_mask; - int ret; + struct vf_common_reply_tlv *reply = &sc->vf2pf_mbox->resp.common_reply; query = &sc->vf2pf_mbox->query[0].set_q_filters; bnx2x_init_first_tlv(sc, &query->first_tlv, BNX2X_VF_TLV_SET_Q_FILTERS, @@ -591,17 +597,38 @@ bnx2x_vf_set_rx_mode(struct bnx2x_softc *sc) query->vf_qid = 0; query->flags = BNX2X_VF_RX_MASK_CHANGED; - if (bnx2x_fill_accept_flags(sc, sc->rx_mode, &query->rx_mask, &tx_mask)) { + switch (sc->rx_mode) { + case BNX2X_RX_MODE_NONE: /* no Rx */ + query->rx_mask = VFPF_RX_MASK_ACCEPT_NONE; + break; + case BNX2X_RX_MODE_NORMAL: + query->rx_mask = VFPF_RX_MASK_ACCEPT_MATCHED_MULTICAST; + query->rx_mask |= VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST; + query->rx_mask |= VFPF_RX_MASK_ACCEPT_BROADCAST; + break; + case BNX2X_RX_MODE_ALLMULTI: + query->rx_mask = VFPF_RX_MASK_ACCEPT_ALL_MULTICAST; + query->rx_mask |= VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST; + query->rx_mask |= VFPF_RX_MASK_ACCEPT_BROADCAST; + break; + case BNX2X_RX_MODE_PROMISC: + query->rx_mask = VFPF_RX_MASK_ACCEPT_ALL_UNICAST; + query->rx_mask |= VFPF_RX_MASK_ACCEPT_ALL_MULTICAST; + query->rx_mask |= VFPF_RX_MASK_ACCEPT_BROADCAST; + break; + default: + PMD_DRV_LOG(ERR, "BAD rx mode (%d)", sc->rx_mode); return -EINVAL; } - BNX2X_TLV_APPEND(query, query->first_tlv.length, BNX2X_VF_TLV_LIST_END, - sizeof(struct channel_list_end_tlv)); + bnx2x_add_tlv(sc, query, query->first_tlv.tl.length, + BNX2X_VF_TLV_LIST_END, + sizeof(struct channel_list_end_tlv)); - ret = bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); - if (ret) { - PMD_DRV_LOG(ERR, "Failed to send message to PF, rc %d", ret); - return ret; + bnx2x_do_req4pf(sc, sc->vf2pf_mbox_mapping.paddr); + if (reply->status != BNX2X_VF_STATUS_SUCCESS) { + PMD_DRV_LOG(ERR, "Failed to set RX mode"); + return -EINVAL; } return 0;