Skip to content

Commit

Permalink
net: aquantia: check rx csum for all packets in LRO session
Browse files Browse the repository at this point in the history
Atlantic hardware does not aggregate nor breaks LRO sessions
with bad csum packets. This means driver should take care of that.

If in LRO session there is a non-first descriptor with invalid
checksum (L2/L3/L4), the driver must account this information
in csum application logic.

Fixes: 018423e ("net: ethernet: aquantia: Add ring support code")
Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com>
Signed-off-by: Dmitry Bogdanov <dmitry.bogdanov@aquantia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Dmitry Bogdanov authored and David S. Miller committed May 27, 2019
1 parent 31bafc4 commit f38f1ee
Showing 1 changed file with 31 additions and 13 deletions.
44 changes: 31 additions & 13 deletions drivers/net/ethernet/aquantia/atlantic/aq_ring.c
Original file line number Diff line number Diff line change
Expand Up @@ -299,35 +299,47 @@ int aq_ring_rx_clean(struct aq_ring_s *self,
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),
Expand Down Expand Up @@ -390,6 +402,12 @@ int aq_ring_rx_clean(struct aq_ring_s *self,
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);
}
}
Expand Down

0 comments on commit f38f1ee

Please sign in to comment.