Message ID | ad20d448-e798-4898-9823-898de98d54a2@CMEXHTCAS2.ad.emulex.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
Hello. On 02/24/2014 09:51 AM, Somnath Kotur wrote: > From: Vasundhara Volam <vasundhara.volam@emulex.com> > Some of TX workarounds in be_xmit_workarounds() routine > are not applicable (and result in HW errors) to Skyhawk-R chip. > Isolate BE3-R/Lancer specific workarounds to a separate routine. > > Signed-off-by: Vasundhara Volam <vasundhara.volam@emulex.com> > Signed-off-by: Sathya Perla <sathya.perla@emulex.com> > Signed-off-by: Somnath Kotur <somnath.kotur@emulex.com> > --- > drivers/net/ethernet/emulex/benet/be_main.c | 42 ++++++++++++++++++-------- > 1 files changed, 29 insertions(+), 13 deletions(-) > diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c > index f6a4481..6cf6e2a 100644 > --- a/drivers/net/ethernet/emulex/benet/be_main.c > +++ b/drivers/net/ethernet/emulex/benet/be_main.c [...] > @@ -991,6 +981,32 @@ err: > return NULL; > } > > +static struct sk_buff *be_xmit_workarounds(struct be_adapter *adapter, > + struct sk_buff *skb, > + bool *skip_hw_vlan) > +{ > + /* Lancer, SH-R ASICs have a bug wherein Packets that are 32 bytes or > + * less may cause a transmit stall on that port. So the work-around is > + * to pad short packets (<= 32 bytes) to a 36-byte length. > + */ > + if (unlikely(!BEx_chip(adapter) && skb->len <= 32)) { > + if (skb_padto(skb, 36)) > + goto err; Why not just return NULL? > + skb->len = 36; > + } > + > + if (BEx_chip(adapter) || lancer_chip(adapter)) { > + skb = be_lancer_xmit_workarounds(adapter, skb, skip_hw_vlan); > + if (!skb) > + goto err; Likewise... > + } > + > + return skb; > + > +err: > + return NULL; > +} > + WBR, Sergei -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index f6a4481..6cf6e2a 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c @@ -913,24 +913,14 @@ static int be_ipv6_tx_stall_chk(struct be_adapter *adapter, return BE3_chip(adapter) && be_ipv6_exthdr_check(skb); } -static struct sk_buff *be_xmit_workarounds(struct be_adapter *adapter, - struct sk_buff *skb, - bool *skip_hw_vlan) +static struct sk_buff *be_lancer_xmit_workarounds(struct be_adapter *adapter, + struct sk_buff *skb, + bool *skip_hw_vlan) { struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; unsigned int eth_hdr_len; struct iphdr *ip; - /* Lancer, SH-R ASICs have a bug wherein Packets that are 32 bytes or less - * may cause a transmit stall on that port. So the work-around is to - * pad short packets (<= 32 bytes) to a 36-byte length. - */ - if (unlikely(!BEx_chip(adapter) && skb->len <= 32)) { - if (skb_padto(skb, 36)) - goto err; - skb->len = 36; - } - /* For padded packets, BE HW modifies tot_len field in IP header * incorrecly when VLAN tag is inserted by HW. * For padded packets, Lancer computes incorrect checksum. @@ -991,6 +981,32 @@ err: return NULL; } +static struct sk_buff *be_xmit_workarounds(struct be_adapter *adapter, + struct sk_buff *skb, + bool *skip_hw_vlan) +{ + /* Lancer, SH-R ASICs have a bug wherein Packets that are 32 bytes or + * less may cause a transmit stall on that port. So the work-around is + * to pad short packets (<= 32 bytes) to a 36-byte length. + */ + if (unlikely(!BEx_chip(adapter) && skb->len <= 32)) { + if (skb_padto(skb, 36)) + goto err; + skb->len = 36; + } + + if (BEx_chip(adapter) || lancer_chip(adapter)) { + skb = be_lancer_xmit_workarounds(adapter, skb, skip_hw_vlan); + if (!skb) + goto err; + } + + return skb; + +err: + return NULL; +} + static netdev_tx_t be_xmit(struct sk_buff *skb, struct net_device *netdev) { struct be_adapter *adapter = netdev_priv(netdev);