The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/qlnx/qlnxe/ecore_mng_tlv.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 2018-2019 Cavium, Inc.
    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
    7  *  are met:
    8  *
    9  *  1. Redistributions of source code must retain the above copyright
   10  *     notice, this list of conditions and the following disclaimer.
   11  *  2. Redistributions in binary form must reproduce the above copyright
   12  *     notice, this list of conditions and the following disclaimer in the
   13  *     documentation and/or other materials provided with the distribution.
   14  *
   15  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   16  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   17  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   18  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
   19  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   20  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   21  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   22  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   23  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   24  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   25  *  POSSIBILITY OF SUCH DAMAGE.
   26  */
   27 
   28 #include <sys/cdefs.h>
   29 __FBSDID("$FreeBSD$");
   30 
   31 #include "bcm_osal.h"
   32 #include "ecore.h"
   33 #include "ecore_status.h"
   34 #include "ecore_mcp.h"
   35 #include "ecore_hw.h"
   36 #include "reg_addr.h"
   37 
   38 #define TLV_TYPE(p)     (p[0])
   39 #define TLV_LENGTH(p)   (p[1])
   40 #define TLV_FLAGS(p)    (p[3])
   41 
   42 #define ECORE_TLV_DATA_MAX (14)
   43 struct ecore_tlv_parsed_buf {
   44         /* To be filled with the address to set in Value field */
   45         u8 *p_val;
   46 
   47         /* To be used internally in case the value has to be modified */
   48         u8 data[ECORE_TLV_DATA_MAX];
   49 };
   50 
   51 static enum _ecore_status_t
   52 ecore_mfw_get_tlv_group(u8 tlv_type, u8 *tlv_group)
   53 {
   54         switch(tlv_type) {
   55         case DRV_TLV_FEATURE_FLAGS:
   56         case DRV_TLV_LOCAL_ADMIN_ADDR:
   57         case DRV_TLV_ADDITIONAL_MAC_ADDR_1:
   58         case DRV_TLV_ADDITIONAL_MAC_ADDR_2:
   59         case DRV_TLV_OS_DRIVER_STATES:
   60         case DRV_TLV_PXE_BOOT_PROGRESS:
   61         case DRV_TLV_RX_FRAMES_RECEIVED:
   62         case DRV_TLV_RX_BYTES_RECEIVED:
   63         case DRV_TLV_TX_FRAMES_SENT:
   64         case DRV_TLV_TX_BYTES_SENT:
   65         case DRV_TLV_NPIV_ENABLED:
   66         case DRV_TLV_PCIE_BUS_RX_UTILIZATION:
   67         case DRV_TLV_PCIE_BUS_TX_UTILIZATION:
   68         case DRV_TLV_DEVICE_CPU_CORES_UTILIZATION:
   69         case DRV_TLV_LAST_VALID_DCC_TLV_RECEIVED:
   70         case DRV_TLV_NCSI_RX_BYTES_RECEIVED:
   71     case DRV_TLV_NCSI_TX_BYTES_SENT:
   72                 *tlv_group |= ECORE_MFW_TLV_GENERIC;
   73                 break;
   74         case DRV_TLV_LSO_MAX_OFFLOAD_SIZE:
   75         case DRV_TLV_LSO_MIN_SEGMENT_COUNT:
   76         case DRV_TLV_PROMISCUOUS_MODE:
   77         case DRV_TLV_TX_DESCRIPTORS_QUEUE_SIZE:
   78         case DRV_TLV_RX_DESCRIPTORS_QUEUE_SIZE:
   79         case DRV_TLV_NUM_OF_NET_QUEUE_VMQ_CFG:
   80         case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV4:
   81         case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV6:
   82         case DRV_TLV_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
   83         case DRV_TLV_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
   84         case DRV_TLV_IOV_OFFLOAD:
   85         case DRV_TLV_TX_QUEUES_EMPTY:
   86         case DRV_TLV_RX_QUEUES_EMPTY:
   87         case DRV_TLV_TX_QUEUES_FULL:
   88         case DRV_TLV_RX_QUEUES_FULL:
   89                 *tlv_group |= ECORE_MFW_TLV_ETH;
   90                 break;
   91         case DRV_TLV_SCSI_TO:
   92         case DRV_TLV_R_T_TOV:
   93         case DRV_TLV_R_A_TOV:
   94         case DRV_TLV_E_D_TOV:
   95         case DRV_TLV_CR_TOV:
   96         case DRV_TLV_BOOT_TYPE:
   97         case DRV_TLV_NPIV_STATE:
   98         case DRV_TLV_NUM_OF_NPIV_IDS:
   99         case DRV_TLV_SWITCH_NAME:
  100         case DRV_TLV_SWITCH_PORT_NUM:
  101         case DRV_TLV_SWITCH_PORT_ID:
  102         case DRV_TLV_VENDOR_NAME:
  103         case DRV_TLV_SWITCH_MODEL:
  104         case DRV_TLV_SWITCH_FW_VER:
  105         case DRV_TLV_QOS_PRIORITY_PER_802_1P:
  106         case DRV_TLV_PORT_ALIAS:
  107         case DRV_TLV_PORT_STATE:
  108         case DRV_TLV_FIP_TX_DESCRIPTORS_QUEUE_SIZE:
  109         case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_SIZE:
  110         case DRV_TLV_LINK_FAILURE_COUNT:
  111         case DRV_TLV_FCOE_BOOT_PROGRESS:
  112         case DRV_TLV_RX_BROADCAST_PACKETS:
  113         case DRV_TLV_TX_BROADCAST_PACKETS:
  114         case DRV_TLV_FCOE_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
  115         case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
  116         case DRV_TLV_FCOE_RX_FRAMES_RECEIVED:
  117         case DRV_TLV_FCOE_RX_BYTES_RECEIVED:
  118         case DRV_TLV_FCOE_TX_FRAMES_SENT:
  119         case DRV_TLV_FCOE_TX_BYTES_SENT:
  120         case DRV_TLV_CRC_ERROR_COUNT:
  121         case DRV_TLV_CRC_ERROR_1_RECEIVED_SOURCE_FC_ID:
  122         case DRV_TLV_CRC_ERROR_1_TIMESTAMP:
  123         case DRV_TLV_CRC_ERROR_2_RECEIVED_SOURCE_FC_ID:
  124         case DRV_TLV_CRC_ERROR_2_TIMESTAMP:
  125         case DRV_TLV_CRC_ERROR_3_RECEIVED_SOURCE_FC_ID:
  126         case DRV_TLV_CRC_ERROR_3_TIMESTAMP:
  127         case DRV_TLV_CRC_ERROR_4_RECEIVED_SOURCE_FC_ID:
  128         case DRV_TLV_CRC_ERROR_4_TIMESTAMP:
  129         case DRV_TLV_CRC_ERROR_5_RECEIVED_SOURCE_FC_ID:
  130         case DRV_TLV_CRC_ERROR_5_TIMESTAMP:
  131         case DRV_TLV_LOSS_OF_SYNC_ERROR_COUNT:
  132         case DRV_TLV_LOSS_OF_SIGNAL_ERRORS:
  133         case DRV_TLV_PRIMITIVE_SEQUENCE_PROTOCOL_ERROR_COUNT:
  134         case DRV_TLV_DISPARITY_ERROR_COUNT:
  135         case DRV_TLV_CODE_VIOLATION_ERROR_COUNT:
  136         case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_1:
  137         case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_2:
  138         case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_3:
  139         case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_4:
  140         case DRV_TLV_LAST_FLOGI_TIMESTAMP:
  141         case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_1:
  142         case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_2:
  143         case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_3:
  144         case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_4:
  145         case DRV_TLV_LAST_FLOGI_ACC_TIMESTAMP:
  146         case DRV_TLV_LAST_FLOGI_RJT:
  147         case DRV_TLV_LAST_FLOGI_RJT_TIMESTAMP:
  148         case DRV_TLV_FDISCS_SENT_COUNT:
  149         case DRV_TLV_FDISC_ACCS_RECEIVED:
  150         case DRV_TLV_FDISC_RJTS_RECEIVED:
  151         case DRV_TLV_PLOGI_SENT_COUNT:
  152         case DRV_TLV_PLOGI_ACCS_RECEIVED:
  153         case DRV_TLV_PLOGI_RJTS_RECEIVED:
  154         case DRV_TLV_PLOGI_1_SENT_DESTINATION_FC_ID:
  155         case DRV_TLV_PLOGI_1_TIMESTAMP:
  156         case DRV_TLV_PLOGI_2_SENT_DESTINATION_FC_ID:
  157         case DRV_TLV_PLOGI_2_TIMESTAMP:
  158         case DRV_TLV_PLOGI_3_SENT_DESTINATION_FC_ID:
  159         case DRV_TLV_PLOGI_3_TIMESTAMP:
  160         case DRV_TLV_PLOGI_4_SENT_DESTINATION_FC_ID:
  161         case DRV_TLV_PLOGI_4_TIMESTAMP:
  162         case DRV_TLV_PLOGI_5_SENT_DESTINATION_FC_ID:
  163         case DRV_TLV_PLOGI_5_TIMESTAMP:
  164         case DRV_TLV_PLOGI_1_ACC_RECEIVED_SOURCE_FC_ID:
  165         case DRV_TLV_PLOGI_1_ACC_TIMESTAMP:
  166         case DRV_TLV_PLOGI_2_ACC_RECEIVED_SOURCE_FC_ID:
  167         case DRV_TLV_PLOGI_2_ACC_TIMESTAMP:
  168         case DRV_TLV_PLOGI_3_ACC_RECEIVED_SOURCE_FC_ID:
  169         case DRV_TLV_PLOGI_3_ACC_TIMESTAMP:
  170         case DRV_TLV_PLOGI_4_ACC_RECEIVED_SOURCE_FC_ID:
  171         case DRV_TLV_PLOGI_4_ACC_TIMESTAMP:
  172         case DRV_TLV_PLOGI_5_ACC_RECEIVED_SOURCE_FC_ID:
  173         case DRV_TLV_PLOGI_5_ACC_TIMESTAMP:
  174         case DRV_TLV_LOGOS_ISSUED:
  175         case DRV_TLV_LOGO_ACCS_RECEIVED:
  176         case DRV_TLV_LOGO_RJTS_RECEIVED:
  177         case DRV_TLV_LOGO_1_RECEIVED_SOURCE_FC_ID:
  178         case DRV_TLV_LOGO_1_TIMESTAMP:
  179         case DRV_TLV_LOGO_2_RECEIVED_SOURCE_FC_ID:
  180         case DRV_TLV_LOGO_2_TIMESTAMP:
  181         case DRV_TLV_LOGO_3_RECEIVED_SOURCE_FC_ID:
  182         case DRV_TLV_LOGO_3_TIMESTAMP:
  183         case DRV_TLV_LOGO_4_RECEIVED_SOURCE_FC_ID:
  184         case DRV_TLV_LOGO_4_TIMESTAMP:
  185         case DRV_TLV_LOGO_5_RECEIVED_SOURCE_FC_ID:
  186         case DRV_TLV_LOGO_5_TIMESTAMP:
  187         case DRV_TLV_LOGOS_RECEIVED:
  188         case DRV_TLV_ACCS_ISSUED:
  189         case DRV_TLV_PRLIS_ISSUED:
  190         case DRV_TLV_ACCS_RECEIVED:
  191         case DRV_TLV_ABTS_SENT_COUNT:
  192         case DRV_TLV_ABTS_ACCS_RECEIVED:
  193         case DRV_TLV_ABTS_RJTS_RECEIVED:
  194         case DRV_TLV_ABTS_1_SENT_DESTINATION_FC_ID:
  195         case DRV_TLV_ABTS_1_TIMESTAMP:
  196         case DRV_TLV_ABTS_2_SENT_DESTINATION_FC_ID:
  197         case DRV_TLV_ABTS_2_TIMESTAMP:
  198         case DRV_TLV_ABTS_3_SENT_DESTINATION_FC_ID:
  199         case DRV_TLV_ABTS_3_TIMESTAMP:
  200         case DRV_TLV_ABTS_4_SENT_DESTINATION_FC_ID:
  201         case DRV_TLV_ABTS_4_TIMESTAMP:
  202         case DRV_TLV_ABTS_5_SENT_DESTINATION_FC_ID:
  203         case DRV_TLV_ABTS_5_TIMESTAMP:
  204         case DRV_TLV_RSCNS_RECEIVED:
  205         case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_1:
  206         case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_2:
  207         case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_3:
  208         case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_4:
  209         case DRV_TLV_LUN_RESETS_ISSUED:
  210         case DRV_TLV_ABORT_TASK_SETS_ISSUED:
  211         case DRV_TLV_TPRLOS_SENT:
  212         case DRV_TLV_NOS_SENT_COUNT:
  213         case DRV_TLV_NOS_RECEIVED_COUNT:
  214         case DRV_TLV_OLS_COUNT:
  215         case DRV_TLV_LR_COUNT:
  216         case DRV_TLV_LRR_COUNT:
  217         case DRV_TLV_LIP_SENT_COUNT:
  218         case DRV_TLV_LIP_RECEIVED_COUNT:
  219         case DRV_TLV_EOFA_COUNT:
  220         case DRV_TLV_EOFNI_COUNT:
  221         case DRV_TLV_SCSI_STATUS_CHECK_CONDITION_COUNT:
  222         case DRV_TLV_SCSI_STATUS_CONDITION_MET_COUNT:
  223         case DRV_TLV_SCSI_STATUS_BUSY_COUNT:
  224         case DRV_TLV_SCSI_STATUS_INTERMEDIATE_COUNT:
  225         case DRV_TLV_SCSI_STATUS_INTERMEDIATE_CONDITION_MET_COUNT:
  226         case DRV_TLV_SCSI_STATUS_RESERVATION_CONFLICT_COUNT:
  227         case DRV_TLV_SCSI_STATUS_TASK_SET_FULL_COUNT:
  228         case DRV_TLV_SCSI_STATUS_ACA_ACTIVE_COUNT:
  229         case DRV_TLV_SCSI_STATUS_TASK_ABORTED_COUNT:
  230         case DRV_TLV_SCSI_CHECK_CONDITION_1_RECEIVED_SK_ASC_ASCQ:
  231         case DRV_TLV_SCSI_CHECK_1_TIMESTAMP:
  232         case DRV_TLV_SCSI_CHECK_CONDITION_2_RECEIVED_SK_ASC_ASCQ:
  233         case DRV_TLV_SCSI_CHECK_2_TIMESTAMP:
  234         case DRV_TLV_SCSI_CHECK_CONDITION_3_RECEIVED_SK_ASC_ASCQ:
  235         case DRV_TLV_SCSI_CHECK_3_TIMESTAMP:
  236         case DRV_TLV_SCSI_CHECK_CONDITION_4_RECEIVED_SK_ASC_ASCQ:
  237         case DRV_TLV_SCSI_CHECK_4_TIMESTAMP:
  238         case DRV_TLV_SCSI_CHECK_CONDITION_5_RECEIVED_SK_ASC_ASCQ:
  239         case DRV_TLV_SCSI_CHECK_5_TIMESTAMP:
  240                 *tlv_group = ECORE_MFW_TLV_FCOE;
  241                 break;
  242         case DRV_TLV_TARGET_LLMNR_ENABLED:
  243         case DRV_TLV_HEADER_DIGEST_FLAG_ENABLED:
  244         case DRV_TLV_DATA_DIGEST_FLAG_ENABLED:
  245         case DRV_TLV_AUTHENTICATION_METHOD:
  246         case DRV_TLV_ISCSI_BOOT_TARGET_PORTAL:
  247         case DRV_TLV_MAX_FRAME_SIZE:
  248         case DRV_TLV_PDU_TX_DESCRIPTORS_QUEUE_SIZE:
  249         case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_SIZE:
  250         case DRV_TLV_ISCSI_BOOT_PROGRESS:
  251         case DRV_TLV_PDU_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
  252         case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
  253         case DRV_TLV_ISCSI_PDU_RX_FRAMES_RECEIVED:
  254         case DRV_TLV_ISCSI_PDU_RX_BYTES_RECEIVED:
  255         case DRV_TLV_ISCSI_PDU_TX_FRAMES_SENT:
  256         case DRV_TLV_ISCSI_PDU_TX_BYTES_SENT:
  257                 *tlv_group |= ECORE_MFW_TLV_ISCSI;
  258                 break;
  259         default:
  260                 return ECORE_INVAL;
  261         }
  262 
  263         return ECORE_SUCCESS;
  264 }
  265 
  266 static int
  267 ecore_mfw_get_gen_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
  268                             struct ecore_mfw_tlv_generic *p_drv_buf,
  269                             struct ecore_tlv_parsed_buf *p_buf)
  270 {
  271         switch (p_tlv->tlv_type) {
  272         case DRV_TLV_FEATURE_FLAGS:
  273                 if (p_drv_buf->flags.b_set) {
  274                         OSAL_MEM_ZERO(p_buf->data,
  275                                       sizeof(u8) * ECORE_TLV_DATA_MAX);
  276                         p_buf->data[0] = p_drv_buf->flags.ipv4_csum_offload ?
  277                                          1 : 0;
  278                         p_buf->data[0] |= (p_drv_buf->flags.lso_supported ?
  279                                            1 : 0) << 1;
  280                         p_buf->p_val = p_buf->data;
  281                         return 2;
  282                 }
  283                 break;
  284 
  285         case DRV_TLV_LOCAL_ADMIN_ADDR:
  286         case DRV_TLV_ADDITIONAL_MAC_ADDR_1:
  287         case DRV_TLV_ADDITIONAL_MAC_ADDR_2:
  288         {
  289                 int idx = p_tlv->tlv_type - DRV_TLV_LOCAL_ADMIN_ADDR;
  290 
  291                 if (p_drv_buf->mac_set[idx]) {
  292                         p_buf->p_val = p_drv_buf->mac[idx];
  293                         return 6;
  294                 }
  295                 break;
  296         }
  297 
  298         case DRV_TLV_RX_FRAMES_RECEIVED:
  299                 if (p_drv_buf->rx_frames_set) {
  300                         p_buf->p_val = (u8 *)&p_drv_buf->rx_frames;
  301                         return sizeof(p_drv_buf->rx_frames);
  302                 }
  303                 break;
  304         case DRV_TLV_RX_BYTES_RECEIVED:
  305                 if (p_drv_buf->rx_bytes_set) {
  306                         p_buf->p_val = (u8 *)&p_drv_buf->rx_bytes;
  307                         return sizeof(p_drv_buf->rx_bytes);
  308                 }
  309                 break;
  310         case DRV_TLV_TX_FRAMES_SENT:
  311                 if (p_drv_buf->tx_frames_set) {
  312                         p_buf->p_val = (u8 *)&p_drv_buf->tx_frames;
  313                         return sizeof(p_drv_buf->tx_frames);
  314                 }
  315                 break;
  316         case DRV_TLV_TX_BYTES_SENT:
  317                 if (p_drv_buf->tx_bytes_set) {
  318                         p_buf->p_val = (u8 *)&p_drv_buf->tx_bytes;
  319                         return sizeof(p_drv_buf->tx_bytes);
  320                 }
  321                 break;
  322         default:
  323                 break;
  324         }
  325 
  326         return -1;
  327 }
  328 
  329 static int
  330 ecore_mfw_get_eth_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
  331                             struct ecore_mfw_tlv_eth *p_drv_buf,
  332                             struct ecore_tlv_parsed_buf *p_buf)
  333 {
  334         switch (p_tlv->tlv_type) {
  335         case DRV_TLV_LSO_MAX_OFFLOAD_SIZE:
  336                 if (p_drv_buf->lso_maxoff_size_set) {
  337                         p_buf->p_val = (u8 *)&p_drv_buf->lso_maxoff_size;
  338                         return sizeof(p_drv_buf->lso_maxoff_size);
  339                 }
  340                 break;
  341         case DRV_TLV_LSO_MIN_SEGMENT_COUNT:
  342                 if (p_drv_buf->lso_minseg_size_set) {
  343                         p_buf->p_val = (u8 *)&p_drv_buf->lso_minseg_size;
  344                         return sizeof(p_drv_buf->lso_minseg_size);
  345                 }
  346                 break;
  347         case DRV_TLV_PROMISCUOUS_MODE:
  348                 if (p_drv_buf->prom_mode_set) {
  349                         p_buf->p_val = (u8 *)&p_drv_buf->prom_mode;
  350                         return sizeof(p_drv_buf->prom_mode);
  351                 }
  352                 break;
  353         case DRV_TLV_TX_DESCRIPTORS_QUEUE_SIZE:
  354                 if (p_drv_buf->tx_descr_size_set) {
  355                         p_buf->p_val = (u8 *)&p_drv_buf->tx_descr_size;
  356                         return sizeof(p_drv_buf->tx_descr_size);
  357                 }
  358                 break;
  359         case DRV_TLV_RX_DESCRIPTORS_QUEUE_SIZE:
  360                 if (p_drv_buf->rx_descr_size_set) {
  361                         p_buf->p_val = (u8 *)&p_drv_buf->rx_descr_size;
  362                         return sizeof(p_drv_buf->rx_descr_size);
  363                 }
  364                 break;
  365         case DRV_TLV_NUM_OF_NET_QUEUE_VMQ_CFG:
  366                 if (p_drv_buf->netq_count_set) {
  367                         p_buf->p_val = (u8 *)&p_drv_buf->netq_count;
  368                         return sizeof(p_drv_buf->netq_count);
  369                 }
  370                 break;
  371         case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV4:
  372                 if (p_drv_buf->tcp4_offloads_set) {
  373                         p_buf->p_val = (u8 *)&p_drv_buf->tcp4_offloads;
  374                         return sizeof(p_drv_buf->tcp4_offloads);
  375                 }
  376                 break;
  377         case DRV_TLV_NUM_OFFLOADED_CONNECTIONS_TCP_IPV6:
  378                 if (p_drv_buf->tcp6_offloads_set) {
  379                         p_buf->p_val = (u8 *)&p_drv_buf->tcp6_offloads;
  380                         return sizeof(p_drv_buf->tcp6_offloads);
  381                 }
  382                 break;
  383         case DRV_TLV_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
  384                 if (p_drv_buf->tx_descr_qdepth_set) {
  385                         p_buf->p_val = (u8 *)&p_drv_buf->tx_descr_qdepth;
  386                         return sizeof(p_drv_buf->tx_descr_qdepth);
  387                 }
  388                 break;
  389         case DRV_TLV_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
  390                 if (p_drv_buf->rx_descr_qdepth_set) {
  391                         p_buf->p_val = (u8 *)&p_drv_buf->rx_descr_qdepth;
  392                         return sizeof(p_drv_buf->rx_descr_qdepth);
  393                 }
  394                 break;
  395         case DRV_TLV_IOV_OFFLOAD:
  396                 if (p_drv_buf->iov_offload_set) {
  397                         p_buf->p_val = (u8 *)&p_drv_buf->iov_offload;
  398                         return sizeof(p_drv_buf->iov_offload);
  399                 }
  400                 break;
  401         case DRV_TLV_TX_QUEUES_EMPTY:
  402                 if (p_drv_buf->txqs_empty_set) {
  403                         p_buf->p_val = (u8 *)&p_drv_buf->txqs_empty;
  404                         return sizeof(p_drv_buf->txqs_empty);
  405                 }
  406                 break;
  407         case DRV_TLV_RX_QUEUES_EMPTY:
  408                 if (p_drv_buf->rxqs_empty_set) {
  409                         p_buf->p_val = (u8 *)&p_drv_buf->rxqs_empty;
  410                         return sizeof(p_drv_buf->rxqs_empty);
  411                 }
  412                 break;
  413         case DRV_TLV_TX_QUEUES_FULL:
  414                 if (p_drv_buf->num_txqs_full_set) {
  415                         p_buf->p_val = (u8 *)&p_drv_buf->num_txqs_full;
  416                         return sizeof(p_drv_buf->num_txqs_full);
  417                 }
  418                 break;
  419         case DRV_TLV_RX_QUEUES_FULL:
  420                 if (p_drv_buf->num_rxqs_full_set) {
  421                         p_buf->p_val = (u8 *)&p_drv_buf->num_rxqs_full;
  422                         return sizeof(p_drv_buf->num_rxqs_full);
  423                 }
  424                 break;
  425         default:
  426                 break;
  427         }
  428 
  429         return -1;
  430 }
  431 
  432 static int
  433 ecore_mfw_get_tlv_time_value(struct ecore_mfw_tlv_time *p_time,
  434                              struct ecore_tlv_parsed_buf *p_buf)
  435 {
  436         if (!p_time->b_set)
  437                 return -1;
  438 
  439         /* Validate numbers */
  440         if (p_time->month > 12)
  441                 p_time->month = 0;
  442         if (p_time->day > 31)
  443                 p_time->day = 0;
  444         if (p_time->hour > 23)
  445                 p_time->hour = 0;
  446         if (p_time->min > 59)
  447                 p_time->hour = 0;
  448         if (p_time->msec > 999)
  449                 p_time->msec = 0;
  450         if (p_time->usec > 999)
  451                 p_time->usec = 0;
  452 
  453         OSAL_MEM_ZERO(p_buf->data, sizeof(u8) * ECORE_TLV_DATA_MAX);
  454         OSAL_SNPRINTF(p_buf->data, 14, "%d%d%d%d%d%d",
  455                       p_time->month, p_time->day,
  456                       p_time->hour, p_time->min,
  457                       p_time->msec, p_time->usec);
  458 
  459         p_buf->p_val = p_buf->data;
  460         return 14;
  461 }
  462 
  463 static int
  464 ecore_mfw_get_fcoe_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
  465                              struct ecore_mfw_tlv_fcoe *p_drv_buf,
  466                              struct ecore_tlv_parsed_buf *p_buf)
  467 {
  468         switch (p_tlv->tlv_type) {
  469         case DRV_TLV_SCSI_TO:
  470                 if (p_drv_buf->scsi_timeout_set) {
  471                         p_buf->p_val = (u8 *)&p_drv_buf->scsi_timeout;
  472                         return sizeof(p_drv_buf->scsi_timeout);
  473                 }
  474                 break;
  475         case DRV_TLV_R_T_TOV:
  476                 if (p_drv_buf->rt_tov_set) {
  477                         p_buf->p_val = (u8 *)&p_drv_buf->rt_tov;
  478                         return sizeof(p_drv_buf->rt_tov);
  479                 }
  480                 break;
  481         case DRV_TLV_R_A_TOV:
  482                 if (p_drv_buf->ra_tov_set) {
  483                         p_buf->p_val = (u8 *)&p_drv_buf->ra_tov;
  484                         return sizeof(p_drv_buf->ra_tov);
  485                 }
  486                 break;
  487         case DRV_TLV_E_D_TOV:
  488                 if (p_drv_buf->ed_tov_set) {
  489                         p_buf->p_val = (u8 *)&p_drv_buf->ed_tov;
  490                         return sizeof(p_drv_buf->ed_tov);
  491                 }
  492                 break;
  493         case DRV_TLV_CR_TOV:
  494                 if (p_drv_buf->cr_tov_set) {
  495                         p_buf->p_val = (u8 *)&p_drv_buf->cr_tov;
  496                         return sizeof(p_drv_buf->cr_tov);
  497                 }
  498                 break;
  499         case DRV_TLV_BOOT_TYPE:
  500                 if (p_drv_buf->boot_type_set) {
  501                         p_buf->p_val = (u8 *)&p_drv_buf->boot_type;
  502                         return sizeof(p_drv_buf->boot_type);
  503                 }
  504                 break;
  505         case DRV_TLV_NPIV_STATE:
  506                 if (p_drv_buf->npiv_state_set) {
  507                         p_buf->p_val = (u8 *)&p_drv_buf->npiv_state;
  508                         return sizeof(p_drv_buf->npiv_state);
  509                 }
  510                 break;
  511         case DRV_TLV_NUM_OF_NPIV_IDS:
  512                 if (p_drv_buf->num_npiv_ids_set) {
  513                         p_buf->p_val = (u8 *)&p_drv_buf->num_npiv_ids;
  514                         return sizeof(p_drv_buf->num_npiv_ids);
  515                 }
  516                 break;
  517         case DRV_TLV_SWITCH_NAME:
  518                 if (p_drv_buf->switch_name_set) {
  519                         p_buf->p_val = (u8 *)&p_drv_buf->switch_name;
  520                         return sizeof(p_drv_buf->switch_name);
  521                 }
  522                 break;
  523         case DRV_TLV_SWITCH_PORT_NUM:
  524                 if (p_drv_buf->switch_portnum_set) {
  525                         p_buf->p_val = (u8 *)&p_drv_buf->switch_portnum;
  526                         return sizeof(p_drv_buf->switch_portnum);
  527                 }
  528                 break;
  529         case DRV_TLV_SWITCH_PORT_ID:
  530                 if (p_drv_buf->switch_portid_set) {
  531                         p_buf->p_val = (u8 *)&p_drv_buf->switch_portid;
  532                         return sizeof(p_drv_buf->switch_portid);
  533                 }
  534                 break;
  535         case DRV_TLV_VENDOR_NAME:
  536                 if (p_drv_buf->vendor_name_set) {
  537                         p_buf->p_val = (u8 *)&p_drv_buf->vendor_name;
  538                         return sizeof(p_drv_buf->vendor_name);
  539                 }
  540                 break;
  541         case DRV_TLV_SWITCH_MODEL:
  542                 if (p_drv_buf->switch_model_set) {
  543                         p_buf->p_val = (u8 *)&p_drv_buf->switch_model;
  544                         return sizeof(p_drv_buf->switch_model);
  545                 }
  546                 break;
  547         case DRV_TLV_SWITCH_FW_VER:
  548                 if (p_drv_buf->switch_fw_version_set) {
  549                         p_buf->p_val = (u8 *)&p_drv_buf->switch_fw_version;
  550                         return sizeof(p_drv_buf->switch_fw_version);
  551                 }
  552                 break;
  553         case DRV_TLV_QOS_PRIORITY_PER_802_1P:
  554                 if (p_drv_buf->qos_pri_set) {
  555                         p_buf->p_val = (u8 *)&p_drv_buf->qos_pri;
  556                         return sizeof(p_drv_buf->qos_pri);
  557                 }
  558                 break;
  559         case DRV_TLV_PORT_ALIAS:
  560                 if (p_drv_buf->port_alias_set) {
  561                         p_buf->p_val = (u8 *)&p_drv_buf->port_alias;
  562                         return sizeof(p_drv_buf->port_alias);
  563                 }
  564                 break;
  565         case DRV_TLV_PORT_STATE:
  566                 if (p_drv_buf->port_state_set) {
  567                         p_buf->p_val = (u8 *)&p_drv_buf->port_state;
  568                         return sizeof(p_drv_buf->port_state);
  569                 }
  570                 break;
  571         case DRV_TLV_FIP_TX_DESCRIPTORS_QUEUE_SIZE:
  572                 if (p_drv_buf->fip_tx_descr_size_set) {
  573                         p_buf->p_val = (u8 *)&p_drv_buf->fip_tx_descr_size;
  574                         return sizeof(p_drv_buf->fip_tx_descr_size);
  575                 }
  576                 break;
  577         case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_SIZE:
  578                 if (p_drv_buf->fip_rx_descr_size_set) {
  579                         p_buf->p_val = (u8 *)&p_drv_buf->fip_rx_descr_size;
  580                         return sizeof(p_drv_buf->fip_rx_descr_size);
  581                 }
  582                 break;
  583         case DRV_TLV_LINK_FAILURE_COUNT:
  584                 if (p_drv_buf->link_failures_set) {
  585                         p_buf->p_val = (u8 *)&p_drv_buf->link_failures;
  586                         return sizeof(p_drv_buf->link_failures);
  587                 }
  588                 break;
  589         case DRV_TLV_FCOE_BOOT_PROGRESS:
  590                 if (p_drv_buf->fcoe_boot_progress_set) {
  591                         p_buf->p_val = (u8 *)&p_drv_buf->fcoe_boot_progress;
  592                         return sizeof(p_drv_buf->fcoe_boot_progress);
  593                 }
  594                 break;
  595         case DRV_TLV_RX_BROADCAST_PACKETS:
  596                 if (p_drv_buf->rx_bcast_set) {
  597                         p_buf->p_val = (u8 *)&p_drv_buf->rx_bcast;
  598                         return sizeof(p_drv_buf->rx_bcast);
  599                 }
  600                 break;
  601         case DRV_TLV_TX_BROADCAST_PACKETS:
  602                 if (p_drv_buf->tx_bcast_set) {
  603                         p_buf->p_val = (u8 *)&p_drv_buf->tx_bcast;
  604                         return sizeof(p_drv_buf->tx_bcast);
  605                 }
  606                 break;
  607         case DRV_TLV_FCOE_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
  608                 if (p_drv_buf->fcoe_txq_depth_set) {
  609                         p_buf->p_val = (u8 *)&p_drv_buf->fcoe_txq_depth;
  610                         return sizeof(p_drv_buf->fcoe_txq_depth);
  611                 }
  612                 break;
  613         case DRV_TLV_FCOE_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
  614                 if (p_drv_buf->fcoe_rxq_depth_set) {
  615                         p_buf->p_val = (u8 *)&p_drv_buf->fcoe_rxq_depth;
  616                         return sizeof(p_drv_buf->fcoe_rxq_depth);
  617                 }
  618                 break;
  619         case DRV_TLV_FCOE_RX_FRAMES_RECEIVED:
  620                 if (p_drv_buf->fcoe_rx_frames_set) {
  621                         p_buf->p_val = (u8 *)&p_drv_buf->fcoe_rx_frames;
  622                         return sizeof(p_drv_buf->fcoe_rx_frames);
  623                 }
  624                 break;
  625         case DRV_TLV_FCOE_RX_BYTES_RECEIVED:
  626                 if (p_drv_buf->fcoe_rx_bytes_set) {
  627                         p_buf->p_val = (u8 *)&p_drv_buf->fcoe_rx_bytes;
  628                         return sizeof(p_drv_buf->fcoe_rx_bytes);
  629                 }
  630                 break;
  631         case DRV_TLV_FCOE_TX_FRAMES_SENT:
  632                 if (p_drv_buf->fcoe_tx_frames_set) {
  633                         p_buf->p_val = (u8 *)&p_drv_buf->fcoe_tx_frames;
  634                         return sizeof(p_drv_buf->fcoe_tx_frames);
  635                 }
  636                 break;
  637         case DRV_TLV_FCOE_TX_BYTES_SENT:
  638                 if (p_drv_buf->fcoe_tx_bytes_set) {
  639                         p_buf->p_val = (u8 *)&p_drv_buf->fcoe_tx_bytes;
  640                         return sizeof(p_drv_buf->fcoe_tx_bytes);
  641                 }
  642                 break;
  643         case DRV_TLV_CRC_ERROR_COUNT:
  644                 if (p_drv_buf->crc_count_set) {
  645                         p_buf->p_val = (u8 *)&p_drv_buf->crc_count;
  646                         return sizeof(p_drv_buf->crc_count);
  647                 }
  648                 break;
  649         case DRV_TLV_CRC_ERROR_1_RECEIVED_SOURCE_FC_ID:
  650         case DRV_TLV_CRC_ERROR_2_RECEIVED_SOURCE_FC_ID:
  651         case DRV_TLV_CRC_ERROR_3_RECEIVED_SOURCE_FC_ID:
  652         case DRV_TLV_CRC_ERROR_4_RECEIVED_SOURCE_FC_ID:
  653         case DRV_TLV_CRC_ERROR_5_RECEIVED_SOURCE_FC_ID:
  654         {
  655                 u8 idx = (p_tlv->tlv_type -
  656                           DRV_TLV_CRC_ERROR_1_RECEIVED_SOURCE_FC_ID) / 2;
  657 
  658                 if (p_drv_buf->crc_err_src_fcid_set[idx]) {
  659                         p_buf->p_val = (u8 *)&p_drv_buf->crc_err_src_fcid[idx];
  660                         return sizeof(p_drv_buf->crc_err_src_fcid[idx]);
  661                 }
  662                 break;
  663         }
  664 
  665         case DRV_TLV_CRC_ERROR_1_TIMESTAMP:
  666         case DRV_TLV_CRC_ERROR_2_TIMESTAMP:
  667         case DRV_TLV_CRC_ERROR_3_TIMESTAMP:
  668         case DRV_TLV_CRC_ERROR_4_TIMESTAMP:
  669         case DRV_TLV_CRC_ERROR_5_TIMESTAMP:
  670         {
  671                 u8 idx = (p_tlv->tlv_type -
  672                           DRV_TLV_CRC_ERROR_1_TIMESTAMP) / 2;
  673 
  674                 return ecore_mfw_get_tlv_time_value(&p_drv_buf->crc_err[idx],
  675                                                     p_buf);
  676         }
  677 
  678         case DRV_TLV_LOSS_OF_SYNC_ERROR_COUNT:
  679                 if (p_drv_buf->losync_err_set) {
  680                         p_buf->p_val = (u8 *)&p_drv_buf->losync_err;
  681                         return sizeof(p_drv_buf->losync_err);
  682                 }
  683                 break;
  684         case DRV_TLV_LOSS_OF_SIGNAL_ERRORS:
  685                 if (p_drv_buf->losig_err_set) {
  686                         p_buf->p_val = (u8 *)&p_drv_buf->losig_err;
  687                         return sizeof(p_drv_buf->losig_err);
  688                 }
  689                 break;
  690         case DRV_TLV_PRIMITIVE_SEQUENCE_PROTOCOL_ERROR_COUNT:
  691                 if (p_drv_buf->primtive_err_set) {
  692                         p_buf->p_val = (u8 *)&p_drv_buf->primtive_err;
  693                         return sizeof(p_drv_buf->primtive_err);
  694                 }
  695                 break;
  696         case DRV_TLV_DISPARITY_ERROR_COUNT:
  697                 if (p_drv_buf->disparity_err_set) {
  698                         p_buf->p_val = (u8 *)&p_drv_buf->disparity_err;
  699                         return sizeof(p_drv_buf->disparity_err);
  700                 }
  701                 break;
  702         case DRV_TLV_CODE_VIOLATION_ERROR_COUNT:
  703                 if (p_drv_buf->code_violation_err_set) {
  704                         p_buf->p_val = (u8 *)&p_drv_buf->code_violation_err;
  705                         return sizeof(p_drv_buf->code_violation_err);
  706                 }
  707                 break;
  708         case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_1:
  709         case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_2:
  710         case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_3:
  711         case DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_4:
  712         {
  713                 u8 idx = p_tlv->tlv_type -
  714                          DRV_TLV_LAST_FLOGI_ISSUED_COMMON_PARAMETERS_WORD_1;
  715                 if (p_drv_buf->flogi_param_set[idx]) {
  716                         p_buf->p_val = (u8 *)&p_drv_buf->flogi_param[idx];
  717                         return sizeof(p_drv_buf->flogi_param[idx]);
  718                 }
  719                 break;
  720         }
  721         case DRV_TLV_LAST_FLOGI_TIMESTAMP:
  722                 return ecore_mfw_get_tlv_time_value(&p_drv_buf->flogi_tstamp,
  723                                                     p_buf);
  724         case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_1:
  725         case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_2:
  726         case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_3:
  727         case DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_4:
  728         {
  729                 u8 idx = p_tlv->tlv_type -
  730                          DRV_TLV_LAST_FLOGI_ACC_COMMON_PARAMETERS_WORD_1;
  731 
  732                 if (p_drv_buf->flogi_acc_param_set[idx]) {
  733                         p_buf->p_val = (u8 *)&p_drv_buf->flogi_acc_param[idx];
  734                         return sizeof(p_drv_buf->flogi_acc_param[idx]);
  735                 }
  736                 break;
  737         }
  738         case DRV_TLV_LAST_FLOGI_ACC_TIMESTAMP:
  739                 return ecore_mfw_get_tlv_time_value(&p_drv_buf->flogi_acc_tstamp,
  740                                                     p_buf);
  741         case DRV_TLV_LAST_FLOGI_RJT:
  742                 if (p_drv_buf->flogi_rjt_set) {
  743                         p_buf->p_val = (u8 *)&p_drv_buf->flogi_rjt;
  744                         return sizeof(p_drv_buf->flogi_rjt);
  745                 }
  746                 break;
  747         case DRV_TLV_LAST_FLOGI_RJT_TIMESTAMP:
  748                 return ecore_mfw_get_tlv_time_value(&p_drv_buf->flogi_rjt_tstamp,
  749                                                     p_buf);
  750         case DRV_TLV_FDISCS_SENT_COUNT:
  751                 if (p_drv_buf->fdiscs_set) {
  752                         p_buf->p_val = (u8 *)&p_drv_buf->fdiscs;
  753                         return sizeof(p_drv_buf->fdiscs);
  754                 }
  755                 break;
  756         case DRV_TLV_FDISC_ACCS_RECEIVED:
  757                 if (p_drv_buf->fdisc_acc_set) {
  758                         p_buf->p_val = (u8 *)&p_drv_buf->fdisc_acc;
  759                         return sizeof(p_drv_buf->fdisc_acc);
  760                 }
  761                 break;
  762         case DRV_TLV_FDISC_RJTS_RECEIVED:
  763                 if (p_drv_buf->fdisc_rjt_set) {
  764                         p_buf->p_val = (u8 *)&p_drv_buf->fdisc_rjt;
  765                         return sizeof(p_drv_buf->fdisc_rjt);
  766                 }
  767                 break;
  768         case DRV_TLV_PLOGI_SENT_COUNT:
  769                 if (p_drv_buf->plogi_set) {
  770                         p_buf->p_val = (u8 *)&p_drv_buf->plogi;
  771                         return sizeof(p_drv_buf->plogi);
  772                 }
  773                 break;
  774         case DRV_TLV_PLOGI_ACCS_RECEIVED:
  775                 if (p_drv_buf->plogi_acc_set) {
  776                         p_buf->p_val = (u8 *)&p_drv_buf->plogi_acc;
  777                         return sizeof(p_drv_buf->plogi_acc);
  778                 }
  779                 break;
  780         case DRV_TLV_PLOGI_RJTS_RECEIVED:
  781                 if (p_drv_buf->plogi_rjt_set) {
  782                         p_buf->p_val = (u8 *)&p_drv_buf->plogi_rjt;
  783                         return sizeof(p_drv_buf->plogi_rjt);
  784                 }
  785                 break;
  786         case DRV_TLV_PLOGI_1_SENT_DESTINATION_FC_ID:
  787         case DRV_TLV_PLOGI_2_SENT_DESTINATION_FC_ID:
  788         case DRV_TLV_PLOGI_3_SENT_DESTINATION_FC_ID:
  789         case DRV_TLV_PLOGI_4_SENT_DESTINATION_FC_ID:
  790         case DRV_TLV_PLOGI_5_SENT_DESTINATION_FC_ID:
  791         {
  792                 u8 idx = (p_tlv->tlv_type -
  793                           DRV_TLV_PLOGI_1_SENT_DESTINATION_FC_ID) / 2;
  794 
  795                 if (p_drv_buf->plogi_dst_fcid_set[idx]) {
  796                         p_buf->p_val = (u8 *)&p_drv_buf->plogi_dst_fcid[idx];
  797                         return sizeof(p_drv_buf->plogi_dst_fcid[idx]);
  798                 }
  799                 break;
  800         }
  801         case DRV_TLV_PLOGI_1_TIMESTAMP:
  802         case DRV_TLV_PLOGI_2_TIMESTAMP:
  803         case DRV_TLV_PLOGI_3_TIMESTAMP:
  804         case DRV_TLV_PLOGI_4_TIMESTAMP:
  805         case DRV_TLV_PLOGI_5_TIMESTAMP:
  806         {
  807                 u8 idx = (p_tlv->tlv_type -
  808                           DRV_TLV_PLOGI_1_TIMESTAMP) / 2;
  809 
  810                 return ecore_mfw_get_tlv_time_value(&p_drv_buf->plogi_tstamp[idx],
  811                                                     p_buf);
  812         }
  813 
  814         case DRV_TLV_PLOGI_1_ACC_RECEIVED_SOURCE_FC_ID:
  815         case DRV_TLV_PLOGI_2_ACC_RECEIVED_SOURCE_FC_ID:
  816         case DRV_TLV_PLOGI_3_ACC_RECEIVED_SOURCE_FC_ID:
  817         case DRV_TLV_PLOGI_4_ACC_RECEIVED_SOURCE_FC_ID:
  818         case DRV_TLV_PLOGI_5_ACC_RECEIVED_SOURCE_FC_ID:
  819         {
  820                 u8 idx = (p_tlv->tlv_type -
  821                           DRV_TLV_PLOGI_1_ACC_RECEIVED_SOURCE_FC_ID) / 2;
  822 
  823                 if (p_drv_buf->plogi_acc_src_fcid_set[idx]) {
  824                         p_buf->p_val = (u8 *)&p_drv_buf->plogi_acc_src_fcid[idx];
  825                         return sizeof(p_drv_buf->plogi_acc_src_fcid[idx]);
  826                 }
  827                 break;
  828         }
  829         case DRV_TLV_PLOGI_1_ACC_TIMESTAMP:
  830         case DRV_TLV_PLOGI_2_ACC_TIMESTAMP:
  831         case DRV_TLV_PLOGI_3_ACC_TIMESTAMP:
  832         case DRV_TLV_PLOGI_4_ACC_TIMESTAMP:
  833         case DRV_TLV_PLOGI_5_ACC_TIMESTAMP:
  834         {
  835                 u8 idx = (p_tlv->tlv_type -
  836                           DRV_TLV_PLOGI_1_ACC_TIMESTAMP) / 2;
  837 
  838                 return ecore_mfw_get_tlv_time_value(&p_drv_buf->plogi_acc_tstamp[idx],
  839                                                     p_buf);
  840         }
  841 
  842         case DRV_TLV_LOGOS_ISSUED:
  843                 if (p_drv_buf->tx_plogos_set) {
  844                         p_buf->p_val = (u8 *)&p_drv_buf->tx_plogos;
  845                         return sizeof(p_drv_buf->tx_plogos);
  846                 }
  847                 break;
  848         case DRV_TLV_LOGO_ACCS_RECEIVED:
  849                 if (p_drv_buf->plogo_acc_set) {
  850                         p_buf->p_val = (u8 *)&p_drv_buf->plogo_acc;
  851                         return sizeof(p_drv_buf->plogo_acc);
  852                 }
  853                 break;
  854         case DRV_TLV_LOGO_RJTS_RECEIVED:
  855                 if (p_drv_buf->plogo_rjt_set) {
  856                         p_buf->p_val = (u8 *)&p_drv_buf->plogo_rjt;
  857                         return sizeof(p_drv_buf->plogo_rjt);
  858                 }
  859                 break;
  860         case DRV_TLV_LOGO_1_RECEIVED_SOURCE_FC_ID:
  861         case DRV_TLV_LOGO_2_RECEIVED_SOURCE_FC_ID:
  862         case DRV_TLV_LOGO_3_RECEIVED_SOURCE_FC_ID:
  863         case DRV_TLV_LOGO_4_RECEIVED_SOURCE_FC_ID:
  864         case DRV_TLV_LOGO_5_RECEIVED_SOURCE_FC_ID:
  865         {
  866                 u8 idx = (p_tlv->tlv_type -
  867                           DRV_TLV_LOGO_1_RECEIVED_SOURCE_FC_ID) / 2;
  868 
  869                 if (p_drv_buf->plogo_src_fcid_set[idx]) {
  870                         p_buf->p_val = (u8 *)&p_drv_buf->plogo_src_fcid[idx];
  871                         return sizeof(p_drv_buf->plogo_src_fcid[idx]);
  872                 }
  873                 break;
  874         }
  875         case DRV_TLV_LOGO_1_TIMESTAMP:
  876         case DRV_TLV_LOGO_2_TIMESTAMP:
  877         case DRV_TLV_LOGO_3_TIMESTAMP:
  878         case DRV_TLV_LOGO_4_TIMESTAMP:
  879         case DRV_TLV_LOGO_5_TIMESTAMP:
  880         {
  881                 u8 idx = (p_tlv->tlv_type -
  882                           DRV_TLV_LOGO_1_TIMESTAMP) / 2;
  883 
  884                 return ecore_mfw_get_tlv_time_value(&p_drv_buf->plogo_tstamp[idx],
  885                                                     p_buf);
  886         }
  887         case DRV_TLV_LOGOS_RECEIVED:
  888                 if (p_drv_buf->rx_logos_set) {
  889                         p_buf->p_val = (u8 *)&p_drv_buf->rx_logos;
  890                         return sizeof(p_drv_buf->rx_logos);
  891                 }
  892                 break;
  893         case DRV_TLV_ACCS_ISSUED:
  894                 if (p_drv_buf->tx_accs_set) {
  895                         p_buf->p_val = (u8 *)&p_drv_buf->tx_accs;
  896                         return sizeof(p_drv_buf->tx_accs);
  897                 }
  898                 break;
  899         case DRV_TLV_PRLIS_ISSUED:
  900                 if (p_drv_buf->tx_prlis_set) {
  901                         p_buf->p_val = (u8 *)&p_drv_buf->tx_prlis;
  902                         return sizeof(p_drv_buf->tx_prlis);
  903                 }
  904                 break;
  905         case DRV_TLV_ACCS_RECEIVED:
  906                 if (p_drv_buf->rx_accs_set) {
  907                         p_buf->p_val = (u8 *)&p_drv_buf->rx_accs;
  908                         return sizeof(p_drv_buf->rx_accs);
  909                 }
  910                 break;
  911         case DRV_TLV_ABTS_SENT_COUNT:
  912                 if (p_drv_buf->tx_abts_set) {
  913                         p_buf->p_val = (u8 *)&p_drv_buf->tx_abts;
  914                         return sizeof(p_drv_buf->tx_abts);
  915                 }
  916                 break;
  917         case DRV_TLV_ABTS_ACCS_RECEIVED:
  918                 if (p_drv_buf->rx_abts_acc_set) {
  919                         p_buf->p_val = (u8 *)&p_drv_buf->rx_abts_acc;
  920                         return sizeof(p_drv_buf->rx_abts_acc);
  921                 }
  922                 break;
  923         case DRV_TLV_ABTS_RJTS_RECEIVED:
  924                 if (p_drv_buf->rx_abts_rjt_set) {
  925                         p_buf->p_val = (u8 *)&p_drv_buf->rx_abts_rjt;
  926                         return sizeof(p_drv_buf->rx_abts_rjt);
  927                 }
  928                 break;
  929         case DRV_TLV_ABTS_1_SENT_DESTINATION_FC_ID:
  930         case DRV_TLV_ABTS_2_SENT_DESTINATION_FC_ID:
  931         case DRV_TLV_ABTS_3_SENT_DESTINATION_FC_ID:
  932         case DRV_TLV_ABTS_4_SENT_DESTINATION_FC_ID:
  933         case DRV_TLV_ABTS_5_SENT_DESTINATION_FC_ID:
  934         {
  935                 u8 idx = (p_tlv->tlv_type -
  936                           DRV_TLV_ABTS_1_SENT_DESTINATION_FC_ID) / 2;
  937 
  938                 if (p_drv_buf->abts_dst_fcid_set[idx]) {
  939                         p_buf->p_val = (u8 *)&p_drv_buf->abts_dst_fcid[idx];
  940                         return sizeof(p_drv_buf->abts_dst_fcid[idx]);
  941                 }
  942                 break;
  943         }
  944         case DRV_TLV_ABTS_1_TIMESTAMP:
  945         case DRV_TLV_ABTS_2_TIMESTAMP:
  946         case DRV_TLV_ABTS_3_TIMESTAMP:
  947         case DRV_TLV_ABTS_4_TIMESTAMP:
  948         case DRV_TLV_ABTS_5_TIMESTAMP:
  949         {
  950                 u8 idx = (p_tlv->tlv_type -
  951                           DRV_TLV_ABTS_1_TIMESTAMP) / 2;
  952 
  953                 return ecore_mfw_get_tlv_time_value(&p_drv_buf->abts_tstamp[idx],
  954                                                     p_buf);
  955         }
  956 
  957         case DRV_TLV_RSCNS_RECEIVED:
  958                 if (p_drv_buf->rx_rscn_set) {
  959                         p_buf->p_val = (u8 *)&p_drv_buf->rx_rscn;
  960                         return sizeof(p_drv_buf->rx_rscn);
  961                 }
  962                 break;
  963         case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_1:
  964         case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_2:
  965         case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_3:
  966         case DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_4:
  967         {
  968                 u8 idx = p_tlv->tlv_type - DRV_TLV_LAST_RSCN_RECEIVED_N_PORT_1;
  969 
  970                 if (p_drv_buf->rx_rscn_nport_set[idx]) {
  971                         p_buf->p_val = (u8 *)&p_drv_buf->rx_rscn_nport[idx];
  972                         return sizeof(p_drv_buf->rx_rscn_nport[idx]);
  973                 }
  974                 break;
  975         }
  976         case DRV_TLV_LUN_RESETS_ISSUED:
  977                 if (p_drv_buf->tx_lun_rst_set) {
  978                         p_buf->p_val = (u8 *)&p_drv_buf->tx_lun_rst;
  979                         return sizeof(p_drv_buf->tx_lun_rst);
  980                 }
  981                 break;
  982         case DRV_TLV_ABORT_TASK_SETS_ISSUED:
  983                 if (p_drv_buf->abort_task_sets_set) {
  984                         p_buf->p_val = (u8 *)&p_drv_buf->abort_task_sets;
  985                         return sizeof(p_drv_buf->abort_task_sets);
  986                 }
  987                 break;
  988         case DRV_TLV_TPRLOS_SENT:
  989                 if (p_drv_buf->tx_tprlos_set) {
  990                         p_buf->p_val = (u8 *)&p_drv_buf->tx_tprlos;
  991                         return sizeof(p_drv_buf->tx_tprlos);
  992                 }
  993                 break;
  994         case DRV_TLV_NOS_SENT_COUNT:
  995                 if (p_drv_buf->tx_nos_set) {
  996                         p_buf->p_val = (u8 *)&p_drv_buf->tx_nos;
  997                         return sizeof(p_drv_buf->tx_nos);
  998                 }
  999                 break;
 1000         case DRV_TLV_NOS_RECEIVED_COUNT:
 1001                 if (p_drv_buf->rx_nos_set) {
 1002                         p_buf->p_val = (u8 *)&p_drv_buf->rx_nos;
 1003                         return sizeof(p_drv_buf->rx_nos);
 1004                 }
 1005                 break;
 1006         case DRV_TLV_OLS_COUNT:
 1007                 if (p_drv_buf->ols_set) {
 1008                         p_buf->p_val = (u8 *)&p_drv_buf->ols;
 1009                         return sizeof(p_drv_buf->ols);
 1010                 }
 1011                 break;
 1012         case DRV_TLV_LR_COUNT:
 1013                 if (p_drv_buf->lr_set) {
 1014                         p_buf->p_val = (u8 *)&p_drv_buf->lr;
 1015                         return sizeof(p_drv_buf->lr);
 1016                 }
 1017                 break;
 1018         case DRV_TLV_LRR_COUNT:
 1019                 if (p_drv_buf->lrr_set) {
 1020                         p_buf->p_val = (u8 *)&p_drv_buf->lrr;
 1021                         return sizeof(p_drv_buf->lrr);
 1022                 }
 1023                 break;
 1024         case DRV_TLV_LIP_SENT_COUNT:
 1025                 if (p_drv_buf->tx_lip_set) {
 1026                         p_buf->p_val = (u8 *)&p_drv_buf->tx_lip;
 1027                         return sizeof(p_drv_buf->tx_lip);
 1028                 }
 1029                 break;
 1030         case DRV_TLV_LIP_RECEIVED_COUNT:
 1031                 if (p_drv_buf->rx_lip_set) {
 1032                         p_buf->p_val = (u8 *)&p_drv_buf->rx_lip;
 1033                         return sizeof(p_drv_buf->rx_lip);
 1034                 }
 1035                 break;
 1036         case DRV_TLV_EOFA_COUNT:
 1037                 if (p_drv_buf->eofa_set) {
 1038                         p_buf->p_val = (u8 *)&p_drv_buf->eofa;
 1039                         return sizeof(p_drv_buf->eofa);
 1040                 }
 1041                 break;
 1042         case DRV_TLV_EOFNI_COUNT:
 1043                 if (p_drv_buf->eofni_set) {
 1044                         p_buf->p_val = (u8 *)&p_drv_buf->eofni;
 1045                         return sizeof(p_drv_buf->eofni);
 1046                 }
 1047                 break;
 1048         case DRV_TLV_SCSI_STATUS_CHECK_CONDITION_COUNT:
 1049                 if (p_drv_buf->scsi_chks_set) {
 1050                         p_buf->p_val = (u8 *)&p_drv_buf->scsi_chks;
 1051                         return sizeof(p_drv_buf->scsi_chks);
 1052                 }
 1053                 break;
 1054         case DRV_TLV_SCSI_STATUS_CONDITION_MET_COUNT:
 1055                 if (p_drv_buf->scsi_cond_met_set) {
 1056                         p_buf->p_val = (u8 *)&p_drv_buf->scsi_cond_met;
 1057                         return sizeof(p_drv_buf->scsi_cond_met);
 1058                 }
 1059                 break;
 1060         case DRV_TLV_SCSI_STATUS_BUSY_COUNT:
 1061                 if (p_drv_buf->scsi_busy_set) {
 1062                         p_buf->p_val = (u8 *)&p_drv_buf->scsi_busy;
 1063                         return sizeof(p_drv_buf->scsi_busy);
 1064                 }
 1065                 break;
 1066         case DRV_TLV_SCSI_STATUS_INTERMEDIATE_COUNT:
 1067                 if (p_drv_buf->scsi_inter_set) {
 1068                         p_buf->p_val = (u8 *)&p_drv_buf->scsi_inter;
 1069                         return sizeof(p_drv_buf->scsi_inter);
 1070                 }
 1071                 break;
 1072         case DRV_TLV_SCSI_STATUS_INTERMEDIATE_CONDITION_MET_COUNT:
 1073                 if (p_drv_buf->scsi_inter_cond_met_set) {
 1074                         p_buf->p_val = (u8 *)&p_drv_buf->scsi_inter_cond_met;
 1075                         return sizeof(p_drv_buf->scsi_inter_cond_met);
 1076                 }
 1077                 break;
 1078         case DRV_TLV_SCSI_STATUS_RESERVATION_CONFLICT_COUNT:
 1079                 if (p_drv_buf->scsi_rsv_conflicts_set) {
 1080                         p_buf->p_val = (u8 *)&p_drv_buf->scsi_rsv_conflicts;
 1081                         return sizeof(p_drv_buf->scsi_rsv_conflicts);
 1082                 }
 1083                 break;
 1084         case DRV_TLV_SCSI_STATUS_TASK_SET_FULL_COUNT:
 1085                 if (p_drv_buf->scsi_tsk_full_set) {
 1086                         p_buf->p_val = (u8 *)&p_drv_buf->scsi_tsk_full;
 1087                         return sizeof(p_drv_buf->scsi_tsk_full);
 1088                 }
 1089                 break;
 1090         case DRV_TLV_SCSI_STATUS_ACA_ACTIVE_COUNT:
 1091                 if (p_drv_buf->scsi_aca_active_set) {
 1092                         p_buf->p_val = (u8 *)&p_drv_buf->scsi_aca_active;
 1093                         return sizeof(p_drv_buf->scsi_aca_active);
 1094                 }
 1095                 break;
 1096         case DRV_TLV_SCSI_STATUS_TASK_ABORTED_COUNT:
 1097                 if (p_drv_buf->scsi_tsk_abort_set) {
 1098                         p_buf->p_val = (u8 *)&p_drv_buf->scsi_tsk_abort;
 1099                         return sizeof(p_drv_buf->scsi_tsk_abort);
 1100                 }
 1101                 break;
 1102         case DRV_TLV_SCSI_CHECK_CONDITION_1_RECEIVED_SK_ASC_ASCQ:
 1103         case DRV_TLV_SCSI_CHECK_CONDITION_2_RECEIVED_SK_ASC_ASCQ:
 1104         case DRV_TLV_SCSI_CHECK_CONDITION_3_RECEIVED_SK_ASC_ASCQ:
 1105         case DRV_TLV_SCSI_CHECK_CONDITION_4_RECEIVED_SK_ASC_ASCQ:
 1106         case DRV_TLV_SCSI_CHECK_CONDITION_5_RECEIVED_SK_ASC_ASCQ:
 1107         {
 1108                 u8 idx = (p_tlv->tlv_type -
 1109                           DRV_TLV_SCSI_CHECK_CONDITION_1_RECEIVED_SK_ASC_ASCQ) / 2;
 1110 
 1111                 if (p_drv_buf->scsi_rx_chk_set[idx]) {
 1112                         p_buf->p_val = (u8 *)&p_drv_buf->scsi_rx_chk[idx];
 1113                         return sizeof(p_drv_buf->scsi_rx_chk[idx]);
 1114                 }
 1115                 break;
 1116         }
 1117         case DRV_TLV_SCSI_CHECK_1_TIMESTAMP:
 1118         case DRV_TLV_SCSI_CHECK_2_TIMESTAMP:
 1119         case DRV_TLV_SCSI_CHECK_3_TIMESTAMP:
 1120         case DRV_TLV_SCSI_CHECK_4_TIMESTAMP:
 1121         case DRV_TLV_SCSI_CHECK_5_TIMESTAMP:
 1122         {
 1123                 u8 idx = (p_tlv->tlv_type -
 1124                           DRV_TLV_SCSI_CHECK_1_TIMESTAMP) / 2;
 1125 
 1126                 return ecore_mfw_get_tlv_time_value(&p_drv_buf->scsi_chk_tstamp[idx],
 1127                                                     p_buf);
 1128         }
 1129 
 1130         default:
 1131                 break;
 1132         }
 1133 
 1134         return -1;
 1135 }
 1136 
 1137 static int
 1138 ecore_mfw_get_iscsi_tlv_value(struct ecore_drv_tlv_hdr *p_tlv,
 1139                               struct ecore_mfw_tlv_iscsi *p_drv_buf,
 1140                               struct ecore_tlv_parsed_buf *p_buf)
 1141 {
 1142         switch (p_tlv->tlv_type) {
 1143         case DRV_TLV_TARGET_LLMNR_ENABLED:
 1144                 if (p_drv_buf->target_llmnr_set) {
 1145                         p_buf->p_val = (u8 *)&p_drv_buf->target_llmnr;
 1146                         return sizeof(p_drv_buf->target_llmnr);
 1147                 }
 1148                 break;
 1149         case DRV_TLV_HEADER_DIGEST_FLAG_ENABLED:
 1150                 if (p_drv_buf->header_digest_set) {
 1151                         p_buf->p_val = (u8 *)&p_drv_buf->header_digest;
 1152                         return sizeof(p_drv_buf->header_digest);
 1153                 }
 1154                 break;
 1155         case DRV_TLV_DATA_DIGEST_FLAG_ENABLED:
 1156                 if (p_drv_buf->data_digest_set) {
 1157                         p_buf->p_val = (u8 *)&p_drv_buf->data_digest;
 1158                         return sizeof(p_drv_buf->data_digest);
 1159                 }
 1160                 break;
 1161         case DRV_TLV_AUTHENTICATION_METHOD:
 1162                 if (p_drv_buf->auth_method_set) {
 1163                         p_buf->p_val = (u8 *)&p_drv_buf->auth_method;
 1164                         return sizeof(p_drv_buf->auth_method);
 1165                 }
 1166                 break;
 1167         case DRV_TLV_ISCSI_BOOT_TARGET_PORTAL:
 1168                 if (p_drv_buf->boot_taget_portal_set) {
 1169                         p_buf->p_val = (u8 *)&p_drv_buf->boot_taget_portal;
 1170                         return sizeof(p_drv_buf->boot_taget_portal);
 1171                 }
 1172                 break;
 1173         case DRV_TLV_MAX_FRAME_SIZE:
 1174                 if (p_drv_buf->frame_size_set) {
 1175                         p_buf->p_val = (u8 *)&p_drv_buf->frame_size;
 1176                         return sizeof(p_drv_buf->frame_size);
 1177                 }
 1178                 break;
 1179         case DRV_TLV_PDU_TX_DESCRIPTORS_QUEUE_SIZE:
 1180                 if (p_drv_buf->tx_desc_size_set) {
 1181                         p_buf->p_val = (u8 *)&p_drv_buf->tx_desc_size;
 1182                         return sizeof(p_drv_buf->tx_desc_size);
 1183                 }
 1184                 break;
 1185         case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_SIZE:
 1186                 if (p_drv_buf->rx_desc_size_set) {
 1187                         p_buf->p_val = (u8 *)&p_drv_buf->rx_desc_size;
 1188                         return sizeof(p_drv_buf->rx_desc_size);
 1189                 }
 1190                 break;
 1191         case DRV_TLV_ISCSI_BOOT_PROGRESS:
 1192                 if (p_drv_buf->boot_progress_set) {
 1193                         p_buf->p_val = (u8 *)&p_drv_buf->boot_progress;
 1194                         return sizeof(p_drv_buf->boot_progress);
 1195                 }
 1196                 break;
 1197         case DRV_TLV_PDU_TX_DESCRIPTOR_QUEUE_AVG_DEPTH:
 1198                 if (p_drv_buf->tx_desc_qdepth_set) {
 1199                         p_buf->p_val = (u8 *)&p_drv_buf->tx_desc_qdepth;
 1200                         return sizeof(p_drv_buf->tx_desc_qdepth);
 1201                 }
 1202                 break;
 1203         case DRV_TLV_PDU_RX_DESCRIPTORS_QUEUE_AVG_DEPTH:
 1204                 if (p_drv_buf->rx_desc_qdepth_set) {
 1205                         p_buf->p_val = (u8 *)&p_drv_buf->rx_desc_qdepth;
 1206                         return sizeof(p_drv_buf->rx_desc_qdepth);
 1207                 }
 1208                 break;
 1209         case DRV_TLV_ISCSI_PDU_RX_FRAMES_RECEIVED:
 1210                 if (p_drv_buf->rx_frames_set) {
 1211                         p_buf->p_val = (u8 *)&p_drv_buf->rx_frames;
 1212                         return sizeof(p_drv_buf->rx_frames);
 1213                 }
 1214                 break;
 1215         case DRV_TLV_ISCSI_PDU_RX_BYTES_RECEIVED:
 1216                 if (p_drv_buf->rx_bytes_set) {
 1217                         p_buf->p_val = (u8 *)&p_drv_buf->rx_bytes;
 1218                         return sizeof(p_drv_buf->rx_bytes);
 1219                 }
 1220                 break;
 1221         case DRV_TLV_ISCSI_PDU_TX_FRAMES_SENT:
 1222                 if (p_drv_buf->tx_frames_set) {
 1223                         p_buf->p_val = (u8 *)&p_drv_buf->tx_frames;
 1224                         return sizeof(p_drv_buf->tx_frames);
 1225                 }
 1226                 break;
 1227         case DRV_TLV_ISCSI_PDU_TX_BYTES_SENT:
 1228                 if (p_drv_buf->tx_bytes_set) {
 1229                         p_buf->p_val = (u8 *)&p_drv_buf->tx_bytes;
 1230                         return sizeof(p_drv_buf->tx_bytes);
 1231                 }
 1232                 break;
 1233         default:
 1234                 break;
 1235         }
 1236 
 1237         return -1;
 1238 }
 1239 
 1240 static enum _ecore_status_t ecore_mfw_update_tlvs(struct ecore_hwfn *p_hwfn,
 1241                                                   u8 tlv_group, u8 *p_mfw_buf,
 1242                                                   u32 size)
 1243 {
 1244         union ecore_mfw_tlv_data *p_tlv_data;
 1245         struct ecore_tlv_parsed_buf buffer;
 1246         struct ecore_drv_tlv_hdr tlv;
 1247         u32 offset;
 1248         int len;
 1249         u8 *p_tlv;
 1250 
 1251         p_tlv_data = OSAL_VZALLOC(p_hwfn->p_dev, sizeof(*p_tlv_data));
 1252         if (!p_tlv_data)
 1253                 return ECORE_NOMEM;
 1254 
 1255         if (OSAL_MFW_FILL_TLV_DATA(p_hwfn,tlv_group, p_tlv_data)) {
 1256                 OSAL_VFREE(p_hwfn->p_dev, p_tlv_data);
 1257                 return ECORE_INVAL;
 1258         }
 1259 
 1260         OSAL_MEMSET(&tlv, 0, sizeof(tlv));
 1261         for (offset = 0; offset < size;
 1262              offset += sizeof(tlv) + sizeof(u32) * tlv.tlv_length) {
 1263                 p_tlv = &p_mfw_buf[offset];
 1264                 tlv.tlv_type = TLV_TYPE(p_tlv);
 1265                 tlv.tlv_length = TLV_LENGTH(p_tlv);
 1266                 tlv.tlv_flags = TLV_FLAGS(p_tlv);
 1267 
 1268                 DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
 1269                            "Type %d length = %d flags = 0x%x\n", tlv.tlv_type,
 1270                            tlv.tlv_length, tlv.tlv_flags);
 1271 
 1272                 if (tlv_group == ECORE_MFW_TLV_GENERIC)
 1273                         len = ecore_mfw_get_gen_tlv_value(&tlv, &p_tlv_data->generic, &buffer);
 1274                 else if (tlv_group == ECORE_MFW_TLV_ETH)
 1275                         len = ecore_mfw_get_eth_tlv_value(&tlv, &p_tlv_data->eth, &buffer);
 1276                 else if (tlv_group == ECORE_MFW_TLV_FCOE)
 1277                         len = ecore_mfw_get_fcoe_tlv_value(&tlv, &p_tlv_data->fcoe, &buffer);
 1278                 else
 1279                         len = ecore_mfw_get_iscsi_tlv_value(&tlv, &p_tlv_data->iscsi, &buffer);
 1280 
 1281                 if (len > 0) {
 1282                         OSAL_WARN(len > 4 * tlv.tlv_length,
 1283                                   "Incorrect MFW TLV length %d, it shouldn't be greater than %d\n",
 1284                                   len, 4 * tlv.tlv_length);
 1285                         len = OSAL_MIN_T(int, len, 4 * tlv.tlv_length);
 1286                         tlv.tlv_flags |= ECORE_DRV_TLV_FLAGS_CHANGED;
 1287                         TLV_FLAGS(p_tlv) = tlv.tlv_flags;
 1288                         OSAL_MEMCPY(p_mfw_buf + offset + sizeof(tlv),
 1289                                     buffer.p_val, len);
 1290                 }
 1291         }
 1292 
 1293         OSAL_VFREE(p_hwfn->p_dev, p_tlv_data);
 1294 
 1295         return ECORE_SUCCESS;
 1296 }
 1297 
 1298 enum _ecore_status_t
 1299 ecore_mfw_process_tlv_req(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt)
 1300 {
 1301         u32 addr, size, offset, resp, param, val;
 1302         u8 tlv_group = 0, id, *p_mfw_buf = OSAL_NULL, *p_temp;
 1303         u32 global_offsize, global_addr;
 1304         enum _ecore_status_t rc;
 1305         struct ecore_drv_tlv_hdr tlv;
 1306 
 1307         addr = SECTION_OFFSIZE_ADDR(p_hwfn->mcp_info->public_base,
 1308                                     PUBLIC_GLOBAL);
 1309         global_offsize = ecore_rd(p_hwfn, p_ptt, addr);
 1310         global_addr = SECTION_ADDR(global_offsize, 0);
 1311         addr = global_addr + OFFSETOF(struct public_global, data_ptr); 
 1312         addr = ecore_rd(p_hwfn, p_ptt, addr);
 1313         size = ecore_rd(p_hwfn, p_ptt, global_addr +
 1314                         OFFSETOF(struct public_global, data_size));
 1315 
 1316         if (!size) {
 1317                 DP_NOTICE(p_hwfn, false, "Invalid TLV req size = %d\n", size);
 1318                 goto drv_done;
 1319         }
 1320 
 1321         p_mfw_buf = (void *)OSAL_VZALLOC(p_hwfn->p_dev, size);
 1322         if (!p_mfw_buf) {
 1323                 DP_NOTICE(p_hwfn, false, "Failed allocate memory for p_mfw_buf\n");
 1324                 goto drv_done;
 1325         }
 1326 
 1327         /* Read the TLV request to local buffer. MFW represents the TLV in
 1328          * little endian format and mcp returns it bigendian format. Hence
 1329          * driver need to convert data to little endian first and then do the
 1330          * memcpy (casting) to preserve the MFW TLV format in the driver buffer.
 1331          *
 1332          */
 1333         for (offset = 0; offset < size; offset += sizeof(u32)) {
 1334                 val = ecore_rd(p_hwfn, p_ptt, addr + offset);
 1335                 val = OSAL_BE32_TO_CPU(val);
 1336                 OSAL_MEMCPY(&p_mfw_buf[offset], &val, sizeof(u32));
 1337         }
 1338 
 1339         /* Parse the headers to enumerate the requested TLV groups */
 1340         for (offset = 0; offset < size; 
 1341              offset += sizeof(tlv) + sizeof(u32) * tlv.tlv_length) {
 1342                 p_temp = &p_mfw_buf[offset];
 1343                 tlv.tlv_type = TLV_TYPE(p_temp);
 1344                 tlv.tlv_length = TLV_LENGTH(p_temp);
 1345                 if (ecore_mfw_get_tlv_group(tlv.tlv_type, &tlv_group))
 1346                         DP_VERBOSE(p_hwfn, ECORE_MSG_DRV,
 1347                                    "Un recognized TLV %d\n", tlv.tlv_type);
 1348         }
 1349 
 1350         /* Sanitize the TLV groups according to personality */
 1351         if ((tlv_group & ECORE_MFW_TLV_FCOE)  &&
 1352             p_hwfn->hw_info.personality != ECORE_PCI_FCOE) {
 1353                 DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
 1354                            "Skipping FCoE TLVs for non-FCoE function\n");
 1355                 tlv_group &= ~ECORE_MFW_TLV_FCOE;
 1356         }
 1357 
 1358         if ((tlv_group & ECORE_MFW_TLV_ISCSI) &&
 1359             p_hwfn->hw_info.personality != ECORE_PCI_ISCSI) {
 1360                 DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
 1361                            "Skipping iSCSI TLVs for non-iSCSI function\n");
 1362                 tlv_group &= ~ECORE_MFW_TLV_ISCSI;
 1363         }
 1364 
 1365         if ((tlv_group & ECORE_MFW_TLV_ETH) &&
 1366             !ECORE_IS_L2_PERSONALITY(p_hwfn)) {
 1367                 DP_VERBOSE(p_hwfn, ECORE_MSG_SP,
 1368                            "Skipping L2 TLVs for non-L2 function\n");
 1369                 tlv_group &= ~ECORE_MFW_TLV_ETH;
 1370         }
 1371 
 1372         /* Update the TLV values in the local buffer */
 1373         for (id = ECORE_MFW_TLV_GENERIC; id < ECORE_MFW_TLV_MAX; id <<= 1) {
 1374                 if (tlv_group & id) {
 1375                         if (ecore_mfw_update_tlvs(p_hwfn, id, p_mfw_buf, size))
 1376                                 goto drv_done;
 1377                 }
 1378         }
 1379 
 1380         /* Write the TLV data to shared memory. The stream of 4 bytes first need
 1381          * to be mem-copied to u32 element to make it as LSB format. And then
 1382          * converted to big endian as required by mcp-write.
 1383          */
 1384         for (offset = 0; offset < size; offset += sizeof(u32)) {
 1385                 OSAL_MEMCPY(&val, &p_mfw_buf[offset], sizeof(u32));
 1386                 val = OSAL_CPU_TO_BE32(val);
 1387                 ecore_wr(p_hwfn, p_ptt, addr + offset, val);
 1388         }
 1389 
 1390 drv_done:
 1391         rc = ecore_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_GET_TLV_DONE, 0, &resp,
 1392                            &param);
 1393 
 1394         OSAL_VFREE(p_hwfn->p_dev, p_mfw_buf);
 1395 
 1396         return rc;
 1397 }

Cache object: 0284a8ddbb1c974eb478b14620e8d3fe


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.