Re: [PATCH v2 1/2] drivers: net: cpsw: Add helper functions for VLAN ALE implementation

2013-01-31 Thread Mugunthan V N

On 1/31/2013 3:32 AM, Francois Romieu wrote:

Mugunthan V N mugunthan...@ti.com :
[...]

diff --git a/drivers/net/ethernet/ti/cpsw_ale.c 
b/drivers/net/ethernet/ti/cpsw_ale.c
index 0e9ccc2..18b88ce 100644
--- a/drivers/net/ethernet/ti/cpsw_ale.c
+++ b/drivers/net/ethernet/ti/cpsw_ale.c

[...]

@@ -274,19 +292,26 @@ int cpsw_ale_flush(struct cpsw_ale *ale, int port_mask)
return 0;
  }
  
-int cpsw_ale_add_ucast(struct cpsw_ale *ale, u8 *addr, int port, int flags)

+int cpsw_ale_add_ucast(struct cpsw_ale *ale, u8 *addr, int port,
+  int flags, u16 vid)
  {
u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
int idx;
  
-	cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_ADDR);

+   if (flags  ALE_VLAN) {
+   cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_VLAN_ADDR);
+   cpsw_ale_set_vlan_id(ale_entry, vid);
+   } else {
+   cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_ADDR);
+   }
+

[...]

+   if (flags  ALE_VLAN) {
+   cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_VLAN_ADDR);
+   cpsw_ale_set_vlan_id(ale_entry, vid);
+   } else {
+   cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_ADDR);
+   }
+

It could be fctored out.
Are you mentioning to have static inline function for the above two 
statements above?


[...]

@@ -362,6 +395,55 @@ int cpsw_ale_del_mcast(struct cpsw_ale *ale, u8 *addr, int 
port_mask)
return 0;
  }
  
+int cpsw_ale_add_vlan(struct cpsw_ale *ale, u16 vid, int port, int untag,

+ int reg_mcast, int unreg_mcast)
+{

[...]

+int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port_mask)

[...]

Patch #2 doesn't use the returned status code.

Will modify the prototype to return void

Regards
Mugunthan V N
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 1/2] drivers: net: cpsw: Add helper functions for VLAN ALE implementation

2013-01-31 Thread Francois Romieu
Mugunthan V N mugunthan...@ti.com :
 On 1/31/2013 3:32 AM, Francois Romieu wrote:
[...]
  It could be factored out.
 Are you mentioning to have static inline function for the above two
 statements above?

Yes. The helper function does not need to be inlined if it does not
save space: this path is not performance critical.

[...]
 Patch #2 doesn't use the returned status code.
 Will modify the prototype to return void

:o(

The driver should notify the upper layers that the request failed instead
of hiding the stuff under the carpet.

-- 
Ueimor
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 1/2] drivers: net: cpsw: Add helper functions for VLAN ALE implementation

2013-01-30 Thread Mugunthan V N
Add helper functions for VLAN ALE implementations for Add, Delete
Dump VLAN related ALE entries

Signed-off-by: Mugunthan V N mugunthan...@ti.com
---
 drivers/net/ethernet/ti/cpsw.c |8 +--
 drivers/net/ethernet/ti/cpsw_ale.c |  106 
 drivers/net/ethernet/ti/cpsw_ale.h |   20 +--
 3 files changed, 112 insertions(+), 22 deletions(-)

diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index b35e6a7..a40750e 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -345,7 +345,7 @@ static void cpsw_ndo_set_rx_mode(struct net_device *ndev)
/* program multicast address list into ALE register */
netdev_for_each_mc_addr(ha, ndev) {
cpsw_ale_add_mcast(priv-ale, (u8 *)ha-addr,
-   ALE_ALL_PORTS  priv-host_port, 0, 0);
+   ALE_ALL_PORTS  priv-host_port, 0, 0, 0);
}
}
 }
@@ -592,7 +592,7 @@ static void cpsw_slave_open(struct cpsw_slave *slave, 
struct cpsw_priv *priv)
slave_port = cpsw_get_slave_port(priv, slave-slave_num);
 
cpsw_ale_add_mcast(priv-ale, priv-ndev-broadcast,
-  1  slave_port, 0, ALE_MCAST_FWD_2);
+  1  slave_port, 0, 0, ALE_MCAST_FWD_2);
 
slave-phy = phy_connect(priv-ndev, slave-data-phy_id,
 cpsw_adjust_link, slave-data-phy_if);
@@ -624,9 +624,9 @@ static void cpsw_init_host_port(struct cpsw_priv *priv)
cpsw_ale_control_set(priv-ale, priv-host_port,
 ALE_PORT_STATE, ALE_PORT_STATE_FORWARD);
 
-   cpsw_ale_add_ucast(priv-ale, priv-mac_addr, priv-host_port, 0);
+   cpsw_ale_add_ucast(priv-ale, priv-mac_addr, priv-host_port, 0, 0);
cpsw_ale_add_mcast(priv-ale, priv-ndev-broadcast,
-  1  priv-host_port, 0, ALE_MCAST_FWD_2);
+  1  priv-host_port, 0, 0, ALE_MCAST_FWD_2);
 }
 
 static int cpsw_ndo_open(struct net_device *ndev)
diff --git a/drivers/net/ethernet/ti/cpsw_ale.c 
b/drivers/net/ethernet/ti/cpsw_ale.c
index 0e9ccc2..18b88ce 100644
--- a/drivers/net/ethernet/ti/cpsw_ale.c
+++ b/drivers/net/ethernet/ti/cpsw_ale.c
@@ -148,7 +148,7 @@ static int cpsw_ale_write(struct cpsw_ale *ale, int idx, 
u32 *ale_entry)
return idx;
 }
 
-static int cpsw_ale_match_addr(struct cpsw_ale *ale, u8 *addr)
+int cpsw_ale_match_addr(struct cpsw_ale *ale, u8 *addr, u16 vid)
 {
u32 ale_entry[ALE_ENTRY_WORDS];
int type, idx;
@@ -160,6 +160,8 @@ static int cpsw_ale_match_addr(struct cpsw_ale *ale, u8 
*addr)
type = cpsw_ale_get_entry_type(ale_entry);
if (type != ALE_TYPE_ADDR  type != ALE_TYPE_VLAN_ADDR)
continue;
+   if (cpsw_ale_get_vlan_id(ale_entry) != vid)
+   continue;
cpsw_ale_get_addr(ale_entry, entry_addr);
if (memcmp(entry_addr, addr, 6) == 0)
return idx;
@@ -167,6 +169,22 @@ static int cpsw_ale_match_addr(struct cpsw_ale *ale, u8 
*addr)
return -ENOENT;
 }
 
+int cpsw_ale_match_vlan(struct cpsw_ale *ale, u16 vid)
+{
+   u32 ale_entry[ALE_ENTRY_WORDS];
+   int type, idx;
+
+   for (idx = 0; idx  ale-params.ale_entries; idx++) {
+   cpsw_ale_read(ale, idx, ale_entry);
+   type = cpsw_ale_get_entry_type(ale_entry);
+   if (type != ALE_TYPE_VLAN)
+   continue;
+   if (cpsw_ale_get_vlan_id(ale_entry) == vid)
+   return idx;
+   }
+   return -ENOENT;
+}
+
 static int cpsw_ale_match_free(struct cpsw_ale *ale)
 {
u32 ale_entry[ALE_ENTRY_WORDS];
@@ -274,19 +292,26 @@ int cpsw_ale_flush(struct cpsw_ale *ale, int port_mask)
return 0;
 }
 
-int cpsw_ale_add_ucast(struct cpsw_ale *ale, u8 *addr, int port, int flags)
+int cpsw_ale_add_ucast(struct cpsw_ale *ale, u8 *addr, int port,
+  int flags, u16 vid)
 {
u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
int idx;
 
-   cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_ADDR);
+   if (flags  ALE_VLAN) {
+   cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_VLAN_ADDR);
+   cpsw_ale_set_vlan_id(ale_entry, vid);
+   } else {
+   cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_ADDR);
+   }
+
cpsw_ale_set_addr(ale_entry, addr);
cpsw_ale_set_ucast_type(ale_entry, ALE_UCAST_PERSISTANT);
cpsw_ale_set_secure(ale_entry, (flags  ALE_SECURE) ? 1 : 0);
cpsw_ale_set_blocked(ale_entry, (flags  ALE_BLOCKED) ? 1 : 0);
cpsw_ale_set_port_num(ale_entry, port);
 
-   idx = cpsw_ale_match_addr(ale, addr);
+   idx = cpsw_ale_match_addr(ale, addr, (flags  ALE_VLAN) ? vid : 0);
if (idx  0)
idx = cpsw_ale_match_free(ale);
if (idx  0)

Re: [PATCH v2 1/2] drivers: net: cpsw: Add helper functions for VLAN ALE implementation

2013-01-30 Thread Francois Romieu
Mugunthan V N mugunthan...@ti.com :
[...]
 diff --git a/drivers/net/ethernet/ti/cpsw_ale.c 
 b/drivers/net/ethernet/ti/cpsw_ale.c
 index 0e9ccc2..18b88ce 100644
 --- a/drivers/net/ethernet/ti/cpsw_ale.c
 +++ b/drivers/net/ethernet/ti/cpsw_ale.c
[...]
 @@ -274,19 +292,26 @@ int cpsw_ale_flush(struct cpsw_ale *ale, int port_mask)
   return 0;
  }
  
 -int cpsw_ale_add_ucast(struct cpsw_ale *ale, u8 *addr, int port, int flags)
 +int cpsw_ale_add_ucast(struct cpsw_ale *ale, u8 *addr, int port,
 +int flags, u16 vid)
  {
   u32 ale_entry[ALE_ENTRY_WORDS] = {0, 0, 0};
   int idx;
  
 - cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_ADDR);
 + if (flags  ALE_VLAN) {
 + cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_VLAN_ADDR);
 + cpsw_ale_set_vlan_id(ale_entry, vid);
 + } else {
 + cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_ADDR);
 + }
 +
[...]
 + if (flags  ALE_VLAN) {
 + cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_VLAN_ADDR);
 + cpsw_ale_set_vlan_id(ale_entry, vid);
 + } else {
 + cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_ADDR);
 + }
 +

It could be fctored out.

[...]
 @@ -362,6 +395,55 @@ int cpsw_ale_del_mcast(struct cpsw_ale *ale, u8 *addr, 
 int port_mask)
   return 0;
  }
  
 +int cpsw_ale_add_vlan(struct cpsw_ale *ale, u16 vid, int port, int untag,
 +   int reg_mcast, int unreg_mcast)
 +{
[...]
 +int cpsw_ale_del_vlan(struct cpsw_ale *ale, u16 vid, int port_mask)
[...]

Patch #2 doesn't use the returned status code.

-- 
Ueimor
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html