mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 23:27:06 +00:00
Merge branch 'hns-fixes'
Peng Li says: ==================== net: hns: Code improvements & fixes for HNS driver This patchset introduces some code improvements and fixes for the identified problems in the HNS driver. Every patch is independent. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
369a094d50
6 changed files with 423 additions and 188 deletions
|
@ -379,6 +379,9 @@ static void hns_ae_stop(struct hnae_handle *handle)
|
|||
|
||||
hns_ae_ring_enable_all(handle, 0);
|
||||
|
||||
/* clean rx fbd. */
|
||||
hns_rcb_wait_fbd_clean(handle->qs, handle->q_num, RCB_INT_FLAG_RX);
|
||||
|
||||
(void)hns_mac_vm_config_bc_en(mac_cb, 0, false);
|
||||
}
|
||||
|
||||
|
|
|
@ -67,11 +67,14 @@ static void hns_gmac_enable(void *mac_drv, enum mac_commom_mode mode)
|
|||
struct mac_driver *drv = (struct mac_driver *)mac_drv;
|
||||
|
||||
/*enable GE rX/tX */
|
||||
if ((mode == MAC_COMM_MODE_TX) || (mode == MAC_COMM_MODE_RX_AND_TX))
|
||||
if (mode == MAC_COMM_MODE_TX || mode == MAC_COMM_MODE_RX_AND_TX)
|
||||
dsaf_set_dev_bit(drv, GMAC_PORT_EN_REG, GMAC_PORT_TX_EN_B, 1);
|
||||
|
||||
if ((mode == MAC_COMM_MODE_RX) || (mode == MAC_COMM_MODE_RX_AND_TX))
|
||||
if (mode == MAC_COMM_MODE_RX || mode == MAC_COMM_MODE_RX_AND_TX) {
|
||||
/* enable rx pcs */
|
||||
dsaf_set_dev_bit(drv, GMAC_PCS_RX_EN_REG, 0, 0);
|
||||
dsaf_set_dev_bit(drv, GMAC_PORT_EN_REG, GMAC_PORT_RX_EN_B, 1);
|
||||
}
|
||||
}
|
||||
|
||||
static void hns_gmac_disable(void *mac_drv, enum mac_commom_mode mode)
|
||||
|
@ -79,11 +82,14 @@ static void hns_gmac_disable(void *mac_drv, enum mac_commom_mode mode)
|
|||
struct mac_driver *drv = (struct mac_driver *)mac_drv;
|
||||
|
||||
/*disable GE rX/tX */
|
||||
if ((mode == MAC_COMM_MODE_TX) || (mode == MAC_COMM_MODE_RX_AND_TX))
|
||||
if (mode == MAC_COMM_MODE_TX || mode == MAC_COMM_MODE_RX_AND_TX)
|
||||
dsaf_set_dev_bit(drv, GMAC_PORT_EN_REG, GMAC_PORT_TX_EN_B, 0);
|
||||
|
||||
if ((mode == MAC_COMM_MODE_RX) || (mode == MAC_COMM_MODE_RX_AND_TX))
|
||||
if (mode == MAC_COMM_MODE_RX || mode == MAC_COMM_MODE_RX_AND_TX) {
|
||||
/* disable rx pcs */
|
||||
dsaf_set_dev_bit(drv, GMAC_PCS_RX_EN_REG, 0, 1);
|
||||
dsaf_set_dev_bit(drv, GMAC_PORT_EN_REG, GMAC_PORT_RX_EN_B, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/* hns_gmac_get_en - get port enable
|
||||
|
|
|
@ -778,6 +778,17 @@ static int hns_mac_register_phy(struct hns_mac_cb *mac_cb)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static void hns_mac_remove_phydev(struct hns_mac_cb *mac_cb)
|
||||
{
|
||||
if (!to_acpi_device_node(mac_cb->fw_port) || !mac_cb->phy_dev)
|
||||
return;
|
||||
|
||||
phy_device_remove(mac_cb->phy_dev);
|
||||
phy_device_free(mac_cb->phy_dev);
|
||||
|
||||
mac_cb->phy_dev = NULL;
|
||||
}
|
||||
|
||||
#define MAC_MEDIA_TYPE_MAX_LEN 16
|
||||
|
||||
static const struct {
|
||||
|
@ -1117,7 +1128,11 @@ void hns_mac_uninit(struct dsaf_device *dsaf_dev)
|
|||
int max_port_num = hns_mac_get_max_port_num(dsaf_dev);
|
||||
|
||||
for (i = 0; i < max_port_num; i++) {
|
||||
if (!dsaf_dev->mac_cb[i])
|
||||
continue;
|
||||
|
||||
dsaf_dev->misc_op->cpld_reset_led(dsaf_dev->mac_cb[i]);
|
||||
hns_mac_remove_phydev(dsaf_dev->mac_cb[i]);
|
||||
dsaf_dev->mac_cb[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -934,6 +934,62 @@ static void hns_dsaf_tcam_mc_cfg(
|
|||
spin_unlock_bh(&dsaf_dev->tcam_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* hns_dsaf_tcam_uc_cfg_vague - INT
|
||||
* @dsaf_dev: dsa fabric device struct pointer
|
||||
* @address,
|
||||
* @ptbl_tcam_data,
|
||||
*/
|
||||
static void hns_dsaf_tcam_uc_cfg_vague(struct dsaf_device *dsaf_dev,
|
||||
u32 address,
|
||||
struct dsaf_tbl_tcam_data *tcam_data,
|
||||
struct dsaf_tbl_tcam_data *tcam_mask,
|
||||
struct dsaf_tbl_tcam_ucast_cfg *tcam_uc)
|
||||
{
|
||||
spin_lock_bh(&dsaf_dev->tcam_lock);
|
||||
hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
|
||||
hns_dsaf_tbl_tcam_data_cfg(dsaf_dev, tcam_data);
|
||||
hns_dsaf_tbl_tcam_ucast_cfg(dsaf_dev, tcam_uc);
|
||||
hns_dsaf_tbl_tcam_match_cfg(dsaf_dev, tcam_mask);
|
||||
hns_dsaf_tbl_tcam_data_ucast_pul(dsaf_dev);
|
||||
|
||||
/*Restore Match Data*/
|
||||
tcam_mask->tbl_tcam_data_high = 0xffffffff;
|
||||
tcam_mask->tbl_tcam_data_low = 0xffffffff;
|
||||
hns_dsaf_tbl_tcam_match_cfg(dsaf_dev, tcam_mask);
|
||||
|
||||
spin_unlock_bh(&dsaf_dev->tcam_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* hns_dsaf_tcam_mc_cfg_vague - INT
|
||||
* @dsaf_dev: dsa fabric device struct pointer
|
||||
* @address,
|
||||
* @ptbl_tcam_data,
|
||||
* @ptbl_tcam_mask
|
||||
* @ptbl_tcam_mcast
|
||||
*/
|
||||
static void hns_dsaf_tcam_mc_cfg_vague(struct dsaf_device *dsaf_dev,
|
||||
u32 address,
|
||||
struct dsaf_tbl_tcam_data *tcam_data,
|
||||
struct dsaf_tbl_tcam_data *tcam_mask,
|
||||
struct dsaf_tbl_tcam_mcast_cfg *tcam_mc)
|
||||
{
|
||||
spin_lock_bh(&dsaf_dev->tcam_lock);
|
||||
hns_dsaf_tbl_tcam_addr_cfg(dsaf_dev, address);
|
||||
hns_dsaf_tbl_tcam_data_cfg(dsaf_dev, tcam_data);
|
||||
hns_dsaf_tbl_tcam_mcast_cfg(dsaf_dev, tcam_mc);
|
||||
hns_dsaf_tbl_tcam_match_cfg(dsaf_dev, tcam_mask);
|
||||
hns_dsaf_tbl_tcam_data_mcast_pul(dsaf_dev);
|
||||
|
||||
/*Restore Match Data*/
|
||||
tcam_mask->tbl_tcam_data_high = 0xffffffff;
|
||||
tcam_mask->tbl_tcam_data_low = 0xffffffff;
|
||||
hns_dsaf_tbl_tcam_match_cfg(dsaf_dev, tcam_mask);
|
||||
|
||||
spin_unlock_bh(&dsaf_dev->tcam_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* hns_dsaf_tcam_mc_invld - INT
|
||||
* @dsaf_id: dsa fabric id
|
||||
|
@ -1492,6 +1548,27 @@ static u16 hns_dsaf_find_empty_mac_entry(struct dsaf_device *dsaf_dev)
|
|||
return DSAF_INVALID_ENTRY_IDX;
|
||||
}
|
||||
|
||||
/**
|
||||
* hns_dsaf_find_empty_mac_entry_reverse
|
||||
* search dsa fabric soft empty-entry from the end
|
||||
* @dsaf_dev: dsa fabric device struct pointer
|
||||
*/
|
||||
static u16 hns_dsaf_find_empty_mac_entry_reverse(struct dsaf_device *dsaf_dev)
|
||||
{
|
||||
struct dsaf_drv_priv *priv = hns_dsaf_dev_priv(dsaf_dev);
|
||||
struct dsaf_drv_soft_mac_tbl *soft_mac_entry;
|
||||
int i;
|
||||
|
||||
soft_mac_entry = priv->soft_mac_tbl + (DSAF_TCAM_SUM - 1);
|
||||
for (i = (DSAF_TCAM_SUM - 1); i > 0; i--) {
|
||||
/* search all entry from end to start.*/
|
||||
if (soft_mac_entry->index == DSAF_INVALID_ENTRY_IDX)
|
||||
return i;
|
||||
soft_mac_entry--;
|
||||
}
|
||||
return DSAF_INVALID_ENTRY_IDX;
|
||||
}
|
||||
|
||||
/**
|
||||
* hns_dsaf_set_mac_key - set mac key
|
||||
* @dsaf_dev: dsa fabric device struct pointer
|
||||
|
@ -2166,9 +2243,9 @@ void hns_dsaf_update_stats(struct dsaf_device *dsaf_dev, u32 node_num)
|
|||
DSAF_INODE_LOCAL_ADDR_FALSE_NUM_0_REG + 0x80 * (u64)node_num);
|
||||
|
||||
hw_stats->vlan_drop += dsaf_read_dev(dsaf_dev,
|
||||
DSAF_INODE_SW_VLAN_TAG_DISC_0_REG + 0x80 * (u64)node_num);
|
||||
DSAF_INODE_SW_VLAN_TAG_DISC_0_REG + 4 * (u64)node_num);
|
||||
hw_stats->stp_drop += dsaf_read_dev(dsaf_dev,
|
||||
DSAF_INODE_IN_DATA_STP_DISC_0_REG + 0x80 * (u64)node_num);
|
||||
DSAF_INODE_IN_DATA_STP_DISC_0_REG + 4 * (u64)node_num);
|
||||
|
||||
/* pfc pause frame statistics stored in dsaf inode*/
|
||||
if ((node_num < DSAF_SERVICE_NW_NUM) && !is_ver1) {
|
||||
|
@ -2285,237 +2362,237 @@ void hns_dsaf_get_regs(struct dsaf_device *ddev, u32 port, void *data)
|
|||
DSAF_INODE_BD_ORDER_STATUS_0_REG + j * 4);
|
||||
p[223 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_INODE_SW_VLAN_TAG_DISC_0_REG + j * 4);
|
||||
p[224 + i] = dsaf_read_dev(ddev,
|
||||
p[226 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_INODE_IN_DATA_STP_DISC_0_REG + j * 4);
|
||||
}
|
||||
|
||||
p[227] = dsaf_read_dev(ddev, DSAF_INODE_GE_FC_EN_0_REG + port * 4);
|
||||
p[229] = dsaf_read_dev(ddev, DSAF_INODE_GE_FC_EN_0_REG + port * 4);
|
||||
|
||||
for (i = 0; i < DSAF_INODE_NUM / DSAF_COMM_CHN; i++) {
|
||||
j = i * DSAF_COMM_CHN + port;
|
||||
p[228 + i] = dsaf_read_dev(ddev,
|
||||
p[230 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_INODE_VC0_IN_PKT_NUM_0_REG + j * 4);
|
||||
}
|
||||
|
||||
p[231] = dsaf_read_dev(ddev,
|
||||
DSAF_INODE_VC1_IN_PKT_NUM_0_REG + port * 4);
|
||||
p[233] = dsaf_read_dev(ddev,
|
||||
DSAF_INODE_VC1_IN_PKT_NUM_0_REG + port * 0x80);
|
||||
|
||||
/* dsaf inode registers */
|
||||
for (i = 0; i < HNS_DSAF_SBM_NUM(ddev) / DSAF_COMM_CHN; i++) {
|
||||
j = i * DSAF_COMM_CHN + port;
|
||||
p[232 + i] = dsaf_read_dev(ddev,
|
||||
p[234 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_CFG_REG_0_REG + j * 0x80);
|
||||
p[235 + i] = dsaf_read_dev(ddev,
|
||||
p[237 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_BP_CFG_0_XGE_REG_0_REG + j * 0x80);
|
||||
p[238 + i] = dsaf_read_dev(ddev,
|
||||
p[240 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_BP_CFG_1_REG_0_REG + j * 0x80);
|
||||
p[241 + i] = dsaf_read_dev(ddev,
|
||||
p[243 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_BP_CFG_2_XGE_REG_0_REG + j * 0x80);
|
||||
p[244 + i] = dsaf_read_dev(ddev,
|
||||
p[246 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_FREE_CNT_0_0_REG + j * 0x80);
|
||||
p[245 + i] = dsaf_read_dev(ddev,
|
||||
p[249 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_FREE_CNT_1_0_REG + j * 0x80);
|
||||
p[248 + i] = dsaf_read_dev(ddev,
|
||||
p[252 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_BP_CNT_0_0_REG + j * 0x80);
|
||||
p[251 + i] = dsaf_read_dev(ddev,
|
||||
p[255 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_BP_CNT_1_0_REG + j * 0x80);
|
||||
p[254 + i] = dsaf_read_dev(ddev,
|
||||
p[258 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_BP_CNT_2_0_REG + j * 0x80);
|
||||
p[257 + i] = dsaf_read_dev(ddev,
|
||||
p[261 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_BP_CNT_3_0_REG + j * 0x80);
|
||||
p[260 + i] = dsaf_read_dev(ddev,
|
||||
p[264 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_INER_ST_0_REG + j * 0x80);
|
||||
p[263 + i] = dsaf_read_dev(ddev,
|
||||
p[267 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_MIB_REQ_FAILED_TC_0_REG + j * 0x80);
|
||||
p[266 + i] = dsaf_read_dev(ddev,
|
||||
p[270 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_LNK_INPORT_CNT_0_REG + j * 0x80);
|
||||
p[269 + i] = dsaf_read_dev(ddev,
|
||||
p[273 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_LNK_DROP_CNT_0_REG + j * 0x80);
|
||||
p[272 + i] = dsaf_read_dev(ddev,
|
||||
p[276 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_INF_OUTPORT_CNT_0_REG + j * 0x80);
|
||||
p[275 + i] = dsaf_read_dev(ddev,
|
||||
p[279 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_LNK_INPORT_TC0_CNT_0_REG + j * 0x80);
|
||||
p[278 + i] = dsaf_read_dev(ddev,
|
||||
p[282 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_LNK_INPORT_TC1_CNT_0_REG + j * 0x80);
|
||||
p[281 + i] = dsaf_read_dev(ddev,
|
||||
p[285 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_LNK_INPORT_TC2_CNT_0_REG + j * 0x80);
|
||||
p[284 + i] = dsaf_read_dev(ddev,
|
||||
p[288 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_LNK_INPORT_TC3_CNT_0_REG + j * 0x80);
|
||||
p[287 + i] = dsaf_read_dev(ddev,
|
||||
p[291 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_LNK_INPORT_TC4_CNT_0_REG + j * 0x80);
|
||||
p[290 + i] = dsaf_read_dev(ddev,
|
||||
p[294 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_LNK_INPORT_TC5_CNT_0_REG + j * 0x80);
|
||||
p[293 + i] = dsaf_read_dev(ddev,
|
||||
p[297 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_LNK_INPORT_TC6_CNT_0_REG + j * 0x80);
|
||||
p[296 + i] = dsaf_read_dev(ddev,
|
||||
p[300 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_LNK_INPORT_TC7_CNT_0_REG + j * 0x80);
|
||||
p[299 + i] = dsaf_read_dev(ddev,
|
||||
p[303 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_LNK_REQ_CNT_0_REG + j * 0x80);
|
||||
p[302 + i] = dsaf_read_dev(ddev,
|
||||
p[306 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_LNK_RELS_CNT_0_REG + j * 0x80);
|
||||
p[305 + i] = dsaf_read_dev(ddev,
|
||||
p[309 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_BP_CFG_3_REG_0_REG + j * 0x80);
|
||||
p[308 + i] = dsaf_read_dev(ddev,
|
||||
p[312 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_SBM_BP_CFG_4_REG_0_REG + j * 0x80);
|
||||
}
|
||||
|
||||
/* dsaf onode registers */
|
||||
for (i = 0; i < DSAF_XOD_NUM; i++) {
|
||||
p[311 + i] = dsaf_read_dev(ddev,
|
||||
p[315 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_ETS_TSA_TC0_TC3_CFG_0_REG + i * 0x90);
|
||||
p[319 + i] = dsaf_read_dev(ddev,
|
||||
p[323 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_ETS_TSA_TC4_TC7_CFG_0_REG + i * 0x90);
|
||||
p[327 + i] = dsaf_read_dev(ddev,
|
||||
p[331 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_ETS_BW_TC0_TC3_CFG_0_REG + i * 0x90);
|
||||
p[335 + i] = dsaf_read_dev(ddev,
|
||||
p[339 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_ETS_BW_TC4_TC7_CFG_0_REG + i * 0x90);
|
||||
p[343 + i] = dsaf_read_dev(ddev,
|
||||
p[347 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_ETS_BW_OFFSET_CFG_0_REG + i * 0x90);
|
||||
p[351 + i] = dsaf_read_dev(ddev,
|
||||
p[355 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_ETS_TOKEN_CFG_0_REG + i * 0x90);
|
||||
}
|
||||
|
||||
p[359] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_0_0_REG + port * 0x90);
|
||||
p[360] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_1_0_REG + port * 0x90);
|
||||
p[361] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_2_0_REG + port * 0x90);
|
||||
p[363] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_0_0_REG + port * 0x90);
|
||||
p[364] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_1_0_REG + port * 0x90);
|
||||
p[365] = dsaf_read_dev(ddev, DSAF_XOD_PFS_CFG_2_0_REG + port * 0x90);
|
||||
|
||||
for (i = 0; i < DSAF_XOD_BIG_NUM / DSAF_COMM_CHN; i++) {
|
||||
j = i * DSAF_COMM_CHN + port;
|
||||
p[362 + i] = dsaf_read_dev(ddev,
|
||||
p[366 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_GNT_L_0_REG + j * 0x90);
|
||||
p[365 + i] = dsaf_read_dev(ddev,
|
||||
p[369 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_GNT_H_0_REG + j * 0x90);
|
||||
p[368 + i] = dsaf_read_dev(ddev,
|
||||
p[372 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_CONNECT_STATE_0_REG + j * 0x90);
|
||||
p[371 + i] = dsaf_read_dev(ddev,
|
||||
p[375 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_RCVPKT_CNT_0_REG + j * 0x90);
|
||||
p[374 + i] = dsaf_read_dev(ddev,
|
||||
p[378 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_RCVTC0_CNT_0_REG + j * 0x90);
|
||||
p[377 + i] = dsaf_read_dev(ddev,
|
||||
p[381 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_RCVTC1_CNT_0_REG + j * 0x90);
|
||||
p[380 + i] = dsaf_read_dev(ddev,
|
||||
p[384 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_RCVTC2_CNT_0_REG + j * 0x90);
|
||||
p[383 + i] = dsaf_read_dev(ddev,
|
||||
p[387 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_RCVTC3_CNT_0_REG + j * 0x90);
|
||||
p[386 + i] = dsaf_read_dev(ddev,
|
||||
p[390 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_RCVVC0_CNT_0_REG + j * 0x90);
|
||||
p[389 + i] = dsaf_read_dev(ddev,
|
||||
p[393 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_RCVVC1_CNT_0_REG + j * 0x90);
|
||||
}
|
||||
|
||||
p[392] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_XGE_RCVIN0_CNT_0_REG + port * 0x90);
|
||||
p[393] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_XGE_RCVIN1_CNT_0_REG + port * 0x90);
|
||||
p[394] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_XGE_RCVIN2_CNT_0_REG + port * 0x90);
|
||||
p[395] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_XGE_RCVIN3_CNT_0_REG + port * 0x90);
|
||||
p[396] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_XGE_RCVIN4_CNT_0_REG + port * 0x90);
|
||||
DSAF_XOD_XGE_RCVIN0_CNT_0_REG + port * 0x90);
|
||||
p[397] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_XGE_RCVIN5_CNT_0_REG + port * 0x90);
|
||||
DSAF_XOD_XGE_RCVIN1_CNT_0_REG + port * 0x90);
|
||||
p[398] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_XGE_RCVIN6_CNT_0_REG + port * 0x90);
|
||||
DSAF_XOD_XGE_RCVIN2_CNT_0_REG + port * 0x90);
|
||||
p[399] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_XGE_RCVIN7_CNT_0_REG + port * 0x90);
|
||||
DSAF_XOD_XGE_RCVIN3_CNT_0_REG + port * 0x90);
|
||||
p[400] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_PPE_RCVIN0_CNT_0_REG + port * 0x90);
|
||||
DSAF_XOD_XGE_RCVIN4_CNT_0_REG + port * 0x90);
|
||||
p[401] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_PPE_RCVIN1_CNT_0_REG + port * 0x90);
|
||||
DSAF_XOD_XGE_RCVIN5_CNT_0_REG + port * 0x90);
|
||||
p[402] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_ROCEE_RCVIN0_CNT_0_REG + port * 0x90);
|
||||
DSAF_XOD_XGE_RCVIN6_CNT_0_REG + port * 0x90);
|
||||
p[403] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_ROCEE_RCVIN1_CNT_0_REG + port * 0x90);
|
||||
DSAF_XOD_XGE_RCVIN7_CNT_0_REG + port * 0x90);
|
||||
p[404] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_PPE_RCVIN0_CNT_0_REG + port * 0x90);
|
||||
p[405] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_PPE_RCVIN1_CNT_0_REG + port * 0x90);
|
||||
p[406] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_ROCEE_RCVIN0_CNT_0_REG + port * 0x90);
|
||||
p[407] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_ROCEE_RCVIN1_CNT_0_REG + port * 0x90);
|
||||
p[408] = dsaf_read_dev(ddev,
|
||||
DSAF_XOD_FIFO_STATUS_0_REG + port * 0x90);
|
||||
|
||||
/* dsaf voq registers */
|
||||
for (i = 0; i < DSAF_VOQ_NUM / DSAF_COMM_CHN; i++) {
|
||||
j = (i * DSAF_COMM_CHN + port) * 0x90;
|
||||
p[405 + i] = dsaf_read_dev(ddev,
|
||||
p[409 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_VOQ_ECC_INVERT_EN_0_REG + j);
|
||||
p[408 + i] = dsaf_read_dev(ddev,
|
||||
p[412 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_VOQ_SRAM_PKT_NUM_0_REG + j);
|
||||
p[411 + i] = dsaf_read_dev(ddev, DSAF_VOQ_IN_PKT_NUM_0_REG + j);
|
||||
p[414 + i] = dsaf_read_dev(ddev,
|
||||
p[415 + i] = dsaf_read_dev(ddev, DSAF_VOQ_IN_PKT_NUM_0_REG + j);
|
||||
p[418 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_VOQ_OUT_PKT_NUM_0_REG + j);
|
||||
p[417 + i] = dsaf_read_dev(ddev,
|
||||
p[421 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_VOQ_ECC_ERR_ADDR_0_REG + j);
|
||||
p[420 + i] = dsaf_read_dev(ddev, DSAF_VOQ_BP_STATUS_0_REG + j);
|
||||
p[423 + i] = dsaf_read_dev(ddev, DSAF_VOQ_SPUP_IDLE_0_REG + j);
|
||||
p[426 + i] = dsaf_read_dev(ddev,
|
||||
p[424 + i] = dsaf_read_dev(ddev, DSAF_VOQ_BP_STATUS_0_REG + j);
|
||||
p[427 + i] = dsaf_read_dev(ddev, DSAF_VOQ_SPUP_IDLE_0_REG + j);
|
||||
p[430 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_VOQ_XGE_XOD_REQ_0_0_REG + j);
|
||||
p[429 + i] = dsaf_read_dev(ddev,
|
||||
p[433 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_VOQ_XGE_XOD_REQ_1_0_REG + j);
|
||||
p[432 + i] = dsaf_read_dev(ddev,
|
||||
p[436 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_VOQ_PPE_XOD_REQ_0_REG + j);
|
||||
p[435 + i] = dsaf_read_dev(ddev,
|
||||
p[439 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_VOQ_ROCEE_XOD_REQ_0_REG + j);
|
||||
p[438 + i] = dsaf_read_dev(ddev,
|
||||
p[442 + i] = dsaf_read_dev(ddev,
|
||||
DSAF_VOQ_BP_ALL_THRD_0_REG + j);
|
||||
}
|
||||
|
||||
/* dsaf tbl registers */
|
||||
p[441] = dsaf_read_dev(ddev, DSAF_TBL_CTRL_0_REG);
|
||||
p[442] = dsaf_read_dev(ddev, DSAF_TBL_INT_MSK_0_REG);
|
||||
p[443] = dsaf_read_dev(ddev, DSAF_TBL_INT_SRC_0_REG);
|
||||
p[444] = dsaf_read_dev(ddev, DSAF_TBL_INT_STS_0_REG);
|
||||
p[445] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_ADDR_0_REG);
|
||||
p[446] = dsaf_read_dev(ddev, DSAF_TBL_LINE_ADDR_0_REG);
|
||||
p[447] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_HIGH_0_REG);
|
||||
p[448] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_LOW_0_REG);
|
||||
p[449] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_4_0_REG);
|
||||
p[450] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_3_0_REG);
|
||||
p[451] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_2_0_REG);
|
||||
p[452] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_1_0_REG);
|
||||
p[453] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_0_0_REG);
|
||||
p[454] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_UCAST_CFG_0_REG);
|
||||
p[455] = dsaf_read_dev(ddev, DSAF_TBL_LIN_CFG_0_REG);
|
||||
p[456] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RDATA_HIGH_0_REG);
|
||||
p[457] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RDATA_LOW_0_REG);
|
||||
p[458] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA4_0_REG);
|
||||
p[459] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA3_0_REG);
|
||||
p[460] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA2_0_REG);
|
||||
p[461] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA1_0_REG);
|
||||
p[462] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA0_0_REG);
|
||||
p[463] = dsaf_read_dev(ddev, DSAF_TBL_LIN_RDATA_0_REG);
|
||||
p[445] = dsaf_read_dev(ddev, DSAF_TBL_CTRL_0_REG);
|
||||
p[446] = dsaf_read_dev(ddev, DSAF_TBL_INT_MSK_0_REG);
|
||||
p[447] = dsaf_read_dev(ddev, DSAF_TBL_INT_SRC_0_REG);
|
||||
p[448] = dsaf_read_dev(ddev, DSAF_TBL_INT_STS_0_REG);
|
||||
p[449] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_ADDR_0_REG);
|
||||
p[450] = dsaf_read_dev(ddev, DSAF_TBL_LINE_ADDR_0_REG);
|
||||
p[451] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_HIGH_0_REG);
|
||||
p[452] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_LOW_0_REG);
|
||||
p[453] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_4_0_REG);
|
||||
p[454] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_3_0_REG);
|
||||
p[455] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_2_0_REG);
|
||||
p[456] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_1_0_REG);
|
||||
p[457] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_MCAST_CFG_0_0_REG);
|
||||
p[458] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_UCAST_CFG_0_REG);
|
||||
p[459] = dsaf_read_dev(ddev, DSAF_TBL_LIN_CFG_0_REG);
|
||||
p[460] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RDATA_HIGH_0_REG);
|
||||
p[461] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RDATA_LOW_0_REG);
|
||||
p[462] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA4_0_REG);
|
||||
p[463] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA3_0_REG);
|
||||
p[464] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA2_0_REG);
|
||||
p[465] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA1_0_REG);
|
||||
p[466] = dsaf_read_dev(ddev, DSAF_TBL_TCAM_RAM_RDATA0_0_REG);
|
||||
p[467] = dsaf_read_dev(ddev, DSAF_TBL_LIN_RDATA_0_REG);
|
||||
|
||||
for (i = 0; i < DSAF_SW_PORT_NUM; i++) {
|
||||
j = i * 0x8;
|
||||
p[464 + 2 * i] = dsaf_read_dev(ddev,
|
||||
p[468 + 2 * i] = dsaf_read_dev(ddev,
|
||||
DSAF_TBL_DA0_MIS_INFO1_0_REG + j);
|
||||
p[465 + 2 * i] = dsaf_read_dev(ddev,
|
||||
p[469 + 2 * i] = dsaf_read_dev(ddev,
|
||||
DSAF_TBL_DA0_MIS_INFO0_0_REG + j);
|
||||
}
|
||||
|
||||
p[480] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO2_0_REG);
|
||||
p[481] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO1_0_REG);
|
||||
p[482] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO0_0_REG);
|
||||
p[483] = dsaf_read_dev(ddev, DSAF_TBL_PUL_0_REG);
|
||||
p[484] = dsaf_read_dev(ddev, DSAF_TBL_OLD_RSLT_0_REG);
|
||||
p[485] = dsaf_read_dev(ddev, DSAF_TBL_OLD_SCAN_VAL_0_REG);
|
||||
p[486] = dsaf_read_dev(ddev, DSAF_TBL_DFX_CTRL_0_REG);
|
||||
p[487] = dsaf_read_dev(ddev, DSAF_TBL_DFX_STAT_0_REG);
|
||||
p[488] = dsaf_read_dev(ddev, DSAF_TBL_DFX_STAT_2_0_REG);
|
||||
p[489] = dsaf_read_dev(ddev, DSAF_TBL_LKUP_NUM_I_0_REG);
|
||||
p[490] = dsaf_read_dev(ddev, DSAF_TBL_LKUP_NUM_O_0_REG);
|
||||
p[491] = dsaf_read_dev(ddev, DSAF_TBL_UCAST_BCAST_MIS_INFO_0_0_REG);
|
||||
p[484] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO2_0_REG);
|
||||
p[485] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO1_0_REG);
|
||||
p[486] = dsaf_read_dev(ddev, DSAF_TBL_SA_MIS_INFO0_0_REG);
|
||||
p[487] = dsaf_read_dev(ddev, DSAF_TBL_PUL_0_REG);
|
||||
p[488] = dsaf_read_dev(ddev, DSAF_TBL_OLD_RSLT_0_REG);
|
||||
p[489] = dsaf_read_dev(ddev, DSAF_TBL_OLD_SCAN_VAL_0_REG);
|
||||
p[490] = dsaf_read_dev(ddev, DSAF_TBL_DFX_CTRL_0_REG);
|
||||
p[491] = dsaf_read_dev(ddev, DSAF_TBL_DFX_STAT_0_REG);
|
||||
p[492] = dsaf_read_dev(ddev, DSAF_TBL_DFX_STAT_2_0_REG);
|
||||
p[493] = dsaf_read_dev(ddev, DSAF_TBL_LKUP_NUM_I_0_REG);
|
||||
p[494] = dsaf_read_dev(ddev, DSAF_TBL_LKUP_NUM_O_0_REG);
|
||||
p[495] = dsaf_read_dev(ddev, DSAF_TBL_UCAST_BCAST_MIS_INFO_0_0_REG);
|
||||
|
||||
/* dsaf other registers */
|
||||
p[492] = dsaf_read_dev(ddev, DSAF_INODE_FIFO_WL_0_REG + port * 0x4);
|
||||
p[493] = dsaf_read_dev(ddev, DSAF_ONODE_FIFO_WL_0_REG + port * 0x4);
|
||||
p[494] = dsaf_read_dev(ddev, DSAF_XGE_GE_WORK_MODE_0_REG + port * 0x4);
|
||||
p[495] = dsaf_read_dev(ddev,
|
||||
p[496] = dsaf_read_dev(ddev, DSAF_INODE_FIFO_WL_0_REG + port * 0x4);
|
||||
p[497] = dsaf_read_dev(ddev, DSAF_ONODE_FIFO_WL_0_REG + port * 0x4);
|
||||
p[498] = dsaf_read_dev(ddev, DSAF_XGE_GE_WORK_MODE_0_REG + port * 0x4);
|
||||
p[499] = dsaf_read_dev(ddev,
|
||||
DSAF_XGE_APP_RX_LINK_UP_0_REG + port * 0x4);
|
||||
p[496] = dsaf_read_dev(ddev, DSAF_NETPORT_CTRL_SIG_0_REG + port * 0x4);
|
||||
p[497] = dsaf_read_dev(ddev, DSAF_XGE_CTRL_SIG_CFG_0_REG + port * 0x4);
|
||||
p[500] = dsaf_read_dev(ddev, DSAF_NETPORT_CTRL_SIG_0_REG + port * 0x4);
|
||||
p[501] = dsaf_read_dev(ddev, DSAF_XGE_CTRL_SIG_CFG_0_REG + port * 0x4);
|
||||
|
||||
if (!is_ver1)
|
||||
p[498] = dsaf_read_dev(ddev, DSAF_PAUSE_CFG_REG + port * 0x4);
|
||||
p[502] = dsaf_read_dev(ddev, DSAF_PAUSE_CFG_REG + port * 0x4);
|
||||
|
||||
/* mark end of dsaf regs */
|
||||
for (i = 499; i < 504; i++)
|
||||
for (i = 503; i < 504; i++)
|
||||
p[i] = 0xdddddddd;
|
||||
}
|
||||
|
||||
|
@ -2673,58 +2750,156 @@ int hns_dsaf_get_regs_count(void)
|
|||
return DSAF_DUMP_REGS_NUM;
|
||||
}
|
||||
|
||||
static void set_promisc_tcam_enable(struct dsaf_device *dsaf_dev, u32 port)
|
||||
{
|
||||
struct dsaf_tbl_tcam_ucast_cfg tbl_tcam_ucast = {0, 1, 0, 0, 0x80};
|
||||
struct dsaf_tbl_tcam_data tbl_tcam_data_mc = {0x01000000, port};
|
||||
struct dsaf_tbl_tcam_data tbl_tcam_mask_uc = {0x01000000, 0xf};
|
||||
struct dsaf_tbl_tcam_mcast_cfg tbl_tcam_mcast = {0, 0, {0} };
|
||||
struct dsaf_drv_priv *priv = hns_dsaf_dev_priv(dsaf_dev);
|
||||
struct dsaf_tbl_tcam_data tbl_tcam_data_uc = {0, port};
|
||||
struct dsaf_drv_mac_single_dest_entry mask_entry;
|
||||
struct dsaf_drv_tbl_tcam_key temp_key, mask_key;
|
||||
struct dsaf_drv_soft_mac_tbl *soft_mac_entry;
|
||||
u16 entry_index = DSAF_INVALID_ENTRY_IDX;
|
||||
struct dsaf_drv_tbl_tcam_key mac_key;
|
||||
struct hns_mac_cb *mac_cb;
|
||||
u8 addr[ETH_ALEN] = {0};
|
||||
u8 port_num;
|
||||
u16 mskid;
|
||||
|
||||
/* promisc use vague table match with vlanid = 0 & macaddr = 0 */
|
||||
hns_dsaf_set_mac_key(dsaf_dev, &mac_key, 0x00, port, addr);
|
||||
entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key);
|
||||
if (entry_index != DSAF_INVALID_ENTRY_IDX)
|
||||
return;
|
||||
|
||||
/* put promisc tcam entry in the end. */
|
||||
/* 1. set promisc unicast vague tcam entry. */
|
||||
entry_index = hns_dsaf_find_empty_mac_entry_reverse(dsaf_dev);
|
||||
if (entry_index == DSAF_INVALID_ENTRY_IDX) {
|
||||
dev_err(dsaf_dev->dev,
|
||||
"enable uc promisc failed (port:%#x)\n",
|
||||
port);
|
||||
return;
|
||||
}
|
||||
|
||||
mac_cb = dsaf_dev->mac_cb[port];
|
||||
(void)hns_mac_get_inner_port_num(mac_cb, 0, &port_num);
|
||||
tbl_tcam_ucast.tbl_ucast_out_port = port_num;
|
||||
|
||||
/* config uc vague table */
|
||||
hns_dsaf_tcam_uc_cfg_vague(dsaf_dev, entry_index, &tbl_tcam_data_uc,
|
||||
&tbl_tcam_mask_uc, &tbl_tcam_ucast);
|
||||
|
||||
/* update software entry */
|
||||
soft_mac_entry = priv->soft_mac_tbl;
|
||||
soft_mac_entry += entry_index;
|
||||
soft_mac_entry->index = entry_index;
|
||||
soft_mac_entry->tcam_key.high.val = mac_key.high.val;
|
||||
soft_mac_entry->tcam_key.low.val = mac_key.low.val;
|
||||
/* step back to the START for mc. */
|
||||
soft_mac_entry = priv->soft_mac_tbl;
|
||||
|
||||
/* 2. set promisc multicast vague tcam entry. */
|
||||
entry_index = hns_dsaf_find_empty_mac_entry_reverse(dsaf_dev);
|
||||
if (entry_index == DSAF_INVALID_ENTRY_IDX) {
|
||||
dev_err(dsaf_dev->dev,
|
||||
"enable mc promisc failed (port:%#x)\n",
|
||||
port);
|
||||
return;
|
||||
}
|
||||
|
||||
memset(&mask_entry, 0x0, sizeof(mask_entry));
|
||||
memset(&mask_key, 0x0, sizeof(mask_key));
|
||||
memset(&temp_key, 0x0, sizeof(temp_key));
|
||||
mask_entry.addr[0] = 0x01;
|
||||
hns_dsaf_set_mac_key(dsaf_dev, &mask_key, mask_entry.in_vlan_id,
|
||||
port, mask_entry.addr);
|
||||
tbl_tcam_mcast.tbl_mcast_item_vld = 1;
|
||||
tbl_tcam_mcast.tbl_mcast_old_en = 0;
|
||||
|
||||
if (port < DSAF_SERVICE_NW_NUM) {
|
||||
mskid = port;
|
||||
} else if (port >= DSAF_BASE_INNER_PORT_NUM) {
|
||||
mskid = port - DSAF_BASE_INNER_PORT_NUM + DSAF_SERVICE_NW_NUM;
|
||||
} else {
|
||||
dev_err(dsaf_dev->dev, "%s,pnum(%d)error,key(%#x:%#x)\n",
|
||||
dsaf_dev->ae_dev.name, port,
|
||||
mask_key.high.val, mask_key.low.val);
|
||||
return;
|
||||
}
|
||||
|
||||
dsaf_set_bit(tbl_tcam_mcast.tbl_mcast_port_msk[mskid / 32],
|
||||
mskid % 32, 1);
|
||||
memcpy(&temp_key, &mask_key, sizeof(mask_key));
|
||||
hns_dsaf_tcam_mc_cfg_vague(dsaf_dev, entry_index, &tbl_tcam_data_mc,
|
||||
(struct dsaf_tbl_tcam_data *)(&mask_key),
|
||||
&tbl_tcam_mcast);
|
||||
|
||||
/* update software entry */
|
||||
soft_mac_entry += entry_index;
|
||||
soft_mac_entry->index = entry_index;
|
||||
soft_mac_entry->tcam_key.high.val = temp_key.high.val;
|
||||
soft_mac_entry->tcam_key.low.val = temp_key.low.val;
|
||||
}
|
||||
|
||||
static void set_promisc_tcam_disable(struct dsaf_device *dsaf_dev, u32 port)
|
||||
{
|
||||
struct dsaf_tbl_tcam_data tbl_tcam_data_mc = {0x01000000, port};
|
||||
struct dsaf_tbl_tcam_ucast_cfg tbl_tcam_ucast = {0, 0, 0, 0, 0};
|
||||
struct dsaf_tbl_tcam_mcast_cfg tbl_tcam_mcast = {0, 0, {0} };
|
||||
struct dsaf_drv_priv *priv = hns_dsaf_dev_priv(dsaf_dev);
|
||||
struct dsaf_tbl_tcam_data tbl_tcam_data_uc = {0, 0};
|
||||
struct dsaf_tbl_tcam_data tbl_tcam_mask = {0, 0};
|
||||
struct dsaf_drv_soft_mac_tbl *soft_mac_entry;
|
||||
u16 entry_index = DSAF_INVALID_ENTRY_IDX;
|
||||
struct dsaf_drv_tbl_tcam_key mac_key;
|
||||
u8 addr[ETH_ALEN] = {0};
|
||||
|
||||
/* 1. delete uc vague tcam entry. */
|
||||
/* promisc use vague table match with vlanid = 0 & macaddr = 0 */
|
||||
hns_dsaf_set_mac_key(dsaf_dev, &mac_key, 0x00, port, addr);
|
||||
entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key);
|
||||
|
||||
if (entry_index == DSAF_INVALID_ENTRY_IDX)
|
||||
return;
|
||||
|
||||
/* config uc vague table */
|
||||
hns_dsaf_tcam_uc_cfg_vague(dsaf_dev, entry_index, &tbl_tcam_data_uc,
|
||||
&tbl_tcam_mask, &tbl_tcam_ucast);
|
||||
/* update soft management table. */
|
||||
soft_mac_entry = priv->soft_mac_tbl;
|
||||
soft_mac_entry += entry_index;
|
||||
soft_mac_entry->index = DSAF_INVALID_ENTRY_IDX;
|
||||
/* step back to the START for mc. */
|
||||
soft_mac_entry = priv->soft_mac_tbl;
|
||||
|
||||
/* 2. delete mc vague tcam entry. */
|
||||
addr[0] = 0x01;
|
||||
memset(&mac_key, 0x0, sizeof(mac_key));
|
||||
hns_dsaf_set_mac_key(dsaf_dev, &mac_key, 0x00, port, addr);
|
||||
entry_index = hns_dsaf_find_soft_mac_entry(dsaf_dev, &mac_key);
|
||||
|
||||
if (entry_index == DSAF_INVALID_ENTRY_IDX)
|
||||
return;
|
||||
|
||||
/* config mc vague table */
|
||||
hns_dsaf_tcam_mc_cfg_vague(dsaf_dev, entry_index, &tbl_tcam_data_mc,
|
||||
&tbl_tcam_mask, &tbl_tcam_mcast);
|
||||
/* update soft management table. */
|
||||
soft_mac_entry += entry_index;
|
||||
soft_mac_entry->index = DSAF_INVALID_ENTRY_IDX;
|
||||
}
|
||||
|
||||
/* Reserve the last TCAM entry for promisc support */
|
||||
#define dsaf_promisc_tcam_entry(port) \
|
||||
(DSAF_TCAM_SUM - DSAFV2_MAC_FUZZY_TCAM_NUM + (port))
|
||||
void hns_dsaf_set_promisc_tcam(struct dsaf_device *dsaf_dev,
|
||||
u32 port, bool enable)
|
||||
{
|
||||
struct dsaf_drv_priv *priv = hns_dsaf_dev_priv(dsaf_dev);
|
||||
struct dsaf_drv_soft_mac_tbl *soft_mac_entry = priv->soft_mac_tbl;
|
||||
u16 entry_index;
|
||||
struct dsaf_drv_tbl_tcam_key tbl_tcam_data, tbl_tcam_mask;
|
||||
struct dsaf_tbl_tcam_mcast_cfg mac_data = {0};
|
||||
|
||||
if ((AE_IS_VER1(dsaf_dev->dsaf_ver)) || HNS_DSAF_IS_DEBUG(dsaf_dev))
|
||||
return;
|
||||
|
||||
/* find the tcam entry index for promisc */
|
||||
entry_index = dsaf_promisc_tcam_entry(port);
|
||||
|
||||
memset(&tbl_tcam_data, 0, sizeof(tbl_tcam_data));
|
||||
memset(&tbl_tcam_mask, 0, sizeof(tbl_tcam_mask));
|
||||
|
||||
/* config key mask */
|
||||
if (enable) {
|
||||
dsaf_set_field(tbl_tcam_data.low.bits.port_vlan,
|
||||
DSAF_TBL_TCAM_KEY_PORT_M,
|
||||
DSAF_TBL_TCAM_KEY_PORT_S, port);
|
||||
dsaf_set_field(tbl_tcam_mask.low.bits.port_vlan,
|
||||
DSAF_TBL_TCAM_KEY_PORT_M,
|
||||
DSAF_TBL_TCAM_KEY_PORT_S, 0xf);
|
||||
|
||||
/* SUB_QID */
|
||||
dsaf_set_bit(mac_data.tbl_mcast_port_msk[0],
|
||||
DSAF_SERVICE_NW_NUM, true);
|
||||
mac_data.tbl_mcast_item_vld = true; /* item_vld bit */
|
||||
} else {
|
||||
mac_data.tbl_mcast_item_vld = false; /* item_vld bit */
|
||||
}
|
||||
|
||||
dev_dbg(dsaf_dev->dev,
|
||||
"set_promisc_entry, %s Mac key(%#x:%#x) entry_index%d\n",
|
||||
dsaf_dev->ae_dev.name, tbl_tcam_data.high.val,
|
||||
tbl_tcam_data.low.val, entry_index);
|
||||
|
||||
/* config promisc entry with mask */
|
||||
hns_dsaf_tcam_mc_cfg(dsaf_dev, entry_index,
|
||||
(struct dsaf_tbl_tcam_data *)&tbl_tcam_data,
|
||||
(struct dsaf_tbl_tcam_data *)&tbl_tcam_mask,
|
||||
&mac_data);
|
||||
|
||||
/* config software entry */
|
||||
soft_mac_entry += entry_index;
|
||||
soft_mac_entry->index = enable ? entry_index : DSAF_INVALID_ENTRY_IDX;
|
||||
if (enable)
|
||||
set_promisc_tcam_enable(dsaf_dev, port);
|
||||
else
|
||||
set_promisc_tcam_disable(dsaf_dev, port);
|
||||
}
|
||||
|
||||
int hns_dsaf_wait_pkt_clean(struct dsaf_device *dsaf_dev, int port)
|
||||
|
|
|
@ -176,7 +176,7 @@
|
|||
#define DSAF_INODE_IN_DATA_STP_DISC_0_REG 0x1A50
|
||||
#define DSAF_INODE_GE_FC_EN_0_REG 0x1B00
|
||||
#define DSAF_INODE_VC0_IN_PKT_NUM_0_REG 0x1B50
|
||||
#define DSAF_INODE_VC1_IN_PKT_NUM_0_REG 0x1C00
|
||||
#define DSAF_INODE_VC1_IN_PKT_NUM_0_REG 0x103C
|
||||
#define DSAF_INODE_IN_PRIO_PAUSE_BASE_REG 0x1C00
|
||||
#define DSAF_INODE_IN_PRIO_PAUSE_BASE_OFFSET 0x100
|
||||
#define DSAF_INODE_IN_PRIO_PAUSE_OFFSET 0x50
|
||||
|
@ -404,11 +404,11 @@
|
|||
#define RCB_ECC_ERR_ADDR4_REG 0x460
|
||||
#define RCB_ECC_ERR_ADDR5_REG 0x464
|
||||
|
||||
#define RCB_COM_SF_CFG_INTMASK_RING 0x480
|
||||
#define RCB_COM_SF_CFG_RING_STS 0x484
|
||||
#define RCB_COM_SF_CFG_RING 0x488
|
||||
#define RCB_COM_SF_CFG_INTMASK_BD 0x48C
|
||||
#define RCB_COM_SF_CFG_BD_RINT_STS 0x470
|
||||
#define RCB_COM_SF_CFG_INTMASK_RING 0x470
|
||||
#define RCB_COM_SF_CFG_RING_STS 0x474
|
||||
#define RCB_COM_SF_CFG_RING 0x478
|
||||
#define RCB_COM_SF_CFG_INTMASK_BD 0x47C
|
||||
#define RCB_COM_SF_CFG_BD_RINT_STS 0x480
|
||||
#define RCB_COM_RCB_RD_BD_BUSY 0x490
|
||||
#define RCB_COM_RCB_FBD_CRT_EN 0x494
|
||||
#define RCB_COM_AXI_WR_ERR_INTMASK 0x498
|
||||
|
@ -534,6 +534,7 @@
|
|||
#define GMAC_LD_LINK_COUNTER_REG 0x01D0UL
|
||||
#define GMAC_LOOP_REG 0x01DCUL
|
||||
#define GMAC_RECV_CONTROL_REG 0x01E0UL
|
||||
#define GMAC_PCS_RX_EN_REG 0x01E4UL
|
||||
#define GMAC_VLAN_CODE_REG 0x01E8UL
|
||||
#define GMAC_RX_OVERRUN_CNT_REG 0x01ECUL
|
||||
#define GMAC_RX_LENGTHFIELD_ERR_CNT_REG 0x01F4UL
|
||||
|
|
|
@ -1186,6 +1186,9 @@ int hns_nic_init_phy(struct net_device *ndev, struct hnae_handle *h)
|
|||
if (h->phy_if == PHY_INTERFACE_MODE_XGMII)
|
||||
phy_dev->autoneg = false;
|
||||
|
||||
if (h->phy_if == PHY_INTERFACE_MODE_SGMII)
|
||||
phy_stop(phy_dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1281,6 +1284,22 @@ static int hns_nic_init_affinity_mask(int q_num, int ring_idx,
|
|||
return cpu;
|
||||
}
|
||||
|
||||
static void hns_nic_free_irq(int q_num, struct hns_nic_priv *priv)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < q_num * 2; i++) {
|
||||
if (priv->ring_data[i].ring->irq_init_flag == RCB_IRQ_INITED) {
|
||||
irq_set_affinity_hint(priv->ring_data[i].ring->irq,
|
||||
NULL);
|
||||
free_irq(priv->ring_data[i].ring->irq,
|
||||
&priv->ring_data[i]);
|
||||
priv->ring_data[i].ring->irq_init_flag =
|
||||
RCB_IRQ_NOT_INITED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int hns_nic_init_irq(struct hns_nic_priv *priv)
|
||||
{
|
||||
struct hnae_handle *h = priv->ae_handle;
|
||||
|
@ -1306,7 +1325,7 @@ static int hns_nic_init_irq(struct hns_nic_priv *priv)
|
|||
if (ret) {
|
||||
netdev_err(priv->netdev, "request irq(%d) fail\n",
|
||||
rd->ring->irq);
|
||||
return ret;
|
||||
goto out_free_irq;
|
||||
}
|
||||
disable_irq(rd->ring->irq);
|
||||
|
||||
|
@ -1321,6 +1340,10 @@ static int hns_nic_init_irq(struct hns_nic_priv *priv)
|
|||
}
|
||||
|
||||
return 0;
|
||||
|
||||
out_free_irq:
|
||||
hns_nic_free_irq(h->q_num, priv);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int hns_nic_net_up(struct net_device *ndev)
|
||||
|
@ -1330,6 +1353,9 @@ static int hns_nic_net_up(struct net_device *ndev)
|
|||
int i, j;
|
||||
int ret;
|
||||
|
||||
if (!test_bit(NIC_STATE_DOWN, &priv->state))
|
||||
return 0;
|
||||
|
||||
ret = hns_nic_init_irq(priv);
|
||||
if (ret != 0) {
|
||||
netdev_err(ndev, "hns init irq failed! ret=%d\n", ret);
|
||||
|
@ -1365,6 +1391,7 @@ static int hns_nic_net_up(struct net_device *ndev)
|
|||
for (j = i - 1; j >= 0; j--)
|
||||
hns_nic_ring_close(ndev, j);
|
||||
|
||||
hns_nic_free_irq(h->q_num, priv);
|
||||
set_bit(NIC_STATE_DOWN, &priv->state);
|
||||
|
||||
return ret;
|
||||
|
@ -1482,11 +1509,19 @@ static int hns_nic_net_stop(struct net_device *ndev)
|
|||
}
|
||||
|
||||
static void hns_tx_timeout_reset(struct hns_nic_priv *priv);
|
||||
#define HNS_TX_TIMEO_LIMIT (40 * HZ)
|
||||
static void hns_nic_net_timeout(struct net_device *ndev)
|
||||
{
|
||||
struct hns_nic_priv *priv = netdev_priv(ndev);
|
||||
|
||||
hns_tx_timeout_reset(priv);
|
||||
if (ndev->watchdog_timeo < HNS_TX_TIMEO_LIMIT) {
|
||||
ndev->watchdog_timeo *= 2;
|
||||
netdev_info(ndev, "watchdog_timo changed to %d.\n",
|
||||
ndev->watchdog_timeo);
|
||||
} else {
|
||||
ndev->watchdog_timeo = HNS_NIC_TX_TIMEOUT;
|
||||
hns_tx_timeout_reset(priv);
|
||||
}
|
||||
}
|
||||
|
||||
static int hns_nic_do_ioctl(struct net_device *netdev, struct ifreq *ifr,
|
||||
|
@ -2049,11 +2084,11 @@ static void hns_nic_service_task(struct work_struct *work)
|
|||
= container_of(work, struct hns_nic_priv, service_task);
|
||||
struct hnae_handle *h = priv->ae_handle;
|
||||
|
||||
hns_nic_reset_subtask(priv);
|
||||
hns_nic_update_link_status(priv->netdev);
|
||||
h->dev->ops->update_led_status(h);
|
||||
hns_nic_update_stats(priv->netdev);
|
||||
|
||||
hns_nic_reset_subtask(priv);
|
||||
hns_nic_service_event_complete(priv);
|
||||
}
|
||||
|
||||
|
@ -2339,7 +2374,7 @@ static int hns_nic_dev_probe(struct platform_device *pdev)
|
|||
ndev->min_mtu = MAC_MIN_MTU;
|
||||
switch (priv->enet_ver) {
|
||||
case AE_VERSION_2:
|
||||
ndev->features |= NETIF_F_TSO | NETIF_F_TSO6;
|
||||
ndev->features |= NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_NTUPLE;
|
||||
ndev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
|
||||
NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GSO |
|
||||
NETIF_F_GRO | NETIF_F_TSO | NETIF_F_TSO6;
|
||||
|
|
Loading…
Reference in a new issue