Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754238Ab0HZP6F (ORCPT ); Thu, 26 Aug 2010 11:58:05 -0400 Received: from mail.vyatta.com ([76.74.103.46]:39270 "EHLO mail.vyatta.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754026Ab0HZP6B (ORCPT ); Thu, 26 Aug 2010 11:58:01 -0400 Date: Thu, 26 Aug 2010 08:57:58 -0700 From: Stephen Hemminger To: Masayuki Ohtake Cc: LKML , ML netdev , Greg Rose , Maxime Bizon , Kristoffer Glembo , Ralf Baechle , John Linn , Randy Dunlap , "David S. Miller" , MeeGo , "Wang, Qi" , "Wang, Yong Y" , Andrew , Intel OTC , "Foster, Margie" , Toshiharu Okada , Tomoya Morinaga , Takahiro Shimizu Subject: Re: [PATCH] Gigabit Ethernet driver of Topcliff PCH Message-ID: <20100826085758.04ac4b44@nehalam> In-Reply-To: <4C763A67.5040107@dsn.okisemi.com> References: <4C763A67.5040107@dsn.okisemi.com> Organization: Vyatta X-Mailer: Claws Mail 3.7.5 (GTK+ 2.20.1; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2698 Lines: 85 On Thu, 26 Aug 2010 18:56:55 +0900 Masayuki Ohtake wrote: > +static void pch_gbe_tx_queue(struct pch_gbe_adapter *adapter, > + struct pch_gbe_tx_ring *tx_ring, struct sk_buff *skb) > +{ > + struct pch_gbe_hw *hw = &adapter->hw; > + struct pch_gbe_tx_desc *tx_desc; > + struct pch_gbe_buffer *buffer_info; > + struct sk_buff *tmp_skb; > + unsigned int frame_ctrl; > + unsigned int ring_num; > + unsigned long flags; > + > + PCH_GBE_DEBUG("%s\n", __func__); > + > + > + /*-- Set frame control --*/ > + frame_ctrl = 0; > + if (unlikely(skb->len < PCH_GBE_SHORT_PKT)) > + frame_ctrl |= PCH_GBE_TXD_CTRL_APAD; > + if (unlikely(adapter->tx_csum == FALSE)) > + frame_ctrl |= PCH_GBE_TXD_CTRL_TCPIP_ACC_OFF; > + > + /* Performs checksum processing */ > + /* > + * It is because the hardware accelerator does not support a checksum, > + * when the received data size is less than 64 bytes. > + */ > + if ((skb->len < PCH_GBE_SHORT_PKT) && (adapter->tx_csum == TRUE)) { > + frame_ctrl |= > + PCH_GBE_TXD_CTRL_APAD | PCH_GBE_TXD_CTRL_TCPIP_ACC_OFF; > + if (skb->protocol == htons(ETH_P_IP)) { > + struct iphdr *iph = ip_hdr(skb); > + unsigned int offset; > + iph->check = 0; > + iph->check = ip_fast_csum((u8 *) iph, iph->ihl); > + offset = skb_transport_offset(skb); > + if (iph->protocol == IPPROTO_TCP) { > + skb->csum = 0; > + tcp_hdr(skb)->check = 0; > + skb->csum = > + skb_checksum(skb, offset, > + skb->len - offset, 0); > + tcp_hdr(skb)->check = > + csum_tcpudp_magic(iph->saddr, > + iph->daddr, > + skb->len - offset, > + IPPROTO_TCP, skb->csum); > + } else if (iph->protocol == IPPROTO_UDP) { > + skb->csum = 0; > + udp_hdr(skb)->check = 0; > + skb->csum = > + skb_checksum(skb, offset, > + skb->len - offset, 0); > + udp_hdr(skb)->check = > + csum_tcpudp_magic(iph->saddr, > + iph->daddr, > + skb->len - offset, > + IPPROTO_UDP, skb->csum); > + } > + } > + } Why not something simpler using skb_checksum_help which is safer since it handles case of shared skb correctly. if (skb->ip_summed = CHECKSUM_COMPLETE && skb->len < PCH_GBE_SHORT_PKT) { frame_ctrl |= PCH_GBE_TXD_CTRL_APAD | PCH_GBE_TXD_CTRL_TCPIP_ACC_OFF; skb->ip_summed = CHECKSUM_NONE; if (skb_checksum_help(skb)) goto drop; /* could not expand header to find space */ } -- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/