Re: [OpenWrt-Devel] [RFC] Fix VLAN on Atheros AR8327N

2014-09-23 Thread Aaron Z
On Tue, Sep 23, 2014 at 6:22 AM, Felix Fietkau  wrote:
> Hi Valentin,
> I finally got around to properly reviewing your changes, and they look
> correct to me. I committed them in r42652, r42653 - let's see if any new
> issues show up.
It works as expected on my TPLink TL-WR1043ND (using the r42653 image).
Is there any chance of this making 14.07, or will it need to wait for 14.07.1?

Thanks

Aaron Z
A human being should be able to change a diaper, plan an invasion,
butcher a hog, conn a ship, design a building, write a sonnet, balance
accounts, build a wall, set a bone, comfort the dying, take orders,
give orders, cooperate, act alone, solve equations, analyze a new
problem, pitch manure, program a computer, cook a tasty meal, fight
efficiently, die gallantly. Specialization is for insects.
— Robert Heinlein, Time Enough for Love
___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


Re: [OpenWrt-Devel] [RFC] Fix VLAN on Atheros AR8327N

2014-09-23 Thread Felix Fietkau
On 2014-09-23 19:19, Jiri Pirko wrote:
> Tue, Sep 23, 2014 at 12:22:02PM CEST, n...@openwrt.org wrote:
>>On 2014-09-17 20:25, Valentin Spreckels wrote:
>>> I'm interested in this feature. I tried to understand what the revoked
>>> patch changes and rewrote it. I submitted my changes two months ago:
>>> http://patchwork.openwrt.org/patch/5957/
>>> http://patchwork.openwrt.org/patch/5958/
>>> 
>>> My patches attempt to minimize changes in non-ar8327-specific code.
>>> 
>>> Neither the revert commit nor ticket #12181 describe the issues. So I'm
>>> not sure, if my patches have them too. Does anyone know details about
>>> the issues?
>>Hi Valentin,
>>
>>I finally got around to properly reviewing your changes, and they look
>>correct to me. I committed them in r42652, r42653 - let's see if any new
>>issues show up.
> 
> Just curious, are these 2 patches going to be backported to BB? How that
> can happen?
First I'd like to have it tested in trunk for a while.

- Felix
___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


Re: [OpenWrt-Devel] [RFC] Fix VLAN on Atheros AR8327N

2014-09-23 Thread Jiri Pirko
Tue, Sep 23, 2014 at 12:22:02PM CEST, n...@openwrt.org wrote:
>On 2014-09-17 20:25, Valentin Spreckels wrote:
>> I'm interested in this feature. I tried to understand what the revoked
>> patch changes and rewrote it. I submitted my changes two months ago:
>> http://patchwork.openwrt.org/patch/5957/
>> http://patchwork.openwrt.org/patch/5958/
>> 
>> My patches attempt to minimize changes in non-ar8327-specific code.
>> 
>> Neither the revert commit nor ticket #12181 describe the issues. So I'm
>> not sure, if my patches have them too. Does anyone know details about
>> the issues?
>Hi Valentin,
>
>I finally got around to properly reviewing your changes, and they look
>correct to me. I committed them in r42652, r42653 - let's see if any new
>issues show up.

Just curious, are these 2 patches going to be backported to BB? How that
can happen?

Thanks.


>
>Thanks,
>
>- Felix
>___
>openwrt-devel mailing list
>openwrt-devel@lists.openwrt.org
>https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


Re: [OpenWrt-Devel] [RFC] Fix VLAN on Atheros AR8327N

2014-09-23 Thread Felix Fietkau
On 2014-09-17 20:25, Valentin Spreckels wrote:
> I'm interested in this feature. I tried to understand what the revoked
> patch changes and rewrote it. I submitted my changes two months ago:
> http://patchwork.openwrt.org/patch/5957/
> http://patchwork.openwrt.org/patch/5958/
> 
> My patches attempt to minimize changes in non-ar8327-specific code.
> 
> Neither the revert commit nor ticket #12181 describe the issues. So I'm
> not sure, if my patches have them too. Does anyone know details about
> the issues?
Hi Valentin,

I finally got around to properly reviewing your changes, and they look
correct to me. I committed them in r42652, r42653 - let's see if any new
issues show up.

Thanks,

- Felix
___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


Re: [OpenWrt-Devel] [RFC] Fix VLAN on Atheros AR8327N

2014-09-19 Thread Jiri Pirko
Wed, Sep 17, 2014 at 08:25:22PM CEST, 
valentin.spreck...@informatik.uni-oldenburg.de wrote:
>Hi,
>
>Am 17.09.2014 19:50, schrieb John Crispin:
>> 
>> 
>> On 17/09/2014 19:47, Florian Fainelli wrote:
>>> On 08/31/2014 10:42 AM, Jiri Pirko wrote:
 Sat, Jul 19, 2014 at 09:49:38PM CEST, nolt...@gmail.com wrote:
> Commit 40842 reverted the fix for tagged+untagged VLANs on
> AR8327: https://dev.openwrt.org/changeset/40777 
> https://dev.openwrt.org/changeset/40842
>
> According to jow, some people experienced some "issues" on
> older devices. Can anyone tell me what were those issues?
>
> Anyway, that patch modified some parts of the ar8216/ar8236, so
> I suppose any device with those switches were affected. 
> However, I've modified the patch keeping the ar8216/ar8236 as
> much untouched as possible. Could anyone test it on those
> devices?
>
> BTW, this works for me on a TP-Link WDR4300 (ar8327).


 I tested the patch on TL-WR1043ND v2 with Atheros AR8327 rev. 4.
 Vlans are working as expected. Please include this into BB (might
 need repost)

 Thanks!

 Tested-by: Jiri Pirko 
>>>
>>> Unless there are further objections, we should probably just go
>>> ahead and apply this patch since it affects a bunch of users.
>> 
>> and then the other bunch complains, as we had before. we keep applying
>> and reversing this i think. maybe we should just see what the real bug
>> is ?
>> 
>>  John
>
>I'm interested in this feature. I tried to understand what the revoked
>patch changes and rewrote it. I submitted my changes two months ago:
>http://patchwork.openwrt.org/patch/5957/
>http://patchwork.openwrt.org/patch/5958/

I like this patches. Look very clean. Will test them on wr1043v2.
Thanks.

>
>My patches attempt to minimize changes in non-ar8327-specific code.
>
>Neither the revert commit nor ticket #12181 describe the issues. So I'm
>not sure, if my patches have them too. Does anyone know details about
>the issues?
>
>- Valentin Spreckels
>
>> 
>>>


>
> Signed-off-by: Saverio Proto  
> Signed-off-by: Álvaro Fernández  --- diff
> --git a/target/linux/generic/files/drivers/net/phy/ar8216.c
> b/target/linux/generic/files/drivers/net/phy/ar8216.c index
> 3846159..9eae624 100644 ---
> a/target/linux/generic/files/drivers/net/phy/ar8216.c +++
> b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -78,7
> +78,7 @@ struct ar8xxx_chip { u32 (*read_port_status)(struct
> ar8xxx_priv *priv, int port); int (*atu_flush)(struct
> ar8xxx_priv *priv); void (*vtu_flush)(struct ar8xxx_priv
> *priv); - void (*vtu_load_vlan)(struct ar8xxx_priv *priv, u32
> vid, u32 port_mask); +void (*vtu_load_vlan)(struct ar8xxx_priv
> *priv, u32 vlan);
>
> const struct ar8xxx_mib_desc *mib_decs; unsigned num_mibs; @@
> -112,7 +112,12 @@ struct ar8327_led { enum ar8327_led_pattern
> pattern; };
>
> +struct ar8216_data { +   u8 vlan_tagged; +}; + struct
> ar8327_data { +   u8 vlan_tagged[AR8X16_MAX_VLANS]; u32
> port0_status; u32 port6_status;
>
> @@ -138,6 +143,7 @@ struct ar8xxx_priv { u8 chip_rev; const
> struct ar8xxx_chip *chip; union { +   struct ar8216_data
> ar8216; struct ar8327_data ar8327; } chip_data; bool
> initialized; @@ -159,7 +165,6 @@ struct ar8xxx_priv { bool
> vlan; u16 vlan_id[AR8X16_MAX_VLANS]; u8
> vlan_table[AR8X16_MAX_VLANS]; -   u8 vlan_tagged; u16
> pvid[AR8X16_MAX_PORTS];
>
> /* mirroring */ @@ -641,7 +646,7 @@ ar8216_mangle_rx(struct
> net_device *dev, struct sk_buff *skb) port = buf[0] & 0xf;
>
> /* no need to fix up packets coming from a tagged source */ -
> if (priv->vlan_tagged & (1 << port)) +if
> (priv->chip_data.ar8216.vlan_tagged & BIT(port)) return;
>
> /* lookup port vid from local table, the switch passes an
> invalid vlan id */ @@ -695,10 +700,13 @@
> ar8216_vtu_flush(struct ar8xxx_priv *priv) }
>
> static void -ar8216_vtu_load_vlan(struct ar8xxx_priv *priv, u32
> vid, u32 port_mask) +ar8216_vtu_load_vlan(struct ar8xxx_priv
> *priv, u32 vlan) { u32 op;
>
> + u32 vid = priv->vlan_id[vlan]; +u32 port_mask =
> priv->vlan_table[vlan]; + op = AR8216_VTU_OP_LOAD | (vid <<
> AR8216_VTU_VID_S); ar8216_vtu_op(priv, op, port_mask); } @@
> -1705,12 +1713,16 @@ ar8327_vtu_flush(struct ar8xxx_priv
> *priv) }
>
> static void -ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32
> vid, u32 port_mask) +ar8327_vtu_load_vlan(struct ar8xxx_priv
> *priv, u32 vlan) { u32 op; u32 val; int i;
>
> + u32 vid = priv->vlan_id[vlan]; +u32 port_mask =
> priv->vlan_table[vlan]; + u32 tagged =
> priv->chip_data.ar8327.vlan_tagged[vlan]; + op =
> AR8327_VTU_FUNC1_OP_LOAD | (vid << AR8327_VTU_FUNC1_VID_S); val
> = AR8327_VTU_FUNC0_VALID | AR8327_VTU_FUNC0_IVL; for 

Re: [OpenWrt-Devel] [RFC] Fix VLAN on Atheros AR8327N

2014-09-18 Thread Aaron Z
As someone who has spent much of the past week trying to figure out
why my TL-WR1043ND V2 wont work with both taggged and untagged packets
on the same port, I am all for it being applied.
If its not, a note on the 1043 page in the wiki explaining that you
cant have tagged and untagged packets on the same port in versions X,
Y and Z and linking to the patch would be very useful...

Aaron Z
A human being should be able to change a diaper, plan an invasion,
butcher a hog, conn a ship, design a building, write a sonnet, balance
accounts, build a wall, set a bone, comfort the dying, take orders,
give orders, cooperate, act alone, solve equations, analyze a new
problem, pitch manure, program a computer, cook a tasty meal, fight
efficiently, die gallantly. Specialization is for insects.
— Robert Heinlein, Time Enough for Love
___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


Re: [OpenWrt-Devel] [RFC] Fix VLAN on Atheros AR8327N

2014-09-17 Thread Valentin Spreckels
Hi,

Am 17.09.2014 19:50, schrieb John Crispin:
> 
> 
> On 17/09/2014 19:47, Florian Fainelli wrote:
>> On 08/31/2014 10:42 AM, Jiri Pirko wrote:
>>> Sat, Jul 19, 2014 at 09:49:38PM CEST, nolt...@gmail.com wrote:
 Commit 40842 reverted the fix for tagged+untagged VLANs on
 AR8327: https://dev.openwrt.org/changeset/40777 
 https://dev.openwrt.org/changeset/40842

 According to jow, some people experienced some "issues" on
 older devices. Can anyone tell me what were those issues?

 Anyway, that patch modified some parts of the ar8216/ar8236, so
 I suppose any device with those switches were affected. 
 However, I've modified the patch keeping the ar8216/ar8236 as
 much untouched as possible. Could anyone test it on those
 devices?

 BTW, this works for me on a TP-Link WDR4300 (ar8327).
>>>
>>>
>>> I tested the patch on TL-WR1043ND v2 with Atheros AR8327 rev. 4.
>>> Vlans are working as expected. Please include this into BB (might
>>> need repost)
>>>
>>> Thanks!
>>>
>>> Tested-by: Jiri Pirko 
>>
>> Unless there are further objections, we should probably just go
>> ahead and apply this patch since it affects a bunch of users.
> 
> and then the other bunch complains, as we had before. we keep applying
> and reversing this i think. maybe we should just see what the real bug
> is ?
> 
>   John

I'm interested in this feature. I tried to understand what the revoked
patch changes and rewrote it. I submitted my changes two months ago:
http://patchwork.openwrt.org/patch/5957/
http://patchwork.openwrt.org/patch/5958/

My patches attempt to minimize changes in non-ar8327-specific code.

Neither the revert commit nor ticket #12181 describe the issues. So I'm
not sure, if my patches have them too. Does anyone know details about
the issues?

- Valentin Spreckels

> 
>>
>>>
>>>

 Signed-off-by: Saverio Proto  
 Signed-off-by: Álvaro Fernández  --- diff
 --git a/target/linux/generic/files/drivers/net/phy/ar8216.c
 b/target/linux/generic/files/drivers/net/phy/ar8216.c index
 3846159..9eae624 100644 ---
 a/target/linux/generic/files/drivers/net/phy/ar8216.c +++
 b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -78,7
 +78,7 @@ struct ar8xxx_chip { u32 (*read_port_status)(struct
 ar8xxx_priv *priv, int port); int (*atu_flush)(struct
 ar8xxx_priv *priv); void (*vtu_flush)(struct ar8xxx_priv
 *priv); -  void (*vtu_load_vlan)(struct ar8xxx_priv *priv, u32
 vid, u32 port_mask); + void (*vtu_load_vlan)(struct ar8xxx_priv
 *priv, u32 vlan);

 const struct ar8xxx_mib_desc *mib_decs; unsigned num_mibs; @@
 -112,7 +112,12 @@ struct ar8327_led { enum ar8327_led_pattern
 pattern; };

 +struct ar8216_data { +u8 vlan_tagged; +}; + struct
 ar8327_data { +u8 vlan_tagged[AR8X16_MAX_VLANS]; u32
 port0_status; u32 port6_status;

 @@ -138,6 +143,7 @@ struct ar8xxx_priv { u8 chip_rev; const
 struct ar8xxx_chip *chip; union { +struct ar8216_data
 ar8216; struct ar8327_data ar8327; } chip_data; bool
 initialized; @@ -159,7 +165,6 @@ struct ar8xxx_priv { bool
 vlan; u16 vlan_id[AR8X16_MAX_VLANS]; u8
 vlan_table[AR8X16_MAX_VLANS]; -u8 vlan_tagged; u16
 pvid[AR8X16_MAX_PORTS];

 /* mirroring */ @@ -641,7 +646,7 @@ ar8216_mangle_rx(struct
 net_device *dev, struct sk_buff *skb) port = buf[0] & 0xf;

 /* no need to fix up packets coming from a tagged source */ -
 if (priv->vlan_tagged & (1 << port)) + if
 (priv->chip_data.ar8216.vlan_tagged & BIT(port)) return;

 /* lookup port vid from local table, the switch passes an
 invalid vlan id */ @@ -695,10 +700,13 @@
 ar8216_vtu_flush(struct ar8xxx_priv *priv) }

 static void -ar8216_vtu_load_vlan(struct ar8xxx_priv *priv, u32
 vid, u32 port_mask) +ar8216_vtu_load_vlan(struct ar8xxx_priv
 *priv, u32 vlan) { u32 op;

 +  u32 vid = priv->vlan_id[vlan]; +u32 port_mask =
 priv->vlan_table[vlan]; + op = AR8216_VTU_OP_LOAD | (vid <<
 AR8216_VTU_VID_S); ar8216_vtu_op(priv, op, port_mask); } @@
 -1705,12 +1713,16 @@ ar8327_vtu_flush(struct ar8xxx_priv
 *priv) }

 static void -ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32
 vid, u32 port_mask) +ar8327_vtu_load_vlan(struct ar8xxx_priv
 *priv, u32 vlan) { u32 op; u32 val; int i;

 +  u32 vid = priv->vlan_id[vlan]; +u32 port_mask =
 priv->vlan_table[vlan]; +  u32 tagged =
 priv->chip_data.ar8327.vlan_tagged[vlan]; + op =
 AR8327_VTU_FUNC1_OP_LOAD | (vid << AR8327_VTU_FUNC1_VID_S); val
 = AR8327_VTU_FUNC0_VALID | AR8327_VTU_FUNC0_IVL; for (i = 0; i
 < AR8327_NUM_PORTS; i++) { @@ -1720,7 +1732,7 @@
 ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vid, u32
 port_mask) mode = AR8327_VTU_FUNC0_EG_MODE_NOT; else if
 (priv->vlan == 0) mode = AR8327_VTU_FUNC0_EG_MODE_KEEP; -  else
 if (p

Re: [OpenWrt-Devel] [RFC] Fix VLAN on Atheros AR8327N

2014-09-17 Thread John Crispin


On 17/09/2014 19:47, Florian Fainelli wrote:
> On 08/31/2014 10:42 AM, Jiri Pirko wrote:
>> Sat, Jul 19, 2014 at 09:49:38PM CEST, nolt...@gmail.com wrote:
>>> Commit 40842 reverted the fix for tagged+untagged VLANs on
>>> AR8327: https://dev.openwrt.org/changeset/40777 
>>> https://dev.openwrt.org/changeset/40842
>>> 
>>> According to jow, some people experienced some "issues" on
>>> older devices. Can anyone tell me what were those issues?
>>> 
>>> Anyway, that patch modified some parts of the ar8216/ar8236, so
>>> I suppose any device with those switches were affected. 
>>> However, I've modified the patch keeping the ar8216/ar8236 as
>>> much untouched as possible. Could anyone test it on those
>>> devices?
>>> 
>>> BTW, this works for me on a TP-Link WDR4300 (ar8327).
>> 
>> 
>> I tested the patch on TL-WR1043ND v2 with Atheros AR8327 rev. 4.
>> Vlans are working as expected. Please include this into BB (might
>> need repost)
>> 
>> Thanks!
>> 
>> Tested-by: Jiri Pirko 
> 
> Unless there are further objections, we should probably just go
> ahead and apply this patch since it affects a bunch of users.

and then the other bunch complains, as we had before. we keep applying
and reversing this i think. maybe we should just see what the real bug
is ?

John


> 
>> 
>> 
>>> 
>>> Signed-off-by: Saverio Proto  
>>> Signed-off-by: Álvaro Fernández  --- diff
>>> --git a/target/linux/generic/files/drivers/net/phy/ar8216.c
>>> b/target/linux/generic/files/drivers/net/phy/ar8216.c index
>>> 3846159..9eae624 100644 ---
>>> a/target/linux/generic/files/drivers/net/phy/ar8216.c +++
>>> b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -78,7
>>> +78,7 @@ struct ar8xxx_chip { u32 (*read_port_status)(struct
>>> ar8xxx_priv *priv, int port); int (*atu_flush)(struct
>>> ar8xxx_priv *priv); void (*vtu_flush)(struct ar8xxx_priv
>>> *priv); -   void (*vtu_load_vlan)(struct ar8xxx_priv *priv, u32
>>> vid, u32 port_mask); +  void (*vtu_load_vlan)(struct ar8xxx_priv
>>> *priv, u32 vlan);
>>> 
>>> const struct ar8xxx_mib_desc *mib_decs; unsigned num_mibs; @@
>>> -112,7 +112,12 @@ struct ar8327_led { enum ar8327_led_pattern
>>> pattern; };
>>> 
>>> +struct ar8216_data { + u8 vlan_tagged; +}; + struct
>>> ar8327_data { + u8 vlan_tagged[AR8X16_MAX_VLANS]; u32
>>> port0_status; u32 port6_status;
>>> 
>>> @@ -138,6 +143,7 @@ struct ar8xxx_priv { u8 chip_rev; const
>>> struct ar8xxx_chip *chip; union { + struct ar8216_data
>>> ar8216; struct ar8327_data ar8327; } chip_data; bool
>>> initialized; @@ -159,7 +165,6 @@ struct ar8xxx_priv { bool
>>> vlan; u16 vlan_id[AR8X16_MAX_VLANS]; u8
>>> vlan_table[AR8X16_MAX_VLANS]; - u8 vlan_tagged; u16
>>> pvid[AR8X16_MAX_PORTS];
>>> 
>>> /* mirroring */ @@ -641,7 +646,7 @@ ar8216_mangle_rx(struct
>>> net_device *dev, struct sk_buff *skb) port = buf[0] & 0xf;
>>> 
>>> /* no need to fix up packets coming from a tagged source */ -
>>> if (priv->vlan_tagged & (1 << port)) +  if
>>> (priv->chip_data.ar8216.vlan_tagged & BIT(port)) return;
>>> 
>>> /* lookup port vid from local table, the switch passes an
>>> invalid vlan id */ @@ -695,10 +700,13 @@
>>> ar8216_vtu_flush(struct ar8xxx_priv *priv) }
>>> 
>>> static void -ar8216_vtu_load_vlan(struct ar8xxx_priv *priv, u32
>>> vid, u32 port_mask) +ar8216_vtu_load_vlan(struct ar8xxx_priv
>>> *priv, u32 vlan) { u32 op;
>>> 
>>> +   u32 vid = priv->vlan_id[vlan]; +u32 port_mask =
>>> priv->vlan_table[vlan]; + op = AR8216_VTU_OP_LOAD | (vid <<
>>> AR8216_VTU_VID_S); ar8216_vtu_op(priv, op, port_mask); } @@
>>> -1705,12 +1713,16 @@ ar8327_vtu_flush(struct ar8xxx_priv
>>> *priv) }
>>> 
>>> static void -ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32
>>> vid, u32 port_mask) +ar8327_vtu_load_vlan(struct ar8xxx_priv
>>> *priv, u32 vlan) { u32 op; u32 val; int i;
>>> 
>>> +   u32 vid = priv->vlan_id[vlan]; +u32 port_mask =
>>> priv->vlan_table[vlan]; +   u32 tagged =
>>> priv->chip_data.ar8327.vlan_tagged[vlan]; + op =
>>> AR8327_VTU_FUNC1_OP_LOAD | (vid << AR8327_VTU_FUNC1_VID_S); val
>>> = AR8327_VTU_FUNC0_VALID | AR8327_VTU_FUNC0_IVL; for (i = 0; i
>>> < AR8327_NUM_PORTS; i++) { @@ -1720,7 +1732,7 @@
>>> ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vid, u32
>>> port_mask) mode = AR8327_VTU_FUNC0_EG_MODE_NOT; else if
>>> (priv->vlan == 0) mode = AR8327_VTU_FUNC0_EG_MODE_KEEP; -   else
>>> if (priv->vlan_tagged & BIT(i)) +   else if (tagged & BIT(i)) 
>>> mode = AR8327_VTU_FUNC0_EG_MODE_TAG; else mode =
>>> AR8327_VTU_FUNC0_EG_MODE_UNTAG; @@ -1734,26 +1746,22 @@ static
>>> void ar8327_setup_port(struct ar8xxx_priv *priv, int port, u32
>>> egress, u32 ingress, u32 members, u32 pvid) { - u32 t; -u32
>>> mode; + u32 mode, t; + +if (priv->vlan) { + pvid =
>>> priv->vlan_id[priv->pvid[port]]; +  mode =
>>> AR8327_PORT_VLAN1_OUT_MODE_UNMOD; + ingress =
>>> AR8216_IN_SECURE; + } else { +  pvid = port; +  mode =
>>> AR8

Re: [OpenWrt-Devel] [RFC] Fix VLAN on Atheros AR8327N

2014-09-17 Thread Florian Fainelli
On 08/31/2014 10:42 AM, Jiri Pirko wrote:
> Sat, Jul 19, 2014 at 09:49:38PM CEST, nolt...@gmail.com wrote:
>> Commit 40842 reverted the fix for tagged+untagged VLANs on AR8327:
>> https://dev.openwrt.org/changeset/40777
>> https://dev.openwrt.org/changeset/40842
>>
>> According to jow, some people experienced some "issues" on older devices. 
>> Can anyone tell me what were those issues?
>>
>> Anyway, that patch modified some parts of the ar8216/ar8236, so I suppose 
>> any device with those switches were affected.
>> However, I've modified the patch keeping the ar8216/ar8236 as much untouched 
>> as possible.
>> Could anyone test it on those devices?
>>
>> BTW, this works for me on a TP-Link WDR4300 (ar8327).
> 
> 
> I tested the patch on TL-WR1043ND v2 with Atheros AR8327 rev. 4. Vlans
> are working as expected. Please include this into BB (might need repost)
> 
> Thanks!
> 
> Tested-by: Jiri Pirko 

Unless there are further objections, we should probably just go ahead
and apply this patch since it affects a bunch of users.

> 
> 
>>
>> Signed-off-by: Saverio Proto 
>> Signed-off-by: Álvaro Fernández 
>> ---
>> diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c 
>> b/target/linux/generic/files/drivers/net/phy/ar8216.c
>> index 3846159..9eae624 100644
>> --- a/target/linux/generic/files/drivers/net/phy/ar8216.c
>> +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c
>> @@ -78,7 +78,7 @@ struct ar8xxx_chip {
>>  u32 (*read_port_status)(struct ar8xxx_priv *priv, int port);
>>  int (*atu_flush)(struct ar8xxx_priv *priv);
>>  void (*vtu_flush)(struct ar8xxx_priv *priv);
>> -void (*vtu_load_vlan)(struct ar8xxx_priv *priv, u32 vid, u32 port_mask);
>> +void (*vtu_load_vlan)(struct ar8xxx_priv *priv, u32 vlan);
>>
>>  const struct ar8xxx_mib_desc *mib_decs;
>>  unsigned num_mibs;
>> @@ -112,7 +112,12 @@ struct ar8327_led {
>>  enum ar8327_led_pattern pattern;
>> };
>>
>> +struct ar8216_data {
>> +u8 vlan_tagged;
>> +};
>> +
>> struct ar8327_data {
>> +u8 vlan_tagged[AR8X16_MAX_VLANS];
>>  u32 port0_status;
>>  u32 port6_status;
>>
>> @@ -138,6 +143,7 @@ struct ar8xxx_priv {
>>  u8 chip_rev;
>>  const struct ar8xxx_chip *chip;
>>  union {
>> +struct ar8216_data ar8216;
>>  struct ar8327_data ar8327;
>>  } chip_data;
>>  bool initialized;
>> @@ -159,7 +165,6 @@ struct ar8xxx_priv {
>>  bool vlan;
>>  u16 vlan_id[AR8X16_MAX_VLANS];
>>  u8 vlan_table[AR8X16_MAX_VLANS];
>> -u8 vlan_tagged;
>>  u16 pvid[AR8X16_MAX_PORTS];
>>
>>  /* mirroring */
>> @@ -641,7 +646,7 @@ ar8216_mangle_rx(struct net_device *dev, struct sk_buff 
>> *skb)
>>  port = buf[0] & 0xf;
>>
>>  /* no need to fix up packets coming from a tagged source */
>> -if (priv->vlan_tagged & (1 << port))
>> +if (priv->chip_data.ar8216.vlan_tagged & BIT(port))
>>  return;
>>
>>  /* lookup port vid from local table, the switch passes an invalid vlan 
>> id */
>> @@ -695,10 +700,13 @@ ar8216_vtu_flush(struct ar8xxx_priv *priv)
>> }
>>
>> static void
>> -ar8216_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vid, u32 port_mask)
>> +ar8216_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vlan)
>> {
>>  u32 op;
>>
>> +u32 vid = priv->vlan_id[vlan];
>> +u32 port_mask = priv->vlan_table[vlan];
>> +
>>  op = AR8216_VTU_OP_LOAD | (vid << AR8216_VTU_VID_S);
>>  ar8216_vtu_op(priv, op, port_mask);
>> }
>> @@ -1705,12 +1713,16 @@ ar8327_vtu_flush(struct ar8xxx_priv *priv)
>> }
>>
>> static void
>> -ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vid, u32 port_mask)
>> +ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vlan)
>> {
>>  u32 op;
>>  u32 val;
>>  int i;
>>
>> +u32 vid = priv->vlan_id[vlan];
>> +u32 port_mask = priv->vlan_table[vlan];
>> +u32 tagged = priv->chip_data.ar8327.vlan_tagged[vlan];
>> +
>>  op = AR8327_VTU_FUNC1_OP_LOAD | (vid << AR8327_VTU_FUNC1_VID_S);
>>  val = AR8327_VTU_FUNC0_VALID | AR8327_VTU_FUNC0_IVL;
>>  for (i = 0; i < AR8327_NUM_PORTS; i++) {
>> @@ -1720,7 +1732,7 @@ ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32 
>> vid, u32 port_mask)
>>  mode = AR8327_VTU_FUNC0_EG_MODE_NOT;
>>  else if (priv->vlan == 0)
>>  mode = AR8327_VTU_FUNC0_EG_MODE_KEEP;
>> -else if (priv->vlan_tagged & BIT(i))
>> +else if (tagged & BIT(i))
>>  mode = AR8327_VTU_FUNC0_EG_MODE_TAG;
>>  else
>>  mode = AR8327_VTU_FUNC0_EG_MODE_UNTAG;
>> @@ -1734,26 +1746,22 @@ static void
>> ar8327_setup_port(struct ar8xxx_priv *priv, int port, u32 egress, u32 
>> ingress,
>>u32 members, u32 pvid)
>> {
>> -u32 t;
>> -u32 mode;
>> +u32 mode, t;
>> +
>> +if (priv->vlan) {
>> +pvid = priv->vlan_id[priv->pvid[port]];
>> +mode = AR8327_PORT_VLAN1_OUT_MODE_UNMOD;
>> +ingress = AR8

Re: [OpenWrt-Devel] [RFC] Fix VLAN on Atheros AR8327N

2014-08-31 Thread Jiri Pirko
Sat, Jul 19, 2014 at 09:49:38PM CEST, nolt...@gmail.com wrote:
>Commit 40842 reverted the fix for tagged+untagged VLANs on AR8327:
>https://dev.openwrt.org/changeset/40777
>https://dev.openwrt.org/changeset/40842
>
>According to jow, some people experienced some "issues" on older devices. Can 
>anyone tell me what were those issues?
>
>Anyway, that patch modified some parts of the ar8216/ar8236, so I suppose any 
>device with those switches were affected.
>However, I've modified the patch keeping the ar8216/ar8236 as much untouched 
>as possible.
>Could anyone test it on those devices?
>
>BTW, this works for me on a TP-Link WDR4300 (ar8327).


I tested the patch on TL-WR1043ND v2 with Atheros AR8327 rev. 4. Vlans
are working as expected. Please include this into BB (might need repost)

Thanks!

Tested-by: Jiri Pirko 


>
>Signed-off-by: Saverio Proto 
>Signed-off-by: Álvaro Fernández 
>---
>diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c 
>b/target/linux/generic/files/drivers/net/phy/ar8216.c
>index 3846159..9eae624 100644
>--- a/target/linux/generic/files/drivers/net/phy/ar8216.c
>+++ b/target/linux/generic/files/drivers/net/phy/ar8216.c
>@@ -78,7 +78,7 @@ struct ar8xxx_chip {
>   u32 (*read_port_status)(struct ar8xxx_priv *priv, int port);
>   int (*atu_flush)(struct ar8xxx_priv *priv);
>   void (*vtu_flush)(struct ar8xxx_priv *priv);
>-  void (*vtu_load_vlan)(struct ar8xxx_priv *priv, u32 vid, u32 port_mask);
>+  void (*vtu_load_vlan)(struct ar8xxx_priv *priv, u32 vlan);
> 
>   const struct ar8xxx_mib_desc *mib_decs;
>   unsigned num_mibs;
>@@ -112,7 +112,12 @@ struct ar8327_led {
>   enum ar8327_led_pattern pattern;
> };
> 
>+struct ar8216_data {
>+  u8 vlan_tagged;
>+};
>+
> struct ar8327_data {
>+  u8 vlan_tagged[AR8X16_MAX_VLANS];
>   u32 port0_status;
>   u32 port6_status;
> 
>@@ -138,6 +143,7 @@ struct ar8xxx_priv {
>   u8 chip_rev;
>   const struct ar8xxx_chip *chip;
>   union {
>+  struct ar8216_data ar8216;
>   struct ar8327_data ar8327;
>   } chip_data;
>   bool initialized;
>@@ -159,7 +165,6 @@ struct ar8xxx_priv {
>   bool vlan;
>   u16 vlan_id[AR8X16_MAX_VLANS];
>   u8 vlan_table[AR8X16_MAX_VLANS];
>-  u8 vlan_tagged;
>   u16 pvid[AR8X16_MAX_PORTS];
> 
>   /* mirroring */
>@@ -641,7 +646,7 @@ ar8216_mangle_rx(struct net_device *dev, struct sk_buff 
>*skb)
>   port = buf[0] & 0xf;
> 
>   /* no need to fix up packets coming from a tagged source */
>-  if (priv->vlan_tagged & (1 << port))
>+  if (priv->chip_data.ar8216.vlan_tagged & BIT(port))
>   return;
> 
>   /* lookup port vid from local table, the switch passes an invalid vlan 
> id */
>@@ -695,10 +700,13 @@ ar8216_vtu_flush(struct ar8xxx_priv *priv)
> }
> 
> static void
>-ar8216_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vid, u32 port_mask)
>+ar8216_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vlan)
> {
>   u32 op;
> 
>+  u32 vid = priv->vlan_id[vlan];
>+  u32 port_mask = priv->vlan_table[vlan];
>+
>   op = AR8216_VTU_OP_LOAD | (vid << AR8216_VTU_VID_S);
>   ar8216_vtu_op(priv, op, port_mask);
> }
>@@ -1705,12 +1713,16 @@ ar8327_vtu_flush(struct ar8xxx_priv *priv)
> }
> 
> static void
>-ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vid, u32 port_mask)
>+ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vlan)
> {
>   u32 op;
>   u32 val;
>   int i;
> 
>+  u32 vid = priv->vlan_id[vlan];
>+  u32 port_mask = priv->vlan_table[vlan];
>+  u32 tagged = priv->chip_data.ar8327.vlan_tagged[vlan];
>+
>   op = AR8327_VTU_FUNC1_OP_LOAD | (vid << AR8327_VTU_FUNC1_VID_S);
>   val = AR8327_VTU_FUNC0_VALID | AR8327_VTU_FUNC0_IVL;
>   for (i = 0; i < AR8327_NUM_PORTS; i++) {
>@@ -1720,7 +1732,7 @@ ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vid, 
>u32 port_mask)
>   mode = AR8327_VTU_FUNC0_EG_MODE_NOT;
>   else if (priv->vlan == 0)
>   mode = AR8327_VTU_FUNC0_EG_MODE_KEEP;
>-  else if (priv->vlan_tagged & BIT(i))
>+  else if (tagged & BIT(i))
>   mode = AR8327_VTU_FUNC0_EG_MODE_TAG;
>   else
>   mode = AR8327_VTU_FUNC0_EG_MODE_UNTAG;
>@@ -1734,26 +1746,22 @@ static void
> ar8327_setup_port(struct ar8xxx_priv *priv, int port, u32 egress, u32 ingress,
> u32 members, u32 pvid)
> {
>-  u32 t;
>-  u32 mode;
>+  u32 mode, t;
>+
>+  if (priv->vlan) {
>+  pvid = priv->vlan_id[priv->pvid[port]];
>+  mode = AR8327_PORT_VLAN1_OUT_MODE_UNMOD;
>+  ingress = AR8216_IN_SECURE;
>+  } else {
>+  pvid = port;
>+  mode = AR8327_PORT_VLAN1_OUT_MODE_UNTOUCH;
>+  ingress = AR8216_IN_PORT_ONLY;
>+  }
> 
>   t = pvid << AR8327_PORT_VLAN0_DEF_SVID_S;
>   t |= pvid << AR8327_PORT_VLAN0_DEF_CVID_S;
>   pri

[OpenWrt-Devel] [RFC] Fix VLAN on Atheros AR8327N

2014-07-19 Thread Álvaro Fernández Rojas
Commit 40842 reverted the fix for tagged+untagged VLANs on AR8327:
https://dev.openwrt.org/changeset/40777
https://dev.openwrt.org/changeset/40842

According to jow, some people experienced some "issues" on older devices. Can 
anyone tell me what were those issues?

Anyway, that patch modified some parts of the ar8216/ar8236, so I suppose any 
device with those switches were affected.
However, I've modified the patch keeping the ar8216/ar8236 as much untouched as 
possible.
Could anyone test it on those devices?

BTW, this works for me on a TP-Link WDR4300 (ar8327).

Signed-off-by: Saverio Proto 
Signed-off-by: Álvaro Fernández 
---
diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c 
b/target/linux/generic/files/drivers/net/phy/ar8216.c
index 3846159..9eae624 100644
--- a/target/linux/generic/files/drivers/net/phy/ar8216.c
+++ b/target/linux/generic/files/drivers/net/phy/ar8216.c
@@ -78,7 +78,7 @@ struct ar8xxx_chip {
u32 (*read_port_status)(struct ar8xxx_priv *priv, int port);
int (*atu_flush)(struct ar8xxx_priv *priv);
void (*vtu_flush)(struct ar8xxx_priv *priv);
-   void (*vtu_load_vlan)(struct ar8xxx_priv *priv, u32 vid, u32 port_mask);
+   void (*vtu_load_vlan)(struct ar8xxx_priv *priv, u32 vlan);
 
const struct ar8xxx_mib_desc *mib_decs;
unsigned num_mibs;
@@ -112,7 +112,12 @@ struct ar8327_led {
enum ar8327_led_pattern pattern;
 };
 
+struct ar8216_data {
+   u8 vlan_tagged;
+};
+
 struct ar8327_data {
+   u8 vlan_tagged[AR8X16_MAX_VLANS];
u32 port0_status;
u32 port6_status;
 
@@ -138,6 +143,7 @@ struct ar8xxx_priv {
u8 chip_rev;
const struct ar8xxx_chip *chip;
union {
+   struct ar8216_data ar8216;
struct ar8327_data ar8327;
} chip_data;
bool initialized;
@@ -159,7 +165,6 @@ struct ar8xxx_priv {
bool vlan;
u16 vlan_id[AR8X16_MAX_VLANS];
u8 vlan_table[AR8X16_MAX_VLANS];
-   u8 vlan_tagged;
u16 pvid[AR8X16_MAX_PORTS];
 
/* mirroring */
@@ -641,7 +646,7 @@ ar8216_mangle_rx(struct net_device *dev, struct sk_buff 
*skb)
port = buf[0] & 0xf;
 
/* no need to fix up packets coming from a tagged source */
-   if (priv->vlan_tagged & (1 << port))
+   if (priv->chip_data.ar8216.vlan_tagged & BIT(port))
return;
 
/* lookup port vid from local table, the switch passes an invalid vlan 
id */
@@ -695,10 +700,13 @@ ar8216_vtu_flush(struct ar8xxx_priv *priv)
 }
 
 static void
-ar8216_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vid, u32 port_mask)
+ar8216_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vlan)
 {
u32 op;
 
+   u32 vid = priv->vlan_id[vlan];
+   u32 port_mask = priv->vlan_table[vlan];
+
op = AR8216_VTU_OP_LOAD | (vid << AR8216_VTU_VID_S);
ar8216_vtu_op(priv, op, port_mask);
 }
@@ -1705,12 +1713,16 @@ ar8327_vtu_flush(struct ar8xxx_priv *priv)
 }
 
 static void
-ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vid, u32 port_mask)
+ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vlan)
 {
u32 op;
u32 val;
int i;
 
+   u32 vid = priv->vlan_id[vlan];
+   u32 port_mask = priv->vlan_table[vlan];
+   u32 tagged = priv->chip_data.ar8327.vlan_tagged[vlan];
+
op = AR8327_VTU_FUNC1_OP_LOAD | (vid << AR8327_VTU_FUNC1_VID_S);
val = AR8327_VTU_FUNC0_VALID | AR8327_VTU_FUNC0_IVL;
for (i = 0; i < AR8327_NUM_PORTS; i++) {
@@ -1720,7 +1732,7 @@ ar8327_vtu_load_vlan(struct ar8xxx_priv *priv, u32 vid, 
u32 port_mask)
mode = AR8327_VTU_FUNC0_EG_MODE_NOT;
else if (priv->vlan == 0)
mode = AR8327_VTU_FUNC0_EG_MODE_KEEP;
-   else if (priv->vlan_tagged & BIT(i))
+   else if (tagged & BIT(i))
mode = AR8327_VTU_FUNC0_EG_MODE_TAG;
else
mode = AR8327_VTU_FUNC0_EG_MODE_UNTAG;
@@ -1734,26 +1746,22 @@ static void
 ar8327_setup_port(struct ar8xxx_priv *priv, int port, u32 egress, u32 ingress,
  u32 members, u32 pvid)
 {
-   u32 t;
-   u32 mode;
+   u32 mode, t;
+
+   if (priv->vlan) {
+   pvid = priv->vlan_id[priv->pvid[port]];
+   mode = AR8327_PORT_VLAN1_OUT_MODE_UNMOD;
+   ingress = AR8216_IN_SECURE;
+   } else {
+   pvid = port;
+   mode = AR8327_PORT_VLAN1_OUT_MODE_UNTOUCH;
+   ingress = AR8216_IN_PORT_ONLY;
+   }
 
t = pvid << AR8327_PORT_VLAN0_DEF_SVID_S;
t |= pvid << AR8327_PORT_VLAN0_DEF_CVID_S;
priv->write(priv, AR8327_REG_PORT_VLAN0(port), t);
 
-   mode = AR8327_PORT_VLAN1_OUT_MODE_UNMOD;
-   switch (egress) {
-   case AR8216_OUT_KEEP:
-   mode = AR8327_PORT_VLAN1_OUT_MODE_UNTOUCH;
-   break;
-   case AR8216_OUT_STRIP_VLAN:
-   mode = AR8327_PORT_VLAN