135b53f8cSChandrakanth patil /*-
235b53f8cSChandrakanth patil * Broadcom NetXtreme-C/E network driver.
335b53f8cSChandrakanth patil *
435b53f8cSChandrakanth patil * Copyright (c) 2016 Broadcom, All Rights Reserved.
535b53f8cSChandrakanth patil * The term Broadcom refers to Broadcom Limited and/or its subsidiaries
635b53f8cSChandrakanth patil *
735b53f8cSChandrakanth patil * Redistribution and use in source and binary forms, with or without
835b53f8cSChandrakanth patil * modification, are permitted provided that the following conditions
935b53f8cSChandrakanth patil * are met:
1035b53f8cSChandrakanth patil * 1. Redistributions of source code must retain the above copyright
1135b53f8cSChandrakanth patil * notice, this list of conditions and the following disclaimer.
1235b53f8cSChandrakanth patil * 2. Redistributions in binary form must reproduce the above copyright
1335b53f8cSChandrakanth patil * notice, this list of conditions and the following disclaimer in the
1435b53f8cSChandrakanth patil * documentation and/or other materials provided with the distribution.
1535b53f8cSChandrakanth patil *
1635b53f8cSChandrakanth patil * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS'
1735b53f8cSChandrakanth patil * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1835b53f8cSChandrakanth patil * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1935b53f8cSChandrakanth patil * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2035b53f8cSChandrakanth patil * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2135b53f8cSChandrakanth patil * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2235b53f8cSChandrakanth patil * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2335b53f8cSChandrakanth patil * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2435b53f8cSChandrakanth patil * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2535b53f8cSChandrakanth patil * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2635b53f8cSChandrakanth patil * THE POSSIBILITY OF SUCH DAMAGE.
2735b53f8cSChandrakanth patil */
2835b53f8cSChandrakanth patil
2935b53f8cSChandrakanth patil #include <sys/cdefs.h>
3035b53f8cSChandrakanth patil #include <sys/endian.h>
31050d28e1SChandrakanth patil #include <linux/pci.h>
3235b53f8cSChandrakanth patil
3335b53f8cSChandrakanth patil #include "bnxt.h"
3435b53f8cSChandrakanth patil #include "bnxt_hwrm.h"
3535b53f8cSChandrakanth patil #include "hsi_struct_def.h"
3635b53f8cSChandrakanth patil
3735b53f8cSChandrakanth patil static int bnxt_hwrm_err_map(uint16_t err);
3835b53f8cSChandrakanth patil static inline int _is_valid_ether_addr(uint8_t *);
3935b53f8cSChandrakanth patil static inline void get_random_ether_addr(uint8_t *);
4035b53f8cSChandrakanth patil static void bnxt_hwrm_set_link_common(struct bnxt_softc *softc,
4135b53f8cSChandrakanth patil struct hwrm_port_phy_cfg_input *req);
4235b53f8cSChandrakanth patil static void bnxt_hwrm_set_pause_common(struct bnxt_softc *softc,
4335b53f8cSChandrakanth patil struct hwrm_port_phy_cfg_input *req);
4435b53f8cSChandrakanth patil static void bnxt_hwrm_set_eee(struct bnxt_softc *softc,
4535b53f8cSChandrakanth patil struct hwrm_port_phy_cfg_input *req);
4635b53f8cSChandrakanth patil
4735b53f8cSChandrakanth patil /* NVRam stuff has a five minute timeout */
4835b53f8cSChandrakanth patil #define BNXT_NVM_TIMEO (5 * 60 * 1000)
4935b53f8cSChandrakanth patil
50032899b5SChandrakanth patil #define BNXT_RX_STATS_PRI_ENTRY(counter, n) \
51032899b5SChandrakanth patil BNXT_RX_STATS_EXT_OFFSET(counter##_cos0)
52032899b5SChandrakanth patil
53032899b5SChandrakanth patil #define BNXT_TX_STATS_PRI_ENTRY(counter, n) \
54032899b5SChandrakanth patil BNXT_TX_STATS_EXT_OFFSET(counter##_cos0)
55032899b5SChandrakanth patil
56032899b5SChandrakanth patil #define BNXT_RX_STATS_PRI_ENTRIES(counter) \
57032899b5SChandrakanth patil BNXT_RX_STATS_PRI_ENTRY(counter, 0), \
58032899b5SChandrakanth patil BNXT_RX_STATS_PRI_ENTRY(counter, 1), \
59032899b5SChandrakanth patil BNXT_RX_STATS_PRI_ENTRY(counter, 2), \
60032899b5SChandrakanth patil BNXT_RX_STATS_PRI_ENTRY(counter, 3), \
61032899b5SChandrakanth patil BNXT_RX_STATS_PRI_ENTRY(counter, 4), \
62032899b5SChandrakanth patil BNXT_RX_STATS_PRI_ENTRY(counter, 5), \
63032899b5SChandrakanth patil BNXT_RX_STATS_PRI_ENTRY(counter, 6), \
64032899b5SChandrakanth patil BNXT_RX_STATS_PRI_ENTRY(counter, 7)
65032899b5SChandrakanth patil
66032899b5SChandrakanth patil #define BNXT_TX_STATS_PRI_ENTRIES(counter) \
67032899b5SChandrakanth patil BNXT_TX_STATS_PRI_ENTRY(counter, 0), \
68032899b5SChandrakanth patil BNXT_TX_STATS_PRI_ENTRY(counter, 1), \
69032899b5SChandrakanth patil BNXT_TX_STATS_PRI_ENTRY(counter, 2), \
70032899b5SChandrakanth patil BNXT_TX_STATS_PRI_ENTRY(counter, 3), \
71032899b5SChandrakanth patil BNXT_TX_STATS_PRI_ENTRY(counter, 4), \
72032899b5SChandrakanth patil BNXT_TX_STATS_PRI_ENTRY(counter, 5), \
73032899b5SChandrakanth patil BNXT_TX_STATS_PRI_ENTRY(counter, 6), \
74032899b5SChandrakanth patil BNXT_TX_STATS_PRI_ENTRY(counter, 7)
75032899b5SChandrakanth patil
76032899b5SChandrakanth patil
77032899b5SChandrakanth patil long bnxt_rx_bytes_pri_arr_base_off[] = {BNXT_RX_STATS_PRI_ENTRIES(rx_bytes)};
78032899b5SChandrakanth patil long bnxt_rx_pkts_pri_arr_base_off[] = {BNXT_RX_STATS_PRI_ENTRIES(rx_packets)};
79032899b5SChandrakanth patil long bnxt_tx_bytes_pri_arr_base_off[] = {BNXT_TX_STATS_PRI_ENTRIES(tx_bytes)};
80032899b5SChandrakanth patil long bnxt_tx_pkts_pri_arr_base_off[] = {BNXT_TX_STATS_PRI_ENTRIES(tx_packets)};
81032899b5SChandrakanth patil
8235b53f8cSChandrakanth patil static int
bnxt_hwrm_err_map(uint16_t err)8335b53f8cSChandrakanth patil bnxt_hwrm_err_map(uint16_t err)
8435b53f8cSChandrakanth patil {
8535b53f8cSChandrakanth patil int rc;
8635b53f8cSChandrakanth patil
8735b53f8cSChandrakanth patil switch (err) {
8835b53f8cSChandrakanth patil case HWRM_ERR_CODE_SUCCESS:
8935b53f8cSChandrakanth patil return 0;
9035b53f8cSChandrakanth patil case HWRM_ERR_CODE_INVALID_PARAMS:
9135b53f8cSChandrakanth patil case HWRM_ERR_CODE_INVALID_FLAGS:
9235b53f8cSChandrakanth patil case HWRM_ERR_CODE_INVALID_ENABLES:
9335b53f8cSChandrakanth patil return EINVAL;
9435b53f8cSChandrakanth patil case HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED:
9535b53f8cSChandrakanth patil return EACCES;
9635b53f8cSChandrakanth patil case HWRM_ERR_CODE_RESOURCE_ALLOC_ERROR:
9735b53f8cSChandrakanth patil return ENOMEM;
9835b53f8cSChandrakanth patil case HWRM_ERR_CODE_CMD_NOT_SUPPORTED:
9935b53f8cSChandrakanth patil return ENOSYS;
10035b53f8cSChandrakanth patil case HWRM_ERR_CODE_FAIL:
10135b53f8cSChandrakanth patil return EIO;
10235b53f8cSChandrakanth patil case HWRM_ERR_CODE_HWRM_ERROR:
10335b53f8cSChandrakanth patil case HWRM_ERR_CODE_UNKNOWN_ERR:
10435b53f8cSChandrakanth patil default:
10535b53f8cSChandrakanth patil return EDOOFUS;
10635b53f8cSChandrakanth patil }
10735b53f8cSChandrakanth patil
10835b53f8cSChandrakanth patil return rc;
10935b53f8cSChandrakanth patil }
11035b53f8cSChandrakanth patil
11135b53f8cSChandrakanth patil int
bnxt_alloc_hwrm_dma_mem(struct bnxt_softc * softc)11235b53f8cSChandrakanth patil bnxt_alloc_hwrm_dma_mem(struct bnxt_softc *softc)
11335b53f8cSChandrakanth patil {
11435b53f8cSChandrakanth patil int rc;
11535b53f8cSChandrakanth patil
11635b53f8cSChandrakanth patil rc = iflib_dma_alloc(softc->ctx, PAGE_SIZE, &softc->hwrm_cmd_resp,
11735b53f8cSChandrakanth patil BUS_DMA_NOWAIT);
11835b53f8cSChandrakanth patil return rc;
11935b53f8cSChandrakanth patil }
12035b53f8cSChandrakanth patil
12135b53f8cSChandrakanth patil void
bnxt_free_hwrm_dma_mem(struct bnxt_softc * softc)12235b53f8cSChandrakanth patil bnxt_free_hwrm_dma_mem(struct bnxt_softc *softc)
12335b53f8cSChandrakanth patil {
12435b53f8cSChandrakanth patil if (softc->hwrm_cmd_resp.idi_vaddr)
12535b53f8cSChandrakanth patil iflib_dma_free(&softc->hwrm_cmd_resp);
12635b53f8cSChandrakanth patil softc->hwrm_cmd_resp.idi_vaddr = NULL;
12735b53f8cSChandrakanth patil return;
12835b53f8cSChandrakanth patil }
12935b53f8cSChandrakanth patil
13035b53f8cSChandrakanth patil void
bnxt_hwrm_cmd_hdr_init(struct bnxt_softc * softc,void * request,uint16_t req_type)13135b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(struct bnxt_softc *softc, void *request,
13235b53f8cSChandrakanth patil uint16_t req_type)
13335b53f8cSChandrakanth patil {
13435b53f8cSChandrakanth patil struct input *req = request;
13535b53f8cSChandrakanth patil
13635b53f8cSChandrakanth patil req->req_type = htole16(req_type);
13735b53f8cSChandrakanth patil req->cmpl_ring = 0xffff;
13835b53f8cSChandrakanth patil req->target_id = 0xffff;
13935b53f8cSChandrakanth patil req->resp_addr = htole64(softc->hwrm_cmd_resp.idi_paddr);
14035b53f8cSChandrakanth patil }
14135b53f8cSChandrakanth patil
14235b53f8cSChandrakanth patil int
_hwrm_send_message(struct bnxt_softc * softc,void * msg,uint32_t msg_len)14335b53f8cSChandrakanth patil _hwrm_send_message(struct bnxt_softc *softc, void *msg, uint32_t msg_len)
14435b53f8cSChandrakanth patil {
14535b53f8cSChandrakanth patil struct input *req = msg;
14635b53f8cSChandrakanth patil struct hwrm_err_output *resp = (void *)softc->hwrm_cmd_resp.idi_vaddr;
14735b53f8cSChandrakanth patil uint32_t *data = msg;
14835b53f8cSChandrakanth patil int i;
14935b53f8cSChandrakanth patil uint8_t *valid;
15035b53f8cSChandrakanth patil uint16_t err;
15135b53f8cSChandrakanth patil uint16_t max_req_len = BNXT_HWRM_MAX_REQ_LEN;
15235b53f8cSChandrakanth patil struct hwrm_short_input short_input = {0};
15335b53f8cSChandrakanth patil
15435b53f8cSChandrakanth patil /* TODO: DMASYNC in here. */
15535b53f8cSChandrakanth patil req->seq_id = htole16(softc->hwrm_cmd_seq++);
15635b53f8cSChandrakanth patil memset(resp, 0, PAGE_SIZE);
15735b53f8cSChandrakanth patil
158050d28e1SChandrakanth patil if (BNXT_NO_FW_ACCESS(softc) &&
159050d28e1SChandrakanth patil (req->req_type != HWRM_FUNC_RESET && req->req_type != HWRM_VER_GET))
160050d28e1SChandrakanth patil return -EINVAL;
161050d28e1SChandrakanth patil
16235b53f8cSChandrakanth patil if ((softc->flags & BNXT_FLAG_SHORT_CMD) ||
16335b53f8cSChandrakanth patil msg_len > BNXT_HWRM_MAX_REQ_LEN) {
16435b53f8cSChandrakanth patil void *short_cmd_req = softc->hwrm_short_cmd_req_addr.idi_vaddr;
16535b53f8cSChandrakanth patil uint16_t max_msg_len;
16635b53f8cSChandrakanth patil
16735b53f8cSChandrakanth patil /* Set boundary for maximum extended request length for short
16835b53f8cSChandrakanth patil * cmd format. If passed up from device use the max supported
16935b53f8cSChandrakanth patil * internal req length.
17035b53f8cSChandrakanth patil */
17135b53f8cSChandrakanth patil
17235b53f8cSChandrakanth patil max_msg_len = softc->hwrm_max_ext_req_len;
17335b53f8cSChandrakanth patil
17435b53f8cSChandrakanth patil
17535b53f8cSChandrakanth patil memcpy(short_cmd_req, req, msg_len);
17635b53f8cSChandrakanth patil if (msg_len < max_msg_len)
17735b53f8cSChandrakanth patil memset((uint8_t *) short_cmd_req + msg_len, 0,
17835b53f8cSChandrakanth patil max_msg_len - msg_len);
17935b53f8cSChandrakanth patil
18035b53f8cSChandrakanth patil short_input.req_type = req->req_type;
18135b53f8cSChandrakanth patil short_input.signature =
18235b53f8cSChandrakanth patil htole16(HWRM_SHORT_INPUT_SIGNATURE_SHORT_CMD);
18335b53f8cSChandrakanth patil short_input.size = htole16(msg_len);
18435b53f8cSChandrakanth patil short_input.req_addr =
18535b53f8cSChandrakanth patil htole64(softc->hwrm_short_cmd_req_addr.idi_paddr);
18635b53f8cSChandrakanth patil
18735b53f8cSChandrakanth patil data = (uint32_t *)&short_input;
18835b53f8cSChandrakanth patil msg_len = sizeof(short_input);
18935b53f8cSChandrakanth patil
19035b53f8cSChandrakanth patil /* Sync memory write before updating doorbell */
19135b53f8cSChandrakanth patil wmb();
19235b53f8cSChandrakanth patil
19335b53f8cSChandrakanth patil max_req_len = BNXT_HWRM_SHORT_REQ_LEN;
19435b53f8cSChandrakanth patil }
19535b53f8cSChandrakanth patil
19635b53f8cSChandrakanth patil /* Write request msg to hwrm channel */
19735b53f8cSChandrakanth patil for (i = 0; i < msg_len; i += 4) {
19835b53f8cSChandrakanth patil bus_space_write_4(softc->hwrm_bar.tag,
19935b53f8cSChandrakanth patil softc->hwrm_bar.handle,
20035b53f8cSChandrakanth patil i, *data);
20135b53f8cSChandrakanth patil data++;
20235b53f8cSChandrakanth patil }
20335b53f8cSChandrakanth patil
20435b53f8cSChandrakanth patil /* Clear to the end of the request buffer */
20535b53f8cSChandrakanth patil for (i = msg_len; i < max_req_len; i += 4)
20635b53f8cSChandrakanth patil bus_space_write_4(softc->hwrm_bar.tag, softc->hwrm_bar.handle,
20735b53f8cSChandrakanth patil i, 0);
20835b53f8cSChandrakanth patil
20935b53f8cSChandrakanth patil /* Ring channel doorbell */
21035b53f8cSChandrakanth patil bus_space_write_4(softc->hwrm_bar.tag,
21135b53f8cSChandrakanth patil softc->hwrm_bar.handle,
21235b53f8cSChandrakanth patil 0x100, htole32(1));
21335b53f8cSChandrakanth patil
21435b53f8cSChandrakanth patil /* Check if response len is updated */
21535b53f8cSChandrakanth patil for (i = 0; i < softc->hwrm_cmd_timeo; i++) {
21635b53f8cSChandrakanth patil if (resp->resp_len && resp->resp_len <= 4096)
21735b53f8cSChandrakanth patil break;
21835b53f8cSChandrakanth patil DELAY(1000);
21935b53f8cSChandrakanth patil }
22035b53f8cSChandrakanth patil if (i >= softc->hwrm_cmd_timeo) {
22135b53f8cSChandrakanth patil device_printf(softc->dev,
22235b53f8cSChandrakanth patil "Timeout sending %s: (timeout: %u) seq: %d\n",
22335b53f8cSChandrakanth patil GET_HWRM_REQ_TYPE(req->req_type), softc->hwrm_cmd_timeo,
22435b53f8cSChandrakanth patil le16toh(req->seq_id));
22535b53f8cSChandrakanth patil return ETIMEDOUT;
22635b53f8cSChandrakanth patil }
22735b53f8cSChandrakanth patil /* Last byte of resp contains the valid key */
22835b53f8cSChandrakanth patil valid = (uint8_t *)resp + resp->resp_len - 1;
22935b53f8cSChandrakanth patil for (i = 0; i < softc->hwrm_cmd_timeo; i++) {
23035b53f8cSChandrakanth patil if (*valid == HWRM_RESP_VALID_KEY)
23135b53f8cSChandrakanth patil break;
23235b53f8cSChandrakanth patil DELAY(1000);
23335b53f8cSChandrakanth patil }
23435b53f8cSChandrakanth patil if (i >= softc->hwrm_cmd_timeo) {
23535b53f8cSChandrakanth patil device_printf(softc->dev, "Timeout sending %s: "
23635b53f8cSChandrakanth patil "(timeout: %u) msg {0x%x 0x%x} len:%d v: %d\n",
23735b53f8cSChandrakanth patil GET_HWRM_REQ_TYPE(req->req_type),
23835b53f8cSChandrakanth patil softc->hwrm_cmd_timeo, le16toh(req->req_type),
23935b53f8cSChandrakanth patil le16toh(req->seq_id), msg_len,
24035b53f8cSChandrakanth patil *valid);
24135b53f8cSChandrakanth patil return ETIMEDOUT;
24235b53f8cSChandrakanth patil }
24335b53f8cSChandrakanth patil
24435b53f8cSChandrakanth patil err = le16toh(resp->error_code);
24535b53f8cSChandrakanth patil if (err) {
24635b53f8cSChandrakanth patil /* HWRM_ERR_CODE_FAIL is a "normal" error, don't log */
24735b53f8cSChandrakanth patil if (err != HWRM_ERR_CODE_FAIL) {
24835b53f8cSChandrakanth patil device_printf(softc->dev,
24935b53f8cSChandrakanth patil "%s command returned %s error.\n",
25035b53f8cSChandrakanth patil GET_HWRM_REQ_TYPE(req->req_type),
25135b53f8cSChandrakanth patil GET_HWRM_ERROR_CODE(err));
25235b53f8cSChandrakanth patil }
25335b53f8cSChandrakanth patil return bnxt_hwrm_err_map(err);
25435b53f8cSChandrakanth patil }
25535b53f8cSChandrakanth patil
25635b53f8cSChandrakanth patil return 0;
25735b53f8cSChandrakanth patil }
25835b53f8cSChandrakanth patil
25935b53f8cSChandrakanth patil int
hwrm_send_message(struct bnxt_softc * softc,void * msg,uint32_t msg_len)26035b53f8cSChandrakanth patil hwrm_send_message(struct bnxt_softc *softc, void *msg, uint32_t msg_len)
26135b53f8cSChandrakanth patil {
26235b53f8cSChandrakanth patil int rc;
26335b53f8cSChandrakanth patil
26435b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
26535b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, msg, msg_len);
26635b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
26735b53f8cSChandrakanth patil return rc;
26835b53f8cSChandrakanth patil }
26935b53f8cSChandrakanth patil
27035b53f8cSChandrakanth patil int
bnxt_hwrm_queue_qportcfg(struct bnxt_softc * softc,uint32_t path_dir)27135b53f8cSChandrakanth patil bnxt_hwrm_queue_qportcfg(struct bnxt_softc *softc, uint32_t path_dir)
27235b53f8cSChandrakanth patil {
27335b53f8cSChandrakanth patil int rc = 0;
27435b53f8cSChandrakanth patil struct hwrm_queue_qportcfg_input req = {0};
27535b53f8cSChandrakanth patil struct hwrm_queue_qportcfg_output *resp =
27635b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
27735b53f8cSChandrakanth patil uint8_t max_tc, max_lltc, *max_q;
27835b53f8cSChandrakanth patil uint8_t queue_profile, queue_id;
27935b53f8cSChandrakanth patil struct bnxt_queue_info *q_info;
28035b53f8cSChandrakanth patil uint8_t i, j, *qptr, *q_ids;
28135b53f8cSChandrakanth patil bool no_rdma;
28235b53f8cSChandrakanth patil
28335b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_QUEUE_QPORTCFG);
28435b53f8cSChandrakanth patil
28535b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
28635b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
28735b53f8cSChandrakanth patil if (rc)
28835b53f8cSChandrakanth patil goto qportcfg_exit;
28935b53f8cSChandrakanth patil
29035b53f8cSChandrakanth patil if (!resp->max_configurable_queues) {
29135b53f8cSChandrakanth patil rc = -EINVAL;
29235b53f8cSChandrakanth patil goto qportcfg_exit;
29335b53f8cSChandrakanth patil }
29435b53f8cSChandrakanth patil
29535b53f8cSChandrakanth patil if (resp->queue_cfg_info & HWRM_QUEUE_QPORTCFG_OUTPUT_QUEUE_CFG_INFO_ASYM_CFG) {
29635b53f8cSChandrakanth patil softc->is_asym_q = true;
29735b53f8cSChandrakanth patil /* bnxt_init_cosq_names(softc, path_dir); */
29835b53f8cSChandrakanth patil } else {
29935b53f8cSChandrakanth patil softc->is_asym_q = false;
30035b53f8cSChandrakanth patil /* bnxt_free_stats_cosqnames_mem(softc); */
30135b53f8cSChandrakanth patil }
30235b53f8cSChandrakanth patil
30335b53f8cSChandrakanth patil max_tc = min_t(uint8_t, resp->max_configurable_queues, BNXT_MAX_QUEUE);
30435b53f8cSChandrakanth patil max_lltc = resp->max_configurable_lossless_queues;
30535b53f8cSChandrakanth patil
30635b53f8cSChandrakanth patil /*
30735b53f8cSChandrakanth patil * No RDMA support yet.
30835b53f8cSChandrakanth patil * no_rdma = !(softc->flags & BNXT_FLAG_ROCE_CAP);
30935b53f8cSChandrakanth patil */
31035b53f8cSChandrakanth patil no_rdma = true;
31135b53f8cSChandrakanth patil qptr = &resp->queue_id0;
31235b53f8cSChandrakanth patil
31335b53f8cSChandrakanth patil if (path_dir == HWRM_QUEUE_QPORTCFG_INPUT_FLAGS_PATH_TX) {
31435b53f8cSChandrakanth patil q_info = softc->tx_q_info;
31535b53f8cSChandrakanth patil q_ids = softc->tx_q_ids;
31635b53f8cSChandrakanth patil max_q = &softc->tx_max_q;
31735b53f8cSChandrakanth patil } else {
31835b53f8cSChandrakanth patil q_info = softc->rx_q_info;
31935b53f8cSChandrakanth patil q_ids = softc->rx_q_ids;
32035b53f8cSChandrakanth patil max_q = &softc->rx_max_q;
32135b53f8cSChandrakanth patil }
32235b53f8cSChandrakanth patil
32335b53f8cSChandrakanth patil for (i = 0, j = 0; i < max_tc; i++) {
32435b53f8cSChandrakanth patil queue_id = *qptr;
32535b53f8cSChandrakanth patil qptr++;
32635b53f8cSChandrakanth patil
32735b53f8cSChandrakanth patil queue_profile = *qptr;
32835b53f8cSChandrakanth patil qptr++;
32935b53f8cSChandrakanth patil
33035b53f8cSChandrakanth patil q_info[j].queue_id = queue_id;
33135b53f8cSChandrakanth patil q_info[j].queue_profile = queue_profile;
33235b53f8cSChandrakanth patil q_ids[i] = queue_id;
33335b53f8cSChandrakanth patil
33435b53f8cSChandrakanth patil softc->tc_to_qidx[j] = j;
33535b53f8cSChandrakanth patil
33635b53f8cSChandrakanth patil if (!BNXT_CNPQ(q_info[j].queue_profile) ||
33735b53f8cSChandrakanth patil (no_rdma && BNXT_PF(softc)))
33835b53f8cSChandrakanth patil j++;
33935b53f8cSChandrakanth patil }
34035b53f8cSChandrakanth patil *max_q = max_tc;
34135b53f8cSChandrakanth patil max_tc = max_t(uint8_t, j, 1);
34235b53f8cSChandrakanth patil softc->max_tc = softc->max_tc ? min(softc->max_tc, max_tc) : max_tc;
34335b53f8cSChandrakanth patil softc->max_lltc = softc->max_lltc ? min(softc->max_lltc, max_lltc) : max_lltc;
34435b53f8cSChandrakanth patil
34535b53f8cSChandrakanth patil if (softc->max_lltc > softc->max_tc)
34635b53f8cSChandrakanth patil softc->max_lltc = softc->max_tc;
34735b53f8cSChandrakanth patil
34835b53f8cSChandrakanth patil qportcfg_exit:
34935b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
35035b53f8cSChandrakanth patil return rc;
35135b53f8cSChandrakanth patil }
35235b53f8cSChandrakanth patil
bnxt_alloc_all_ctx_pg_info(struct bnxt_softc * softc,int ctx_max)353d5ce906dSSreekanth Reddy static int bnxt_alloc_all_ctx_pg_info(struct bnxt_softc *softc, int ctx_max)
354050d28e1SChandrakanth patil {
355050d28e1SChandrakanth patil struct bnxt_ctx_mem_info *ctx = softc->ctx_mem;
356050d28e1SChandrakanth patil u16 type;
357050d28e1SChandrakanth patil
358d5ce906dSSreekanth Reddy for (type = 0; type < ctx_max; type++) {
359050d28e1SChandrakanth patil struct bnxt_ctx_mem_type *ctxm = &ctx->ctx_arr[type];
360050d28e1SChandrakanth patil int n = 1;
361050d28e1SChandrakanth patil
362050d28e1SChandrakanth patil if (!ctxm->max_entries || ctxm->pg_info)
363050d28e1SChandrakanth patil continue;
364050d28e1SChandrakanth patil
365050d28e1SChandrakanth patil if (ctxm->instance_bmap)
366050d28e1SChandrakanth patil n = hweight32(ctxm->instance_bmap);
367d5ce906dSSreekanth Reddy ctxm->pg_info = kcalloc(n, sizeof(*ctxm->pg_info), GFP_ATOMIC);
368050d28e1SChandrakanth patil if (!ctxm->pg_info)
369050d28e1SChandrakanth patil return -ENOMEM;
370050d28e1SChandrakanth patil }
371050d28e1SChandrakanth patil return 0;
372050d28e1SChandrakanth patil }
373050d28e1SChandrakanth patil
bnxt_init_ctx_initializer(struct bnxt_ctx_mem_type * ctxm,u8 init_val,u8 init_offset,bool init_mask_set)374050d28e1SChandrakanth patil static void bnxt_init_ctx_initializer(struct bnxt_ctx_mem_type *ctxm,
375050d28e1SChandrakanth patil u8 init_val, u8 init_offset,
376050d28e1SChandrakanth patil bool init_mask_set)
377050d28e1SChandrakanth patil {
378050d28e1SChandrakanth patil ctxm->init_value = init_val;
379050d28e1SChandrakanth patil ctxm->init_offset = BNXT_CTX_INIT_INVALID_OFFSET;
380050d28e1SChandrakanth patil if (init_mask_set)
381050d28e1SChandrakanth patil ctxm->init_offset = init_offset * 4;
382050d28e1SChandrakanth patil else
383050d28e1SChandrakanth patil ctxm->init_value = 0;
384050d28e1SChandrakanth patil }
385050d28e1SChandrakanth patil
386d5ce906dSSreekanth Reddy #define BNXT_CTX_INIT_VALID(flags) \
387d5ce906dSSreekanth Reddy (!!((flags) & \
388d5ce906dSSreekanth Reddy HWRM_FUNC_BACKING_STORE_QCAPS_V2_OUTPUT_FLAGS_ENABLE_CTX_KIND_INIT))
389d5ce906dSSreekanth Reddy
390d5ce906dSSreekanth Reddy static int
bnxt_hwrm_func_backing_store_qcaps_v2(struct bnxt_softc * softc)391d5ce906dSSreekanth Reddy bnxt_hwrm_func_backing_store_qcaps_v2(struct bnxt_softc *softc)
392d5ce906dSSreekanth Reddy {
393d5ce906dSSreekanth Reddy struct hwrm_func_backing_store_qcaps_v2_input req = {0};
394d5ce906dSSreekanth Reddy struct hwrm_func_backing_store_qcaps_v2_output *resp =
395d5ce906dSSreekanth Reddy (void *)softc->hwrm_cmd_resp.idi_vaddr;
396d5ce906dSSreekanth Reddy struct bnxt_ctx_mem_info *ctx = NULL;
397d5ce906dSSreekanth Reddy u16 type;
398d5ce906dSSreekanth Reddy int rc;
399d5ce906dSSreekanth Reddy
400d5ce906dSSreekanth Reddy bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FUNC_BACKING_STORE_QCAPS_V2);
401d5ce906dSSreekanth Reddy
402d5ce906dSSreekanth Reddy ctx = malloc(sizeof(*ctx), M_DEVBUF, M_NOWAIT | M_ZERO);
403d5ce906dSSreekanth Reddy if (!ctx)
404d5ce906dSSreekanth Reddy return -ENOMEM;
405d5ce906dSSreekanth Reddy
406d5ce906dSSreekanth Reddy softc->ctx_mem = ctx;
407d5ce906dSSreekanth Reddy
408d5ce906dSSreekanth Reddy BNXT_HWRM_LOCK(softc);
409d5ce906dSSreekanth Reddy for (type = 0; type < BNXT_CTX_V2_MAX; ) {
410d5ce906dSSreekanth Reddy struct bnxt_ctx_mem_type *ctxm = &ctx->ctx_arr[type];
411d5ce906dSSreekanth Reddy u8 init_val, init_off, i;
412d5ce906dSSreekanth Reddy __le32 *p;
413d5ce906dSSreekanth Reddy u32 flags;
414d5ce906dSSreekanth Reddy
415d5ce906dSSreekanth Reddy req.type = cpu_to_le16(type);
416d5ce906dSSreekanth Reddy rc = _hwrm_send_message(softc, &req, sizeof(req));
417d5ce906dSSreekanth Reddy if (rc)
418d5ce906dSSreekanth Reddy goto ctx_done;
419d5ce906dSSreekanth Reddy flags = le32_to_cpu(resp->flags);
420d5ce906dSSreekanth Reddy type = le16_to_cpu(resp->next_valid_type);
421d5ce906dSSreekanth Reddy if (!(flags & HWRM_FUNC_BACKING_STORE_QCAPS_V2_OUTPUT_FLAGS_TYPE_VALID))
422d5ce906dSSreekanth Reddy continue;
423d5ce906dSSreekanth Reddy
424d5ce906dSSreekanth Reddy ctxm->type = le16_to_cpu(resp->type);
425d5ce906dSSreekanth Reddy ctxm->flags = flags;
426d5ce906dSSreekanth Reddy
427d5ce906dSSreekanth Reddy ctxm->entry_size = le16_to_cpu(resp->entry_size);
428d5ce906dSSreekanth Reddy ctxm->instance_bmap = le32_to_cpu(resp->instance_bit_map);
429d5ce906dSSreekanth Reddy ctxm->entry_multiple = resp->entry_multiple;
430d5ce906dSSreekanth Reddy ctxm->max_entries = le32_to_cpu(resp->max_num_entries);
431d5ce906dSSreekanth Reddy ctxm->min_entries = le32_to_cpu(resp->min_num_entries);
432d5ce906dSSreekanth Reddy init_val = resp->ctx_init_value;
433d5ce906dSSreekanth Reddy init_off = resp->ctx_init_offset;
434d5ce906dSSreekanth Reddy bnxt_init_ctx_initializer(ctxm, init_val, init_off,
435d5ce906dSSreekanth Reddy BNXT_CTX_INIT_VALID(flags));
436d5ce906dSSreekanth Reddy ctxm->split_entry_cnt = min_t(u8, resp->subtype_valid_cnt,
437d5ce906dSSreekanth Reddy BNXT_MAX_SPLIT_ENTRY);
438d5ce906dSSreekanth Reddy for (i = 0, p = &resp->split_entry_0; i < ctxm->split_entry_cnt;
439d5ce906dSSreekanth Reddy i++, p++)
440d5ce906dSSreekanth Reddy ctxm->split[i] = le32_to_cpu(*p);
441d5ce906dSSreekanth Reddy }
442d5ce906dSSreekanth Reddy rc = bnxt_alloc_all_ctx_pg_info(softc, BNXT_CTX_V2_MAX);
443d5ce906dSSreekanth Reddy
444d5ce906dSSreekanth Reddy ctx_done:
445d5ce906dSSreekanth Reddy BNXT_HWRM_UNLOCK(softc);
446d5ce906dSSreekanth Reddy return rc;
447d5ce906dSSreekanth Reddy }
448d5ce906dSSreekanth Reddy
bnxt_hwrm_func_backing_store_qcaps(struct bnxt_softc * softc)44935b53f8cSChandrakanth patil int bnxt_hwrm_func_backing_store_qcaps(struct bnxt_softc *softc)
45035b53f8cSChandrakanth patil {
45135b53f8cSChandrakanth patil struct hwrm_func_backing_store_qcaps_input req = {0};
45235b53f8cSChandrakanth patil struct hwrm_func_backing_store_qcaps_output *resp =
45335b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
45435b53f8cSChandrakanth patil int rc;
45535b53f8cSChandrakanth patil
456050d28e1SChandrakanth patil if (softc->hwrm_spec_code < 0x10902 || softc->ctx_mem)
457050d28e1SChandrakanth patil return 0;
458050d28e1SChandrakanth patil
459d5ce906dSSreekanth Reddy if (BNXT_CHIP_P7(softc)) {
460d5ce906dSSreekanth Reddy if (softc->fw_cap & BNXT_FW_CAP_BACKING_STORE_V2)
461d5ce906dSSreekanth Reddy return bnxt_hwrm_func_backing_store_qcaps_v2(softc);
462d5ce906dSSreekanth Reddy }
463d5ce906dSSreekanth Reddy
464050d28e1SChandrakanth patil if (BNXT_VF(softc))
46535b53f8cSChandrakanth patil return 0;
46635b53f8cSChandrakanth patil
46735b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FUNC_BACKING_STORE_QCAPS);
46835b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
46935b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
47035b53f8cSChandrakanth patil if (!rc) {
471050d28e1SChandrakanth patil struct bnxt_ctx_mem_type *ctxm;
47235b53f8cSChandrakanth patil struct bnxt_ctx_mem_info *ctx;
473050d28e1SChandrakanth patil u8 init_val, init_idx = 0;
474050d28e1SChandrakanth patil u16 init_mask;
47535b53f8cSChandrakanth patil
476050d28e1SChandrakanth patil ctx = softc->ctx_mem;
477050d28e1SChandrakanth patil if (!ctx) {
47835b53f8cSChandrakanth patil ctx = malloc(sizeof(*ctx), M_DEVBUF, M_NOWAIT | M_ZERO);
47935b53f8cSChandrakanth patil if (!ctx) {
48035b53f8cSChandrakanth patil rc = -ENOMEM;
48135b53f8cSChandrakanth patil goto ctx_err;
48235b53f8cSChandrakanth patil }
48335b53f8cSChandrakanth patil softc->ctx_mem = ctx;
484050d28e1SChandrakanth patil }
485050d28e1SChandrakanth patil init_val = resp->ctx_kind_initializer;
486050d28e1SChandrakanth patil init_mask = le16_to_cpu(resp->ctx_init_mask);
487050d28e1SChandrakanth patil
488050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_QP];
489050d28e1SChandrakanth patil ctxm->max_entries = le32_to_cpu(resp->qp_max_entries);
490050d28e1SChandrakanth patil ctxm->qp_qp1_entries = le16_to_cpu(resp->qp_min_qp1_entries);
491050d28e1SChandrakanth patil ctxm->qp_l2_entries = le16_to_cpu(resp->qp_max_l2_entries);
492050d28e1SChandrakanth patil ctxm->entry_size = le16_to_cpu(resp->qp_entry_size);
493050d28e1SChandrakanth patil bnxt_init_ctx_initializer(ctxm, init_val, resp->qp_init_offset,
494050d28e1SChandrakanth patil (init_mask & (1 << init_idx++)) != 0);
495050d28e1SChandrakanth patil
496050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_SRQ];
497050d28e1SChandrakanth patil ctxm->srq_l2_entries = le16_to_cpu(resp->srq_max_l2_entries);
498050d28e1SChandrakanth patil ctxm->max_entries = le32_to_cpu(resp->srq_max_entries);
499050d28e1SChandrakanth patil ctxm->entry_size = le16_to_cpu(resp->srq_entry_size);
500050d28e1SChandrakanth patil bnxt_init_ctx_initializer(ctxm, init_val, resp->srq_init_offset,
501050d28e1SChandrakanth patil (init_mask & (1 << init_idx++)) != 0);
502050d28e1SChandrakanth patil
503050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_CQ];
504050d28e1SChandrakanth patil ctxm->cq_l2_entries = le16_to_cpu(resp->cq_max_l2_entries);
505050d28e1SChandrakanth patil ctxm->max_entries = le32_to_cpu(resp->cq_max_entries);
506050d28e1SChandrakanth patil ctxm->entry_size = le16_to_cpu(resp->cq_entry_size);
507050d28e1SChandrakanth patil bnxt_init_ctx_initializer(ctxm, init_val, resp->cq_init_offset,
508050d28e1SChandrakanth patil (init_mask & (1 << init_idx++)) != 0);
509050d28e1SChandrakanth patil
510050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_VNIC];
511050d28e1SChandrakanth patil ctxm->vnic_entries = le32_to_cpu(resp->vnic_max_vnic_entries);
512050d28e1SChandrakanth patil ctxm->max_entries = ctxm->vnic_entries +
513050d28e1SChandrakanth patil le16_to_cpu(resp->vnic_max_ring_table_entries);
514050d28e1SChandrakanth patil ctxm->entry_size = le16_to_cpu(resp->vnic_entry_size);
515050d28e1SChandrakanth patil bnxt_init_ctx_initializer(ctxm, init_val,
516050d28e1SChandrakanth patil resp->vnic_init_offset,
517050d28e1SChandrakanth patil (init_mask & (1 << init_idx++)) != 0);
518050d28e1SChandrakanth patil
519050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_STAT];
520050d28e1SChandrakanth patil ctxm->max_entries = le32_to_cpu(resp->stat_max_entries);
521050d28e1SChandrakanth patil ctxm->entry_size = le16_to_cpu(resp->stat_entry_size);
522050d28e1SChandrakanth patil bnxt_init_ctx_initializer(ctxm, init_val,
523050d28e1SChandrakanth patil resp->stat_init_offset,
524050d28e1SChandrakanth patil (init_mask & (1 << init_idx++)) != 0);
525050d28e1SChandrakanth patil
526050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_STQM];
527050d28e1SChandrakanth patil ctxm->entry_size = le16_to_cpu(resp->tqm_entry_size);
528050d28e1SChandrakanth patil ctxm->min_entries = le32_to_cpu(resp->tqm_min_entries_per_ring);
529050d28e1SChandrakanth patil ctxm->max_entries = le32_to_cpu(resp->tqm_max_entries_per_ring);
530050d28e1SChandrakanth patil ctxm->entry_multiple = resp->tqm_entries_multiple;
531050d28e1SChandrakanth patil if (!ctxm->entry_multiple)
532050d28e1SChandrakanth patil ctxm->entry_multiple = 1;
533050d28e1SChandrakanth patil
534050d28e1SChandrakanth patil memcpy(&ctx->ctx_arr[BNXT_CTX_FTQM], ctxm, sizeof(*ctxm));
535050d28e1SChandrakanth patil
536050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_MRAV];
537050d28e1SChandrakanth patil ctxm->max_entries = le32_to_cpu(resp->mrav_max_entries);
538050d28e1SChandrakanth patil ctxm->entry_size = le16_to_cpu(resp->mrav_entry_size);
539050d28e1SChandrakanth patil ctxm->mrav_num_entries_units =
540050d28e1SChandrakanth patil le16_to_cpu(resp->mrav_num_entries_units);
541050d28e1SChandrakanth patil bnxt_init_ctx_initializer(ctxm, init_val,
542050d28e1SChandrakanth patil resp->mrav_init_offset,
543050d28e1SChandrakanth patil (init_mask & (1 << init_idx++)) != 0);
544050d28e1SChandrakanth patil
545050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_TIM];
546050d28e1SChandrakanth patil ctxm->entry_size = le16_to_cpu(resp->tim_entry_size);
547050d28e1SChandrakanth patil ctxm->max_entries = le32_to_cpu(resp->tim_max_entries);
548050d28e1SChandrakanth patil
549050d28e1SChandrakanth patil ctx->tqm_fp_rings_count = resp->tqm_fp_rings_count;
550050d28e1SChandrakanth patil if (!ctx->tqm_fp_rings_count)
551050d28e1SChandrakanth patil ctx->tqm_fp_rings_count = softc->tx_max_q;
552050d28e1SChandrakanth patil else if (ctx->tqm_fp_rings_count > BNXT_MAX_TQM_FP_LEGACY_RINGS)
553050d28e1SChandrakanth patil ctx->tqm_fp_rings_count = BNXT_MAX_TQM_FP_LEGACY_RINGS;
554050d28e1SChandrakanth patil if (ctx->tqm_fp_rings_count == BNXT_MAX_TQM_FP_LEGACY_RINGS &&
555050d28e1SChandrakanth patil softc->hwrm_max_ext_req_len >= BNXT_BACKING_STORE_CFG_LEN) {
556050d28e1SChandrakanth patil ctx->tqm_fp_rings_count += resp->tqm_fp_rings_count_ext;
557050d28e1SChandrakanth patil if (ctx->tqm_fp_rings_count > BNXT_MAX_TQM_FP_RINGS)
558050d28e1SChandrakanth patil ctx->tqm_fp_rings_count = BNXT_MAX_TQM_FP_RINGS;
559050d28e1SChandrakanth patil }
560050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_FTQM];
561050d28e1SChandrakanth patil memcpy(ctxm, &ctx->ctx_arr[BNXT_CTX_STQM], sizeof(*ctxm));
562050d28e1SChandrakanth patil ctxm->instance_bmap = (1 << ctx->tqm_fp_rings_count) - 1;
563050d28e1SChandrakanth patil
564d5ce906dSSreekanth Reddy rc = bnxt_alloc_all_ctx_pg_info(softc, BNXT_CTX_MAX);
56535b53f8cSChandrakanth patil } else {
56635b53f8cSChandrakanth patil rc = 0;
56735b53f8cSChandrakanth patil }
56835b53f8cSChandrakanth patil ctx_err:
56935b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
57035b53f8cSChandrakanth patil return rc;
57135b53f8cSChandrakanth patil }
57235b53f8cSChandrakanth patil
57335b53f8cSChandrakanth patil #define HWRM_FUNC_BACKING_STORE_CFG_INPUT_DFLT_ENABLES \
57435b53f8cSChandrakanth patil (HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_QP | \
57535b53f8cSChandrakanth patil HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_SRQ | \
57635b53f8cSChandrakanth patil HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_CQ | \
57735b53f8cSChandrakanth patil HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_VNIC | \
57835b53f8cSChandrakanth patil HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_STAT)
57935b53f8cSChandrakanth patil
bnxt_hwrm_set_pg_attr(struct bnxt_ring_mem_info * rmem,uint8_t * pg_attr,uint64_t * pg_dir)58035b53f8cSChandrakanth patil static void bnxt_hwrm_set_pg_attr(struct bnxt_ring_mem_info *rmem, uint8_t *pg_attr,
58135b53f8cSChandrakanth patil uint64_t *pg_dir)
58235b53f8cSChandrakanth patil {
583d5ce906dSSreekanth Reddy if (!rmem->nr_pages)
584d5ce906dSSreekanth Reddy return;
58535b53f8cSChandrakanth patil
586d5ce906dSSreekanth Reddy BNXT_SET_CTX_PAGE_ATTR(*pg_attr);
58735b53f8cSChandrakanth patil
58835b53f8cSChandrakanth patil if (rmem->depth >= 1) {
58935b53f8cSChandrakanth patil if (rmem->depth == 2)
59035b53f8cSChandrakanth patil *pg_attr |= HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_LVL_LVL_2;
59135b53f8cSChandrakanth patil else
59235b53f8cSChandrakanth patil *pg_attr |= HWRM_FUNC_BACKING_STORE_CFG_INPUT_QPC_LVL_LVL_1;
59335b53f8cSChandrakanth patil *pg_dir = htole64(rmem->pg_tbl.idi_paddr);
59435b53f8cSChandrakanth patil } else {
59535b53f8cSChandrakanth patil *pg_dir = htole64(rmem->pg_arr[0].idi_paddr);
59635b53f8cSChandrakanth patil }
59735b53f8cSChandrakanth patil }
59835b53f8cSChandrakanth patil
bnxt_hwrm_func_backing_store_cfg(struct bnxt_softc * softc,uint32_t enables)59935b53f8cSChandrakanth patil int bnxt_hwrm_func_backing_store_cfg(struct bnxt_softc *softc, uint32_t enables)
60035b53f8cSChandrakanth patil {
60135b53f8cSChandrakanth patil struct hwrm_func_backing_store_cfg_input req = {0};
60235b53f8cSChandrakanth patil struct bnxt_ctx_mem_info *ctx = softc->ctx_mem;
60335b53f8cSChandrakanth patil struct bnxt_ctx_pg_info *ctx_pg;
604050d28e1SChandrakanth patil struct bnxt_ctx_mem_type *ctxm;
605050d28e1SChandrakanth patil u32 req_len = sizeof(req);
606050d28e1SChandrakanth patil __le32 *num_entries;
607050d28e1SChandrakanth patil u32 ena, flags = 0;
608050d28e1SChandrakanth patil __le64 *pg_dir;
609050d28e1SChandrakanth patil u8 *pg_attr;
610050d28e1SChandrakanth patil int i;
61135b53f8cSChandrakanth patil
61235b53f8cSChandrakanth patil if (!ctx)
61335b53f8cSChandrakanth patil return 0;
61435b53f8cSChandrakanth patil
615050d28e1SChandrakanth patil if (req_len > softc->hwrm_max_ext_req_len)
616050d28e1SChandrakanth patil req_len = BNXT_BACKING_STORE_CFG_LEGACY_LEN;
617050d28e1SChandrakanth patil
61835b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FUNC_BACKING_STORE_CFG);
61935b53f8cSChandrakanth patil req.enables = htole32(enables);
62035b53f8cSChandrakanth patil
62135b53f8cSChandrakanth patil if (enables & HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_QP) {
622050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_QP];
623050d28e1SChandrakanth patil ctx_pg = ctxm->pg_info;
624050d28e1SChandrakanth patil req.qp_num_entries = cpu_to_le32(ctx_pg->entries);
625050d28e1SChandrakanth patil req.qp_num_qp1_entries = cpu_to_le16(ctxm->qp_qp1_entries);
626050d28e1SChandrakanth patil req.qp_num_l2_entries = cpu_to_le16(ctxm->qp_l2_entries);
627050d28e1SChandrakanth patil req.qp_entry_size = cpu_to_le16(ctxm->entry_size);
62835b53f8cSChandrakanth patil bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
62935b53f8cSChandrakanth patil &req.qpc_pg_size_qpc_lvl,
63035b53f8cSChandrakanth patil &req.qpc_page_dir);
63135b53f8cSChandrakanth patil }
63235b53f8cSChandrakanth patil if (enables & HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_SRQ) {
633050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_SRQ];
634050d28e1SChandrakanth patil ctx_pg = ctxm->pg_info;
635050d28e1SChandrakanth patil req.srq_num_entries = cpu_to_le32(ctx_pg->entries);
636050d28e1SChandrakanth patil req.srq_num_l2_entries = cpu_to_le16(ctxm->srq_l2_entries);
637050d28e1SChandrakanth patil req.srq_entry_size = cpu_to_le16(ctxm->entry_size);
63835b53f8cSChandrakanth patil bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
63935b53f8cSChandrakanth patil &req.srq_pg_size_srq_lvl,
64035b53f8cSChandrakanth patil &req.srq_page_dir);
64135b53f8cSChandrakanth patil }
64235b53f8cSChandrakanth patil if (enables & HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_CQ) {
643050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_CQ];
644050d28e1SChandrakanth patil ctx_pg = ctxm->pg_info;
645050d28e1SChandrakanth patil req.cq_num_entries = cpu_to_le32(ctx_pg->entries);
646050d28e1SChandrakanth patil req.cq_num_l2_entries = cpu_to_le16(ctxm->cq_l2_entries);
647050d28e1SChandrakanth patil req.cq_entry_size = cpu_to_le16(ctxm->entry_size);
648050d28e1SChandrakanth patil bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
649050d28e1SChandrakanth patil &req.cq_pg_size_cq_lvl,
65035b53f8cSChandrakanth patil &req.cq_page_dir);
65135b53f8cSChandrakanth patil }
65235b53f8cSChandrakanth patil if (enables & HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_MRAV) {
653050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_MRAV];
654050d28e1SChandrakanth patil ctx_pg = ctxm->pg_info;
655050d28e1SChandrakanth patil req.mrav_num_entries = cpu_to_le32(ctx_pg->entries);
656050d28e1SChandrakanth patil if (ctxm->mrav_num_entries_units)
657050d28e1SChandrakanth patil flags |=
658050d28e1SChandrakanth patil HWRM_FUNC_BACKING_STORE_CFG_INPUT_FLAGS_MRAV_RESERVATION_SPLIT;
659050d28e1SChandrakanth patil req.mrav_entry_size = cpu_to_le16(ctxm->entry_size);
66035b53f8cSChandrakanth patil bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
66135b53f8cSChandrakanth patil &req.mrav_pg_size_mrav_lvl,
66235b53f8cSChandrakanth patil &req.mrav_page_dir);
66335b53f8cSChandrakanth patil }
66435b53f8cSChandrakanth patil if (enables & HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_TIM) {
665050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_TIM];
666050d28e1SChandrakanth patil ctx_pg = ctxm->pg_info;
667050d28e1SChandrakanth patil req.tim_num_entries = cpu_to_le32(ctx_pg->entries);
668050d28e1SChandrakanth patil req.tim_entry_size = cpu_to_le16(ctxm->entry_size);
66935b53f8cSChandrakanth patil bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
67035b53f8cSChandrakanth patil &req.tim_pg_size_tim_lvl,
67135b53f8cSChandrakanth patil &req.tim_page_dir);
67235b53f8cSChandrakanth patil }
67335b53f8cSChandrakanth patil if (enables & HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_VNIC) {
674050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_VNIC];
675050d28e1SChandrakanth patil ctx_pg = ctxm->pg_info;
676050d28e1SChandrakanth patil req.vnic_num_vnic_entries = cpu_to_le16(ctxm->vnic_entries);
67735b53f8cSChandrakanth patil req.vnic_num_ring_table_entries =
678050d28e1SChandrakanth patil cpu_to_le16(ctxm->max_entries - ctxm->vnic_entries);
679050d28e1SChandrakanth patil req.vnic_entry_size = cpu_to_le16(ctxm->entry_size);
68035b53f8cSChandrakanth patil bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
68135b53f8cSChandrakanth patil &req.vnic_pg_size_vnic_lvl,
68235b53f8cSChandrakanth patil &req.vnic_page_dir);
68335b53f8cSChandrakanth patil }
68435b53f8cSChandrakanth patil if (enables & HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_STAT) {
685050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_STAT];
686050d28e1SChandrakanth patil ctx_pg = ctxm->pg_info;
687050d28e1SChandrakanth patil req.stat_num_entries = cpu_to_le32(ctxm->max_entries);
688050d28e1SChandrakanth patil req.stat_entry_size = cpu_to_le16(ctxm->entry_size);
68935b53f8cSChandrakanth patil bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
69035b53f8cSChandrakanth patil &req.stat_pg_size_stat_lvl,
69135b53f8cSChandrakanth patil &req.stat_page_dir);
69235b53f8cSChandrakanth patil }
693050d28e1SChandrakanth patil ctxm = &ctx->ctx_arr[BNXT_CTX_STQM];
69435b53f8cSChandrakanth patil for (i = 0, num_entries = &req.tqm_sp_num_entries,
69535b53f8cSChandrakanth patil pg_attr = &req.tqm_sp_pg_size_tqm_sp_lvl,
69635b53f8cSChandrakanth patil pg_dir = &req.tqm_sp_page_dir,
697050d28e1SChandrakanth patil ena = HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_TQM_SP,
698050d28e1SChandrakanth patil ctx_pg = ctxm->pg_info;
699050d28e1SChandrakanth patil i < BNXT_MAX_TQM_LEGACY_RINGS;
700050d28e1SChandrakanth patil ctx_pg = &ctx->ctx_arr[BNXT_CTX_FTQM].pg_info[i],
701050d28e1SChandrakanth patil i++, num_entries++, pg_attr++, pg_dir++, ena <<= 1) {
70235b53f8cSChandrakanth patil if (!(enables & ena))
70335b53f8cSChandrakanth patil continue;
70435b53f8cSChandrakanth patil
705050d28e1SChandrakanth patil req.tqm_entry_size = cpu_to_le16(ctxm->entry_size);
706050d28e1SChandrakanth patil *num_entries = cpu_to_le32(ctx_pg->entries);
70735b53f8cSChandrakanth patil bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem, pg_attr, pg_dir);
70835b53f8cSChandrakanth patil }
709050d28e1SChandrakanth patil if (enables & HWRM_FUNC_BACKING_STORE_CFG_INPUT_ENABLES_TQM_RING8) {
710050d28e1SChandrakanth patil pg_attr = &req.tqm_ring8_pg_size_tqm_ring_lvl;
711050d28e1SChandrakanth patil pg_dir = &req.tqm_ring8_page_dir;
712050d28e1SChandrakanth patil ctx_pg = &ctx->ctx_arr[BNXT_CTX_FTQM].pg_info[8];
713050d28e1SChandrakanth patil req.tqm_ring8_num_entries = cpu_to_le32(ctx_pg->entries);
714050d28e1SChandrakanth patil bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem, pg_attr, pg_dir);
715050d28e1SChandrakanth patil }
716050d28e1SChandrakanth patil req.flags = cpu_to_le32(flags);
717050d28e1SChandrakanth patil return hwrm_send_message(softc, &req, sizeof(req));
71835b53f8cSChandrakanth patil }
71935b53f8cSChandrakanth patil
bnxt_hwrm_func_resc_qcaps(struct bnxt_softc * softc,bool all)72035b53f8cSChandrakanth patil int bnxt_hwrm_func_resc_qcaps(struct bnxt_softc *softc, bool all)
72135b53f8cSChandrakanth patil {
72235b53f8cSChandrakanth patil struct hwrm_func_resource_qcaps_output *resp =
72335b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
72435b53f8cSChandrakanth patil struct hwrm_func_resource_qcaps_input req = {0};
72535b53f8cSChandrakanth patil struct bnxt_hw_resc *hw_resc = &softc->hw_resc;
72635b53f8cSChandrakanth patil int rc;
72735b53f8cSChandrakanth patil
72835b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FUNC_RESOURCE_QCAPS);
72935b53f8cSChandrakanth patil req.fid = htole16(0xffff);
73035b53f8cSChandrakanth patil
73135b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
73235b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
73335b53f8cSChandrakanth patil if (rc) {
73435b53f8cSChandrakanth patil rc = -EIO;
73535b53f8cSChandrakanth patil goto hwrm_func_resc_qcaps_exit;
73635b53f8cSChandrakanth patil }
73735b53f8cSChandrakanth patil
73835b53f8cSChandrakanth patil hw_resc->max_tx_sch_inputs = le16toh(resp->max_tx_scheduler_inputs);
73935b53f8cSChandrakanth patil if (!all)
74035b53f8cSChandrakanth patil goto hwrm_func_resc_qcaps_exit;
74135b53f8cSChandrakanth patil
74235b53f8cSChandrakanth patil hw_resc->min_rsscos_ctxs = le16toh(resp->min_rsscos_ctx);
74335b53f8cSChandrakanth patil hw_resc->max_rsscos_ctxs = le16toh(resp->max_rsscos_ctx);
74435b53f8cSChandrakanth patil hw_resc->min_cp_rings = le16toh(resp->min_cmpl_rings);
74535b53f8cSChandrakanth patil hw_resc->max_cp_rings = le16toh(resp->max_cmpl_rings);
74635b53f8cSChandrakanth patil hw_resc->min_tx_rings = le16toh(resp->min_tx_rings);
74735b53f8cSChandrakanth patil hw_resc->max_tx_rings = le16toh(resp->max_tx_rings);
74835b53f8cSChandrakanth patil hw_resc->min_rx_rings = le16toh(resp->min_rx_rings);
74935b53f8cSChandrakanth patil hw_resc->max_rx_rings = le16toh(resp->max_rx_rings);
75035b53f8cSChandrakanth patil hw_resc->min_hw_ring_grps = le16toh(resp->min_hw_ring_grps);
75135b53f8cSChandrakanth patil hw_resc->max_hw_ring_grps = le16toh(resp->max_hw_ring_grps);
75235b53f8cSChandrakanth patil hw_resc->min_l2_ctxs = le16toh(resp->min_l2_ctxs);
75335b53f8cSChandrakanth patil hw_resc->max_l2_ctxs = le16toh(resp->max_l2_ctxs);
75435b53f8cSChandrakanth patil hw_resc->min_vnics = le16toh(resp->min_vnics);
75535b53f8cSChandrakanth patil hw_resc->max_vnics = le16toh(resp->max_vnics);
75635b53f8cSChandrakanth patil hw_resc->min_stat_ctxs = le16toh(resp->min_stat_ctx);
75735b53f8cSChandrakanth patil hw_resc->max_stat_ctxs = le16toh(resp->max_stat_ctx);
75835b53f8cSChandrakanth patil
75926bd37daSSreekanth Reddy if (BNXT_CHIP_P5_PLUS(softc)) {
76035b53f8cSChandrakanth patil hw_resc->max_nqs = le16toh(resp->max_msix);
76135b53f8cSChandrakanth patil hw_resc->max_hw_ring_grps = hw_resc->max_rx_rings;
76235b53f8cSChandrakanth patil }
76335b53f8cSChandrakanth patil
76435b53f8cSChandrakanth patil hwrm_func_resc_qcaps_exit:
76535b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
76635b53f8cSChandrakanth patil return rc;
76735b53f8cSChandrakanth patil }
76835b53f8cSChandrakanth patil
bnxt_hwrm_func_backing_store_cfg_v2(struct bnxt_softc * softc,struct bnxt_ctx_mem_type * ctxm,bool last)769050d28e1SChandrakanth patil int bnxt_hwrm_func_backing_store_cfg_v2(struct bnxt_softc *softc,
770050d28e1SChandrakanth patil struct bnxt_ctx_mem_type *ctxm,
771050d28e1SChandrakanth patil bool last)
772050d28e1SChandrakanth patil {
773050d28e1SChandrakanth patil struct hwrm_func_backing_store_cfg_v2_input req = {0};
774050d28e1SChandrakanth patil u32 instance_bmap = ctxm->instance_bmap;
775050d28e1SChandrakanth patil int i, j, rc = 0, n = 1;
776050d28e1SChandrakanth patil __le32 *p;
777050d28e1SChandrakanth patil
778050d28e1SChandrakanth patil if (!(ctxm->flags & BNXT_CTX_MEM_TYPE_VALID) || !ctxm->pg_info)
779050d28e1SChandrakanth patil return 0;
780050d28e1SChandrakanth patil
781050d28e1SChandrakanth patil if (instance_bmap)
782050d28e1SChandrakanth patil n = hweight32(ctxm->instance_bmap);
783050d28e1SChandrakanth patil else
784050d28e1SChandrakanth patil instance_bmap = 1;
785050d28e1SChandrakanth patil
786050d28e1SChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FUNC_BACKING_STORE_CFG_V2);
787050d28e1SChandrakanth patil
788d5ce906dSSreekanth Reddy BNXT_HWRM_LOCK(softc);
789050d28e1SChandrakanth patil req.type = cpu_to_le16(ctxm->type);
790050d28e1SChandrakanth patil req.entry_size = cpu_to_le16(ctxm->entry_size);
791d5ce906dSSreekanth Reddy req.subtype_valid_cnt = ctxm->split_entry_cnt;
792050d28e1SChandrakanth patil for (i = 0, p = &req.split_entry_0; i < ctxm->split_entry_cnt; i++)
793050d28e1SChandrakanth patil p[i] = cpu_to_le32(ctxm->split[i]);
794050d28e1SChandrakanth patil for (i = 0, j = 0; j < n && !rc; i++) {
795050d28e1SChandrakanth patil struct bnxt_ctx_pg_info *ctx_pg;
796050d28e1SChandrakanth patil
797050d28e1SChandrakanth patil if (!(instance_bmap & (1 << i)))
798050d28e1SChandrakanth patil continue;
799050d28e1SChandrakanth patil req.instance = cpu_to_le16(i);
800050d28e1SChandrakanth patil ctx_pg = &ctxm->pg_info[j++];
801050d28e1SChandrakanth patil if (!ctx_pg->entries)
802050d28e1SChandrakanth patil continue;
803050d28e1SChandrakanth patil req.num_entries = cpu_to_le32(ctx_pg->entries);
804050d28e1SChandrakanth patil bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
805050d28e1SChandrakanth patil &req.page_size_pbl_level,
806050d28e1SChandrakanth patil &req.page_dir);
807d5ce906dSSreekanth Reddy if (last && j == n)
808050d28e1SChandrakanth patil req.flags =
809050d28e1SChandrakanth patil cpu_to_le32(HWRM_FUNC_BACKING_STORE_CFG_V2_INPUT_FLAGS_BS_CFG_ALL_DONE);
810d5ce906dSSreekanth Reddy rc = _hwrm_send_message(softc, &req, sizeof(req));
811050d28e1SChandrakanth patil }
812d5ce906dSSreekanth Reddy BNXT_HWRM_UNLOCK(softc);
813050d28e1SChandrakanth patil return rc;
814050d28e1SChandrakanth patil }
815050d28e1SChandrakanth patil
81635b53f8cSChandrakanth patil int
bnxt_hwrm_passthrough(struct bnxt_softc * softc,void * req,uint32_t req_len,void * resp,uint32_t resp_len,uint32_t app_timeout)81735b53f8cSChandrakanth patil bnxt_hwrm_passthrough(struct bnxt_softc *softc, void *req, uint32_t req_len,
81835b53f8cSChandrakanth patil void *resp, uint32_t resp_len, uint32_t app_timeout)
81935b53f8cSChandrakanth patil {
82035b53f8cSChandrakanth patil int rc = 0;
82135b53f8cSChandrakanth patil void *output = (void *)softc->hwrm_cmd_resp.idi_vaddr;
82235b53f8cSChandrakanth patil struct input *input = req;
82335b53f8cSChandrakanth patil uint32_t old_timeo;
82435b53f8cSChandrakanth patil
82535b53f8cSChandrakanth patil input->resp_addr = htole64(softc->hwrm_cmd_resp.idi_paddr);
82635b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
82735b53f8cSChandrakanth patil old_timeo = softc->hwrm_cmd_timeo;
82835b53f8cSChandrakanth patil if (input->req_type == HWRM_NVM_INSTALL_UPDATE)
82935b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = BNXT_NVM_TIMEO;
83035b53f8cSChandrakanth patil else
83135b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = max(app_timeout, softc->hwrm_cmd_timeo);
83235b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, req, req_len);
83335b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = old_timeo;
83435b53f8cSChandrakanth patil if (rc) {
83535b53f8cSChandrakanth patil device_printf(softc->dev, "%s: %s command failed with rc: 0x%x\n",
83635b53f8cSChandrakanth patil __FUNCTION__, GET_HWRM_REQ_TYPE(input->req_type), rc);
83735b53f8cSChandrakanth patil goto fail;
83835b53f8cSChandrakanth patil }
83935b53f8cSChandrakanth patil
84035b53f8cSChandrakanth patil memcpy(resp, output, resp_len);
84135b53f8cSChandrakanth patil fail:
84235b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
84335b53f8cSChandrakanth patil return rc;
84435b53f8cSChandrakanth patil }
84535b53f8cSChandrakanth patil
84635b53f8cSChandrakanth patil
84735b53f8cSChandrakanth patil int
bnxt_hwrm_ver_get(struct bnxt_softc * softc)84835b53f8cSChandrakanth patil bnxt_hwrm_ver_get(struct bnxt_softc *softc)
84935b53f8cSChandrakanth patil {
85035b53f8cSChandrakanth patil struct hwrm_ver_get_input req = {0};
85135b53f8cSChandrakanth patil struct hwrm_ver_get_output *resp =
85235b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
85335b53f8cSChandrakanth patil int rc;
85435b53f8cSChandrakanth patil const char nastr[] = "<not installed>";
85535b53f8cSChandrakanth patil const char naver[] = "<N/A>";
85635b53f8cSChandrakanth patil uint32_t dev_caps_cfg;
85735b53f8cSChandrakanth patil uint16_t fw_maj, fw_min, fw_bld, fw_rsv, len;
85835b53f8cSChandrakanth patil
85935b53f8cSChandrakanth patil softc->hwrm_max_req_len = HWRM_MAX_REQ_LEN;
86035b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = 1000;
86135b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_VER_GET);
86235b53f8cSChandrakanth patil
86335b53f8cSChandrakanth patil req.hwrm_intf_maj = HWRM_VERSION_MAJOR;
86435b53f8cSChandrakanth patil req.hwrm_intf_min = HWRM_VERSION_MINOR;
86535b53f8cSChandrakanth patil req.hwrm_intf_upd = HWRM_VERSION_UPDATE;
86635b53f8cSChandrakanth patil
86735b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
86835b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
86935b53f8cSChandrakanth patil if (rc)
87035b53f8cSChandrakanth patil goto fail;
87135b53f8cSChandrakanth patil
87235b53f8cSChandrakanth patil snprintf(softc->ver_info->hwrm_if_ver, BNXT_VERSTR_SIZE, "%d.%d.%d",
87335b53f8cSChandrakanth patil resp->hwrm_intf_maj_8b, resp->hwrm_intf_min_8b, resp->hwrm_intf_upd_8b);
87435b53f8cSChandrakanth patil softc->ver_info->hwrm_if_major = resp->hwrm_intf_maj_8b;
87535b53f8cSChandrakanth patil softc->ver_info->hwrm_if_minor = resp->hwrm_intf_min_8b;
87635b53f8cSChandrakanth patil softc->ver_info->hwrm_if_update = resp->hwrm_intf_upd_8b;
87735b53f8cSChandrakanth patil strlcpy(softc->ver_info->driver_hwrm_if_ver, HWRM_VERSION_STR,
87835b53f8cSChandrakanth patil BNXT_VERSTR_SIZE);
87935b53f8cSChandrakanth patil strlcpy(softc->ver_info->hwrm_fw_name, resp->hwrm_fw_name,
88035b53f8cSChandrakanth patil BNXT_NAME_SIZE);
88135b53f8cSChandrakanth patil
88235b53f8cSChandrakanth patil softc->hwrm_spec_code = resp->hwrm_intf_maj_8b << 16 |
88335b53f8cSChandrakanth patil resp->hwrm_intf_min_8b << 8 |
88435b53f8cSChandrakanth patil resp->hwrm_intf_upd_8b;
88535b53f8cSChandrakanth patil if (resp->hwrm_intf_maj_8b < 1) {
88635b53f8cSChandrakanth patil device_printf(softc->dev, "HWRM interface %d.%d.%d is older "
88735b53f8cSChandrakanth patil "than 1.0.0.\n", resp->hwrm_intf_maj_8b,
88835b53f8cSChandrakanth patil resp->hwrm_intf_min_8b, resp->hwrm_intf_upd_8b);
88935b53f8cSChandrakanth patil device_printf(softc->dev, "Please update firmware with HWRM "
89035b53f8cSChandrakanth patil "interface 1.0.0 or newer.\n");
89135b53f8cSChandrakanth patil }
89235b53f8cSChandrakanth patil if (resp->mgmt_fw_major == 0 && resp->mgmt_fw_minor == 0 &&
89335b53f8cSChandrakanth patil resp->mgmt_fw_build == 0) {
89435b53f8cSChandrakanth patil strlcpy(softc->ver_info->mgmt_fw_ver, naver, BNXT_VERSTR_SIZE);
89535b53f8cSChandrakanth patil strlcpy(softc->ver_info->mgmt_fw_name, nastr, BNXT_NAME_SIZE);
89635b53f8cSChandrakanth patil }
89735b53f8cSChandrakanth patil else {
898050d28e1SChandrakanth patil snprintf(softc->ver_info->mgmt_fw_ver, FW_VER_STR_LEN,
899050d28e1SChandrakanth patil "%d.%d.%d.%d", resp->mgmt_fw_major, resp->mgmt_fw_minor,
900050d28e1SChandrakanth patil resp->mgmt_fw_build, resp->mgmt_fw_patch);
90135b53f8cSChandrakanth patil strlcpy(softc->ver_info->mgmt_fw_name, resp->mgmt_fw_name,
90235b53f8cSChandrakanth patil BNXT_NAME_SIZE);
90335b53f8cSChandrakanth patil }
90435b53f8cSChandrakanth patil if (resp->netctrl_fw_major == 0 && resp->netctrl_fw_minor == 0 &&
90535b53f8cSChandrakanth patil resp->netctrl_fw_build == 0) {
90635b53f8cSChandrakanth patil strlcpy(softc->ver_info->netctrl_fw_ver, naver,
90735b53f8cSChandrakanth patil BNXT_VERSTR_SIZE);
90835b53f8cSChandrakanth patil strlcpy(softc->ver_info->netctrl_fw_name, nastr,
90935b53f8cSChandrakanth patil BNXT_NAME_SIZE);
91035b53f8cSChandrakanth patil }
91135b53f8cSChandrakanth patil else {
912050d28e1SChandrakanth patil snprintf(softc->ver_info->netctrl_fw_ver, FW_VER_STR_LEN,
913050d28e1SChandrakanth patil "%d.%d.%d.%d", resp->netctrl_fw_major, resp->netctrl_fw_minor,
914050d28e1SChandrakanth patil resp->netctrl_fw_build, resp->netctrl_fw_patch);
91535b53f8cSChandrakanth patil strlcpy(softc->ver_info->netctrl_fw_name, resp->netctrl_fw_name,
91635b53f8cSChandrakanth patil BNXT_NAME_SIZE);
91735b53f8cSChandrakanth patil }
91835b53f8cSChandrakanth patil if (resp->roce_fw_major == 0 && resp->roce_fw_minor == 0 &&
91935b53f8cSChandrakanth patil resp->roce_fw_build == 0) {
92035b53f8cSChandrakanth patil strlcpy(softc->ver_info->roce_fw_ver, naver, BNXT_VERSTR_SIZE);
92135b53f8cSChandrakanth patil strlcpy(softc->ver_info->roce_fw_name, nastr, BNXT_NAME_SIZE);
92235b53f8cSChandrakanth patil }
92335b53f8cSChandrakanth patil else {
92435b53f8cSChandrakanth patil snprintf(softc->ver_info->roce_fw_ver, BNXT_VERSTR_SIZE,
925050d28e1SChandrakanth patil "%d.%d.%d.%d", resp->roce_fw_major, resp->roce_fw_minor,
926050d28e1SChandrakanth patil resp->roce_fw_build, resp->roce_fw_patch);
92735b53f8cSChandrakanth patil strlcpy(softc->ver_info->roce_fw_name, resp->roce_fw_name,
92835b53f8cSChandrakanth patil BNXT_NAME_SIZE);
92935b53f8cSChandrakanth patil }
93035b53f8cSChandrakanth patil
93135b53f8cSChandrakanth patil fw_maj = le32toh(resp->hwrm_fw_major);
93235b53f8cSChandrakanth patil if (softc->hwrm_spec_code > 0x10803 && fw_maj) {
93335b53f8cSChandrakanth patil fw_min = le16toh(resp->hwrm_fw_minor);
93435b53f8cSChandrakanth patil fw_bld = le16toh(resp->hwrm_fw_build);
93535b53f8cSChandrakanth patil fw_rsv = le16toh(resp->hwrm_fw_patch);
93635b53f8cSChandrakanth patil len = FW_VER_STR_LEN;
93735b53f8cSChandrakanth patil } else {
93835b53f8cSChandrakanth patil fw_maj = resp->hwrm_fw_maj_8b;
93935b53f8cSChandrakanth patil fw_min = resp->hwrm_fw_min_8b;
94035b53f8cSChandrakanth patil fw_bld = resp->hwrm_fw_bld_8b;
94135b53f8cSChandrakanth patil fw_rsv = resp->hwrm_fw_rsvd_8b;
94235b53f8cSChandrakanth patil len = BC_HWRM_STR_LEN;
94335b53f8cSChandrakanth patil }
94435b53f8cSChandrakanth patil
94535b53f8cSChandrakanth patil softc->ver_info->fw_ver_code = BNXT_FW_VER_CODE(fw_maj, fw_min, fw_bld, fw_rsv);
94635b53f8cSChandrakanth patil snprintf (softc->ver_info->fw_ver_str, len, "%d.%d.%d.%d",
94735b53f8cSChandrakanth patil fw_maj, fw_min, fw_bld, fw_rsv);
94835b53f8cSChandrakanth patil
94935b53f8cSChandrakanth patil if (strlen(resp->active_pkg_name)) {
95035b53f8cSChandrakanth patil int fw_ver_len = strlen (softc->ver_info->fw_ver_str);
95135b53f8cSChandrakanth patil
95235b53f8cSChandrakanth patil snprintf(softc->ver_info->fw_ver_str + fw_ver_len,
95335b53f8cSChandrakanth patil FW_VER_STR_LEN - fw_ver_len - 1, "/pkg %s",
95435b53f8cSChandrakanth patil resp->active_pkg_name);
95535b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_PKG_VER;
95635b53f8cSChandrakanth patil }
95735b53f8cSChandrakanth patil
95835b53f8cSChandrakanth patil softc->ver_info->chip_num = le16toh(resp->chip_num);
95935b53f8cSChandrakanth patil softc->ver_info->chip_rev = resp->chip_rev;
96035b53f8cSChandrakanth patil softc->ver_info->chip_metal = resp->chip_metal;
96135b53f8cSChandrakanth patil softc->ver_info->chip_bond_id = resp->chip_bond_id;
96235b53f8cSChandrakanth patil softc->ver_info->chip_type = resp->chip_platform_type;
96335b53f8cSChandrakanth patil
96435b53f8cSChandrakanth patil if (resp->hwrm_intf_maj_8b >= 1) {
96535b53f8cSChandrakanth patil softc->hwrm_max_req_len = le16toh(resp->max_req_win_len);
96635b53f8cSChandrakanth patil softc->hwrm_max_ext_req_len = le16toh(resp->max_ext_req_len);
96735b53f8cSChandrakanth patil }
96835b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = le16toh(resp->def_req_timeout);
96935b53f8cSChandrakanth patil if (!softc->hwrm_cmd_timeo)
97035b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = DFLT_HWRM_CMD_TIMEOUT;
97135b53f8cSChandrakanth patil
97235b53f8cSChandrakanth patil dev_caps_cfg = le32toh(resp->dev_caps_cfg);
97335b53f8cSChandrakanth patil if ((dev_caps_cfg & HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_SHORT_CMD_SUPPORTED) &&
97435b53f8cSChandrakanth patil (dev_caps_cfg & HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_SHORT_CMD_REQUIRED))
97535b53f8cSChandrakanth patil softc->flags |= BNXT_FLAG_SHORT_CMD;
97635b53f8cSChandrakanth patil
97735b53f8cSChandrakanth patil if ((dev_caps_cfg & HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_SHORT_CMD_SUPPORTED) &&
97835b53f8cSChandrakanth patil (dev_caps_cfg & HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_SHORT_CMD_REQUIRED))
97935b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_SHORT_CMD;
98035b53f8cSChandrakanth patil
98135b53f8cSChandrakanth patil if (dev_caps_cfg & HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_KONG_MB_CHNL_SUPPORTED)
98235b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_KONG_MB_CHNL;
98335b53f8cSChandrakanth patil
98435b53f8cSChandrakanth patil if (dev_caps_cfg & HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_FLOW_HANDLE_64BIT_SUPPORTED)
98535b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_OVS_64BIT_HANDLE;
98635b53f8cSChandrakanth patil
98735b53f8cSChandrakanth patil if (dev_caps_cfg & HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_TRUSTED_VF_SUPPORTED)
98835b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_TRUSTED_VF;
98935b53f8cSChandrakanth patil
99035b53f8cSChandrakanth patil if (dev_caps_cfg & HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_CFA_ADV_FLOW_MGNT_SUPPORTED)
99135b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_CFA_ADV_FLOW;
99235b53f8cSChandrakanth patil
99335b53f8cSChandrakanth patil if (dev_caps_cfg & HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_CFA_EEM_SUPPORTED)
99435b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_CFA_EEM;
99535b53f8cSChandrakanth patil
99635b53f8cSChandrakanth patil if (dev_caps_cfg & HWRM_VER_GET_OUTPUT_DEV_CAPS_CFG_CFA_TRUFLOW_SUPPORTED)
99735b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_TRUFLOW_EN;
99835b53f8cSChandrakanth patil
99935b53f8cSChandrakanth patil fail:
100035b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
100135b53f8cSChandrakanth patil return rc;
100235b53f8cSChandrakanth patil }
100335b53f8cSChandrakanth patil
1004c9965974SChandrakanth patil static const u16 bnxt_async_events_arr[] = {
1005c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE,
1006c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CHANGE,
1007c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_UNLOAD,
1008c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED,
1009c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_VF_CFG_CHANGE,
1010c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE,
1011c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PORT_PHY_CFG_CHANGE,
1012c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY,
1013c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY,
1014c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_RING_MONITOR_MSG,
1015c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DEFAULT_VNIC_CHANGE,
1016c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DEBUG_NOTIFICATION,
1017c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_DEFERRED_RESPONSE,
1018c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_ECHO_REQUEST,
1019c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PPS_TIMESTAMP,
1020c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_ERROR_REPORT,
1021c9965974SChandrakanth patil HWRM_ASYNC_EVENT_CMPL_EVENT_ID_PHC_UPDATE,
1022c9965974SChandrakanth patil };
1023c9965974SChandrakanth patil
bnxt_hwrm_func_drv_rgtr(struct bnxt_softc * bp,unsigned long * bmap,int bmap_size,bool async_only)1024c9965974SChandrakanth patil int bnxt_hwrm_func_drv_rgtr(struct bnxt_softc *bp, unsigned long *bmap, int bmap_size,
1025c9965974SChandrakanth patil bool async_only)
102635b53f8cSChandrakanth patil {
1027c9965974SChandrakanth patil DECLARE_BITMAP(async_events_bmap, 256);
1028c9965974SChandrakanth patil u32 *events = (u32 *)async_events_bmap;
1029c9965974SChandrakanth patil struct hwrm_func_drv_rgtr_output *resp =
1030c9965974SChandrakanth patil (void *)bp->hwrm_cmd_resp.idi_vaddr;
103135b53f8cSChandrakanth patil struct hwrm_func_drv_rgtr_input req = {0};
1032c9965974SChandrakanth patil u32 flags = 0;
1033c9965974SChandrakanth patil int rc;
1034c9965974SChandrakanth patil int i;
103535b53f8cSChandrakanth patil
1036c9965974SChandrakanth patil bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_DRV_RGTR);
1037050d28e1SChandrakanth patil req.ver_maj = HWRM_VERSION_MAJOR;
1038050d28e1SChandrakanth patil req.ver_min = HWRM_VERSION_MINOR;
1039050d28e1SChandrakanth patil req.ver_upd = HWRM_VERSION_UPDATE;
104035b53f8cSChandrakanth patil
1041c9965974SChandrakanth patil req.enables = htole32(HWRM_FUNC_DRV_RGTR_INPUT_ENABLES_OS_TYPE |
1042c9965974SChandrakanth patil HWRM_FUNC_DRV_RGTR_INPUT_ENABLES_VER |
1043c9965974SChandrakanth patil HWRM_FUNC_DRV_RGTR_INPUT_ENABLES_ASYNC_EVENT_FWD);
1044c9965974SChandrakanth patil
1045c9965974SChandrakanth patil if (bp->fw_cap & BNXT_FW_CAP_HOT_RESET)
1046c9965974SChandrakanth patil flags |= HWRM_FUNC_DRV_RGTR_INPUT_FLAGS_HOT_RESET_SUPPORT;
1047c9965974SChandrakanth patil if (bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY)
1048c9965974SChandrakanth patil flags |= HWRM_FUNC_DRV_RGTR_INPUT_FLAGS_ERROR_RECOVERY_SUPPORT |
1049c9965974SChandrakanth patil HWRM_FUNC_DRV_RGTR_INPUT_FLAGS_MASTER_SUPPORT;
1050c9965974SChandrakanth patil if (bp->fw_cap & BNXT_FW_CAP_NPAR_1_2)
1051c9965974SChandrakanth patil flags |= HWRM_FUNC_DRV_RGTR_INPUT_FLAGS_NPAR_1_2_SUPPORT;
1052c9965974SChandrakanth patil flags |= HWRM_FUNC_DRV_RGTR_INPUT_FLAGS_ASYM_QUEUE_CFG_SUPPORT;
1053c9965974SChandrakanth patil req.flags = htole32(flags);
1054c9965974SChandrakanth patil req.os_type = htole16(HWRM_FUNC_DRV_RGTR_INPUT_OS_TYPE_FREEBSD);
1055c9965974SChandrakanth patil
1056c9965974SChandrakanth patil if (BNXT_PF(bp)) {
1057c9965974SChandrakanth patil req.enables |=
1058c9965974SChandrakanth patil htole32(HWRM_FUNC_DRV_RGTR_INPUT_ENABLES_VF_REQ_FWD);
1059c9965974SChandrakanth patil }
1060c9965974SChandrakanth patil
1061c9965974SChandrakanth patil if (bp->fw_cap & BNXT_FW_CAP_OVS_64BIT_HANDLE)
1062c9965974SChandrakanth patil req.flags |= cpu_to_le32(HWRM_FUNC_DRV_RGTR_INPUT_FLAGS_FLOW_HANDLE_64BIT_MODE);
1063c9965974SChandrakanth patil
1064c9965974SChandrakanth patil memset(async_events_bmap, 0, sizeof(async_events_bmap));
1065c9965974SChandrakanth patil for (i = 0; i < ARRAY_SIZE(bnxt_async_events_arr); i++) {
1066c9965974SChandrakanth patil u16 event_id = bnxt_async_events_arr[i];
1067c9965974SChandrakanth patil
1068c9965974SChandrakanth patil if (event_id == HWRM_ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY &&
1069c9965974SChandrakanth patil !(bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY)) {
1070c9965974SChandrakanth patil continue;
1071c9965974SChandrakanth patil }
1072c9965974SChandrakanth patil __set_bit(bnxt_async_events_arr[i], async_events_bmap);
1073c9965974SChandrakanth patil }
1074c9965974SChandrakanth patil if (bmap && bmap_size) {
1075c9965974SChandrakanth patil for (i = 0; i < bmap_size; i++) {
1076c9965974SChandrakanth patil if (test_bit(i, bmap))
1077c9965974SChandrakanth patil __set_bit(i, async_events_bmap);
1078c9965974SChandrakanth patil }
1079c9965974SChandrakanth patil }
1080c9965974SChandrakanth patil for (i = 0; i < 8; i++)
1081c9965974SChandrakanth patil req.async_event_fwd[i] |= htole32(events[i]);
1082c9965974SChandrakanth patil
1083c9965974SChandrakanth patil if (async_only)
1084c9965974SChandrakanth patil req.enables =
1085c9965974SChandrakanth patil htole32(HWRM_FUNC_DRV_RGTR_INPUT_ENABLES_ASYNC_EVENT_FWD);
1086c9965974SChandrakanth patil
1087c9965974SChandrakanth patil rc = hwrm_send_message(bp, &req, sizeof(req));
1088c9965974SChandrakanth patil
1089c9965974SChandrakanth patil if (!rc) {
1090c9965974SChandrakanth patil if (resp->flags &
1091c9965974SChandrakanth patil le32toh(HWRM_FUNC_DRV_RGTR_OUTPUT_FLAGS_IF_CHANGE_SUPPORTED))
1092c9965974SChandrakanth patil bp->fw_cap |= BNXT_FW_CAP_IF_CHANGE;
1093c9965974SChandrakanth patil }
1094c9965974SChandrakanth patil
1095c9965974SChandrakanth patil
1096c9965974SChandrakanth patil return rc;
109735b53f8cSChandrakanth patil }
109835b53f8cSChandrakanth patil
109935b53f8cSChandrakanth patil int
bnxt_hwrm_func_drv_unrgtr(struct bnxt_softc * softc,bool shutdown)110035b53f8cSChandrakanth patil bnxt_hwrm_func_drv_unrgtr(struct bnxt_softc *softc, bool shutdown)
110135b53f8cSChandrakanth patil {
110235b53f8cSChandrakanth patil struct hwrm_func_drv_unrgtr_input req = {0};
110335b53f8cSChandrakanth patil
110435b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FUNC_DRV_UNRGTR);
110535b53f8cSChandrakanth patil if (shutdown == true)
110635b53f8cSChandrakanth patil req.flags |=
110735b53f8cSChandrakanth patil HWRM_FUNC_DRV_UNRGTR_INPUT_FLAGS_PREPARE_FOR_SHUTDOWN;
110835b53f8cSChandrakanth patil return hwrm_send_message(softc, &req, sizeof(req));
110935b53f8cSChandrakanth patil }
111035b53f8cSChandrakanth patil
111135b53f8cSChandrakanth patil static inline int
_is_valid_ether_addr(uint8_t * addr)111235b53f8cSChandrakanth patil _is_valid_ether_addr(uint8_t *addr)
111335b53f8cSChandrakanth patil {
111435b53f8cSChandrakanth patil char zero_addr[6] = { 0, 0, 0, 0, 0, 0 };
111535b53f8cSChandrakanth patil
111635b53f8cSChandrakanth patil if ((addr[0] & 1) || (!bcmp(addr, zero_addr, ETHER_ADDR_LEN)))
111735b53f8cSChandrakanth patil return (FALSE);
111835b53f8cSChandrakanth patil
111935b53f8cSChandrakanth patil return (TRUE);
112035b53f8cSChandrakanth patil }
112135b53f8cSChandrakanth patil
112235b53f8cSChandrakanth patil static inline void
get_random_ether_addr(uint8_t * addr)112335b53f8cSChandrakanth patil get_random_ether_addr(uint8_t *addr)
112435b53f8cSChandrakanth patil {
112535b53f8cSChandrakanth patil uint8_t temp[ETHER_ADDR_LEN];
112635b53f8cSChandrakanth patil
112735b53f8cSChandrakanth patil arc4rand(&temp, sizeof(temp), 0);
112835b53f8cSChandrakanth patil temp[0] &= 0xFE;
112935b53f8cSChandrakanth patil temp[0] |= 0x02;
113035b53f8cSChandrakanth patil bcopy(temp, addr, sizeof(temp));
113135b53f8cSChandrakanth patil }
113235b53f8cSChandrakanth patil
113335b53f8cSChandrakanth patil int
bnxt_hwrm_func_qcaps(struct bnxt_softc * softc)113435b53f8cSChandrakanth patil bnxt_hwrm_func_qcaps(struct bnxt_softc *softc)
113535b53f8cSChandrakanth patil {
113635b53f8cSChandrakanth patil int rc = 0;
113735b53f8cSChandrakanth patil struct hwrm_func_qcaps_input req = {0};
113835b53f8cSChandrakanth patil struct hwrm_func_qcaps_output *resp =
113935b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
114035b53f8cSChandrakanth patil struct bnxt_func_info *func = &softc->func;
114135b53f8cSChandrakanth patil uint32_t flags, flags_ext, flags_ext2;
114235b53f8cSChandrakanth patil
114335b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FUNC_QCAPS);
114435b53f8cSChandrakanth patil req.fid = htole16(0xffff);
114535b53f8cSChandrakanth patil
114635b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
114735b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
114835b53f8cSChandrakanth patil if (rc)
114935b53f8cSChandrakanth patil goto fail;
115035b53f8cSChandrakanth patil
115135b53f8cSChandrakanth patil flags = htole32(resp->flags);
115235b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_WOL_MAGICPKT_SUPPORTED)
115335b53f8cSChandrakanth patil softc->flags |= BNXT_FLAG_WOL_CAP;
115435b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_STATS_SUPPORTED)
115535b53f8cSChandrakanth patil softc->flags |= BNXT_FLAG_FW_CAP_EXT_STATS;
115635b53f8cSChandrakanth patil
1157050d28e1SChandrakanth patil /* Enable RoCE only on Thor devices */
115826bd37daSSreekanth Reddy if (BNXT_CHIP_P5_PLUS(softc)) {
1159050d28e1SChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_ROCE_V1_SUPPORTED)
1160050d28e1SChandrakanth patil softc->flags |= BNXT_FLAG_ROCEV1_CAP;
1161050d28e1SChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_ROCE_V2_SUPPORTED)
1162050d28e1SChandrakanth patil softc->flags |= BNXT_FLAG_ROCEV2_CAP;
1163050d28e1SChandrakanth patil }
1164050d28e1SChandrakanth patil
116535b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_LINK_ADMIN_STATUS_SUPPORTED)
116635b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_LINK_ADMIN;
116735b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_ADMIN_PF_SUPPORTED)
116835b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_ADMIN_PF;
116935b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_HOT_RESET_CAPABLE)
117035b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_HOT_RESET;
117135b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_ERROR_RECOVERY_CAPABLE)
117235b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_ERROR_RECOVERY;
117335b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_PCIE_STATS_SUPPORTED)
117435b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_PCIE_STATS_SUPPORTED;
117535b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_STATS_SUPPORTED)
117635b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_EXT_STATS_SUPPORTED;
117735b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_ERR_RECOVER_RELOAD)
117835b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_ERR_RECOVER_RELOAD;
117935b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_NOTIFY_VF_DEF_VNIC_CHNG_SUPPORTED)
118035b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_VF_VNIC_NOTIFY;
118135b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_CRASHDUMP_CMD_SUPPORTED)
118235b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_CRASHDUMP;
118335b53f8cSChandrakanth patil if (!(flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_VLAN_ACCELERATION_TX_DISABLED))
118435b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_VLAN_TX_INSERT;
118535b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_DBG_QCAPS_CMD_SUPPORTED)
118635b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_DBG_QCAPS;
118735b53f8cSChandrakanth patil
118835b53f8cSChandrakanth patil flags_ext = htole32(resp->flags_ext);
118935b53f8cSChandrakanth patil if (flags_ext & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_EXT_HW_STATS_SUPPORTED)
119035b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_EXT_HW_STATS_SUPPORTED;
119135b53f8cSChandrakanth patil if (BNXT_PF(softc) && (flags_ext & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_ECN_STATS_SUPPORTED))
119235b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_ECN_STATS;
119335b53f8cSChandrakanth patil
119435b53f8cSChandrakanth patil if (flags_ext & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_PTP_PPS_SUPPORTED)
119535b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_PTP_PPS;
119635b53f8cSChandrakanth patil if (flags_ext & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_PTP_PTM_SUPPORTED)
119735b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_PTP_PTM;
119835b53f8cSChandrakanth patil if (flags_ext & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_PTP_64BIT_RTC_SUPPORTED)
119935b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_PTP_RTC;
120035b53f8cSChandrakanth patil if (BNXT_PF(softc) && (flags_ext & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_HOT_RESET_IF_SUPPORT))
120135b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_HOT_RESET_IF;
120235b53f8cSChandrakanth patil if (BNXT_PF(softc) && (flags_ext & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_FW_LIVEPATCH_SUPPORTED))
120335b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_LIVEPATCH;
120435b53f8cSChandrakanth patil if (flags_ext & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_NPAR_1_2_SUPPORTED)
120535b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_NPAR_1_2;
120635b53f8cSChandrakanth patil if (flags_ext & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_BS_V2_SUPPORTED)
120735b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_BACKING_STORE_V2;
120835b53f8cSChandrakanth patil if (BNXT_PF(softc) &&
120935b53f8cSChandrakanth patil (flags_ext & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_VF_CFG_ASYNC_FOR_PF_SUPPORTED))
121035b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_VF_CFG_FOR_PF;
121135b53f8cSChandrakanth patil
121235b53f8cSChandrakanth patil flags_ext2 = htole32(resp->flags_ext2);
121335b53f8cSChandrakanth patil if (flags_ext2 & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT2_RX_ALL_PKTS_TIMESTAMPS_SUPPORTED)
121435b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_RX_ALL_PKT_TS;
121535b53f8cSChandrakanth patil if (flags_ext2 & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT2_SW_DBR_DROP_RECOVERY_SUPPORTED)
121635b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_DBR_SUPPORTED;
121735b53f8cSChandrakanth patil if (flags_ext2 & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT2_DBR_PACING_EXT_SUPPORTED ||
121835b53f8cSChandrakanth patil flags_ext & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT_DBR_PACING_SUPPORTED)
121935b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_DBR_PACING_SUPPORTED;
122035b53f8cSChandrakanth patil
122135b53f8cSChandrakanth patil if (flags_ext2 & HWRM_FUNC_QCAPS_OUTPUT_FLAGS_EXT2_GENERIC_STATS_SUPPORTED)
122235b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_GENERIC_STATS;
122335b53f8cSChandrakanth patil func->fw_fid = le16toh(resp->fid);
122435b53f8cSChandrakanth patil memcpy(func->mac_addr, resp->mac_address, ETHER_ADDR_LEN);
122535b53f8cSChandrakanth patil func->max_rsscos_ctxs = le16toh(resp->max_rsscos_ctx);
122635b53f8cSChandrakanth patil func->max_cp_rings = le16toh(resp->max_cmpl_rings);
122735b53f8cSChandrakanth patil func->max_tx_rings = le16toh(resp->max_tx_rings);
122835b53f8cSChandrakanth patil func->max_rx_rings = le16toh(resp->max_rx_rings);
122935b53f8cSChandrakanth patil func->max_hw_ring_grps = le32toh(resp->max_hw_ring_grps);
123035b53f8cSChandrakanth patil if (!func->max_hw_ring_grps)
123135b53f8cSChandrakanth patil func->max_hw_ring_grps = func->max_tx_rings;
123235b53f8cSChandrakanth patil func->max_l2_ctxs = le16toh(resp->max_l2_ctxs);
123335b53f8cSChandrakanth patil func->max_vnics = le16toh(resp->max_vnics);
123435b53f8cSChandrakanth patil func->max_stat_ctxs = le16toh(resp->max_stat_ctx);
123535b53f8cSChandrakanth patil if (BNXT_PF(softc)) {
123635b53f8cSChandrakanth patil struct bnxt_pf_info *pf = &softc->pf;
123735b53f8cSChandrakanth patil
123835b53f8cSChandrakanth patil pf->port_id = le16toh(resp->port_id);
123935b53f8cSChandrakanth patil pf->first_vf_id = le16toh(resp->first_vf_id);
124035b53f8cSChandrakanth patil pf->max_vfs = le16toh(resp->max_vfs);
124135b53f8cSChandrakanth patil pf->max_encap_records = le32toh(resp->max_encap_records);
124235b53f8cSChandrakanth patil pf->max_decap_records = le32toh(resp->max_decap_records);
124335b53f8cSChandrakanth patil pf->max_tx_em_flows = le32toh(resp->max_tx_em_flows);
124435b53f8cSChandrakanth patil pf->max_tx_wm_flows = le32toh(resp->max_tx_wm_flows);
124535b53f8cSChandrakanth patil pf->max_rx_em_flows = le32toh(resp->max_rx_em_flows);
124635b53f8cSChandrakanth patil pf->max_rx_wm_flows = le32toh(resp->max_rx_wm_flows);
124735b53f8cSChandrakanth patil }
124835b53f8cSChandrakanth patil if (!_is_valid_ether_addr(func->mac_addr)) {
124935b53f8cSChandrakanth patil device_printf(softc->dev, "Invalid ethernet address, generating random locally administered address\n");
125035b53f8cSChandrakanth patil get_random_ether_addr(func->mac_addr);
125135b53f8cSChandrakanth patil }
125235b53f8cSChandrakanth patil
125335b53f8cSChandrakanth patil fail:
125435b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
125535b53f8cSChandrakanth patil return rc;
125635b53f8cSChandrakanth patil }
125735b53f8cSChandrakanth patil
125835b53f8cSChandrakanth patil int
bnxt_hwrm_func_qcfg(struct bnxt_softc * softc)125935b53f8cSChandrakanth patil bnxt_hwrm_func_qcfg(struct bnxt_softc *softc)
126035b53f8cSChandrakanth patil {
126135b53f8cSChandrakanth patil struct hwrm_func_qcfg_input req = {0};
126235b53f8cSChandrakanth patil struct hwrm_func_qcfg_output *resp =
126335b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
126435b53f8cSChandrakanth patil struct bnxt_func_qcfg *fn_qcfg = &softc->fn_qcfg;
1265050d28e1SChandrakanth patil uint32_t min_db_offset = 0;
126635b53f8cSChandrakanth patil uint16_t flags;
126735b53f8cSChandrakanth patil int rc;
126835b53f8cSChandrakanth patil
126935b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FUNC_QCFG);
127035b53f8cSChandrakanth patil req.fid = htole16(0xffff);
127135b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
127235b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
127335b53f8cSChandrakanth patil if (rc)
1274050d28e1SChandrakanth patil goto end;
127535b53f8cSChandrakanth patil
127635b53f8cSChandrakanth patil fn_qcfg->alloc_completion_rings = le16toh(resp->alloc_cmpl_rings);
127735b53f8cSChandrakanth patil fn_qcfg->alloc_tx_rings = le16toh(resp->alloc_tx_rings);
127835b53f8cSChandrakanth patil fn_qcfg->alloc_rx_rings = le16toh(resp->alloc_rx_rings);
127935b53f8cSChandrakanth patil fn_qcfg->alloc_vnics = le16toh(resp->alloc_vnics);
128035b53f8cSChandrakanth patil
1281050d28e1SChandrakanth patil switch (resp->port_partition_type) {
1282050d28e1SChandrakanth patil case HWRM_FUNC_QCFG_OUTPUT_PORT_PARTITION_TYPE_NPAR1_0:
1283050d28e1SChandrakanth patil case HWRM_FUNC_QCFG_OUTPUT_PORT_PARTITION_TYPE_NPAR1_2:
1284050d28e1SChandrakanth patil case HWRM_FUNC_QCFG_OUTPUT_PORT_PARTITION_TYPE_NPAR1_5:
1285050d28e1SChandrakanth patil case HWRM_FUNC_QCFG_OUTPUT_PORT_PARTITION_TYPE_NPAR2_0:
1286050d28e1SChandrakanth patil softc->port_partition_type = resp->port_partition_type;
1287050d28e1SChandrakanth patil break;
1288050d28e1SChandrakanth patil }
1289050d28e1SChandrakanth patil
129035b53f8cSChandrakanth patil flags = le16toh(resp->flags);
129135b53f8cSChandrakanth patil if (flags & (HWRM_FUNC_QCFG_OUTPUT_FLAGS_FW_DCBX_AGENT_ENABLED |
129235b53f8cSChandrakanth patil HWRM_FUNC_QCFG_OUTPUT_FLAGS_FW_LLDP_AGENT_ENABLED)) {
129335b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_LLDP_AGENT;
129435b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCFG_OUTPUT_FLAGS_FW_DCBX_AGENT_ENABLED)
129535b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_DCBX_AGENT;
129635b53f8cSChandrakanth patil }
129735b53f8cSChandrakanth patil if (BNXT_PF(softc) && (flags & HWRM_FUNC_QCFG_OUTPUT_FLAGS_MULTI_HOST))
129835b53f8cSChandrakanth patil softc->flags |= BNXT_FLAG_MULTI_HOST;
129935b53f8cSChandrakanth patil if (BNXT_PF(softc) && (flags & HWRM_FUNC_QCFG_OUTPUT_FLAGS_MULTI_ROOT))
130035b53f8cSChandrakanth patil softc->flags |= BNXT_FLAG_MULTI_ROOT;
130135b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCFG_OUTPUT_FLAGS_SECURE_MODE_ENABLED)
130235b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_SECURE_MODE;
130335b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCFG_OUTPUT_FLAGS_RING_MONITOR_ENABLED)
130435b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_RING_MONITOR;
130535b53f8cSChandrakanth patil if (flags & HWRM_FUNC_QCFG_OUTPUT_FLAGS_ENABLE_RDMA_SRIOV)
130635b53f8cSChandrakanth patil softc->fw_cap |= BNXT_FW_CAP_ENABLE_RDMA_SRIOV;
1307050d28e1SChandrakanth patil
1308050d28e1SChandrakanth patil if (softc->db_size)
1309050d28e1SChandrakanth patil goto end;
1310050d28e1SChandrakanth patil
1311050d28e1SChandrakanth patil softc->legacy_db_size = le16_to_cpu(resp->legacy_l2_db_size_kb) * 1024;
1312050d28e1SChandrakanth patil
1313050d28e1SChandrakanth patil if (BNXT_CHIP_P5(softc)) {
1314050d28e1SChandrakanth patil if (BNXT_PF(softc))
1315050d28e1SChandrakanth patil min_db_offset = DB_PF_OFFSET_P5;
1316050d28e1SChandrakanth patil else
1317050d28e1SChandrakanth patil min_db_offset = DB_VF_OFFSET_P5;
131826bd37daSSreekanth Reddy softc->legacy_db_size = min_db_offset;
1319050d28e1SChandrakanth patil }
1320050d28e1SChandrakanth patil
1321050d28e1SChandrakanth patil softc->db_size = roundup2(le16_to_cpu(resp->l2_doorbell_bar_size_kb) *
1322050d28e1SChandrakanth patil 1024, PAGE_SIZE);
1323050d28e1SChandrakanth patil if (!softc->db_size || softc->db_size > pci_resource_len(softc->pdev, 2) ||
1324050d28e1SChandrakanth patil softc->db_size <= min_db_offset)
1325050d28e1SChandrakanth patil softc->db_size = pci_resource_len(softc->pdev, 2);
1326050d28e1SChandrakanth patil
1327050d28e1SChandrakanth patil end:
132835b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
132935b53f8cSChandrakanth patil return rc;
133035b53f8cSChandrakanth patil }
133135b53f8cSChandrakanth patil
133235b53f8cSChandrakanth patil int
bnxt_hwrm_func_reset(struct bnxt_softc * softc)133335b53f8cSChandrakanth patil bnxt_hwrm_func_reset(struct bnxt_softc *softc)
133435b53f8cSChandrakanth patil {
133535b53f8cSChandrakanth patil struct hwrm_func_reset_input req = {0};
133635b53f8cSChandrakanth patil
133735b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FUNC_RESET);
133835b53f8cSChandrakanth patil req.enables = 0;
133935b53f8cSChandrakanth patil
134035b53f8cSChandrakanth patil return hwrm_send_message(softc, &req, sizeof(req));
134135b53f8cSChandrakanth patil }
134235b53f8cSChandrakanth patil
134335b53f8cSChandrakanth patil static void
bnxt_hwrm_set_link_common(struct bnxt_softc * softc,struct hwrm_port_phy_cfg_input * req)134435b53f8cSChandrakanth patil bnxt_hwrm_set_link_common(struct bnxt_softc *softc,
134535b53f8cSChandrakanth patil struct hwrm_port_phy_cfg_input *req)
134635b53f8cSChandrakanth patil {
134735b53f8cSChandrakanth patil struct bnxt_link_info *link_info = &softc->link_info;
134835b53f8cSChandrakanth patil uint8_t autoneg = softc->link_info.autoneg;
134935b53f8cSChandrakanth patil uint16_t fw_link_speed = softc->link_info.req_link_speed;
135035b53f8cSChandrakanth patil
135135b53f8cSChandrakanth patil if (autoneg & BNXT_AUTONEG_SPEED) {
135235b53f8cSChandrakanth patil uint8_t phy_type = get_phy_type(softc);
135335b53f8cSChandrakanth patil
135435b53f8cSChandrakanth patil if (phy_type == HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_1G_BASET ||
135535b53f8cSChandrakanth patil phy_type == HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASET ||
135635b53f8cSChandrakanth patil phy_type == HWRM_PORT_PHY_QCFG_OUTPUT_PHY_TYPE_BASETE) {
135735b53f8cSChandrakanth patil
135835b53f8cSChandrakanth patil req->auto_mode |= htole32(HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_SPEED_MASK);
135935b53f8cSChandrakanth patil if (link_info->advertising) {
136035b53f8cSChandrakanth patil req->enables |= htole32(HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_LINK_SPEED_MASK);
136135b53f8cSChandrakanth patil req->auto_link_speed_mask = htole16(link_info->advertising);
136235b53f8cSChandrakanth patil }
136335b53f8cSChandrakanth patil } else {
136435b53f8cSChandrakanth patil req->auto_mode |= HWRM_PORT_PHY_CFG_INPUT_AUTO_MODE_ALL_SPEEDS;
136535b53f8cSChandrakanth patil }
136635b53f8cSChandrakanth patil
136735b53f8cSChandrakanth patil req->enables |=
136835b53f8cSChandrakanth patil htole32(HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_MODE);
136935b53f8cSChandrakanth patil req->flags |=
137035b53f8cSChandrakanth patil htole32(HWRM_PORT_PHY_CFG_INPUT_FLAGS_RESTART_AUTONEG);
137135b53f8cSChandrakanth patil } else {
137235b53f8cSChandrakanth patil
1373dac78335SSreekanth Reddy if (link_info->force_speed2_nrz ||
1374dac78335SSreekanth Reddy link_info->force_pam4_56_speed2 ||
1375dac78335SSreekanth Reddy link_info->force_pam4_112_speed2) {
1376dac78335SSreekanth Reddy req->force_link_speeds2 = htole16(fw_link_speed);
1377dac78335SSreekanth Reddy req->enables |= htole32(HWRM_PORT_PHY_CFG_INPUT_ENABLES_FORCE_LINK_SPEEDS2);
1378dac78335SSreekanth Reddy link_info->force_speed2_nrz = false;
1379dac78335SSreekanth Reddy link_info->force_pam4_56_speed2 = false;
1380dac78335SSreekanth Reddy link_info->force_pam4_112_speed2 = false;
1381dac78335SSreekanth Reddy } else if (link_info->force_pam4_speed) {
138235b53f8cSChandrakanth patil req->force_pam4_link_speed = htole16(fw_link_speed);
138335b53f8cSChandrakanth patil req->enables |= htole32(HWRM_PORT_PHY_CFG_INPUT_ENABLES_FORCE_PAM4_LINK_SPEED);
1384dac78335SSreekanth Reddy link_info->force_pam4_speed = false;
138535b53f8cSChandrakanth patil } else {
138635b53f8cSChandrakanth patil req->force_link_speed = htole16(fw_link_speed);
138735b53f8cSChandrakanth patil }
1388dac78335SSreekanth Reddy
1389dac78335SSreekanth Reddy req->flags |= htole32(HWRM_PORT_PHY_CFG_INPUT_FLAGS_FORCE);
139035b53f8cSChandrakanth patil }
139135b53f8cSChandrakanth patil
139235b53f8cSChandrakanth patil /* tell chimp that the setting takes effect immediately */
139335b53f8cSChandrakanth patil req->flags |= htole32(HWRM_PORT_PHY_CFG_INPUT_FLAGS_RESET_PHY);
139435b53f8cSChandrakanth patil }
139535b53f8cSChandrakanth patil
139635b53f8cSChandrakanth patil static void
bnxt_hwrm_set_pause_common(struct bnxt_softc * softc,struct hwrm_port_phy_cfg_input * req)139735b53f8cSChandrakanth patil bnxt_hwrm_set_pause_common(struct bnxt_softc *softc,
139835b53f8cSChandrakanth patil struct hwrm_port_phy_cfg_input *req)
139935b53f8cSChandrakanth patil {
140035b53f8cSChandrakanth patil struct bnxt_link_info *link_info = &softc->link_info;
140135b53f8cSChandrakanth patil
140235b53f8cSChandrakanth patil if (link_info->flow_ctrl.autoneg) {
140335b53f8cSChandrakanth patil req->auto_pause =
140435b53f8cSChandrakanth patil HWRM_PORT_PHY_CFG_INPUT_AUTO_PAUSE_AUTONEG_PAUSE;
140535b53f8cSChandrakanth patil if (link_info->flow_ctrl.rx)
140635b53f8cSChandrakanth patil req->auto_pause |=
140735b53f8cSChandrakanth patil HWRM_PORT_PHY_CFG_INPUT_AUTO_PAUSE_RX;
140835b53f8cSChandrakanth patil if (link_info->flow_ctrl.tx)
140935b53f8cSChandrakanth patil req->auto_pause |=
141035b53f8cSChandrakanth patil HWRM_PORT_PHY_CFG_INPUT_AUTO_PAUSE_TX;
141135b53f8cSChandrakanth patil req->enables |=
141235b53f8cSChandrakanth patil htole32(HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_PAUSE);
141335b53f8cSChandrakanth patil } else {
141435b53f8cSChandrakanth patil if (link_info->flow_ctrl.rx)
141535b53f8cSChandrakanth patil req->force_pause |=
141635b53f8cSChandrakanth patil HWRM_PORT_PHY_CFG_INPUT_FORCE_PAUSE_RX;
141735b53f8cSChandrakanth patil if (link_info->flow_ctrl.tx)
141835b53f8cSChandrakanth patil req->force_pause |=
141935b53f8cSChandrakanth patil HWRM_PORT_PHY_CFG_INPUT_FORCE_PAUSE_TX;
142035b53f8cSChandrakanth patil req->enables |=
142135b53f8cSChandrakanth patil htole32(HWRM_PORT_PHY_CFG_INPUT_ENABLES_FORCE_PAUSE);
142235b53f8cSChandrakanth patil req->auto_pause = req->force_pause;
142335b53f8cSChandrakanth patil req->enables |=
142435b53f8cSChandrakanth patil htole32(HWRM_PORT_PHY_CFG_INPUT_ENABLES_AUTO_PAUSE);
142535b53f8cSChandrakanth patil }
142635b53f8cSChandrakanth patil }
142735b53f8cSChandrakanth patil
142835b53f8cSChandrakanth patil /* JFV this needs interface connection */
142935b53f8cSChandrakanth patil static void
bnxt_hwrm_set_eee(struct bnxt_softc * softc,struct hwrm_port_phy_cfg_input * req)143035b53f8cSChandrakanth patil bnxt_hwrm_set_eee(struct bnxt_softc *softc, struct hwrm_port_phy_cfg_input *req)
143135b53f8cSChandrakanth patil {
143235b53f8cSChandrakanth patil /* struct ethtool_eee *eee = &softc->eee; */
143335b53f8cSChandrakanth patil bool eee_enabled = false;
143435b53f8cSChandrakanth patil
143535b53f8cSChandrakanth patil if (eee_enabled) {
143635b53f8cSChandrakanth patil #if 0
143735b53f8cSChandrakanth patil uint16_t eee_speeds;
143835b53f8cSChandrakanth patil uint32_t flags = HWRM_PORT_PHY_CFG_INPUT_FLAGS_EEE_ENABLE;
143935b53f8cSChandrakanth patil
144035b53f8cSChandrakanth patil if (eee->tx_lpi_enabled)
144135b53f8cSChandrakanth patil flags |= HWRM_PORT_PHY_CFG_INPUT_FLAGS_EEE_TX_LPI;
144235b53f8cSChandrakanth patil
144335b53f8cSChandrakanth patil req->flags |= htole32(flags);
144435b53f8cSChandrakanth patil eee_speeds = bnxt_get_fw_auto_link_speeds(eee->advertised);
144535b53f8cSChandrakanth patil req->eee_link_speed_mask = htole16(eee_speeds);
144635b53f8cSChandrakanth patil req->tx_lpi_timer = htole32(eee->tx_lpi_timer);
144735b53f8cSChandrakanth patil #endif
144835b53f8cSChandrakanth patil } else {
144935b53f8cSChandrakanth patil req->flags |=
145035b53f8cSChandrakanth patil htole32(HWRM_PORT_PHY_CFG_INPUT_FLAGS_EEE_DISABLE);
145135b53f8cSChandrakanth patil }
145235b53f8cSChandrakanth patil }
145335b53f8cSChandrakanth patil
145435b53f8cSChandrakanth patil int
bnxt_hwrm_set_link_setting(struct bnxt_softc * softc,bool set_pause,bool set_eee,bool set_link)145535b53f8cSChandrakanth patil bnxt_hwrm_set_link_setting(struct bnxt_softc *softc, bool set_pause,
145635b53f8cSChandrakanth patil bool set_eee, bool set_link)
145735b53f8cSChandrakanth patil {
145835b53f8cSChandrakanth patil struct hwrm_port_phy_cfg_input req = {0};
145935b53f8cSChandrakanth patil int rc;
146035b53f8cSChandrakanth patil
146135b53f8cSChandrakanth patil if (softc->flags & BNXT_FLAG_NPAR)
146235b53f8cSChandrakanth patil return ENOTSUP;
146335b53f8cSChandrakanth patil
146435b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_PORT_PHY_CFG);
146535b53f8cSChandrakanth patil
146635b53f8cSChandrakanth patil if (set_pause) {
146735b53f8cSChandrakanth patil bnxt_hwrm_set_pause_common(softc, &req);
146835b53f8cSChandrakanth patil
146935b53f8cSChandrakanth patil if (softc->link_info.flow_ctrl.autoneg)
147035b53f8cSChandrakanth patil set_link = true;
147135b53f8cSChandrakanth patil }
147235b53f8cSChandrakanth patil
147335b53f8cSChandrakanth patil if (set_link)
147435b53f8cSChandrakanth patil bnxt_hwrm_set_link_common(softc, &req);
147535b53f8cSChandrakanth patil
147635b53f8cSChandrakanth patil if (set_eee)
147735b53f8cSChandrakanth patil bnxt_hwrm_set_eee(softc, &req);
147835b53f8cSChandrakanth patil
147935b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
148035b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
148135b53f8cSChandrakanth patil
148235b53f8cSChandrakanth patil if (!rc) {
148335b53f8cSChandrakanth patil if (set_pause) {
148435b53f8cSChandrakanth patil /* since changing of 'force pause' setting doesn't
148535b53f8cSChandrakanth patil * trigger any link change event, the driver needs to
148635b53f8cSChandrakanth patil * update the current pause result upon successfully i
148735b53f8cSChandrakanth patil * return of the phy_cfg command */
148835b53f8cSChandrakanth patil if (!softc->link_info.flow_ctrl.autoneg)
148935b53f8cSChandrakanth patil bnxt_report_link(softc);
149035b53f8cSChandrakanth patil }
149135b53f8cSChandrakanth patil }
149235b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
149335b53f8cSChandrakanth patil return rc;
149435b53f8cSChandrakanth patil }
149535b53f8cSChandrakanth patil
149635b53f8cSChandrakanth patil int
bnxt_hwrm_vnic_set_hds(struct bnxt_softc * softc,struct bnxt_vnic_info * vnic)149735b53f8cSChandrakanth patil bnxt_hwrm_vnic_set_hds(struct bnxt_softc *softc, struct bnxt_vnic_info *vnic)
149835b53f8cSChandrakanth patil {
149935b53f8cSChandrakanth patil struct hwrm_vnic_plcmodes_cfg_input req = {0};
150035b53f8cSChandrakanth patil
150126bd37daSSreekanth Reddy if (!BNXT_CHIP_P5_PLUS(softc))
150235b53f8cSChandrakanth patil return 0;
150335b53f8cSChandrakanth patil
150435b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_VNIC_PLCMODES_CFG);
150535b53f8cSChandrakanth patil
150635b53f8cSChandrakanth patil req.flags = htole32(HWRM_VNIC_PLCMODES_CFG_INPUT_FLAGS_JUMBO_PLACEMENT);
150735b53f8cSChandrakanth patil req.vnic_id = htole16(vnic->id);
150835b53f8cSChandrakanth patil
150935b53f8cSChandrakanth patil return hwrm_send_message(softc, &req, sizeof(req));
151035b53f8cSChandrakanth patil }
151135b53f8cSChandrakanth patil
151235b53f8cSChandrakanth patil int
bnxt_hwrm_vnic_cfg(struct bnxt_softc * softc,struct bnxt_vnic_info * vnic)151335b53f8cSChandrakanth patil bnxt_hwrm_vnic_cfg(struct bnxt_softc *softc, struct bnxt_vnic_info *vnic)
151435b53f8cSChandrakanth patil {
151535b53f8cSChandrakanth patil struct hwrm_vnic_cfg_input req = {0};
151635b53f8cSChandrakanth patil
151735b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_VNIC_CFG);
151835b53f8cSChandrakanth patil
151935b53f8cSChandrakanth patil if (vnic->flags & BNXT_VNIC_FLAG_DEFAULT)
152035b53f8cSChandrakanth patil req.flags |= htole32(HWRM_VNIC_CFG_INPUT_FLAGS_DEFAULT);
152135b53f8cSChandrakanth patil if (vnic->flags & BNXT_VNIC_FLAG_BD_STALL)
152235b53f8cSChandrakanth patil req.flags |= htole32(HWRM_VNIC_CFG_INPUT_FLAGS_BD_STALL_MODE);
152335b53f8cSChandrakanth patil if (vnic->flags & BNXT_VNIC_FLAG_VLAN_STRIP)
152435b53f8cSChandrakanth patil req.flags |= htole32(HWRM_VNIC_CFG_INPUT_FLAGS_VLAN_STRIP_MODE);
152526bd37daSSreekanth Reddy if (BNXT_CHIP_P5_PLUS (softc)) {
152635b53f8cSChandrakanth patil req.default_rx_ring_id =
152735b53f8cSChandrakanth patil htole16(softc->rx_rings[0].phys_id);
152835b53f8cSChandrakanth patil req.default_cmpl_ring_id =
152935b53f8cSChandrakanth patil htole16(softc->rx_cp_rings[0].ring.phys_id);
153035b53f8cSChandrakanth patil req.enables |=
153135b53f8cSChandrakanth patil htole32(HWRM_VNIC_CFG_INPUT_ENABLES_DEFAULT_RX_RING_ID |
153235b53f8cSChandrakanth patil HWRM_VNIC_CFG_INPUT_ENABLES_DEFAULT_CMPL_RING_ID);
153335b53f8cSChandrakanth patil req.vnic_id = htole16(vnic->id);
153435b53f8cSChandrakanth patil } else {
153535b53f8cSChandrakanth patil req.enables = htole32(HWRM_VNIC_CFG_INPUT_ENABLES_DFLT_RING_GRP |
153635b53f8cSChandrakanth patil HWRM_VNIC_CFG_INPUT_ENABLES_RSS_RULE);
153735b53f8cSChandrakanth patil req.vnic_id = htole16(vnic->id);
153835b53f8cSChandrakanth patil req.dflt_ring_grp = htole16(vnic->def_ring_grp);
153935b53f8cSChandrakanth patil }
154035b53f8cSChandrakanth patil req.rss_rule = htole16(vnic->rss_id);
154135b53f8cSChandrakanth patil req.cos_rule = htole16(vnic->cos_rule);
154235b53f8cSChandrakanth patil req.lb_rule = htole16(vnic->lb_rule);
154335b53f8cSChandrakanth patil req.enables |= htole32(HWRM_VNIC_CFG_INPUT_ENABLES_MRU);
154435b53f8cSChandrakanth patil req.mru = htole16(vnic->mru);
154535b53f8cSChandrakanth patil
154635b53f8cSChandrakanth patil return hwrm_send_message(softc, &req, sizeof(req));
154735b53f8cSChandrakanth patil }
154835b53f8cSChandrakanth patil
154935b53f8cSChandrakanth patil int
bnxt_hwrm_vnic_free(struct bnxt_softc * softc,struct bnxt_vnic_info * vnic)155035b53f8cSChandrakanth patil bnxt_hwrm_vnic_free(struct bnxt_softc *softc, struct bnxt_vnic_info *vnic)
155135b53f8cSChandrakanth patil {
155235b53f8cSChandrakanth patil struct hwrm_vnic_free_input req = {0};
155335b53f8cSChandrakanth patil int rc = 0;
155435b53f8cSChandrakanth patil
155535b53f8cSChandrakanth patil if (vnic->id == (uint16_t)HWRM_NA_SIGNATURE)
155635b53f8cSChandrakanth patil return rc;
155735b53f8cSChandrakanth patil
155835b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_VNIC_FREE);
155935b53f8cSChandrakanth patil
156035b53f8cSChandrakanth patil req.vnic_id = htole32(vnic->id);
156135b53f8cSChandrakanth patil
156235b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
156335b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
156435b53f8cSChandrakanth patil if (rc)
156535b53f8cSChandrakanth patil goto fail;
156635b53f8cSChandrakanth patil
156735b53f8cSChandrakanth patil fail:
156835b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
156935b53f8cSChandrakanth patil return (rc);
157035b53f8cSChandrakanth patil }
157135b53f8cSChandrakanth patil
157235b53f8cSChandrakanth patil int
bnxt_hwrm_vnic_alloc(struct bnxt_softc * softc,struct bnxt_vnic_info * vnic)157335b53f8cSChandrakanth patil bnxt_hwrm_vnic_alloc(struct bnxt_softc *softc, struct bnxt_vnic_info *vnic)
157435b53f8cSChandrakanth patil {
157535b53f8cSChandrakanth patil struct hwrm_vnic_alloc_input req = {0};
157635b53f8cSChandrakanth patil struct hwrm_vnic_alloc_output *resp =
157735b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
157835b53f8cSChandrakanth patil int rc;
157935b53f8cSChandrakanth patil
158035b53f8cSChandrakanth patil if (vnic->id != (uint16_t)HWRM_NA_SIGNATURE) {
158135b53f8cSChandrakanth patil device_printf(softc->dev,
158235b53f8cSChandrakanth patil "Attempt to re-allocate vnic %04x\n", vnic->id);
158335b53f8cSChandrakanth patil return EDOOFUS;
158435b53f8cSChandrakanth patil }
158535b53f8cSChandrakanth patil
158635b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_VNIC_ALLOC);
158735b53f8cSChandrakanth patil
158835b53f8cSChandrakanth patil if (vnic->flags & BNXT_VNIC_FLAG_DEFAULT)
158935b53f8cSChandrakanth patil req.flags = htole32(HWRM_VNIC_ALLOC_INPUT_FLAGS_DEFAULT);
159035b53f8cSChandrakanth patil
159135b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
159235b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
159335b53f8cSChandrakanth patil if (rc)
159435b53f8cSChandrakanth patil goto fail;
159535b53f8cSChandrakanth patil
159635b53f8cSChandrakanth patil vnic->id = le32toh(resp->vnic_id);
159735b53f8cSChandrakanth patil
159835b53f8cSChandrakanth patil fail:
159935b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
160035b53f8cSChandrakanth patil return (rc);
160135b53f8cSChandrakanth patil }
160235b53f8cSChandrakanth patil
160335b53f8cSChandrakanth patil int
bnxt_hwrm_vnic_ctx_free(struct bnxt_softc * softc,uint16_t ctx_id)160435b53f8cSChandrakanth patil bnxt_hwrm_vnic_ctx_free(struct bnxt_softc *softc, uint16_t ctx_id)
160535b53f8cSChandrakanth patil {
160635b53f8cSChandrakanth patil struct hwrm_vnic_rss_cos_lb_ctx_free_input req = {0};
160735b53f8cSChandrakanth patil int rc = 0;
160835b53f8cSChandrakanth patil
160935b53f8cSChandrakanth patil if (ctx_id == (uint16_t)HWRM_NA_SIGNATURE)
161035b53f8cSChandrakanth patil return rc;
161135b53f8cSChandrakanth patil
161235b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_VNIC_RSS_COS_LB_CTX_FREE);
161335b53f8cSChandrakanth patil req.rss_cos_lb_ctx_id = htole16(ctx_id);
161435b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
161535b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
161635b53f8cSChandrakanth patil if (rc)
161735b53f8cSChandrakanth patil goto fail;
161835b53f8cSChandrakanth patil
161935b53f8cSChandrakanth patil fail:
162035b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
162135b53f8cSChandrakanth patil return rc;
162235b53f8cSChandrakanth patil }
162335b53f8cSChandrakanth patil
162435b53f8cSChandrakanth patil int
bnxt_hwrm_vnic_ctx_alloc(struct bnxt_softc * softc,uint16_t * ctx_id)162535b53f8cSChandrakanth patil bnxt_hwrm_vnic_ctx_alloc(struct bnxt_softc *softc, uint16_t *ctx_id)
162635b53f8cSChandrakanth patil {
162735b53f8cSChandrakanth patil struct hwrm_vnic_rss_cos_lb_ctx_alloc_input req = {0};
162835b53f8cSChandrakanth patil struct hwrm_vnic_rss_cos_lb_ctx_alloc_output *resp =
162935b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
163035b53f8cSChandrakanth patil int rc;
163135b53f8cSChandrakanth patil
163235b53f8cSChandrakanth patil if (*ctx_id != (uint16_t)HWRM_NA_SIGNATURE) {
163335b53f8cSChandrakanth patil device_printf(softc->dev,
163435b53f8cSChandrakanth patil "Attempt to re-allocate vnic ctx %04x\n", *ctx_id);
163535b53f8cSChandrakanth patil return EDOOFUS;
163635b53f8cSChandrakanth patil }
163735b53f8cSChandrakanth patil
163835b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_VNIC_RSS_COS_LB_CTX_ALLOC);
163935b53f8cSChandrakanth patil
164035b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
164135b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
164235b53f8cSChandrakanth patil if (rc)
164335b53f8cSChandrakanth patil goto fail;
164435b53f8cSChandrakanth patil
164535b53f8cSChandrakanth patil *ctx_id = le32toh(resp->rss_cos_lb_ctx_id);
164635b53f8cSChandrakanth patil
164735b53f8cSChandrakanth patil fail:
164835b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
164935b53f8cSChandrakanth patil return (rc);
165035b53f8cSChandrakanth patil }
165135b53f8cSChandrakanth patil
165235b53f8cSChandrakanth patil int
bnxt_hwrm_ring_grp_alloc(struct bnxt_softc * softc,struct bnxt_grp_info * grp)165335b53f8cSChandrakanth patil bnxt_hwrm_ring_grp_alloc(struct bnxt_softc *softc, struct bnxt_grp_info *grp)
165435b53f8cSChandrakanth patil {
165535b53f8cSChandrakanth patil struct hwrm_ring_grp_alloc_input req = {0};
165635b53f8cSChandrakanth patil struct hwrm_ring_grp_alloc_output *resp;
165735b53f8cSChandrakanth patil int rc = 0;
165835b53f8cSChandrakanth patil
165935b53f8cSChandrakanth patil if (grp->grp_id != (uint16_t)HWRM_NA_SIGNATURE) {
166035b53f8cSChandrakanth patil device_printf(softc->dev,
166135b53f8cSChandrakanth patil "Attempt to re-allocate ring group %04x\n", grp->grp_id);
166235b53f8cSChandrakanth patil return EDOOFUS;
166335b53f8cSChandrakanth patil }
166435b53f8cSChandrakanth patil
166526bd37daSSreekanth Reddy if (BNXT_CHIP_P5_PLUS (softc))
166635b53f8cSChandrakanth patil return 0;
166735b53f8cSChandrakanth patil
166835b53f8cSChandrakanth patil resp = (void *)softc->hwrm_cmd_resp.idi_vaddr;
166935b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_RING_GRP_ALLOC);
167035b53f8cSChandrakanth patil req.cr = htole16(grp->cp_ring_id);
167135b53f8cSChandrakanth patil req.rr = htole16(grp->rx_ring_id);
167235b53f8cSChandrakanth patil req.ar = htole16(grp->ag_ring_id);
167335b53f8cSChandrakanth patil req.sc = htole16(grp->stats_ctx);
167435b53f8cSChandrakanth patil
167535b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
167635b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
167735b53f8cSChandrakanth patil if (rc)
167835b53f8cSChandrakanth patil goto fail;
167935b53f8cSChandrakanth patil
168035b53f8cSChandrakanth patil grp->grp_id = le32toh(resp->ring_group_id);
168135b53f8cSChandrakanth patil
168235b53f8cSChandrakanth patil fail:
168335b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
168435b53f8cSChandrakanth patil return rc;
168535b53f8cSChandrakanth patil }
168635b53f8cSChandrakanth patil
168735b53f8cSChandrakanth patil int
bnxt_hwrm_ring_grp_free(struct bnxt_softc * softc,struct bnxt_grp_info * grp)168835b53f8cSChandrakanth patil bnxt_hwrm_ring_grp_free(struct bnxt_softc *softc, struct bnxt_grp_info *grp)
168935b53f8cSChandrakanth patil {
169035b53f8cSChandrakanth patil struct hwrm_ring_grp_free_input req = {0};
169135b53f8cSChandrakanth patil int rc = 0;
169235b53f8cSChandrakanth patil
169335b53f8cSChandrakanth patil if (grp->grp_id == (uint16_t)HWRM_NA_SIGNATURE)
169435b53f8cSChandrakanth patil return 0;
169535b53f8cSChandrakanth patil
169626bd37daSSreekanth Reddy if (BNXT_CHIP_P5_PLUS (softc))
169735b53f8cSChandrakanth patil return 0;
169835b53f8cSChandrakanth patil
169935b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_RING_GRP_FREE);
170035b53f8cSChandrakanth patil
170135b53f8cSChandrakanth patil req.ring_group_id = htole32(grp->grp_id);
170235b53f8cSChandrakanth patil
170335b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
170435b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
170535b53f8cSChandrakanth patil if (rc)
170635b53f8cSChandrakanth patil goto fail;
170735b53f8cSChandrakanth patil
170835b53f8cSChandrakanth patil fail:
170935b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
171035b53f8cSChandrakanth patil return rc;
171135b53f8cSChandrakanth patil }
171235b53f8cSChandrakanth patil
bnxt_hwrm_ring_free(struct bnxt_softc * softc,uint32_t ring_type,struct bnxt_ring * ring,int cmpl_ring_id)171335b53f8cSChandrakanth patil int bnxt_hwrm_ring_free(struct bnxt_softc *softc, uint32_t ring_type,
171435b53f8cSChandrakanth patil struct bnxt_ring *ring, int cmpl_ring_id)
171535b53f8cSChandrakanth patil {
171635b53f8cSChandrakanth patil struct hwrm_ring_free_input req = {0};
171735b53f8cSChandrakanth patil struct hwrm_ring_free_output *resp;
171835b53f8cSChandrakanth patil int rc = 0;
171935b53f8cSChandrakanth patil uint16_t error_code;
172035b53f8cSChandrakanth patil
172135b53f8cSChandrakanth patil if (ring->phys_id == (uint16_t)HWRM_NA_SIGNATURE)
172235b53f8cSChandrakanth patil return 0;
172335b53f8cSChandrakanth patil
172435b53f8cSChandrakanth patil resp = (void *)softc->hwrm_cmd_resp.idi_vaddr;
172535b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_RING_FREE);
172635b53f8cSChandrakanth patil req.cmpl_ring = htole16(cmpl_ring_id);
172735b53f8cSChandrakanth patil req.ring_type = ring_type;
172835b53f8cSChandrakanth patil req.ring_id = htole16(ring->phys_id);
172935b53f8cSChandrakanth patil
173035b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
173135b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
173235b53f8cSChandrakanth patil error_code = le16toh(resp->error_code);
173335b53f8cSChandrakanth patil
173435b53f8cSChandrakanth patil if (rc || error_code) {
173535b53f8cSChandrakanth patil device_printf(softc->dev, "hwrm_ring_free type %d failed. "
173635b53f8cSChandrakanth patil "rc:%x err:%x\n", ring_type, rc, error_code);
173735b53f8cSChandrakanth patil if (!rc)
173835b53f8cSChandrakanth patil rc = -EIO;
173935b53f8cSChandrakanth patil }
174035b53f8cSChandrakanth patil
174135b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
174235b53f8cSChandrakanth patil return rc;
174335b53f8cSChandrakanth patil }
174435b53f8cSChandrakanth patil
174535b53f8cSChandrakanth patil /*
174635b53f8cSChandrakanth patil * Ring allocation message to the firmware
174735b53f8cSChandrakanth patil */
174835b53f8cSChandrakanth patil int
bnxt_hwrm_ring_alloc(struct bnxt_softc * softc,uint8_t type,struct bnxt_ring * ring)174935b53f8cSChandrakanth patil bnxt_hwrm_ring_alloc(struct bnxt_softc *softc, uint8_t type,
175035b53f8cSChandrakanth patil struct bnxt_ring *ring)
175135b53f8cSChandrakanth patil {
175235b53f8cSChandrakanth patil struct hwrm_ring_alloc_input req = {0};
175335b53f8cSChandrakanth patil struct hwrm_ring_alloc_output *resp;
175435b53f8cSChandrakanth patil uint16_t idx = ring->idx;
175535b53f8cSChandrakanth patil struct bnxt_cp_ring *cp_ring;
175635b53f8cSChandrakanth patil int rc;
175735b53f8cSChandrakanth patil
175835b53f8cSChandrakanth patil if (ring->phys_id != (uint16_t)HWRM_NA_SIGNATURE) {
175935b53f8cSChandrakanth patil device_printf(softc->dev,
176035b53f8cSChandrakanth patil "Attempt to re-allocate ring %04x\n", ring->phys_id);
176135b53f8cSChandrakanth patil return EDOOFUS;
176235b53f8cSChandrakanth patil }
176335b53f8cSChandrakanth patil
176435b53f8cSChandrakanth patil resp = (void *)softc->hwrm_cmd_resp.idi_vaddr;
176535b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_RING_ALLOC);
176635b53f8cSChandrakanth patil req.enables = htole32(0);
176735b53f8cSChandrakanth patil req.fbo = htole32(0);
176835b53f8cSChandrakanth patil req.ring_type = type;
176935b53f8cSChandrakanth patil req.page_tbl_addr = htole64(ring->paddr);
177035b53f8cSChandrakanth patil req.logical_id = htole16(ring->id);
177135b53f8cSChandrakanth patil req.length = htole32(ring->ring_size);
177235b53f8cSChandrakanth patil
177335b53f8cSChandrakanth patil switch (type) {
177435b53f8cSChandrakanth patil case HWRM_RING_ALLOC_INPUT_RING_TYPE_TX:
177535b53f8cSChandrakanth patil cp_ring = &softc->tx_cp_rings[idx];
177635b53f8cSChandrakanth patil
177735b53f8cSChandrakanth patil req.cmpl_ring_id = htole16(cp_ring->ring.phys_id);
177835b53f8cSChandrakanth patil /* queue_id - what CoS queue the TX ring is associated with */
177935b53f8cSChandrakanth patil req.queue_id = htole16(softc->tx_q_info[0].queue_id);
178035b53f8cSChandrakanth patil
178135b53f8cSChandrakanth patil req.stat_ctx_id = htole32(cp_ring->stats_ctx_id);
178235b53f8cSChandrakanth patil req.enables |= htole32(
178335b53f8cSChandrakanth patil HWRM_RING_ALLOC_INPUT_ENABLES_STAT_CTX_ID_VALID);
178435b53f8cSChandrakanth patil break;
178535b53f8cSChandrakanth patil case HWRM_RING_ALLOC_INPUT_RING_TYPE_RX:
178626bd37daSSreekanth Reddy if (!BNXT_CHIP_P5_PLUS(softc))
178735b53f8cSChandrakanth patil break;
178835b53f8cSChandrakanth patil
178935b53f8cSChandrakanth patil cp_ring = &softc->rx_cp_rings[idx];
179035b53f8cSChandrakanth patil
179135b53f8cSChandrakanth patil req.stat_ctx_id = htole32(cp_ring->stats_ctx_id);
179235b53f8cSChandrakanth patil req.rx_buf_size = htole16(softc->rx_buf_size);
179335b53f8cSChandrakanth patil req.enables |= htole32(
179435b53f8cSChandrakanth patil HWRM_RING_ALLOC_INPUT_ENABLES_RX_BUF_SIZE_VALID |
179535b53f8cSChandrakanth patil HWRM_RING_ALLOC_INPUT_ENABLES_STAT_CTX_ID_VALID);
179635b53f8cSChandrakanth patil break;
179735b53f8cSChandrakanth patil case HWRM_RING_ALLOC_INPUT_RING_TYPE_RX_AGG:
179826bd37daSSreekanth Reddy if (!BNXT_CHIP_P5_PLUS(softc)) {
179935b53f8cSChandrakanth patil req.ring_type = HWRM_RING_ALLOC_INPUT_RING_TYPE_RX;
180035b53f8cSChandrakanth patil break;
180135b53f8cSChandrakanth patil }
180235b53f8cSChandrakanth patil
180335b53f8cSChandrakanth patil cp_ring = &softc->rx_cp_rings[idx];
180435b53f8cSChandrakanth patil
180535b53f8cSChandrakanth patil req.rx_ring_id = htole16(softc->rx_rings[idx].phys_id);
180635b53f8cSChandrakanth patil req.stat_ctx_id = htole32(cp_ring->stats_ctx_id);
180735b53f8cSChandrakanth patil req.rx_buf_size = htole16(softc->rx_buf_size);
180835b53f8cSChandrakanth patil req.enables |= htole32(
180935b53f8cSChandrakanth patil HWRM_RING_ALLOC_INPUT_ENABLES_RX_RING_ID_VALID |
181035b53f8cSChandrakanth patil HWRM_RING_ALLOC_INPUT_ENABLES_RX_BUF_SIZE_VALID |
181135b53f8cSChandrakanth patil HWRM_RING_ALLOC_INPUT_ENABLES_STAT_CTX_ID_VALID);
181235b53f8cSChandrakanth patil break;
181335b53f8cSChandrakanth patil case HWRM_RING_ALLOC_INPUT_RING_TYPE_L2_CMPL:
181426bd37daSSreekanth Reddy if (!BNXT_CHIP_P5_PLUS(softc)) {
181535b53f8cSChandrakanth patil req.int_mode = HWRM_RING_ALLOC_INPUT_INT_MODE_MSIX;
181635b53f8cSChandrakanth patil break;
181735b53f8cSChandrakanth patil }
181835b53f8cSChandrakanth patil
181935b53f8cSChandrakanth patil req.cq_handle = htole64(ring->id);
182035b53f8cSChandrakanth patil req.nq_ring_id = htole16(softc->nq_rings[idx].ring.phys_id);
182135b53f8cSChandrakanth patil req.enables |= htole32(
182235b53f8cSChandrakanth patil HWRM_RING_ALLOC_INPUT_ENABLES_NQ_RING_ID_VALID);
182335b53f8cSChandrakanth patil break;
182435b53f8cSChandrakanth patil case HWRM_RING_ALLOC_INPUT_RING_TYPE_NQ:
182535b53f8cSChandrakanth patil req.int_mode = HWRM_RING_ALLOC_INPUT_INT_MODE_MSIX;
182635b53f8cSChandrakanth patil break;
182735b53f8cSChandrakanth patil default:
182835b53f8cSChandrakanth patil device_printf(softc->dev,
182935b53f8cSChandrakanth patil "hwrm alloc invalid ring type %d\n", type);
183035b53f8cSChandrakanth patil return -1;
183135b53f8cSChandrakanth patil }
183235b53f8cSChandrakanth patil
183335b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
183435b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
183535b53f8cSChandrakanth patil if (rc)
183635b53f8cSChandrakanth patil goto fail;
183735b53f8cSChandrakanth patil
183835b53f8cSChandrakanth patil ring->phys_id = le16toh(resp->ring_id);
183935b53f8cSChandrakanth patil
184035b53f8cSChandrakanth patil fail:
184135b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
184235b53f8cSChandrakanth patil return rc;
184335b53f8cSChandrakanth patil }
184435b53f8cSChandrakanth patil
184535b53f8cSChandrakanth patil int
bnxt_hwrm_stat_ctx_free(struct bnxt_softc * softc,struct bnxt_cp_ring * cpr)184635b53f8cSChandrakanth patil bnxt_hwrm_stat_ctx_free(struct bnxt_softc *softc, struct bnxt_cp_ring *cpr)
184735b53f8cSChandrakanth patil {
184835b53f8cSChandrakanth patil struct hwrm_stat_ctx_free_input req = {0};
184935b53f8cSChandrakanth patil int rc = 0;
185035b53f8cSChandrakanth patil
185135b53f8cSChandrakanth patil if (cpr->stats_ctx_id == HWRM_NA_SIGNATURE)
185235b53f8cSChandrakanth patil return rc;
185335b53f8cSChandrakanth patil
185435b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_STAT_CTX_FREE);
185535b53f8cSChandrakanth patil
185635b53f8cSChandrakanth patil req.stat_ctx_id = htole16(cpr->stats_ctx_id);
185735b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
185835b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
185935b53f8cSChandrakanth patil if (rc)
186035b53f8cSChandrakanth patil goto fail;
186135b53f8cSChandrakanth patil
186235b53f8cSChandrakanth patil fail:
186335b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
186435b53f8cSChandrakanth patil
186535b53f8cSChandrakanth patil return rc;
186635b53f8cSChandrakanth patil }
186735b53f8cSChandrakanth patil
186835b53f8cSChandrakanth patil int
bnxt_hwrm_stat_ctx_alloc(struct bnxt_softc * softc,struct bnxt_cp_ring * cpr,uint64_t paddr)186935b53f8cSChandrakanth patil bnxt_hwrm_stat_ctx_alloc(struct bnxt_softc *softc, struct bnxt_cp_ring *cpr,
187035b53f8cSChandrakanth patil uint64_t paddr)
187135b53f8cSChandrakanth patil {
187235b53f8cSChandrakanth patil struct hwrm_stat_ctx_alloc_input req = {0};
187335b53f8cSChandrakanth patil struct hwrm_stat_ctx_alloc_output *resp;
187435b53f8cSChandrakanth patil int rc = 0;
187535b53f8cSChandrakanth patil
187635b53f8cSChandrakanth patil if (cpr->stats_ctx_id != HWRM_NA_SIGNATURE) {
187735b53f8cSChandrakanth patil device_printf(softc->dev,
187835b53f8cSChandrakanth patil "Attempt to re-allocate stats ctx %08x\n",
187935b53f8cSChandrakanth patil cpr->stats_ctx_id);
188035b53f8cSChandrakanth patil return EDOOFUS;
188135b53f8cSChandrakanth patil }
188235b53f8cSChandrakanth patil
188335b53f8cSChandrakanth patil resp = (void *)softc->hwrm_cmd_resp.idi_vaddr;
188435b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_STAT_CTX_ALLOC);
188535b53f8cSChandrakanth patil
188635b53f8cSChandrakanth patil req.update_period_ms = htole32(1000);
188735b53f8cSChandrakanth patil req.stats_dma_addr = htole64(paddr);
1888*fec0e206SSreekanth Reddy
1889*fec0e206SSreekanth Reddy if (BNXT_CHIP_P7(softc))
1890*fec0e206SSreekanth Reddy req.stats_dma_length = htole16(sizeof(struct ctx_hw_stats_ext));
1891*fec0e206SSreekanth Reddy else if (BNXT_CHIP_P5(softc))
189235b53f8cSChandrakanth patil req.stats_dma_length = htole16(sizeof(struct ctx_hw_stats_ext) - 8);
189335b53f8cSChandrakanth patil else
189435b53f8cSChandrakanth patil req.stats_dma_length = htole16(sizeof(struct ctx_hw_stats));
189535b53f8cSChandrakanth patil
189635b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
189735b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
189835b53f8cSChandrakanth patil if (rc)
189935b53f8cSChandrakanth patil goto fail;
190035b53f8cSChandrakanth patil
190135b53f8cSChandrakanth patil cpr->stats_ctx_id = le32toh(resp->stat_ctx_id);
190235b53f8cSChandrakanth patil
190335b53f8cSChandrakanth patil fail:
190435b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
190535b53f8cSChandrakanth patil
190635b53f8cSChandrakanth patil return rc;
190735b53f8cSChandrakanth patil }
190835b53f8cSChandrakanth patil
190935b53f8cSChandrakanth patil int
bnxt_hwrm_port_qstats(struct bnxt_softc * softc)191035b53f8cSChandrakanth patil bnxt_hwrm_port_qstats(struct bnxt_softc *softc)
191135b53f8cSChandrakanth patil {
191235b53f8cSChandrakanth patil struct hwrm_port_qstats_input req = {0};
191335b53f8cSChandrakanth patil int rc = 0;
191435b53f8cSChandrakanth patil
191535b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_PORT_QSTATS);
191635b53f8cSChandrakanth patil
191735b53f8cSChandrakanth patil req.port_id = htole16(softc->pf.port_id);
191835b53f8cSChandrakanth patil req.rx_stat_host_addr = htole64(softc->hw_rx_port_stats.idi_paddr);
191935b53f8cSChandrakanth patil req.tx_stat_host_addr = htole64(softc->hw_tx_port_stats.idi_paddr);
192035b53f8cSChandrakanth patil
192135b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
192235b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
192335b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
192435b53f8cSChandrakanth patil
192535b53f8cSChandrakanth patil return rc;
192635b53f8cSChandrakanth patil }
bnxt_hwrm_pri2cos_idx(struct bnxt_softc * softc,uint32_t path_dir)1927032899b5SChandrakanth patil static int bnxt_hwrm_pri2cos_idx(struct bnxt_softc *softc, uint32_t path_dir)
1928032899b5SChandrakanth patil {
1929032899b5SChandrakanth patil struct hwrm_queue_pri2cos_qcfg_input req = {0};
1930032899b5SChandrakanth patil struct hwrm_queue_pri2cos_qcfg_output *resp;
1931032899b5SChandrakanth patil uint8_t *pri2cos_idx, *q_ids, max_q;
1932032899b5SChandrakanth patil int rc, i, j;
1933032899b5SChandrakanth patil uint8_t *pri2cos;
193435b53f8cSChandrakanth patil
1935032899b5SChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_QUEUE_PRI2COS_QCFG);
1936032899b5SChandrakanth patil resp = (void *)softc->hwrm_cmd_resp.idi_vaddr;
1937032899b5SChandrakanth patil
1938032899b5SChandrakanth patil req.flags = htole32(HWRM_QUEUE_PRI2COS_QCFG_INPUT_FLAGS_IVLAN |
1939032899b5SChandrakanth patil path_dir);
1940032899b5SChandrakanth patil rc = hwrm_send_message(softc, &req, sizeof(req));
1941032899b5SChandrakanth patil
1942032899b5SChandrakanth patil if (rc)
1943032899b5SChandrakanth patil return rc;
1944032899b5SChandrakanth patil
1945032899b5SChandrakanth patil if (path_dir == HWRM_QUEUE_PRI2COS_QCFG_INPUT_FLAGS_PATH_TX) {
1946032899b5SChandrakanth patil pri2cos_idx = softc->tx_pri2cos_idx;
1947032899b5SChandrakanth patil q_ids = softc->tx_q_ids;
1948032899b5SChandrakanth patil max_q = softc->tx_max_q;
1949032899b5SChandrakanth patil } else {
1950032899b5SChandrakanth patil pri2cos_idx = softc->rx_pri2cos_idx;
1951032899b5SChandrakanth patil q_ids = softc->rx_q_ids;
1952032899b5SChandrakanth patil max_q = softc->rx_max_q;
1953032899b5SChandrakanth patil }
1954032899b5SChandrakanth patil
1955032899b5SChandrakanth patil pri2cos = &resp->pri0_cos_queue_id;
1956032899b5SChandrakanth patil
1957032899b5SChandrakanth patil for (i = 0; i < BNXT_MAX_QUEUE; i++) {
1958032899b5SChandrakanth patil uint8_t queue_id = pri2cos[i];
1959032899b5SChandrakanth patil uint8_t queue_idx;
1960032899b5SChandrakanth patil
1961032899b5SChandrakanth patil /* Per port queue IDs start from 0, 10, 20, etc */
1962032899b5SChandrakanth patil queue_idx = queue_id % 10;
1963032899b5SChandrakanth patil if (queue_idx > BNXT_MAX_QUEUE) {
1964032899b5SChandrakanth patil softc->pri2cos_valid = false;
1965032899b5SChandrakanth patil rc = -EINVAL;
1966032899b5SChandrakanth patil return rc;
1967032899b5SChandrakanth patil }
1968032899b5SChandrakanth patil
1969032899b5SChandrakanth patil for (j = 0; j < max_q; j++) {
1970032899b5SChandrakanth patil if (q_ids[j] == queue_id)
1971032899b5SChandrakanth patil pri2cos_idx[i] = queue_idx;
1972032899b5SChandrakanth patil }
1973032899b5SChandrakanth patil }
1974032899b5SChandrakanth patil
1975032899b5SChandrakanth patil softc->pri2cos_valid = true;
1976032899b5SChandrakanth patil
1977032899b5SChandrakanth patil return rc;
1978032899b5SChandrakanth patil }
1979032899b5SChandrakanth patil
1980032899b5SChandrakanth patil int
bnxt_hwrm_port_qstats_ext(struct bnxt_softc * softc)198135b53f8cSChandrakanth patil bnxt_hwrm_port_qstats_ext(struct bnxt_softc *softc)
198235b53f8cSChandrakanth patil {
198335b53f8cSChandrakanth patil struct hwrm_port_qstats_ext_input req = {0};
1984032899b5SChandrakanth patil struct hwrm_port_qstats_ext_output *resp;
1985032899b5SChandrakanth patil int rc = 0, i;
1986032899b5SChandrakanth patil uint32_t tx_stat_size;
198735b53f8cSChandrakanth patil
198835b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_PORT_QSTATS_EXT);
1989032899b5SChandrakanth patil resp = (void *)softc->hwrm_cmd_resp.idi_vaddr;
199035b53f8cSChandrakanth patil
1991032899b5SChandrakanth patil tx_stat_size = sizeof(struct tx_port_stats_ext);
199235b53f8cSChandrakanth patil req.port_id = htole16(softc->pf.port_id);
1993032899b5SChandrakanth patil req.tx_stat_size = htole16(tx_stat_size);
199435b53f8cSChandrakanth patil req.rx_stat_size = htole16(sizeof(struct rx_port_stats_ext));
199535b53f8cSChandrakanth patil req.rx_stat_host_addr = htole64(softc->hw_rx_port_stats_ext.idi_paddr);
199635b53f8cSChandrakanth patil req.tx_stat_host_addr = htole64(softc->hw_tx_port_stats_ext.idi_paddr);
199735b53f8cSChandrakanth patil
1998032899b5SChandrakanth patil rc = hwrm_send_message(softc, &req, sizeof(req));
199935b53f8cSChandrakanth patil
2000032899b5SChandrakanth patil if (!rc) {
2001032899b5SChandrakanth patil softc->fw_rx_stats_ext_size =
2002032899b5SChandrakanth patil le16toh(resp->rx_stat_size) / 8;
200326bd37daSSreekanth Reddy if (BNXT_FW_MAJ(softc) < 220 && !BNXT_CHIP_P7(softc) &&
2004032899b5SChandrakanth patil softc->fw_rx_stats_ext_size > BNXT_RX_STATS_EXT_NUM_LEGACY)
2005032899b5SChandrakanth patil softc->fw_rx_stats_ext_size = BNXT_RX_STATS_EXT_NUM_LEGACY;
2006032899b5SChandrakanth patil
2007032899b5SChandrakanth patil softc->fw_tx_stats_ext_size = tx_stat_size ?
2008032899b5SChandrakanth patil le16toh(resp->tx_stat_size) / 8 : 0;
2009032899b5SChandrakanth patil } else {
2010032899b5SChandrakanth patil softc->fw_rx_stats_ext_size = 0;
2011032899b5SChandrakanth patil softc->fw_tx_stats_ext_size = 0;
2012032899b5SChandrakanth patil }
2013032899b5SChandrakanth patil
2014032899b5SChandrakanth patil if (softc->fw_tx_stats_ext_size <=
2015032899b5SChandrakanth patil offsetof(struct tx_port_stats_ext, pfc_pri0_tx_duration_us) / 8) {
2016032899b5SChandrakanth patil softc->pri2cos_valid = false;
2017032899b5SChandrakanth patil return rc;
2018032899b5SChandrakanth patil }
2019032899b5SChandrakanth patil
2020032899b5SChandrakanth patil rc = bnxt_hwrm_pri2cos_idx(softc, HWRM_QUEUE_PRI2COS_QCFG_INPUT_FLAGS_PATH_TX);
2021032899b5SChandrakanth patil if (rc)
2022032899b5SChandrakanth patil return rc;
2023032899b5SChandrakanth patil
2024032899b5SChandrakanth patil if (softc->is_asym_q) {
2025032899b5SChandrakanth patil rc = bnxt_hwrm_pri2cos_idx(softc, HWRM_QUEUE_PRI2COS_QCFG_INPUT_FLAGS_PATH_RX);
2026032899b5SChandrakanth patil if (rc)
2027032899b5SChandrakanth patil return rc;
2028032899b5SChandrakanth patil } else {
2029032899b5SChandrakanth patil memcpy(softc->rx_pri2cos_idx, softc->tx_pri2cos_idx, sizeof(softc->rx_pri2cos_idx));
2030032899b5SChandrakanth patil }
2031032899b5SChandrakanth patil
2032032899b5SChandrakanth patil u64 *rx_port_stats_ext = (u64 *)softc->hw_rx_port_stats_ext.idi_vaddr;
2033032899b5SChandrakanth patil u64 *tx_port_stats_ext = (u64 *)softc->hw_tx_port_stats_ext.idi_vaddr;
2034032899b5SChandrakanth patil
2035032899b5SChandrakanth patil if (softc->pri2cos_valid) {
2036032899b5SChandrakanth patil for (i = 0; i < 8; i++) {
2037032899b5SChandrakanth patil long n = bnxt_rx_bytes_pri_arr_base_off[i] +
2038032899b5SChandrakanth patil softc->rx_pri2cos_idx[i];
2039032899b5SChandrakanth patil
2040032899b5SChandrakanth patil softc->rx_bytes_pri[i] = *(rx_port_stats_ext + n);
2041032899b5SChandrakanth patil }
2042032899b5SChandrakanth patil for (i = 0; i < 8; i++) {
2043032899b5SChandrakanth patil long n = bnxt_rx_pkts_pri_arr_base_off[i] +
2044032899b5SChandrakanth patil softc->rx_pri2cos_idx[i];
2045032899b5SChandrakanth patil
2046032899b5SChandrakanth patil softc->rx_packets_pri[i] = *(rx_port_stats_ext + n);
2047032899b5SChandrakanth patil }
2048032899b5SChandrakanth patil for (i = 0; i < 8; i++) {
2049032899b5SChandrakanth patil long n = bnxt_tx_bytes_pri_arr_base_off[i] +
2050032899b5SChandrakanth patil softc->tx_pri2cos_idx[i];
2051032899b5SChandrakanth patil
2052032899b5SChandrakanth patil softc->tx_bytes_pri[i] = *(tx_port_stats_ext + n);
2053032899b5SChandrakanth patil }
2054032899b5SChandrakanth patil for (i = 0; i < 8; i++) {
2055032899b5SChandrakanth patil long n = bnxt_tx_pkts_pri_arr_base_off[i] +
2056032899b5SChandrakanth patil softc->tx_pri2cos_idx[i];
2057032899b5SChandrakanth patil
2058032899b5SChandrakanth patil softc->tx_packets_pri[i] = *(tx_port_stats_ext + n);
2059032899b5SChandrakanth patil }
2060032899b5SChandrakanth patil }
2061032899b5SChandrakanth patil
2062032899b5SChandrakanth patil return rc;
206335b53f8cSChandrakanth patil }
206435b53f8cSChandrakanth patil
206535b53f8cSChandrakanth patil int
bnxt_hwrm_cfa_l2_set_rx_mask(struct bnxt_softc * softc,struct bnxt_vnic_info * vnic)206635b53f8cSChandrakanth patil bnxt_hwrm_cfa_l2_set_rx_mask(struct bnxt_softc *softc,
206735b53f8cSChandrakanth patil struct bnxt_vnic_info *vnic)
206835b53f8cSChandrakanth patil {
206935b53f8cSChandrakanth patil struct hwrm_cfa_l2_set_rx_mask_input req = {0};
207035b53f8cSChandrakanth patil uint32_t mask = vnic->rx_mask;
207135b53f8cSChandrakanth patil
207235b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_CFA_L2_SET_RX_MASK);
207335b53f8cSChandrakanth patil
207435b53f8cSChandrakanth patil req.vnic_id = htole32(vnic->id);
207535b53f8cSChandrakanth patil req.mask = htole32(mask);
207635b53f8cSChandrakanth patil req.mc_tbl_addr = htole64(vnic->mc_list.idi_paddr);
207735b53f8cSChandrakanth patil req.num_mc_entries = htole32(vnic->mc_list_count);
207835b53f8cSChandrakanth patil return hwrm_send_message(softc, &req, sizeof(req));
207935b53f8cSChandrakanth patil }
208035b53f8cSChandrakanth patil
208135b53f8cSChandrakanth patil int
bnxt_hwrm_l2_filter_free(struct bnxt_softc * softc,uint64_t filter_id)208235b53f8cSChandrakanth patil bnxt_hwrm_l2_filter_free(struct bnxt_softc *softc, uint64_t filter_id)
208335b53f8cSChandrakanth patil {
208435b53f8cSChandrakanth patil struct hwrm_cfa_l2_filter_free_input req = {0};
208535b53f8cSChandrakanth patil int rc = 0;
208635b53f8cSChandrakanth patil
208735b53f8cSChandrakanth patil if (filter_id == -1)
208835b53f8cSChandrakanth patil return rc;
208935b53f8cSChandrakanth patil
209035b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_CFA_L2_FILTER_FREE);
209135b53f8cSChandrakanth patil
209235b53f8cSChandrakanth patil req.l2_filter_id = htole64(filter_id);
209335b53f8cSChandrakanth patil
209435b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
209535b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
209635b53f8cSChandrakanth patil if (rc)
209735b53f8cSChandrakanth patil goto fail;
209835b53f8cSChandrakanth patil
209935b53f8cSChandrakanth patil fail:
210035b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
210135b53f8cSChandrakanth patil return (rc);
210235b53f8cSChandrakanth patil }
210335b53f8cSChandrakanth patil
210435b53f8cSChandrakanth patil int
bnxt_hwrm_free_filter(struct bnxt_softc * softc)210535b53f8cSChandrakanth patil bnxt_hwrm_free_filter(struct bnxt_softc *softc)
210635b53f8cSChandrakanth patil {
210735b53f8cSChandrakanth patil struct bnxt_vnic_info *vnic = &softc->vnic_info;
210835b53f8cSChandrakanth patil struct bnxt_vlan_tag *tag;
210935b53f8cSChandrakanth patil int rc = 0;
211035b53f8cSChandrakanth patil
211135b53f8cSChandrakanth patil rc = bnxt_hwrm_l2_filter_free(softc, softc->vnic_info.filter_id);
211235b53f8cSChandrakanth patil if (rc)
211335b53f8cSChandrakanth patil goto end;
211435b53f8cSChandrakanth patil
211535b53f8cSChandrakanth patil SLIST_FOREACH(tag, &vnic->vlan_tags, next) {
211635b53f8cSChandrakanth patil rc = bnxt_hwrm_l2_filter_free(softc, tag->filter_id);
211735b53f8cSChandrakanth patil if (rc)
211835b53f8cSChandrakanth patil goto end;
211935b53f8cSChandrakanth patil tag->filter_id = -1;
212035b53f8cSChandrakanth patil }
212135b53f8cSChandrakanth patil
212235b53f8cSChandrakanth patil end:
212335b53f8cSChandrakanth patil return rc;
212435b53f8cSChandrakanth patil }
212535b53f8cSChandrakanth patil
212635b53f8cSChandrakanth patil int
bnxt_hwrm_l2_filter_alloc(struct bnxt_softc * softc,uint16_t vlan_tag,uint64_t * filter_id)212735b53f8cSChandrakanth patil bnxt_hwrm_l2_filter_alloc(struct bnxt_softc *softc, uint16_t vlan_tag,
212835b53f8cSChandrakanth patil uint64_t *filter_id)
212935b53f8cSChandrakanth patil {
213035b53f8cSChandrakanth patil struct hwrm_cfa_l2_filter_alloc_input req = {0};
213135b53f8cSChandrakanth patil struct hwrm_cfa_l2_filter_alloc_output *resp;
213235b53f8cSChandrakanth patil struct bnxt_vnic_info *vnic = &softc->vnic_info;
213335b53f8cSChandrakanth patil uint32_t enables = 0;
213435b53f8cSChandrakanth patil int rc = 0;
213535b53f8cSChandrakanth patil
213635b53f8cSChandrakanth patil if (*filter_id != -1) {
213735b53f8cSChandrakanth patil device_printf(softc->dev, "Attempt to re-allocate l2 ctx "
213835b53f8cSChandrakanth patil "filter (fid: 0x%jx)\n", (uintmax_t)*filter_id);
213935b53f8cSChandrakanth patil return EDOOFUS;
214035b53f8cSChandrakanth patil }
214135b53f8cSChandrakanth patil
214235b53f8cSChandrakanth patil resp = (void *)softc->hwrm_cmd_resp.idi_vaddr;
214335b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_CFA_L2_FILTER_ALLOC);
214435b53f8cSChandrakanth patil
214535b53f8cSChandrakanth patil req.flags = htole32(HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_RX);
214635b53f8cSChandrakanth patil enables = HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR
214735b53f8cSChandrakanth patil | HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR_MASK
214835b53f8cSChandrakanth patil | HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_DST_ID;
214935b53f8cSChandrakanth patil
215035b53f8cSChandrakanth patil if (vlan_tag != 0xffff) {
215135b53f8cSChandrakanth patil enables |=
215235b53f8cSChandrakanth patil HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_IVLAN |
215335b53f8cSChandrakanth patil HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_IVLAN_MASK |
215435b53f8cSChandrakanth patil HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_NUM_VLANS;
215535b53f8cSChandrakanth patil req.l2_ivlan_mask = 0xffff;
215635b53f8cSChandrakanth patil req.l2_ivlan = vlan_tag;
215735b53f8cSChandrakanth patil req.num_vlans = 1;
215835b53f8cSChandrakanth patil }
215935b53f8cSChandrakanth patil
216035b53f8cSChandrakanth patil req.enables = htole32(enables);
216135b53f8cSChandrakanth patil req.dst_id = htole16(vnic->id);
216235b53f8cSChandrakanth patil memcpy(req.l2_addr, if_getlladdr(iflib_get_ifp(softc->ctx)),
216335b53f8cSChandrakanth patil ETHER_ADDR_LEN);
216435b53f8cSChandrakanth patil memset(&req.l2_addr_mask, 0xff, sizeof(req.l2_addr_mask));
216535b53f8cSChandrakanth patil
216635b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
216735b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
216835b53f8cSChandrakanth patil if (rc)
216935b53f8cSChandrakanth patil goto fail;
217035b53f8cSChandrakanth patil
217135b53f8cSChandrakanth patil *filter_id = le64toh(resp->l2_filter_id);
217235b53f8cSChandrakanth patil fail:
217335b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
217435b53f8cSChandrakanth patil return (rc);
217535b53f8cSChandrakanth patil }
217635b53f8cSChandrakanth patil
217735b53f8cSChandrakanth patil int
bnxt_hwrm_set_filter(struct bnxt_softc * softc)217835b53f8cSChandrakanth patil bnxt_hwrm_set_filter(struct bnxt_softc *softc)
217935b53f8cSChandrakanth patil {
218035b53f8cSChandrakanth patil struct bnxt_vnic_info *vnic = &softc->vnic_info;
218135b53f8cSChandrakanth patil struct bnxt_vlan_tag *tag;
218235b53f8cSChandrakanth patil int rc = 0;
218335b53f8cSChandrakanth patil
218435b53f8cSChandrakanth patil rc = bnxt_hwrm_l2_filter_alloc(softc, 0xffff, &vnic->filter_id);
218535b53f8cSChandrakanth patil if (rc)
218635b53f8cSChandrakanth patil goto end;
218735b53f8cSChandrakanth patil
218835b53f8cSChandrakanth patil SLIST_FOREACH(tag, &vnic->vlan_tags, next) {
218935b53f8cSChandrakanth patil rc = bnxt_hwrm_l2_filter_alloc(softc, tag->tag,
219035b53f8cSChandrakanth patil &tag->filter_id);
219135b53f8cSChandrakanth patil if (rc)
219235b53f8cSChandrakanth patil goto end;
219335b53f8cSChandrakanth patil }
219435b53f8cSChandrakanth patil
219535b53f8cSChandrakanth patil end:
219635b53f8cSChandrakanth patil return rc;
219735b53f8cSChandrakanth patil }
219835b53f8cSChandrakanth patil
219935b53f8cSChandrakanth patil int
bnxt_hwrm_rss_cfg(struct bnxt_softc * softc,struct bnxt_vnic_info * vnic,uint32_t hash_type)220035b53f8cSChandrakanth patil bnxt_hwrm_rss_cfg(struct bnxt_softc *softc, struct bnxt_vnic_info *vnic,
220135b53f8cSChandrakanth patil uint32_t hash_type)
220235b53f8cSChandrakanth patil {
220335b53f8cSChandrakanth patil struct hwrm_vnic_rss_cfg_input req = {0};
220435b53f8cSChandrakanth patil
220535b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_VNIC_RSS_CFG);
220635b53f8cSChandrakanth patil
220726bd37daSSreekanth Reddy if (BNXT_CHIP_P7(softc))
220826bd37daSSreekanth Reddy req.flags |= HWRM_VNIC_RSS_CFG_INPUT_FLAGS_IPSEC_HASH_TYPE_CFG_SUPPORT;
220926bd37daSSreekanth Reddy
221035b53f8cSChandrakanth patil req.hash_type = htole32(hash_type);
221135b53f8cSChandrakanth patil req.ring_grp_tbl_addr = htole64(vnic->rss_grp_tbl.idi_paddr);
221235b53f8cSChandrakanth patil req.hash_key_tbl_addr = htole64(vnic->rss_hash_key_tbl.idi_paddr);
221335b53f8cSChandrakanth patil req.rss_ctx_idx = htole16(vnic->rss_id);
221435b53f8cSChandrakanth patil req.hash_mode_flags = HWRM_FUNC_SPD_CFG_INPUT_HASH_MODE_FLAGS_DEFAULT;
221526bd37daSSreekanth Reddy if (BNXT_CHIP_P5_PLUS(softc)) {
221635b53f8cSChandrakanth patil req.vnic_id = htole16(vnic->id);
221735b53f8cSChandrakanth patil req.ring_table_pair_index = 0x0;
221835b53f8cSChandrakanth patil }
221935b53f8cSChandrakanth patil
222035b53f8cSChandrakanth patil return hwrm_send_message(softc, &req, sizeof(req));
222135b53f8cSChandrakanth patil }
222235b53f8cSChandrakanth patil
222335b53f8cSChandrakanth patil int
bnxt_hwrm_reserve_pf_rings(struct bnxt_softc * softc)222435b53f8cSChandrakanth patil bnxt_hwrm_reserve_pf_rings(struct bnxt_softc *softc)
222535b53f8cSChandrakanth patil {
222635b53f8cSChandrakanth patil struct hwrm_func_cfg_input req = {0};
222735b53f8cSChandrakanth patil
222835b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FUNC_CFG);
222935b53f8cSChandrakanth patil
223035b53f8cSChandrakanth patil req.fid = htole16(0xffff);
223135b53f8cSChandrakanth patil req.enables |= htole32(HWRM_FUNC_CFG_INPUT_ENABLES_NUM_RSSCOS_CTXS);
223235b53f8cSChandrakanth patil req.enables |= htole32(HWRM_FUNC_CFG_INPUT_ENABLES_NUM_CMPL_RINGS);
223335b53f8cSChandrakanth patil req.enables |= htole32(HWRM_FUNC_CFG_INPUT_ENABLES_NUM_TX_RINGS);
223435b53f8cSChandrakanth patil req.enables |= htole32(HWRM_FUNC_CFG_INPUT_ENABLES_NUM_RX_RINGS);
223535b53f8cSChandrakanth patil req.enables |= htole32(HWRM_FUNC_CFG_INPUT_ENABLES_NUM_VNICS);
223635b53f8cSChandrakanth patil req.enables |= htole32(HWRM_FUNC_CFG_INPUT_ENABLES_NUM_MSIX);
223735b53f8cSChandrakanth patil req.enables |= htole32(HWRM_FUNC_CFG_INPUT_ENABLES_NUM_STAT_CTXS);
223835b53f8cSChandrakanth patil req.num_msix = htole16(BNXT_MAX_NUM_QUEUES);
223935b53f8cSChandrakanth patil req.num_rsscos_ctxs = htole16(0x8);
224035b53f8cSChandrakanth patil req.num_cmpl_rings = htole16(BNXT_MAX_NUM_QUEUES * 2);
224135b53f8cSChandrakanth patil req.num_tx_rings = htole16(BNXT_MAX_NUM_QUEUES);
224235b53f8cSChandrakanth patil req.num_rx_rings = htole16(BNXT_MAX_NUM_QUEUES);
224335b53f8cSChandrakanth patil req.num_vnics = htole16(BNXT_MAX_NUM_QUEUES);
224435b53f8cSChandrakanth patil req.num_stat_ctxs = htole16(BNXT_MAX_NUM_QUEUES * 2);
224535b53f8cSChandrakanth patil
224635b53f8cSChandrakanth patil return hwrm_send_message(softc, &req, sizeof(req));
224735b53f8cSChandrakanth patil }
224835b53f8cSChandrakanth patil
224935b53f8cSChandrakanth patil int
bnxt_cfg_async_cr(struct bnxt_softc * softc)225035b53f8cSChandrakanth patil bnxt_cfg_async_cr(struct bnxt_softc *softc)
225135b53f8cSChandrakanth patil {
225235b53f8cSChandrakanth patil int rc = 0;
225335b53f8cSChandrakanth patil struct hwrm_func_cfg_input req = {0};
225435b53f8cSChandrakanth patil
225535b53f8cSChandrakanth patil if (!BNXT_PF(softc))
225635b53f8cSChandrakanth patil return 0;
225735b53f8cSChandrakanth patil
225835b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FUNC_CFG);
225935b53f8cSChandrakanth patil
226035b53f8cSChandrakanth patil req.fid = htole16(0xffff);
226135b53f8cSChandrakanth patil req.enables = htole32(HWRM_FUNC_CFG_INPUT_ENABLES_ASYNC_EVENT_CR);
226226bd37daSSreekanth Reddy if (BNXT_CHIP_P5_PLUS(softc))
226335b53f8cSChandrakanth patil req.async_event_cr = htole16(softc->nq_rings[0].ring.phys_id);
226435b53f8cSChandrakanth patil else
226535b53f8cSChandrakanth patil req.async_event_cr = htole16(softc->def_cp_ring.ring.phys_id);
226635b53f8cSChandrakanth patil
226735b53f8cSChandrakanth patil rc = hwrm_send_message(softc, &req, sizeof(req));
226835b53f8cSChandrakanth patil
226935b53f8cSChandrakanth patil return rc;
227035b53f8cSChandrakanth patil }
227135b53f8cSChandrakanth patil
227235b53f8cSChandrakanth patil void
bnxt_validate_hw_lro_settings(struct bnxt_softc * softc)227335b53f8cSChandrakanth patil bnxt_validate_hw_lro_settings(struct bnxt_softc *softc)
227435b53f8cSChandrakanth patil {
227535b53f8cSChandrakanth patil softc->hw_lro.enable = min(softc->hw_lro.enable, 1);
227635b53f8cSChandrakanth patil
227735b53f8cSChandrakanth patil softc->hw_lro.is_mode_gro = min(softc->hw_lro.is_mode_gro, 1);
227835b53f8cSChandrakanth patil
227935b53f8cSChandrakanth patil softc->hw_lro.max_agg_segs = min(softc->hw_lro.max_agg_segs,
228035b53f8cSChandrakanth patil HWRM_VNIC_TPA_CFG_INPUT_MAX_AGG_SEGS_MAX);
228135b53f8cSChandrakanth patil
228235b53f8cSChandrakanth patil softc->hw_lro.max_aggs = min(softc->hw_lro.max_aggs,
228335b53f8cSChandrakanth patil HWRM_VNIC_TPA_CFG_INPUT_MAX_AGGS_MAX);
228435b53f8cSChandrakanth patil
228535b53f8cSChandrakanth patil softc->hw_lro.min_agg_len = min(softc->hw_lro.min_agg_len, BNXT_MAX_MTU);
228635b53f8cSChandrakanth patil }
228735b53f8cSChandrakanth patil
228835b53f8cSChandrakanth patil int
bnxt_hwrm_vnic_tpa_cfg(struct bnxt_softc * softc)228935b53f8cSChandrakanth patil bnxt_hwrm_vnic_tpa_cfg(struct bnxt_softc *softc)
229035b53f8cSChandrakanth patil {
229135b53f8cSChandrakanth patil struct hwrm_vnic_tpa_cfg_input req = {0};
229235b53f8cSChandrakanth patil uint32_t flags;
229335b53f8cSChandrakanth patil
229435b53f8cSChandrakanth patil if (softc->vnic_info.id == (uint16_t) HWRM_NA_SIGNATURE) {
229535b53f8cSChandrakanth patil return 0;
229635b53f8cSChandrakanth patil }
229735b53f8cSChandrakanth patil
229835b53f8cSChandrakanth patil if (!(softc->flags & BNXT_FLAG_TPA))
229935b53f8cSChandrakanth patil return 0;
230035b53f8cSChandrakanth patil
230135b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_VNIC_TPA_CFG);
230235b53f8cSChandrakanth patil
230335b53f8cSChandrakanth patil if (softc->hw_lro.enable) {
230435b53f8cSChandrakanth patil flags = HWRM_VNIC_TPA_CFG_INPUT_FLAGS_TPA |
230535b53f8cSChandrakanth patil HWRM_VNIC_TPA_CFG_INPUT_FLAGS_ENCAP_TPA |
230635b53f8cSChandrakanth patil HWRM_VNIC_TPA_CFG_INPUT_FLAGS_AGG_WITH_ECN |
230735b53f8cSChandrakanth patil HWRM_VNIC_TPA_CFG_INPUT_FLAGS_AGG_WITH_SAME_GRE_SEQ;
230835b53f8cSChandrakanth patil
230935b53f8cSChandrakanth patil if (softc->hw_lro.is_mode_gro)
231035b53f8cSChandrakanth patil flags |= HWRM_VNIC_TPA_CFG_INPUT_FLAGS_GRO;
231135b53f8cSChandrakanth patil else
231235b53f8cSChandrakanth patil flags |= HWRM_VNIC_TPA_CFG_INPUT_FLAGS_RSC_WND_UPDATE;
231335b53f8cSChandrakanth patil
231435b53f8cSChandrakanth patil req.flags = htole32(flags);
231535b53f8cSChandrakanth patil
231635b53f8cSChandrakanth patil req.enables = htole32(HWRM_VNIC_TPA_CFG_INPUT_ENABLES_MAX_AGG_SEGS |
231735b53f8cSChandrakanth patil HWRM_VNIC_TPA_CFG_INPUT_ENABLES_MAX_AGGS |
231835b53f8cSChandrakanth patil HWRM_VNIC_TPA_CFG_INPUT_ENABLES_MIN_AGG_LEN);
231935b53f8cSChandrakanth patil
232035b53f8cSChandrakanth patil req.max_agg_segs = htole16(softc->hw_lro.max_agg_segs);
232135b53f8cSChandrakanth patil req.max_aggs = htole16(softc->hw_lro.max_aggs);
232235b53f8cSChandrakanth patil req.min_agg_len = htole32(softc->hw_lro.min_agg_len);
232335b53f8cSChandrakanth patil }
232435b53f8cSChandrakanth patil
232535b53f8cSChandrakanth patil req.vnic_id = htole16(softc->vnic_info.id);
232635b53f8cSChandrakanth patil
232735b53f8cSChandrakanth patil return hwrm_send_message(softc, &req, sizeof(req));
232835b53f8cSChandrakanth patil }
232935b53f8cSChandrakanth patil
233035b53f8cSChandrakanth patil int
bnxt_hwrm_nvm_find_dir_entry(struct bnxt_softc * softc,uint16_t type,uint16_t * ordinal,uint16_t ext,uint16_t * index,bool use_index,uint8_t search_opt,uint32_t * data_length,uint32_t * item_length,uint32_t * fw_ver)233135b53f8cSChandrakanth patil bnxt_hwrm_nvm_find_dir_entry(struct bnxt_softc *softc, uint16_t type,
233235b53f8cSChandrakanth patil uint16_t *ordinal, uint16_t ext, uint16_t *index, bool use_index,
233335b53f8cSChandrakanth patil uint8_t search_opt, uint32_t *data_length, uint32_t *item_length,
233435b53f8cSChandrakanth patil uint32_t *fw_ver)
233535b53f8cSChandrakanth patil {
233635b53f8cSChandrakanth patil struct hwrm_nvm_find_dir_entry_input req = {0};
233735b53f8cSChandrakanth patil struct hwrm_nvm_find_dir_entry_output *resp =
233835b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
233935b53f8cSChandrakanth patil int rc = 0;
234035b53f8cSChandrakanth patil uint32_t old_timeo;
234135b53f8cSChandrakanth patil
234235b53f8cSChandrakanth patil MPASS(ordinal);
234335b53f8cSChandrakanth patil
234435b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_NVM_FIND_DIR_ENTRY);
234535b53f8cSChandrakanth patil if (use_index) {
234635b53f8cSChandrakanth patil req.enables = htole32(
234735b53f8cSChandrakanth patil HWRM_NVM_FIND_DIR_ENTRY_INPUT_ENABLES_DIR_IDX_VALID);
234835b53f8cSChandrakanth patil req.dir_idx = htole16(*index);
234935b53f8cSChandrakanth patil }
235035b53f8cSChandrakanth patil req.dir_type = htole16(type);
235135b53f8cSChandrakanth patil req.dir_ordinal = htole16(*ordinal);
235235b53f8cSChandrakanth patil req.dir_ext = htole16(ext);
235335b53f8cSChandrakanth patil req.opt_ordinal = search_opt;
235435b53f8cSChandrakanth patil
235535b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
235635b53f8cSChandrakanth patil old_timeo = softc->hwrm_cmd_timeo;
235735b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = BNXT_NVM_TIMEO;
235835b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
235935b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = old_timeo;
236035b53f8cSChandrakanth patil if (rc)
236135b53f8cSChandrakanth patil goto exit;
236235b53f8cSChandrakanth patil
236335b53f8cSChandrakanth patil if (item_length)
236435b53f8cSChandrakanth patil *item_length = le32toh(resp->dir_item_length);
236535b53f8cSChandrakanth patil if (data_length)
236635b53f8cSChandrakanth patil *data_length = le32toh(resp->dir_data_length);
236735b53f8cSChandrakanth patil if (fw_ver)
236835b53f8cSChandrakanth patil *fw_ver = le32toh(resp->fw_ver);
236935b53f8cSChandrakanth patil *ordinal = le16toh(resp->dir_ordinal);
237035b53f8cSChandrakanth patil if (index)
237135b53f8cSChandrakanth patil *index = le16toh(resp->dir_idx);
237235b53f8cSChandrakanth patil
237335b53f8cSChandrakanth patil exit:
237435b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
237535b53f8cSChandrakanth patil return (rc);
237635b53f8cSChandrakanth patil }
237735b53f8cSChandrakanth patil
237835b53f8cSChandrakanth patil int
bnxt_hwrm_nvm_read(struct bnxt_softc * softc,uint16_t index,uint32_t offset,uint32_t length,struct iflib_dma_info * data)237935b53f8cSChandrakanth patil bnxt_hwrm_nvm_read(struct bnxt_softc *softc, uint16_t index, uint32_t offset,
238035b53f8cSChandrakanth patil uint32_t length, struct iflib_dma_info *data)
238135b53f8cSChandrakanth patil {
238235b53f8cSChandrakanth patil struct hwrm_nvm_read_input req = {0};
238335b53f8cSChandrakanth patil int rc;
238435b53f8cSChandrakanth patil uint32_t old_timeo;
238535b53f8cSChandrakanth patil
238635b53f8cSChandrakanth patil if (length > data->idi_size) {
238735b53f8cSChandrakanth patil rc = EINVAL;
238835b53f8cSChandrakanth patil goto exit;
238935b53f8cSChandrakanth patil }
239035b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_NVM_READ);
239135b53f8cSChandrakanth patil req.host_dest_addr = htole64(data->idi_paddr);
239235b53f8cSChandrakanth patil req.dir_idx = htole16(index);
239335b53f8cSChandrakanth patil req.offset = htole32(offset);
239435b53f8cSChandrakanth patil req.len = htole32(length);
239535b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
239635b53f8cSChandrakanth patil old_timeo = softc->hwrm_cmd_timeo;
239735b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = BNXT_NVM_TIMEO;
239835b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
239935b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = old_timeo;
240035b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
240135b53f8cSChandrakanth patil if (rc)
240235b53f8cSChandrakanth patil goto exit;
240335b53f8cSChandrakanth patil bus_dmamap_sync(data->idi_tag, data->idi_map, BUS_DMASYNC_POSTREAD);
240435b53f8cSChandrakanth patil
240535b53f8cSChandrakanth patil goto exit;
240635b53f8cSChandrakanth patil
240735b53f8cSChandrakanth patil exit:
240835b53f8cSChandrakanth patil return rc;
240935b53f8cSChandrakanth patil }
241035b53f8cSChandrakanth patil
241135b53f8cSChandrakanth patil int
bnxt_hwrm_nvm_modify(struct bnxt_softc * softc,uint16_t index,uint32_t offset,void * data,bool cpyin,uint32_t length)241235b53f8cSChandrakanth patil bnxt_hwrm_nvm_modify(struct bnxt_softc *softc, uint16_t index, uint32_t offset,
241335b53f8cSChandrakanth patil void *data, bool cpyin, uint32_t length)
241435b53f8cSChandrakanth patil {
241535b53f8cSChandrakanth patil struct hwrm_nvm_modify_input req = {0};
241635b53f8cSChandrakanth patil struct iflib_dma_info dma_data;
241735b53f8cSChandrakanth patil int rc;
241835b53f8cSChandrakanth patil uint32_t old_timeo;
241935b53f8cSChandrakanth patil
242035b53f8cSChandrakanth patil if (length == 0 || !data)
242135b53f8cSChandrakanth patil return EINVAL;
242235b53f8cSChandrakanth patil rc = iflib_dma_alloc(softc->ctx, length, &dma_data,
242335b53f8cSChandrakanth patil BUS_DMA_NOWAIT);
242435b53f8cSChandrakanth patil if (rc)
242535b53f8cSChandrakanth patil return ENOMEM;
242635b53f8cSChandrakanth patil if (cpyin) {
242735b53f8cSChandrakanth patil rc = copyin(data, dma_data.idi_vaddr, length);
242835b53f8cSChandrakanth patil if (rc)
242935b53f8cSChandrakanth patil goto exit;
243035b53f8cSChandrakanth patil }
243135b53f8cSChandrakanth patil else
243235b53f8cSChandrakanth patil memcpy(dma_data.idi_vaddr, data, length);
243335b53f8cSChandrakanth patil bus_dmamap_sync(dma_data.idi_tag, dma_data.idi_map,
243435b53f8cSChandrakanth patil BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
243535b53f8cSChandrakanth patil
243635b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_NVM_MODIFY);
243735b53f8cSChandrakanth patil req.host_src_addr = htole64(dma_data.idi_paddr);
243835b53f8cSChandrakanth patil req.dir_idx = htole16(index);
243935b53f8cSChandrakanth patil req.offset = htole32(offset);
244035b53f8cSChandrakanth patil req.len = htole32(length);
244135b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
244235b53f8cSChandrakanth patil old_timeo = softc->hwrm_cmd_timeo;
244335b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = BNXT_NVM_TIMEO;
244435b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
244535b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = old_timeo;
244635b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
244735b53f8cSChandrakanth patil
244835b53f8cSChandrakanth patil exit:
244935b53f8cSChandrakanth patil iflib_dma_free(&dma_data);
245035b53f8cSChandrakanth patil return rc;
245135b53f8cSChandrakanth patil }
245235b53f8cSChandrakanth patil
245335b53f8cSChandrakanth patil int
bnxt_hwrm_fw_reset(struct bnxt_softc * softc,uint8_t processor,uint8_t * selfreset)245435b53f8cSChandrakanth patil bnxt_hwrm_fw_reset(struct bnxt_softc *softc, uint8_t processor,
245535b53f8cSChandrakanth patil uint8_t *selfreset)
245635b53f8cSChandrakanth patil {
245735b53f8cSChandrakanth patil struct hwrm_fw_reset_input req = {0};
245835b53f8cSChandrakanth patil struct hwrm_fw_reset_output *resp =
245935b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
246035b53f8cSChandrakanth patil int rc;
246135b53f8cSChandrakanth patil
246235b53f8cSChandrakanth patil MPASS(selfreset);
246335b53f8cSChandrakanth patil
246435b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FW_RESET);
246535b53f8cSChandrakanth patil req.embedded_proc_type = processor;
246635b53f8cSChandrakanth patil req.selfrst_status = *selfreset;
246735b53f8cSChandrakanth patil
246835b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
246935b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
247035b53f8cSChandrakanth patil if (rc)
247135b53f8cSChandrakanth patil goto exit;
247235b53f8cSChandrakanth patil *selfreset = resp->selfrst_status;
247335b53f8cSChandrakanth patil
247435b53f8cSChandrakanth patil exit:
247535b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
247635b53f8cSChandrakanth patil return rc;
247735b53f8cSChandrakanth patil }
247835b53f8cSChandrakanth patil
247935b53f8cSChandrakanth patil int
bnxt_hwrm_fw_qstatus(struct bnxt_softc * softc,uint8_t type,uint8_t * selfreset)248035b53f8cSChandrakanth patil bnxt_hwrm_fw_qstatus(struct bnxt_softc *softc, uint8_t type, uint8_t *selfreset)
248135b53f8cSChandrakanth patil {
248235b53f8cSChandrakanth patil struct hwrm_fw_qstatus_input req = {0};
248335b53f8cSChandrakanth patil struct hwrm_fw_qstatus_output *resp =
248435b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
248535b53f8cSChandrakanth patil int rc;
248635b53f8cSChandrakanth patil
248735b53f8cSChandrakanth patil MPASS(selfreset);
248835b53f8cSChandrakanth patil
248935b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FW_QSTATUS);
249035b53f8cSChandrakanth patil req.embedded_proc_type = type;
249135b53f8cSChandrakanth patil
249235b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
249335b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
249435b53f8cSChandrakanth patil if (rc)
249535b53f8cSChandrakanth patil goto exit;
249635b53f8cSChandrakanth patil *selfreset = resp->selfrst_status;
249735b53f8cSChandrakanth patil
249835b53f8cSChandrakanth patil exit:
249935b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
250035b53f8cSChandrakanth patil return rc;
250135b53f8cSChandrakanth patil }
250235b53f8cSChandrakanth patil
250335b53f8cSChandrakanth patil int
bnxt_hwrm_nvm_write(struct bnxt_softc * softc,void * data,bool cpyin,uint16_t type,uint16_t ordinal,uint16_t ext,uint16_t attr,uint16_t option,uint32_t data_length,bool keep,uint32_t * item_length,uint16_t * index)250435b53f8cSChandrakanth patil bnxt_hwrm_nvm_write(struct bnxt_softc *softc, void *data, bool cpyin,
250535b53f8cSChandrakanth patil uint16_t type, uint16_t ordinal, uint16_t ext, uint16_t attr,
250635b53f8cSChandrakanth patil uint16_t option, uint32_t data_length, bool keep, uint32_t *item_length,
250735b53f8cSChandrakanth patil uint16_t *index)
250835b53f8cSChandrakanth patil {
250935b53f8cSChandrakanth patil struct hwrm_nvm_write_input req = {0};
251035b53f8cSChandrakanth patil struct hwrm_nvm_write_output *resp =
251135b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
251235b53f8cSChandrakanth patil struct iflib_dma_info dma_data;
251335b53f8cSChandrakanth patil int rc;
251435b53f8cSChandrakanth patil uint32_t old_timeo;
251535b53f8cSChandrakanth patil
251635b53f8cSChandrakanth patil if (data_length) {
251735b53f8cSChandrakanth patil rc = iflib_dma_alloc(softc->ctx, data_length, &dma_data,
251835b53f8cSChandrakanth patil BUS_DMA_NOWAIT);
251935b53f8cSChandrakanth patil if (rc)
252035b53f8cSChandrakanth patil return ENOMEM;
252135b53f8cSChandrakanth patil if (cpyin) {
252235b53f8cSChandrakanth patil rc = copyin(data, dma_data.idi_vaddr, data_length);
252335b53f8cSChandrakanth patil if (rc)
252435b53f8cSChandrakanth patil goto early_exit;
252535b53f8cSChandrakanth patil }
252635b53f8cSChandrakanth patil else
252735b53f8cSChandrakanth patil memcpy(dma_data.idi_vaddr, data, data_length);
252835b53f8cSChandrakanth patil bus_dmamap_sync(dma_data.idi_tag, dma_data.idi_map,
252935b53f8cSChandrakanth patil BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
253035b53f8cSChandrakanth patil }
253135b53f8cSChandrakanth patil else
253235b53f8cSChandrakanth patil dma_data.idi_paddr = 0;
253335b53f8cSChandrakanth patil
253435b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_NVM_WRITE);
253535b53f8cSChandrakanth patil
253635b53f8cSChandrakanth patil req.host_src_addr = htole64(dma_data.idi_paddr);
253735b53f8cSChandrakanth patil req.dir_type = htole16(type);
253835b53f8cSChandrakanth patil req.dir_ordinal = htole16(ordinal);
253935b53f8cSChandrakanth patil req.dir_ext = htole16(ext);
254035b53f8cSChandrakanth patil req.dir_attr = htole16(attr);
254135b53f8cSChandrakanth patil req.dir_data_length = htole32(data_length);
254235b53f8cSChandrakanth patil req.option = htole16(option);
254335b53f8cSChandrakanth patil if (keep) {
254435b53f8cSChandrakanth patil req.flags =
254535b53f8cSChandrakanth patil htole16(HWRM_NVM_WRITE_INPUT_FLAGS_KEEP_ORIG_ACTIVE_IMG);
254635b53f8cSChandrakanth patil }
254735b53f8cSChandrakanth patil if (item_length)
254835b53f8cSChandrakanth patil req.dir_item_length = htole32(*item_length);
254935b53f8cSChandrakanth patil
255035b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
255135b53f8cSChandrakanth patil old_timeo = softc->hwrm_cmd_timeo;
255235b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = BNXT_NVM_TIMEO;
255335b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
255435b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = old_timeo;
255535b53f8cSChandrakanth patil if (rc)
255635b53f8cSChandrakanth patil goto exit;
255735b53f8cSChandrakanth patil if (item_length)
255835b53f8cSChandrakanth patil *item_length = le32toh(resp->dir_item_length);
255935b53f8cSChandrakanth patil if (index)
256035b53f8cSChandrakanth patil *index = le16toh(resp->dir_idx);
256135b53f8cSChandrakanth patil
256235b53f8cSChandrakanth patil exit:
256335b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
256435b53f8cSChandrakanth patil early_exit:
256535b53f8cSChandrakanth patil if (data_length)
256635b53f8cSChandrakanth patil iflib_dma_free(&dma_data);
256735b53f8cSChandrakanth patil return rc;
256835b53f8cSChandrakanth patil }
256935b53f8cSChandrakanth patil
257035b53f8cSChandrakanth patil int
bnxt_hwrm_nvm_erase_dir_entry(struct bnxt_softc * softc,uint16_t index)257135b53f8cSChandrakanth patil bnxt_hwrm_nvm_erase_dir_entry(struct bnxt_softc *softc, uint16_t index)
257235b53f8cSChandrakanth patil {
257335b53f8cSChandrakanth patil struct hwrm_nvm_erase_dir_entry_input req = {0};
257435b53f8cSChandrakanth patil uint32_t old_timeo;
257535b53f8cSChandrakanth patil int rc;
257635b53f8cSChandrakanth patil
257735b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_NVM_ERASE_DIR_ENTRY);
257835b53f8cSChandrakanth patil req.dir_idx = htole16(index);
257935b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
258035b53f8cSChandrakanth patil old_timeo = softc->hwrm_cmd_timeo;
258135b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = BNXT_NVM_TIMEO;
258235b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
258335b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = old_timeo;
258435b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
258535b53f8cSChandrakanth patil return rc;
258635b53f8cSChandrakanth patil }
258735b53f8cSChandrakanth patil
258835b53f8cSChandrakanth patil int
bnxt_hwrm_nvm_get_dir_info(struct bnxt_softc * softc,uint32_t * entries,uint32_t * entry_length)258935b53f8cSChandrakanth patil bnxt_hwrm_nvm_get_dir_info(struct bnxt_softc *softc, uint32_t *entries,
259035b53f8cSChandrakanth patil uint32_t *entry_length)
259135b53f8cSChandrakanth patil {
259235b53f8cSChandrakanth patil struct hwrm_nvm_get_dir_info_input req = {0};
259335b53f8cSChandrakanth patil struct hwrm_nvm_get_dir_info_output *resp =
259435b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
259535b53f8cSChandrakanth patil int rc;
259635b53f8cSChandrakanth patil uint32_t old_timeo;
259735b53f8cSChandrakanth patil
259835b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_NVM_GET_DIR_INFO);
259935b53f8cSChandrakanth patil
260035b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
260135b53f8cSChandrakanth patil old_timeo = softc->hwrm_cmd_timeo;
260235b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = BNXT_NVM_TIMEO;
260335b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
260435b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = old_timeo;
260535b53f8cSChandrakanth patil if (rc)
260635b53f8cSChandrakanth patil goto exit;
260735b53f8cSChandrakanth patil
260835b53f8cSChandrakanth patil if (entries)
260935b53f8cSChandrakanth patil *entries = le32toh(resp->entries);
261035b53f8cSChandrakanth patil if (entry_length)
261135b53f8cSChandrakanth patil *entry_length = le32toh(resp->entry_length);
261235b53f8cSChandrakanth patil
261335b53f8cSChandrakanth patil exit:
261435b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
261535b53f8cSChandrakanth patil return rc;
261635b53f8cSChandrakanth patil }
261735b53f8cSChandrakanth patil
261835b53f8cSChandrakanth patil int
bnxt_hwrm_nvm_get_dir_entries(struct bnxt_softc * softc,uint32_t * entries,uint32_t * entry_length,struct iflib_dma_info * dma_data)261935b53f8cSChandrakanth patil bnxt_hwrm_nvm_get_dir_entries(struct bnxt_softc *softc, uint32_t *entries,
262035b53f8cSChandrakanth patil uint32_t *entry_length, struct iflib_dma_info *dma_data)
262135b53f8cSChandrakanth patil {
262235b53f8cSChandrakanth patil struct hwrm_nvm_get_dir_entries_input req = {0};
262335b53f8cSChandrakanth patil uint32_t ent;
262435b53f8cSChandrakanth patil uint32_t ent_len;
262535b53f8cSChandrakanth patil int rc;
262635b53f8cSChandrakanth patil uint32_t old_timeo;
262735b53f8cSChandrakanth patil
262835b53f8cSChandrakanth patil if (!entries)
262935b53f8cSChandrakanth patil entries = &ent;
263035b53f8cSChandrakanth patil if (!entry_length)
263135b53f8cSChandrakanth patil entry_length = &ent_len;
263235b53f8cSChandrakanth patil
263335b53f8cSChandrakanth patil rc = bnxt_hwrm_nvm_get_dir_info(softc, entries, entry_length);
263435b53f8cSChandrakanth patil if (rc)
263535b53f8cSChandrakanth patil goto exit;
263635b53f8cSChandrakanth patil if (*entries * *entry_length > dma_data->idi_size) {
263735b53f8cSChandrakanth patil rc = EINVAL;
263835b53f8cSChandrakanth patil goto exit;
263935b53f8cSChandrakanth patil }
264035b53f8cSChandrakanth patil
264135b53f8cSChandrakanth patil /*
264235b53f8cSChandrakanth patil * TODO: There's a race condition here that could blow up DMA memory...
264335b53f8cSChandrakanth patil * we need to allocate the max size, not the currently in use
264435b53f8cSChandrakanth patil * size. The command should totally have a max size here.
264535b53f8cSChandrakanth patil */
264635b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_NVM_GET_DIR_ENTRIES);
264735b53f8cSChandrakanth patil req.host_dest_addr = htole64(dma_data->idi_paddr);
264835b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
264935b53f8cSChandrakanth patil old_timeo = softc->hwrm_cmd_timeo;
265035b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = BNXT_NVM_TIMEO;
265135b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
265235b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = old_timeo;
265335b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
265435b53f8cSChandrakanth patil if (rc)
265535b53f8cSChandrakanth patil goto exit;
265635b53f8cSChandrakanth patil bus_dmamap_sync(dma_data->idi_tag, dma_data->idi_map,
265735b53f8cSChandrakanth patil BUS_DMASYNC_POSTWRITE);
265835b53f8cSChandrakanth patil
265935b53f8cSChandrakanth patil exit:
266035b53f8cSChandrakanth patil return rc;
266135b53f8cSChandrakanth patil }
266235b53f8cSChandrakanth patil
266335b53f8cSChandrakanth patil int
bnxt_hwrm_nvm_get_dev_info(struct bnxt_softc * softc,uint16_t * mfg_id,uint16_t * device_id,uint32_t * sector_size,uint32_t * nvram_size,uint32_t * reserved_size,uint32_t * available_size)266435b53f8cSChandrakanth patil bnxt_hwrm_nvm_get_dev_info(struct bnxt_softc *softc, uint16_t *mfg_id,
266535b53f8cSChandrakanth patil uint16_t *device_id, uint32_t *sector_size, uint32_t *nvram_size,
266635b53f8cSChandrakanth patil uint32_t *reserved_size, uint32_t *available_size)
266735b53f8cSChandrakanth patil {
266835b53f8cSChandrakanth patil struct hwrm_nvm_get_dev_info_input req = {0};
266935b53f8cSChandrakanth patil struct hwrm_nvm_get_dev_info_output *resp =
267035b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
267135b53f8cSChandrakanth patil int rc;
267235b53f8cSChandrakanth patil uint32_t old_timeo;
267335b53f8cSChandrakanth patil
267435b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_NVM_GET_DEV_INFO);
267535b53f8cSChandrakanth patil
267635b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
267735b53f8cSChandrakanth patil old_timeo = softc->hwrm_cmd_timeo;
267835b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = BNXT_NVM_TIMEO;
267935b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
268035b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = old_timeo;
268135b53f8cSChandrakanth patil if (rc)
268235b53f8cSChandrakanth patil goto exit;
268335b53f8cSChandrakanth patil
268435b53f8cSChandrakanth patil if (mfg_id)
268535b53f8cSChandrakanth patil *mfg_id = le16toh(resp->manufacturer_id);
268635b53f8cSChandrakanth patil if (device_id)
268735b53f8cSChandrakanth patil *device_id = le16toh(resp->device_id);
268835b53f8cSChandrakanth patil if (sector_size)
268935b53f8cSChandrakanth patil *sector_size = le32toh(resp->sector_size);
269035b53f8cSChandrakanth patil if (nvram_size)
269135b53f8cSChandrakanth patil *nvram_size = le32toh(resp->nvram_size);
269235b53f8cSChandrakanth patil if (reserved_size)
269335b53f8cSChandrakanth patil *reserved_size = le32toh(resp->reserved_size);
269435b53f8cSChandrakanth patil if (available_size)
269535b53f8cSChandrakanth patil *available_size = le32toh(resp->available_size);
269635b53f8cSChandrakanth patil
269735b53f8cSChandrakanth patil exit:
269835b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
269935b53f8cSChandrakanth patil return rc;
270035b53f8cSChandrakanth patil }
270135b53f8cSChandrakanth patil
270235b53f8cSChandrakanth patil int
bnxt_hwrm_nvm_install_update(struct bnxt_softc * softc,uint32_t install_type,uint64_t * installed_items,uint8_t * result,uint8_t * problem_item,uint8_t * reset_required)270335b53f8cSChandrakanth patil bnxt_hwrm_nvm_install_update(struct bnxt_softc *softc,
270435b53f8cSChandrakanth patil uint32_t install_type, uint64_t *installed_items, uint8_t *result,
270535b53f8cSChandrakanth patil uint8_t *problem_item, uint8_t *reset_required)
270635b53f8cSChandrakanth patil {
270735b53f8cSChandrakanth patil struct hwrm_nvm_install_update_input req = {0};
270835b53f8cSChandrakanth patil struct hwrm_nvm_install_update_output *resp =
270935b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
271035b53f8cSChandrakanth patil int rc;
271135b53f8cSChandrakanth patil uint32_t old_timeo;
271235b53f8cSChandrakanth patil
271335b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_NVM_INSTALL_UPDATE);
271435b53f8cSChandrakanth patil req.install_type = htole32(install_type);
271535b53f8cSChandrakanth patil
271635b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
271735b53f8cSChandrakanth patil old_timeo = softc->hwrm_cmd_timeo;
271835b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = BNXT_NVM_TIMEO;
271935b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
272035b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = old_timeo;
272135b53f8cSChandrakanth patil if (rc)
272235b53f8cSChandrakanth patil goto exit;
272335b53f8cSChandrakanth patil
272435b53f8cSChandrakanth patil if (installed_items)
272535b53f8cSChandrakanth patil *installed_items = le32toh(resp->installed_items);
272635b53f8cSChandrakanth patil if (result)
272735b53f8cSChandrakanth patil *result = resp->result;
272835b53f8cSChandrakanth patil if (problem_item)
272935b53f8cSChandrakanth patil *problem_item = resp->problem_item;
273035b53f8cSChandrakanth patil if (reset_required)
273135b53f8cSChandrakanth patil *reset_required = resp->reset_required;
273235b53f8cSChandrakanth patil
273335b53f8cSChandrakanth patil exit:
273435b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
273535b53f8cSChandrakanth patil return rc;
273635b53f8cSChandrakanth patil }
273735b53f8cSChandrakanth patil
273835b53f8cSChandrakanth patil int
bnxt_hwrm_nvm_verify_update(struct bnxt_softc * softc,uint16_t type,uint16_t ordinal,uint16_t ext)273935b53f8cSChandrakanth patil bnxt_hwrm_nvm_verify_update(struct bnxt_softc *softc, uint16_t type,
274035b53f8cSChandrakanth patil uint16_t ordinal, uint16_t ext)
274135b53f8cSChandrakanth patil {
274235b53f8cSChandrakanth patil struct hwrm_nvm_verify_update_input req = {0};
274335b53f8cSChandrakanth patil uint32_t old_timeo;
274435b53f8cSChandrakanth patil int rc;
274535b53f8cSChandrakanth patil
274635b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_NVM_VERIFY_UPDATE);
274735b53f8cSChandrakanth patil
274835b53f8cSChandrakanth patil req.dir_type = htole16(type);
274935b53f8cSChandrakanth patil req.dir_ordinal = htole16(ordinal);
275035b53f8cSChandrakanth patil req.dir_ext = htole16(ext);
275135b53f8cSChandrakanth patil
275235b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
275335b53f8cSChandrakanth patil old_timeo = softc->hwrm_cmd_timeo;
275435b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = BNXT_NVM_TIMEO;
275535b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
275635b53f8cSChandrakanth patil softc->hwrm_cmd_timeo = old_timeo;
275735b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
275835b53f8cSChandrakanth patil return rc;
275935b53f8cSChandrakanth patil }
276035b53f8cSChandrakanth patil
276135b53f8cSChandrakanth patil int
bnxt_hwrm_fw_get_time(struct bnxt_softc * softc,uint16_t * year,uint8_t * month,uint8_t * day,uint8_t * hour,uint8_t * minute,uint8_t * second,uint16_t * millisecond,uint16_t * zone)276235b53f8cSChandrakanth patil bnxt_hwrm_fw_get_time(struct bnxt_softc *softc, uint16_t *year, uint8_t *month,
276335b53f8cSChandrakanth patil uint8_t *day, uint8_t *hour, uint8_t *minute, uint8_t *second,
276435b53f8cSChandrakanth patil uint16_t *millisecond, uint16_t *zone)
276535b53f8cSChandrakanth patil {
276635b53f8cSChandrakanth patil struct hwrm_fw_get_time_input req = {0};
276735b53f8cSChandrakanth patil struct hwrm_fw_get_time_output *resp =
276835b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
276935b53f8cSChandrakanth patil int rc;
277035b53f8cSChandrakanth patil
277135b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FW_GET_TIME);
277235b53f8cSChandrakanth patil
277335b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
277435b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
277535b53f8cSChandrakanth patil if (rc)
277635b53f8cSChandrakanth patil goto exit;
277735b53f8cSChandrakanth patil
277835b53f8cSChandrakanth patil if (year)
277935b53f8cSChandrakanth patil *year = le16toh(resp->year);
278035b53f8cSChandrakanth patil if (month)
278135b53f8cSChandrakanth patil *month = resp->month;
278235b53f8cSChandrakanth patil if (day)
278335b53f8cSChandrakanth patil *day = resp->day;
278435b53f8cSChandrakanth patil if (hour)
278535b53f8cSChandrakanth patil *hour = resp->hour;
278635b53f8cSChandrakanth patil if (minute)
278735b53f8cSChandrakanth patil *minute = resp->minute;
278835b53f8cSChandrakanth patil if (second)
278935b53f8cSChandrakanth patil *second = resp->second;
279035b53f8cSChandrakanth patil if (millisecond)
279135b53f8cSChandrakanth patil *millisecond = le16toh(resp->millisecond);
279235b53f8cSChandrakanth patil if (zone)
279335b53f8cSChandrakanth patil *zone = le16toh(resp->zone);
279435b53f8cSChandrakanth patil
279535b53f8cSChandrakanth patil exit:
279635b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
279735b53f8cSChandrakanth patil return rc;
279835b53f8cSChandrakanth patil }
279935b53f8cSChandrakanth patil
280035b53f8cSChandrakanth patil int
bnxt_hwrm_fw_set_time(struct bnxt_softc * softc,uint16_t year,uint8_t month,uint8_t day,uint8_t hour,uint8_t minute,uint8_t second,uint16_t millisecond,uint16_t zone)280135b53f8cSChandrakanth patil bnxt_hwrm_fw_set_time(struct bnxt_softc *softc, uint16_t year, uint8_t month,
280235b53f8cSChandrakanth patil uint8_t day, uint8_t hour, uint8_t minute, uint8_t second,
280335b53f8cSChandrakanth patil uint16_t millisecond, uint16_t zone)
280435b53f8cSChandrakanth patil {
280535b53f8cSChandrakanth patil struct hwrm_fw_set_time_input req = {0};
280635b53f8cSChandrakanth patil
280735b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_FW_SET_TIME);
280835b53f8cSChandrakanth patil
280935b53f8cSChandrakanth patil req.year = htole16(year);
281035b53f8cSChandrakanth patil req.month = month;
281135b53f8cSChandrakanth patil req.day = day;
281235b53f8cSChandrakanth patil req.hour = hour;
281335b53f8cSChandrakanth patil req.minute = minute;
281435b53f8cSChandrakanth patil req.second = second;
281535b53f8cSChandrakanth patil req.millisecond = htole16(millisecond);
281635b53f8cSChandrakanth patil req.zone = htole16(zone);
281735b53f8cSChandrakanth patil return hwrm_send_message(softc, &req, sizeof(req));
281835b53f8cSChandrakanth patil }
281935b53f8cSChandrakanth patil
bnxt_read_sfp_module_eeprom_info(struct bnxt_softc * softc,uint16_t i2c_addr,uint16_t page_number,uint8_t bank,bool bank_sel_en,uint16_t start_addr,uint16_t data_length,uint8_t * buf)282035b53f8cSChandrakanth patil int bnxt_read_sfp_module_eeprom_info(struct bnxt_softc *softc, uint16_t i2c_addr,
282135b53f8cSChandrakanth patil uint16_t page_number, uint8_t bank,bool bank_sel_en, uint16_t start_addr,
282235b53f8cSChandrakanth patil uint16_t data_length, uint8_t *buf)
282335b53f8cSChandrakanth patil {
282435b53f8cSChandrakanth patil struct hwrm_port_phy_i2c_read_output *output =
282535b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
282635b53f8cSChandrakanth patil struct hwrm_port_phy_i2c_read_input req = {0};
282735b53f8cSChandrakanth patil int rc = 0, byte_offset = 0;
282835b53f8cSChandrakanth patil
282935b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
283035b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_PORT_PHY_I2C_READ);
283135b53f8cSChandrakanth patil
283235b53f8cSChandrakanth patil req.i2c_slave_addr = i2c_addr;
283335b53f8cSChandrakanth patil req.page_number = htole16(page_number);
283435b53f8cSChandrakanth patil req.port_id = htole16(softc->pf.port_id);
283535b53f8cSChandrakanth patil do {
283635b53f8cSChandrakanth patil uint16_t xfer_size;
283735b53f8cSChandrakanth patil
283835b53f8cSChandrakanth patil xfer_size = min_t(uint16_t, data_length, BNXT_MAX_PHY_I2C_RESP_SIZE);
283935b53f8cSChandrakanth patil data_length -= xfer_size;
284035b53f8cSChandrakanth patil req.page_offset = htole16(start_addr + byte_offset);
284135b53f8cSChandrakanth patil req.data_length = xfer_size;
284235b53f8cSChandrakanth patil req.bank_number = bank;
284335b53f8cSChandrakanth patil req.enables = htole32((start_addr + byte_offset ?
284435b53f8cSChandrakanth patil HWRM_PORT_PHY_I2C_READ_INPUT_ENABLES_PAGE_OFFSET : 0) |
284535b53f8cSChandrakanth patil (bank_sel_en ?
284635b53f8cSChandrakanth patil HWRM_PORT_PHY_I2C_READ_INPUT_ENABLES_BANK_NUMBER : 0));
2847dac78335SSreekanth Reddy rc = _hwrm_send_message(softc, &req, sizeof(req));
284835b53f8cSChandrakanth patil if (!rc)
284935b53f8cSChandrakanth patil memcpy(buf + byte_offset, output->data, xfer_size);
285035b53f8cSChandrakanth patil byte_offset += xfer_size;
285135b53f8cSChandrakanth patil } while (!rc && data_length > 0);
285235b53f8cSChandrakanth patil
285335b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
285435b53f8cSChandrakanth patil
285535b53f8cSChandrakanth patil return rc;
285635b53f8cSChandrakanth patil }
285735b53f8cSChandrakanth patil
285835b53f8cSChandrakanth patil int
bnxt_hwrm_port_phy_qcfg(struct bnxt_softc * softc)285935b53f8cSChandrakanth patil bnxt_hwrm_port_phy_qcfg(struct bnxt_softc *softc)
286035b53f8cSChandrakanth patil {
286135b53f8cSChandrakanth patil struct bnxt_link_info *link_info = &softc->link_info;
286235b53f8cSChandrakanth patil struct hwrm_port_phy_qcfg_input req = {0};
286335b53f8cSChandrakanth patil struct hwrm_port_phy_qcfg_output *resp =
286435b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
286535b53f8cSChandrakanth patil int rc = 0;
286635b53f8cSChandrakanth patil
286735b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_PORT_PHY_QCFG);
286835b53f8cSChandrakanth patil
286935b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
287035b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
287135b53f8cSChandrakanth patil if (rc)
287235b53f8cSChandrakanth patil goto exit;
287335b53f8cSChandrakanth patil
287435b53f8cSChandrakanth patil memcpy(&link_info->phy_qcfg_resp, resp, sizeof(*resp));
287535b53f8cSChandrakanth patil link_info->phy_link_status = resp->link;
287635b53f8cSChandrakanth patil link_info->duplex = resp->duplex_cfg;
287735b53f8cSChandrakanth patil link_info->auto_mode = resp->auto_mode;
287835b53f8cSChandrakanth patil
287935b53f8cSChandrakanth patil /*
288035b53f8cSChandrakanth patil * When AUTO_PAUSE_AUTONEG_PAUSE bit is set to 1,
288135b53f8cSChandrakanth patil * the advertisement of pause is enabled.
288235b53f8cSChandrakanth patil * 1. When the auto_mode is not set to none and this flag is set to 1,
288335b53f8cSChandrakanth patil * then the auto_pause bits on this port are being advertised and
288435b53f8cSChandrakanth patil * autoneg pause results are being interpreted.
288535b53f8cSChandrakanth patil * 2. When the auto_mode is not set to none and this flag is set to 0,
288635b53f8cSChandrakanth patil * the pause is forced as indicated in force_pause, and also
288735b53f8cSChandrakanth patil * advertised as auto_pause bits, but the autoneg results are not
288835b53f8cSChandrakanth patil * interpreted since the pause configuration is being forced.
288935b53f8cSChandrakanth patil * 3. When the auto_mode is set to none and this flag is set to 1,
289035b53f8cSChandrakanth patil * auto_pause bits should be ignored and should be set to 0.
289135b53f8cSChandrakanth patil */
289235b53f8cSChandrakanth patil
289335b53f8cSChandrakanth patil link_info->flow_ctrl.autoneg = false;
289435b53f8cSChandrakanth patil link_info->flow_ctrl.tx = false;
289535b53f8cSChandrakanth patil link_info->flow_ctrl.rx = false;
289635b53f8cSChandrakanth patil
289735b53f8cSChandrakanth patil if ((resp->auto_mode) &&
289835b53f8cSChandrakanth patil (resp->auto_pause & BNXT_AUTO_PAUSE_AUTONEG_PAUSE)) {
289935b53f8cSChandrakanth patil link_info->flow_ctrl.autoneg = true;
290035b53f8cSChandrakanth patil }
290135b53f8cSChandrakanth patil
290235b53f8cSChandrakanth patil if (link_info->flow_ctrl.autoneg) {
290335b53f8cSChandrakanth patil if (resp->auto_pause & BNXT_PAUSE_TX)
290435b53f8cSChandrakanth patil link_info->flow_ctrl.tx = true;
290535b53f8cSChandrakanth patil if (resp->auto_pause & BNXT_PAUSE_RX)
290635b53f8cSChandrakanth patil link_info->flow_ctrl.rx = true;
290735b53f8cSChandrakanth patil } else {
290835b53f8cSChandrakanth patil if (resp->force_pause & BNXT_PAUSE_TX)
290935b53f8cSChandrakanth patil link_info->flow_ctrl.tx = true;
291035b53f8cSChandrakanth patil if (resp->force_pause & BNXT_PAUSE_RX)
291135b53f8cSChandrakanth patil link_info->flow_ctrl.rx = true;
291235b53f8cSChandrakanth patil }
291335b53f8cSChandrakanth patil
291435b53f8cSChandrakanth patil link_info->duplex_setting = resp->duplex_cfg;
291535b53f8cSChandrakanth patil if (link_info->phy_link_status == HWRM_PORT_PHY_QCFG_OUTPUT_LINK_LINK)
291635b53f8cSChandrakanth patil link_info->link_speed = le16toh(resp->link_speed);
291735b53f8cSChandrakanth patil else
291835b53f8cSChandrakanth patil link_info->link_speed = 0;
291935b53f8cSChandrakanth patil link_info->force_link_speed = le16toh(resp->force_link_speed);
292035b53f8cSChandrakanth patil link_info->auto_link_speeds = le16toh(resp->auto_link_speed);
292135b53f8cSChandrakanth patil link_info->support_speeds = le16toh(resp->support_speeds);
292235b53f8cSChandrakanth patil link_info->auto_link_speeds = le16toh(resp->auto_link_speed_mask);
292335b53f8cSChandrakanth patil link_info->preemphasis = le32toh(resp->preemphasis);
292435b53f8cSChandrakanth patil link_info->phy_ver[0] = resp->phy_maj;
292535b53f8cSChandrakanth patil link_info->phy_ver[1] = resp->phy_min;
292635b53f8cSChandrakanth patil link_info->phy_ver[2] = resp->phy_bld;
292735b53f8cSChandrakanth patil snprintf(softc->ver_info->phy_ver, sizeof(softc->ver_info->phy_ver),
292835b53f8cSChandrakanth patil "%d.%d.%d", link_info->phy_ver[0], link_info->phy_ver[1],
292935b53f8cSChandrakanth patil link_info->phy_ver[2]);
293035b53f8cSChandrakanth patil strlcpy(softc->ver_info->phy_vendor, resp->phy_vendor_name,
293135b53f8cSChandrakanth patil BNXT_NAME_SIZE);
293235b53f8cSChandrakanth patil strlcpy(softc->ver_info->phy_partnumber, resp->phy_vendor_partnumber,
293335b53f8cSChandrakanth patil BNXT_NAME_SIZE);
293435b53f8cSChandrakanth patil link_info->media_type = resp->media_type;
293535b53f8cSChandrakanth patil link_info->phy_type = resp->phy_type;
293635b53f8cSChandrakanth patil link_info->transceiver = resp->xcvr_pkg_type;
293735b53f8cSChandrakanth patil link_info->phy_addr = resp->eee_config_phy_addr &
293835b53f8cSChandrakanth patil HWRM_PORT_PHY_QCFG_OUTPUT_PHY_ADDR_MASK;
293935b53f8cSChandrakanth patil link_info->module_status = resp->module_status;
294035b53f8cSChandrakanth patil link_info->support_pam4_speeds = le16toh(resp->support_pam4_speeds);
294135b53f8cSChandrakanth patil link_info->auto_pam4_link_speeds = le16toh(resp->auto_pam4_link_speed_mask);
294235b53f8cSChandrakanth patil link_info->force_pam4_link_speed = le16toh(resp->force_pam4_link_speed);
294335b53f8cSChandrakanth patil
294435b53f8cSChandrakanth patil if (softc->hwrm_spec_code >= 0x10504)
294535b53f8cSChandrakanth patil link_info->active_fec_sig_mode = resp->active_fec_signal_mode;
294635b53f8cSChandrakanth patil
2947dac78335SSreekanth Reddy link_info->support_speeds2 = le16toh(resp->support_speeds2);
2948dac78335SSreekanth Reddy link_info->auto_link_speeds2 = le16toh(resp->auto_link_speeds2);
2949dac78335SSreekanth Reddy link_info->force_link_speeds2 = le16toh(resp->force_link_speeds2);
2950dac78335SSreekanth Reddy
295135b53f8cSChandrakanth patil exit:
295235b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
295335b53f8cSChandrakanth patil return rc;
295435b53f8cSChandrakanth patil }
295535b53f8cSChandrakanth patil
295635b53f8cSChandrakanth patil static bool
bnxt_phy_qcaps_no_speed(struct hwrm_port_phy_qcaps_output * resp)295735b53f8cSChandrakanth patil bnxt_phy_qcaps_no_speed(struct hwrm_port_phy_qcaps_output *resp)
295835b53f8cSChandrakanth patil {
295935b53f8cSChandrakanth patil if (!resp->supported_speeds_auto_mode &&
296035b53f8cSChandrakanth patil !resp->supported_speeds_force_mode &&
296135b53f8cSChandrakanth patil !resp->supported_pam4_speeds_auto_mode &&
2962dac78335SSreekanth Reddy !resp->supported_pam4_speeds_force_mode &&
2963dac78335SSreekanth Reddy !resp->supported_speeds2_auto_mode &&
2964dac78335SSreekanth Reddy !resp->supported_speeds2_force_mode)
296535b53f8cSChandrakanth patil return true;
296635b53f8cSChandrakanth patil
296735b53f8cSChandrakanth patil return false;
296835b53f8cSChandrakanth patil }
296935b53f8cSChandrakanth patil
bnxt_hwrm_phy_qcaps(struct bnxt_softc * softc)297035b53f8cSChandrakanth patil int bnxt_hwrm_phy_qcaps(struct bnxt_softc *softc)
297135b53f8cSChandrakanth patil {
297235b53f8cSChandrakanth patil struct bnxt_link_info *link_info = &softc->link_info;
297335b53f8cSChandrakanth patil struct hwrm_port_phy_qcaps_output *resp =
297435b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
297535b53f8cSChandrakanth patil struct hwrm_port_phy_qcaps_input req = {};
297635b53f8cSChandrakanth patil int rc;
297735b53f8cSChandrakanth patil
297835b53f8cSChandrakanth patil if (softc->hwrm_spec_code < 0x10201)
297935b53f8cSChandrakanth patil return 0;
298035b53f8cSChandrakanth patil
298135b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_PORT_PHY_QCAPS);
298235b53f8cSChandrakanth patil
298335b53f8cSChandrakanth patil BNXT_HWRM_LOCK(softc);
298435b53f8cSChandrakanth patil rc = _hwrm_send_message(softc, &req, sizeof(req));
298535b53f8cSChandrakanth patil if (rc)
298635b53f8cSChandrakanth patil goto exit;
298735b53f8cSChandrakanth patil
298835b53f8cSChandrakanth patil softc->phy_flags = resp->flags | (resp->flags2 << 8);
298935b53f8cSChandrakanth patil if (resp->flags & HWRM_PORT_PHY_QCAPS_OUTPUT_FLAGS_EEE_SUPPORTED) {
299035b53f8cSChandrakanth patil
299135b53f8cSChandrakanth patil softc->lpi_tmr_lo = le32toh(resp->tx_lpi_timer_low) &
299235b53f8cSChandrakanth patil HWRM_PORT_PHY_QCAPS_OUTPUT_TX_LPI_TIMER_LOW_MASK;
299335b53f8cSChandrakanth patil softc->lpi_tmr_hi = le32toh(resp->valid_tx_lpi_timer_high) &
299435b53f8cSChandrakanth patil HWRM_PORT_PHY_QCAPS_OUTPUT_TX_LPI_TIMER_HIGH_MASK;
299535b53f8cSChandrakanth patil }
299635b53f8cSChandrakanth patil
299735b53f8cSChandrakanth patil if (softc->hwrm_spec_code >= 0x10a01) {
299835b53f8cSChandrakanth patil if (bnxt_phy_qcaps_no_speed(resp)) {
299935b53f8cSChandrakanth patil link_info->phy_state = BNXT_PHY_STATE_DISABLED;
300035b53f8cSChandrakanth patil device_printf(softc->dev, "Ethernet link disabled\n");
300135b53f8cSChandrakanth patil } else if (link_info->phy_state == BNXT_PHY_STATE_DISABLED) {
300235b53f8cSChandrakanth patil link_info->phy_state = BNXT_PHY_STATE_ENABLED;
300335b53f8cSChandrakanth patil device_printf(softc->dev, "Ethernet link enabled\n");
300435b53f8cSChandrakanth patil /* Phy re-enabled, reprobe the speeds */
300535b53f8cSChandrakanth patil link_info->support_auto_speeds = 0;
300635b53f8cSChandrakanth patil link_info->support_pam4_auto_speeds = 0;
3007dac78335SSreekanth Reddy link_info->support_auto_speeds2 = 0;
300835b53f8cSChandrakanth patil }
300935b53f8cSChandrakanth patil }
301035b53f8cSChandrakanth patil if (resp->supported_speeds_auto_mode)
301135b53f8cSChandrakanth patil link_info->support_auto_speeds =
301235b53f8cSChandrakanth patil le16toh(resp->supported_speeds_auto_mode);
301335b53f8cSChandrakanth patil if (resp->supported_speeds_force_mode)
301435b53f8cSChandrakanth patil link_info->support_force_speeds =
301535b53f8cSChandrakanth patil le16toh(resp->supported_speeds_force_mode);
301635b53f8cSChandrakanth patil if (resp->supported_pam4_speeds_auto_mode)
301735b53f8cSChandrakanth patil link_info->support_pam4_auto_speeds =
301835b53f8cSChandrakanth patil le16toh(resp->supported_pam4_speeds_auto_mode);
301935b53f8cSChandrakanth patil if (resp->supported_pam4_speeds_force_mode)
302035b53f8cSChandrakanth patil link_info->support_pam4_force_speeds =
302135b53f8cSChandrakanth patil le16toh(resp->supported_pam4_speeds_force_mode);
302235b53f8cSChandrakanth patil
3023dac78335SSreekanth Reddy if (resp->supported_speeds2_auto_mode)
3024dac78335SSreekanth Reddy link_info->support_auto_speeds2 =
3025dac78335SSreekanth Reddy le16toh(resp->supported_speeds2_auto_mode);
3026dac78335SSreekanth Reddy
3027dac78335SSreekanth Reddy if (resp->supported_speeds2_force_mode)
3028dac78335SSreekanth Reddy link_info->support_force_speeds2 =
3029dac78335SSreekanth Reddy le16toh(resp->supported_speeds2_force_mode);
3030dac78335SSreekanth Reddy
303135b53f8cSChandrakanth patil exit:
303235b53f8cSChandrakanth patil BNXT_HWRM_UNLOCK(softc);
303335b53f8cSChandrakanth patil return rc;
303435b53f8cSChandrakanth patil }
303535b53f8cSChandrakanth patil
303635b53f8cSChandrakanth patil uint16_t
bnxt_hwrm_get_wol_fltrs(struct bnxt_softc * softc,uint16_t handle)303735b53f8cSChandrakanth patil bnxt_hwrm_get_wol_fltrs(struct bnxt_softc *softc, uint16_t handle)
303835b53f8cSChandrakanth patil {
303935b53f8cSChandrakanth patil struct hwrm_wol_filter_qcfg_input req = {0};
304035b53f8cSChandrakanth patil struct hwrm_wol_filter_qcfg_output *resp =
304135b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
304235b53f8cSChandrakanth patil uint16_t next_handle = 0;
304335b53f8cSChandrakanth patil int rc;
304435b53f8cSChandrakanth patil
304535b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_WOL_FILTER_QCFG);
304635b53f8cSChandrakanth patil req.port_id = htole16(softc->pf.port_id);
304735b53f8cSChandrakanth patil req.handle = htole16(handle);
304835b53f8cSChandrakanth patil rc = hwrm_send_message(softc, &req, sizeof(req));
304935b53f8cSChandrakanth patil if (!rc) {
305035b53f8cSChandrakanth patil next_handle = le16toh(resp->next_handle);
305135b53f8cSChandrakanth patil if (next_handle != 0) {
305235b53f8cSChandrakanth patil if (resp->wol_type ==
305335b53f8cSChandrakanth patil HWRM_WOL_FILTER_ALLOC_INPUT_WOL_TYPE_MAGICPKT) {
305435b53f8cSChandrakanth patil softc->wol = 1;
305535b53f8cSChandrakanth patil softc->wol_filter_id = resp->wol_filter_id;
305635b53f8cSChandrakanth patil }
305735b53f8cSChandrakanth patil }
305835b53f8cSChandrakanth patil }
305935b53f8cSChandrakanth patil return next_handle;
306035b53f8cSChandrakanth patil }
306135b53f8cSChandrakanth patil
306235b53f8cSChandrakanth patil int
bnxt_hwrm_alloc_wol_fltr(struct bnxt_softc * softc)306335b53f8cSChandrakanth patil bnxt_hwrm_alloc_wol_fltr(struct bnxt_softc *softc)
306435b53f8cSChandrakanth patil {
306535b53f8cSChandrakanth patil struct hwrm_wol_filter_alloc_input req = {0};
306635b53f8cSChandrakanth patil struct hwrm_wol_filter_alloc_output *resp =
306735b53f8cSChandrakanth patil (void *)softc->hwrm_cmd_resp.idi_vaddr;
306835b53f8cSChandrakanth patil int rc;
306935b53f8cSChandrakanth patil
307035b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_WOL_FILTER_ALLOC);
307135b53f8cSChandrakanth patil req.port_id = htole16(softc->pf.port_id);
307235b53f8cSChandrakanth patil req.wol_type = HWRM_WOL_FILTER_ALLOC_INPUT_WOL_TYPE_MAGICPKT;
307335b53f8cSChandrakanth patil req.enables =
307435b53f8cSChandrakanth patil htole32(HWRM_WOL_FILTER_ALLOC_INPUT_ENABLES_MAC_ADDRESS);
307535b53f8cSChandrakanth patil memcpy(req.mac_address, softc->func.mac_addr, ETHER_ADDR_LEN);
307635b53f8cSChandrakanth patil rc = hwrm_send_message(softc, &req, sizeof(req));
307735b53f8cSChandrakanth patil if (!rc)
307835b53f8cSChandrakanth patil softc->wol_filter_id = resp->wol_filter_id;
307935b53f8cSChandrakanth patil
308035b53f8cSChandrakanth patil return rc;
308135b53f8cSChandrakanth patil }
308235b53f8cSChandrakanth patil
308335b53f8cSChandrakanth patil int
bnxt_hwrm_free_wol_fltr(struct bnxt_softc * softc)308435b53f8cSChandrakanth patil bnxt_hwrm_free_wol_fltr(struct bnxt_softc *softc)
308535b53f8cSChandrakanth patil {
308635b53f8cSChandrakanth patil struct hwrm_wol_filter_free_input req = {0};
308735b53f8cSChandrakanth patil
308835b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_WOL_FILTER_FREE);
308935b53f8cSChandrakanth patil req.port_id = htole16(softc->pf.port_id);
309035b53f8cSChandrakanth patil req.enables =
309135b53f8cSChandrakanth patil htole32(HWRM_WOL_FILTER_FREE_INPUT_ENABLES_WOL_FILTER_ID);
309235b53f8cSChandrakanth patil req.wol_filter_id = softc->wol_filter_id;
309335b53f8cSChandrakanth patil return hwrm_send_message(softc, &req, sizeof(req));
309435b53f8cSChandrakanth patil }
309535b53f8cSChandrakanth patil
bnxt_hwrm_set_coal_params(struct bnxt_softc * softc,uint32_t max_frames,uint32_t buf_tmrs,uint16_t flags,struct hwrm_ring_cmpl_ring_cfg_aggint_params_input * req)309635b53f8cSChandrakanth patil static void bnxt_hwrm_set_coal_params(struct bnxt_softc *softc, uint32_t max_frames,
309735b53f8cSChandrakanth patil uint32_t buf_tmrs, uint16_t flags,
309835b53f8cSChandrakanth patil struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req)
309935b53f8cSChandrakanth patil {
310035b53f8cSChandrakanth patil req->flags = htole16(flags);
310135b53f8cSChandrakanth patil req->num_cmpl_dma_aggr = htole16((uint16_t)max_frames);
310235b53f8cSChandrakanth patil req->num_cmpl_dma_aggr_during_int = htole16(max_frames >> 16);
310335b53f8cSChandrakanth patil req->cmpl_aggr_dma_tmr = htole16((uint16_t)buf_tmrs);
310435b53f8cSChandrakanth patil req->cmpl_aggr_dma_tmr_during_int = htole16(buf_tmrs >> 16);
310535b53f8cSChandrakanth patil /* Minimum time between 2 interrupts set to buf_tmr x 2 */
310635b53f8cSChandrakanth patil req->int_lat_tmr_min = htole16((uint16_t)buf_tmrs * 2);
310735b53f8cSChandrakanth patil req->int_lat_tmr_max = htole16((uint16_t)buf_tmrs * 4);
310835b53f8cSChandrakanth patil req->num_cmpl_aggr_int = htole16((uint16_t)max_frames * 4);
310935b53f8cSChandrakanth patil }
311035b53f8cSChandrakanth patil
bnxt_hwrm_set_coal(struct bnxt_softc * softc)311135b53f8cSChandrakanth patil int bnxt_hwrm_set_coal(struct bnxt_softc *softc)
311235b53f8cSChandrakanth patil {
311335b53f8cSChandrakanth patil int i, rc = 0;
311435b53f8cSChandrakanth patil struct hwrm_ring_cmpl_ring_cfg_aggint_params_input req_rx = {0},
311535b53f8cSChandrakanth patil req_tx = {0}, *req;
311635b53f8cSChandrakanth patil uint16_t max_buf, max_buf_irq;
311735b53f8cSChandrakanth patil uint16_t buf_tmr, buf_tmr_irq;
311835b53f8cSChandrakanth patil uint32_t flags;
311935b53f8cSChandrakanth patil
312035b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req_rx,
312135b53f8cSChandrakanth patil HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS);
312235b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req_tx,
312335b53f8cSChandrakanth patil HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS);
312435b53f8cSChandrakanth patil
312535b53f8cSChandrakanth patil /* Each rx completion (2 records) should be DMAed immediately.
312635b53f8cSChandrakanth patil * DMA 1/4 of the completion buffers at a time.
312735b53f8cSChandrakanth patil */
312835b53f8cSChandrakanth patil max_buf = min_t(uint16_t, softc->rx_coal_frames / 4, 2);
312935b53f8cSChandrakanth patil /* max_buf must not be zero */
313035b53f8cSChandrakanth patil max_buf = clamp_t(uint16_t, max_buf, 1, 63);
313135b53f8cSChandrakanth patil max_buf_irq = clamp_t(uint16_t, softc->rx_coal_frames_irq, 1, 63);
313235b53f8cSChandrakanth patil buf_tmr = BNXT_USEC_TO_COAL_TIMER(softc->rx_coal_usecs);
313335b53f8cSChandrakanth patil /* buf timer set to 1/4 of interrupt timer */
313435b53f8cSChandrakanth patil buf_tmr = max_t(uint16_t, buf_tmr / 4, 1);
313535b53f8cSChandrakanth patil buf_tmr_irq = BNXT_USEC_TO_COAL_TIMER(softc->rx_coal_usecs_irq);
313635b53f8cSChandrakanth patil buf_tmr_irq = max_t(uint16_t, buf_tmr_irq, 1);
313735b53f8cSChandrakanth patil
313835b53f8cSChandrakanth patil flags = HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS_INPUT_FLAGS_TIMER_RESET;
313935b53f8cSChandrakanth patil
314035b53f8cSChandrakanth patil /* RING_IDLE generates more IRQs for lower latency. Enable it only
314135b53f8cSChandrakanth patil * if coal_usecs is less than 25 us.
314235b53f8cSChandrakanth patil */
314335b53f8cSChandrakanth patil if (softc->rx_coal_usecs < 25)
314435b53f8cSChandrakanth patil flags |= HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS_INPUT_FLAGS_RING_IDLE;
314535b53f8cSChandrakanth patil
314635b53f8cSChandrakanth patil bnxt_hwrm_set_coal_params(softc, max_buf_irq << 16 | max_buf,
314735b53f8cSChandrakanth patil buf_tmr_irq << 16 | buf_tmr, flags, &req_rx);
314835b53f8cSChandrakanth patil
314935b53f8cSChandrakanth patil /* max_buf must not be zero */
315035b53f8cSChandrakanth patil max_buf = clamp_t(uint16_t, softc->tx_coal_frames, 1, 63);
315135b53f8cSChandrakanth patil max_buf_irq = clamp_t(uint16_t, softc->tx_coal_frames_irq, 1, 63);
315235b53f8cSChandrakanth patil buf_tmr = BNXT_USEC_TO_COAL_TIMER(softc->tx_coal_usecs);
315335b53f8cSChandrakanth patil /* buf timer set to 1/4 of interrupt timer */
315435b53f8cSChandrakanth patil buf_tmr = max_t(uint16_t, buf_tmr / 4, 1);
315535b53f8cSChandrakanth patil buf_tmr_irq = BNXT_USEC_TO_COAL_TIMER(softc->tx_coal_usecs_irq);
315635b53f8cSChandrakanth patil buf_tmr_irq = max_t(uint16_t, buf_tmr_irq, 1);
315735b53f8cSChandrakanth patil flags = HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS_INPUT_FLAGS_TIMER_RESET;
315835b53f8cSChandrakanth patil bnxt_hwrm_set_coal_params(softc, max_buf_irq << 16 | max_buf,
315935b53f8cSChandrakanth patil buf_tmr_irq << 16 | buf_tmr, flags, &req_tx);
316035b53f8cSChandrakanth patil
316135b53f8cSChandrakanth patil for (i = 0; i < softc->nrxqsets; i++) {
316235b53f8cSChandrakanth patil
316335b53f8cSChandrakanth patil req = &req_rx;
316435b53f8cSChandrakanth patil req->ring_id = htole16(softc->grp_info[i].cp_ring_id);
316535b53f8cSChandrakanth patil
316635b53f8cSChandrakanth patil rc = hwrm_send_message(softc, req, sizeof(*req));
316735b53f8cSChandrakanth patil if (rc)
316835b53f8cSChandrakanth patil break;
316935b53f8cSChandrakanth patil }
317035b53f8cSChandrakanth patil return rc;
317135b53f8cSChandrakanth patil }
317235b53f8cSChandrakanth patil
bnxt_hwrm_ring_info_get(struct bnxt_softc * softc,uint8_t ring_type,uint32_t ring_id,uint32_t * prod,uint32_t * cons)317335b53f8cSChandrakanth patil void bnxt_hwrm_ring_info_get(struct bnxt_softc *softc, uint8_t ring_type,
317435b53f8cSChandrakanth patil uint32_t ring_id, uint32_t *prod, uint32_t *cons)
317535b53f8cSChandrakanth patil {
317635b53f8cSChandrakanth patil hwrm_dbg_ring_info_get_input_t req = {0};
317735b53f8cSChandrakanth patil hwrm_dbg_ring_info_get_output_t *resp = (void *)softc->hwrm_cmd_resp.idi_vaddr;
317835b53f8cSChandrakanth patil int rc = 0;
317935b53f8cSChandrakanth patil
318035b53f8cSChandrakanth patil *prod = *cons = 0xffffffff;
318135b53f8cSChandrakanth patil bnxt_hwrm_cmd_hdr_init(softc, &req, HWRM_DBG_RING_INFO_GET);
318235b53f8cSChandrakanth patil req.ring_type = le32toh(ring_type);
318335b53f8cSChandrakanth patil req.fw_ring_id = le32toh(ring_id);
318435b53f8cSChandrakanth patil rc = hwrm_send_message(softc, &req, sizeof(req));
318535b53f8cSChandrakanth patil if (!rc) {
318635b53f8cSChandrakanth patil *prod = resp->producer_index;
318735b53f8cSChandrakanth patil *cons = resp->consumer_index;
318835b53f8cSChandrakanth patil }
318935b53f8cSChandrakanth patil
319035b53f8cSChandrakanth patil return;
319135b53f8cSChandrakanth patil }
3192