Deleted Added
full compact
oce_mbox.c (331722) oce_mbox.c (338938)
1/*-
2 * Copyright (C) 2013 Emulex
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,

--- 22 unchanged lines hidden (view full) ---

31 * Contact Information:
32 * freebsd-drivers@emulex.com
33 *
34 * Emulex
35 * 3333 Susan Street
36 * Costa Mesa, CA 92626
37 */
38
1/*-
2 * Copyright (C) 2013 Emulex
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,

--- 22 unchanged lines hidden (view full) ---

31 * Contact Information:
32 * freebsd-drivers@emulex.com
33 *
34 * Emulex
35 * 3333 Susan Street
36 * Costa Mesa, CA 92626
37 */
38
39/* $FreeBSD: stable/11/sys/dev/oce/oce_mbox.c 331722 2018-03-29 02:50:57Z eadler $ */
39/* $FreeBSD: stable/11/sys/dev/oce/oce_mbox.c 338938 2018-09-25 23:48:43Z jpaetzel $ */
40
41#include "oce_if.h"
42extern uint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE];
43
44/**
45 * @brief Reset (firmware) common function
46 * @param sc software handle to the device
47 * @returns 0 on success, ETIMEDOUT on failure

--- 442 unchanged lines hidden (view full) ---

490 }
491
492 DW_SWAP(u32ptr(fwcmd), sizeof(struct mbx_common_query_fw_config));
493
494 sc->config_number = HOST_32(fwcmd->params.rsp.config_number);
495 sc->asic_revision = HOST_32(fwcmd->params.rsp.asic_revision);
496 sc->port_id = HOST_32(fwcmd->params.rsp.port_id);
497 sc->function_mode = HOST_32(fwcmd->params.rsp.function_mode);
40
41#include "oce_if.h"
42extern uint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE];
43
44/**
45 * @brief Reset (firmware) common function
46 * @param sc software handle to the device
47 * @returns 0 on success, ETIMEDOUT on failure

--- 442 unchanged lines hidden (view full) ---

490 }
491
492 DW_SWAP(u32ptr(fwcmd), sizeof(struct mbx_common_query_fw_config));
493
494 sc->config_number = HOST_32(fwcmd->params.rsp.config_number);
495 sc->asic_revision = HOST_32(fwcmd->params.rsp.asic_revision);
496 sc->port_id = HOST_32(fwcmd->params.rsp.port_id);
497 sc->function_mode = HOST_32(fwcmd->params.rsp.function_mode);
498 if ((sc->function_mode & (ULP_NIC_MODE | ULP_RDMA_MODE)) ==
499 (ULP_NIC_MODE | ULP_RDMA_MODE)) {
500 sc->rdma_flags = OCE_RDMA_FLAG_SUPPORTED;
501 }
498 sc->function_caps = HOST_32(fwcmd->params.rsp.function_caps);
499
500 if (fwcmd->params.rsp.ulp[0].ulp_mode & ULP_NIC_MODE) {
501 sc->max_tx_rings = HOST_32(fwcmd->params.rsp.ulp[0].nic_wq_tot);
502 sc->max_rx_rings = HOST_32(fwcmd->params.rsp.ulp[0].lro_rqid_tot);
503 } else {
504 sc->max_tx_rings = HOST_32(fwcmd->params.rsp.ulp[1].nic_wq_tot);
505 sc->max_rx_rings = HOST_32(fwcmd->params.rsp.ulp[1].lro_rqid_tot);

--- 256 unchanged lines hidden (view full) ---

762 if (i == 0) {
763 device_printf(sc->dev, "error: Invalid number of RSS RQ's\n");
764 rc = ENXIO;
765
766 }
767
768 /* fill log2 value indicating the size of the CPU table */
769 if (rc == 0)
502 sc->function_caps = HOST_32(fwcmd->params.rsp.function_caps);
503
504 if (fwcmd->params.rsp.ulp[0].ulp_mode & ULP_NIC_MODE) {
505 sc->max_tx_rings = HOST_32(fwcmd->params.rsp.ulp[0].nic_wq_tot);
506 sc->max_rx_rings = HOST_32(fwcmd->params.rsp.ulp[0].lro_rqid_tot);
507 } else {
508 sc->max_tx_rings = HOST_32(fwcmd->params.rsp.ulp[1].nic_wq_tot);
509 sc->max_rx_rings = HOST_32(fwcmd->params.rsp.ulp[1].lro_rqid_tot);

--- 256 unchanged lines hidden (view full) ---

766 if (i == 0) {
767 device_printf(sc->dev, "error: Invalid number of RSS RQ's\n");
768 rc = ENXIO;
769
770 }
771
772 /* fill log2 value indicating the size of the CPU table */
773 if (rc == 0)
770 fwcmd->params.req.cpu_tbl_sz_log2 = LE_16(OCE_LOG2(i));
774 fwcmd->params.req.cpu_tbl_sz_log2 = LE_16(OCE_LOG2(INDIRECTION_TABLE_ENTRIES));
771
772 return rc;
773}
774
775/**
776 * @brief Function to set flow control capability in the hardware
777 * @param sc software handle to the device
778 * @param if_id interface id to read the address from

--- 24 unchanged lines hidden (view full) ---

803 MBX_TIMEOUT_SEC,
804 sizeof(struct mbx_config_nic_rss),
805 version);
806 if (enable_rss)
807 fwcmd->params.req.enable_rss |= (RSS_ENABLE_IPV4 |
808 RSS_ENABLE_TCP_IPV4 |
809 RSS_ENABLE_IPV6 |
810 RSS_ENABLE_TCP_IPV6);
775
776 return rc;
777}
778
779/**
780 * @brief Function to set flow control capability in the hardware
781 * @param sc software handle to the device
782 * @param if_id interface id to read the address from

--- 24 unchanged lines hidden (view full) ---

807 MBX_TIMEOUT_SEC,
808 sizeof(struct mbx_config_nic_rss),
809 version);
810 if (enable_rss)
811 fwcmd->params.req.enable_rss |= (RSS_ENABLE_IPV4 |
812 RSS_ENABLE_TCP_IPV4 |
813 RSS_ENABLE_IPV6 |
814 RSS_ENABLE_TCP_IPV6);
811 fwcmd->params.req.flush = OCE_FLUSH;
815
816 if(!sc->enable_hwlro)
817 fwcmd->params.req.flush = OCE_FLUSH;
818 else
819 fwcmd->params.req.flush = 0;
820
812 fwcmd->params.req.if_id = LE_32(if_id);
813
821 fwcmd->params.req.if_id = LE_32(if_id);
822
823 srandom(arc4random()); /* random entropy seed */
814 read_random(fwcmd->params.req.hash, sizeof(fwcmd->params.req.hash));
815
816 rc = oce_rss_itbl_init(sc, fwcmd);
817 if (rc == 0) {
818 mbx.u0.s.embedded = 1;
819 mbx.payload_length = sizeof(struct mbx_config_nic_rss);
820 DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
821

--- 37 unchanged lines hidden (view full) ---

859 req = &fwcmd->params.req;
860 req->iface_flags_mask = MBX_RX_IFACE_FLAGS_PROMISCUOUS |
861 MBX_RX_IFACE_FLAGS_VLAN_PROMISCUOUS;
862 /* Bit 0 Mac promisc, Bit 1 Vlan promisc */
863 if (enable & 0x01)
864 req->iface_flags = MBX_RX_IFACE_FLAGS_PROMISCUOUS;
865
866 if (enable & 0x02)
824 read_random(fwcmd->params.req.hash, sizeof(fwcmd->params.req.hash));
825
826 rc = oce_rss_itbl_init(sc, fwcmd);
827 if (rc == 0) {
828 mbx.u0.s.embedded = 1;
829 mbx.payload_length = sizeof(struct mbx_config_nic_rss);
830 DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
831

--- 37 unchanged lines hidden (view full) ---

869 req = &fwcmd->params.req;
870 req->iface_flags_mask = MBX_RX_IFACE_FLAGS_PROMISCUOUS |
871 MBX_RX_IFACE_FLAGS_VLAN_PROMISCUOUS;
872 /* Bit 0 Mac promisc, Bit 1 Vlan promisc */
873 if (enable & 0x01)
874 req->iface_flags = MBX_RX_IFACE_FLAGS_PROMISCUOUS;
875
876 if (enable & 0x02)
867 req->iface_flags = MBX_RX_IFACE_FLAGS_VLAN_PROMISCUOUS;
877 req->iface_flags |= MBX_RX_IFACE_FLAGS_VLAN_PROMISCUOUS;
868
869 req->if_id = sc->if_id;
870
871 rc = oce_set_common_iface_rx_filter(sc, &sgl);
872 oce_dma_free(sc, &sgl);
873
874 return rc;
875}

--- 87 unchanged lines hidden (view full) ---

963 link->qos_link_speed = HOST_16(fwcmd->params.rsp.qos_link_speed);
964 link->phys_port_speed = fwcmd->params.rsp.physical_port_speed;
965 link->logical_link_status = fwcmd->params.rsp.logical_link_status;
966error:
967 return rc;
968}
969
970
878
879 req->if_id = sc->if_id;
880
881 rc = oce_set_common_iface_rx_filter(sc, &sgl);
882 oce_dma_free(sc, &sgl);
883
884 return rc;
885}

--- 87 unchanged lines hidden (view full) ---

973 link->qos_link_speed = HOST_16(fwcmd->params.rsp.qos_link_speed);
974 link->phys_port_speed = fwcmd->params.rsp.physical_port_speed;
975 link->logical_link_status = fwcmd->params.rsp.logical_link_status;
976error:
977 return rc;
978}
979
980
971
972int
973oce_mbox_get_nic_stats_v0(POCE_SOFTC sc, POCE_DMA_MEM pstats_dma_mem)
974{
975 struct oce_mbx mbx;
976 struct mbx_get_nic_stats_v0 *fwcmd;
977 int rc = 0;
978
979 bzero(&mbx, sizeof(struct oce_mbx));
980
981 fwcmd = OCE_DMAPTR(pstats_dma_mem, struct mbx_get_nic_stats_v0);
982 bzero(fwcmd, sizeof(struct mbx_get_nic_stats_v0));
983
984 mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
985 MBX_SUBSYSTEM_NIC,
986 NIC_GET_STATS,
987 MBX_TIMEOUT_SEC,
988 sizeof(struct mbx_get_nic_stats_v0),
989 OCE_MBX_VER_V0);
990
991 mbx.u0.s.embedded = 0;
992 mbx.u0.s.sge_count = 1;
993
994 oce_dma_sync(pstats_dma_mem, BUS_DMASYNC_PREWRITE);
995
996 mbx.payload.u0.u1.sgl[0].pa_lo = ADDR_LO(pstats_dma_mem->paddr);
997 mbx.payload.u0.u1.sgl[0].pa_hi = ADDR_HI(pstats_dma_mem->paddr);
998 mbx.payload.u0.u1.sgl[0].length = sizeof(struct mbx_get_nic_stats_v0);
999
1000 mbx.payload_length = sizeof(struct mbx_get_nic_stats_v0);
1001
1002 DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
1003
1004 rc = oce_mbox_post(sc, &mbx, NULL);
1005
1006 oce_dma_sync(pstats_dma_mem, BUS_DMASYNC_POSTWRITE);
1007
1008 if (!rc)
1009 rc = fwcmd->hdr.u0.rsp.status;
1010 if (rc)
1011 device_printf(sc->dev,
1012 "%s failed - cmd status: %d addi status: %d\n",
1013 __FUNCTION__, rc,
1014 fwcmd->hdr.u0.rsp.additional_status);
1015 return rc;
1016}
1017
1018
1019
1020/**
1021 * @brief Function to get NIC statistics
981/**
982 * @brief Function to get NIC statistics
1022 * @param sc software handle to the device
1023 * @param *stats pointer to where to store statistics
1024 * @param reset_stats resets statistics of set
1025 * @returns 0 on success, EIO on failure
1026 * @note command depricated in Lancer
983 * @param sc software handle to the device
984 * @param *stats pointer to where to store statistics
985 * @param reset_stats resets statistics of set
986 * @returns 0 on success, EIO on failure
987 * @note command depricated in Lancer
1027 */
988 */
1028int
1029oce_mbox_get_nic_stats(POCE_SOFTC sc, POCE_DMA_MEM pstats_dma_mem)
1030{
1031 struct oce_mbx mbx;
1032 struct mbx_get_nic_stats *fwcmd;
1033 int rc = 0;
1034
1035 bzero(&mbx, sizeof(struct oce_mbx));
1036 fwcmd = OCE_DMAPTR(pstats_dma_mem, struct mbx_get_nic_stats);
1037 bzero(fwcmd, sizeof(struct mbx_get_nic_stats));
1038
1039 mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
1040 MBX_SUBSYSTEM_NIC,
1041 NIC_GET_STATS,
1042 MBX_TIMEOUT_SEC,
1043 sizeof(struct mbx_get_nic_stats),
1044 OCE_MBX_VER_V1);
1045
1046
1047 mbx.u0.s.embedded = 0; /* stats too large for embedded mbx rsp */
1048 mbx.u0.s.sge_count = 1; /* using scatter gather instead */
1049
1050 oce_dma_sync(pstats_dma_mem, BUS_DMASYNC_PREWRITE);
1051 mbx.payload.u0.u1.sgl[0].pa_lo = ADDR_LO(pstats_dma_mem->paddr);
1052 mbx.payload.u0.u1.sgl[0].pa_hi = ADDR_HI(pstats_dma_mem->paddr);
1053 mbx.payload.u0.u1.sgl[0].length = sizeof(struct mbx_get_nic_stats);
1054
1055 mbx.payload_length = sizeof(struct mbx_get_nic_stats);
1056 DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ);
1057
1058 rc = oce_mbox_post(sc, &mbx, NULL);
1059 oce_dma_sync(pstats_dma_mem, BUS_DMASYNC_POSTWRITE);
1060 if (!rc)
1061 rc = fwcmd->hdr.u0.rsp.status;
1062 if (rc)
1063 device_printf(sc->dev,
1064 "%s failed - cmd status: %d addi status: %d\n",
1065 __FUNCTION__, rc,
1066 fwcmd->hdr.u0.rsp.additional_status);
1067 return rc;
989#define OCE_MBOX_GET_NIC_STATS(sc, pstats_dma_mem, version) \
990int \
991oce_mbox_get_nic_stats_v##version(POCE_SOFTC sc, POCE_DMA_MEM pstats_dma_mem) \
992{ \
993 struct oce_mbx mbx; \
994 struct mbx_get_nic_stats_v##version *fwcmd; \
995 int rc = 0; \
996 \
997 bzero(&mbx, sizeof(struct oce_mbx)); \
998 fwcmd = OCE_DMAPTR(pstats_dma_mem, struct mbx_get_nic_stats_v##version); \
999 bzero(fwcmd, sizeof(*fwcmd)); \
1000 \
1001 mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0, \
1002 MBX_SUBSYSTEM_NIC, \
1003 NIC_GET_STATS, \
1004 MBX_TIMEOUT_SEC, \
1005 sizeof(*fwcmd), \
1006 OCE_MBX_VER_V##version); \
1007 \
1008 mbx.u0.s.embedded = 0; /* stats too large for embedded mbx rsp */ \
1009 mbx.u0.s.sge_count = 1; /* using scatter gather instead */ \
1010 \
1011 oce_dma_sync(pstats_dma_mem, BUS_DMASYNC_PREWRITE); \
1012 mbx.payload.u0.u1.sgl[0].pa_lo = ADDR_LO(pstats_dma_mem->paddr); \
1013 mbx.payload.u0.u1.sgl[0].pa_hi = ADDR_HI(pstats_dma_mem->paddr); \
1014 mbx.payload.u0.u1.sgl[0].length = sizeof(*fwcmd); \
1015 mbx.payload_length = sizeof(*fwcmd); \
1016 DW_SWAP(u32ptr(&mbx), mbx.payload_length + OCE_BMBX_RHDR_SZ); \
1017 \
1018 rc = oce_mbox_post(sc, &mbx, NULL); \
1019 oce_dma_sync(pstats_dma_mem, BUS_DMASYNC_POSTWRITE); \
1020 if (!rc) \
1021 rc = fwcmd->hdr.u0.rsp.status; \
1022 if (rc) \
1023 device_printf(sc->dev, \
1024 "%s failed - cmd status: %d addi status: %d\n", \
1025 __FUNCTION__, rc, \
1026 fwcmd->hdr.u0.rsp.additional_status); \
1027 return rc; \
1068}
1069
1028}
1029
1030OCE_MBOX_GET_NIC_STATS(sc, pstats_dma_mem, 0);
1031OCE_MBOX_GET_NIC_STATS(sc, pstats_dma_mem, 1);
1032OCE_MBOX_GET_NIC_STATS(sc, pstats_dma_mem, 2);
1070
1033
1034
1071/**
1072 * @brief Function to get pport (physical port) statistics
1073 * @param sc software handle to the device
1074 * @param *stats pointer to where to store statistics
1075 * @param reset_stats resets statistics of set
1076 * @returns 0 on success, EIO on failure
1077 */
1078int

--- 1136 unchanged lines hidden (view full) ---

2215 sc->nrssqs = max_rss;
2216 sc->nrqs = sc->nrssqs + 1; /* 1 for def RX */
2217 }
2218error:
2219 oce_dma_free(sc, &dma);
2220 return rc;
2221
2222}
1035/**
1036 * @brief Function to get pport (physical port) statistics
1037 * @param sc software handle to the device
1038 * @param *stats pointer to where to store statistics
1039 * @param reset_stats resets statistics of set
1040 * @returns 0 on success, EIO on failure
1041 */
1042int

--- 1136 unchanged lines hidden (view full) ---

2179 sc->nrssqs = max_rss;
2180 sc->nrqs = sc->nrssqs + 1; /* 1 for def RX */
2181 }
2182error:
2183 oce_dma_free(sc, &dma);
2184 return rc;
2185
2186}
2187
2188/* hw lro functions */
2189
2190int
2191oce_mbox_nic_query_lro_capabilities(POCE_SOFTC sc, uint32_t *lro_rq_cnt, uint32_t *lro_flags)
2192{
2193 struct oce_mbx mbx;
2194 struct mbx_nic_query_lro_capabilities *fwcmd;
2195 int rc = 0;
2196
2197 bzero(&mbx, sizeof(struct oce_mbx));
2198
2199 fwcmd = (struct mbx_nic_query_lro_capabilities *)&mbx.payload;
2200 mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
2201 MBX_SUBSYSTEM_NIC,
2202 0x20,MBX_TIMEOUT_SEC,
2203 sizeof(struct mbx_nic_query_lro_capabilities),
2204 OCE_MBX_VER_V0);
2205
2206 mbx.u0.s.embedded = 1;
2207 mbx.payload_length = sizeof(struct mbx_nic_query_lro_capabilities);
2208
2209 rc = oce_mbox_post(sc, &mbx, NULL);
2210 if (!rc)
2211 rc = fwcmd->hdr.u0.rsp.status;
2212 if (rc) {
2213 device_printf(sc->dev,
2214 "%s failed - cmd status: %d addi status: %d\n",
2215 __FUNCTION__, rc,
2216 fwcmd->hdr.u0.rsp.additional_status);
2217
2218 return rc;
2219 }
2220 if(lro_flags)
2221 *lro_flags = HOST_32(fwcmd->params.rsp.lro_flags);
2222
2223 if(lro_rq_cnt)
2224 *lro_rq_cnt = HOST_16(fwcmd->params.rsp.lro_rq_cnt);
2225
2226 return rc;
2227}
2228
2229int
2230oce_mbox_nic_set_iface_lro_config(POCE_SOFTC sc, int enable)
2231{
2232 struct oce_mbx mbx;
2233 struct mbx_nic_set_iface_lro_config *fwcmd;
2234 int rc = 0;
2235
2236 bzero(&mbx, sizeof(struct oce_mbx));
2237
2238 fwcmd = (struct mbx_nic_set_iface_lro_config *)&mbx.payload;
2239 mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
2240 MBX_SUBSYSTEM_NIC,
2241 0x26,MBX_TIMEOUT_SEC,
2242 sizeof(struct mbx_nic_set_iface_lro_config),
2243 OCE_MBX_VER_V0);
2244
2245 mbx.u0.s.embedded = 1;
2246 mbx.payload_length = sizeof(struct mbx_nic_set_iface_lro_config);
2247
2248 fwcmd->params.req.iface_id = sc->if_id;
2249 fwcmd->params.req.lro_flags = 0;
2250
2251 if(enable) {
2252 fwcmd->params.req.lro_flags = LRO_FLAGS_HASH_MODE | LRO_FLAGS_RSS_MODE;
2253 fwcmd->params.req.lro_flags |= LRO_FLAGS_CLSC_IPV4 | LRO_FLAGS_CLSC_IPV6;
2254
2255 fwcmd->params.req.max_clsc_byte_cnt = 64*1024; /* min = 2974, max = 0xfa59 */
2256 fwcmd->params.req.max_clsc_seg_cnt = 43; /* min = 2, max = 64 */
2257 fwcmd->params.req.max_clsc_usec_delay = 18; /* min = 1, max = 256 */
2258 fwcmd->params.req.min_clsc_frame_byte_cnt = 0; /* min = 1, max = 9014 */
2259 }
2260
2261 rc = oce_mbox_post(sc, &mbx, NULL);
2262 if (!rc)
2263 rc = fwcmd->hdr.u0.rsp.status;
2264 if (rc) {
2265 device_printf(sc->dev,
2266 "%s failed - cmd status: %d addi status: %d\n",
2267 __FUNCTION__, rc,
2268 fwcmd->hdr.u0.rsp.additional_status);
2269
2270 return rc;
2271 }
2272 return rc;
2273}
2274
2275int
2276oce_mbox_create_rq_v2(struct oce_rq *rq)
2277{
2278 struct oce_mbx mbx;
2279 struct mbx_create_nic_rq_v2 *fwcmd;
2280 POCE_SOFTC sc = rq->parent;
2281 int rc = 0, num_pages = 0;
2282
2283 if (rq->qstate == QCREATED)
2284 return 0;
2285
2286 bzero(&mbx, sizeof(struct oce_mbx));
2287
2288 fwcmd = (struct mbx_create_nic_rq_v2 *)&mbx.payload;
2289 mbx_common_req_hdr_init(&fwcmd->hdr, 0, 0,
2290 MBX_SUBSYSTEM_NIC,
2291 0x08, MBX_TIMEOUT_SEC,
2292 sizeof(struct mbx_create_nic_rq_v2),
2293 OCE_MBX_VER_V2);
2294
2295 /* oce_page_list will also prepare pages */
2296 num_pages = oce_page_list(rq->ring, &fwcmd->params.req.pages[0]);
2297
2298 fwcmd->params.req.cq_id = rq->cq->cq_id;
2299 fwcmd->params.req.frag_size = rq->cfg.frag_size/2048;
2300 fwcmd->params.req.num_pages = num_pages;
2301
2302 fwcmd->params.req.if_id = sc->if_id;
2303
2304 fwcmd->params.req.max_frame_size = rq->cfg.mtu;
2305 fwcmd->params.req.page_size = 1;
2306 if(rq->cfg.is_rss_queue) {
2307 fwcmd->params.req.rq_flags = (NIC_RQ_FLAGS_RSS | NIC_RQ_FLAGS_LRO);
2308 }else {
2309 device_printf(sc->dev,
2310 "non rss lro queue should not be created \n");
2311 goto error;
2312 }
2313 mbx.u0.s.embedded = 1;
2314 mbx.payload_length = sizeof(struct mbx_create_nic_rq_v2);
2315
2316 rc = oce_mbox_post(sc, &mbx, NULL);
2317 if (!rc)
2318 rc = fwcmd->hdr.u0.rsp.status;
2319 if (rc) {
2320 device_printf(sc->dev,
2321 "%s failed - cmd status: %d addi status: %d\n",
2322 __FUNCTION__, rc,
2323 fwcmd->hdr.u0.rsp.additional_status);
2324 goto error;
2325 }
2326 rq->rq_id = HOST_16(fwcmd->params.rsp.rq_id);
2327 rq->rss_cpuid = fwcmd->params.rsp.rss_cpuid;
2328
2329error:
2330 return rc;
2331}
2332