#include <linux/u64_stats_sync.h>
  
  #include "be_hw.h"
+ #include "be_roce.h"
  
 -#define DRV_VER                       "4.2.116u"
 +#define DRV_VER                       "4.2.220u"
  #define DRV_NAME              "be2net"
  #define BE_NAME                       "ServerEngines BladeEngine2 10Gbps NIC"
  #define BE3_NAME              "ServerEngines BladeEngine3 10Gbps NIC"
        u32 rx_fc;              /* Rx flow control */
        u32 tx_fc;              /* Tx flow control */
        bool stats_cmd_sent;
 -      int link_speed;
 -      u8 port_type;
 -      u8 transceiver;
 -      u8 autoneg;
        u8 generation;          /* BladeEngine ASIC generation */
+       u32 if_type;
+       struct {
+               u8 __iomem *base;       /* Door Bell */
+               u32 size;
+               u32 total_size;
+               u64 io_addr;
+       } roce_db;
+       u32 num_msix_roce_vec;
+       struct ocrdma_dev *ocrdma_dev;
+       struct list_head entry;
+ 
        u32 flash_status;
        struct completion flash_compl;
  
  extern void be_parse_stats(struct be_adapter *adapter);
  extern int be_load_fw(struct be_adapter *adapter, u8 *func);
  extern bool be_is_wol_supported(struct be_adapter *adapter);
 +extern bool be_pause_supported(struct be_adapter *adapter);
 +extern u32 be_get_fw_log_level(struct be_adapter *adapter);
  
+ /*
+  * internal function to initialize-cleanup roce device.
+  */
+ extern void be_roce_dev_add(struct be_adapter *);
+ extern void be_roce_dev_remove(struct be_adapter *);
+ 
+ /*
+  * internal function to open-close roce device during ifup-ifdown.
+  */
+ extern void be_roce_dev_open(struct be_adapter *);
+ extern void be_roce_dev_close(struct be_adapter *);
+ 
  #endif                                /* BE_H */
 
        mutex_unlock(&adapter->mbox_lock);
        pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma);
        return status;
 +
 +}
 +int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter,
 +                                 struct be_dma_mem *cmd)
 +{
 +      struct be_mcc_wrb *wrb;
 +      struct be_cmd_req_get_ext_fat_caps *req;
 +      int status;
 +
 +      if (mutex_lock_interruptible(&adapter->mbox_lock))
 +              return -1;
 +
 +      wrb = wrb_from_mbox(adapter);
 +      if (!wrb) {
 +              status = -EBUSY;
 +              goto err;
 +      }
 +
 +      req = cmd->va;
 +      be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
 +                             OPCODE_COMMON_GET_EXT_FAT_CAPABILITES,
 +                             cmd->size, wrb, cmd);
 +      req->parameter_type = cpu_to_le32(1);
 +
 +      status = be_mbox_notify_wait(adapter);
 +err:
 +      mutex_unlock(&adapter->mbox_lock);
 +      return status;
 +}
 +
 +int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter,
 +                                 struct be_dma_mem *cmd,
 +                                 struct be_fat_conf_params *configs)
 +{
 +      struct be_mcc_wrb *wrb;
 +      struct be_cmd_req_set_ext_fat_caps *req;
 +      int status;
 +
 +      spin_lock_bh(&adapter->mcc_lock);
 +
 +      wrb = wrb_from_mccq(adapter);
 +      if (!wrb) {
 +              status = -EBUSY;
 +              goto err;
 +      }
 +
 +      req = cmd->va;
 +      memcpy(&req->set_params, configs, sizeof(struct be_fat_conf_params));
 +      be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
 +                             OPCODE_COMMON_SET_EXT_FAT_CAPABILITES,
 +                             cmd->size, wrb, cmd);
 +
 +      status = be_mcc_notify_wait(adapter);
 +err:
 +      spin_unlock_bh(&adapter->mcc_lock);
 +      return status;
  }
+ 
+ int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
+                       int wrb_payload_size, u16 *cmd_status, u16 *ext_status)
+ {
+       struct be_adapter *adapter = netdev_priv(netdev_handle);
+       struct be_mcc_wrb *wrb;
+       struct be_cmd_req_hdr *hdr = (struct be_cmd_req_hdr *) wrb_payload;
+       struct be_cmd_req_hdr *req;
+       struct be_cmd_resp_hdr *resp;
+       int status;
+ 
+       spin_lock_bh(&adapter->mcc_lock);
+ 
+       wrb = wrb_from_mccq(adapter);
+       if (!wrb) {
+               status = -EBUSY;
+               goto err;
+       }
+       req = embedded_payload(wrb);
+       resp = embedded_payload(wrb);
+ 
+       be_wrb_cmd_hdr_prepare(req, hdr->subsystem,
+                              hdr->opcode, wrb_payload_size, wrb, NULL);
+       memcpy(req, wrb_payload, wrb_payload_size);
+       be_dws_cpu_to_le(req, wrb_payload_size);
+ 
+       status = be_mcc_notify_wait(adapter);
+       if (cmd_status)
+               *cmd_status = (status & 0xffff);
+       if (ext_status)
+               *ext_status = 0;
+       memcpy(wrb_payload, resp, sizeof(*resp) + resp->response_length);
+       be_dws_le_to_cpu(wrb_payload, sizeof(*resp) + resp->response_length);
+ err:
+       spin_unlock_bh(&adapter->mcc_lock);
+       return status;
+ }
+ EXPORT_SYMBOL(be_roce_mcc_cmd);