unsigned int i = 0U;
                u16 hdr_len;
 
-               if (buff->is_error)
-                       continue;
-
                if (buff->is_cleaned)
                        continue;
 
                if (!buff->is_eop) {
-                       for (next_ = buff->next,
-                            buff_ = &self->buff_ring[next_]; true;
-                            next_ = buff_->next,
-                            buff_ = &self->buff_ring[next_]) {
+                       buff_ = buff;
+                       do {
+                               next_ = buff_->next,
+                               buff_ = &self->buff_ring[next_];
                                is_rsc_completed =
                                        aq_ring_dx_in_range(self->sw_head,
                                                            next_,
                                                            self->hw_head);
 
-                               if (unlikely(!is_rsc_completed)) {
-                                       is_rsc_completed = false;
+                               if (unlikely(!is_rsc_completed))
                                        break;
-                               }
 
-                               if (buff_->is_eop)
-                                       break;
-                       }
+                               buff->is_error |= buff_->is_error;
+
+                       } while (!buff_->is_eop);
 
                        if (!is_rsc_completed) {
                                err = 0;
                                goto err_exit;
                        }
+                       if (buff->is_error) {
+                               buff_ = buff;
+                               do {
+                                       next_ = buff_->next,
+                                       buff_ = &self->buff_ring[next_];
+
+                                       buff_->is_cleaned = true;
+                               } while (!buff_->is_eop);
+
+                               ++self->stats.rx.errors;
+                               continue;
+                       }
+               }
+
+               if (buff->is_error) {
+                       ++self->stats.rx.errors;
+                       continue;
                }
 
                dma_sync_single_range_for_cpu(aq_nic_get_dev(self->aq_nic),
                                                        AQ_CFG_RX_FRAME_MAX);
                                        page_ref_inc(buff_->rxdata.page);
                                        buff_->is_cleaned = 1;
+
+                                       buff->is_ip_cso &= buff_->is_ip_cso;
+                                       buff->is_udp_cso &= buff_->is_udp_cso;
+                                       buff->is_tcp_cso &= buff_->is_tcp_cso;
+                                       buff->is_cso_err |= buff_->is_cso_err;
+
                                } while (!buff_->is_eop);
                        }
                }