linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Kalle Valo <kvalo@qca.qualcomm.com>
To: Rishi Panjwani <rpanjwan@qca.qualcomm.com>
Cc: <ath6kl-devel@qualcomm.com>, <linux-wireless@vger.kernel.org>
Subject: Re: [PATCH v2] ath6kl: Support for TCP checksum offload to firmware
Date: Sat, 24 Dec 2011 03:20:30 +0200	[thread overview]
Message-ID: <4EF528DE.5090407@qca.qualcomm.com> (raw)
In-Reply-To: <1324427136-8183-1-git-send-email-rpanjwan@qca.qualcomm.com>

Hi Rishi,

On 12/21/2011 02:25 AM, Rishi Panjwani wrote:
> The change enables offloading TCP checksum calculation to firmware.
> The support has been added for QA team's testing purposes and currently
> there is no plan to offload the feature to firmware by default at
> load time.

Why? Please document the reason in the commit log.

Also does this comment still apply? It wasn't clear for me from looking
at the code.

> +	ndev->hw_features |= (NETIF_F_IP_CSUM | NETIF_F_RXCSUM);

No need for parenthesis here.

> @@ -265,6 +267,14 @@ int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev)
>  	}
>  
>  	if (test_bit(WMI_ENABLED, &ar->flag)) {
> +		if ((dev->hw_features & NETIF_F_IP_CSUM) &&
> +				(csum == CHECKSUM_PARTIAL)) {
> +			csum_start = skb->csum_start -
> +					(skb_network_header(skb) - skb->head) +
> +					sizeof(struct ath6kl_llc_snap_hdr);
> +			csum_dest = skb->csum_offset + csum_start;
> +		}

Shouldn't you test dev->features here, not hw_features?

> +
>  		if (skb_headroom(skb) < dev->needed_headroom) {
>  			struct sk_buff *tmp_skb = skb;
>  
> @@ -281,11 +291,31 @@ int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev)
>  			goto fail_tx;
>  		}
>  
> -		if (ath6kl_wmi_data_hdr_add(ar->wmi, skb, DATA_MSGTYPE,
> -					    more_data, 0, 0, NULL,
> -					    vif->fw_vif_idx)) {
> -			ath6kl_err("wmi_data_hdr_add failed\n");
> -			goto fail_tx;
> +		if ((dev->hw_features & NETIF_F_IP_CSUM) &&
> +				(csum == CHECKSUM_PARTIAL)) {

Ditto.

> +			meta_v2.csum_start = csum_start;
> +			meta_v2.csum_dest = csum_dest;
> +
> +/*instruct target to calculate checksum*/

Indent similarly as the rest of the code and add spaces like this:

			/* instruct target to calculate checksum */


> +			meta_v2.csum_flags = CSUM_OFFLOAD_FLAG;
> +			ret = ath6kl_wmi_data_hdr_add(ar->wmi, skb,
> +					DATA_MSGTYPE, more_data, 0,
> +					WMI_META_VERSION_2,
> +					&meta_v2, vif->fw_vif_idx);
> +			if (ret) {
> +				ath6kl_warn("failed to add tcp checksum:%d\n"
> +						, ret);
> +				goto fail_tx;
> +			}
> +		} else {
> +			ret = ath6kl_wmi_data_hdr_add(ar->wmi, skb,
> +						DATA_MSGTYPE, more_data, 0, 0,
> +						NULL, vif->fw_vif_idx);
> +			if (ret) {
> +				ath6kl_warn("failed to add wmi data header:%d\n"
> +						, ret);
> +				goto fail_tx;
> +			}
>  		}

Instead of calling the wmi function twice you could add new variables to
make it look simpler:

if (foo) {
	meta = &meta_v2;
	meta_ver = WMI_META_VERSION_2;
} else {
	meta = NULL;
	meta_ver = 0;
}

ret = ath6kl_wmi_data_hdr_add(ar->wmi, skb,
				DATA_MSGTYPE, more_data, 0,
				meta_ver,
				&meta, vif->fw_vif_idx);


> @@ -1259,6 +1289,27 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
>  		break;
>  	}
>  
> +/*Support for configuring rx checksum offload*/

Indent and add spaces.

> +	if ((vif->ndev->features & NETIF_F_RXCSUM) &&
> +		(ar->rx_meta_ver != WMI_META_VERSION_2)) {
> +		ar->rx_meta_ver = WMI_META_VERSION_2;
> +		if (ath6kl_wmi_set_rx_frame_format_cmd(ar->wmi,
> +			if_idx, ar->rx_meta_ver, 0, 0)) {
> +			ath6kl_err("unable to set the rx frame format\n");
> +			status = -EIO;
> +		}
> +	} else if (!(vif->ndev->features & NETIF_F_RXCSUM) &&
> +		(ar->rx_meta_ver == WMI_META_VERSION_2)) {
> +		ar->rx_meta_ver = 0;
> +		if (ath6kl_wmi_set_rx_frame_format_cmd(ar->wmi,
> +			if_idx, ar->rx_meta_ver, 0, 0)) {
> +			ath6kl_err("unable to set the rx frame format\n");
> +			status = -EIO;
> +		}
> +
> +	}

I don't like that this in the rx path, which is supposed to be a
hotpath. I think adding ndo_set_features() callback and doing this in
that callback is much better.

> --- a/drivers/net/wireless/ath/ath6kl/wmi.h
> +++ b/drivers/net/wireless/ath/ath6kl/wmi.h
> @@ -257,6 +257,9 @@ static inline u8 wmi_data_hdr_get_if_idx(struct wmi_data_hdr *dhdr)
>  #define WMI_META_VERSION_1	0x01
>  #define WMI_META_VERSION_2	0x02
>  
> +/* Flag to signal to FW to calculate TCP checksum */
> +#define CSUM_OFFLOAD_FLAG 0x01

This could be named a bit differently, WMI_META_V2_FLAG_CSUM_OFFLOAD or
something like that.

Kalle

      reply	other threads:[~2011-12-24  1:22 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-12-21  0:25 [PATCH v2] ath6kl: Support for TCP checksum offload to firmware Rishi Panjwani
2011-12-24  1:20 ` Kalle Valo [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4EF528DE.5090407@qca.qualcomm.com \
    --to=kvalo@qca.qualcomm.com \
    --cc=ath6kl-devel@qualcomm.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=rpanjwan@qca.qualcomm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).