net/cxgbe: support flow API for matching all packets on VF
[dpdk.git] / drivers / net / cxgbe / base / t4_hw.c
index d608941..48b6d77 100644 (file)
@@ -246,7 +246,7 @@ static void get_mbox_rpl(struct adapter *adap, __be64 *rpl, int nflit,
                         u32 mbox_addr)
 {
        for ( ; nflit; nflit--, mbox_addr += 8)
-               *rpl++ = htobe64(t4_read_reg64(adap, mbox_addr));
+               *rpl++ = cpu_to_be64(t4_read_reg64(adap, mbox_addr));
 }
 
 /*
@@ -335,7 +335,7 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox,
                return -EINVAL;
        }
 
-       bzero(p, size);
+       memset(p, 0, size);
        memcpy(p, (const __be64 *)cmd, size);
 
        /*
@@ -4017,7 +4017,8 @@ int t4_set_params(struct adapter *adap, unsigned int mbox, unsigned int pf,
 int t4_alloc_vi_func(struct adapter *adap, unsigned int mbox,
                     unsigned int port, unsigned int pf, unsigned int vf,
                     unsigned int nmac, u8 *mac, unsigned int *rss_size,
-                    unsigned int portfunc, unsigned int idstype)
+                    unsigned int portfunc, unsigned int idstype,
+                    u8 *vivld, u8 *vin)
 {
        int ret;
        struct fw_vi_cmd c;
@@ -4055,6 +4056,10 @@ int t4_alloc_vi_func(struct adapter *adap, unsigned int mbox,
        }
        if (rss_size)
                *rss_size = G_FW_VI_CMD_RSSSIZE(be16_to_cpu(c.norss_rsssize));
+       if (vivld)
+               *vivld = G_FW_VI_CMD_VFVLD(be32_to_cpu(c.alloc_to_len16));
+       if (vin)
+               *vin = G_FW_VI_CMD_VIN(be32_to_cpu(c.alloc_to_len16));
        return G_FW_VI_CMD_VIID(cpu_to_be16(c.type_to_viid));
 }
 
@@ -4075,10 +4080,10 @@ int t4_alloc_vi_func(struct adapter *adap, unsigned int mbox,
  */
 int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port,
                unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac,
-               unsigned int *rss_size)
+               unsigned int *rss_size, u8 *vivld, u8 *vin)
 {
        return t4_alloc_vi_func(adap, mbox, port, pf, vf, nmac, mac, rss_size,
-                               FW_VI_FUNC_ETH, 0);
+                               FW_VI_FUNC_ETH, 0, vivld, vin);
 }
 
 /**
@@ -4246,7 +4251,7 @@ int t4_free_raw_mac_filt(struct adapter *adap, unsigned int viid,
                                   V_FW_CMD_EXEC(0) |
                                   V_FW_VI_MAC_CMD_VIID(viid));
        raw = V_FW_VI_MAC_CMD_ENTRY_TYPE(FW_VI_MAC_TYPE_RAW);
-       c.freemacs_to_len16 = cpu_to_be32(V_FW_VI_MAC_CMD_FREEMACS(0) |
+       c.freemacs_to_len16 = cpu_to_be32(V_FW_VI_MAC_CMD_FREEMACS(0U) |
                                          raw |
                                          V_FW_CMD_LEN16(1));
 
@@ -5251,13 +5256,9 @@ int t4_init_tp_params(struct adapter *adap)
                                                               F_PROTOCOL);
        adap->params.tp.ethertype_shift = t4_filter_field_shift(adap,
                                                                F_ETHERTYPE);
-
-       /*
-        * If TP_INGRESS_CONFIG.VNID == 0, then TP_VLAN_PRI_MAP.VNIC_ID
-        * represents the presense of an Outer VLAN instead of a VNIC ID.
-        */
-       if ((adap->params.tp.ingress_config & F_VNIC) == 0)
-               adap->params.tp.vnic_shift = -1;
+       adap->params.tp.macmatch_shift = t4_filter_field_shift(adap,
+                                                              F_MACMATCH);
+       adap->params.tp.tos_shift = t4_filter_field_shift(adap, F_TOS);
 
        v = t4_read_reg(adap, LE_3_DB_HASH_MASK_GEN_IPV4_T6_A);
        adap->params.tp.hash_filter_mask = v;
@@ -5350,6 +5351,7 @@ int t4_port_init(struct adapter *adap, int mbox, int pf, int vf)
        fw_port_cap32_t pcaps, acaps;
        enum fw_port_type port_type;
        struct fw_port_cmd cmd;
+       u8 vivld = 0, vin = 0;
        int ret, i, j = 0;
        int mdio_addr;
        u32 action;
@@ -5421,7 +5423,8 @@ int t4_port_init(struct adapter *adap, int mbox, int pf, int vf)
                        acaps = be32_to_cpu(cmd.u.info32.acaps32);
                }
 
-               ret = t4_alloc_vi(adap, mbox, j, pf, vf, 1, addr, &rss_size);
+               ret = t4_alloc_vi(adap, mbox, j, pf, vf, 1, addr, &rss_size,
+                                 &vivld, &vin);
                if (ret < 0)
                        return ret;
 
@@ -5430,6 +5433,18 @@ int t4_port_init(struct adapter *adap, int mbox, int pf, int vf)
                pi->rss_size = rss_size;
                t4_os_set_hw_addr(adap, i, addr);
 
+               /* If fw supports returning the VIN as part of FW_VI_CMD,
+                * save the returned values.
+                */
+               if (adap->params.viid_smt_extn_support) {
+                       pi->vivld = vivld;
+                       pi->vin = vin;
+               } else {
+                       /* Retrieve the values from VIID */
+                       pi->vivld = G_FW_VIID_VIVLD(pi->viid);
+                       pi->vin =  G_FW_VIID_VIN(pi->viid);
+               }
+
                pi->port_type = port_type;
                pi->mdio_addr = mdio_addr;
                pi->mod_type = FW_PORT_MOD_TYPE_NA;