#define HNS3_DEFAULT_PORT_CONF_QUEUES_NUM 1
#define HNS3_SERVICE_INTERVAL 1000000 /* us */
-#define HNS3_PORT_BASE_VLAN_DISABLE 0
-#define HNS3_PORT_BASE_VLAN_ENABLE 1
#define HNS3_INVLID_PVID 0xFFFF
#define HNS3_FILTER_TYPE_VF 0
#define HNS3_RESET_WAIT_MS 100
#define HNS3_RESET_WAIT_CNT 200
-int hns3_logtype_init;
-int hns3_logtype_driver;
-
enum hns3_evt_cause {
HNS3_VECTOR0_EVENT_RST,
HNS3_VECTOR0_EVENT_MBX,
hns3_restore_vlan_table(struct hns3_adapter *hns)
{
struct hns3_user_vlan_table *vlan_entry;
+ struct hns3_hw *hw = &hns->hw;
struct hns3_pf *pf = &hns->pf;
uint16_t vlan_id;
int ret = 0;
- if (pf->port_base_vlan_cfg.state == HNS3_PORT_BASE_VLAN_ENABLE)
+ if (hw->port_base_vlan_cfg.state == HNS3_PORT_BASE_VLAN_ENABLE)
return hns3_vlan_pvid_configure(hns,
- pf->port_base_vlan_cfg.pvid, 1);
+ hw->port_base_vlan_cfg.pvid, 1);
LIST_FOREACH(vlan_entry, &pf->vlan_list, next) {
if (vlan_entry->hd_tbl_status) {
static int
hns3_vlan_filter_configure(struct hns3_adapter *hns, uint16_t vlan_id, int on)
{
- struct hns3_pf *pf = &hns->pf;
+ struct hns3_hw *hw = &hns->hw;
bool writen_to_tbl = false;
int ret = 0;
* vlan list. The vlan id in vlan list will be writen in vlan filter
* table until port base vlan disabled
*/
- if (pf->port_base_vlan_cfg.state == HNS3_PORT_BASE_VLAN_DISABLE) {
+ if (hw->port_base_vlan_cfg.state == HNS3_PORT_BASE_VLAN_DISABLE) {
ret = hns3_set_port_vlan_filter(hns, vlan_id, on);
writen_to_tbl = true;
}
hns3_en_hw_strip_rxvtag(struct hns3_adapter *hns, bool enable)
{
struct hns3_rx_vtag_cfg rxvlan_cfg;
- struct hns3_pf *pf = &hns->pf;
struct hns3_hw *hw = &hns->hw;
int ret;
- if (pf->port_base_vlan_cfg.state == HNS3_PORT_BASE_VLAN_DISABLE) {
+ if (hw->port_base_vlan_cfg.state == HNS3_PORT_BASE_VLAN_DISABLE) {
rxvlan_cfg.strip_tag1_en = false;
rxvlan_cfg.strip_tag2_en = enable;
} else {
static void
hns3_store_port_base_vlan_info(struct hns3_adapter *hns, uint16_t pvid, int on)
{
- struct hns3_pf *pf = &hns->pf;
+ struct hns3_hw *hw = &hns->hw;
- pf->port_base_vlan_cfg.state = on ?
+ hw->port_base_vlan_cfg.state = on ?
HNS3_PORT_BASE_VLAN_ENABLE : HNS3_PORT_BASE_VLAN_DISABLE;
- pf->port_base_vlan_cfg.pvid = pvid;
+ hw->port_base_vlan_cfg.pvid = pvid;
}
static void
hns3_remove_all_vlan_table(struct hns3_adapter *hns)
{
struct hns3_hw *hw = &hns->hw;
- struct hns3_pf *pf = &hns->pf;
int ret;
hns3_rm_all_vlan_table(hns, true);
- if (pf->port_base_vlan_cfg.pvid != HNS3_INVLID_PVID) {
+ if (hw->port_base_vlan_cfg.pvid != HNS3_INVLID_PVID) {
ret = hns3_set_port_vlan_filter(hns,
- pf->port_base_vlan_cfg.pvid, 0);
+ hw->port_base_vlan_cfg.pvid, 0);
if (ret) {
hns3_err(hw, "Failed to remove all vlan table, ret =%d",
ret);
uint16_t port_base_vlan_state,
uint16_t new_pvid, uint16_t old_pvid)
{
- struct hns3_pf *pf = &hns->pf;
struct hns3_hw *hw = &hns->hw;
int ret = 0;
}
}
- if (new_pvid == pf->port_base_vlan_cfg.pvid)
+ if (new_pvid == hw->port_base_vlan_cfg.pvid)
hns3_add_all_vlan_table(hns);
return ret;
static int
hns3_vlan_pvid_configure(struct hns3_adapter *hns, uint16_t pvid, int on)
{
- struct hns3_pf *pf = &hns->pf;
struct hns3_hw *hw = &hns->hw;
uint16_t port_base_vlan_state;
uint16_t old_pvid;
int ret;
- if (on == 0 && pvid != pf->port_base_vlan_cfg.pvid) {
- if (pf->port_base_vlan_cfg.pvid != HNS3_INVLID_PVID)
+ if (on == 0 && pvid != hw->port_base_vlan_cfg.pvid) {
+ if (hw->port_base_vlan_cfg.pvid != HNS3_INVLID_PVID)
hns3_warn(hw, "Invalid operation! As current pvid set "
"is %u, disable pvid %u is invalid",
- pf->port_base_vlan_cfg.pvid, pvid);
+ hw->port_base_vlan_cfg.pvid, pvid);
return 0;
}
if (pvid == HNS3_INVLID_PVID)
goto out;
- old_pvid = pf->port_base_vlan_cfg.pvid;
+ old_pvid = hw->port_base_vlan_cfg.pvid;
ret = hns3_update_vlan_filter_entries(hns, port_base_vlan_state, pvid,
old_pvid);
if (ret) {
static void
init_port_base_vlan_info(struct hns3_hw *hw)
{
- struct hns3_adapter *hns = HNS3_DEV_HW_TO_ADAPTER(hw);
- struct hns3_pf *pf = &hns->pf;
-
- pf->port_base_vlan_cfg.state = HNS3_PORT_BASE_VLAN_DISABLE;
- pf->port_base_vlan_cfg.pvid = HNS3_INVLID_PVID;
+ hw->port_base_vlan_cfg.state = HNS3_PORT_BASE_VLAN_DISABLE;
+ hw->port_base_vlan_cfg.pvid = HNS3_INVLID_PVID;
}
static int
return hns3_cmd_send(hw, &desc, 1);
}
-int
-hns3_config_gro(struct hns3_hw *hw, bool en)
-{
- struct hns3_cfg_gro_status_cmd *req;
- struct hns3_cmd_desc desc;
- int ret;
-
- hns3_cmd_setup_basic_desc(&desc, HNS3_OPC_GRO_GENERIC_CONFIG, false);
- req = (struct hns3_cfg_gro_status_cmd *)desc.data;
-
- req->gro_en = rte_cpu_to_le_16(en ? 1 : 0);
-
- ret = hns3_cmd_send(hw, &desc, 1);
- if (ret)
- hns3_err(hw, "GRO hardware config cmd failed, ret = %d", ret);
-
- return ret;
-}
-
static int
hns3_set_umv_space(struct hns3_hw *hw, uint16_t space_size,
uint16_t *allocated_size, bool is_alloc)
uint16_t nb_tx_q = dev->data->nb_tx_queues;
struct rte_eth_rss_conf rss_conf;
uint16_t mtu;
+ bool gro_en;
int ret;
/*
if (ret)
goto cfg_err;
+ /* config hardware GRO */
+ gro_en = conf->rxmode.offloads & DEV_RX_OFFLOAD_TCP_LRO ? true : false;
+ ret = hns3_config_gro(hw, gro_en);
+ if (ret)
+ goto cfg_err;
+
hw->adapter_state = HNS3_NIC_CONFIGURED;
return 0;
info->min_rx_bufsize = hw->rx_buf_len;
info->max_mac_addrs = HNS3_UC_MACADDR_NUM;
info->max_mtu = info->max_rx_pktlen - HNS3_ETH_OVERHEAD;
+ info->max_lro_pkt_size = HNS3_MAX_LRO_SIZE;
info->rx_offload_capa = (DEV_RX_OFFLOAD_IPV4_CKSUM |
DEV_RX_OFFLOAD_TCP_CKSUM |
DEV_RX_OFFLOAD_UDP_CKSUM |
DEV_RX_OFFLOAD_VLAN_STRIP |
DEV_RX_OFFLOAD_VLAN_FILTER |
DEV_RX_OFFLOAD_JUMBO_FRAME |
- DEV_RX_OFFLOAD_RSS_HASH);
+ DEV_RX_OFFLOAD_RSS_HASH |
+ DEV_RX_OFFLOAD_TCP_LRO);
info->tx_queue_offload_capa = DEV_TX_OFFLOAD_MBUF_FAST_FREE;
info->tx_offload_capa = (DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM |
DEV_TX_OFFLOAD_IPV4_CKSUM |
hns3_enable_hw_error_intr(hns, false);
hns3_rss_uninit(hns);
+ (void)hns3_config_gro(hw, false);
hns3_promisc_uninit(hw);
hns3_fdir_filter_uninit(hns);
hns3_uninit_umv_space(hw);
if (ret)
goto err_promisc;
+ ret = hns3_restore_gro_conf(hw);
+ if (ret)
+ goto err_promisc;
+
if (hns->hw.adapter_state == HNS3_NIC_STARTED) {
ret = hns3_do_start(hns, false);
if (ret)
RTE_PMD_REGISTER_PCI(net_hns3, rte_hns3_pmd);
RTE_PMD_REGISTER_PCI_TABLE(net_hns3, pci_id_hns3_map);
RTE_PMD_REGISTER_KMOD_DEP(net_hns3, "* igb_uio | vfio-pci");
-
-RTE_INIT(hns3_init_log)
-{
- hns3_logtype_init = rte_log_register("pmd.net.hns3.init");
- if (hns3_logtype_init >= 0)
- rte_log_set_level(hns3_logtype_init, RTE_LOG_NOTICE);
- hns3_logtype_driver = rte_log_register("pmd.net.hns3.driver");
- if (hns3_logtype_driver >= 0)
- rte_log_set_level(hns3_logtype_driver, RTE_LOG_NOTICE);
-}
+RTE_LOG_REGISTER(hns3_logtype_init, pmd.net.hns3.init, NOTICE);
+RTE_LOG_REGISTER(hns3_logtype_driver, pmd.net.hns3.driver, NOTICE);