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