diff mbox

[net,5/5] be2net: isolate TX workarounds not applicable to Skyhawk-R

Message ID ad20d448-e798-4898-9823-898de98d54a2@CMEXHTCAS2.ad.emulex.com
State Changes Requested, archived
Delegated to: David Miller
Headers show

Commit Message

Somnath Kotur Feb. 24, 2014, 6:51 a.m. UTC
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(-)

Comments

Sergei Shtylyov Feb. 24, 2014, 7:15 p.m. UTC | #1
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 mbox

Patch

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);