Lines Matching refs:priv

54 	struct mlx4_en_priv *priv = netdev_priv(dev);  in mlx4_en_setup_tc()  local
65 netdev_set_tc_queue(dev, i, priv->num_tx_rings_p_up, offset); in mlx4_en_setup_tc()
66 offset += priv->num_tx_rings_p_up; in mlx4_en_setup_tc()
78 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_low_latency_recv() local
79 struct mlx4_en_rx_ring *rx_ring = priv->rx_ring[cq->ring]; in mlx4_en_low_latency_recv()
82 if (!priv->port_up) in mlx4_en_low_latency_recv()
113 struct mlx4_en_priv *priv; member
123 static void mlx4_en_filter_rfs_expire(struct mlx4_en_priv *priv);
142 struct mlx4_en_priv *priv = filter->priv; in mlx4_en_filter_work() local
174 .port = priv->port, in mlx4_en_filter_work()
181 en_warn(priv, "RFS: ignoring unsupported ip protocol (%d)\n", in mlx4_en_filter_work()
189 rule.qpn = priv->rss_map.qps[filter->rxq_index].qpn; in mlx4_en_filter_work()
190 memcpy(spec_eth.eth.dst_mac, priv->dev->dev_addr, ETH_ALEN); in mlx4_en_filter_work()
196 rc = mlx4_flow_detach(priv->mdev->dev, filter->reg_id); in mlx4_en_filter_work()
198 en_err(priv, "Error detaching flow. rc = %d\n", rc); in mlx4_en_filter_work()
201 rc = mlx4_flow_attach(priv->mdev->dev, &rule, &filter->reg_id); in mlx4_en_filter_work()
203 en_err(priv, "Error attaching flow. err = %d\n", rc); in mlx4_en_filter_work()
206 mlx4_en_filter_rfs_expire(priv); in mlx4_en_filter_work()
212 filter_hash_bucket(struct mlx4_en_priv *priv, __be32 src_ip, __be32 dst_ip, in filter_hash_bucket() argument
224 return &priv->filter_hash[bucket_idx]; in filter_hash_bucket()
228 mlx4_en_filter_alloc(struct mlx4_en_priv *priv, int rxq_index, __be32 src_ip, in mlx4_en_filter_alloc() argument
238 filter->priv = priv; in mlx4_en_filter_alloc()
250 filter->id = priv->last_filter_id++ % RPS_NO_FILTER; in mlx4_en_filter_alloc()
252 list_add_tail(&filter->next, &priv->filters); in mlx4_en_filter_alloc()
254 filter_hash_bucket(priv, src_ip, dst_ip, src_port, in mlx4_en_filter_alloc()
262 struct mlx4_en_priv *priv = filter->priv; in mlx4_en_filter_free() local
267 rc = mlx4_flow_detach(priv->mdev->dev, filter->reg_id); in mlx4_en_filter_free()
269 en_err(priv, "Error detaching flow. rc = %d\n", rc); in mlx4_en_filter_free()
275 mlx4_en_filter_find(struct mlx4_en_priv *priv, __be32 src_ip, __be32 dst_ip, in mlx4_en_filter_find() argument
282 filter_hash_bucket(priv, src_ip, dst_ip, in mlx4_en_filter_find()
302 struct mlx4_en_priv *priv = netdev_priv(net_dev); in mlx4_en_filter_rfs() local
331 spin_lock_bh(&priv->filters_lock); in mlx4_en_filter_rfs()
332 filter = mlx4_en_filter_find(priv, src_ip, dst_ip, ip_proto, in mlx4_en_filter_rfs()
340 filter = mlx4_en_filter_alloc(priv, rxq_index, in mlx4_en_filter_rfs()
349 queue_work(priv->mdev->workqueue, &filter->work); in mlx4_en_filter_rfs()
354 spin_unlock_bh(&priv->filters_lock); in mlx4_en_filter_rfs()
359 void mlx4_en_cleanup_filters(struct mlx4_en_priv *priv) in mlx4_en_cleanup_filters() argument
364 spin_lock_bh(&priv->filters_lock); in mlx4_en_cleanup_filters()
365 list_for_each_entry_safe(filter, tmp, &priv->filters, next) { in mlx4_en_cleanup_filters()
369 spin_unlock_bh(&priv->filters_lock); in mlx4_en_cleanup_filters()
377 static void mlx4_en_filter_rfs_expire(struct mlx4_en_priv *priv) in mlx4_en_filter_rfs_expire() argument
383 spin_lock_bh(&priv->filters_lock); in mlx4_en_filter_rfs_expire()
384 list_for_each_entry_safe(filter, tmp, &priv->filters, next) { in mlx4_en_filter_rfs_expire()
390 rps_may_expire_flow(priv->dev, in mlx4_en_filter_rfs_expire()
401 if (last_filter && (&last_filter->next != priv->filters.next)) in mlx4_en_filter_rfs_expire()
402 list_move(&priv->filters, &last_filter->next); in mlx4_en_filter_rfs_expire()
404 spin_unlock_bh(&priv->filters_lock); in mlx4_en_filter_rfs_expire()
414 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_vlan_rx_add_vid() local
415 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_vlan_rx_add_vid()
419 en_dbg(HW, priv, "adding VLAN:%d\n", vid); in mlx4_en_vlan_rx_add_vid()
421 set_bit(vid, priv->active_vlans); in mlx4_en_vlan_rx_add_vid()
425 if (mdev->device_up && priv->port_up) { in mlx4_en_vlan_rx_add_vid()
426 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv); in mlx4_en_vlan_rx_add_vid()
428 en_err(priv, "Failed configuring VLAN filter\n"); in mlx4_en_vlan_rx_add_vid()
430 if (mlx4_register_vlan(mdev->dev, priv->port, vid, &idx)) in mlx4_en_vlan_rx_add_vid()
431 en_dbg(HW, priv, "failed adding vlan %d\n", vid); in mlx4_en_vlan_rx_add_vid()
440 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_vlan_rx_kill_vid() local
441 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_vlan_rx_kill_vid()
444 en_dbg(HW, priv, "Killing VID:%d\n", vid); in mlx4_en_vlan_rx_kill_vid()
446 clear_bit(vid, priv->active_vlans); in mlx4_en_vlan_rx_kill_vid()
450 mlx4_unregister_vlan(mdev->dev, priv->port, vid); in mlx4_en_vlan_rx_kill_vid()
452 if (mdev->device_up && priv->port_up) { in mlx4_en_vlan_rx_kill_vid()
453 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv); in mlx4_en_vlan_rx_kill_vid()
455 en_err(priv, "Failed configuring VLAN filter\n"); in mlx4_en_vlan_rx_kill_vid()
473 static int mlx4_en_tunnel_steer_add(struct mlx4_en_priv *priv, unsigned char *addr, in mlx4_en_tunnel_steer_add() argument
478 if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN || in mlx4_en_tunnel_steer_add()
479 priv->mdev->dev->caps.dmfs_high_steer_mode == MLX4_STEERING_DMFS_A0_STATIC) in mlx4_en_tunnel_steer_add()
482 err = mlx4_tunnel_steer_add(priv->mdev->dev, addr, priv->port, qpn, in mlx4_en_tunnel_steer_add()
485 en_err(priv, "failed to add vxlan steering rule, err %d\n", err); in mlx4_en_tunnel_steer_add()
488 en_dbg(DRV, priv, "added vxlan steering rule, mac %pM reg_id %llx\n", addr, *reg_id); in mlx4_en_tunnel_steer_add()
493 static int mlx4_en_uc_steer_add(struct mlx4_en_priv *priv, in mlx4_en_uc_steer_add() argument
496 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_uc_steer_add()
507 gid[5] = priv->port; in mlx4_en_uc_steer_add()
524 rule.port = priv->port; in mlx4_en_uc_steer_add()
540 en_warn(priv, "Failed Attaching Unicast\n"); in mlx4_en_uc_steer_add()
545 static void mlx4_en_uc_steer_release(struct mlx4_en_priv *priv, in mlx4_en_uc_steer_release() argument
548 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_uc_steer_release()
558 gid[5] = priv->port; in mlx4_en_uc_steer_release()
568 en_err(priv, "Invalid steering mode.\n"); in mlx4_en_uc_steer_release()
572 static int mlx4_en_get_qp(struct mlx4_en_priv *priv) in mlx4_en_get_qp() argument
574 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_get_qp()
578 int *qpn = &priv->base_qpn; in mlx4_en_get_qp()
579 u64 mac = mlx4_mac_to_u64(priv->dev->dev_addr); in mlx4_en_get_qp()
581 en_dbg(DRV, priv, "Registering MAC: %pM for adding\n", in mlx4_en_get_qp()
582 priv->dev->dev_addr); in mlx4_en_get_qp()
583 index = mlx4_register_mac(dev, priv->port, mac); in mlx4_en_get_qp()
586 en_err(priv, "Failed adding MAC: %pM\n", in mlx4_en_get_qp()
587 priv->dev->dev_addr); in mlx4_en_get_qp()
592 int base_qpn = mlx4_get_base_qpn(dev, priv->port); in mlx4_en_get_qp()
598 en_dbg(DRV, priv, "Reserved qp %d\n", *qpn); in mlx4_en_get_qp()
600 en_err(priv, "Failed to reserve qp for mac registration\n"); in mlx4_en_get_qp()
601 mlx4_unregister_mac(dev, priv->port, mac); in mlx4_en_get_qp()
608 static void mlx4_en_put_qp(struct mlx4_en_priv *priv) in mlx4_en_put_qp() argument
610 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_put_qp()
612 int qpn = priv->base_qpn; in mlx4_en_put_qp()
615 u64 mac = mlx4_mac_to_u64(priv->dev->dev_addr); in mlx4_en_put_qp()
616 en_dbg(DRV, priv, "Registering MAC: %pM for deleting\n", in mlx4_en_put_qp()
617 priv->dev->dev_addr); in mlx4_en_put_qp()
618 mlx4_unregister_mac(dev, priv->port, mac); in mlx4_en_put_qp()
620 en_dbg(DRV, priv, "Releasing qp: port %d, qpn %d\n", in mlx4_en_put_qp()
621 priv->port, qpn); in mlx4_en_put_qp()
623 priv->flags &= ~MLX4_EN_FLAG_FORCE_PROMISC; in mlx4_en_put_qp()
627 static int mlx4_en_replace_mac(struct mlx4_en_priv *priv, int qpn, in mlx4_en_replace_mac() argument
630 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_replace_mac()
642 bucket = &priv->mac_hash[prev_mac[MLX4_EN_MAC_HASH_IDX]]; in mlx4_en_replace_mac()
645 mlx4_en_uc_steer_release(priv, entry->mac, in mlx4_en_replace_mac()
647 mlx4_unregister_mac(dev, priv->port, in mlx4_en_replace_mac()
655 &priv->mac_hash[mac_hash]); in mlx4_en_replace_mac()
656 mlx4_register_mac(dev, priv->port, new_mac_u64); in mlx4_en_replace_mac()
657 err = mlx4_en_uc_steer_add(priv, new_mac, in mlx4_en_replace_mac()
662 if (priv->tunnel_reg_id) { in mlx4_en_replace_mac()
663 mlx4_flow_detach(priv->mdev->dev, priv->tunnel_reg_id); in mlx4_en_replace_mac()
664 priv->tunnel_reg_id = 0; in mlx4_en_replace_mac()
666 err = mlx4_en_tunnel_steer_add(priv, new_mac, qpn, in mlx4_en_replace_mac()
667 &priv->tunnel_reg_id); in mlx4_en_replace_mac()
674 return __mlx4_replace_mac(dev, priv->port, qpn, new_mac_u64); in mlx4_en_replace_mac()
677 static int mlx4_en_do_set_mac(struct mlx4_en_priv *priv, in mlx4_en_do_set_mac() argument
682 if (priv->port_up) { in mlx4_en_do_set_mac()
684 err = mlx4_en_replace_mac(priv, priv->base_qpn, in mlx4_en_do_set_mac()
685 new_mac, priv->current_mac); in mlx4_en_do_set_mac()
687 en_err(priv, "Failed changing HW MAC address\n"); in mlx4_en_do_set_mac()
689 en_dbg(HW, priv, "Port is down while registering mac, exiting...\n"); in mlx4_en_do_set_mac()
692 memcpy(priv->current_mac, new_mac, sizeof(priv->current_mac)); in mlx4_en_do_set_mac()
699 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_set_mac() local
700 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_set_mac()
710 err = mlx4_en_do_set_mac(priv, new_mac); in mlx4_en_set_mac()
720 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_clear_list() local
723 list_for_each_entry_safe(mc_to_del, tmp, &priv->mc_list, list) { in mlx4_en_clear_list()
731 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_cache_mclist() local
743 list_add_tail(&tmp->list, &priv->mc_list); in mlx4_en_cache_mclist()
747 static void update_mclist_flags(struct mlx4_en_priv *priv, in update_mclist_flags() argument
796 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_set_rx_mode() local
798 if (!priv->port_up) in mlx4_en_set_rx_mode()
801 queue_work(priv->mdev->workqueue, &priv->rx_mode_task); in mlx4_en_set_rx_mode()
804 static void mlx4_en_set_promisc_mode(struct mlx4_en_priv *priv, in mlx4_en_set_promisc_mode() argument
809 if (!(priv->flags & MLX4_EN_FLAG_PROMISC)) { in mlx4_en_set_promisc_mode()
810 if (netif_msg_rx_status(priv)) in mlx4_en_set_promisc_mode()
811 en_warn(priv, "Entering promiscuous mode\n"); in mlx4_en_set_promisc_mode()
812 priv->flags |= MLX4_EN_FLAG_PROMISC; in mlx4_en_set_promisc_mode()
818 priv->port, in mlx4_en_set_promisc_mode()
819 priv->base_qpn, in mlx4_en_set_promisc_mode()
822 en_err(priv, "Failed enabling promiscuous mode\n"); in mlx4_en_set_promisc_mode()
823 priv->flags |= MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_set_promisc_mode()
828 priv->base_qpn, in mlx4_en_set_promisc_mode()
829 priv->port); in mlx4_en_set_promisc_mode()
831 en_err(priv, "Failed enabling unicast promiscuous mode\n"); in mlx4_en_set_promisc_mode()
836 if (!(priv->flags & MLX4_EN_FLAG_MC_PROMISC)) { in mlx4_en_set_promisc_mode()
838 priv->base_qpn, in mlx4_en_set_promisc_mode()
839 priv->port); in mlx4_en_set_promisc_mode()
841 en_err(priv, "Failed enabling multicast promiscuous mode\n"); in mlx4_en_set_promisc_mode()
842 priv->flags |= MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_set_promisc_mode()
848 priv->port, in mlx4_en_set_promisc_mode()
849 priv->base_qpn, in mlx4_en_set_promisc_mode()
852 en_err(priv, "Failed enabling promiscuous mode\n"); in mlx4_en_set_promisc_mode()
857 err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, in mlx4_en_set_promisc_mode()
860 en_err(priv, "Failed disabling multicast filter\n"); in mlx4_en_set_promisc_mode()
864 static void mlx4_en_clear_promisc_mode(struct mlx4_en_priv *priv, in mlx4_en_clear_promisc_mode() argument
869 if (netif_msg_rx_status(priv)) in mlx4_en_clear_promisc_mode()
870 en_warn(priv, "Leaving promiscuous mode\n"); in mlx4_en_clear_promisc_mode()
871 priv->flags &= ~MLX4_EN_FLAG_PROMISC; in mlx4_en_clear_promisc_mode()
877 priv->port, in mlx4_en_clear_promisc_mode()
880 en_err(priv, "Failed disabling promiscuous mode\n"); in mlx4_en_clear_promisc_mode()
881 priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_clear_promisc_mode()
886 priv->base_qpn, in mlx4_en_clear_promisc_mode()
887 priv->port); in mlx4_en_clear_promisc_mode()
889 en_err(priv, "Failed disabling unicast promiscuous mode\n"); in mlx4_en_clear_promisc_mode()
891 if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) { in mlx4_en_clear_promisc_mode()
893 priv->base_qpn, in mlx4_en_clear_promisc_mode()
894 priv->port); in mlx4_en_clear_promisc_mode()
896 en_err(priv, "Failed disabling multicast promiscuous mode\n"); in mlx4_en_clear_promisc_mode()
897 priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_clear_promisc_mode()
903 priv->port, in mlx4_en_clear_promisc_mode()
904 priv->base_qpn, 0); in mlx4_en_clear_promisc_mode()
906 en_err(priv, "Failed disabling promiscuous mode\n"); in mlx4_en_clear_promisc_mode()
911 static void mlx4_en_do_multicast(struct mlx4_en_priv *priv, in mlx4_en_do_multicast() argument
922 err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, in mlx4_en_do_multicast()
925 en_err(priv, "Failed disabling multicast filter\n"); in mlx4_en_do_multicast()
928 if (!(priv->flags & MLX4_EN_FLAG_MC_PROMISC)) { in mlx4_en_do_multicast()
932 priv->port, in mlx4_en_do_multicast()
933 priv->base_qpn, in mlx4_en_do_multicast()
939 priv->base_qpn, in mlx4_en_do_multicast()
940 priv->port); in mlx4_en_do_multicast()
947 en_err(priv, "Failed entering multicast promisc mode\n"); in mlx4_en_do_multicast()
948 priv->flags |= MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_do_multicast()
952 if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) { in mlx4_en_do_multicast()
956 priv->port, in mlx4_en_do_multicast()
962 priv->base_qpn, in mlx4_en_do_multicast()
963 priv->port); in mlx4_en_do_multicast()
970 en_err(priv, "Failed disabling multicast promiscuous mode\n"); in mlx4_en_do_multicast()
971 priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_do_multicast()
974 err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, in mlx4_en_do_multicast()
977 en_err(priv, "Failed disabling multicast filter\n"); in mlx4_en_do_multicast()
980 mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, ETH_BCAST, in mlx4_en_do_multicast()
988 list_for_each_entry(mclist, &priv->mc_list, list) { in mlx4_en_do_multicast()
990 mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, in mlx4_en_do_multicast()
993 err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, in mlx4_en_do_multicast()
996 en_err(priv, "Failed enabling multicast filter\n"); in mlx4_en_do_multicast()
998 update_mclist_flags(priv, &priv->curr_list, &priv->mc_list); in mlx4_en_do_multicast()
999 list_for_each_entry_safe(mclist, tmp, &priv->curr_list, list) { in mlx4_en_do_multicast()
1003 mc_list[5] = priv->port; in mlx4_en_do_multicast()
1005 &priv->rss_map.indir_qp, in mlx4_en_do_multicast()
1010 en_err(priv, "Fail to detach multicast address\n"); in mlx4_en_do_multicast()
1013 err = mlx4_flow_detach(priv->mdev->dev, mclist->tunnel_reg_id); in mlx4_en_do_multicast()
1015 en_err(priv, "Failed to detach multicast address\n"); in mlx4_en_do_multicast()
1025 mc_list[5] = priv->port; in mlx4_en_do_multicast()
1027 &priv->rss_map.indir_qp, in mlx4_en_do_multicast()
1029 priv->port, 0, in mlx4_en_do_multicast()
1033 en_err(priv, "Fail to attach multicast address\n"); in mlx4_en_do_multicast()
1035 err = mlx4_en_tunnel_steer_add(priv, &mc_list[10], priv->base_qpn, in mlx4_en_do_multicast()
1038 en_err(priv, "Failed to attach multicast address\n"); in mlx4_en_do_multicast()
1044 static void mlx4_en_do_uc_filter(struct mlx4_en_priv *priv, in mlx4_en_do_uc_filter() argument
1065 bucket = &priv->mac_hash[i]; in mlx4_en_do_uc_filter()
1078 priv->current_mac)) in mlx4_en_do_uc_filter()
1083 mlx4_en_uc_steer_release(priv, entry->mac, in mlx4_en_do_uc_filter()
1084 priv->base_qpn, in mlx4_en_do_uc_filter()
1086 mlx4_unregister_mac(mdev->dev, priv->port, mac); in mlx4_en_do_uc_filter()
1090 en_dbg(DRV, priv, "Removed MAC %pM on port:%d\n", in mlx4_en_do_uc_filter()
1091 entry->mac, priv->port); in mlx4_en_do_uc_filter()
1100 if ((priv->flags & MLX4_EN_FLAG_FORCE_PROMISC) && 0 == removed) in mlx4_en_do_uc_filter()
1103 prev_flags = priv->flags; in mlx4_en_do_uc_filter()
1104 priv->flags &= ~MLX4_EN_FLAG_FORCE_PROMISC; in mlx4_en_do_uc_filter()
1109 bucket = &priv->mac_hash[ha->addr[MLX4_EN_MAC_HASH_IDX]]; in mlx4_en_do_uc_filter()
1120 en_err(priv, "Failed adding MAC %pM on port:%d (out of memory)\n", in mlx4_en_do_uc_filter()
1121 ha->addr, priv->port); in mlx4_en_do_uc_filter()
1122 priv->flags |= MLX4_EN_FLAG_FORCE_PROMISC; in mlx4_en_do_uc_filter()
1127 err = mlx4_register_mac(mdev->dev, priv->port, mac); in mlx4_en_do_uc_filter()
1129 en_err(priv, "Failed registering MAC %pM on port %d: %d\n", in mlx4_en_do_uc_filter()
1130 ha->addr, priv->port, err); in mlx4_en_do_uc_filter()
1132 priv->flags |= MLX4_EN_FLAG_FORCE_PROMISC; in mlx4_en_do_uc_filter()
1135 err = mlx4_en_uc_steer_add(priv, ha->addr, in mlx4_en_do_uc_filter()
1136 &priv->base_qpn, in mlx4_en_do_uc_filter()
1139 en_err(priv, "Failed adding MAC %pM on port %d: %d\n", in mlx4_en_do_uc_filter()
1140 ha->addr, priv->port, err); in mlx4_en_do_uc_filter()
1141 mlx4_unregister_mac(mdev->dev, priv->port, mac); in mlx4_en_do_uc_filter()
1143 priv->flags |= MLX4_EN_FLAG_FORCE_PROMISC; in mlx4_en_do_uc_filter()
1147 en_dbg(DRV, priv, "Added MAC %pM on port:%d\n", in mlx4_en_do_uc_filter()
1148 ha->addr, priv->port); in mlx4_en_do_uc_filter()
1150 bucket = &priv->mac_hash[mac_hash]; in mlx4_en_do_uc_filter()
1156 if (priv->flags & MLX4_EN_FLAG_FORCE_PROMISC) { in mlx4_en_do_uc_filter()
1157 en_warn(priv, "Forcing promiscuous mode on port:%d\n", in mlx4_en_do_uc_filter()
1158 priv->port); in mlx4_en_do_uc_filter()
1160 en_warn(priv, "Stop forcing promiscuous mode on port:%d\n", in mlx4_en_do_uc_filter()
1161 priv->port); in mlx4_en_do_uc_filter()
1167 struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, in mlx4_en_do_set_rx_mode() local
1169 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_do_set_rx_mode()
1170 struct net_device *dev = priv->dev; in mlx4_en_do_set_rx_mode()
1174 en_dbg(HW, priv, "Card is not up, ignoring rx mode change.\n"); in mlx4_en_do_set_rx_mode()
1177 if (!priv->port_up) { in mlx4_en_do_set_rx_mode()
1178 en_dbg(HW, priv, "Port is down, ignoring rx mode change.\n"); in mlx4_en_do_set_rx_mode()
1183 if (!mlx4_en_QUERY_PORT(mdev, priv->port)) { in mlx4_en_do_set_rx_mode()
1184 if (priv->port_state.link_state) { in mlx4_en_do_set_rx_mode()
1185 priv->last_link_state = MLX4_DEV_EVENT_PORT_UP; in mlx4_en_do_set_rx_mode()
1187 en_dbg(LINK, priv, "Link Up\n"); in mlx4_en_do_set_rx_mode()
1193 mlx4_en_do_uc_filter(priv, dev, mdev); in mlx4_en_do_set_rx_mode()
1197 (priv->flags & MLX4_EN_FLAG_FORCE_PROMISC)) { in mlx4_en_do_set_rx_mode()
1198 mlx4_en_set_promisc_mode(priv, mdev); in mlx4_en_do_set_rx_mode()
1203 if (priv->flags & MLX4_EN_FLAG_PROMISC) in mlx4_en_do_set_rx_mode()
1204 mlx4_en_clear_promisc_mode(priv, mdev); in mlx4_en_do_set_rx_mode()
1206 mlx4_en_do_multicast(priv, dev, mdev); in mlx4_en_do_set_rx_mode()
1214 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_netpoll() local
1218 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_netpoll()
1219 cq = priv->rx_cq[i]; in mlx4_en_netpoll()
1225 static int mlx4_en_set_rss_steer_rules(struct mlx4_en_priv *priv) in mlx4_en_set_rss_steer_rules() argument
1229 int *qpn = &priv->base_qpn; in mlx4_en_set_rss_steer_rules()
1232 err = mlx4_en_uc_steer_add(priv, priv->dev->dev_addr, qpn, &reg_id); in mlx4_en_set_rss_steer_rules()
1236 err = mlx4_en_tunnel_steer_add(priv, priv->dev->dev_addr, *qpn, in mlx4_en_set_rss_steer_rules()
1237 &priv->tunnel_reg_id); in mlx4_en_set_rss_steer_rules()
1247 memcpy(entry->mac, priv->dev->dev_addr, sizeof(entry->mac)); in mlx4_en_set_rss_steer_rules()
1248 memcpy(priv->current_mac, entry->mac, sizeof(priv->current_mac)); in mlx4_en_set_rss_steer_rules()
1251 &priv->mac_hash[entry->mac[MLX4_EN_MAC_HASH_IDX]]); in mlx4_en_set_rss_steer_rules()
1256 if (priv->tunnel_reg_id) in mlx4_en_set_rss_steer_rules()
1257 mlx4_flow_detach(priv->mdev->dev, priv->tunnel_reg_id); in mlx4_en_set_rss_steer_rules()
1260 mlx4_en_uc_steer_release(priv, priv->dev->dev_addr, *qpn, reg_id); in mlx4_en_set_rss_steer_rules()
1264 static void mlx4_en_delete_rss_steer_rules(struct mlx4_en_priv *priv) in mlx4_en_delete_rss_steer_rules() argument
1268 int qpn = priv->base_qpn; in mlx4_en_delete_rss_steer_rules()
1274 bucket = &priv->mac_hash[i]; in mlx4_en_delete_rss_steer_rules()
1277 en_dbg(DRV, priv, "Registering MAC:%pM for deleting\n", in mlx4_en_delete_rss_steer_rules()
1279 mlx4_en_uc_steer_release(priv, entry->mac, in mlx4_en_delete_rss_steer_rules()
1282 mlx4_unregister_mac(priv->mdev->dev, priv->port, mac); in mlx4_en_delete_rss_steer_rules()
1288 if (priv->tunnel_reg_id) { in mlx4_en_delete_rss_steer_rules()
1289 mlx4_flow_detach(priv->mdev->dev, priv->tunnel_reg_id); in mlx4_en_delete_rss_steer_rules()
1290 priv->tunnel_reg_id = 0; in mlx4_en_delete_rss_steer_rules()
1296 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_tx_timeout() local
1297 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_tx_timeout()
1300 if (netif_msg_timer(priv)) in mlx4_en_tx_timeout()
1301 en_warn(priv, "Tx timeout called on port:%d\n", priv->port); in mlx4_en_tx_timeout()
1303 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_tx_timeout()
1306 en_warn(priv, "TX timeout on queue: %d, QP: 0x%x, CQ: 0x%x, Cons: 0x%x, Prod: 0x%x\n", in mlx4_en_tx_timeout()
1307 i, priv->tx_ring[i]->qpn, priv->tx_ring[i]->cqn, in mlx4_en_tx_timeout()
1308 priv->tx_ring[i]->cons, priv->tx_ring[i]->prod); in mlx4_en_tx_timeout()
1311 priv->port_stats.tx_timeout++; in mlx4_en_tx_timeout()
1312 en_dbg(DRV, priv, "Scheduling watchdog\n"); in mlx4_en_tx_timeout()
1313 queue_work(mdev->workqueue, &priv->watchdog_task); in mlx4_en_tx_timeout()
1319 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_get_stats() local
1321 spin_lock_bh(&priv->stats_lock); in mlx4_en_get_stats()
1322 memcpy(&priv->ret_stats, &priv->stats, sizeof(priv->stats)); in mlx4_en_get_stats()
1323 spin_unlock_bh(&priv->stats_lock); in mlx4_en_get_stats()
1325 return &priv->ret_stats; in mlx4_en_get_stats()
1328 static void mlx4_en_set_default_moderation(struct mlx4_en_priv *priv) in mlx4_en_set_default_moderation() argument
1339 priv->rx_frames = MLX4_EN_RX_COAL_TARGET; in mlx4_en_set_default_moderation()
1340 priv->rx_usecs = MLX4_EN_RX_COAL_TIME; in mlx4_en_set_default_moderation()
1341 priv->tx_frames = MLX4_EN_TX_COAL_PKTS; in mlx4_en_set_default_moderation()
1342 priv->tx_usecs = MLX4_EN_TX_COAL_TIME; in mlx4_en_set_default_moderation()
1343 en_dbg(INTR, priv, "Default coalesing params for mtu:%d - rx_frames:%d rx_usecs:%d\n", in mlx4_en_set_default_moderation()
1344 priv->dev->mtu, priv->rx_frames, priv->rx_usecs); in mlx4_en_set_default_moderation()
1347 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_set_default_moderation()
1348 cq = priv->rx_cq[i]; in mlx4_en_set_default_moderation()
1349 cq->moder_cnt = priv->rx_frames; in mlx4_en_set_default_moderation()
1350 cq->moder_time = priv->rx_usecs; in mlx4_en_set_default_moderation()
1351 priv->last_moder_time[i] = MLX4_EN_AUTO_CONF; in mlx4_en_set_default_moderation()
1352 priv->last_moder_packets[i] = 0; in mlx4_en_set_default_moderation()
1353 priv->last_moder_bytes[i] = 0; in mlx4_en_set_default_moderation()
1356 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_set_default_moderation()
1357 cq = priv->tx_cq[i]; in mlx4_en_set_default_moderation()
1358 cq->moder_cnt = priv->tx_frames; in mlx4_en_set_default_moderation()
1359 cq->moder_time = priv->tx_usecs; in mlx4_en_set_default_moderation()
1363 priv->pkt_rate_low = MLX4_EN_RX_RATE_LOW; in mlx4_en_set_default_moderation()
1364 priv->rx_usecs_low = MLX4_EN_RX_COAL_TIME_LOW; in mlx4_en_set_default_moderation()
1365 priv->pkt_rate_high = MLX4_EN_RX_RATE_HIGH; in mlx4_en_set_default_moderation()
1366 priv->rx_usecs_high = MLX4_EN_RX_COAL_TIME_HIGH; in mlx4_en_set_default_moderation()
1367 priv->sample_interval = MLX4_EN_SAMPLE_INTERVAL; in mlx4_en_set_default_moderation()
1368 priv->adaptive_rx_coal = 1; in mlx4_en_set_default_moderation()
1369 priv->last_moder_jiffies = 0; in mlx4_en_set_default_moderation()
1370 priv->last_moder_tx_packets = 0; in mlx4_en_set_default_moderation()
1373 static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv) in mlx4_en_auto_moderation() argument
1375 unsigned long period = (unsigned long) (jiffies - priv->last_moder_jiffies); in mlx4_en_auto_moderation()
1386 if (!priv->adaptive_rx_coal || period < priv->sample_interval * HZ) in mlx4_en_auto_moderation()
1389 for (ring = 0; ring < priv->rx_ring_num; ring++) { in mlx4_en_auto_moderation()
1390 spin_lock_bh(&priv->stats_lock); in mlx4_en_auto_moderation()
1391 rx_packets = priv->rx_ring[ring]->packets; in mlx4_en_auto_moderation()
1392 rx_bytes = priv->rx_ring[ring]->bytes; in mlx4_en_auto_moderation()
1393 spin_unlock_bh(&priv->stats_lock); in mlx4_en_auto_moderation()
1396 priv->last_moder_packets[ring])); in mlx4_en_auto_moderation()
1400 priv->last_moder_bytes[ring])) / packets : 0; in mlx4_en_auto_moderation()
1404 if (rate > (MLX4_EN_RX_RATE_THRESH / priv->rx_ring_num) && in mlx4_en_auto_moderation()
1406 if (rate < priv->pkt_rate_low) in mlx4_en_auto_moderation()
1407 moder_time = priv->rx_usecs_low; in mlx4_en_auto_moderation()
1408 else if (rate > priv->pkt_rate_high) in mlx4_en_auto_moderation()
1409 moder_time = priv->rx_usecs_high; in mlx4_en_auto_moderation()
1411 moder_time = (rate - priv->pkt_rate_low) * in mlx4_en_auto_moderation()
1412 (priv->rx_usecs_high - priv->rx_usecs_low) / in mlx4_en_auto_moderation()
1413 (priv->pkt_rate_high - priv->pkt_rate_low) + in mlx4_en_auto_moderation()
1414 priv->rx_usecs_low; in mlx4_en_auto_moderation()
1416 moder_time = priv->rx_usecs_low; in mlx4_en_auto_moderation()
1419 if (moder_time != priv->last_moder_time[ring]) { in mlx4_en_auto_moderation()
1420 priv->last_moder_time[ring] = moder_time; in mlx4_en_auto_moderation()
1421 cq = priv->rx_cq[ring]; in mlx4_en_auto_moderation()
1423 cq->moder_cnt = priv->rx_frames; in mlx4_en_auto_moderation()
1424 err = mlx4_en_set_cq_moder(priv, cq); in mlx4_en_auto_moderation()
1426 en_err(priv, "Failed modifying moderation for cq:%d\n", in mlx4_en_auto_moderation()
1429 priv->last_moder_packets[ring] = rx_packets; in mlx4_en_auto_moderation()
1430 priv->last_moder_bytes[ring] = rx_bytes; in mlx4_en_auto_moderation()
1433 priv->last_moder_jiffies = jiffies; in mlx4_en_auto_moderation()
1439 struct mlx4_en_priv *priv = container_of(delay, struct mlx4_en_priv, in mlx4_en_do_get_stats() local
1441 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_do_get_stats()
1446 if (priv->port_up) { in mlx4_en_do_get_stats()
1447 err = mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 0); in mlx4_en_do_get_stats()
1449 en_dbg(HW, priv, "Could not update stats\n"); in mlx4_en_do_get_stats()
1451 mlx4_en_auto_moderation(priv); in mlx4_en_do_get_stats()
1454 queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY); in mlx4_en_do_get_stats()
1456 if (mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port]) { in mlx4_en_do_get_stats()
1457 mlx4_en_do_set_mac(priv, priv->current_mac); in mlx4_en_do_get_stats()
1458 mdev->mac_removed[MLX4_MAX_PORTS + 1 - priv->port] = 0; in mlx4_en_do_get_stats()
1469 struct mlx4_en_priv *priv = container_of(delay, struct mlx4_en_priv, in mlx4_en_service_task() local
1471 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_service_task()
1478 mlx4_en_recover_from_oom(priv); in mlx4_en_service_task()
1479 queue_delayed_work(mdev->workqueue, &priv->service_task, in mlx4_en_service_task()
1487 struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, in mlx4_en_linkstate() local
1489 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_linkstate()
1490 int linkstate = priv->link_state; in mlx4_en_linkstate()
1495 if (priv->last_link_state != linkstate) { in mlx4_en_linkstate()
1497 en_info(priv, "Link Down\n"); in mlx4_en_linkstate()
1498 netif_carrier_off(priv->dev); in mlx4_en_linkstate()
1500 en_info(priv, "Link Up\n"); in mlx4_en_linkstate()
1501 netif_carrier_on(priv->dev); in mlx4_en_linkstate()
1504 priv->last_link_state = linkstate; in mlx4_en_linkstate()
1508 static int mlx4_en_init_affinity_hint(struct mlx4_en_priv *priv, int ring_idx) in mlx4_en_init_affinity_hint() argument
1510 struct mlx4_en_rx_ring *ring = priv->rx_ring[ring_idx]; in mlx4_en_init_affinity_hint()
1511 int numa_node = priv->mdev->dev->numa_node; in mlx4_en_init_affinity_hint()
1521 static void mlx4_en_free_affinity_hint(struct mlx4_en_priv *priv, int ring_idx) in mlx4_en_free_affinity_hint() argument
1523 free_cpumask_var(priv->rx_ring[ring_idx]->affinity_mask); in mlx4_en_free_affinity_hint()
1528 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_start_port() local
1529 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_start_port()
1539 if (priv->port_up) { in mlx4_en_start_port()
1540 en_dbg(DRV, priv, "start port called while port already up\n"); in mlx4_en_start_port()
1544 INIT_LIST_HEAD(&priv->mc_list); in mlx4_en_start_port()
1545 INIT_LIST_HEAD(&priv->curr_list); in mlx4_en_start_port()
1546 INIT_LIST_HEAD(&priv->ethtool_list); in mlx4_en_start_port()
1547 memset(&priv->ethtool_rules[0], 0, in mlx4_en_start_port()
1551 dev->mtu = min(dev->mtu, priv->max_mtu); in mlx4_en_start_port()
1553 en_dbg(DRV, priv, "Rx buf size:%d\n", priv->rx_skb_size); in mlx4_en_start_port()
1556 err = mlx4_en_activate_rx_rings(priv); in mlx4_en_start_port()
1558 en_err(priv, "Failed to activate RX rings\n"); in mlx4_en_start_port()
1561 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_start_port()
1562 cq = priv->rx_cq[i]; in mlx4_en_start_port()
1566 err = mlx4_en_init_affinity_hint(priv, i); in mlx4_en_start_port()
1568 en_err(priv, "Failed preparing IRQ affinity hint\n"); in mlx4_en_start_port()
1572 err = mlx4_en_activate_cq(priv, cq, i); in mlx4_en_start_port()
1574 en_err(priv, "Failed activating Rx CQ\n"); in mlx4_en_start_port()
1575 mlx4_en_free_affinity_hint(priv, i); in mlx4_en_start_port()
1582 cqe = mlx4_en_get_cqe(cq->buf, j, priv->cqe_size) + in mlx4_en_start_port()
1583 priv->cqe_factor; in mlx4_en_start_port()
1587 err = mlx4_en_set_cq_moder(priv, cq); in mlx4_en_start_port()
1589 en_err(priv, "Failed setting cq moderation parameters\n"); in mlx4_en_start_port()
1590 mlx4_en_deactivate_cq(priv, cq); in mlx4_en_start_port()
1591 mlx4_en_free_affinity_hint(priv, i); in mlx4_en_start_port()
1594 mlx4_en_arm_cq(priv, cq); in mlx4_en_start_port()
1595 priv->rx_ring[i]->cqn = cq->mcq.cqn; in mlx4_en_start_port()
1600 en_dbg(DRV, priv, "Getting qp number for port %d\n", priv->port); in mlx4_en_start_port()
1601 err = mlx4_en_get_qp(priv); in mlx4_en_start_port()
1603 en_err(priv, "Failed getting eth qp\n"); in mlx4_en_start_port()
1606 mdev->mac_removed[priv->port] = 0; in mlx4_en_start_port()
1608 priv->counter_index = in mlx4_en_start_port()
1609 mlx4_get_default_counter_index(mdev->dev, priv->port); in mlx4_en_start_port()
1611 err = mlx4_en_config_rss_steer(priv); in mlx4_en_start_port()
1613 en_err(priv, "Failed configuring rss steering\n"); in mlx4_en_start_port()
1617 err = mlx4_en_create_drop_qp(priv); in mlx4_en_start_port()
1622 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_start_port()
1624 cq = priv->tx_cq[i]; in mlx4_en_start_port()
1625 err = mlx4_en_activate_cq(priv, cq, i); in mlx4_en_start_port()
1627 en_err(priv, "Failed allocating Tx CQ\n"); in mlx4_en_start_port()
1630 err = mlx4_en_set_cq_moder(priv, cq); in mlx4_en_start_port()
1632 en_err(priv, "Failed setting cq moderation parameters\n"); in mlx4_en_start_port()
1633 mlx4_en_deactivate_cq(priv, cq); in mlx4_en_start_port()
1636 en_dbg(DRV, priv, "Resetting index of collapsed CQ:%d to -1\n", i); in mlx4_en_start_port()
1640 tx_ring = priv->tx_ring[i]; in mlx4_en_start_port()
1641 err = mlx4_en_activate_tx_ring(priv, tx_ring, cq->mcq.cqn, in mlx4_en_start_port()
1642 i / priv->num_tx_rings_p_up); in mlx4_en_start_port()
1644 en_err(priv, "Failed allocating Tx ring\n"); in mlx4_en_start_port()
1645 mlx4_en_deactivate_cq(priv, cq); in mlx4_en_start_port()
1651 mlx4_en_arm_cq(priv, cq); in mlx4_en_start_port()
1660 err = mlx4_SET_PORT_general(mdev->dev, priv->port, in mlx4_en_start_port()
1661 priv->rx_skb_size + ETH_FCS_LEN, in mlx4_en_start_port()
1662 priv->prof->tx_pause, in mlx4_en_start_port()
1663 priv->prof->tx_ppp, in mlx4_en_start_port()
1664 priv->prof->rx_pause, in mlx4_en_start_port()
1665 priv->prof->rx_ppp); in mlx4_en_start_port()
1667 en_err(priv, "Failed setting port general configurations for port %d, with error %d\n", in mlx4_en_start_port()
1668 priv->port, err); in mlx4_en_start_port()
1672 err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port, priv->base_qpn, 0); in mlx4_en_start_port()
1674 en_err(priv, "Failed setting default qp numbers\n"); in mlx4_en_start_port()
1679 err = mlx4_SET_PORT_VXLAN(mdev->dev, priv->port, VXLAN_STEER_BY_OUTER_MAC, 1); in mlx4_en_start_port()
1681 en_err(priv, "Failed setting port L2 tunnel configuration, err %d\n", in mlx4_en_start_port()
1688 en_dbg(HW, priv, "Initializing port\n"); in mlx4_en_start_port()
1689 err = mlx4_INIT_PORT(mdev->dev, priv->port); in mlx4_en_start_port()
1691 en_err(priv, "Failed Initializing port\n"); in mlx4_en_start_port()
1697 mlx4_en_set_rss_steer_rules(priv)) in mlx4_en_start_port()
1702 mc_list[5] = priv->port; /* needed for B0 steering support */ in mlx4_en_start_port()
1703 if (mlx4_multicast_attach(mdev->dev, &priv->rss_map.indir_qp, mc_list, in mlx4_en_start_port()
1704 priv->port, 0, MLX4_PROT_ETH, in mlx4_en_start_port()
1705 &priv->broadcast_id)) in mlx4_en_start_port()
1709 priv->flags &= ~(MLX4_EN_FLAG_PROMISC | MLX4_EN_FLAG_MC_PROMISC); in mlx4_en_start_port()
1712 queue_work(mdev->workqueue, &priv->rx_mode_task); in mlx4_en_start_port()
1715 if (priv->mdev->dev->caps.tunnel_offload_mode == MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) in mlx4_en_start_port()
1718 priv->port_up = true; in mlx4_en_start_port()
1726 mlx4_en_deactivate_tx_ring(priv, priv->tx_ring[tx_index]); in mlx4_en_start_port()
1727 mlx4_en_deactivate_cq(priv, priv->tx_cq[tx_index]); in mlx4_en_start_port()
1729 mlx4_en_destroy_drop_qp(priv); in mlx4_en_start_port()
1731 mlx4_en_release_rss_steer(priv); in mlx4_en_start_port()
1733 mlx4_en_put_qp(priv); in mlx4_en_start_port()
1736 mlx4_en_deactivate_cq(priv, priv->rx_cq[rx_index]); in mlx4_en_start_port()
1737 mlx4_en_free_affinity_hint(priv, rx_index); in mlx4_en_start_port()
1739 for (i = 0; i < priv->rx_ring_num; i++) in mlx4_en_start_port()
1740 mlx4_en_deactivate_rx_ring(priv, priv->rx_ring[i]); in mlx4_en_start_port()
1748 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_stop_port() local
1749 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_stop_port()
1755 if (!priv->port_up) { in mlx4_en_stop_port()
1756 en_dbg(DRV, priv, "stop port called while port already down\n"); in mlx4_en_stop_port()
1761 mlx4_CLOSE_PORT(mdev->dev, priv->port); in mlx4_en_stop_port()
1773 priv->port_up = false; in mlx4_en_stop_port()
1774 priv->counter_index = MLX4_SINK_COUNTER_INDEX(mdev->dev); in mlx4_en_stop_port()
1779 priv->flags &= ~(MLX4_EN_FLAG_PROMISC | in mlx4_en_stop_port()
1782 priv->port, in mlx4_en_stop_port()
1785 priv->port, in mlx4_en_stop_port()
1787 } else if (priv->flags & MLX4_EN_FLAG_PROMISC) { in mlx4_en_stop_port()
1788 priv->flags &= ~MLX4_EN_FLAG_PROMISC; in mlx4_en_stop_port()
1791 mlx4_unicast_promisc_remove(mdev->dev, priv->base_qpn, in mlx4_en_stop_port()
1792 priv->port); in mlx4_en_stop_port()
1795 if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) { in mlx4_en_stop_port()
1796 mlx4_multicast_promisc_remove(mdev->dev, priv->base_qpn, in mlx4_en_stop_port()
1797 priv->port); in mlx4_en_stop_port()
1798 priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_stop_port()
1804 mc_list[5] = priv->port; /* needed for B0 steering support */ in mlx4_en_stop_port()
1805 mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, mc_list, in mlx4_en_stop_port()
1806 MLX4_PROT_ETH, priv->broadcast_id); in mlx4_en_stop_port()
1807 list_for_each_entry(mclist, &priv->curr_list, list) { in mlx4_en_stop_port()
1809 mc_list[5] = priv->port; in mlx4_en_stop_port()
1810 mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, in mlx4_en_stop_port()
1816 list_for_each_entry_safe(mclist, tmp, &priv->curr_list, list) { in mlx4_en_stop_port()
1822 mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, 1, MLX4_MCAST_CONFIG); in mlx4_en_stop_port()
1829 &priv->ethtool_list, list) { in mlx4_en_stop_port()
1835 mlx4_en_destroy_drop_qp(priv); in mlx4_en_stop_port()
1838 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_stop_port()
1839 mlx4_en_deactivate_tx_ring(priv, priv->tx_ring[i]); in mlx4_en_stop_port()
1840 mlx4_en_deactivate_cq(priv, priv->tx_cq[i]); in mlx4_en_stop_port()
1844 for (i = 0; i < priv->tx_ring_num; i++) in mlx4_en_stop_port()
1845 mlx4_en_free_tx_buf(dev, priv->tx_ring[i]); in mlx4_en_stop_port()
1848 mlx4_en_delete_rss_steer_rules(priv); in mlx4_en_stop_port()
1851 mlx4_en_release_rss_steer(priv); in mlx4_en_stop_port()
1854 mlx4_en_put_qp(priv); in mlx4_en_stop_port()
1856 mdev->mac_removed[priv->port] = 1; in mlx4_en_stop_port()
1859 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_stop_port()
1860 struct mlx4_en_cq *cq = priv->rx_cq[i]; in mlx4_en_stop_port()
1870 mlx4_en_deactivate_rx_ring(priv, priv->rx_ring[i]); in mlx4_en_stop_port()
1871 mlx4_en_deactivate_cq(priv, cq); in mlx4_en_stop_port()
1873 mlx4_en_free_affinity_hint(priv, i); in mlx4_en_stop_port()
1879 struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, in mlx4_en_restart() local
1881 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_restart()
1882 struct net_device *dev = priv->dev; in mlx4_en_restart()
1884 en_dbg(DRV, priv, "Watchdog task called for port %d\n", priv->port); in mlx4_en_restart()
1887 if (priv->port_up) { in mlx4_en_restart()
1890 en_err(priv, "Failed restarting port %d\n", priv->port); in mlx4_en_restart()
1897 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_clear_stats() local
1898 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_clear_stats()
1901 if (mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 1)) in mlx4_en_clear_stats()
1902 en_dbg(HW, priv, "Failed dumping statistics\n"); in mlx4_en_clear_stats()
1904 memset(&priv->stats, 0, sizeof(priv->stats)); in mlx4_en_clear_stats()
1905 memset(&priv->pstats, 0, sizeof(priv->pstats)); in mlx4_en_clear_stats()
1906 memset(&priv->pkstats, 0, sizeof(priv->pkstats)); in mlx4_en_clear_stats()
1907 memset(&priv->port_stats, 0, sizeof(priv->port_stats)); in mlx4_en_clear_stats()
1908 memset(&priv->rx_flowstats, 0, sizeof(priv->rx_flowstats)); in mlx4_en_clear_stats()
1909 memset(&priv->tx_flowstats, 0, sizeof(priv->tx_flowstats)); in mlx4_en_clear_stats()
1910 memset(&priv->rx_priority_flowstats, 0, in mlx4_en_clear_stats()
1911 sizeof(priv->rx_priority_flowstats)); in mlx4_en_clear_stats()
1912 memset(&priv->tx_priority_flowstats, 0, in mlx4_en_clear_stats()
1913 sizeof(priv->tx_priority_flowstats)); in mlx4_en_clear_stats()
1914 memset(&priv->pf_stats, 0, sizeof(priv->pf_stats)); in mlx4_en_clear_stats()
1916 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_clear_stats()
1917 priv->tx_ring[i]->bytes = 0; in mlx4_en_clear_stats()
1918 priv->tx_ring[i]->packets = 0; in mlx4_en_clear_stats()
1919 priv->tx_ring[i]->tx_csum = 0; in mlx4_en_clear_stats()
1921 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_clear_stats()
1922 priv->rx_ring[i]->bytes = 0; in mlx4_en_clear_stats()
1923 priv->rx_ring[i]->packets = 0; in mlx4_en_clear_stats()
1924 priv->rx_ring[i]->csum_ok = 0; in mlx4_en_clear_stats()
1925 priv->rx_ring[i]->csum_none = 0; in mlx4_en_clear_stats()
1926 priv->rx_ring[i]->csum_complete = 0; in mlx4_en_clear_stats()
1932 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_open() local
1933 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_open()
1939 en_err(priv, "Cannot open - device down/disabled\n"); in mlx4_en_open()
1949 en_err(priv, "Failed starting port:%d\n", priv->port); in mlx4_en_open()
1959 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_close() local
1960 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_close()
1962 en_dbg(IFDOWN, priv, "Close port called\n"); in mlx4_en_close()
1973 void mlx4_en_free_resources(struct mlx4_en_priv *priv) in mlx4_en_free_resources() argument
1978 priv->dev->rx_cpu_rmap = NULL; in mlx4_en_free_resources()
1981 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_free_resources()
1982 if (priv->tx_ring && priv->tx_ring[i]) in mlx4_en_free_resources()
1983 mlx4_en_destroy_tx_ring(priv, &priv->tx_ring[i]); in mlx4_en_free_resources()
1984 if (priv->tx_cq && priv->tx_cq[i]) in mlx4_en_free_resources()
1985 mlx4_en_destroy_cq(priv, &priv->tx_cq[i]); in mlx4_en_free_resources()
1988 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_free_resources()
1989 if (priv->rx_ring[i]) in mlx4_en_free_resources()
1990 mlx4_en_destroy_rx_ring(priv, &priv->rx_ring[i], in mlx4_en_free_resources()
1991 priv->prof->rx_ring_size, priv->stride); in mlx4_en_free_resources()
1992 if (priv->rx_cq[i]) in mlx4_en_free_resources()
1993 mlx4_en_destroy_cq(priv, &priv->rx_cq[i]); in mlx4_en_free_resources()
1998 int mlx4_en_alloc_resources(struct mlx4_en_priv *priv) in mlx4_en_alloc_resources() argument
2000 struct mlx4_en_port_profile *prof = priv->prof; in mlx4_en_alloc_resources()
2005 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_alloc_resources()
2007 if (mlx4_en_create_cq(priv, &priv->tx_cq[i], in mlx4_en_alloc_resources()
2011 if (mlx4_en_create_tx_ring(priv, &priv->tx_ring[i], in mlx4_en_alloc_resources()
2018 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_alloc_resources()
2020 if (mlx4_en_create_cq(priv, &priv->rx_cq[i], in mlx4_en_alloc_resources()
2024 if (mlx4_en_create_rx_ring(priv, &priv->rx_ring[i], in mlx4_en_alloc_resources()
2025 prof->rx_ring_size, priv->stride, in mlx4_en_alloc_resources()
2031 priv->dev->rx_cpu_rmap = mlx4_get_cpu_rmap(priv->mdev->dev, priv->port); in mlx4_en_alloc_resources()
2037 en_err(priv, "Failed to allocate NIC resources\n"); in mlx4_en_alloc_resources()
2038 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_alloc_resources()
2039 if (priv->rx_ring[i]) in mlx4_en_alloc_resources()
2040 mlx4_en_destroy_rx_ring(priv, &priv->rx_ring[i], in mlx4_en_alloc_resources()
2042 priv->stride); in mlx4_en_alloc_resources()
2043 if (priv->rx_cq[i]) in mlx4_en_alloc_resources()
2044 mlx4_en_destroy_cq(priv, &priv->rx_cq[i]); in mlx4_en_alloc_resources()
2046 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_alloc_resources()
2047 if (priv->tx_ring[i]) in mlx4_en_alloc_resources()
2048 mlx4_en_destroy_tx_ring(priv, &priv->tx_ring[i]); in mlx4_en_alloc_resources()
2049 if (priv->tx_cq[i]) in mlx4_en_alloc_resources()
2050 mlx4_en_destroy_cq(priv, &priv->tx_cq[i]); in mlx4_en_alloc_resources()
2058 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_destroy_netdev() local
2059 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_destroy_netdev()
2061 en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port); in mlx4_en_destroy_netdev()
2064 if (priv->registered) in mlx4_en_destroy_netdev()
2067 if (priv->allocated) in mlx4_en_destroy_netdev()
2068 mlx4_free_hwq_res(mdev->dev, &priv->res, MLX4_EN_PAGE_SIZE); in mlx4_en_destroy_netdev()
2070 cancel_delayed_work(&priv->stats_task); in mlx4_en_destroy_netdev()
2071 cancel_delayed_work(&priv->service_task); in mlx4_en_destroy_netdev()
2080 mdev->pndev[priv->port] = NULL; in mlx4_en_destroy_netdev()
2081 mdev->upper[priv->port] = NULL; in mlx4_en_destroy_netdev()
2084 mlx4_en_free_resources(priv); in mlx4_en_destroy_netdev()
2086 kfree(priv->tx_ring); in mlx4_en_destroy_netdev()
2087 kfree(priv->tx_cq); in mlx4_en_destroy_netdev()
2094 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_change_mtu() local
2095 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_change_mtu()
2098 en_dbg(DRV, priv, "Change MTU called - current:%d new:%d\n", in mlx4_en_change_mtu()
2101 if ((new_mtu < MLX4_EN_MIN_MTU) || (new_mtu > priv->max_mtu)) { in mlx4_en_change_mtu()
2102 en_err(priv, "Bad MTU size:%d.\n", new_mtu); in mlx4_en_change_mtu()
2112 en_dbg(DRV, priv, "Change MTU called with card down!?\n"); in mlx4_en_change_mtu()
2117 en_err(priv, "Failed restarting port:%d\n", in mlx4_en_change_mtu()
2118 priv->port); in mlx4_en_change_mtu()
2119 queue_work(mdev->workqueue, &priv->watchdog_task); in mlx4_en_change_mtu()
2129 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_hwtstamp_set() local
2130 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_hwtstamp_set()
2188 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_hwtstamp_get() local
2190 return copy_to_user(ifr->ifr_data, &priv->hwtstamp_config, in mlx4_en_hwtstamp_get()
2191 sizeof(priv->hwtstamp_config)) ? -EFAULT : 0; in mlx4_en_hwtstamp_get()
2228 struct mlx4_en_priv *priv = netdev_priv(netdev); in mlx4_en_set_features() local
2233 en_info(priv, "Turn %s RX-FCS\n", in mlx4_en_set_features()
2241 en_info(priv, "Turn %s RX-ALL\n", in mlx4_en_set_features()
2243 ret = mlx4_SET_PORT_fcs_check(priv->mdev->dev, in mlx4_en_set_features()
2244 priv->port, ignore_fcs_value); in mlx4_en_set_features()
2250 en_info(priv, "Turn %s RX vlan strip offload\n", in mlx4_en_set_features()
2256 en_info(priv, "Turn %s TX vlan strip offload\n", in mlx4_en_set_features()
2260 en_info(priv, "Turn %s TX S-VLAN strip offload\n", in mlx4_en_set_features()
2264 en_info(priv, "Turn %s loopback\n", in mlx4_en_set_features()
2270 ret = mlx4_en_reset_config(netdev, priv->hwtstamp_config, in mlx4_en_set_features()
2346 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_get_phys_port_id() local
2347 struct mlx4_dev *mdev = priv->mdev->dev; in mlx4_en_get_phys_port_id()
2349 u64 phys_port_id = mdev->caps.phys_port_id[priv->port]; in mlx4_en_get_phys_port_id()
2366 struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, in mlx4_en_add_vxlan_offloads() local
2369 ret = mlx4_config_vxlan_port(priv->mdev->dev, priv->vxlan_port); in mlx4_en_add_vxlan_offloads()
2373 ret = mlx4_SET_PORT_VXLAN(priv->mdev->dev, priv->port, in mlx4_en_add_vxlan_offloads()
2377 en_err(priv, "failed setting L2 tunnel configuration ret %d\n", ret); in mlx4_en_add_vxlan_offloads()
2382 priv->dev->hw_enc_features |= NETIF_F_IP_CSUM | NETIF_F_RXCSUM | in mlx4_en_add_vxlan_offloads()
2389 struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, in mlx4_en_del_vxlan_offloads() local
2392 priv->dev->hw_enc_features &= ~(NETIF_F_IP_CSUM | NETIF_F_RXCSUM | in mlx4_en_del_vxlan_offloads()
2395 ret = mlx4_SET_PORT_VXLAN(priv->mdev->dev, priv->port, in mlx4_en_del_vxlan_offloads()
2398 en_err(priv, "failed setting L2 tunnel configuration ret %d\n", ret); in mlx4_en_del_vxlan_offloads()
2400 priv->vxlan_port = 0; in mlx4_en_del_vxlan_offloads()
2406 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_add_vxlan_port() local
2409 if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) in mlx4_en_add_vxlan_port()
2415 current_port = priv->vxlan_port; in mlx4_en_add_vxlan_port()
2417 en_warn(priv, "vxlan port %d configured, can't add port %d\n", in mlx4_en_add_vxlan_port()
2422 priv->vxlan_port = port; in mlx4_en_add_vxlan_port()
2423 queue_work(priv->mdev->workqueue, &priv->vxlan_add_task); in mlx4_en_add_vxlan_port()
2429 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_del_vxlan_port() local
2432 if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN) in mlx4_en_del_vxlan_port()
2438 current_port = priv->vxlan_port; in mlx4_en_del_vxlan_port()
2440 en_dbg(DRV, priv, "vxlan port %d isn't configured, ignoring\n", ntohs(port)); in mlx4_en_del_vxlan_port()
2444 queue_work(priv->mdev->workqueue, &priv->vxlan_del_task); in mlx4_en_del_vxlan_port()
2458 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_set_tx_maxrate() local
2459 struct mlx4_en_tx_ring *tx_ring = priv->tx_ring[queue_index]; in mlx4_en_set_tx_maxrate()
2463 if (!(priv->mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_QP_RATE_LIMIT)) in mlx4_en_set_tx_maxrate()
2478 err = mlx4_update_qp(priv->mdev->dev, tx_ring->qpn, MLX4_UPDATE_QP_RATE_LIMIT, in mlx4_en_set_tx_maxrate()
2558 struct mlx4_en_priv *priv; member
2569 struct mlx4_dev *dev = bond->priv->mdev->dev; in mlx4_en_bond_work()
2575 en_err(bond->priv, "Fail to bond device\n"); in mlx4_en_bond_work()
2580 en_err(bond->priv, "Fail to set port map [%d][%d]: %d\n", in mlx4_en_bond_work()
2588 en_err(bond->priv, "Fail to unbond device\n"); in mlx4_en_bond_work()
2590 dev_put(bond->priv->dev); in mlx4_en_bond_work()
2594 static int mlx4_en_queue_bond_work(struct mlx4_en_priv *priv, int is_bonded, in mlx4_en_queue_bond_work() argument
2604 bond->priv = priv; in mlx4_en_queue_bond_work()
2608 dev_hold(priv->dev); in mlx4_en_queue_bond_work()
2609 queue_work(priv->mdev->workqueue, &bond->work); in mlx4_en_queue_bond_work()
2622 struct mlx4_en_priv *priv; in mlx4_en_netdev_event() local
2657 priv = netdev_priv(ndev); in mlx4_en_netdev_event()
2724 mlx4_en_queue_bond_work(priv, do_bond, in mlx4_en_netdev_event()
2815 struct mlx4_en_priv *priv; in mlx4_en_init_netdev() local
2834 priv = netdev_priv(dev); in mlx4_en_init_netdev()
2835 memset(priv, 0, sizeof(struct mlx4_en_priv)); in mlx4_en_init_netdev()
2836 priv->counter_index = MLX4_SINK_COUNTER_INDEX(mdev->dev); in mlx4_en_init_netdev()
2837 spin_lock_init(&priv->stats_lock); in mlx4_en_init_netdev()
2838 INIT_WORK(&priv->rx_mode_task, mlx4_en_do_set_rx_mode); in mlx4_en_init_netdev()
2839 INIT_WORK(&priv->watchdog_task, mlx4_en_restart); in mlx4_en_init_netdev()
2840 INIT_WORK(&priv->linkstate_task, mlx4_en_linkstate); in mlx4_en_init_netdev()
2841 INIT_DELAYED_WORK(&priv->stats_task, mlx4_en_do_get_stats); in mlx4_en_init_netdev()
2842 INIT_DELAYED_WORK(&priv->service_task, mlx4_en_service_task); in mlx4_en_init_netdev()
2844 INIT_WORK(&priv->vxlan_add_task, mlx4_en_add_vxlan_offloads); in mlx4_en_init_netdev()
2845 INIT_WORK(&priv->vxlan_del_task, mlx4_en_del_vxlan_offloads); in mlx4_en_init_netdev()
2848 INIT_LIST_HEAD(&priv->filters); in mlx4_en_init_netdev()
2849 spin_lock_init(&priv->filters_lock); in mlx4_en_init_netdev()
2852 priv->dev = dev; in mlx4_en_init_netdev()
2853 priv->mdev = mdev; in mlx4_en_init_netdev()
2854 priv->ddev = &mdev->pdev->dev; in mlx4_en_init_netdev()
2855 priv->prof = prof; in mlx4_en_init_netdev()
2856 priv->port = port; in mlx4_en_init_netdev()
2857 priv->port_up = false; in mlx4_en_init_netdev()
2858 priv->flags = prof->flags; in mlx4_en_init_netdev()
2859 priv->pflags = MLX4_EN_PRIV_FLAGS_BLUEFLAME; in mlx4_en_init_netdev()
2860 priv->ctrl_flags = cpu_to_be32(MLX4_WQE_CTRL_CQ_UPDATE | in mlx4_en_init_netdev()
2862 priv->num_tx_rings_p_up = mdev->profile.num_tx_rings_p_up; in mlx4_en_init_netdev()
2863 priv->tx_ring_num = prof->tx_ring_num; in mlx4_en_init_netdev()
2864 priv->tx_work_limit = MLX4_EN_DEFAULT_TX_WORK; in mlx4_en_init_netdev()
2865 netdev_rss_key_fill(priv->rss_key, sizeof(priv->rss_key)); in mlx4_en_init_netdev()
2867 priv->tx_ring = kzalloc(sizeof(struct mlx4_en_tx_ring *) * MAX_TX_RINGS, in mlx4_en_init_netdev()
2869 if (!priv->tx_ring) { in mlx4_en_init_netdev()
2873 priv->tx_cq = kzalloc(sizeof(struct mlx4_en_cq *) * MAX_TX_RINGS, in mlx4_en_init_netdev()
2875 if (!priv->tx_cq) { in mlx4_en_init_netdev()
2879 priv->rx_ring_num = prof->rx_ring_num; in mlx4_en_init_netdev()
2880 priv->cqe_factor = (mdev->dev->caps.cqe_size == 64) ? 1 : 0; in mlx4_en_init_netdev()
2881 priv->cqe_size = mdev->dev->caps.cqe_size; in mlx4_en_init_netdev()
2882 priv->mac_index = -1; in mlx4_en_init_netdev()
2883 priv->msg_enable = MLX4_EN_MSG_LEVEL; in mlx4_en_init_netdev()
2885 if (!mlx4_is_slave(priv->mdev->dev)) { in mlx4_en_init_netdev()
2889 en_info(priv, "enabling only PFC DCB ops\n"); in mlx4_en_init_netdev()
2896 INIT_HLIST_HEAD(&priv->mac_hash[i]); in mlx4_en_init_netdev()
2899 priv->max_mtu = mdev->dev->caps.eth_mtu_cap[priv->port]; in mlx4_en_init_netdev()
2901 if (mdev->dev->caps.rx_checksum_flags_port[priv->port] & in mlx4_en_init_netdev()
2903 priv->flags |= MLX4_EN_FLAG_RX_CSUM_NON_TCP_UDP; in mlx4_en_init_netdev()
2907 mlx4_en_u64_to_mac(dev->dev_addr, mdev->dev->caps.def_mac[priv->port]); in mlx4_en_init_netdev()
2909 en_err(priv, "Port: %d, invalid mac burned: %pM, quiting\n", in mlx4_en_init_netdev()
2910 priv->port, dev->dev_addr); in mlx4_en_init_netdev()
2913 } else if (mlx4_is_slave(priv->mdev->dev) && in mlx4_en_init_netdev()
2914 (priv->mdev->dev->port_random_macs & 1 << priv->port)) { in mlx4_en_init_netdev()
2919 en_warn(priv, "Assigned random MAC address %pM\n", dev->dev_addr); in mlx4_en_init_netdev()
2922 memcpy(priv->current_mac, dev->dev_addr, sizeof(priv->current_mac)); in mlx4_en_init_netdev()
2924 priv->stride = roundup_pow_of_two(sizeof(struct mlx4_en_rx_desc) + in mlx4_en_init_netdev()
2926 err = mlx4_en_alloc_resources(priv); in mlx4_en_init_netdev()
2931 priv->hwtstamp_config.flags = 0; in mlx4_en_init_netdev()
2932 priv->hwtstamp_config.tx_type = HWTSTAMP_TX_OFF; in mlx4_en_init_netdev()
2933 priv->hwtstamp_config.rx_filter = HWTSTAMP_FILTER_NONE; in mlx4_en_init_netdev()
2936 err = mlx4_alloc_hwq_res(mdev->dev, &priv->res, in mlx4_en_init_netdev()
2939 en_err(priv, "Failed to allocate page for rx qps\n"); in mlx4_en_init_netdev()
2942 priv->allocated = 1; in mlx4_en_init_netdev()
2947 if (mlx4_is_master(priv->mdev->dev)) in mlx4_en_init_netdev()
2952 netif_set_real_num_tx_queues(dev, priv->tx_ring_num); in mlx4_en_init_netdev()
2953 netif_set_real_num_rx_queues(dev, priv->rx_ring_num); in mlx4_en_init_netdev()
2985 priv->pflags |= MLX4_EN_PRIV_FLAGS_PHV; in mlx4_en_init_netdev()
3010 priv->rss_hash_fn = ETH_RSS_HASH_TOP; in mlx4_en_init_netdev()
3012 priv->rss_hash_fn = ETH_RSS_HASH_XOR; in mlx4_en_init_netdev()
3014 en_warn(priv, in mlx4_en_init_netdev()
3016 priv->rss_hash_fn = ETH_RSS_HASH_TOP; in mlx4_en_init_netdev()
3028 mlx4_en_set_default_moderation(priv); in mlx4_en_init_netdev()
3030 en_warn(priv, "Using %d TX rings\n", prof->tx_ring_num); in mlx4_en_init_netdev()
3031 en_warn(priv, "Using %d RX rings\n", prof->rx_ring_num); in mlx4_en_init_netdev()
3033 mlx4_en_update_loopback_state(priv->dev, priv->dev->features); in mlx4_en_init_netdev()
3037 err = mlx4_SET_PORT_general(mdev->dev, priv->port, in mlx4_en_init_netdev()
3038 priv->rx_skb_size + ETH_FCS_LEN, in mlx4_en_init_netdev()
3042 en_err(priv, "Failed setting port general configurations for port %d, with error %d\n", in mlx4_en_init_netdev()
3043 priv->port, err); in mlx4_en_init_netdev()
3048 err = mlx4_SET_PORT_VXLAN(mdev->dev, priv->port, VXLAN_STEER_BY_OUTER_MAC, 1); in mlx4_en_init_netdev()
3050 en_err(priv, "Failed setting port L2 tunnel configuration, err %d\n", in mlx4_en_init_netdev()
3057 en_warn(priv, "Initializing port\n"); in mlx4_en_init_netdev()
3058 err = mlx4_INIT_PORT(mdev->dev, priv->port); in mlx4_en_init_netdev()
3060 en_err(priv, "Failed Initializing port\n"); in mlx4_en_init_netdev()
3063 queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY); in mlx4_en_init_netdev()
3069 queue_delayed_work(mdev->workqueue, &priv->service_task, in mlx4_en_init_netdev()
3072 mlx4_en_set_stats_bitmap(mdev->dev, &priv->stats_bitmap, in mlx4_en_init_netdev()
3073 mdev->profile.prof[priv->port].rx_ppp, in mlx4_en_init_netdev()
3074 mdev->profile.prof[priv->port].rx_pause, in mlx4_en_init_netdev()
3075 mdev->profile.prof[priv->port].tx_ppp, in mlx4_en_init_netdev()
3076 mdev->profile.prof[priv->port].tx_pause); in mlx4_en_init_netdev()
3080 en_err(priv, "Netdev registration failed for port %d\n", port); in mlx4_en_init_netdev()
3084 priv->registered = 1; in mlx4_en_init_netdev()
3097 struct mlx4_en_priv *priv = netdev_priv(dev); in mlx4_en_reset_config() local
3098 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_reset_config()
3102 if (priv->hwtstamp_config.tx_type == ts_config.tx_type && in mlx4_en_reset_config()
3103 priv->hwtstamp_config.rx_filter == ts_config.rx_filter && in mlx4_en_reset_config()
3110 (priv->hwtstamp_config.rx_filter != HWTSTAMP_FILTER_NONE)) { in mlx4_en_reset_config()
3111 en_warn(priv, "Can't turn ON rx vlan offload while time-stamping rx filter is ON\n"); in mlx4_en_reset_config()
3116 if (priv->port_up) { in mlx4_en_reset_config()
3121 mlx4_en_free_resources(priv); in mlx4_en_reset_config()
3123 en_warn(priv, "Changing device configuration rx filter(%x) rx vlan(%x)\n", in mlx4_en_reset_config()
3126 priv->hwtstamp_config.tx_type = ts_config.tx_type; in mlx4_en_reset_config()
3127 priv->hwtstamp_config.rx_filter = ts_config.rx_filter; in mlx4_en_reset_config()
3157 en_warn(priv, "Turning off RX vlan offload since RX time-stamping is ON\n"); in mlx4_en_reset_config()
3161 err = mlx4_en_alloc_resources(priv); in mlx4_en_reset_config()
3163 en_err(priv, "Failed reallocating port resources\n"); in mlx4_en_reset_config()
3169 en_err(priv, "Failed starting port\n"); in mlx4_en_reset_config()