Subject: [PATCH] via-velocity: classical linux vlan api - step by step Let's see if it breaks... Signed-off-by: Francois Romieu --- drivers/net/via-velocity.c | 16 +++++++++++++++- drivers/net/via-velocity.h | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) applies-to: 1c7602275d3104c41cef7c5a05e2aeec230ad2b1 e695145bbe3ad71858eb65b6afb155fe6d8b8ab9 diff --git a/drivers/net/via-velocity.c b/drivers/net/via-velocity.c index 4062d44..7cb4fda 100644 --- a/drivers/net/via-velocity.c +++ b/drivers/net/via-velocity.c @@ -282,6 +282,19 @@ static inline u16 velocity_tx_vlan_tag(s vlan_tx_tag_get(skb) : 0x00; } +static int velocity_rx_vlan_skb(struct velocity_info *vptr, struct rx_desc *rd, + struct sk_buff *skb) +{ + int ret; + + if (vptr->vlgrp && (rd->rdesc0.RSR & RSR_VTAG)) { + vlan_hwaccel_rx(skb, vptr->vlgrp, rd->rdesc1.vlan_tag); + ret = 0; + } else + ret = -1; + return ret; +} + static void velocity_register_notifier(void) { register_inetaddr_notifier(&velocity_inetaddr_notifier); @@ -1433,7 +1446,8 @@ static int velocity_receive_frame(struct skb->protocol = eth_type_trans(skb, skb->dev); stats->rx_bytes += pkt_len; - netif_rx(skb); + if (velocity_rx_vlan_skb(vptr, rd, skb) < 0) + netif_rx(skb); return 0; } diff --git a/drivers/net/via-velocity.h b/drivers/net/via-velocity.h index 72f0743..1fff716 100644 --- a/drivers/net/via-velocity.h +++ b/drivers/net/via-velocity.h @@ -202,7 +202,7 @@ struct rdesc0 { }; struct rdesc1 { - u16 PQTAG; + u16 vlan_tag; u8 CSM; u8 IPKT; }; --- 0.99.9a