From patchwork Mon Aug 3 11:07:58 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike McCormack X-Patchwork-Id: 30493 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@bilbo.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from ozlabs.org (ozlabs.org [203.10.76.45]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "mx.ozlabs.org", Issuer "CA Cert Signing Authority" (verified OK)) by bilbo.ozlabs.org (Postfix) with ESMTPS id 0B0C1B6F20 for ; Mon, 3 Aug 2009 21:08:09 +1000 (EST) Received: by ozlabs.org (Postfix) id EE225DDDA2; Mon, 3 Aug 2009 21:08:08 +1000 (EST) Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id 75BD3DDDA0 for ; Mon, 3 Aug 2009 21:08:08 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753985AbZHCLH7 (ORCPT ); Mon, 3 Aug 2009 07:07:59 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753516AbZHCLH7 (ORCPT ); Mon, 3 Aug 2009 07:07:59 -0400 Received: from fg-out-1718.google.com ([72.14.220.155]:64469 "EHLO fg-out-1718.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753438AbZHCLH6 (ORCPT ); Mon, 3 Aug 2009 07:07:58 -0400 Received: by fg-out-1718.google.com with SMTP id e21so985886fga.17 for ; Mon, 03 Aug 2009 04:07:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:received:date :x-google-sender-auth:message-id:subject:from:to:content-type :content-transfer-encoding; bh=x/B+Q7I1WhBmmKCc0oplEkCfZkRnRV1DzkQUHcH+C74=; b=A6CPyPL2v6tKTmgX5M3fmWLwd/OMZJbS0C5QA7PUiq1rXLK+CjVxP0pfWwXfynmuvh iS1EiygU2aSBb+xQtemn/qc3dV6QcKuwXbhWYMAgcKwR2UekXOVGOBeQ3ePeUf1E6+oZ zWOtM+IYm/Xgo7D8N+Nvl7JEhVIefDCL8eV5o= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:content-type:content-transfer-encoding; b=JV7TnUSTAsbmMgY89hJpN7rbxMAkP8GmaMwroZaPuzSyWzHupJAZgguCiKC3MyoJdI 5iLwdOvJYArsfDiSLe3hdnvwSO9N9oW1bcheI6mDwD8eftypS/4ziqDai/ZzXtw3urnh iXN9wYOGg62cKdLnjMe61KkCMUWc253cc5a5E= MIME-Version: 1.0 Received: by 10.86.66.20 with SMTP id o20mr2048999fga.15.1249297678719; Mon, 03 Aug 2009 04:07:58 -0700 (PDT) Date: Mon, 3 Aug 2009 20:07:58 +0900 X-Google-Sender-Auth: f03a792b85f96656 Message-ID: <392fb48f0908030407j69f32c6qed9529f1219ee474@mail.gmail.com> Subject: [PATCH 1/5] sky2: Avoid rewinding sky2->tx_prod From: Mike McCormack To: netdev@vger.kernel.org Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org --- drivers/net/sky2.c | 34 ++++++++++++++++++---------------- 1 files changed, 18 insertions(+), 16 deletions(-) } @@ -1006,7 +1006,7 @@ static void tx_init(struct sky2_port *sky2) sky2->tx_tcpsum = 0; sky2->tx_last_mss = 0; - le = get_tx_le(sky2); + le = get_tx_le(sky2, &sky2->tx_prod); le->addr = 0; le->opcode = OP_ADDR64 | HW_OWNER; } @@ -1565,7 +1565,8 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) struct sky2_hw *hw = sky2->hw; struct sky2_tx_le *le = NULL; struct tx_ring_info *re; - unsigned i, len, first_slot; + unsigned i, len; + u16 slot; dma_addr_t mapping; u16 mss; u8 ctrl; @@ -1579,14 +1580,14 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) if (pci_dma_mapping_error(hw->pdev, mapping)) goto mapping_error; - first_slot = sky2->tx_prod; + slot = sky2->tx_prod; if (unlikely(netif_msg_tx_queued(sky2))) printk(KERN_DEBUG "%s: tx queued, slot %u, len %d\n", - dev->name, first_slot, skb->len); + dev->name, slot, skb->len); /* Send high bits if needed */ if (sizeof(dma_addr_t) > sizeof(u32)) { - le = get_tx_le(sky2); + le = get_tx_le(sky2, &slot); le->addr = cpu_to_le32(upper_32_bits(mapping)); le->opcode = OP_ADDR64 | HW_OWNER; } @@ -1599,7 +1600,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) mss += ETH_HLEN + ip_hdrlen(skb) + tcp_hdrlen(skb); if (mss != sky2->tx_last_mss) { - le = get_tx_le(sky2); + le = get_tx_le(sky2, &slot); le->addr = cpu_to_le32(mss); if (hw->flags & SKY2_HW_NEW_LE) @@ -1615,7 +1616,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) /* Add VLAN tag, can piggyback on LRGLEN or ADDR64 */ if (sky2->vlgrp && vlan_tx_tag_present(skb)) { if (!le) { - le = get_tx_le(sky2); + le = get_tx_le(sky2, &slot); le->addr = 0; le->opcode = OP_VLAN|HW_OWNER; } else @@ -1644,7 +1645,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) if (tcpsum != sky2->tx_tcpsum) { sky2->tx_tcpsum = tcpsum; - le = get_tx_le(sky2); + le = get_tx_le(sky2, &slot); le->addr = cpu_to_le32(tcpsum); le->length = 0; /* initial checksum value */ le->ctrl = 1; /* one packet */ @@ -1653,7 +1654,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) } } - le = get_tx_le(sky2); + le = get_tx_le(sky2, &slot); le->addr = cpu_to_le32((u32) mapping); le->length = cpu_to_le16(len); le->ctrl = ctrl; @@ -1674,13 +1675,13 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) goto mapping_unwind; if (sizeof(dma_addr_t) > sizeof(u32)) { - le = get_tx_le(sky2); + le = get_tx_le(sky2, &slot); le->addr = cpu_to_le32(upper_32_bits(mapping)); le->ctrl = 0; le->opcode = OP_ADDR64 | HW_OWNER; } - le = get_tx_le(sky2); + le = get_tx_le(sky2, &slot); le->addr = cpu_to_le32((u32) mapping); le->length = cpu_to_le16(frag->size); le->ctrl = ctrl; @@ -1694,6 +1695,8 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) le->ctrl |= EOP; + sky2->tx_prod = slot; + if (tx_avail(sky2) <= MAX_SKB_TX_LE) netif_stop_queue(dev); @@ -1702,7 +1705,7 @@ static int sky2_xmit_frame(struct sk_buff *skb, struct net_device *dev) return NETDEV_TX_OK; mapping_unwind: - for (i = first_slot; i != sky2->tx_prod; i = RING_NEXT(i, TX_RING_SIZE)) { + for (i = sky2->tx_prod; i != slot; i = RING_NEXT(i, TX_RING_SIZE)) { le = sky2->tx_le + i; re = sky2->tx_ring + i; @@ -1722,7 +1725,6 @@ mapping_unwind: } } - sky2->tx_prod = first_slot; mapping_error: if (net_ratelimit()) dev_warn(&hw->pdev->dev, "%s: tx mapping error\n", dev->name); Acked-by: Stephen Hemminger diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 661abd0..16a359d 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c @@ -989,11 +989,11 @@ static void sky2_prefetch_init(struct sky2_hw *hw, u32 qaddr, sky2_read32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL)); } -static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2) +static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2, u16 *slot) { - struct sky2_tx_le *le = sky2->tx_le + sky2->tx_prod; + struct sky2_tx_le *le = sky2->tx_le + *slot; - sky2->tx_prod = RING_NEXT(sky2->tx_prod, TX_RING_SIZE); + *slot = RING_NEXT(*slot, TX_RING_SIZE); le->ctrl = 0; return le;