#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
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_en_rx_strip_all(struct hns3_adapter *hns, int on)
+hns3_en_pvid_strip(struct hns3_adapter *hns, int on)
{
+ struct hns3_rx_vtag_cfg *old_cfg = &hns->pf.vtag_config.rx_vcfg;
struct hns3_rx_vtag_cfg rx_vlan_cfg;
- struct hns3_hw *hw = &hns->hw;
bool rx_strip_en;
int ret;
- rx_strip_en = on ? true : false;
- rx_vlan_cfg.strip_tag1_en = rx_strip_en;
- rx_vlan_cfg.strip_tag2_en = rx_strip_en;
+ rx_strip_en = old_cfg->rx_vlan_offload_en ? true : false;
+ if (on) {
+ rx_vlan_cfg.strip_tag1_en = rx_strip_en;
+ rx_vlan_cfg.strip_tag2_en = true;
+ } else {
+ rx_vlan_cfg.strip_tag1_en = false;
+ rx_vlan_cfg.strip_tag2_en = rx_strip_en;
+ }
rx_vlan_cfg.vlan1_vlan_prionly = false;
rx_vlan_cfg.vlan2_vlan_prionly = false;
- rx_vlan_cfg.rx_vlan_offload_en = rx_strip_en;
+ rx_vlan_cfg.rx_vlan_offload_en = old_cfg->rx_vlan_offload_en;
ret = hns3_set_vlan_rx_offload_cfg(hns, &rx_vlan_cfg);
- if (ret) {
- hns3_err(hw, "enable strip rx failed, ret =%d", ret);
+ if (ret)
return ret;
- }
hns3_update_rx_offload_cfg(hns, &rx_vlan_cfg);
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;
}
HNS3_PORT_BASE_VLAN_DISABLE;
ret = hns3_vlan_txvlan_cfg(hns, port_base_vlan_state, pvid);
if (ret) {
- hns3_err(hw, "Failed to config tx vlan, ret =%d", ret);
+ hns3_err(hw, "failed to config tx vlan for pvid, ret = %d",
+ ret);
return ret;
}
- ret = hns3_en_rx_strip_all(hns, on);
+ ret = hns3_en_pvid_strip(hns, on);
if (ret) {
- hns3_err(hw, "Failed to config rx vlan strip, ret =%d", ret);
+ hns3_err(hw, "failed to config rx vlan strip for pvid, "
+ "ret = %d", ret);
return ret;
}
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
DEV_RX_OFFLOAD_KEEP_CRC |
DEV_RX_OFFLOAD_SCATTER |
DEV_RX_OFFLOAD_VLAN_STRIP |
- DEV_RX_OFFLOAD_QINQ_STRIP |
DEV_RX_OFFLOAD_VLAN_FILTER |
- DEV_RX_OFFLOAD_VLAN_EXTEND |
DEV_RX_OFFLOAD_JUMBO_FRAME |
DEV_RX_OFFLOAD_RSS_HASH);
info->tx_queue_offload_capa = DEV_TX_OFFLOAD_MBUF_FAST_FREE;