Author: yongari
Date: Sun Oct 24 21:59:51 2010
New Revision: 214302
URL: http://svn.freebsd.org/changeset/base/214302

Log:
  Add TSO support over VLAN for i82550/i82551. Controller requires
  VLAN hardware tagging to make TSO work over VLAN. So if VLAN
  hardware tagging is disabled explicitly clear TSO over VLAN. While
  I'm here allow disabling VLAN TX checksum offloading.
  
  Tested by:    Liudas < liudasb <> centras dot lt >
  MFC after:    10 days

Modified:
  head/sys/dev/fxp/if_fxp.c

Modified: head/sys/dev/fxp/if_fxp.c
==============================================================================
--- head/sys/dev/fxp/if_fxp.c   Sun Oct 24 21:28:58 2010        (r214301)
+++ head/sys/dev/fxp/if_fxp.c   Sun Oct 24 21:59:51 2010        (r214302)
@@ -862,9 +862,9 @@ fxp_attach(device_t dev)
        ifp->if_capenable |= IFCAP_VLAN_MTU; /* the hw bits already set */
        if ((sc->flags & FXP_FLAG_EXT_RFA) != 0) {
                ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING |
-                   IFCAP_VLAN_HWCSUM;
+                   IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO;
                ifp->if_capenable |= IFCAP_VLAN_HWTAGGING |
-                   IFCAP_VLAN_HWCSUM;
+                   IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO;
        }
 
        /*
@@ -2866,10 +2866,19 @@ fxp_ioctl(struct ifnet *ifp, u_long comm
                        if (ifp->if_flags & IFF_UP)
                                reinit++;
                }
+               if ((mask & IFCAP_VLAN_HWCSUM) != 0 &&
+                   (ifp->if_capabilities & IFCAP_VLAN_HWCSUM) != 0)
+                       ifp->if_capenable ^= IFCAP_VLAN_HWCSUM;
+               if ((mask & IFCAP_VLAN_HWTSO) != 0 &&
+                   (ifp->if_capabilities & IFCAP_VLAN_HWTSO) != 0)
+                       ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
                if ((mask & IFCAP_VLAN_HWTAGGING) != 0 &&
                    (ifp->if_capabilities & IFCAP_VLAN_HWTAGGING) != 0) {
                        ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
-                               reinit++;
+                       if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) == 0)
+                               ifp->if_capenable &=
+                                   ~(IFCAP_VLAN_HWTSO | IFCAP_VLAN_HWCSUM);
+                       reinit++;
                }
                if (reinit > 0 && ifp->if_flags & IFF_UP)
                        fxp_init_body(sc);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to