diff for duplicates of <598461.73809.qm@web37603.mail.mud.yahoo.com> diff --git a/a/1.txt b/N1/1.txt index f5f8789..babff9b 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,37 +1,67 @@ -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---=0ACan we, please, proceed with this patch?= -=0AThe issue is badly annoying, breaking quite a few of the MPC8548 chips.= -=0A=0AChanges for v2:=0A - Make indentation slightly more consistent.=0A = - - Replace bizarre switch-based condition with plain boring one.=0A=0A dri= -vers/net/gianfar.c | 16 ++++++++++++++--=0A drivers/net/gianfar.h | 1 = -+=0A 2 files changed, 15 insertions(+), 2 deletions(-)=0A=0Adiff --git a/dr= -ivers/net/gianfar.c b/drivers/net/gianfar.c=0Aindex 5ed8f9f..3da19a5 100644= -=0A--- a/drivers/net/gianfar.c=0A+++ b/drivers/net/gianfar.c=0A@@ -950,6 +9= -50,11 @@ static void gfar_detect_errata(struct gfar_private *priv)=0A =09= -=09=09(pvr =3D=3D 0x80861010 && (mod & 0xfff9) =3D=3D 0x80c0))=0A =09=09pri= -v->errata |=3D GFAR_ERRATA_A002;=0A =0A+=09/* MPC8313 Rev < 2.0, MPC8548 re= -v 2.0 */=0A+=09if ((pvr =3D=3D 0x80850010 && mod =3D=3D 0x80b0 && rev < 0x0= -020) ||=0A+=09=09=09(pvr =3D=3D 0x80210020 && mod =3D=3D 0x8030 && rev =3D= -=3D 0x0020))=0A+=09=09priv->errata |=3D GFAR_ERRATA_12;=0A+=0A =09if (priv-= ->errata)=0A =09=09dev_info(dev, "enabled errata workarounds, flags: 0x%x\n"= -,=0A =09=09=09 priv->errata);=0A@@ -2156,8 +2161,15 @@ static int gfar_star= -t_xmit(struct sk_buff *skb, struct net_device *dev)=0A =09/* Set up checksu= -mming */=0A =09if (CHECKSUM_PARTIAL =3D=3D skb->ip_summed) {=0A =09=09fcb = -=3D gfar_add_fcb(skb);=0A-=09=09lstatus |=3D BD_LFLAG(TXBD_TOE);=0A-=09=09g= -far_tx_checksum(skb, fcb);=0A+=09=09/* as specified by errata */=0A+=09=09i= -f (unlikely(gfar_has_errata(priv, GFAR_ERRATA_12)=0A+=09=09=09 && ((uns= -igned long)fcb % 0x20) > 0x18)) {=0A+=09=09=09__skb_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_checksum(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 54de413..ec5d595 100644=0A---= - a/drivers/net/gianfar.h=0A+++ b/drivers/net/gianfar.h=0A@@ -1039,6 +1039,7= - @@ enum gfar_errata {=0A =09GFAR_ERRATA_74=09=09=3D 0x01,=0A =09GFAR_ERRAT= -A_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 al= -most completely (and shamelessly) from the FCC enet 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> +--- +Can we, please, proceed with this patch? +The issue is badly annoying, breaking quite a few of the MPC8548 chips. + +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 b53689e..c54cb36 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -2,48 +2,80 @@ "Subject\0[PATCH v2] gianfar: Fall back to software tcp/udp checksum on older controllers\0" "Date\0Wed, 16 Mar 2011 20:57:13 -0700 (PDT)\0" "To\0linux-kernel@vger.kernel.org\0" - "Cc\0netdev@vger.kernel.org" + "Cc\0galak@kernel.crashing.org" + cbouatmailru@gmail.com + mlcreech@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---=0ACan we, please, proceed with this patch?=\n" - "=0AThe issue is badly annoying, breaking quite a few of the MPC8548 chips.=\n" - "=0A=0AChanges for v2:=0A - Make indentation slightly more consistent.=0A =\n" - " - Replace bizarre switch-based condition with plain boring one.=0A=0A dri=\n" - "vers/net/gianfar.c | 16 ++++++++++++++--=0A drivers/net/gianfar.h | 1 =\n" - "+=0A 2 files changed, 15 insertions(+), 2 deletions(-)=0A=0Adiff --git a/dr=\n" - "ivers/net/gianfar.c b/drivers/net/gianfar.c=0Aindex 5ed8f9f..3da19a5 100644=\n" - "=0A--- a/drivers/net/gianfar.c=0A+++ b/drivers/net/gianfar.c=0A@@ -950,6 +9=\n" - "50,11 @@ static void gfar_detect_errata(struct gfar_private *priv)=0A =09=\n" - "=09=09(pvr =3D=3D 0x80861010 && (mod & 0xfff9) =3D=3D 0x80c0))=0A =09=09pri=\n" - "v->errata |=3D GFAR_ERRATA_A002;=0A =0A+=09/* MPC8313 Rev < 2.0, MPC8548 re=\n" - "v 2.0 */=0A+=09if ((pvr =3D=3D 0x80850010 && mod =3D=3D 0x80b0 && rev < 0x0=\n" - "020) ||=0A+=09=09=09(pvr =3D=3D 0x80210020 && mod =3D=3D 0x8030 && rev =3D=\n" - "=3D 0x0020))=0A+=09=09priv->errata |=3D GFAR_ERRATA_12;=0A+=0A =09if (priv-=\n" - ">errata)=0A =09=09dev_info(dev, \"enabled errata workarounds, flags: 0x%x\\n\"=\n" - ",=0A =09=09=09 priv->errata);=0A@@ -2156,8 +2161,15 @@ static int gfar_star=\n" - "t_xmit(struct sk_buff *skb, struct net_device *dev)=0A =09/* Set up checksu=\n" - "mming */=0A =09if (CHECKSUM_PARTIAL =3D=3D skb->ip_summed) {=0A =09=09fcb =\n" - "=3D gfar_add_fcb(skb);=0A-=09=09lstatus |=3D BD_LFLAG(TXBD_TOE);=0A-=09=09g=\n" - "far_tx_checksum(skb, fcb);=0A+=09=09/* as specified by errata */=0A+=09=09i=\n" - "f (unlikely(gfar_has_errata(priv, GFAR_ERRATA_12)=0A+=09=09=09 && ((uns=\n" - "igned long)fcb % 0x20) > 0x18)) {=0A+=09=09=09__skb_pull(skb, GMAC_FCB_LEN)=\n" - ";=0A+=09=09=09skb_checksum_help(skb);=0A+=09=09} else {=0A+=09=09=09lstatus=\n" - " |=3D BD_LFLAG(TXBD_TOE);=0A+=09=09=09gfar_tx_checksum(skb, fcb);=0A+=09=09=\n" - "}=0A =09}=0A =0A =09if (vlan_tx_tag_present(skb)) {=0Adiff --git a/drivers/=\n" - "net/gianfar.h b/drivers/net/gianfar.h=0Aindex 54de413..ec5d595 100644=0A---=\n" - " a/drivers/net/gianfar.h=0A+++ b/drivers/net/gianfar.h=0A@@ -1039,6 +1039,7=\n" - " @@ enum gfar_errata {=0A =09GFAR_ERRATA_74=09=09=3D 0x01,=0A =09GFAR_ERRAT=\n" - "A_76=09=09=3D 0x02,=0A =09GFAR_ERRATA_A002=09=3D 0x04,=0A+=09GFAR_ERRATA_12=\n" - "=09=09=3D 0x08, /* a.k.a errata eTSEC49 */=0A };=0A =0A /* Struct stolen al=\n" - "most completely (and shamelessly) from the FCC enet source=0A-- =0A1.7.3.2=\n" - =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" + "Can we, please, proceed with this patch?\n" + "The issue is badly annoying, breaking quite a few of the MPC8548 chips.\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 -8d0684fc03cb2a02a3ef850b2759eca1959b8eb53095419ab73f153043269e4e +7c8511d542dd23d6b1dc55727528289a699a5807e1070048f7619bcf1bd8a7c5
diff --git a/a/1.txt b/N2/1.txt index f5f8789..babff9b 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -1,37 +1,67 @@ -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---=0ACan we, please, proceed with this patch?= -=0AThe issue is badly annoying, breaking quite a few of the MPC8548 chips.= -=0A=0AChanges for v2:=0A - Make indentation slightly more consistent.=0A = - - Replace bizarre switch-based condition with plain boring one.=0A=0A dri= -vers/net/gianfar.c | 16 ++++++++++++++--=0A drivers/net/gianfar.h | 1 = -+=0A 2 files changed, 15 insertions(+), 2 deletions(-)=0A=0Adiff --git a/dr= -ivers/net/gianfar.c b/drivers/net/gianfar.c=0Aindex 5ed8f9f..3da19a5 100644= -=0A--- a/drivers/net/gianfar.c=0A+++ b/drivers/net/gianfar.c=0A@@ -950,6 +9= -50,11 @@ static void gfar_detect_errata(struct gfar_private *priv)=0A =09= -=09=09(pvr =3D=3D 0x80861010 && (mod & 0xfff9) =3D=3D 0x80c0))=0A =09=09pri= -v->errata |=3D GFAR_ERRATA_A002;=0A =0A+=09/* MPC8313 Rev < 2.0, MPC8548 re= -v 2.0 */=0A+=09if ((pvr =3D=3D 0x80850010 && mod =3D=3D 0x80b0 && rev < 0x0= -020) ||=0A+=09=09=09(pvr =3D=3D 0x80210020 && mod =3D=3D 0x8030 && rev =3D= -=3D 0x0020))=0A+=09=09priv->errata |=3D GFAR_ERRATA_12;=0A+=0A =09if (priv-= ->errata)=0A =09=09dev_info(dev, "enabled errata workarounds, flags: 0x%x\n"= -,=0A =09=09=09 priv->errata);=0A@@ -2156,8 +2161,15 @@ static int gfar_star= -t_xmit(struct sk_buff *skb, struct net_device *dev)=0A =09/* Set up checksu= -mming */=0A =09if (CHECKSUM_PARTIAL =3D=3D skb->ip_summed) {=0A =09=09fcb = -=3D gfar_add_fcb(skb);=0A-=09=09lstatus |=3D BD_LFLAG(TXBD_TOE);=0A-=09=09g= -far_tx_checksum(skb, fcb);=0A+=09=09/* as specified by errata */=0A+=09=09i= -f (unlikely(gfar_has_errata(priv, GFAR_ERRATA_12)=0A+=09=09=09 && ((uns= -igned long)fcb % 0x20) > 0x18)) {=0A+=09=09=09__skb_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_checksum(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 54de413..ec5d595 100644=0A---= - a/drivers/net/gianfar.h=0A+++ b/drivers/net/gianfar.h=0A@@ -1039,6 +1039,7= - @@ enum gfar_errata {=0A =09GFAR_ERRATA_74=09=09=3D 0x01,=0A =09GFAR_ERRAT= -A_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 al= -most completely (and shamelessly) from the FCC enet 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> +--- +Can we, please, proceed with this patch? +The issue is badly annoying, breaking quite a few of the MPC8548 chips. + +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/N2/content_digest index b53689e..4a69c1f 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -8,42 +8,72 @@ " mlcreech@gmail.com\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---=0ACan we, please, proceed with this patch?=\n" - "=0AThe issue is badly annoying, breaking quite a few of the MPC8548 chips.=\n" - "=0A=0AChanges for v2:=0A - Make indentation slightly more consistent.=0A =\n" - " - Replace bizarre switch-based condition with plain boring one.=0A=0A dri=\n" - "vers/net/gianfar.c | 16 ++++++++++++++--=0A drivers/net/gianfar.h | 1 =\n" - "+=0A 2 files changed, 15 insertions(+), 2 deletions(-)=0A=0Adiff --git a/dr=\n" - "ivers/net/gianfar.c b/drivers/net/gianfar.c=0Aindex 5ed8f9f..3da19a5 100644=\n" - "=0A--- a/drivers/net/gianfar.c=0A+++ b/drivers/net/gianfar.c=0A@@ -950,6 +9=\n" - "50,11 @@ static void gfar_detect_errata(struct gfar_private *priv)=0A =09=\n" - "=09=09(pvr =3D=3D 0x80861010 && (mod & 0xfff9) =3D=3D 0x80c0))=0A =09=09pri=\n" - "v->errata |=3D GFAR_ERRATA_A002;=0A =0A+=09/* MPC8313 Rev < 2.0, MPC8548 re=\n" - "v 2.0 */=0A+=09if ((pvr =3D=3D 0x80850010 && mod =3D=3D 0x80b0 && rev < 0x0=\n" - "020) ||=0A+=09=09=09(pvr =3D=3D 0x80210020 && mod =3D=3D 0x8030 && rev =3D=\n" - "=3D 0x0020))=0A+=09=09priv->errata |=3D GFAR_ERRATA_12;=0A+=0A =09if (priv-=\n" - ">errata)=0A =09=09dev_info(dev, \"enabled errata workarounds, flags: 0x%x\\n\"=\n" - ",=0A =09=09=09 priv->errata);=0A@@ -2156,8 +2161,15 @@ static int gfar_star=\n" - "t_xmit(struct sk_buff *skb, struct net_device *dev)=0A =09/* Set up checksu=\n" - "mming */=0A =09if (CHECKSUM_PARTIAL =3D=3D skb->ip_summed) {=0A =09=09fcb =\n" - "=3D gfar_add_fcb(skb);=0A-=09=09lstatus |=3D BD_LFLAG(TXBD_TOE);=0A-=09=09g=\n" - "far_tx_checksum(skb, fcb);=0A+=09=09/* as specified by errata */=0A+=09=09i=\n" - "f (unlikely(gfar_has_errata(priv, GFAR_ERRATA_12)=0A+=09=09=09 && ((uns=\n" - "igned long)fcb % 0x20) > 0x18)) {=0A+=09=09=09__skb_pull(skb, GMAC_FCB_LEN)=\n" - ";=0A+=09=09=09skb_checksum_help(skb);=0A+=09=09} else {=0A+=09=09=09lstatus=\n" - " |=3D BD_LFLAG(TXBD_TOE);=0A+=09=09=09gfar_tx_checksum(skb, fcb);=0A+=09=09=\n" - "}=0A =09}=0A =0A =09if (vlan_tx_tag_present(skb)) {=0Adiff --git a/drivers/=\n" - "net/gianfar.h b/drivers/net/gianfar.h=0Aindex 54de413..ec5d595 100644=0A---=\n" - " a/drivers/net/gianfar.h=0A+++ b/drivers/net/gianfar.h=0A@@ -1039,6 +1039,7=\n" - " @@ enum gfar_errata {=0A =09GFAR_ERRATA_74=09=09=3D 0x01,=0A =09GFAR_ERRAT=\n" - "A_76=09=09=3D 0x02,=0A =09GFAR_ERRATA_A002=09=3D 0x04,=0A+=09GFAR_ERRATA_12=\n" - "=09=09=3D 0x08, /* a.k.a errata eTSEC49 */=0A };=0A =0A /* Struct stolen al=\n" - "most completely (and shamelessly) from the FCC enet source=0A-- =0A1.7.3.2=\n" - =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" + "Can we, please, proceed with this patch?\n" + "The issue is badly annoying, breaking quite a few of the MPC8548 chips.\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 -8d0684fc03cb2a02a3ef850b2759eca1959b8eb53095419ab73f153043269e4e +5569baf39cc0bfb7c22a0a844349129130fcc46662aa93d2a0e339f702553d0b
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.