aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authoryankejian <yankejian@huawei.com>2015-10-12 21:53:45 -0400
committerDavid S. Miller <davem@davemloft.net>2015-10-14 09:52:48 -0400
commit4568637f7a20bbb1dcbf8ada56de08f6c940bcbd (patch)
tree3fef8f6bced3c092ff614d1e49548cd59910804f /drivers
parent02a6d6136fa2a17f400a030829a6435556b3e65b (diff)
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: yankejian <yankejian@huawei.com> Signed-off-by: Yisen Zhuang <yisen.zhuang@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hnae.h1
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c6
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c27
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h1
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c4
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h2
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hns_enet.c17
7 files changed, 55 insertions, 3 deletions
diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.h b/drivers/net/ethernet/hisilicon/hns/hnae.h
index d4a1eb1b8e54..cec95ac8687d 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.h
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.h
@@ -430,6 +430,7 @@ struct hnae_ae_ops {
430 void (*set_coalesce_usecs)(struct hnae_handle *handle, u32 timeout); 430 void (*set_coalesce_usecs)(struct hnae_handle *handle, u32 timeout);
431 int (*set_coalesce_frames)(struct hnae_handle *handle, 431 int (*set_coalesce_frames)(struct hnae_handle *handle,
432 u32 coalesce_frames); 432 u32 coalesce_frames);
433 void (*set_promisc_mode)(struct hnae_handle *handle, u32 en);
433 int (*get_mac_addr)(struct hnae_handle *handle, void **p); 434 int (*get_mac_addr)(struct hnae_handle *handle, void **p);
434 int (*set_mac_addr)(struct hnae_handle *handle, void *p); 435 int (*set_mac_addr)(struct hnae_handle *handle, void *p);
435 int (*set_mc_addr)(struct hnae_handle *handle, void *addr); 436 int (*set_mc_addr)(struct hnae_handle *handle, void *addr);
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
index a2c72f84e397..1a16c0307b47 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_ae_adapt.c
@@ -392,6 +392,11 @@ static int hns_ae_set_autoneg(struct hnae_handle *handle, u8 enable)
392 return hns_mac_set_autoneg(hns_get_mac_cb(handle), enable); 392 return hns_mac_set_autoneg(hns_get_mac_cb(handle), enable);
393} 393}
394 394
395static void hns_ae_set_promisc_mode(struct hnae_handle *handle, u32 en)
396{
397 hns_dsaf_set_promisc_mode(hns_ae_get_dsaf_dev(handle->dev), en);
398}
399
395static int hns_ae_get_autoneg(struct hnae_handle *handle) 400static int hns_ae_get_autoneg(struct hnae_handle *handle)
396{ 401{
397 u32 auto_neg; 402 u32 auto_neg;
@@ -748,6 +753,7 @@ static struct hnae_ae_ops hns_dsaf_ops = {
748 .get_rx_max_coalesced_frames = hns_ae_get_rx_max_coalesced_frames, 753 .get_rx_max_coalesced_frames = hns_ae_get_rx_max_coalesced_frames,
749 .set_coalesce_usecs = hns_ae_set_coalesce_usecs, 754 .set_coalesce_usecs = hns_ae_set_coalesce_usecs,
750 .set_coalesce_frames = hns_ae_set_coalesce_frames, 755 .set_coalesce_frames = hns_ae_set_coalesce_frames,
756 .set_promisc_mode = hns_ae_set_promisc_mode,
751 .set_mac_addr = hns_ae_set_mac_address, 757 .set_mac_addr = hns_ae_set_mac_address,
752 .set_mc_addr = hns_ae_set_multicast_one, 758 .set_mc_addr = hns_ae_set_multicast_one,
753 .set_mtu = hns_ae_set_mtu, 759 .set_mtu = hns_ae_set_mtu,
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
index 26ae6c64d74c..ffc2604766b6 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.c
@@ -217,6 +217,25 @@ hns_dsaf_ppe_qid_cfg(struct dsaf_device *dsaf_dev, u32 qid_cfg)
217 } 217 }
218} 218}
219 219
220static void hns_dsaf_mix_def_qid_cfg(struct dsaf_device *dsaf_dev)
221{
222 u16 max_q_per_vf, max_vfn;
223 u32 q_id, q_num_per_port;
224 u32 i;
225
226 hns_rcb_get_queue_mode(dsaf_dev->dsaf_mode,
227 HNS_DSAF_COMM_SERVICE_NW_IDX,
228 &max_vfn, &max_q_per_vf);
229 q_num_per_port = max_vfn * max_q_per_vf;
230
231 for (i = 0, q_id = 0; i < DSAF_SERVICE_NW_NUM; i++) {
232 dsaf_set_dev_field(dsaf_dev,
233 DSAF_MIX_DEF_QID_0_REG + 0x0004 * i,
234 0xff, 0, q_id);
235 q_id += q_num_per_port;
236 }
237}
238
220/** 239/**
221 * hns_dsaf_sw_port_type_cfg - cfg sw type 240 * hns_dsaf_sw_port_type_cfg - cfg sw type
222 * @dsaf_id: dsa fabric id 241 * @dsaf_id: dsa fabric id
@@ -592,6 +611,11 @@ static void hns_dsaf_tbl_tcam_data_ucast_pul(
592 dsaf_write_dev(dsaf_dev, DSAF_TBL_PUL_0_REG, o_tbl_pul); 611 dsaf_write_dev(dsaf_dev, DSAF_TBL_PUL_0_REG, o_tbl_pul);
593} 612}
594 613
614void hns_dsaf_set_promisc_mode(struct dsaf_device *dsaf_dev, u32 en)
615{
616 dsaf_set_dev_bit(dsaf_dev, DSAF_CFG_0_REG, DSAF_CFG_MIX_MODE_S, !!en);
617}
618
595/** 619/**
596 * hns_dsaf_tbl_stat_en - tbl 620 * hns_dsaf_tbl_stat_en - tbl
597 * @dsaf_id: dsa fabric id 621 * @dsaf_id: dsa fabric id
@@ -920,6 +944,9 @@ static void hns_dsaf_comm_init(struct dsaf_device *dsaf_dev)
920 /* set 22 queue per tx ppe engine, only used in switch mode */ 944 /* set 22 queue per tx ppe engine, only used in switch mode */
921 hns_dsaf_ppe_qid_cfg(dsaf_dev, DSAF_DEFAUTL_QUEUE_NUM_PER_PPE); 945 hns_dsaf_ppe_qid_cfg(dsaf_dev, DSAF_DEFAUTL_QUEUE_NUM_PER_PPE);
922 946
947 /* set promisc def queue id */
948 hns_dsaf_mix_def_qid_cfg(dsaf_dev);
949
923 /* in non switch mode, set all port to access mode */ 950 /* in non switch mode, set all port to access mode */
924 hns_dsaf_sw_port_type_cfg(dsaf_dev, DSAF_SW_PORT_TYPE_NON_VLAN); 951 hns_dsaf_sw_port_type_cfg(dsaf_dev, DSAF_SW_PORT_TYPE_NON_VLAN);
925 952
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
index 315b07ecd291..b2b93484995c 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_main.h
@@ -423,5 +423,6 @@ void hns_dsaf_get_strings(int stringset, u8 *data, int port);
423 423
424void hns_dsaf_get_regs(struct dsaf_device *ddev, u32 port, void *data); 424void hns_dsaf_get_regs(struct dsaf_device *ddev, u32 port, void *data);
425int hns_dsaf_get_regs_count(void); 425int hns_dsaf_get_regs_count(void);
426void hns_dsaf_set_promisc_mode(struct dsaf_device *dsaf_dev, u32 en);
426 427
427#endif /* __HNS_DSAF_MAIN_H__ */ 428#endif /* __HNS_DSAF_MAIN_H__ */
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c
index 05ea244d999c..4db32c62f062 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.c
@@ -575,8 +575,8 @@ int hns_rcb_set_coalesced_frames(struct dsaf_device *dsaf_dev,
575 *@max_vfn : max vfn number 575 *@max_vfn : max vfn number
576 *@max_q_per_vf:max ring number per vm 576 *@max_q_per_vf:max ring number per vm
577 */ 577 */
578static void hns_rcb_get_queue_mode(enum dsaf_mode dsaf_mode, int comm_index, 578void hns_rcb_get_queue_mode(enum dsaf_mode dsaf_mode, int comm_index,
579 u16 *max_vfn, u16 *max_q_per_vf) 579 u16 *max_vfn, u16 *max_q_per_vf)
580{ 580{
581 if (comm_index == HNS_DSAF_COMM_SERVICE_NW_IDX) { 581 if (comm_index == HNS_DSAF_COMM_SERVICE_NW_IDX) {
582 switch (dsaf_mode) { 582 switch (dsaf_mode) {
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h
index c7db6130a3cf..3a2afe2dd8bb 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h
+++ b/drivers/net/ethernet/hisilicon/hns/hns_dsaf_rcb.h
@@ -107,6 +107,8 @@ int hns_rcb_common_init_hw(struct rcb_common_cb *rcb_common);
107void hns_rcb_start(struct hnae_queue *q, u32 val); 107void hns_rcb_start(struct hnae_queue *q, u32 val);
108void hns_rcb_get_cfg(struct rcb_common_cb *rcb_common); 108void hns_rcb_get_cfg(struct rcb_common_cb *rcb_common);
109void hns_rcb_common_init_commit_hw(struct rcb_common_cb *rcb_common); 109void hns_rcb_common_init_commit_hw(struct rcb_common_cb *rcb_common);
110void hns_rcb_get_queue_mode(enum dsaf_mode dsaf_mode, int comm_index,
111 u16 *max_vfn, u16 *max_q_per_vf);
110 112
111void hns_rcb_ring_enable_hw(struct hnae_queue *q, u32 val); 113void hns_rcb_ring_enable_hw(struct hnae_queue *q, u32 val);
112void hns_rcb_int_clr_hw(struct hnae_queue *q, u32 flag); 114void hns_rcb_int_clr_hw(struct hnae_queue *q, u32 flag);
diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
index ce7f2e0e3fd1..6f9091c29869 100644
--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
@@ -1161,6 +1161,21 @@ void hns_set_multicast_list(struct net_device *ndev)
1161 } 1161 }
1162} 1162}
1163 1163
1164void hns_nic_set_rx_mode(struct net_device *ndev)
1165{
1166 struct hns_nic_priv *priv = netdev_priv(ndev);
1167 struct hnae_handle *h = priv->ae_handle;
1168
1169 if (h->dev->ops->set_promisc_mode) {
1170 if (ndev->flags & IFF_PROMISC)
1171 h->dev->ops->set_promisc_mode(h, 1);
1172 else
1173 h->dev->ops->set_promisc_mode(h, 0);
1174 }
1175
1176 hns_set_multicast_list(ndev);
1177}
1178
1164struct rtnl_link_stats64 *hns_nic_get_stats64(struct net_device *ndev, 1179struct rtnl_link_stats64 *hns_nic_get_stats64(struct net_device *ndev,
1165 struct rtnl_link_stats64 *stats) 1180 struct rtnl_link_stats64 *stats)
1166{ 1181{
@@ -1220,7 +1235,7 @@ static const struct net_device_ops hns_nic_netdev_ops = {
1220#ifdef CONFIG_NET_POLL_CONTROLLER 1235#ifdef CONFIG_NET_POLL_CONTROLLER
1221 .ndo_poll_controller = hns_nic_poll_controller, 1236 .ndo_poll_controller = hns_nic_poll_controller,
1222#endif 1237#endif
1223 .ndo_set_rx_mode = hns_set_multicast_list, 1238 .ndo_set_rx_mode = hns_nic_set_rx_mode,
1224}; 1239};
1225 1240
1226static void hns_nic_update_link_status(struct net_device *netdev) 1241static void hns_nic_update_link_status(struct net_device *netdev)