net/hinic: add TCAM filter switch for flow director
[dpdk.git] / drivers / net / hinic / base / hinic_pmd_niccfg.c
index 0bbcd36..67f6bc4 100644 (file)
@@ -18,7 +18,6 @@
                        buf_in, in_size,                        \
                        buf_out, out_size, 0)
 
-
 /**
  * hinic_init_function_table - Initialize function table.
  *
@@ -276,7 +275,7 @@ int hinic_update_mac(void *hwdev, u8 *old_mac, u8 *new_mac, u16 vlan_id,
        int err;
 
        if (!hwdev || !old_mac || !new_mac) {
-               PMD_DRV_LOG(ERR, "Hwdev, old_mac or new_mac is NULL\n");
+               PMD_DRV_LOG(ERR, "Hwdev, old_mac or new_mac is NULL");
                return -EINVAL;
        }
 
@@ -293,12 +292,12 @@ int hinic_update_mac(void *hwdev, u8 *old_mac, u8 *new_mac, u16 vlan_id,
        if (err || !out_size ||
            (mac_info.mgmt_msg_head.status &&
             mac_info.mgmt_msg_head.status != HINIC_PF_SET_VF_ALREADY)) {
-               PMD_DRV_LOG(ERR, "Failed to update MAC, err: %d, status: 0x%x, out size: 0x%x\n",
+               PMD_DRV_LOG(ERR, "Failed to update MAC, err: %d, status: 0x%x, out size: 0x%x",
                            err, mac_info.mgmt_msg_head.status, out_size);
                return -EINVAL;
        }
        if (mac_info.mgmt_msg_head.status == HINIC_PF_SET_VF_ALREADY) {
-               PMD_DRV_LOG(WARNING, "PF has already set vf mac, Ignore update operation.\n");
+               PMD_DRV_LOG(WARNING, "PF has already set vf mac, Ignore update operation");
                return HINIC_PF_SET_VF_ALREADY;
        }
 
@@ -380,12 +379,11 @@ int hinic_add_remove_vlan(void *hwdev, u16 vlan_id, u16 func_id, bool add)
        vlan_info.func_id = func_id;
        vlan_info.vlan_id = vlan_id;
 
-       err = l2nic_msg_to_mgmt_sync(hwdev, cmd, &vlan_info,
-                                    sizeof(vlan_info), &vlan_info,
-                                    &out_size);
+       err = l2nic_msg_to_mgmt_sync(hwdev, cmd, &vlan_info, sizeof(vlan_info),
+                                    &vlan_info, &out_size);
        if (err || !out_size || vlan_info.mgmt_msg_head.status) {
                PMD_DRV_LOG(ERR,
-                       "Failed to %s vlan, err: %d, status: 0x%x, out size: 0x%x\n",
+                       "Failed to %s vlan, err: %d, status: 0x%x, out size: 0x%x",
                        add ? "add" : "remove", err,
                        vlan_info.mgmt_msg_head.status, out_size);
                return -EINVAL;
@@ -431,7 +429,7 @@ int hinic_config_vlan_filter(void *hwdev, u32 vlan_filter_ctrl)
                err = HINIC_MGMT_CMD_UNSUPPORTED;
        } else if (err || !out_size || vlan_filter.mgmt_msg_head.status) {
                PMD_DRV_LOG(ERR,
-                       "Failed to config vlan filter, vlan_filter_ctrl: 0x%x, err: %d, status: 0x%x, out size: 0x%x\n",
+                       "Failed to config vlan filter, vlan_filter_ctrl: 0x%x, err: %d, status: 0x%x, out size: 0x%x",
                        vlan_filter_ctrl, err,
                        vlan_filter.mgmt_msg_head.status, out_size);
                err = -EINVAL;
@@ -469,11 +467,11 @@ int hinic_set_rx_vlan_offload(void *hwdev, u8 en)
        vlan_cfg.vlan_rx_offload = en;
 
        err = l2nic_msg_to_mgmt_sync(hwdev, HINIC_PORT_CMD_SET_RX_VLAN_OFFLOAD,
-                                       &vlan_cfg, sizeof(vlan_cfg),
-                                       &vlan_cfg, &out_size);
+                                    &vlan_cfg, sizeof(vlan_cfg),
+                                    &vlan_cfg, &out_size);
        if (err || !out_size || vlan_cfg.mgmt_msg_head.status) {
                PMD_DRV_LOG(ERR,
-                       "Failed to set rx vlan offload, err: %d, status: 0x%x, out size: 0x%x\n",
+                       "Failed to set rx vlan offload, err: %d, status: 0x%x, out size: 0x%x",
                        err, vlan_cfg.mgmt_msg_head.status, out_size);
                return -EINVAL;
        }
@@ -626,7 +624,7 @@ int hinic_get_port_info(void *hwdev, struct nic_port_info *port_info)
                PMD_DRV_LOG(ERR,
                        "Failed to get port info, err: %d, status: 0x%x, out size: 0x%x",
                        err, port_msg.mgmt_msg_head.status, out_size);
-               return err;
+               return -EIO;
        }
 
        port_info->autoneg_cap = port_msg.autoneg_cap;
@@ -668,6 +666,35 @@ int hinic_set_pause_config(void *hwdev, struct nic_pause_config nic_pause)
        return 0;
 }
 
+int hinic_get_pause_info(void *hwdev, struct nic_pause_config *nic_pause)
+{
+       struct hinic_pause_config pause_info;
+       u16 out_size = sizeof(pause_info);
+       int err;
+
+       if (!hwdev || !nic_pause)
+               return -EINVAL;
+
+       memset(&pause_info, 0, sizeof(pause_info));
+       pause_info.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
+       pause_info.func_id = hinic_global_func_id(hwdev);
+
+       err = l2nic_msg_to_mgmt_sync(hwdev, HINIC_PORT_CMD_GET_PAUSE_INFO,
+                                    &pause_info, sizeof(pause_info),
+                                    &pause_info, &out_size);
+       if (err || !out_size || pause_info.mgmt_msg_head.status) {
+               PMD_DRV_LOG(ERR, "Failed to get pause info, err: %d, status: 0x%x, out size: 0x%x\n",
+                       err, pause_info.mgmt_msg_head.status, out_size);
+               return -EINVAL;
+       }
+
+       nic_pause->auto_neg = pause_info.auto_neg;
+       nic_pause->rx_pause = pause_info.rx_pause;
+       nic_pause->tx_pause = pause_info.tx_pause;
+
+       return 0;
+}
+
 int hinic_dcb_set_ets(void *hwdev, u8 *up_tc, u8 *pg_bw,
                      u8 *pgid, u8 *up_bw, u8 *prio)
 {
@@ -687,8 +714,7 @@ int hinic_dcb_set_ets(void *hwdev, u8 *up_tc, u8 *pg_bw,
                pg_bw_t += *(pg_bw + i);
 
                if (*(up_tc + i) > HINIC_DCB_TC_MAX) {
-                       PMD_DRV_LOG(ERR,
-                               "Invalid up %d mapping tc: %d", i,
+                       PMD_DRV_LOG(ERR, "Invalid up %d mapping tc: %d", i,
                                *(up_tc + i));
                        return -EINVAL;
                }
@@ -1242,7 +1268,6 @@ int hinic_set_rx_vhd_mode(void *hwdev, u16 vhd_mode, u16 rx_buf_sz)
                PMD_DRV_LOG(ERR,
                        "Failed to set vhd mode, err: %d, status: 0x%x, out size: 0x%x",
                        err, vhd_mode_cfg.mgmt_msg_head.status, out_size);
-
                return -EIO;
        }
 
@@ -1397,10 +1422,9 @@ int hinic_set_anti_attack(void *hwdev, bool enable)
        rate.xbs = ANTI_ATTACK_DEFAULT_XBS;
 
        err = l2nic_msg_to_mgmt_sync(hwdev, HINIC_PORT_CMD_SET_ANTI_ATTACK_RATE,
-                                    &rate, sizeof(rate), &rate,
-                                    &out_size);
+                                    &rate, sizeof(rate), &rate, &out_size);
        if (err || !out_size || rate.mgmt_msg_head.status) {
-               PMD_DRV_LOG(ERR, "can't %s port Anti-Attack rate limit, err: %d, status: 0x%x, out size: 0x%x",
+               PMD_DRV_LOG(ERR, "Can't %s port Anti-Attack rate limit, err: %d, status: 0x%x, out size: 0x%x",
                        (enable ? "enable" : "disable"), err,
                        rate.mgmt_msg_head.status, out_size);
                return -EINVAL;
@@ -1502,10 +1526,9 @@ int hinic_set_fast_recycle_mode(void *hwdev, u8 mode)
                                     sizeof(fast_recycled_mode),
                                     &fast_recycled_mode, &out_size, 0);
        if (err || fast_recycled_mode.mgmt_msg_head.status || !out_size) {
-               PMD_DRV_LOG(ERR,
-                       "Failed to set recycle mode, ret = %d",
-                       fast_recycled_mode.mgmt_msg_head.status);
-               return -EFAULT;
+               PMD_DRV_LOG(ERR, "Failed to set recycle mode, err: %d, status: 0x%x, out size: 0x%x",
+                       err, fast_recycled_mode.mgmt_msg_head.status, out_size);
+               return -EIO;
        }
 
        return 0;
@@ -1583,8 +1606,7 @@ int hinic_set_link_status_follow(void *hwdev,
                return 0;
 
        if (status >= HINIC_LINK_FOLLOW_STATUS_MAX) {
-               PMD_DRV_LOG(ERR,
-                       "Invalid link follow status: %d", status);
+               PMD_DRV_LOG(ERR, "Invalid link follow status: %d", status);
                return -EINVAL;
        }
 
@@ -1730,12 +1752,11 @@ int hinic_vf_get_default_cos(struct hinic_hwdev *hwdev, u8 *cos_id)
 
        err = hinic_msg_to_mgmt_sync(hwdev, HINIC_MOD_L2NIC,
                                     HINIC_PORT_CMD_GET_VF_COS, &vf_cos,
-                                    sizeof(vf_cos), &vf_cos,
-                                    &out_size, 0);
+                                    sizeof(vf_cos), &vf_cos, &out_size, 0);
        if (err || !out_size || vf_cos.mgmt_msg_head.status) {
                PMD_DRV_LOG(ERR, "Get VF default cos failed, err: %d, status: 0x%x, out size: 0x%x",
                        err, vf_cos.mgmt_msg_head.status, out_size);
-               return -EFAULT;
+               return -EIO;
        }
        *cos_id = vf_cos.state.default_cos;
 
@@ -2093,3 +2114,44 @@ int hinic_flush_tcam_rule(void *hwdev)
        return err;
 }
 
+int hinic_set_fdir_tcam_rule_filter(void *hwdev, bool enable)
+{
+       struct hinic_port_tcam_info port_tcam_cmd;
+       u16 out_size = sizeof(port_tcam_cmd);
+       int err;
+
+       if (!hwdev)
+               return -EINVAL;
+
+       memset(&port_tcam_cmd, 0, sizeof(port_tcam_cmd));
+       port_tcam_cmd.mgmt_msg_head.resp_aeq_num = HINIC_AEQ1;
+       port_tcam_cmd.func_id = hinic_global_func_id(hwdev);
+       port_tcam_cmd.tcam_enable = (u8)enable;
+
+       err = l2nic_msg_to_mgmt_sync(hwdev, HINIC_PORT_CMD_UP_TC_ENABLE,
+                       &port_tcam_cmd, sizeof(port_tcam_cmd),
+                       &port_tcam_cmd, &out_size);
+       if ((port_tcam_cmd.mgmt_msg_head.status != HINIC_MGMT_CMD_UNSUPPORTED &&
+               port_tcam_cmd.mgmt_msg_head.status) || err || !out_size) {
+               if (err == HINIC_MBOX_VF_CMD_ERROR &&
+                       HINIC_IS_VF((struct hinic_hwdev *)hwdev)) {
+                       err = HINIC_MGMT_CMD_UNSUPPORTED;
+                       PMD_DRV_LOG(WARNING, "VF doesn't support setting fdir tcam filter");
+                       return err;
+               }
+               PMD_DRV_LOG(ERR, "Set fdir tcam filter failed, err: %d, "
+                       "status: 0x%x, out size: 0x%x, enable: 0x%x",
+                       err, port_tcam_cmd.mgmt_msg_head.status, out_size,
+                       enable);
+               return -EFAULT;
+       }
+
+       if (port_tcam_cmd.mgmt_msg_head.status == HINIC_MGMT_CMD_UNSUPPORTED) {
+               err = HINIC_MGMT_CMD_UNSUPPORTED;
+               PMD_DRV_LOG(WARNING, "Fw doesn't support setting fdir tcam filter");
+       }
+
+       return err;
+}
+
+