From patchwork Mon Oct 22 11:04:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Lamparter X-Patchwork-Id: 987582 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="rxJQr5EY"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42dtvF1SxWz9sDF for ; Mon, 22 Oct 2018 22:04:25 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728810AbeJVTW2 (ORCPT ); Mon, 22 Oct 2018 15:22:28 -0400 Received: from mail-ed1-f65.google.com ([209.85.208.65]:45403 "EHLO mail-ed1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727733AbeJVTWX (ORCPT ); Mon, 22 Oct 2018 15:22:23 -0400 Received: by mail-ed1-f65.google.com with SMTP id t10-v6so4740692eds.12 for ; Mon, 22 Oct 2018 04:04:17 -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=rxJQr5EY5CK8z46uaL2SvTGho6OjkS6dfbq3HVAHKbl7dRQpwvTHAjBOfYUqOf6feM M7dqfHNSCSPSbzp7DBkIJJKJ2OdpeAmsh0OHYEkoy/DymdZl85ZKra3Vctw7pP2azjBJ FKq6Ob274gsek/VYQwtUUaDRBf0yVTxcvsh/uK2dK6Ec5/R4xQO3w2yh9eAFAecGbWya bYd79ktWR+VT/yRk4wTc2RjLNG5OJxBBoxPhttYaPbj3+/YudHP3WJ8IJbmp8RioxLz+ OystDGpMyZjUaO7YNpWh5aO4cTtN6uN5cbtX/DTirhSO/URJ7QwLjRAUar3U7SOTx4QG H4nQ== 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=Ld237HT+T7mUdYFUyhO9cjfK+0+a0tyMfvkt/pGPn8/t4FIxuwohMyunZkmcN88AOE 6i8dGFJTh4M++lyoKhY9S0at+oKsdIMXrfQvQBLc+rDT6f8mBwAFWvEVMIKkHeU0UDUq XbWTbt6EvShdjiEenyonc79JyHxpH5IlD0NfGibb4oEVTqoT2Fg5JYU2/kgknr1HHGPx ic2JctLrBHr96kJvuvYvH4yCdFUaEo5XFfyEpWhizsNHfAESSp+qCuBIEaK2WA/Dr08h V7/grxPIIFo4QH0VnIJNZJp+KxmzDySQE3gfgKA5FpbU0NeYHgd3iFzIvwJBxHiLtuRe A5CA== X-Gm-Message-State: ABuFfogEUf5QH93S9Wl+GHwcdJLwUDSUhy7buVwBVY6iQ3qXCFzFHz4u i61oR9p65s6dftoKN7gsrWqqHEi4948= X-Google-Smtp-Source: ACcGV61L8Bv+n5IgOk/WgRiJToxPn0opq54YiEqH0p6zIA1HBhespMC/jx+8IRaZoSvVUrzWVMJutA== X-Received: by 2002:a50:8c01:: with SMTP id p1-v6mr12764145edp.48.1540206256170; Mon, 22 Oct 2018 04:04:16 -0700 (PDT) Received: from debian64.daheim (p5B0D7C4D.dip0.t-ipconnect.de. [91.13.124.77]) by smtp.gmail.com with ESMTPSA id z15-v6sm6654048ejq.60.2018.10.22.04.04.14 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 22 Oct 2018 04:04:15 -0700 (PDT) Received: from root by debian64.daheim with local (Exim 4.91) (envelope-from ) id 1gEY0M-0002Bn-68; Mon, 22 Oct 2018 13:04:14 +0200 From: Christian Lamparter To: netdev@vger.kernel.org Cc: "David S . Miller" , Florian Fainelli Subject: [PATCH v2 1/4] net: emac: implement 802.1Q VLAN TX tagging support Date: Mon, 22 Oct 2018 13:04:11 +0200 Message-Id: <31e4c49844ba62c12e601f33ddea7d51182c359b.1540206214.git.chunkeey@gmail.com> 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,