rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc),
                                      SMC_CLC_DECLINE);
-               return rc;
+               return rc == -EAGAIN ? SMC_CLC_DECL_TIMEOUT_CL : rc;
        }
 
        if (link->llc_confirm_rc)
 
                rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc),
                                      SMC_CLC_DECLINE);
-               return rc;
+               return rc == -EAGAIN ? SMC_CLC_DECL_TIMEOUT_AL : rc;
        }
 
        /* send add link reject message, only one link supported for now */
 
                rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc),
                                      SMC_CLC_DECLINE);
-               return rc;
+               return rc == -EAGAIN ? SMC_CLC_DECL_TIMEOUT_CL : rc;
        }
 
        if (link->llc_confirm_resp_rc)
 
                rc = smc_clc_wait_msg(smc, &dclc, sizeof(dclc),
                                      SMC_CLC_DECLINE);
-               return rc;
+               return rc == -EAGAIN ? SMC_CLC_DECL_TIMEOUT_AL : rc;
        }
 
        smc_llc_link_active(link, net->ipv4.sysctl_tcp_keepalive_time);
 
        }
        if (clc_sk->sk_err) {
                reason_code = -clc_sk->sk_err;
-               smc->sk.sk_err = clc_sk->sk_err;
+               if (clc_sk->sk_err == EAGAIN &&
+                   expected_type == SMC_CLC_DECLINE)
+                       clc_sk->sk_err = 0; /* reset for fallback usage */
+               else
+                       smc->sk.sk_err = clc_sk->sk_err;
                goto out;
        }
        if (!len) { /* peer has performed orderly shutdown */
                goto out;
        }
        if (len < 0) {
-               smc->sk.sk_err = -len;
+               if (len != -EAGAIN || expected_type != SMC_CLC_DECLINE)
+                       smc->sk.sk_err = -len;
                reason_code = len;
                goto out;
        }