}
 
        /* Create send and receive buffers */
-       if (smc_buf_create(smc, true))
-               return smc_connect_abort(smc, SMC_CLC_DECL_MEM,
+       rc = smc_buf_create(smc, true);
+       if (rc)
+               return smc_connect_abort(smc, (rc == -ENOSPC) ?
+                                             SMC_CLC_DECL_MAX_DMB :
+                                             SMC_CLC_DECL_MEM,
                                         ini->cln_first_contact);
 
        smc_conn_save_peer_info(smc, aclc);
        }
 
        /* Create send and receive buffers */
-       if (smc_buf_create(new_smc, true)) {
+       rc = smc_buf_create(new_smc, true);
+       if (rc) {
                if (ini->cln_first_contact == SMC_FIRST_CONTACT)
                        smc_lgr_cleanup_early(&new_smc->conn);
                else
                        smc_conn_free(&new_smc->conn);
-               return SMC_CLC_DECL_MEM;
+               return (rc == -ENOSPC) ? SMC_CLC_DECL_MAX_DMB :
+                                        SMC_CLC_DECL_MEM;
        }
 
        return 0;
 
 #define SMC_CLC_DECL_NOACTLINK 0x030a0000  /* no active smc-r link in lgr    */
 #define SMC_CLC_DECL_NOSRVLINK 0x030b0000  /* SMC-R link from srv not found  */
 #define SMC_CLC_DECL_VERSMISMAT        0x030c0000  /* SMC version mismatch           */
+#define SMC_CLC_DECL_MAX_DMB   0x030d0000  /* SMC-D DMB limit exceeded       */
 #define SMC_CLC_DECL_SYNCERR   0x04000000  /* synchronization error          */
 #define SMC_CLC_DECL_PEERDECL  0x05000000  /* peer declined during handshake */
 #define SMC_CLC_DECL_INTERR    0x09990000  /* internal error                 */
 
                rc = smc_ism_register_dmb(lgr, bufsize, buf_desc);
                if (rc) {
                        kfree(buf_desc);
-                       return ERR_PTR(-EAGAIN);
+                       return (rc == -ENOMEM) ? ERR_PTR(-EAGAIN) : ERR_PTR(rc);
                }
                buf_desc->pages = virt_to_page(buf_desc->cpu_addr);
                /* CDC header stored in buf. So, pretend it was smaller */
        }
 
        if (IS_ERR(buf_desc))
-               return -ENOMEM;
+               return PTR_ERR(buf_desc);
 
        if (!is_smcd) {
                if (smcr_buf_map_usable_links(lgr, buf_desc, is_rmb)) {