get_device(&ini->ib_dev->ibdev->dev);
        atomic_inc(&ini->ib_dev->lnk_cnt);
-       lnk->state = SMC_LNK_ACTIVATING;
        lnk->link_id = smcr_next_link_id(lgr);
        lnk->lgr = lgr;
        lnk->link_idx = link_idx;
        rc = smc_wr_create_link(lnk);
        if (rc)
                goto destroy_qp;
+       lnk->state = SMC_LNK_ACTIVATING;
        return 0;
 
 destroy_qp:
        smc_wr_wakeup_tx_wait(from_lnk);
 
        for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
-               if (lgr->lnk[i].state != SMC_LNK_ACTIVE ||
-                   i == from_lnk->link_idx)
+               if (!smc_link_active(&lgr->lnk[i]) || i == from_lnk->link_idx)
                        continue;
                if (is_dev_err && from_lnk->smcibdev == lgr->lnk[i].smcibdev &&
                    from_lnk->ibport == lgr->lnk[i].ibport) {
                return false;
 
        for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
-               if (lgr->lnk[i].state != SMC_LNK_ACTIVE)
+               if (!smc_link_active(&lgr->lnk[i]))
                        continue;
                if ((lgr->role == SMC_SERV || lgr->lnk[i].peer_qpn == clcqpn) &&
                    !memcmp(lgr->lnk[i].peer_gid, &lcl->gid, SMC_GID_SIZE) &&
 
 void smc_sndbuf_sync_sg_for_cpu(struct smc_connection *conn)
 {
-       if (!conn->lgr || conn->lgr->is_smcd || !smc_link_usable(conn->lnk))
+       if (!conn->lgr || conn->lgr->is_smcd || !smc_link_active(conn->lnk))
                return;
        smc_ib_sync_sg_for_cpu(conn->lnk, conn->sndbuf_desc, DMA_TO_DEVICE);
 }
 
 void smc_sndbuf_sync_sg_for_device(struct smc_connection *conn)
 {
-       if (!conn->lgr || conn->lgr->is_smcd || !smc_link_usable(conn->lnk))
+       if (!conn->lgr || conn->lgr->is_smcd || !smc_link_active(conn->lnk))
                return;
        smc_ib_sync_sg_for_device(conn->lnk, conn->sndbuf_desc, DMA_TO_DEVICE);
 }
        if (!conn->lgr || conn->lgr->is_smcd)
                return;
        for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
-               if (!smc_link_usable(&conn->lgr->lnk[i]))
+               if (!smc_link_active(&conn->lgr->lnk[i]))
                        continue;
                smc_ib_sync_sg_for_cpu(&conn->lgr->lnk[i], conn->rmb_desc,
                                       DMA_FROM_DEVICE);
        if (!conn->lgr || conn->lgr->is_smcd)
                return;
        for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
-               if (!smc_link_usable(&conn->lgr->lnk[i]))
+               if (!smc_link_active(&conn->lgr->lnk[i]))
                        continue;
                smc_ib_sync_sg_for_device(&conn->lgr->lnk[i], conn->rmb_desc,
                                          DMA_FROM_DEVICE);
 
        rtok_ix = 1;
        for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
                link = &send_link->lgr->lnk[i];
-               if (link->state == SMC_LNK_ACTIVE && link != send_link) {
+               if (smc_link_active(link) && link != send_link) {
                        rkeyllc->rtoken[rtok_ix].link_id = link->link_id;
                        rkeyllc->rtoken[rtok_ix].rmb_key =
                                htonl(rmb_desc->mr_rx[link->link_idx]->rkey);
        int i, link_count = 0;
 
        for (i = 0; i < SMC_LINKS_PER_LGR_MAX; i++) {
-               if (!smc_link_usable(&lgr->lnk[i]))
+               if (!smc_link_active(&lgr->lnk[i]))
                        continue;
                link_count++;
        }
 
        switch (llc_type) {
        case SMC_LLC_TEST_LINK:
-               if (link->state == SMC_LNK_ACTIVE)
+               if (smc_link_active(link))
                        complete(&link->llc_testlink_resp);
                break;
        case SMC_LLC_ADD_LINK:
        u8 user_data[16] = { 0 };
        int rc;
 
-       if (link->state != SMC_LNK_ACTIVE)
+       if (!smc_link_active(link))
                return;         /* don't reschedule worker */
        expire_time = link->wr_rx_tstamp + link->llc_testlink_time;
        if (time_is_after_jiffies(expire_time)) {
        /* receive TEST LINK response over RoCE fabric */
        rc = wait_for_completion_interruptible_timeout(&link->llc_testlink_resp,
                                                       SMC_LLC_WAIT_TIME);
-       if (link->state != SMC_LNK_ACTIVE)
+       if (!smc_link_active(link))
                return;         /* link state changed */
        if (rc <= 0) {
                smcr_link_down_cond_sched(link);