struct qed_eth_cb_ops;
 struct qed_dev_info;
+union qed_mcp_protocol_stats;
+enum qed_mcp_protocol_type;
 
 /* helpers */
 static inline u32 qed_db_addr(u32 cid, u32 DEMS)
 u32 qed_unzip_data(struct qed_hwfn *p_hwfn,
                   u32 input_len, u8 *input_buf,
                   u32 max_size, u8 *unzip_buf);
-
+void qed_get_protocol_stats(struct qed_dev *cdev,
+                           enum qed_mcp_protocol_type type,
+                           union qed_mcp_protocol_stats *stats);
 int qed_slowpath_irq_req(struct qed_hwfn *hwfn);
 
 #endif /* _QED_H */
 
 #define DRV_MSG_CODE_MCP_RESET                 0x00090000
 #define DRV_MSG_CODE_SET_VERSION               0x000f0000
 
+#define DRV_MSG_CODE_GET_STATS                  0x00130000
+#define DRV_MSG_CODE_STATS_TYPE_LAN             1
+#define DRV_MSG_CODE_STATS_TYPE_FCOE            2
+#define DRV_MSG_CODE_STATS_TYPE_ISCSI           3
+#define DRV_MSG_CODE_STATS_TYPE_RDMA            4
+
 #define DRV_MSG_CODE_BIST_TEST                 0x001e0000
 #define DRV_MSG_CODE_SET_LED_MODE              0x00200000
 
        MFW_DRV_MSG_RESERVED4,
        MFW_DRV_MSG_BW_UPDATE,
        MFW_DRV_MSG_BW_UPDATE5,
-       MFW_DRV_MSG_BW_UPDATE6,
-       MFW_DRV_MSG_BW_UPDATE7,
-       MFW_DRV_MSG_BW_UPDATE8,
-       MFW_DRV_MSG_BW_UPDATE9,
+       MFW_DRV_MSG_GET_LAN_STATS,
+       MFW_DRV_MSG_GET_FCOE_STATS,
+       MFW_DRV_MSG_GET_ISCSI_STATS,
+       MFW_DRV_MSG_GET_RDMA_STATS,
        MFW_DRV_MSG_BW_UPDATE10,
        MFW_DRV_MSG_TRANSCEIVER_STATE_CHANGE,
        MFW_DRV_MSG_BW_UPDATE11,
 
                            enum spq_mode comp_mode,
                            struct qed_spq_comp_cb *p_comp_data);
 
+void qed_get_vport_stats(struct qed_dev *cdev, struct qed_eth_stats *stats);
+
 int qed_sp_eth_vport_start(struct qed_hwfn *p_hwfn,
                           struct qed_sp_vport_start_params *p_params);
 
 
        .set_coalesce = &qed_set_coalesce,
        .set_led = &qed_set_led,
 };
+
+void qed_get_protocol_stats(struct qed_dev *cdev,
+                           enum qed_mcp_protocol_type type,
+                           union qed_mcp_protocol_stats *stats)
+{
+       struct qed_eth_stats eth_stats;
+
+       memset(stats, 0, sizeof(*stats));
+
+       switch (type) {
+       case QED_MCP_LAN_STATS:
+               qed_get_vport_stats(cdev, ð_stats);
+               stats->lan_stats.ucast_rx_pkts = eth_stats.rx_ucast_pkts;
+               stats->lan_stats.ucast_tx_pkts = eth_stats.tx_ucast_pkts;
+               stats->lan_stats.fcs_err = -1;
+               break;
+       default:
+               DP_ERR(cdev, "Invalid protocol type = %d\n", type);
+               return;
+       }
+}
 
        return 0;
 }
 
+static void qed_mcp_send_protocol_stats(struct qed_hwfn *p_hwfn,
+                                       struct qed_ptt *p_ptt,
+                                       enum MFW_DRV_MSG_TYPE type)
+{
+       enum qed_mcp_protocol_type stats_type;
+       union qed_mcp_protocol_stats stats;
+       struct qed_mcp_mb_params mb_params;
+       union drv_union_data union_data;
+       u32 hsi_param;
+
+       switch (type) {
+       case MFW_DRV_MSG_GET_LAN_STATS:
+               stats_type = QED_MCP_LAN_STATS;
+               hsi_param = DRV_MSG_CODE_STATS_TYPE_LAN;
+               break;
+       case MFW_DRV_MSG_GET_FCOE_STATS:
+               stats_type = QED_MCP_FCOE_STATS;
+               hsi_param = DRV_MSG_CODE_STATS_TYPE_FCOE;
+               break;
+       case MFW_DRV_MSG_GET_ISCSI_STATS:
+               stats_type = QED_MCP_ISCSI_STATS;
+               hsi_param = DRV_MSG_CODE_STATS_TYPE_ISCSI;
+               break;
+       case MFW_DRV_MSG_GET_RDMA_STATS:
+               stats_type = QED_MCP_RDMA_STATS;
+               hsi_param = DRV_MSG_CODE_STATS_TYPE_RDMA;
+               break;
+       default:
+               DP_NOTICE(p_hwfn, "Invalid protocol type %d\n", type);
+               return;
+       }
+
+       qed_get_protocol_stats(p_hwfn->cdev, stats_type, &stats);
+
+       memset(&mb_params, 0, sizeof(mb_params));
+       mb_params.cmd = DRV_MSG_CODE_GET_STATS;
+       mb_params.param = hsi_param;
+       memcpy(&union_data, &stats, sizeof(stats));
+       mb_params.p_data_src = &union_data;
+       qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params);
+}
+
 static void qed_read_pf_bandwidth(struct qed_hwfn *p_hwfn,
                                  struct public_func *p_shmem_info)
 {
                case MFW_DRV_MSG_TRANSCEIVER_STATE_CHANGE:
                        qed_mcp_handle_transceiver_change(p_hwfn, p_ptt);
                        break;
+               case MFW_DRV_MSG_GET_LAN_STATS:
+               case MFW_DRV_MSG_GET_FCOE_STATS:
+               case MFW_DRV_MSG_GET_ISCSI_STATS:
+               case MFW_DRV_MSG_GET_RDMA_STATS:
+                       qed_mcp_send_protocol_stats(p_hwfn, p_ptt, i);
+                       break;
                case MFW_DRV_MSG_BW_UPDATE:
                        qed_mcp_update_bw(p_hwfn, p_ptt);
                        break;
 
        u8      name[MCP_DRV_VER_STR_SIZE - 4];
 };
 
+struct qed_mcp_lan_stats {
+       u64 ucast_rx_pkts;
+       u64 ucast_tx_pkts;
+       u32 fcs_err;
+};
+
+struct qed_mcp_fcoe_stats {
+       u64 rx_pkts;
+       u64 tx_pkts;
+       u32 fcs_err;
+       u32 login_failure;
+};
+
+struct qed_mcp_iscsi_stats {
+       u64 rx_pdus;
+       u64 tx_pdus;
+       u64 rx_bytes;
+       u64 tx_bytes;
+};
+
+struct qed_mcp_rdma_stats {
+       u64 rx_pkts;
+       u64 tx_pkts;
+       u64 rx_bytes;
+       u64 tx_byts;
+};
+
+enum qed_mcp_protocol_type {
+       QED_MCP_LAN_STATS,
+       QED_MCP_FCOE_STATS,
+       QED_MCP_ISCSI_STATS,
+       QED_MCP_RDMA_STATS
+};
+
+union qed_mcp_protocol_stats {
+       struct qed_mcp_lan_stats lan_stats;
+       struct qed_mcp_fcoe_stats fcoe_stats;
+       struct qed_mcp_iscsi_stats iscsi_stats;
+       struct qed_mcp_rdma_stats rdma_stats;
+};
+
 /**
  * @brief - returns the link params of the hw function
  *