Author: davidcs
Date: Thu Aug 31 21:56:17 2017
New Revision: 323075
URL: https://svnweb.freebsd.org/changeset/base/323075

Log:
  MFC r322852
  Fix qlnx_tso_check() so that every window of
  (ETH_TX_LSO_WINDOW_BDS_NUM - nbds_in_hdr) has atleast
  ETH_TX_LSO_WINDOW_MIN_LEN bytes
  
  Approved by:re(marius)

Modified:
  stable/10/sys/dev/qlnx/qlnxe/qlnx_os.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/qlnx/qlnxe/qlnx_os.c
==============================================================================
--- stable/10/sys/dev/qlnx/qlnxe/qlnx_os.c      Thu Aug 31 21:37:22 2017        
(r323074)
+++ stable/10/sys/dev/qlnx/qlnxe/qlnx_os.c      Thu Aug 31 21:56:17 2017        
(r323075)
@@ -2921,25 +2921,35 @@ qlnx_tso_check(struct qlnx_fastpath *fp, bus_dma_segme
 {
        int                     i;
        uint32_t                sum, nbds_in_hdr = 1;
-       bus_dma_segment_t       *t_segs = segs;
+       uint32_t                window;
+        bus_dma_segment_t      *s_seg;
 
-       /* count the number of segments spanned by TCP header */
+       /* If the header spans mulitple segments, skip those segments */
 
+       if (nsegs < ETH_TX_LSO_WINDOW_BDS_NUM)
+               return (0);
+
        i = 0;
-       while ((i < nsegs) && (offset > t_segs->ds_len)) {
-               nbds_in_hdr++;
-               offset = offset - t_segs->ds_len;
-               t_segs++;
+
+       while ((i < nsegs) && (offset >= segs->ds_len)) {
+               offset = offset - segs->ds_len;
+               segs++;
                i++;
+               nbds_in_hdr++;
        }
 
-       while (nsegs >= QLNX_MAX_SEGMENTS_NON_TSO) {
+       window = ETH_TX_LSO_WINDOW_BDS_NUM - nbds_in_hdr;
 
+       nsegs = nsegs - i;
+
+       while (nsegs >= window) {
+
                sum = 0;
+               s_seg = segs;
 
-               for (i = 0; i < (ETH_TX_LSO_WINDOW_BDS_NUM - nbds_in_hdr); i++){
-                       sum += segs->ds_len;
-                       segs++;
+               for (i = 0; i < window; i++){
+                       sum += s_seg->ds_len;
+                       s_seg++;
                }
 
                if (sum < ETH_TX_LSO_WINDOW_MIN_LEN) {
@@ -2947,7 +2957,8 @@ qlnx_tso_check(struct qlnx_fastpath *fp, bus_dma_segme
                        return (-1);
                }
 
-               nsegs -= QLNX_MAX_SEGMENTS_NON_TSO;
+               nsegs = nsegs - 1;
+               segs++;
        }
 
        return (0);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to