Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4568637f authored by yankejian's avatar yankejian Committed by David S. Miller
Browse files

net: hisilicon: supports promisc mode



this patch adds support to set promisc mode. it configs the queue on
init seq  when it is on promisc mode.and being enabled or disabled promisc
mode by upper level user.

Signed-off-by: default avataryankejian <yankejian@huawei.com>
Signed-off-by: default avatarYisen Zhuang <yisen.zhuang@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 02a6d613
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -430,6 +430,7 @@ struct hnae_ae_ops {
	void (*set_coalesce_usecs)(struct hnae_handle *handle, u32 timeout);
	void (*set_coalesce_usecs)(struct hnae_handle *handle, u32 timeout);
	int (*set_coalesce_frames)(struct hnae_handle *handle,
	int (*set_coalesce_frames)(struct hnae_handle *handle,
				   u32 coalesce_frames);
				   u32 coalesce_frames);
	void (*set_promisc_mode)(struct hnae_handle *handle, u32 en);
	int (*get_mac_addr)(struct hnae_handle *handle, void **p);
	int (*get_mac_addr)(struct hnae_handle *handle, void **p);
	int (*set_mac_addr)(struct hnae_handle *handle, void *p);
	int (*set_mac_addr)(struct hnae_handle *handle, void *p);
	int (*set_mc_addr)(struct hnae_handle *handle, void *addr);
	int (*set_mc_addr)(struct hnae_handle *handle, void *addr);
+6 −0
Original line number Original line Diff line number Diff line
@@ -392,6 +392,11 @@ static int hns_ae_set_autoneg(struct hnae_handle *handle, u8 enable)
	return hns_mac_set_autoneg(hns_get_mac_cb(handle), enable);
	return hns_mac_set_autoneg(hns_get_mac_cb(handle), enable);
}
}


static void hns_ae_set_promisc_mode(struct hnae_handle *handle, u32 en)
{
	hns_dsaf_set_promisc_mode(hns_ae_get_dsaf_dev(handle->dev), en);
}

static int hns_ae_get_autoneg(struct hnae_handle *handle)
static int hns_ae_get_autoneg(struct hnae_handle *handle)
{
{
	u32     auto_neg;
	u32     auto_neg;
@@ -748,6 +753,7 @@ static struct hnae_ae_ops hns_dsaf_ops = {
	.get_rx_max_coalesced_frames = hns_ae_get_rx_max_coalesced_frames,
	.get_rx_max_coalesced_frames = hns_ae_get_rx_max_coalesced_frames,
	.set_coalesce_usecs = hns_ae_set_coalesce_usecs,
	.set_coalesce_usecs = hns_ae_set_coalesce_usecs,
	.set_coalesce_frames = hns_ae_set_coalesce_frames,
	.set_coalesce_frames = hns_ae_set_coalesce_frames,
	.set_promisc_mode = hns_ae_set_promisc_mode,
	.set_mac_addr = hns_ae_set_mac_address,
	.set_mac_addr = hns_ae_set_mac_address,
	.set_mc_addr = hns_ae_set_multicast_one,
	.set_mc_addr = hns_ae_set_multicast_one,
	.set_mtu = hns_ae_set_mtu,
	.set_mtu = hns_ae_set_mtu,
+27 −0
Original line number Original line Diff line number Diff line
@@ -217,6 +217,25 @@ hns_dsaf_ppe_qid_cfg(struct dsaf_device *dsaf_dev, u32 qid_cfg)
	}
	}
}
}


static void hns_dsaf_mix_def_qid_cfg(struct dsaf_device *dsaf_dev)
{
	u16 max_q_per_vf, max_vfn;
	u32 q_id, q_num_per_port;
	u32 i;

	hns_rcb_get_queue_mode(dsaf_dev->dsaf_mode,
			       HNS_DSAF_COMM_SERVICE_NW_IDX,
			       &max_vfn, &max_q_per_vf);
	q_num_per_port = max_vfn * max_q_per_vf;

	for (i = 0, q_id = 0; i < DSAF_SERVICE_NW_NUM; i++) {
		dsaf_set_dev_field(dsaf_dev,
				   DSAF_MIX_DEF_QID_0_REG + 0x0004 * i,
				   0xff, 0, q_id);
		q_id += q_num_per_port;
	}
}

/**
/**
 * hns_dsaf_sw_port_type_cfg - cfg sw type
 * hns_dsaf_sw_port_type_cfg - cfg sw type
 * @dsaf_id: dsa fabric id
 * @dsaf_id: dsa fabric id
@@ -592,6 +611,11 @@ static void hns_dsaf_tbl_tcam_data_ucast_pul(
	dsaf_write_dev(dsaf_dev, DSAF_TBL_PUL_0_REG, o_tbl_pul);
	dsaf_write_dev(dsaf_dev, DSAF_TBL_PUL_0_REG, o_tbl_pul);
}
}


void hns_dsaf_set_promisc_mode(struct dsaf_device *dsaf_dev, u32 en)
{
	dsaf_set_dev_bit(dsaf_dev, DSAF_CFG_0_REG, DSAF_CFG_MIX_MODE_S, !!en);
}

/**
/**
 * hns_dsaf_tbl_stat_en - tbl
 * hns_dsaf_tbl_stat_en - tbl
 * @dsaf_id: dsa fabric id
 * @dsaf_id: dsa fabric id
@@ -920,6 +944,9 @@ static void hns_dsaf_comm_init(struct dsaf_device *dsaf_dev)
	/* set 22 queue per tx ppe engine, only used in switch mode */
	/* set 22 queue per tx ppe engine, only used in switch mode */
	hns_dsaf_ppe_qid_cfg(dsaf_dev, DSAF_DEFAUTL_QUEUE_NUM_PER_PPE);
	hns_dsaf_ppe_qid_cfg(dsaf_dev, DSAF_DEFAUTL_QUEUE_NUM_PER_PPE);


	/* set promisc def queue id */
	hns_dsaf_mix_def_qid_cfg(dsaf_dev);

	/* in non switch mode, set all port to access mode */
	/* in non switch mode, set all port to access mode */
	hns_dsaf_sw_port_type_cfg(dsaf_dev, DSAF_SW_PORT_TYPE_NON_VLAN);
	hns_dsaf_sw_port_type_cfg(dsaf_dev, DSAF_SW_PORT_TYPE_NON_VLAN);


+1 −0
Original line number Original line Diff line number Diff line
@@ -423,5 +423,6 @@ void hns_dsaf_get_strings(int stringset, u8 *data, int port);


void hns_dsaf_get_regs(struct dsaf_device *ddev, u32 port, void *data);
void hns_dsaf_get_regs(struct dsaf_device *ddev, u32 port, void *data);
int hns_dsaf_get_regs_count(void);
int hns_dsaf_get_regs_count(void);
void hns_dsaf_set_promisc_mode(struct dsaf_device *dsaf_dev, u32 en);


#endif /* __HNS_DSAF_MAIN_H__ */
#endif /* __HNS_DSAF_MAIN_H__ */
+2 −2
Original line number Original line Diff line number Diff line
@@ -575,7 +575,7 @@ int hns_rcb_set_coalesced_frames(struct dsaf_device *dsaf_dev,
 *@max_vfn : max vfn number
 *@max_vfn : max vfn number
 *@max_q_per_vf:max ring number per vm
 *@max_q_per_vf:max ring number per vm
 */
 */
static void hns_rcb_get_queue_mode(enum dsaf_mode dsaf_mode, int comm_index,
void hns_rcb_get_queue_mode(enum dsaf_mode dsaf_mode, int comm_index,
			    u16 *max_vfn, u16 *max_q_per_vf)
			    u16 *max_vfn, u16 *max_q_per_vf)
{
{
	if (comm_index == HNS_DSAF_COMM_SERVICE_NW_IDX) {
	if (comm_index == HNS_DSAF_COMM_SERVICE_NW_IDX) {
Loading