* [PATCH] 8139cp: convert to new VLAN model.
@ 2011-07-15 10:21 Francois Romieu
2011-07-15 11:36 ` Jiri Pirko
0 siblings, 1 reply; 3+ messages in thread
From: Francois Romieu @ 2011-07-15 10:21 UTC (permalink / raw)
To: Jiri Pirko; +Cc: Stephen Hemminger, netdev
The registers and descriptors bits are identical to the pre-8168
8169 chipsets : {RxDesc / TxDesc}.opts2 can only contain VLAN information.
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
---
drivers/net/8139cp.c | 83 ++++++++++++++++---------------------------------
1 files changed, 27 insertions(+), 56 deletions(-)
diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c
index 73b10b0..cc4c210 100644
--- a/drivers/net/8139cp.c
+++ b/drivers/net/8139cp.c
@@ -78,17 +78,6 @@
#include <asm/irq.h>
#include <asm/uaccess.h>
-/* VLAN tagging feature enable/disable */
-#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
-#define CP_VLAN_TAG_USED 1
-#define CP_VLAN_TX_TAG(tx_desc,vlan_tag_value) \
- do { (tx_desc)->opts2 = cpu_to_le32(vlan_tag_value); } while (0)
-#else
-#define CP_VLAN_TAG_USED 0
-#define CP_VLAN_TX_TAG(tx_desc,vlan_tag_value) \
- do { (tx_desc)->opts2 = 0; } while (0)
-#endif
-
/* These identify the driver base version and may not be removed. */
static char version[] =
DRV_NAME ": 10/100 PCI Ethernet driver v" DRV_VERSION " (" DRV_RELDATE ")\n";
@@ -356,9 +345,6 @@ struct cp_private {
unsigned rx_buf_sz;
unsigned wol_enabled : 1; /* Is Wake-on-LAN enabled? */
-#if CP_VLAN_TAG_USED
- struct vlan_group *vlgrp;
-#endif
dma_addr_t ring_dma;
struct mii_if_info mii_if;
@@ -423,24 +409,6 @@ static struct {
};
-#if CP_VLAN_TAG_USED
-static void cp_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
-{
- struct cp_private *cp = netdev_priv(dev);
- unsigned long flags;
-
- spin_lock_irqsave(&cp->lock, flags);
- cp->vlgrp = grp;
- if (grp)
- cp->cpcmd |= RxVlanOn;
- else
- cp->cpcmd &= ~RxVlanOn;
-
- cpw16(CpCmd, cp->cpcmd);
- spin_unlock_irqrestore(&cp->lock, flags);
-}
-#endif /* CP_VLAN_TAG_USED */
-
static inline void cp_set_rxbufsize (struct cp_private *cp)
{
unsigned int mtu = cp->dev->mtu;
@@ -455,18 +423,17 @@ static inline void cp_set_rxbufsize (struct cp_private *cp)
static inline void cp_rx_skb (struct cp_private *cp, struct sk_buff *skb,
struct cp_desc *desc)
{
+ u32 opts2 = le32_to_cpu(desc->opts2);
+
skb->protocol = eth_type_trans (skb, cp->dev);
cp->dev->stats.rx_packets++;
cp->dev->stats.rx_bytes += skb->len;
-#if CP_VLAN_TAG_USED
- if (cp->vlgrp && (desc->opts2 & cpu_to_le32(RxVlanTagged))) {
- vlan_hwaccel_receive_skb(skb, cp->vlgrp,
- swab16(le32_to_cpu(desc->opts2) & 0xffff));
- } else
-#endif
- netif_receive_skb(skb);
+ if (opts2 & RxVlanTagged)
+ __vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff));
+
+ napi_gro_receive(&cp->napi, skb);
}
static void cp_rx_err_acct (struct cp_private *cp, unsigned rx_tail,
@@ -730,6 +697,12 @@ static void cp_tx (struct cp_private *cp)
netif_wake_queue(cp->dev);
}
+static inline u32 cp_tx_vlan_tag(struct sk_buff *skb)
+{
+ return vlan_tx_tag_present(skb) ?
+ TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
+}
+
static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
struct net_device *dev)
{
@@ -737,9 +710,7 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
unsigned entry;
u32 eor, flags;
unsigned long intr_flags;
-#if CP_VLAN_TAG_USED
- u32 vlan_tag = 0;
-#endif
+ __le32 opts2;
int mss = 0;
spin_lock_irqsave(&cp->lock, intr_flags);
@@ -752,15 +723,12 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
return NETDEV_TX_BUSY;
}
-#if CP_VLAN_TAG_USED
- if (vlan_tx_tag_present(skb))
- vlan_tag = TxVlanTag | swab16(vlan_tx_tag_get(skb));
-#endif
-
entry = cp->tx_head;
eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0;
mss = skb_shinfo(skb)->gso_size;
+ opts2 = cpu_to_le32(cp_tx_vlan_tag(skb));
+
if (skb_shinfo(skb)->nr_frags == 0) {
struct cp_desc *txd = &cp->tx_ring[entry];
u32 len;
@@ -768,7 +736,7 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
len = skb->len;
mapping = dma_map_single(&cp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE);
- CP_VLAN_TX_TAG(txd, vlan_tag);
+ txd->opts2 = opts2;
txd->addr = cpu_to_le64(mapping);
wmb();
@@ -839,7 +807,7 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
ctrl |= LastFrag;
txd = &cp->tx_ring[entry];
- CP_VLAN_TX_TAG(txd, vlan_tag);
+ txd->opts2 = opts2;
txd->addr = cpu_to_le64(mapping);
wmb();
@@ -851,7 +819,7 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
}
txd = &cp->tx_ring[first_entry];
- CP_VLAN_TX_TAG(txd, vlan_tag);
+ txd->opts2 = opts2;
txd->addr = cpu_to_le64(first_mapping);
wmb();
@@ -1431,6 +1399,11 @@ static int cp_set_features(struct net_device *dev, u32 features)
else
cp->cpcmd &= ~RxChkSum;
+ if (features & NETIF_F_HW_VLAN_RX)
+ cp->cpcmd |= RxVlanOn;
+ else
+ cp->cpcmd &= ~RxVlanOn;
+
cpw16_f(CpCmd, cp->cpcmd);
spin_unlock_irqrestore(&cp->lock, flags);
@@ -1818,9 +1791,6 @@ static const struct net_device_ops cp_netdev_ops = {
.ndo_start_xmit = cp_start_xmit,
.ndo_tx_timeout = cp_tx_timeout,
.ndo_set_features = cp_set_features,
-#if CP_VLAN_TAG_USED
- .ndo_vlan_rx_register = cp_vlan_rx_register,
-#endif
#ifdef BROKEN
.ndo_change_mtu = cp_change_mtu,
#endif
@@ -1949,15 +1919,16 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
dev->ethtool_ops = &cp_ethtool_ops;
dev->watchdog_timeo = TX_TIMEOUT;
-#if CP_VLAN_TAG_USED
dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
-#endif
if (pci_using_dac)
dev->features |= NETIF_F_HIGHDMA;
/* disabled by default until verified */
- dev->hw_features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
+ dev->hw_features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
+ NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+ dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
+ NETIF_F_HIGHDMA;
dev->irq = pdev->irq;
--
1.7.4.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] 8139cp: convert to new VLAN model.
2011-07-15 10:21 [PATCH] 8139cp: convert to new VLAN model Francois Romieu
@ 2011-07-15 11:36 ` Jiri Pirko
2011-07-15 15:09 ` David Miller
0 siblings, 1 reply; 3+ messages in thread
From: Jiri Pirko @ 2011-07-15 11:36 UTC (permalink / raw)
To: Francois Romieu; +Cc: Stephen Hemminger, netdev
Similar patch is in my local git :)
Reviewed-by: Jiri Pirko <jpirko@redhat.com>
Fri, Jul 15, 2011 at 12:21:44PM CEST, romieu@fr.zoreil.com wrote:
>The registers and descriptors bits are identical to the pre-8168
>8169 chipsets : {RxDesc / TxDesc}.opts2 can only contain VLAN information.
>
>Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
>---
> drivers/net/8139cp.c | 83 ++++++++++++++++---------------------------------
> 1 files changed, 27 insertions(+), 56 deletions(-)
>
>diff --git a/drivers/net/8139cp.c b/drivers/net/8139cp.c
>index 73b10b0..cc4c210 100644
>--- a/drivers/net/8139cp.c
>+++ b/drivers/net/8139cp.c
>@@ -78,17 +78,6 @@
> #include <asm/irq.h>
> #include <asm/uaccess.h>
>
>-/* VLAN tagging feature enable/disable */
>-#if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
>-#define CP_VLAN_TAG_USED 1
>-#define CP_VLAN_TX_TAG(tx_desc,vlan_tag_value) \
>- do { (tx_desc)->opts2 = cpu_to_le32(vlan_tag_value); } while (0)
>-#else
>-#define CP_VLAN_TAG_USED 0
>-#define CP_VLAN_TX_TAG(tx_desc,vlan_tag_value) \
>- do { (tx_desc)->opts2 = 0; } while (0)
>-#endif
>-
> /* These identify the driver base version and may not be removed. */
> static char version[] =
> DRV_NAME ": 10/100 PCI Ethernet driver v" DRV_VERSION " (" DRV_RELDATE ")\n";
>@@ -356,9 +345,6 @@ struct cp_private {
> unsigned rx_buf_sz;
> unsigned wol_enabled : 1; /* Is Wake-on-LAN enabled? */
>
>-#if CP_VLAN_TAG_USED
>- struct vlan_group *vlgrp;
>-#endif
> dma_addr_t ring_dma;
>
> struct mii_if_info mii_if;
>@@ -423,24 +409,6 @@ static struct {
> };
>
>
>-#if CP_VLAN_TAG_USED
>-static void cp_vlan_rx_register(struct net_device *dev, struct vlan_group *grp)
>-{
>- struct cp_private *cp = netdev_priv(dev);
>- unsigned long flags;
>-
>- spin_lock_irqsave(&cp->lock, flags);
>- cp->vlgrp = grp;
>- if (grp)
>- cp->cpcmd |= RxVlanOn;
>- else
>- cp->cpcmd &= ~RxVlanOn;
>-
>- cpw16(CpCmd, cp->cpcmd);
>- spin_unlock_irqrestore(&cp->lock, flags);
>-}
>-#endif /* CP_VLAN_TAG_USED */
>-
> static inline void cp_set_rxbufsize (struct cp_private *cp)
> {
> unsigned int mtu = cp->dev->mtu;
>@@ -455,18 +423,17 @@ static inline void cp_set_rxbufsize (struct cp_private *cp)
> static inline void cp_rx_skb (struct cp_private *cp, struct sk_buff *skb,
> struct cp_desc *desc)
> {
>+ u32 opts2 = le32_to_cpu(desc->opts2);
>+
> skb->protocol = eth_type_trans (skb, cp->dev);
>
> cp->dev->stats.rx_packets++;
> cp->dev->stats.rx_bytes += skb->len;
>
>-#if CP_VLAN_TAG_USED
>- if (cp->vlgrp && (desc->opts2 & cpu_to_le32(RxVlanTagged))) {
>- vlan_hwaccel_receive_skb(skb, cp->vlgrp,
>- swab16(le32_to_cpu(desc->opts2) & 0xffff));
>- } else
>-#endif
>- netif_receive_skb(skb);
>+ if (opts2 & RxVlanTagged)
>+ __vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff));
>+
>+ napi_gro_receive(&cp->napi, skb);
> }
>
> static void cp_rx_err_acct (struct cp_private *cp, unsigned rx_tail,
>@@ -730,6 +697,12 @@ static void cp_tx (struct cp_private *cp)
> netif_wake_queue(cp->dev);
> }
>
>+static inline u32 cp_tx_vlan_tag(struct sk_buff *skb)
>+{
>+ return vlan_tx_tag_present(skb) ?
>+ TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
>+}
>+
> static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
> struct net_device *dev)
> {
>@@ -737,9 +710,7 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
> unsigned entry;
> u32 eor, flags;
> unsigned long intr_flags;
>-#if CP_VLAN_TAG_USED
>- u32 vlan_tag = 0;
>-#endif
>+ __le32 opts2;
> int mss = 0;
>
> spin_lock_irqsave(&cp->lock, intr_flags);
>@@ -752,15 +723,12 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
> return NETDEV_TX_BUSY;
> }
>
>-#if CP_VLAN_TAG_USED
>- if (vlan_tx_tag_present(skb))
>- vlan_tag = TxVlanTag | swab16(vlan_tx_tag_get(skb));
>-#endif
>-
> entry = cp->tx_head;
> eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0;
> mss = skb_shinfo(skb)->gso_size;
>
>+ opts2 = cpu_to_le32(cp_tx_vlan_tag(skb));
>+
> if (skb_shinfo(skb)->nr_frags == 0) {
> struct cp_desc *txd = &cp->tx_ring[entry];
> u32 len;
>@@ -768,7 +736,7 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
>
> len = skb->len;
> mapping = dma_map_single(&cp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE);
>- CP_VLAN_TX_TAG(txd, vlan_tag);
>+ txd->opts2 = opts2;
> txd->addr = cpu_to_le64(mapping);
> wmb();
>
>@@ -839,7 +807,7 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
> ctrl |= LastFrag;
>
> txd = &cp->tx_ring[entry];
>- CP_VLAN_TX_TAG(txd, vlan_tag);
>+ txd->opts2 = opts2;
> txd->addr = cpu_to_le64(mapping);
> wmb();
>
>@@ -851,7 +819,7 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
> }
>
> txd = &cp->tx_ring[first_entry];
>- CP_VLAN_TX_TAG(txd, vlan_tag);
>+ txd->opts2 = opts2;
> txd->addr = cpu_to_le64(first_mapping);
> wmb();
>
>@@ -1431,6 +1399,11 @@ static int cp_set_features(struct net_device *dev, u32 features)
> else
> cp->cpcmd &= ~RxChkSum;
>
>+ if (features & NETIF_F_HW_VLAN_RX)
>+ cp->cpcmd |= RxVlanOn;
>+ else
>+ cp->cpcmd &= ~RxVlanOn;
>+
> cpw16_f(CpCmd, cp->cpcmd);
> spin_unlock_irqrestore(&cp->lock, flags);
>
>@@ -1818,9 +1791,6 @@ static const struct net_device_ops cp_netdev_ops = {
> .ndo_start_xmit = cp_start_xmit,
> .ndo_tx_timeout = cp_tx_timeout,
> .ndo_set_features = cp_set_features,
>-#if CP_VLAN_TAG_USED
>- .ndo_vlan_rx_register = cp_vlan_rx_register,
>-#endif
> #ifdef BROKEN
> .ndo_change_mtu = cp_change_mtu,
> #endif
>@@ -1949,15 +1919,16 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
> dev->ethtool_ops = &cp_ethtool_ops;
> dev->watchdog_timeo = TX_TIMEOUT;
>
>-#if CP_VLAN_TAG_USED
> dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
>-#endif
>
> if (pci_using_dac)
> dev->features |= NETIF_F_HIGHDMA;
>
> /* disabled by default until verified */
>- dev->hw_features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
>+ dev->hw_features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
>+ NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
>+ dev->vlan_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO |
>+ NETIF_F_HIGHDMA;
>
> dev->irq = pdev->irq;
>
>--
>1.7.4.4
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] 8139cp: convert to new VLAN model.
2011-07-15 11:36 ` Jiri Pirko
@ 2011-07-15 15:09 ` David Miller
0 siblings, 0 replies; 3+ messages in thread
From: David Miller @ 2011-07-15 15:09 UTC (permalink / raw)
To: jpirko; +Cc: romieu, shemminger, netdev
From: Jiri Pirko <jpirko@redhat.com>
Date: Fri, 15 Jul 2011 13:36:31 +0200
> Similar patch is in my local git :)
>
> Reviewed-by: Jiri Pirko <jpirko@redhat.com>
Applied to net-next-2.6, thanks.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-07-15 15:09 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-07-15 10:21 [PATCH] 8139cp: convert to new VLAN model Francois Romieu
2011-07-15 11:36 ` Jiri Pirko
2011-07-15 15:09 ` David Miller
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).