int (*reset_vlan_required)(struct smcd_dev *dev);
        int (*signal_event)(struct smcd_dev *dev, struct smcd_gid *rgid,
                            u32 trigger_irq, u32 event_code, u64 info);
+       int (*support_dmb_nocopy)(struct smcd_dev *dev);
+       int (*attach_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb);
+       int (*detach_dmb)(struct smcd_dev *dev, u64 token);
 };
 
 struct smcd_dev {
 
        return rc;
 }
 
+bool smc_ism_support_dmb_nocopy(struct smcd_dev *smcd)
+{
+       /* for now only loopback-ism supports
+        * merging sndbuf with peer DMB to avoid
+        * data copies between them.
+        */
+       return (smcd->ops->support_dmb_nocopy &&
+               smcd->ops->support_dmb_nocopy(smcd));
+}
+
+int smc_ism_attach_dmb(struct smcd_dev *dev, u64 token,
+                      struct smc_buf_desc *dmb_desc)
+{
+       struct smcd_dmb dmb;
+       int rc = 0;
+
+       if (!dev->ops->attach_dmb)
+               return -EINVAL;
+
+       memset(&dmb, 0, sizeof(dmb));
+       dmb.dmb_tok = token;
+       rc = dev->ops->attach_dmb(dev, &dmb);
+       if (!rc) {
+               dmb_desc->sba_idx = dmb.sba_idx;
+               dmb_desc->token = dmb.dmb_tok;
+               dmb_desc->cpu_addr = dmb.cpu_addr;
+               dmb_desc->dma_addr = dmb.dma_addr;
+               dmb_desc->len = dmb.dmb_len;
+       }
+       return rc;
+}
+
+int smc_ism_detach_dmb(struct smcd_dev *dev, u64 token)
+{
+       if (!dev->ops->detach_dmb)
+               return -EINVAL;
+
+       return dev->ops->detach_dmb(dev, token);
+}
+
 static int smc_nl_handle_smcd_dev(struct smcd_dev *smcd,
                                  struct sk_buff *skb,
                                  struct netlink_callback *cb)
 
 int smc_ism_register_dmb(struct smc_link_group *lgr, int buf_size,
                         struct smc_buf_desc *dmb_desc);
 int smc_ism_unregister_dmb(struct smcd_dev *dev, struct smc_buf_desc *dmb_desc);
+bool smc_ism_support_dmb_nocopy(struct smcd_dev *smcd);
+int smc_ism_attach_dmb(struct smcd_dev *dev, u64 token,
+                      struct smc_buf_desc *dmb_desc);
+int smc_ism_detach_dmb(struct smcd_dev *dev, u64 token);
 int smc_ism_signal_shutdown(struct smc_link_group *lgr);
 void smc_ism_get_system_eid(u8 **eid);
 u16 smc_ism_get_chid(struct smcd_dev *dev);