diff for duplicates of <640295.36173.qm@web37608.mail.mud.yahoo.com> diff --git a/a/1.txt b/N1/1.txt index e7bfdaa..c00321b 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,35 +1,64 @@ -As specified by errata eTSEC49 of MPC8548 and errata eTSEC12 of MPC83xx,=0A= -older revisions of gianfar controllers will be unable to calculate a TCP/UD= -P=0Apacket checksum for some alignments of the appropriate FCB. This patch = -checks=0Afor FCB alignment on such controllers and falls back to software c= -hecksumming=0Aif the alignment is known to be bad.=0A=0ASigned-off-by: Alex= - Dubov <oakad@yahoo.com>=0A---=0AChanges for v2:=0A - Make indentation sl= -ightly more consistent.=0A - Replace bizarre switch-based condition with = -plain boring one.=0A=0A drivers/net/gianfar.c | 16 ++++++++++++++--=0A dr= -ivers/net/gianfar.h | 1 +=0A 2 files changed, 15 insertions(+), 2 deleti= -ons(-)=0A=0Adiff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c=0Ain= -dex 5ed8f9f..3da19a5 100644=0A--- a/drivers/net/gianfar.c=0A+++ b/drivers/n= -et/gianfar.c=0A@@ -950,6 +950,11 @@ static void gfar_detect_errata(struct g= -far_private *priv)=0A =09=09=09(pvr =3D=3D 0x80861010 && (mod & 0xfff9) =3D= -=3D 0x80c0))=0A =09=09priv->errata |=3D GFAR_ERRATA_A002;=0A =0A+=09/* MPC8= -313 Rev < 2.0, MPC8548 rev 2.0 */=0A+=09if ((pvr =3D=3D 0x80850010 && mod = -=3D=3D 0x80b0 && rev < 0x0020) ||=0A+=09=09=09(pvr =3D=3D 0x80210020 && mod= - =3D=3D 0x8030 && rev =3D=3D 0x0020))=0A+=09=09priv->errata |=3D GFAR_ERRAT= -A_12;=0A+=0A =09if (priv->errata)=0A =09=09dev_info(dev, "enabled errata wo= -rkarounds, flags: 0x%x\n",=0A =09=09=09 priv->errata);=0A@@ -2156,8 +2161,1= -5 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev= -)=0A =09/* Set up checksumming */=0A =09if (CHECKSUM_PARTIAL =3D=3D skb->ip= -_summed) {=0A =09=09fcb =3D gfar_add_fcb(skb);=0A-=09=09lstatus |=3D BD_LFL= -AG(TXBD_TOE);=0A-=09=09gfar_tx_checksum(skb, fcb);=0A+=09=09/* as specified= - by errata */=0A+=09=09if (unlikely(gfar_has_errata(priv, GFAR_ERRATA_12)= -=0A+=09=09=09 && ((unsigned long)fcb % 0x20) > 0x18)) {=0A+=09=09=09__s= -kb_pull(skb, GMAC_FCB_LEN);=0A+=09=09=09skb_checksum_help(skb);=0A+=09=09} = -else {=0A+=09=09=09lstatus |=3D BD_LFLAG(TXBD_TOE);=0A+=09=09=09gfar_tx_che= -cksum(skb, fcb);=0A+=09=09}=0A =09}=0A =0A =09if (vlan_tx_tag_present(skb))= - {=0Adiff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h=0Aindex 54d= -e413..ec5d595 100644=0A--- a/drivers/net/gianfar.h=0A+++ b/drivers/net/gian= -far.h=0A@@ -1039,6 +1039,7 @@ enum gfar_errata {=0A =09GFAR_ERRATA_74=09=09= -=3D 0x01,=0A =09GFAR_ERRATA_76=09=09=3D 0x02,=0A =09GFAR_ERRATA_A002=09=3D = -0x04,=0A+=09GFAR_ERRATA_12=09=09=3D 0x08, /* a.k.a errata eTSEC49 */=0A };= -=0A =0A /* Struct stolen almost completely (and shamelessly) from the FCC e= -net source=0A-- =0A1.7.3.2=0A=0A=0A=0A=0A +As specified by errata eTSEC49 of MPC8548 and errata eTSEC12 of MPC83xx, +older revisions of gianfar controllers will be unable to calculate a TCP/UDP +packet checksum for some alignments of the appropriate FCB. This patch checks +for FCB alignment on such controllers and falls back to software checksumming +if the alignment is known to be bad. + +Signed-off-by: Alex Dubov <oakad@yahoo.com> +--- +Changes for v2: + - Make indentation slightly more consistent. + - Replace bizarre switch-based condition with plain boring one. + + drivers/net/gianfar.c | 16 ++++++++++++++-- + drivers/net/gianfar.h | 1 + + 2 files changed, 15 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c +index 5ed8f9f..3da19a5 100644 +--- a/drivers/net/gianfar.c ++++ b/drivers/net/gianfar.c +@@ -950,6 +950,11 @@ static void gfar_detect_errata(struct gfar_private *priv) + (pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0)) + priv->errata |= GFAR_ERRATA_A002; + ++ /* MPC8313 Rev < 2.0, MPC8548 rev 2.0 */ ++ if ((pvr == 0x80850010 && mod == 0x80b0 && rev < 0x0020) || ++ (pvr == 0x80210020 && mod == 0x8030 && rev == 0x0020)) ++ priv->errata |= GFAR_ERRATA_12; ++ + if (priv->errata) + dev_info(dev, "enabled errata workarounds, flags: 0x%x\n", + priv->errata); +@@ -2156,8 +2161,15 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) + /* Set up checksumming */ + if (CHECKSUM_PARTIAL == skb->ip_summed) { + fcb = gfar_add_fcb(skb); +- lstatus |= BD_LFLAG(TXBD_TOE); +- gfar_tx_checksum(skb, fcb); ++ /* as specified by errata */ ++ if (unlikely(gfar_has_errata(priv, GFAR_ERRATA_12) ++ && ((unsigned long)fcb % 0x20) > 0x18)) { ++ __skb_pull(skb, GMAC_FCB_LEN); ++ skb_checksum_help(skb); ++ } else { ++ lstatus |= BD_LFLAG(TXBD_TOE); ++ gfar_tx_checksum(skb, fcb); ++ } + } + + if (vlan_tx_tag_present(skb)) { +diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h +index 54de413..ec5d595 100644 +--- a/drivers/net/gianfar.h ++++ b/drivers/net/gianfar.h +@@ -1039,6 +1039,7 @@ enum gfar_errata { + GFAR_ERRATA_74 = 0x01, + GFAR_ERRATA_76 = 0x02, + GFAR_ERRATA_A002 = 0x04, ++ GFAR_ERRATA_12 = 0x08, /* a.k.a errata eTSEC49 */ + }; + + /* Struct stolen almost completely (and shamelessly) from the FCC enet source +-- +1.7.3.2 diff --git a/a/content_digest b/N1/content_digest index ceb8df7..c64db10 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -3,46 +3,75 @@ "Subject\0[PATCH v2] gianfar: Fall back to software tcp/udp checksum on older controllers\0" "Date\0Thu, 27 Jan 2011 20:37:48 -0800 (PST)\0" "To\0Anton Vorontsov <cbouatmailru@gmail.com>\0" - "Cc\0netdev@vger.kernel.org" + "Cc\0mlcreech@gmail.com" linuxppc-dev@lists.ozlabs.org davem@davemloft.net - " mlcreech@gmail.com\0" + " netdev@vger.kernel.org\0" "\00:1\0" "b\0" - "As specified by errata eTSEC49 of MPC8548 and errata eTSEC12 of MPC83xx,=0A=\n" - "older revisions of gianfar controllers will be unable to calculate a TCP/UD=\n" - "P=0Apacket checksum for some alignments of the appropriate FCB. This patch =\n" - "checks=0Afor FCB alignment on such controllers and falls back to software c=\n" - "hecksumming=0Aif the alignment is known to be bad.=0A=0ASigned-off-by: Alex=\n" - " Dubov <oakad@yahoo.com>=0A---=0AChanges for v2:=0A - Make indentation sl=\n" - "ightly more consistent.=0A - Replace bizarre switch-based condition with =\n" - "plain boring one.=0A=0A drivers/net/gianfar.c | 16 ++++++++++++++--=0A dr=\n" - "ivers/net/gianfar.h | 1 +=0A 2 files changed, 15 insertions(+), 2 deleti=\n" - "ons(-)=0A=0Adiff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c=0Ain=\n" - "dex 5ed8f9f..3da19a5 100644=0A--- a/drivers/net/gianfar.c=0A+++ b/drivers/n=\n" - "et/gianfar.c=0A@@ -950,6 +950,11 @@ static void gfar_detect_errata(struct g=\n" - "far_private *priv)=0A =09=09=09(pvr =3D=3D 0x80861010 && (mod & 0xfff9) =3D=\n" - "=3D 0x80c0))=0A =09=09priv->errata |=3D GFAR_ERRATA_A002;=0A =0A+=09/* MPC8=\n" - "313 Rev < 2.0, MPC8548 rev 2.0 */=0A+=09if ((pvr =3D=3D 0x80850010 && mod =\n" - "=3D=3D 0x80b0 && rev < 0x0020) ||=0A+=09=09=09(pvr =3D=3D 0x80210020 && mod=\n" - " =3D=3D 0x8030 && rev =3D=3D 0x0020))=0A+=09=09priv->errata |=3D GFAR_ERRAT=\n" - "A_12;=0A+=0A =09if (priv->errata)=0A =09=09dev_info(dev, \"enabled errata wo=\n" - "rkarounds, flags: 0x%x\\n\",=0A =09=09=09 priv->errata);=0A@@ -2156,8 +2161,1=\n" - "5 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev=\n" - ")=0A =09/* Set up checksumming */=0A =09if (CHECKSUM_PARTIAL =3D=3D skb->ip=\n" - "_summed) {=0A =09=09fcb =3D gfar_add_fcb(skb);=0A-=09=09lstatus |=3D BD_LFL=\n" - "AG(TXBD_TOE);=0A-=09=09gfar_tx_checksum(skb, fcb);=0A+=09=09/* as specified=\n" - " by errata */=0A+=09=09if (unlikely(gfar_has_errata(priv, GFAR_ERRATA_12)=\n" - "=0A+=09=09=09 && ((unsigned long)fcb % 0x20) > 0x18)) {=0A+=09=09=09__s=\n" - "kb_pull(skb, GMAC_FCB_LEN);=0A+=09=09=09skb_checksum_help(skb);=0A+=09=09} =\n" - "else {=0A+=09=09=09lstatus |=3D BD_LFLAG(TXBD_TOE);=0A+=09=09=09gfar_tx_che=\n" - "cksum(skb, fcb);=0A+=09=09}=0A =09}=0A =0A =09if (vlan_tx_tag_present(skb))=\n" - " {=0Adiff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h=0Aindex 54d=\n" - "e413..ec5d595 100644=0A--- a/drivers/net/gianfar.h=0A+++ b/drivers/net/gian=\n" - "far.h=0A@@ -1039,6 +1039,7 @@ enum gfar_errata {=0A =09GFAR_ERRATA_74=09=09=\n" - "=3D 0x01,=0A =09GFAR_ERRATA_76=09=09=3D 0x02,=0A =09GFAR_ERRATA_A002=09=3D =\n" - "0x04,=0A+=09GFAR_ERRATA_12=09=09=3D 0x08, /* a.k.a errata eTSEC49 */=0A };=\n" - "=0A =0A /* Struct stolen almost completely (and shamelessly) from the FCC e=\n" - net source=0A-- =0A1.7.3.2=0A=0A=0A=0A=0A + "As specified by errata eTSEC49 of MPC8548 and errata eTSEC12 of MPC83xx,\n" + "older revisions of gianfar controllers will be unable to calculate a TCP/UDP\n" + "packet checksum for some alignments of the appropriate FCB. This patch checks\n" + "for FCB alignment on such controllers and falls back to software checksumming\n" + "if the alignment is known to be bad.\n" + "\n" + "Signed-off-by: Alex Dubov <oakad@yahoo.com>\n" + "---\n" + "Changes for v2:\n" + " - Make indentation slightly more consistent.\n" + " - Replace bizarre switch-based condition with plain boring one.\n" + "\n" + " drivers/net/gianfar.c | 16 ++++++++++++++--\n" + " drivers/net/gianfar.h | 1 +\n" + " 2 files changed, 15 insertions(+), 2 deletions(-)\n" + "\n" + "diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c\n" + "index 5ed8f9f..3da19a5 100644\n" + "--- a/drivers/net/gianfar.c\n" + "+++ b/drivers/net/gianfar.c\n" + "@@ -950,6 +950,11 @@ static void gfar_detect_errata(struct gfar_private *priv)\n" + " \t\t\t(pvr == 0x80861010 && (mod & 0xfff9) == 0x80c0))\n" + " \t\tpriv->errata |= GFAR_ERRATA_A002;\n" + " \n" + "+\t/* MPC8313 Rev < 2.0, MPC8548 rev 2.0 */\n" + "+\tif ((pvr == 0x80850010 && mod == 0x80b0 && rev < 0x0020) ||\n" + "+\t\t\t(pvr == 0x80210020 && mod == 0x8030 && rev == 0x0020))\n" + "+\t\tpriv->errata |= GFAR_ERRATA_12;\n" + "+\n" + " \tif (priv->errata)\n" + " \t\tdev_info(dev, \"enabled errata workarounds, flags: 0x%x\\n\",\n" + " \t\t\t priv->errata);\n" + "@@ -2156,8 +2161,15 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)\n" + " \t/* Set up checksumming */\n" + " \tif (CHECKSUM_PARTIAL == skb->ip_summed) {\n" + " \t\tfcb = gfar_add_fcb(skb);\n" + "-\t\tlstatus |= BD_LFLAG(TXBD_TOE);\n" + "-\t\tgfar_tx_checksum(skb, fcb);\n" + "+\t\t/* as specified by errata */\n" + "+\t\tif (unlikely(gfar_has_errata(priv, GFAR_ERRATA_12)\n" + "+\t\t\t && ((unsigned long)fcb % 0x20) > 0x18)) {\n" + "+\t\t\t__skb_pull(skb, GMAC_FCB_LEN);\n" + "+\t\t\tskb_checksum_help(skb);\n" + "+\t\t} else {\n" + "+\t\t\tlstatus |= BD_LFLAG(TXBD_TOE);\n" + "+\t\t\tgfar_tx_checksum(skb, fcb);\n" + "+\t\t}\n" + " \t}\n" + " \n" + " \tif (vlan_tx_tag_present(skb)) {\n" + "diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h\n" + "index 54de413..ec5d595 100644\n" + "--- a/drivers/net/gianfar.h\n" + "+++ b/drivers/net/gianfar.h\n" + "@@ -1039,6 +1039,7 @@ enum gfar_errata {\n" + " \tGFAR_ERRATA_74\t\t= 0x01,\n" + " \tGFAR_ERRATA_76\t\t= 0x02,\n" + " \tGFAR_ERRATA_A002\t= 0x04,\n" + "+\tGFAR_ERRATA_12\t\t= 0x08, /* a.k.a errata eTSEC49 */\n" + " };\n" + " \n" + " /* Struct stolen almost completely (and shamelessly) from the FCC enet source\n" + "-- \n" + 1.7.3.2 -1b1846a50fe62366f29c515079433c7235d80c9e0cea9e8446a5a514fa617a34 +78f0a4d190c35372de8784d197ac67a54896742a88f305b772b17655a42a2e8e
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.