{
        struct mlx5hws_context *ctx = bwc_matcher->matcher->tbl->ctx;
        struct mlx5hws_matcher *matcher = bwc_matcher->matcher;
-       bool move_error = false, poll_error = false;
        u16 bwc_queues = mlx5hws_bwc_queues(ctx);
        struct mlx5hws_bwc_rule *tmp_bwc_rule;
        struct mlx5hws_rule_attr rule_attr;
        struct mlx5hws_table *isolated_tbl;
+       int move_error = 0, poll_error = 0;
        struct mlx5hws_rule *tmp_rule;
        struct list_head *rules_list;
        u32 expected_completions = 1;
                        ret = mlx5hws_matcher_resize_rule_move(matcher,
                                                               tmp_rule,
                                                               &rule_attr);
-                       if (unlikely(ret && !move_error)) {
-                               mlx5hws_err(ctx,
-                                           "Moving complex BWC rule failed (%d), attempting to move rest of the rules\n",
-                                           ret);
-                               move_error = true;
+                       if (unlikely(ret)) {
+                               if (!move_error) {
+                                       mlx5hws_err(ctx,
+                                                   "Moving complex BWC rule: move failed (%d), attempting to move rest of the rules\n",
+                                                   ret);
+                                       move_error = ret;
+                               }
+                               /* Rule wasn't queued, no need to poll */
+                               continue;
                        }
 
                        expected_completions = 1;
                                                     rule_attr.queue_id,
                                                     &expected_completions,
                                                     true);
-                       if (unlikely(ret && !poll_error)) {
-                               mlx5hws_err(ctx,
-                                           "Moving complex BWC rule: poll failed (%d), attempting to move rest of the rules\n",
-                                           ret);
-                               poll_error = true;
+                       if (unlikely(ret)) {
+                               if (ret == -ETIMEDOUT) {
+                                       mlx5hws_err(ctx,
+                                                   "Moving complex BWC rule: timeout polling for completions (%d), aborting rehash\n",
+                                                   ret);
+                                       return ret;
+                               }
+                               if (!poll_error) {
+                                       mlx5hws_err(ctx,
+                                                   "Moving complex BWC rule: polling for completions failed (%d), attempting to move rest of the rules\n",
+                                                   ret);
+                                       poll_error = ret;
+                               }
                        }
 
                        /* Done moving the rule to the new matcher,
                }
        }
 
-       if (move_error || poll_error)
-               ret = -EINVAL;
+       /* Return the first error that happened */
+       if (unlikely(move_error))
+               return move_error;
+       if (unlikely(poll_error))
+               return poll_error;
 
        return ret;
 }