From patchwork Wed Oct 17 19:53:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Lamparter X-Patchwork-Id: 985497 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="e3cckO8t"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42b2tJ5gzTz9sBN for ; Thu, 18 Oct 2018 06:53:44 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727678AbeJRDu4 (ORCPT ); Wed, 17 Oct 2018 23:50:56 -0400 Received: from mail-ed1-f68.google.com ([209.85.208.68]:40067 "EHLO mail-ed1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727108AbeJRDuz (ORCPT ); Wed, 17 Oct 2018 23:50:55 -0400 Received: by mail-ed1-f68.google.com with SMTP id r1-v6so26069738edd.7 for ; Wed, 17 Oct 2018 12:53:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=IAd1KiwmgK87vNqhxjrV+ov3zMJPJ3ZosBQyZxAPf5k=; b=e3cckO8tLU/IawABcXQq0oR3K+GVyC85XtX7YymYRg1o8XcjSK+AyxUpiSEiuTDs5b lbKheln48LD5ePF8rcwDd9UzSJCk5r9esnYz+5OVqUJRuqAPYps5YDMaX4KngYnKgEH7 fPnX/rUJx/RRoDyhMbGCL4sCGUZSaMpdL2UesnLR2gcmjj96bia6y4piI+Le/xiNhA7A 7rhQ6h8ZuW2iGC4+s2STWLIuNno03JJ+TSkpnc1Qn+o+qrhBGHK67/AtVqB9DW/bkbuW 0PeI6BpLstY010WeKRyESArTwD2UJahYMK9gWTg9or+iTTQS/+/xRdyLuWkk7qv8Fq0l AAOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=IAd1KiwmgK87vNqhxjrV+ov3zMJPJ3ZosBQyZxAPf5k=; b=A8b1C2PTHaxHYnhkz7wY5Mv/ZgQRdNgSXDFcu2YYo2e1pXz9kGcE/Gn4skMpb79b08 Poz5N9QfXZHebhLO9pQN3seP+95/rQfv3bq54h0/zuiRyrUcRj97NLOwAtHRLZTX05VM 9dfPFfERmI0W0Zs6XURLefDH6wy8wCUcfw9vlcnOb3t3gLmjMiIXOcx4R7UVw7f2jVN3 4kvsv+WH/E2GMCbp3QmXZ9lse05LBz79bq4+8++ZmR3OdAgyr4f3+PIlWRaxv51L4mOZ 9j21hlrWY+9wII5ALAcLSxcNTr54jAEgTyDuI4/z2Keq32DZIM+YIIJ8SkEt88awdnAF 1jug== X-Gm-Message-State: ABuFfogWQlbZ2bTgjcNXP+o4GpMkeS0PhRf+qzi4lvPWsY3isrqojupm cVxMmaam0wMdb317OR5rt5XZYZ93uhM= X-Google-Smtp-Source: ACcGV616axFAARDwLiytKzrSmhdM9/6KZl5SFrcpDByyMOWWkBZYsNQ1O1ItwYlnKT8jflMYjADQ1w== X-Received: by 2002:a17:906:76d1:: with SMTP id q17-v6mr27836984ejn.150.1539806017787; Wed, 17 Oct 2018 12:53:37 -0700 (PDT) Received: from debian64.daheim (p200300D5FBC22EFCD63D7EFFFEBDE96E.dip0.t-ipconnect.de. [2003:d5:fbc2:2efc:d63d:7eff:febd:e96e]) by smtp.gmail.com with ESMTPSA id j22-v6sm7488706edr.96.2018.10.17.12.53.37 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 17 Oct 2018 12:53:37 -0700 (PDT) Received: from chuck by debian64.daheim with local (Exim 4.91) (envelope-from ) id 1gCrsu-0007Ky-96; Wed, 17 Oct 2018 21:53:36 +0200 From: Christian Lamparter To: netdev@vger.kernel.org Cc: "David S . Miller" Subject: [PATCH 1/2] net: emac: implement 802.1Q VLAN TX tagging support Date: Wed, 17 Oct 2018 21:53:35 +0200 Message-Id: X-Mailer: git-send-email 2.19.1 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org As per' APM82181 Embedded Processor User Manual 26.1 EMAC Features: VLAN: - Support for VLAN tag ID in compliance with IEEE 802.3ac. - VLAN tag insertion or replacement for transmit packets This patch completes the missing code for the VLAN tx tagging support, as the the EMAC_MR1_VLE was already enabled. Signed-off-by: Christian Lamparter --- drivers/net/ethernet/ibm/emac/core.c | 32 ++++++++++++++++++++++++---- drivers/net/ethernet/ibm/emac/core.h | 6 +++++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/ibm/emac/core.c b/drivers/net/ethernet/ibm/emac/core.c index 760b2ad8e295..be560f9031f4 100644 --- a/drivers/net/ethernet/ibm/emac/core.c +++ b/drivers/net/ethernet/ibm/emac/core.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -674,7 +675,7 @@ static int emac_configure(struct emac_instance *dev) ndev->dev_addr[5]); /* VLAN Tag Protocol ID */ - out_be32(&p->vtpid, 0x8100); + out_be32(&p->vtpid, ETH_P_8021Q); /* Receive mode register */ r = emac_iff2rmr(ndev); @@ -1435,6 +1436,22 @@ static inline netdev_tx_t emac_xmit_finish(struct emac_instance *dev, int len) return NETDEV_TX_OK; } +static inline u16 emac_tx_vlan(struct emac_instance *dev, struct sk_buff *skb) +{ + /* Handle VLAN TPID and TCI insert if this is a VLAN skb */ + if (emac_has_feature(dev, EMAC_FTR_HAS_VLAN_CTAG_TX) && + skb_vlan_tag_present(skb)) { + struct emac_regs __iomem *p = dev->emacp; + + /* update the VLAN TCI */ + out_be32(&p->vtci, (u32)skb_vlan_tag_get(skb)); + + /* Insert VLAN tag */ + return EMAC_TX_CTRL_IVT; + } + return 0; +} + /* Tx lock BH */ static netdev_tx_t emac_start_xmit(struct sk_buff *skb, struct net_device *ndev) { @@ -1443,7 +1460,7 @@ static netdev_tx_t emac_start_xmit(struct sk_buff *skb, struct net_device *ndev) int slot; u16 ctrl = EMAC_TX_CTRL_GFCS | EMAC_TX_CTRL_GP | MAL_TX_CTRL_READY | - MAL_TX_CTRL_LAST | emac_tx_csum(dev, skb); + MAL_TX_CTRL_LAST | emac_tx_csum(dev, skb) | emac_tx_vlan(dev, skb); slot = dev->tx_slot++; if (dev->tx_slot == NUM_TX_BUFF) { @@ -1518,7 +1535,7 @@ emac_start_xmit_sg(struct sk_buff *skb, struct net_device *ndev) goto stop_queue; ctrl = EMAC_TX_CTRL_GFCS | EMAC_TX_CTRL_GP | MAL_TX_CTRL_READY | - emac_tx_csum(dev, skb); + emac_tx_csum(dev, skb) | emac_tx_vlan(dev, skb); slot = dev->tx_slot; /* skb data */ @@ -2891,7 +2908,8 @@ static int emac_init_config(struct emac_instance *dev) if (of_device_is_compatible(np, "ibm,emac-apm821xx")) { dev->features |= (EMAC_APM821XX_REQ_JUMBO_FRAME_SIZE | EMAC_FTR_APM821XX_NO_HALF_DUPLEX | - EMAC_FTR_460EX_PHY_CLK_FIX); + EMAC_FTR_460EX_PHY_CLK_FIX | + EMAC_FTR_HAS_VLAN_CTAG_TX); } } else if (of_device_is_compatible(np, "ibm,emac4")) { dev->features |= EMAC_FTR_EMAC4; @@ -3148,6 +3166,12 @@ static int emac_probe(struct platform_device *ofdev) if (dev->tah_dev) { ndev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG; + + if (emac_has_feature(dev, EMAC_FTR_HAS_VLAN_CTAG_TX)) { + ndev->vlan_features |= ndev->hw_features; + ndev->hw_features |= NETIF_F_HW_VLAN_CTAG_TX; + } + ndev->features |= ndev->hw_features | NETIF_F_RXCSUM; } ndev->watchdog_timeo = 5 * HZ; diff --git a/drivers/net/ethernet/ibm/emac/core.h b/drivers/net/ethernet/ibm/emac/core.h index 84caa4a3fc52..8d84d439168c 100644 --- a/drivers/net/ethernet/ibm/emac/core.h +++ b/drivers/net/ethernet/ibm/emac/core.h @@ -334,6 +334,8 @@ struct emac_instance { * APM821xx does not support Half Duplex mode */ #define EMAC_FTR_APM821XX_NO_HALF_DUPLEX 0x00001000 +/* EMAC can insert 802.1Q tag */ +#define EMAC_FTR_HAS_VLAN_CTAG_TX 0x00002000 /* Right now, we don't quite handle the always/possible masks on the * most optimal way as we don't have a way to say something like @@ -363,7 +365,9 @@ enum { EMAC_FTR_460EX_PHY_CLK_FIX | EMAC_FTR_440EP_PHY_CLK_FIX | EMAC_APM821XX_REQ_JUMBO_FRAME_SIZE | - EMAC_FTR_APM821XX_NO_HALF_DUPLEX, + EMAC_FTR_APM821XX_NO_HALF_DUPLEX | + EMAC_FTR_HAS_VLAN_CTAG_TX | + 0, }; static inline int emac_has_feature(struct emac_instance *dev, From patchwork Wed Oct 17 19:53:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Lamparter X-Patchwork-Id: 985496 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="mMFiNn+B"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42b2tH59SPz9s55 for ; Thu, 18 Oct 2018 06:53:43 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727451AbeJRDuz (ORCPT ); Wed, 17 Oct 2018 23:50:55 -0400 Received: from mail-ed1-f66.google.com ([209.85.208.66]:41089 "EHLO mail-ed1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727196AbeJRDuz (ORCPT ); Wed, 17 Oct 2018 23:50:55 -0400 Received: by mail-ed1-f66.google.com with SMTP id x31-v6so26045883edd.8 for ; Wed, 17 Oct 2018 12:53:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UR/SUoSIOOi0G0fSW7J5lIIvIEEw9wK5GG8Llxv1w7o=; b=mMFiNn+BZ4wiXXMw+Ir0F1/DxkNlhfaL//EhLG/VhlYeW/NoBjg6Mmz5xgfgRi5Vp8 Hv4kcDQqvmffu0eySDzcLJLnar4Ylc2TemS0q9VpxAMpYHWnQdc0ZA1H1ndXETO8ExtF HbDQKvxzB61aqEEfUtqWOT4OZEEkAzJzQjir3GojW7OGxSGi9eFLEMlmOGkUdTSTll5n SX72nI08BC+Sv1tYKm2DUk9ONeMty+JuHOnYM1OSwVjxYHlUWsX/CJ3ep+Mzs6AhYUmX 2s1s6rM3361bMZIlHmpGUeB8h7gk+ZZdLsOsUcTcuU1qMzSHyrlPsqiUEzpD5abYq4Gv 7kWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UR/SUoSIOOi0G0fSW7J5lIIvIEEw9wK5GG8Llxv1w7o=; b=dTxPpXXixt3R6YJtYuKSW1SjRoxkSGBa4vHB8DJF7XPH7Y1FLIZaeJPERsw5+Qg+lb ZuvSDIcDb8nqv51j15OWTC0l92PAmz5HbTEaHG8MxnNL49/XkCUwTaD5X7b2cDjshxsd PJ7ajuXEpo6gh8aIuX2LjOTQF/0482zVjJB2lKag6BqAlbuJwGIQPLS4cxL2LwpedBBC xt9+j4aikPTQ1UTbUGmupdjCkxulOB97dKXjVhIvNvcpGOYtewh/FsBb9JQFAjDA+nOm AOJ402ctRPiwrnIWMVblJxLVjte0fEhK4LJ0gL7LnNI1BGRXTf8mHCPOxsGaLehtXKMM MAeA== X-Gm-Message-State: ABuFfoiAQmITSFjW6CLgRDsPwj7aL0zVjLPKR2fUC0saG79JHB9rGdWL 2gtTvLd83OwgnQCPAtVfERK1E51FdJc= X-Google-Smtp-Source: ACcGV63jHYdYVPDNklU+lc6lKifPp4u6GwS2kdUnXx8lCJ6WTveZyiWBOWnVvKuvocMC5sOGeE2OlQ== X-Received: by 2002:a50:b003:: with SMTP id i3-v6mr1538884edd.120.1539806018086; Wed, 17 Oct 2018 12:53:38 -0700 (PDT) Received: from debian64.daheim (p200300D5FBC22EFCD63D7EFFFEBDE96E.dip0.t-ipconnect.de. [2003:d5:fbc2:2efc:d63d:7eff:febd:e96e]) by smtp.gmail.com with ESMTPSA id p3-v6sm6474498eda.88.2018.10.17.12.53.37 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 17 Oct 2018 12:53:37 -0700 (PDT) Received: from chuck by debian64.daheim with local (Exim 4.91) (envelope-from ) id 1gCrsu-0007L1-A6; Wed, 17 Oct 2018 21:53:36 +0200 From: Christian Lamparter To: netdev@vger.kernel.org Cc: "David S . Miller" Subject: [PATCH 2/2] net: emac: implement TCP TSO Date: Wed, 17 Oct 2018 21:53:36 +0200 Message-Id: <222fc61f88a39393b8830d9bfcc7b88d24fb81d6.1539804852.git.chunkeey@gmail.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: References: MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch enables TSO(v4) hw feature for emac driver. As atleast the APM82181's TCP/IP acceleration hardware controller (TAH) provides TCP segmentation support in the transmit path. Signed-off-by: Christian Lamparter --- drivers/net/ethernet/ibm/emac/core.c | 101 ++++++++++++++++++++++++++- drivers/net/ethernet/ibm/emac/core.h | 4 ++ drivers/net/ethernet/ibm/emac/emac.h | 7 ++ drivers/net/ethernet/ibm/emac/tah.c | 20 ++++++ drivers/net/ethernet/ibm/emac/tah.h | 2 + 5 files changed, 133 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/ibm/emac/core.c b/drivers/net/ethernet/ibm/emac/core.c index be560f9031f4..49ffbd6e1707 100644 --- a/drivers/net/ethernet/ibm/emac/core.c +++ b/drivers/net/ethernet/ibm/emac/core.c @@ -38,6 +38,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -1410,6 +1413,52 @@ static inline u16 emac_tx_csum(struct emac_instance *dev, return 0; } +const u32 tah_ss[TAH_NO_SSR] = { 9000, 4500, 1500, 1300, 576, 176 }; + +static int emac_tx_tso(struct emac_instance *dev, struct sk_buff *skb, + u16 *ctrl) +{ + if (emac_has_feature(dev, EMAC_FTR_TAH_HAS_TSO) && + skb_is_gso(skb) && !!(skb_shinfo(skb)->gso_type & + (SKB_GSO_TCPV4 | SKB_GSO_TCPV6))) { + u32 seg_size = 0, i; + + /* Get the MTU */ + seg_size = skb_shinfo(skb)->gso_size + tcp_hdrlen(skb) + + skb_network_header_len(skb); + + /* Restriction applied for the segmentation size + * to use HW segmentation offload feature: the size + * of the segment must not be less than 168 bytes for + * DIX formatted segments, or 176 bytes for + * IEEE formatted segments. + * + * I use value 176 to check for the segment size here + * as it can cover both 2 conditions above. + */ + if (seg_size < 176) + return -ENODEV; + + /* Get the best suitable MTU */ + for (i = 0; i < ARRAY_SIZE(tah_ss); i++) { + u32 curr_seg = tah_ss[i]; + + if (curr_seg > dev->ndev->mtu || + curr_seg > seg_size) + continue; + + *ctrl &= ~EMAC_TX_CTRL_TAH_CSUM; + *ctrl |= EMAC_TX_CTRL_TAH_SSR(i); + return 0; + } + + /* none found fall back to software */ + return -EINVAL; + } + + return 0; +} + static inline netdev_tx_t emac_xmit_finish(struct emac_instance *dev, int len) { struct emac_regs __iomem *p = dev->emacp; @@ -1452,8 +1501,46 @@ static inline u16 emac_tx_vlan(struct emac_instance *dev, struct sk_buff *skb) return 0; } +static netdev_tx_t +emac_start_xmit(struct sk_buff *skb, struct net_device *ndev); + +static netdev_tx_t emac_sw_tso(struct sk_buff *skb, struct net_device *ndev) +{ + struct emac_instance *dev = netdev_priv(ndev); + struct sk_buff *segs, *curr; + + segs = skb_gso_segment(skb, ndev->features & + ~(NETIF_F_TSO | NETIF_F_TSO6)); + if (IS_ERR_OR_NULL(segs)) { + goto drop; + } else { + while (segs) { + /* check for overflow */ + if (dev->tx_cnt >= NUM_TX_BUFF) { + dev_kfree_skb_any(segs); + goto drop; + } + + curr = segs; + segs = curr->next; + curr->next = NULL; + + emac_start_xmit(curr, ndev); + } + dev_consume_skb_any(skb); + } + + return NETDEV_TX_OK; + +drop: + ++dev->estats.tx_dropped; + dev_kfree_skb_any(skb); + return NETDEV_TX_OK; +} + /* Tx lock BH */ -static netdev_tx_t emac_start_xmit(struct sk_buff *skb, struct net_device *ndev) +static netdev_tx_t +emac_start_xmit(struct sk_buff *skb, struct net_device *ndev) { struct emac_instance *dev = netdev_priv(ndev); unsigned int len = skb->len; @@ -1462,6 +1549,9 @@ static netdev_tx_t emac_start_xmit(struct sk_buff *skb, struct net_device *ndev) u16 ctrl = EMAC_TX_CTRL_GFCS | EMAC_TX_CTRL_GP | MAL_TX_CTRL_READY | MAL_TX_CTRL_LAST | emac_tx_csum(dev, skb) | emac_tx_vlan(dev, skb); + if (emac_tx_tso(dev, skb, &ctrl)) + return emac_sw_tso(skb, ndev); + slot = dev->tx_slot++; if (dev->tx_slot == NUM_TX_BUFF) { dev->tx_slot = 0; @@ -1536,6 +1626,9 @@ emac_start_xmit_sg(struct sk_buff *skb, struct net_device *ndev) ctrl = EMAC_TX_CTRL_GFCS | EMAC_TX_CTRL_GP | MAL_TX_CTRL_READY | emac_tx_csum(dev, skb) | emac_tx_vlan(dev, skb); + if (emac_tx_tso(dev, skb, &ctrl)) + return emac_sw_tso(skb, ndev); + slot = dev->tx_slot; /* skb data */ @@ -2946,6 +3039,9 @@ static int emac_init_config(struct emac_instance *dev) if (dev->tah_ph != 0) { #ifdef CONFIG_IBM_EMAC_TAH dev->features |= EMAC_FTR_HAS_TAH; + + if (of_device_is_compatible(np, "ibm,emac-apm821xx")) + dev->features |= EMAC_FTR_TAH_HAS_TSO; #else printk(KERN_ERR "%pOF: TAH support not enabled !\n", np); return -ENXIO; @@ -3167,6 +3263,9 @@ static int emac_probe(struct platform_device *ofdev) if (dev->tah_dev) { ndev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG; + if (emac_has_feature(dev, EMAC_FTR_TAH_HAS_TSO)) + ndev->hw_features |= NETIF_F_TSO; + if (emac_has_feature(dev, EMAC_FTR_HAS_VLAN_CTAG_TX)) { ndev->vlan_features |= ndev->hw_features; ndev->hw_features |= NETIF_F_HW_VLAN_CTAG_TX; diff --git a/drivers/net/ethernet/ibm/emac/core.h b/drivers/net/ethernet/ibm/emac/core.h index 8d84d439168c..e40ccee58775 100644 --- a/drivers/net/ethernet/ibm/emac/core.h +++ b/drivers/net/ethernet/ibm/emac/core.h @@ -336,6 +336,8 @@ struct emac_instance { #define EMAC_FTR_APM821XX_NO_HALF_DUPLEX 0x00001000 /* EMAC can insert 802.1Q tag */ #define EMAC_FTR_HAS_VLAN_CTAG_TX 0x00002000 +/* TAH can do TCP segmentation offload */ +#define EMAC_FTR_TAH_HAS_TSO 0x00004000 /* Right now, we don't quite handle the always/possible masks on the * most optimal way as we don't have a way to say something like @@ -352,6 +354,8 @@ enum { #endif #ifdef CONFIG_IBM_EMAC_TAH EMAC_FTR_HAS_TAH | + EMAC_FTR_TAH_HAS_TSO | + #endif #ifdef CONFIG_IBM_EMAC_ZMII EMAC_FTR_HAS_ZMII | diff --git a/drivers/net/ethernet/ibm/emac/emac.h b/drivers/net/ethernet/ibm/emac/emac.h index e2f80cca9bed..833967aceb2f 100644 --- a/drivers/net/ethernet/ibm/emac/emac.h +++ b/drivers/net/ethernet/ibm/emac/emac.h @@ -266,6 +266,13 @@ struct emac_regs { #define EMAC_TX_CTRL_IVT 0x0020 #define EMAC_TX_CTRL_RVT 0x0010 #define EMAC_TX_CTRL_TAH_CSUM 0x000e +#define EMAC_TX_CTRL_TAH_SSR(idx) (((idx) + 1) << 1) +#define EMAC_TX_CTRL_TAH_SSR5 0x000c +#define EMAC_TX_CTRL_TAH_SSR4 0x000a +#define EMAC_TX_CTRL_TAH_SSR3 0x0008 +#define EMAC_TX_CTRL_TAH_SSR2 0x0006 +#define EMAC_TX_CTRL_TAH_SSR1 0x0004 +#define EMAC_TX_CTRL_TAH_SSR0 0x0002 /* EMAC specific TX descriptor status fields (read access) */ #define EMAC_TX_ST_BFCS 0x0200 diff --git a/drivers/net/ethernet/ibm/emac/tah.c b/drivers/net/ethernet/ibm/emac/tah.c index 9912456dca48..a0236eb305ae 100644 --- a/drivers/net/ethernet/ibm/emac/tah.c +++ b/drivers/net/ethernet/ibm/emac/tah.c @@ -45,6 +45,24 @@ void tah_detach(struct platform_device *ofdev, int channel) mutex_unlock(&dev->lock); } +static void tah_set_ssr(struct platform_device *ofdev) +{ + struct tah_instance *dev = dev_get_drvdata(&ofdev->dev); + struct tah_regs __iomem *p = dev->base; + int i; + + mutex_lock(&dev->lock); + + for (i = 0; i < ARRAY_SIZE(tah_ss); i++) { + /* Segment size can be up to 16K, but needs + * to be a multiple of 2 bytes + */ + out_be32(&p->ssr0 + i, (tah_ss[i] & 0x3ffe) << 16); + } + + mutex_unlock(&dev->lock); +} + void tah_reset(struct platform_device *ofdev) { struct tah_instance *dev = platform_get_drvdata(ofdev); @@ -64,6 +82,8 @@ void tah_reset(struct platform_device *ofdev) out_be32(&p->mr, TAH_MR_CVR | TAH_MR_ST_768 | TAH_MR_TFS_10KB | TAH_MR_DTFP | TAH_MR_DIG); + + tah_set_ssr(ofdev); } int tah_get_regs_len(struct platform_device *ofdev) diff --git a/drivers/net/ethernet/ibm/emac/tah.h b/drivers/net/ethernet/ibm/emac/tah.h index 4d5f336f07b3..2cb0629f30e2 100644 --- a/drivers/net/ethernet/ibm/emac/tah.h +++ b/drivers/net/ethernet/ibm/emac/tah.h @@ -36,6 +36,8 @@ struct tah_regs { u32 tsr; }; +#define TAH_NO_SSR 6 +extern const u32 tah_ss[TAH_NO_SSR]; /* TAH device */ struct tah_instance {