trace_nvme_complete_rq(req);
 
+       if (nvme_req(req)->ctrl->kas)
+               nvme_req(req)->ctrl->comp_seen = true;
+
        if (unlikely(status != BLK_STS_OK && nvme_req_needs_retry(req))) {
                if ((req->cmd_flags & REQ_NVME_MPATH) &&
                    blk_path_error(status)) {
                return;
        }
 
+       ctrl->comp_seen = false;
        schedule_delayed_work(&ctrl->ka_work, ctrl->kato * HZ);
 }
 
 {
        struct nvme_ctrl *ctrl = container_of(to_delayed_work(work),
                        struct nvme_ctrl, ka_work);
+       bool comp_seen = ctrl->comp_seen;
+
+       if ((ctrl->ctratt & NVME_CTRL_ATTR_TBKAS) && comp_seen) {
+               dev_dbg(ctrl->device,
+                       "reschedule traffic based keep-alive timer\n");
+               ctrl->comp_seen = false;
+               schedule_delayed_work(&ctrl->ka_work, ctrl->kato * HZ);
+               return;
+       }
 
        if (nvme_keep_alive(ctrl)) {
                /* allocation failure, reset the controller */