Re: [PATCH net-next v2 2/5] cxgb4: add common api support for configuring filters

2016-09-15 Thread David Miller
From: Rahul Lakkireddy 
Date: Tue, 13 Sep 2016 17:12:26 +0530

> +/* Fill up default masks for set match fields. */
> +static void fill_default_mask(struct ch_filter_specification *fs)
> +{
> + unsigned int i;
> + unsigned int lip = 0, lip_mask = 0;
> + unsigned int fip = 0, fip_mask = 0;

Always order local variable declarations from longest to shortest
line.

Please audit your entire submission for this issue.

Thanks.


[PATCH net-next v2 2/5] cxgb4: add common api support for configuring filters

2016-09-13 Thread Rahul Lakkireddy
Enable filters for non-offload configuration and add common api support
for setting and deleting filters in LE-TCAM region of the hardware.

IPv4 filters occupy one slot.  IPv6 filters occupy 4 slots and must
be on a 4-slot boundary.  IPv4 filters can not occupy a slot belonging
to IPv6 and the vice-versa is also true.

Filters are set and deleted asynchronously.  Use completion to wait
for reply from firmware in order to allow for synchronization if needed.

Signed-off-by: Rahul Lakkireddy 
Signed-off-by: Hariprasad Shenai 
---
 drivers/net/ethernet/chelsio/cxgb4/cxgb4.h|   3 +
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c | 478 +-
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.h |   1 +
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c   |  33 +-
 drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h|  26 +-
 5 files changed, 510 insertions(+), 31 deletions(-)

diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h 
b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
index 275c4f0..7c256a2 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h
@@ -1054,7 +1054,10 @@ struct filter_entry {
 
u32 pending:1;  /* filter action is pending firmware reply */
u32 smtidx:8;   /* Source MAC Table index for smac */
+   struct filter_ctx *ctx; /* Caller's completion hook */
struct l2t_entry *l2t;  /* Layer Two Table entry for dmac */
+   struct net_device *dev; /* Associated net device */
+   u32 tid;/* This will store the actual tid */
 
/* The filter itself.  Most of this is a straight copy of information
 * provided by the extended ioctl().  Some fields are translated to
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c 
b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c
index e224bf5..53a47ad 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c
@@ -33,27 +33,165 @@
  */
 
 #include "cxgb4.h"
+#include "t4_regs.h"
 #include "l2t.h"
 #include "t4fw_api.h"
 #include "cxgb4_filter.h"
 
+static inline bool is_field_set(u32 val, u32 mask)
+{
+   return val || mask;
+}
+
+static inline bool unsupported(u32 conf, u32 conf_mask, u32 val, u32 mask)
+{
+   return !(conf & conf_mask) && is_field_set(val, mask);
+}
+
+/* Validate filter spec against configuration done on the card. */
+static int validate_filter(struct net_device *dev,
+  struct ch_filter_specification *fs)
+{
+   struct adapter *adapter = netdev2adap(dev);
+   u32 fconf, iconf;
+
+   /* Check for unconfigured fields being used. */
+   fconf = adapter->params.tp.vlan_pri_map;
+   iconf = adapter->params.tp.ingress_config;
+
+   if (unsupported(fconf, FCOE_F, fs->val.fcoe, fs->mask.fcoe) ||
+   unsupported(fconf, PORT_F, fs->val.iport, fs->mask.iport) ||
+   unsupported(fconf, TOS_F, fs->val.tos, fs->mask.tos) ||
+   unsupported(fconf, ETHERTYPE_F, fs->val.ethtype,
+   fs->mask.ethtype) ||
+   unsupported(fconf, MACMATCH_F, fs->val.macidx, fs->mask.macidx) ||
+   unsupported(fconf, MPSHITTYPE_F, fs->val.matchtype,
+   fs->mask.matchtype) ||
+   unsupported(fconf, FRAGMENTATION_F, fs->val.frag, fs->mask.frag) ||
+   unsupported(fconf, PROTOCOL_F, fs->val.proto, fs->mask.proto) ||
+   unsupported(fconf, VNIC_ID_F, fs->val.pfvf_vld,
+   fs->mask.pfvf_vld) ||
+   unsupported(fconf, VNIC_ID_F, fs->val.ovlan_vld,
+   fs->mask.ovlan_vld) ||
+   unsupported(fconf, VLAN_F, fs->val.ivlan_vld, fs->mask.ivlan_vld))
+   return -EOPNOTSUPP;
+
+   /* T4 inconveniently uses the same FT_VNIC_ID_W bits for both the Outer
+* VLAN Tag and PF/VF/VFvld fields based on VNIC_F being set
+* in TP_INGRESS_CONFIG.  Hense the somewhat crazy checks
+* below.  Additionally, since the T4 firmware interface also
+* carries that overlap, we need to translate any PF/VF
+* specification into that internal format below.
+*/
+   if (is_field_set(fs->val.pfvf_vld, fs->mask.pfvf_vld) &&
+   is_field_set(fs->val.ovlan_vld, fs->mask.ovlan_vld))
+   return -EOPNOTSUPP;
+   if (unsupported(iconf, VNIC_F, fs->val.pfvf_vld, fs->mask.pfvf_vld) ||
+   (is_field_set(fs->val.ovlan_vld, fs->mask.ovlan_vld) &&
+(iconf & VNIC_F)))
+   return -EOPNOTSUPP;
+   if (fs->val.pf > 0x7 || fs->val.vf > 0x7f)
+   return -ERANGE;
+   fs->mask.pf &= 0x7;
+   fs->mask.vf &= 0x7f;
+
+   /* If the user is requesting that the filter action loop
+* matching packets back out one of our ports, make sure that
+* the egress port is in range.
+*/
+   if