Lines Matching refs:priv

59 static void mlx4_en_sysctl_stat(struct mlx4_en_priv *priv);
60 static void mlx4_en_sysctl_conf(struct mlx4_en_priv *priv);
68 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_low_latency_recv() local
69 struct mlx4_en_rx_ring *rx_ring = priv->rx_ring[cq->ring]; in mlx4_en_low_latency_recv()
72 if (!priv->port_up) in mlx4_en_low_latency_recv()
105 struct mlx4_en_priv *priv; member
115 static void mlx4_en_filter_rfs_expire(struct mlx4_en_priv *priv);
134 struct mlx4_en_priv *priv = filter->priv; in mlx4_en_filter_work() local
166 .port = priv->port, in mlx4_en_filter_work()
173 en_warn(priv, "RFS: ignoring unsupported ip protocol (%d)\n", in mlx4_en_filter_work()
181 rule.qpn = priv->rss_map.qps[filter->rxq_index].qpn; in mlx4_en_filter_work()
182 memcpy(spec_eth.eth.dst_mac, priv->dev->dev_addr, ETH_ALEN); in mlx4_en_filter_work()
188 rc = mlx4_flow_detach(priv->mdev->dev, filter->reg_id); in mlx4_en_filter_work()
190 en_err(priv, "Error detaching flow. rc = %d\n", rc); in mlx4_en_filter_work()
193 rc = mlx4_flow_attach(priv->mdev->dev, &rule, &filter->reg_id); in mlx4_en_filter_work()
195 en_err(priv, "Error attaching flow. err = %d\n", rc); in mlx4_en_filter_work()
198 mlx4_en_filter_rfs_expire(priv); in mlx4_en_filter_work()
204 filter_hash_bucket(struct mlx4_en_priv *priv, __be32 src_ip, __be32 dst_ip, in filter_hash_bucket() argument
216 return &priv->filter_hash[bucket_idx]; in filter_hash_bucket()
220 mlx4_en_filter_alloc(struct mlx4_en_priv *priv, int rxq_index, __be32 src_ip, in mlx4_en_filter_alloc() argument
230 filter->priv = priv; in mlx4_en_filter_alloc()
242 filter->id = priv->last_filter_id++ % RPS_NO_FILTER; in mlx4_en_filter_alloc()
244 list_add_tail(&filter->next, &priv->filters); in mlx4_en_filter_alloc()
246 filter_hash_bucket(priv, src_ip, dst_ip, src_port, in mlx4_en_filter_alloc()
254 struct mlx4_en_priv *priv = filter->priv; in mlx4_en_filter_free() local
259 rc = mlx4_flow_detach(priv->mdev->dev, filter->reg_id); in mlx4_en_filter_free()
261 en_err(priv, "Error detaching flow. rc = %d\n", rc); in mlx4_en_filter_free()
267 mlx4_en_filter_find(struct mlx4_en_priv *priv, __be32 src_ip, __be32 dst_ip, in mlx4_en_filter_find() argument
274 filter_hash_bucket(priv, src_ip, dst_ip, in mlx4_en_filter_find()
294 struct mlx4_en_priv *priv = mlx4_netdev_priv(net_dev); in mlx4_en_filter_rfs() local
323 spin_lock_bh(&priv->filters_lock); in mlx4_en_filter_rfs()
324 filter = mlx4_en_filter_find(priv, src_ip, dst_ip, ip_proto, in mlx4_en_filter_rfs()
332 filter = mlx4_en_filter_alloc(priv, rxq_index, in mlx4_en_filter_rfs()
341 queue_work(priv->mdev->workqueue, &filter->work); in mlx4_en_filter_rfs()
346 spin_unlock_bh(&priv->filters_lock); in mlx4_en_filter_rfs()
351 void mlx4_en_cleanup_filters(struct mlx4_en_priv *priv) in mlx4_en_cleanup_filters() argument
356 spin_lock_bh(&priv->filters_lock); in mlx4_en_cleanup_filters()
357 list_for_each_entry_safe(filter, tmp, &priv->filters, next) { in mlx4_en_cleanup_filters()
361 spin_unlock_bh(&priv->filters_lock); in mlx4_en_cleanup_filters()
369 static void mlx4_en_filter_rfs_expire(struct mlx4_en_priv *priv) in mlx4_en_filter_rfs_expire() argument
375 spin_lock_bh(&priv->filters_lock); in mlx4_en_filter_rfs_expire()
376 list_for_each_entry_safe(filter, tmp, &priv->filters, next) { in mlx4_en_filter_rfs_expire()
382 rps_may_expire_flow(priv->dev, in mlx4_en_filter_rfs_expire()
393 if (last_filter && (&last_filter->next != priv->filters.next)) in mlx4_en_filter_rfs_expire()
394 list_move(&priv->filters, &last_filter->next); in mlx4_en_filter_rfs_expire()
396 spin_unlock_bh(&priv->filters_lock); in mlx4_en_filter_rfs_expire()
405 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_vlan_rx_add_vid() local
406 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_vlan_rx_add_vid()
410 if (arg != priv) in mlx4_en_vlan_rx_add_vid()
413 en_dbg(HW, priv, "adding VLAN:%d\n", vid); in mlx4_en_vlan_rx_add_vid()
415 set_bit(vid, priv->active_vlans); in mlx4_en_vlan_rx_add_vid()
419 if (mdev->device_up && priv->port_up) { in mlx4_en_vlan_rx_add_vid()
420 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv); in mlx4_en_vlan_rx_add_vid()
422 en_err(priv, "Failed configuring VLAN filter\n"); in mlx4_en_vlan_rx_add_vid()
424 if (mlx4_register_vlan(mdev->dev, priv->port, vid, &idx)) in mlx4_en_vlan_rx_add_vid()
425 en_dbg(HW, priv, "failed adding vlan %d\n", vid); in mlx4_en_vlan_rx_add_vid()
432 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_vlan_rx_kill_vid() local
433 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_vlan_rx_kill_vid()
436 if (arg != priv) in mlx4_en_vlan_rx_kill_vid()
439 en_dbg(HW, priv, "Killing VID:%d\n", vid); in mlx4_en_vlan_rx_kill_vid()
441 clear_bit(vid, priv->active_vlans); in mlx4_en_vlan_rx_kill_vid()
445 mlx4_unregister_vlan(mdev->dev, priv->port, vid); in mlx4_en_vlan_rx_kill_vid()
447 if (mdev->device_up && priv->port_up) { in mlx4_en_vlan_rx_kill_vid()
448 err = mlx4_SET_VLAN_FLTR(mdev->dev, priv); in mlx4_en_vlan_rx_kill_vid()
450 en_err(priv, "Failed configuring VLAN filter\n"); in mlx4_en_vlan_rx_kill_vid()
456 static int mlx4_en_tunnel_steer_add(struct mlx4_en_priv *priv, unsigned char *addr, in mlx4_en_tunnel_steer_add() argument
461 if (priv->mdev->dev->caps.tunnel_offload_mode != MLX4_TUNNEL_OFFLOAD_MODE_VXLAN || in mlx4_en_tunnel_steer_add()
462 priv->mdev->dev->caps.dmfs_high_steer_mode == MLX4_STEERING_DMFS_A0_STATIC) in mlx4_en_tunnel_steer_add()
465 err = mlx4_tunnel_steer_add(priv->mdev->dev, addr, priv->port, qpn, in mlx4_en_tunnel_steer_add()
468 en_err(priv, "failed to add vxlan steering rule, err %d\n", err); in mlx4_en_tunnel_steer_add()
471 en_dbg(DRV, priv, "added vxlan steering rule, mac %pM reg_id %llx\n", addr, (long long)*reg_id); in mlx4_en_tunnel_steer_add()
475 static int mlx4_en_uc_steer_add(struct mlx4_en_priv *priv, in mlx4_en_uc_steer_add() argument
478 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_uc_steer_add()
489 gid[5] = priv->port; in mlx4_en_uc_steer_add()
506 rule.port = priv->port; in mlx4_en_uc_steer_add()
522 en_warn(priv, "Failed Attaching Unicast\n"); in mlx4_en_uc_steer_add()
527 static void mlx4_en_uc_steer_release(struct mlx4_en_priv *priv, in mlx4_en_uc_steer_release() argument
530 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_uc_steer_release()
540 gid[5] = priv->port; in mlx4_en_uc_steer_release()
550 en_err(priv, "Invalid steering mode.\n"); in mlx4_en_uc_steer_release()
554 static int mlx4_en_get_qp(struct mlx4_en_priv *priv) in mlx4_en_get_qp() argument
556 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_get_qp()
560 int *qpn = &priv->base_qpn; in mlx4_en_get_qp()
561 u64 mac = mlx4_mac_to_u64(if_getlladdr(priv->dev)); in mlx4_en_get_qp()
563 en_dbg(DRV, priv, "Registering MAC: %pM for adding\n", in mlx4_en_get_qp()
564 if_getlladdr(priv->dev)); in mlx4_en_get_qp()
565 index = mlx4_register_mac(dev, priv->port, mac); in mlx4_en_get_qp()
568 en_err(priv, "Failed adding MAC: %pM\n", in mlx4_en_get_qp()
569 if_getlladdr(priv->dev)); in mlx4_en_get_qp()
574 int base_qpn = mlx4_get_base_qpn(dev, priv->port); in mlx4_en_get_qp()
580 en_dbg(DRV, priv, "Reserved qp %d\n", *qpn); in mlx4_en_get_qp()
582 en_err(priv, "Failed to reserve qp for mac registration\n"); in mlx4_en_get_qp()
583 mlx4_unregister_mac(dev, priv->port, mac); in mlx4_en_get_qp()
590 static void mlx4_en_put_qp(struct mlx4_en_priv *priv) in mlx4_en_put_qp() argument
592 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_put_qp()
594 int qpn = priv->base_qpn; in mlx4_en_put_qp()
597 u64 mac = mlx4_mac_to_u64(if_getlladdr(priv->dev)); in mlx4_en_put_qp()
598 en_dbg(DRV, priv, "Registering MAC: %pM for deleting\n", in mlx4_en_put_qp()
599 if_getlladdr(priv->dev)); in mlx4_en_put_qp()
600 mlx4_unregister_mac(dev, priv->port, mac); in mlx4_en_put_qp()
602 en_dbg(DRV, priv, "Releasing qp: port %d, qpn %d\n", in mlx4_en_put_qp()
603 priv->port, qpn); in mlx4_en_put_qp()
605 priv->flags &= ~MLX4_EN_FLAG_FORCE_PROMISC; in mlx4_en_put_qp()
611 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_clear_uclist() local
614 list_for_each_entry_safe(uc_to_del, tmp, &priv->uc_list, list) { in mlx4_en_clear_uclist()
622 struct mlx4_en_priv *priv = arg; in mlx4_copy_addr() local
629 en_err(priv, "Failed to allocate address list\n"); in mlx4_copy_addr()
633 list_add_tail(&tmp->list, &priv->uc_list); in mlx4_copy_addr()
640 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_cache_uclist() local
643 if_foreach_lladdr(dev, mlx4_copy_addr, priv); in mlx4_en_cache_uclist()
648 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_clear_mclist() local
651 list_for_each_entry_safe(mc_to_del, tmp, &priv->mc_list, list) { in mlx4_en_clear_mclist()
659 struct mlx4_en_priv *priv = arg; in mlx4_copy_maddr() local
666 en_err(priv, "Failed to allocate address list\n"); in mlx4_copy_maddr()
670 list_add_tail(&tmp->list, &priv->mc_list); in mlx4_copy_maddr()
676 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_cache_mclist() local
679 if_foreach_llmaddr(dev, mlx4_copy_maddr, priv); in mlx4_en_cache_mclist()
682 static void update_addr_list_flags(struct mlx4_en_priv *priv, in update_addr_list_flags() argument
720 en_err(priv, "Failed to allocate current multicast list\n"); in update_addr_list_flags()
733 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_set_rx_mode() local
735 if (!priv->port_up) in mlx4_en_set_rx_mode()
738 queue_work(priv->mdev->workqueue, &priv->rx_mode_task); in mlx4_en_set_rx_mode()
741 static void mlx4_en_set_promisc_mode(struct mlx4_en_priv *priv, in mlx4_en_set_promisc_mode() argument
746 if (!(priv->flags & MLX4_EN_FLAG_PROMISC)) { in mlx4_en_set_promisc_mode()
747 priv->flags |= MLX4_EN_FLAG_PROMISC; in mlx4_en_set_promisc_mode()
753 priv->port, in mlx4_en_set_promisc_mode()
754 priv->base_qpn, in mlx4_en_set_promisc_mode()
757 en_err(priv, "Failed enabling promiscuous mode\n"); in mlx4_en_set_promisc_mode()
758 priv->flags |= MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_set_promisc_mode()
763 priv->base_qpn, in mlx4_en_set_promisc_mode()
764 priv->port); in mlx4_en_set_promisc_mode()
766 en_err(priv, "Failed enabling unicast promiscuous mode\n"); in mlx4_en_set_promisc_mode()
771 if (!(priv->flags & MLX4_EN_FLAG_MC_PROMISC)) { in mlx4_en_set_promisc_mode()
773 priv->base_qpn, in mlx4_en_set_promisc_mode()
774 priv->port); in mlx4_en_set_promisc_mode()
776 en_err(priv, "Failed enabling multicast promiscuous mode\n"); in mlx4_en_set_promisc_mode()
777 priv->flags |= MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_set_promisc_mode()
783 priv->port, in mlx4_en_set_promisc_mode()
784 priv->base_qpn, in mlx4_en_set_promisc_mode()
787 en_err(priv, "Failed enabling promiscuous mode\n"); in mlx4_en_set_promisc_mode()
792 err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, in mlx4_en_set_promisc_mode()
795 en_err(priv, "Failed disabling multicast filter\n"); in mlx4_en_set_promisc_mode()
799 static void mlx4_en_clear_promisc_mode(struct mlx4_en_priv *priv, in mlx4_en_clear_promisc_mode() argument
804 priv->flags &= ~MLX4_EN_FLAG_PROMISC; in mlx4_en_clear_promisc_mode()
810 priv->port, in mlx4_en_clear_promisc_mode()
813 en_err(priv, "Failed disabling promiscuous mode\n"); in mlx4_en_clear_promisc_mode()
814 priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_clear_promisc_mode()
819 priv->base_qpn, in mlx4_en_clear_promisc_mode()
820 priv->port); in mlx4_en_clear_promisc_mode()
822 en_err(priv, "Failed disabling unicast promiscuous mode\n"); in mlx4_en_clear_promisc_mode()
824 if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) { in mlx4_en_clear_promisc_mode()
826 priv->base_qpn, in mlx4_en_clear_promisc_mode()
827 priv->port); in mlx4_en_clear_promisc_mode()
829 en_err(priv, "Failed disabling multicast promiscuous mode\n"); in mlx4_en_clear_promisc_mode()
830 priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_clear_promisc_mode()
836 priv->port, in mlx4_en_clear_promisc_mode()
837 priv->base_qpn, 0); in mlx4_en_clear_promisc_mode()
839 en_err(priv, "Failed disabling promiscuous mode\n"); in mlx4_en_clear_promisc_mode()
844 static void mlx4_en_do_multicast(struct mlx4_en_priv *priv, in mlx4_en_do_multicast() argument
858 err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, in mlx4_en_do_multicast()
861 en_err(priv, "Failed disabling multicast filter\n"); in mlx4_en_do_multicast()
864 if (!(priv->flags & MLX4_EN_FLAG_MC_PROMISC)) { in mlx4_en_do_multicast()
868 priv->port, in mlx4_en_do_multicast()
869 priv->base_qpn, in mlx4_en_do_multicast()
875 priv->base_qpn, in mlx4_en_do_multicast()
876 priv->port); in mlx4_en_do_multicast()
883 en_err(priv, "Failed entering multicast promisc mode\n"); in mlx4_en_do_multicast()
884 priv->flags |= MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_do_multicast()
888 if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) { in mlx4_en_do_multicast()
892 priv->port, in mlx4_en_do_multicast()
898 priv->base_qpn, in mlx4_en_do_multicast()
899 priv->port); in mlx4_en_do_multicast()
906 en_err(priv, "Failed disabling multicast promiscuous mode\n"); in mlx4_en_do_multicast()
907 priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_do_multicast()
910 err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, in mlx4_en_do_multicast()
913 en_err(priv, "Failed disabling multicast filter\n"); in mlx4_en_do_multicast()
916 mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, ETH_BCAST, in mlx4_en_do_multicast()
922 list_for_each_entry(addr_list, &priv->mc_list, list) { in mlx4_en_do_multicast()
924 mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, in mlx4_en_do_multicast()
927 err = mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, in mlx4_en_do_multicast()
930 en_err(priv, "Failed enabling multicast filter\n"); in mlx4_en_do_multicast()
932 update_addr_list_flags(priv, &priv->curr_mc_list, &priv->mc_list); in mlx4_en_do_multicast()
934 list_for_each_entry_safe(addr_list, tmp, &priv->curr_mc_list, list) { in mlx4_en_do_multicast()
938 mc_list[5] = priv->port; in mlx4_en_do_multicast()
940 &priv->rss_map.indir_qp, in mlx4_en_do_multicast()
945 en_err(priv, "Fail to detach multicast address\n"); in mlx4_en_do_multicast()
948 err = mlx4_flow_detach(priv->mdev->dev, addr_list->tunnel_reg_id); in mlx4_en_do_multicast()
950 en_err(priv, "Failed to detach multicast address\n"); in mlx4_en_do_multicast()
960 mc_list[5] = priv->port; in mlx4_en_do_multicast()
962 &priv->rss_map.indir_qp, in mlx4_en_do_multicast()
964 priv->port, 0, in mlx4_en_do_multicast()
968 en_err(priv, "Fail to attach multicast address\n"); in mlx4_en_do_multicast()
970 err = mlx4_en_tunnel_steer_add(priv, &mc_list[10], priv->base_qpn, in mlx4_en_do_multicast()
973 en_err(priv, "Failed to attach multicast address\n"); in mlx4_en_do_multicast()
979 static void mlx4_en_do_unicast(struct mlx4_en_priv *priv, in mlx4_en_do_unicast() argument
989 update_addr_list_flags(priv, &priv->curr_uc_list, &priv->uc_list); in mlx4_en_do_unicast()
991 list_for_each_entry_safe(addr_list, tmp, &priv->curr_uc_list, list) { in mlx4_en_do_unicast()
993 mlx4_en_uc_steer_release(priv, addr_list->addr, in mlx4_en_do_unicast()
994 priv->rss_map.indir_qp.qpn, in mlx4_en_do_unicast()
1000 err = mlx4_en_uc_steer_add(priv, addr_list->addr, in mlx4_en_do_unicast()
1001 &priv->rss_map.indir_qp.qpn, in mlx4_en_do_unicast()
1004 en_err(priv, "Fail to add unicast address\n"); in mlx4_en_do_unicast()
1011 struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, in mlx4_en_do_set_rx_mode() local
1013 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_do_set_rx_mode()
1014 if_t dev = priv->dev; in mlx4_en_do_set_rx_mode()
1018 en_dbg(HW, priv, "Card is not up, ignoring rx mode change.\n"); in mlx4_en_do_set_rx_mode()
1021 if (!priv->port_up) { in mlx4_en_do_set_rx_mode()
1022 en_dbg(HW, priv, "Port is down, ignoring rx mode change.\n"); in mlx4_en_do_set_rx_mode()
1025 if (!mlx4_en_QUERY_PORT(mdev, priv->port)) { in mlx4_en_do_set_rx_mode()
1026 if (priv->port_state.link_state) { in mlx4_en_do_set_rx_mode()
1027 priv->last_link_state = MLX4_DEV_EVENT_PORT_UP; in mlx4_en_do_set_rx_mode()
1029 if_setbaudrate(priv->dev, in mlx4_en_do_set_rx_mode()
1030 IF_Mbps(priv->port_state.link_speed)); in mlx4_en_do_set_rx_mode()
1034 if_link_state_change(priv->dev, LINK_STATE_UP); in mlx4_en_do_set_rx_mode()
1035 en_dbg(HW, priv, "Link Up\n"); in mlx4_en_do_set_rx_mode()
1040 mlx4_en_do_unicast(priv, dev, mdev); in mlx4_en_do_set_rx_mode()
1044 (priv->flags & MLX4_EN_FLAG_FORCE_PROMISC)) { in mlx4_en_do_set_rx_mode()
1045 mlx4_en_set_promisc_mode(priv, mdev); in mlx4_en_do_set_rx_mode()
1046 } else if (priv->flags & MLX4_EN_FLAG_PROMISC) { in mlx4_en_do_set_rx_mode()
1048 mlx4_en_clear_promisc_mode(priv, mdev); in mlx4_en_do_set_rx_mode()
1052 mlx4_en_do_multicast(priv, dev, mdev); in mlx4_en_do_set_rx_mode()
1059 struct mlx4_en_priv *priv = arg; in mlx4_en_watchdog_timeout() local
1060 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_watchdog_timeout()
1062 en_dbg(DRV, priv, "Scheduling watchdog\n"); in mlx4_en_watchdog_timeout()
1063 queue_work(mdev->workqueue, &priv->watchdog_task); in mlx4_en_watchdog_timeout()
1064 if (priv->port_up) in mlx4_en_watchdog_timeout()
1065 callout_reset(&priv->watchdog_timer, MLX4_EN_WATCHDOG_TIMEOUT, in mlx4_en_watchdog_timeout()
1066 mlx4_en_watchdog_timeout, priv); in mlx4_en_watchdog_timeout()
1071 static void mlx4_en_set_default_moderation(struct mlx4_en_priv *priv) in mlx4_en_set_default_moderation() argument
1082 priv->rx_frames = MLX4_EN_RX_COAL_TARGET; in mlx4_en_set_default_moderation()
1083 priv->rx_usecs = MLX4_EN_RX_COAL_TIME; in mlx4_en_set_default_moderation()
1084 priv->tx_frames = MLX4_EN_TX_COAL_PKTS; in mlx4_en_set_default_moderation()
1085 priv->tx_usecs = MLX4_EN_TX_COAL_TIME; in mlx4_en_set_default_moderation()
1086 en_dbg(INTR, priv, "Default coalesing params for mtu: %u - " in mlx4_en_set_default_moderation()
1088 (unsigned)if_getmtu(priv->dev), priv->rx_frames, priv->rx_usecs); in mlx4_en_set_default_moderation()
1091 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_set_default_moderation()
1092 cq = priv->rx_cq[i]; in mlx4_en_set_default_moderation()
1093 cq->moder_cnt = priv->rx_frames; in mlx4_en_set_default_moderation()
1094 cq->moder_time = priv->rx_usecs; in mlx4_en_set_default_moderation()
1095 priv->last_moder_time[i] = MLX4_EN_AUTO_CONF; in mlx4_en_set_default_moderation()
1096 priv->last_moder_packets[i] = 0; in mlx4_en_set_default_moderation()
1097 priv->last_moder_bytes[i] = 0; in mlx4_en_set_default_moderation()
1100 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_set_default_moderation()
1101 cq = priv->tx_cq[i]; in mlx4_en_set_default_moderation()
1102 cq->moder_cnt = priv->tx_frames; in mlx4_en_set_default_moderation()
1103 cq->moder_time = priv->tx_usecs; in mlx4_en_set_default_moderation()
1107 priv->pkt_rate_low = MLX4_EN_RX_RATE_LOW; in mlx4_en_set_default_moderation()
1108 priv->rx_usecs_low = MLX4_EN_RX_COAL_TIME_LOW; in mlx4_en_set_default_moderation()
1109 priv->pkt_rate_high = MLX4_EN_RX_RATE_HIGH; in mlx4_en_set_default_moderation()
1110 priv->rx_usecs_high = MLX4_EN_RX_COAL_TIME_HIGH; in mlx4_en_set_default_moderation()
1111 priv->sample_interval = MLX4_EN_SAMPLE_INTERVAL; in mlx4_en_set_default_moderation()
1112 priv->adaptive_rx_coal = 1; in mlx4_en_set_default_moderation()
1113 priv->last_moder_jiffies = 0; in mlx4_en_set_default_moderation()
1114 priv->last_moder_tx_packets = 0; in mlx4_en_set_default_moderation()
1117 static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv) in mlx4_en_auto_moderation() argument
1119 unsigned long period = (unsigned long) (jiffies - priv->last_moder_jiffies); in mlx4_en_auto_moderation()
1130 if (!priv->adaptive_rx_coal || period < priv->sample_interval * HZ) in mlx4_en_auto_moderation()
1133 for (ring = 0; ring < priv->rx_ring_num; ring++) { in mlx4_en_auto_moderation()
1134 spin_lock(&priv->stats_lock); in mlx4_en_auto_moderation()
1135 rx_packets = priv->rx_ring[ring]->packets; in mlx4_en_auto_moderation()
1136 rx_bytes = priv->rx_ring[ring]->bytes; in mlx4_en_auto_moderation()
1137 spin_unlock(&priv->stats_lock); in mlx4_en_auto_moderation()
1140 priv->last_moder_packets[ring])); in mlx4_en_auto_moderation()
1144 priv->last_moder_bytes[ring])) / packets : 0; in mlx4_en_auto_moderation()
1148 if (rate > (MLX4_EN_RX_RATE_THRESH / priv->rx_ring_num) && in mlx4_en_auto_moderation()
1150 if (rate < priv->pkt_rate_low) in mlx4_en_auto_moderation()
1151 moder_time = priv->rx_usecs_low; in mlx4_en_auto_moderation()
1152 else if (rate > priv->pkt_rate_high) in mlx4_en_auto_moderation()
1153 moder_time = priv->rx_usecs_high; in mlx4_en_auto_moderation()
1155 moder_time = (rate - priv->pkt_rate_low) * in mlx4_en_auto_moderation()
1156 (priv->rx_usecs_high - priv->rx_usecs_low) / in mlx4_en_auto_moderation()
1157 (priv->pkt_rate_high - priv->pkt_rate_low) + in mlx4_en_auto_moderation()
1158 priv->rx_usecs_low; in mlx4_en_auto_moderation()
1160 moder_time = priv->rx_usecs_low; in mlx4_en_auto_moderation()
1163 if (moder_time != priv->last_moder_time[ring]) { in mlx4_en_auto_moderation()
1164 priv->last_moder_time[ring] = moder_time; in mlx4_en_auto_moderation()
1165 cq = priv->rx_cq[ring]; in mlx4_en_auto_moderation()
1167 cq->moder_cnt = priv->rx_frames; in mlx4_en_auto_moderation()
1168 err = mlx4_en_set_cq_moder(priv, cq); in mlx4_en_auto_moderation()
1170 en_err(priv, "Failed modifying moderation for cq:%d\n", in mlx4_en_auto_moderation()
1173 priv->last_moder_packets[ring] = rx_packets; in mlx4_en_auto_moderation()
1174 priv->last_moder_bytes[ring] = rx_bytes; in mlx4_en_auto_moderation()
1177 priv->last_moder_jiffies = jiffies; in mlx4_en_auto_moderation()
1183 struct mlx4_en_priv *priv = container_of(delay, struct mlx4_en_priv, in mlx4_en_do_get_stats() local
1185 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_do_get_stats()
1190 if (priv->port_up) { in mlx4_en_do_get_stats()
1192 err = mlx4_en_get_vport_stats(mdev, priv->port); in mlx4_en_do_get_stats()
1194 err = mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 0); in mlx4_en_do_get_stats()
1196 en_dbg(HW, priv, "Could not update stats\n"); in mlx4_en_do_get_stats()
1198 mlx4_en_auto_moderation(priv); in mlx4_en_do_get_stats()
1201 queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY); in mlx4_en_do_get_stats()
1212 struct mlx4_en_priv *priv = container_of(delay, struct mlx4_en_priv, in mlx4_en_service_task() local
1214 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_service_task()
1218 queue_delayed_work(mdev->workqueue, &priv->service_task, in mlx4_en_service_task()
1226 struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, in mlx4_en_linkstate() local
1228 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_linkstate()
1229 int linkstate = priv->link_state; in mlx4_en_linkstate()
1234 if (priv->last_link_state != linkstate) { in mlx4_en_linkstate()
1236 en_info(priv, "Link Down\n"); in mlx4_en_linkstate()
1237 if_link_state_change(priv->dev, LINK_STATE_DOWN); in mlx4_en_linkstate()
1239 if_setbaudrate(priv->dev, 0); in mlx4_en_linkstate()
1247 } else if (priv->port_up && (linkstate == MLX4_DEV_EVENT_PORT_UP)){ in mlx4_en_linkstate()
1248 if (mlx4_en_QUERY_PORT(priv->mdev, priv->port)) in mlx4_en_linkstate()
1249 en_info(priv, "Query port failed\n"); in mlx4_en_linkstate()
1250 if_setbaudrate(priv->dev, in mlx4_en_linkstate()
1251 IF_Mbps(priv->port_state.link_speed)); in mlx4_en_linkstate()
1252 en_info(priv, "Link Up\n"); in mlx4_en_linkstate()
1253 if_link_state_change(priv->dev, LINK_STATE_UP); in mlx4_en_linkstate()
1256 priv->last_link_state = linkstate; in mlx4_en_linkstate()
1263 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_start_port() local
1264 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_start_port()
1275 if (priv->port_up) { in mlx4_en_start_port()
1276 en_dbg(DRV, priv, "start port called while port already up\n"); in mlx4_en_start_port()
1280 INIT_LIST_HEAD(&priv->mc_list); in mlx4_en_start_port()
1281 INIT_LIST_HEAD(&priv->uc_list); in mlx4_en_start_port()
1282 INIT_LIST_HEAD(&priv->curr_mc_list); in mlx4_en_start_port()
1283 INIT_LIST_HEAD(&priv->curr_uc_list); in mlx4_en_start_port()
1284 INIT_LIST_HEAD(&priv->ethtool_list); in mlx4_en_start_port()
1287 if_setmtu(dev, min(if_getmtu(dev), priv->max_mtu)); in mlx4_en_start_port()
1289 en_dbg(DRV, priv, "Rx buf size:%d\n", priv->rx_mb_size); in mlx4_en_start_port()
1292 err = mlx4_en_activate_rx_rings(priv); in mlx4_en_start_port()
1294 en_err(priv, "Failed to activate RX rings\n"); in mlx4_en_start_port()
1297 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_start_port()
1298 cq = priv->rx_cq[i]; in mlx4_en_start_port()
1301 err = mlx4_en_activate_cq(priv, cq, i); in mlx4_en_start_port()
1303 en_err(priv, "Failed activating Rx CQ\n"); in mlx4_en_start_port()
1308 err = mlx4_en_set_cq_moder(priv, cq); in mlx4_en_start_port()
1310 en_err(priv, "Failed setting cq moderation parameters"); in mlx4_en_start_port()
1311 mlx4_en_deactivate_cq(priv, cq); in mlx4_en_start_port()
1314 mlx4_en_arm_cq(priv, cq); in mlx4_en_start_port()
1315 priv->rx_ring[i]->cqn = cq->mcq.cqn; in mlx4_en_start_port()
1320 en_dbg(DRV, priv, "Getting qp number for port %d\n", priv->port); in mlx4_en_start_port()
1321 err = mlx4_en_get_qp(priv); in mlx4_en_start_port()
1323 en_err(priv, "Failed getting eth qp\n"); in mlx4_en_start_port()
1326 mdev->mac_removed[priv->port] = 0; in mlx4_en_start_port()
1328 priv->counter_index = in mlx4_en_start_port()
1329 mlx4_get_default_counter_index(mdev->dev, priv->port); in mlx4_en_start_port()
1331 err = mlx4_en_config_rss_steer(priv); in mlx4_en_start_port()
1333 en_err(priv, "Failed configuring rss steering\n"); in mlx4_en_start_port()
1337 err = mlx4_en_create_drop_qp(priv); in mlx4_en_start_port()
1342 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_start_port()
1344 cq = priv->tx_cq[i]; in mlx4_en_start_port()
1345 err = mlx4_en_activate_cq(priv, cq, i); in mlx4_en_start_port()
1347 en_err(priv, "Failed activating Tx CQ\n"); in mlx4_en_start_port()
1350 err = mlx4_en_set_cq_moder(priv, cq); in mlx4_en_start_port()
1352 en_err(priv, "Failed setting cq moderation parameters"); in mlx4_en_start_port()
1353 mlx4_en_deactivate_cq(priv, cq); in mlx4_en_start_port()
1356 en_dbg(DRV, priv, "Resetting index of collapsed CQ:%d to -1\n", i); in mlx4_en_start_port()
1360 tx_ring = priv->tx_ring[i]; in mlx4_en_start_port()
1362 err = mlx4_en_activate_tx_ring(priv, tx_ring, cq->mcq.cqn, in mlx4_en_start_port()
1363 i / priv->num_tx_rings_p_up); in mlx4_en_start_port()
1365 en_err(priv, "Failed activating Tx ring %d\n", i); in mlx4_en_start_port()
1366 mlx4_en_deactivate_cq(priv, cq); in mlx4_en_start_port()
1371 mlx4_en_arm_cq(priv, cq); in mlx4_en_start_port()
1380 err = mlx4_SET_PORT_general(mdev->dev, priv->port, in mlx4_en_start_port()
1381 priv->rx_mb_size, in mlx4_en_start_port()
1382 priv->prof->tx_pause, in mlx4_en_start_port()
1383 priv->prof->tx_ppp, in mlx4_en_start_port()
1384 priv->prof->rx_pause, in mlx4_en_start_port()
1385 priv->prof->rx_ppp); in mlx4_en_start_port()
1387 en_err(priv, "Failed setting port general configurations for port %d, with error %d\n", in mlx4_en_start_port()
1388 priv->port, err); in mlx4_en_start_port()
1392 err = mlx4_SET_PORT_qpn_calc(mdev->dev, priv->port, priv->base_qpn, 0); in mlx4_en_start_port()
1394 en_err(priv, "Failed setting default qp numbers\n"); in mlx4_en_start_port()
1399 en_dbg(HW, priv, "Initializing port\n"); in mlx4_en_start_port()
1400 err = mlx4_INIT_PORT(mdev->dev, priv->port); in mlx4_en_start_port()
1402 en_err(priv, "Failed Initializing port\n"); in mlx4_en_start_port()
1408 mc_list[5] = priv->port; /* needed for B0 steering support */ in mlx4_en_start_port()
1409 if (mlx4_multicast_attach(mdev->dev, &priv->rss_map.indir_qp, mc_list, in mlx4_en_start_port()
1410 priv->port, 0, MLX4_PROT_ETH, in mlx4_en_start_port()
1411 &priv->broadcast_id)) in mlx4_en_start_port()
1415 priv->flags &= ~(MLX4_EN_FLAG_PROMISC | MLX4_EN_FLAG_MC_PROMISC); in mlx4_en_start_port()
1418 queue_work(mdev->workqueue, &priv->rx_mode_task); in mlx4_en_start_port()
1420 priv->port_up = true; in mlx4_en_start_port()
1425 mlx4_en_create_debug_files(priv); in mlx4_en_start_port()
1427 callout_reset(&priv->watchdog_timer, MLX4_EN_WATCHDOG_TIMEOUT, in mlx4_en_start_port()
1428 mlx4_en_watchdog_timeout, priv); in mlx4_en_start_port()
1435 mlx4_en_deactivate_tx_ring(priv, priv->tx_ring[tx_index]); in mlx4_en_start_port()
1436 mlx4_en_deactivate_cq(priv, priv->tx_cq[tx_index]); in mlx4_en_start_port()
1438 mlx4_en_destroy_drop_qp(priv); in mlx4_en_start_port()
1440 mlx4_en_release_rss_steer(priv); in mlx4_en_start_port()
1442 mlx4_en_put_qp(priv); in mlx4_en_start_port()
1445 mlx4_en_deactivate_cq(priv, priv->rx_cq[rx_index]); in mlx4_en_start_port()
1446 for (i = 0; i < priv->rx_ring_num; i++) in mlx4_en_start_port()
1447 mlx4_en_deactivate_rx_ring(priv, priv->rx_ring[i]); in mlx4_en_start_port()
1455 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_stop_port() local
1456 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_stop_port()
1461 if (!priv->port_up) { in mlx4_en_stop_port()
1462 en_dbg(DRV, priv, "stop port called while port already down\n"); in mlx4_en_stop_port()
1467 mlx4_en_delete_debug_files(priv); in mlx4_en_stop_port()
1471 mlx4_CLOSE_PORT(mdev->dev, priv->port); in mlx4_en_stop_port()
1474 priv->port_up = false; in mlx4_en_stop_port()
1475 priv->counter_index = MLX4_SINK_COUNTER_INDEX(mdev->dev); in mlx4_en_stop_port()
1480 priv->flags &= ~(MLX4_EN_FLAG_PROMISC | in mlx4_en_stop_port()
1483 priv->port, in mlx4_en_stop_port()
1486 priv->port, in mlx4_en_stop_port()
1488 } else if (priv->flags & MLX4_EN_FLAG_PROMISC) { in mlx4_en_stop_port()
1489 priv->flags &= ~MLX4_EN_FLAG_PROMISC; in mlx4_en_stop_port()
1492 mlx4_unicast_promisc_remove(mdev->dev, priv->base_qpn, in mlx4_en_stop_port()
1493 priv->port); in mlx4_en_stop_port()
1496 if (priv->flags & MLX4_EN_FLAG_MC_PROMISC) { in mlx4_en_stop_port()
1497 mlx4_multicast_promisc_remove(mdev->dev, priv->base_qpn, in mlx4_en_stop_port()
1498 priv->port); in mlx4_en_stop_port()
1499 priv->flags &= ~MLX4_EN_FLAG_MC_PROMISC; in mlx4_en_stop_port()
1504 list_for_each_entry(addr_list, &priv->curr_uc_list, list) { in mlx4_en_stop_port()
1505 mlx4_en_uc_steer_release(priv, addr_list->addr, in mlx4_en_stop_port()
1506 priv->rss_map.indir_qp.qpn, in mlx4_en_stop_port()
1510 list_for_each_entry_safe(addr_list, tmp, &priv->curr_uc_list, list) { in mlx4_en_stop_port()
1517 mc_list[5] = priv->port; /* needed for B0 steering support */ in mlx4_en_stop_port()
1518 mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, mc_list, in mlx4_en_stop_port()
1519 MLX4_PROT_ETH, priv->broadcast_id); in mlx4_en_stop_port()
1520 list_for_each_entry(addr_list, &priv->curr_mc_list, list) { in mlx4_en_stop_port()
1522 mc_list[5] = priv->port; in mlx4_en_stop_port()
1523 mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, in mlx4_en_stop_port()
1527 list_for_each_entry_safe(addr_list, tmp, &priv->curr_mc_list, list) { in mlx4_en_stop_port()
1533 mlx4_SET_MCAST_FLTR(mdev->dev, priv->port, 0, 1, MLX4_MCAST_CONFIG); in mlx4_en_stop_port()
1534 mlx4_en_destroy_drop_qp(priv); in mlx4_en_stop_port()
1537 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_stop_port()
1538 mlx4_en_deactivate_tx_ring(priv, priv->tx_ring[i]); in mlx4_en_stop_port()
1539 mlx4_en_deactivate_cq(priv, priv->tx_cq[i]); in mlx4_en_stop_port()
1543 for (i = 0; i < priv->tx_ring_num; i++) in mlx4_en_stop_port()
1544 mlx4_en_free_tx_buf(dev, priv->tx_ring[i]); in mlx4_en_stop_port()
1547 mlx4_en_release_rss_steer(priv); in mlx4_en_stop_port()
1550 mlx4_en_put_qp(priv); in mlx4_en_stop_port()
1551 mdev->mac_removed[priv->port] = 1; in mlx4_en_stop_port()
1554 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_stop_port()
1555 struct mlx4_en_cq *cq = priv->rx_cq[i]; in mlx4_en_stop_port()
1556 mlx4_en_deactivate_rx_ring(priv, priv->rx_ring[i]); in mlx4_en_stop_port()
1557 mlx4_en_deactivate_cq(priv, cq); in mlx4_en_stop_port()
1560 callout_stop(&priv->watchdog_timer); in mlx4_en_stop_port()
1567 struct mlx4_en_priv *priv = container_of(work, struct mlx4_en_priv, in mlx4_en_restart() local
1569 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_restart()
1570 if_t dev = priv->dev; in mlx4_en_restart()
1575 if (priv->blocked == 0 || priv->port_up == 0) in mlx4_en_restart()
1577 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_restart()
1580 ring = priv->tx_ring[i]; in mlx4_en_restart()
1589 priv->port_stats.tx_timeout++; in mlx4_en_restart()
1590 en_dbg(DRV, priv, "Watchdog task called for port %d\n", priv->port); in mlx4_en_restart()
1593 if (priv->port_up) { in mlx4_en_restart()
1598 en_err(priv, "Failed restarting port %d\n", priv->port); in mlx4_en_restart()
1605 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_clear_stats() local
1606 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_clear_stats()
1610 if (mlx4_en_DUMP_ETH_STATS(mdev, priv->port, 1)) in mlx4_en_clear_stats()
1611 en_dbg(HW, priv, "Failed dumping statistics\n"); in mlx4_en_clear_stats()
1613 memset(&priv->pstats, 0, sizeof(priv->pstats)); in mlx4_en_clear_stats()
1614 memset(&priv->pkstats, 0, sizeof(priv->pkstats)); in mlx4_en_clear_stats()
1615 memset(&priv->port_stats, 0, sizeof(priv->port_stats)); in mlx4_en_clear_stats()
1616 memset(&priv->vport_stats, 0, sizeof(priv->vport_stats)); in mlx4_en_clear_stats()
1618 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_clear_stats()
1619 priv->tx_ring[i]->bytes = 0; in mlx4_en_clear_stats()
1620 priv->tx_ring[i]->packets = 0; in mlx4_en_clear_stats()
1621 priv->tx_ring[i]->tx_csum = 0; in mlx4_en_clear_stats()
1622 priv->tx_ring[i]->oversized_packets = 0; in mlx4_en_clear_stats()
1624 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_clear_stats()
1625 priv->rx_ring[i]->bytes = 0; in mlx4_en_clear_stats()
1626 priv->rx_ring[i]->packets = 0; in mlx4_en_clear_stats()
1627 priv->rx_ring[i]->csum_ok = 0; in mlx4_en_clear_stats()
1628 priv->rx_ring[i]->csum_none = 0; in mlx4_en_clear_stats()
1635 struct mlx4_en_priv *priv; in mlx4_en_open() local
1640 priv = arg; in mlx4_en_open()
1641 mdev = priv->mdev; in mlx4_en_open()
1642 dev = priv->dev; in mlx4_en_open()
1648 en_err(priv, "Cannot open - device down/disabled\n"); in mlx4_en_open()
1657 en_err(priv, "Failed starting port:%d\n", priv->port); in mlx4_en_open()
1664 void mlx4_en_free_resources(struct mlx4_en_priv *priv) in mlx4_en_free_resources() argument
1669 if (priv->dev->rx_cpu_rmap) { in mlx4_en_free_resources()
1670 free_irq_cpu_rmap(priv->dev->rx_cpu_rmap); in mlx4_en_free_resources()
1671 priv->dev->rx_cpu_rmap = NULL; in mlx4_en_free_resources()
1675 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_free_resources()
1676 if (priv->tx_ring && priv->tx_ring[i]) in mlx4_en_free_resources()
1677 mlx4_en_destroy_tx_ring(priv, &priv->tx_ring[i]); in mlx4_en_free_resources()
1678 if (priv->tx_cq && priv->tx_cq[i]) in mlx4_en_free_resources()
1679 mlx4_en_destroy_cq(priv, &priv->tx_cq[i]); in mlx4_en_free_resources()
1682 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_free_resources()
1683 if (priv->rx_ring[i]) in mlx4_en_free_resources()
1684 mlx4_en_destroy_rx_ring(priv, &priv->rx_ring[i], in mlx4_en_free_resources()
1685 priv->prof->rx_ring_size); in mlx4_en_free_resources()
1686 if (priv->rx_cq[i]) in mlx4_en_free_resources()
1687 mlx4_en_destroy_cq(priv, &priv->rx_cq[i]); in mlx4_en_free_resources()
1690 if (priv->stat_sysctl != NULL) in mlx4_en_free_resources()
1691 sysctl_ctx_free(&priv->stat_ctx); in mlx4_en_free_resources()
1694 int mlx4_en_alloc_resources(struct mlx4_en_priv *priv) in mlx4_en_alloc_resources() argument
1696 struct mlx4_en_port_profile *prof = priv->prof; in mlx4_en_alloc_resources()
1701 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_alloc_resources()
1702 if (mlx4_en_create_cq(priv, &priv->rx_cq[i], in mlx4_en_alloc_resources()
1706 if (mlx4_en_create_rx_ring(priv, &priv->rx_ring[i], in mlx4_en_alloc_resources()
1712 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_alloc_resources()
1713 if (mlx4_en_create_cq(priv, &priv->tx_cq[i], in mlx4_en_alloc_resources()
1717 if (mlx4_en_create_tx_ring(priv, &priv->tx_ring[i], in mlx4_en_alloc_resources()
1723 priv->dev->rx_cpu_rmap = alloc_irq_cpu_rmap(priv->rx_ring_num); in mlx4_en_alloc_resources()
1724 if (!priv->dev->rx_cpu_rmap) in mlx4_en_alloc_resources()
1728 mlx4_en_sysctl_stat(priv); in mlx4_en_alloc_resources()
1732 en_err(priv, "Failed to allocate NIC resources\n"); in mlx4_en_alloc_resources()
1733 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_alloc_resources()
1734 if (priv->rx_ring[i]) in mlx4_en_alloc_resources()
1735 mlx4_en_destroy_rx_ring(priv, &priv->rx_ring[i], in mlx4_en_alloc_resources()
1737 if (priv->rx_cq[i]) in mlx4_en_alloc_resources()
1738 mlx4_en_destroy_cq(priv, &priv->rx_cq[i]); in mlx4_en_alloc_resources()
1740 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_alloc_resources()
1741 if (priv->tx_ring[i]) in mlx4_en_alloc_resources()
1742 mlx4_en_destroy_tx_ring(priv, &priv->tx_ring[i]); in mlx4_en_alloc_resources()
1743 if (priv->tx_cq[i]) in mlx4_en_alloc_resources()
1744 mlx4_en_destroy_cq(priv, &priv->tx_cq[i]); in mlx4_en_alloc_resources()
1746 priv->port_up = false; in mlx4_en_alloc_resources()
1764 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_destroy_netdev() local
1765 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_destroy_netdev()
1767 en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port); in mlx4_en_destroy_netdev()
1770 priv->gone = 1; in mlx4_en_destroy_netdev()
1775 if (priv->vlan_attach != NULL) in mlx4_en_destroy_netdev()
1776 EVENTHANDLER_DEREGISTER(vlan_config, priv->vlan_attach); in mlx4_en_destroy_netdev()
1777 if (priv->vlan_detach != NULL) in mlx4_en_destroy_netdev()
1778 EVENTHANDLER_DEREGISTER(vlan_unconfig, priv->vlan_detach); in mlx4_en_destroy_netdev()
1785 if (priv->registered) in mlx4_en_destroy_netdev()
1788 if (priv->allocated) in mlx4_en_destroy_netdev()
1789 mlx4_free_hwq_res(mdev->dev, &priv->res, MLX4_EN_PAGE_SIZE); in mlx4_en_destroy_netdev()
1791 cancel_delayed_work(&priv->stats_task); in mlx4_en_destroy_netdev()
1792 cancel_delayed_work(&priv->service_task); in mlx4_en_destroy_netdev()
1795 callout_drain(&priv->watchdog_timer); in mlx4_en_destroy_netdev()
1799 mdev->pndev[priv->port] = NULL; in mlx4_en_destroy_netdev()
1803 mlx4_en_free_resources(priv); in mlx4_en_destroy_netdev()
1806 if (priv->conf_sysctl != NULL) in mlx4_en_destroy_netdev()
1807 sysctl_ctx_free(&priv->conf_ctx); in mlx4_en_destroy_netdev()
1809 kfree(priv->tx_ring); in mlx4_en_destroy_netdev()
1810 kfree(priv->tx_cq); in mlx4_en_destroy_netdev()
1812 kfree(priv); in mlx4_en_destroy_netdev()
1819 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_change_mtu() local
1820 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_change_mtu()
1823 en_dbg(DRV, priv, "Change MTU called - current:%u new:%u\n", in mlx4_en_change_mtu()
1826 if ((new_mtu < MLX4_EN_MIN_MTU) || (new_mtu > priv->max_mtu)) { in mlx4_en_change_mtu()
1827 en_err(priv, "Bad MTU size:%d, max %u.\n", new_mtu, in mlx4_en_change_mtu()
1828 priv->max_mtu); in mlx4_en_change_mtu()
1837 en_dbg(DRV, priv, "Change MTU called with card down!?\n"); in mlx4_en_change_mtu()
1842 en_err(priv, "Failed restarting port:%d\n", in mlx4_en_change_mtu()
1843 priv->port); in mlx4_en_change_mtu()
1844 queue_work(mdev->workqueue, &priv->watchdog_task); in mlx4_en_change_mtu()
1852 static int mlx4_en_calc_media(struct mlx4_en_priv *priv) in mlx4_en_calc_media() argument
1858 if (priv->last_link_state == MLX4_DEV_EVENT_PORT_DOWN) in mlx4_en_calc_media()
1861 trans_type = priv->port_state.transceiver; in mlx4_en_calc_media()
1863 switch (priv->port_state.link_speed) { in mlx4_en_calc_media()
1880 if (priv->prof->tx_pause) in mlx4_en_calc_media()
1882 if (priv->prof->rx_pause) in mlx4_en_calc_media()
1890 struct mlx4_en_priv *priv; in mlx4_en_media_status() local
1892 priv = if_getsoftc(dev); in mlx4_en_media_status()
1894 if (priv->last_link_state != MLX4_DEV_EVENT_PORT_DOWN) in mlx4_en_media_status()
1896 ifmr->ifm_active = mlx4_en_calc_media(priv); in mlx4_en_media_status()
1903 struct mlx4_en_priv *priv; in mlx4_en_media_change() local
1909 priv = if_getsoftc(dev); in mlx4_en_media_change()
1910 ifm = &priv->media; in mlx4_en_media_change()
1924 == IFM_SUBTYPE(mlx4_en_calc_media(priv))) in mlx4_en_media_change()
1937 if (priv->prof->tx_pause != txpause || priv->prof->rx_pause != rxpause) { in mlx4_en_media_change()
1938 priv->prof->tx_pause = txpause; in mlx4_en_media_change()
1939 priv->prof->rx_pause = rxpause; in mlx4_en_media_change()
1940 error = -mlx4_SET_PORT_general(priv->mdev->dev, priv->port, in mlx4_en_media_change()
1941 priv->rx_mb_size + ETHER_CRC_LEN, priv->prof->tx_pause, in mlx4_en_media_change()
1942 priv->prof->tx_ppp, priv->prof->rx_pause, in mlx4_en_media_change()
1943 priv->prof->rx_ppp); in mlx4_en_media_change()
1950 struct mlx4_en_priv *priv; in mlx4_en_ioctl() local
1962 priv = if_getsoftc(dev); in mlx4_en_ioctl()
1965 if (priv == NULL || priv->gone != 0) in mlx4_en_ioctl()
1968 mdev = priv->mdev; in mlx4_en_ioctl()
1999 error = ifmedia_ioctl(dev, ifr, &priv->media, command); in mlx4_en_ioctl()
2083 error = mlx4_get_module_info(mdev->dev, priv->port, in mlx4_en_ioctl()
2096 key = mlx4_en_get_rss_key(priv, &ifrk->ifrk_keylen); in mlx4_en_ioctl()
2106 rss_mask = mlx4_en_get_rss_mask(priv); in mlx4_en_ioctl()
2138 struct mlx4_en_priv *priv; in mlx4_en_init_netdev() local
2144 priv = kzalloc(sizeof(*priv), GFP_KERNEL); in mlx4_en_init_netdev()
2145 dev = priv->dev = if_alloc(IFT_ETHER); in mlx4_en_init_netdev()
2147 en_err(priv, "Net device allocation failed\n"); in mlx4_en_init_netdev()
2148 kfree(priv); in mlx4_en_init_netdev()
2151 if_setsoftc(dev, priv); in mlx4_en_init_netdev()
2165 priv->counter_index = 0xff; in mlx4_en_init_netdev()
2166 spin_lock_init(&priv->stats_lock); in mlx4_en_init_netdev()
2167 INIT_WORK(&priv->rx_mode_task, mlx4_en_do_set_rx_mode); in mlx4_en_init_netdev()
2168 INIT_WORK(&priv->watchdog_task, mlx4_en_restart); in mlx4_en_init_netdev()
2169 INIT_WORK(&priv->linkstate_task, mlx4_en_linkstate); in mlx4_en_init_netdev()
2170 INIT_DELAYED_WORK(&priv->stats_task, mlx4_en_do_get_stats); in mlx4_en_init_netdev()
2171 INIT_DELAYED_WORK(&priv->service_task, mlx4_en_service_task); in mlx4_en_init_netdev()
2172 callout_init(&priv->watchdog_timer, 1); in mlx4_en_init_netdev()
2174 INIT_LIST_HEAD(&priv->filters); in mlx4_en_init_netdev()
2175 spin_lock_init(&priv->filters_lock); in mlx4_en_init_netdev()
2178 priv->msg_enable = MLX4_EN_MSG_LEVEL; in mlx4_en_init_netdev()
2179 priv->dev = dev; in mlx4_en_init_netdev()
2180 priv->mdev = mdev; in mlx4_en_init_netdev()
2181 priv->ddev = &mdev->pdev->dev; in mlx4_en_init_netdev()
2182 priv->prof = prof; in mlx4_en_init_netdev()
2183 priv->port = port; in mlx4_en_init_netdev()
2184 priv->port_up = false; in mlx4_en_init_netdev()
2185 priv->flags = prof->flags; in mlx4_en_init_netdev()
2187 priv->num_tx_rings_p_up = mdev->profile.num_tx_rings_p_up; in mlx4_en_init_netdev()
2188 priv->tx_ring_num = prof->tx_ring_num; in mlx4_en_init_netdev()
2189 priv->tx_ring = kcalloc(MAX_TX_RINGS, in mlx4_en_init_netdev()
2191 if (!priv->tx_ring) { in mlx4_en_init_netdev()
2195 priv->tx_cq = kcalloc(sizeof(struct mlx4_en_cq *), MAX_TX_RINGS, in mlx4_en_init_netdev()
2197 if (!priv->tx_cq) { in mlx4_en_init_netdev()
2202 priv->rx_ring_num = prof->rx_ring_num; in mlx4_en_init_netdev()
2203 priv->cqe_factor = (mdev->dev->caps.cqe_size == 64) ? 1 : 0; in mlx4_en_init_netdev()
2204 priv->mac_index = -1; in mlx4_en_init_netdev()
2205 priv->last_ifq_jiffies = 0; in mlx4_en_init_netdev()
2206 priv->if_counters_rx_errors = 0; in mlx4_en_init_netdev()
2207 priv->if_counters_rx_no_buffer = 0; in mlx4_en_init_netdev()
2209 if (!mlx4_is_slave(priv->mdev->dev)) { in mlx4_en_init_netdev()
2210 priv->dcbx_cap = DCB_CAP_DCBX_HOST; in mlx4_en_init_netdev()
2211 priv->flags |= MLX4_EN_FLAG_DCB_ENABLED; in mlx4_en_init_netdev()
2215 en_info(priv, "QoS disabled - no HW support\n"); in mlx4_en_init_netdev()
2222 priv->max_mtu = mdev->dev->caps.eth_mtu_cap[priv->port]; in mlx4_en_init_netdev()
2223 priv->mac = mdev->dev->caps.def_mac[priv->port]; in mlx4_en_init_netdev()
2224 if (ILLEGAL_MAC(priv->mac)) { in mlx4_en_init_netdev()
2226 en_err(priv, "Port: %d, invalid mac burned: 0x%lx, quiting\n", in mlx4_en_init_netdev()
2227 priv->port, priv->mac); in mlx4_en_init_netdev()
2229 en_err(priv, "Port: %d, invalid mac burned: 0x%llx, quiting\n", in mlx4_en_init_netdev()
2230 priv->port, priv->mac); in mlx4_en_init_netdev()
2236 mlx4_en_sysctl_conf(priv); in mlx4_en_init_netdev()
2238 err = mlx4_en_alloc_resources(priv); in mlx4_en_init_netdev()
2243 err = mlx4_alloc_hwq_res(mdev->dev, &priv->res, in mlx4_en_init_netdev()
2246 en_err(priv, "Failed to allocate page for rx qps\n"); in mlx4_en_init_netdev()
2249 priv->allocated = 1; in mlx4_en_init_netdev()
2281 priv->vlan_attach = EVENTHANDLER_REGISTER(vlan_config, in mlx4_en_init_netdev()
2282 mlx4_en_vlan_rx_add_vid, priv, EVENTHANDLER_PRI_FIRST); in mlx4_en_init_netdev()
2283 priv->vlan_detach = EVENTHANDLER_REGISTER(vlan_unconfig, in mlx4_en_init_netdev()
2284 mlx4_en_vlan_rx_kill_vid, priv, EVENTHANDLER_PRI_FIRST); in mlx4_en_init_netdev()
2286 mdev->pndev[priv->port] = dev; in mlx4_en_init_netdev()
2288 priv->last_link_state = MLX4_DEV_EVENT_PORT_DOWN; in mlx4_en_init_netdev()
2289 mlx4_en_set_default_moderation(priv); in mlx4_en_init_netdev()
2293 dev_addr[ETHER_ADDR_LEN - 1 - i] = (u8) (priv->mac >> (8 * i)); in mlx4_en_init_netdev()
2297 ifmedia_init(&priv->media, IFM_IMASK | IFM_ETH_FMASK, in mlx4_en_init_netdev()
2299 ifmedia_add(&priv->media, IFM_ETHER | IFM_FDX | IFM_1000_T, 0, NULL); in mlx4_en_init_netdev()
2300 ifmedia_add(&priv->media, IFM_ETHER | IFM_FDX | IFM_10G_SR, 0, NULL); in mlx4_en_init_netdev()
2301 ifmedia_add(&priv->media, IFM_ETHER | IFM_FDX | IFM_10G_CX4, 0, NULL); in mlx4_en_init_netdev()
2302 ifmedia_add(&priv->media, IFM_ETHER | IFM_FDX | IFM_40G_CR4, 0, NULL); in mlx4_en_init_netdev()
2303 ifmedia_add(&priv->media, IFM_ETHER | IFM_AUTO, 0, NULL); in mlx4_en_init_netdev()
2304 ifmedia_set(&priv->media, IFM_ETHER | IFM_AUTO); in mlx4_en_init_netdev()
2310 en_warn(priv, "Using %d TX rings\n", prof->tx_ring_num); in mlx4_en_init_netdev()
2311 en_warn(priv, "Using %d RX rings\n", prof->rx_ring_num); in mlx4_en_init_netdev()
2313 priv->registered = 1; in mlx4_en_init_netdev()
2315 en_warn(priv, "Using %d TX rings\n", prof->tx_ring_num); in mlx4_en_init_netdev()
2316 en_warn(priv, "Using %d RX rings\n", prof->rx_ring_num); in mlx4_en_init_netdev()
2319 priv->rx_mb_size = if_getmtu(dev) + ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN; in mlx4_en_init_netdev()
2320 err = mlx4_SET_PORT_general(mdev->dev, priv->port, in mlx4_en_init_netdev()
2321 priv->rx_mb_size, in mlx4_en_init_netdev()
2325 en_err(priv, "Failed setting port general configurations " in mlx4_en_init_netdev()
2326 "for port %d, with error %d\n", priv->port, err); in mlx4_en_init_netdev()
2331 en_warn(priv, "Initializing port\n"); in mlx4_en_init_netdev()
2332 err = mlx4_INIT_PORT(mdev->dev, priv->port); in mlx4_en_init_netdev()
2334 en_err(priv, "Failed Initializing port\n"); in mlx4_en_init_netdev()
2338 queue_delayed_work(mdev->workqueue, &priv->stats_task, STATS_DELAY); in mlx4_en_init_netdev()
2341 queue_delayed_work(mdev->workqueue, &priv->service_task, SERVICE_TASK_DELAY); in mlx4_en_init_netdev()
2353 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_set_ring_size() local
2354 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_set_ring_size()
2365 if (rx_size == (priv->port_up ? in mlx4_en_set_ring_size()
2366 priv->rx_ring[0]->actual_size : priv->rx_ring[0]->size) && in mlx4_en_set_ring_size()
2367 tx_size == priv->tx_ring[0]->size) in mlx4_en_set_ring_size()
2370 if (priv->port_up) { in mlx4_en_set_ring_size()
2374 mlx4_en_free_resources(priv); in mlx4_en_set_ring_size()
2375 priv->prof->tx_ring_size = tx_size; in mlx4_en_set_ring_size()
2376 priv->prof->rx_ring_size = rx_size; in mlx4_en_set_ring_size()
2377 err = mlx4_en_alloc_resources(priv); in mlx4_en_set_ring_size()
2379 en_err(priv, "Failed reallocating port resources\n"); in mlx4_en_set_ring_size()
2385 en_err(priv, "Failed starting port\n"); in mlx4_en_set_ring_size()
2393 struct mlx4_en_priv *priv; in mlx4_en_set_rx_ring_size() local
2397 priv = arg1; in mlx4_en_set_rx_ring_size()
2398 size = priv->prof->rx_ring_size; in mlx4_en_set_rx_ring_size()
2402 error = -mlx4_en_set_ring_size(priv->dev, size, in mlx4_en_set_rx_ring_size()
2403 priv->prof->tx_ring_size); in mlx4_en_set_rx_ring_size()
2409 struct mlx4_en_priv *priv; in mlx4_en_set_tx_ring_size() local
2413 priv = arg1; in mlx4_en_set_tx_ring_size()
2414 size = priv->prof->tx_ring_size; in mlx4_en_set_tx_ring_size()
2418 error = -mlx4_en_set_ring_size(priv->dev, priv->prof->rx_ring_size, in mlx4_en_set_tx_ring_size()
2427 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_get_module_info() local
2428 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_get_module_info()
2433 ret = mlx4_get_module_info(mdev->dev, priv->port, in mlx4_en_get_module_info()
2437 en_err(priv, "Failed to read eeprom module first two bytes, error: 0x%x\n", -ret); in mlx4_en_get_module_info()
2464 en_err(priv, "mlx4_en_get_module_info : Not recognized cable type\n"); in mlx4_en_get_module_info()
2475 struct mlx4_en_priv *priv = mlx4_netdev_priv(dev); in mlx4_en_get_module_eeprom() local
2476 struct mlx4_en_dev *mdev = priv->mdev; in mlx4_en_get_module_eeprom()
2486 en_dbg(DRV, priv, in mlx4_en_get_module_eeprom()
2490 ret = mlx4_get_module_info(mdev->dev, priv->port, in mlx4_en_get_module_eeprom()
2497 en_err(priv, in mlx4_en_get_module_eeprom()
2538 struct mlx4_en_priv *priv; in mlx4_en_read_eeprom() local
2548 priv = arg1; in mlx4_en_read_eeprom()
2549 dev = priv->dev; in mlx4_en_read_eeprom()
2554 en_err(priv, in mlx4_en_read_eeprom()
2565 en_err(priv, in mlx4_en_read_eeprom()
2582 struct mlx4_en_priv *priv; in mlx4_en_set_tx_ppp() local
2586 priv = arg1; in mlx4_en_set_tx_ppp()
2587 ppp = priv->prof->tx_ppp; in mlx4_en_set_tx_ppp()
2593 priv->prof->tx_ppp = ppp; in mlx4_en_set_tx_ppp()
2594 error = -mlx4_SET_PORT_general(priv->mdev->dev, priv->port, in mlx4_en_set_tx_ppp()
2595 priv->rx_mb_size + ETHER_CRC_LEN, in mlx4_en_set_tx_ppp()
2596 priv->prof->tx_pause, in mlx4_en_set_tx_ppp()
2597 priv->prof->tx_ppp, in mlx4_en_set_tx_ppp()
2598 priv->prof->rx_pause, in mlx4_en_set_tx_ppp()
2599 priv->prof->rx_ppp); in mlx4_en_set_tx_ppp()
2606 struct mlx4_en_priv *priv; in mlx4_en_set_rx_ppp() local
2613 priv = arg1; in mlx4_en_set_rx_ppp()
2614 mdev = priv->mdev; in mlx4_en_set_rx_ppp()
2615 ppp = priv->prof->rx_ppp; in mlx4_en_set_rx_ppp()
2622 if (!ppp != !priv->prof->rx_ppp) { in mlx4_en_set_rx_ppp()
2624 if (priv->port_up) { in mlx4_en_set_rx_ppp()
2626 mlx4_en_stop_port(priv->dev); in mlx4_en_set_rx_ppp()
2628 mlx4_en_free_resources(priv); in mlx4_en_set_rx_ppp()
2629 priv->prof->rx_ppp = ppp; in mlx4_en_set_rx_ppp()
2630 error = -mlx4_en_alloc_resources(priv); in mlx4_en_set_rx_ppp()
2632 en_err(priv, "Failed reallocating port resources\n"); in mlx4_en_set_rx_ppp()
2634 error = -mlx4_en_start_port(priv->dev); in mlx4_en_set_rx_ppp()
2636 en_err(priv, "Failed starting port\n"); in mlx4_en_set_rx_ppp()
2642 priv->prof->rx_ppp = ppp; in mlx4_en_set_rx_ppp()
2643 error = -mlx4_SET_PORT_general(priv->mdev->dev, priv->port, in mlx4_en_set_rx_ppp()
2644 priv->rx_mb_size + ETHER_CRC_LEN, in mlx4_en_set_rx_ppp()
2645 priv->prof->tx_pause, in mlx4_en_set_rx_ppp()
2646 priv->prof->tx_ppp, in mlx4_en_set_rx_ppp()
2647 priv->prof->rx_pause, in mlx4_en_set_rx_ppp()
2648 priv->prof->rx_ppp); in mlx4_en_set_rx_ppp()
2653 static void mlx4_en_sysctl_conf(struct mlx4_en_priv *priv) in mlx4_en_sysctl_conf() argument
2662 dev = priv->dev; in mlx4_en_sysctl_conf()
2663 ctx = &priv->conf_ctx; in mlx4_en_sysctl_conf()
2664 pnameunit = device_get_nameunit(priv->mdev->pdev->dev.bsddev); in mlx4_en_sysctl_conf()
2667 priv->conf_sysctl = SYSCTL_ADD_NODE(ctx, SYSCTL_STATIC_CHILDREN(_hw), in mlx4_en_sysctl_conf()
2670 node = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(priv->conf_sysctl), OID_AUTO, in mlx4_en_sysctl_conf()
2675 CTLFLAG_RW, &priv->msg_enable, 0, in mlx4_en_sysctl_conf()
2678 CTLFLAG_RD, &priv->rx_ring_num, 0, in mlx4_en_sysctl_conf()
2681 CTLFLAG_RD, &priv->tx_ring_num, 0, in mlx4_en_sysctl_conf()
2684 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, priv, 0, in mlx4_en_sysctl_conf()
2687 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, priv, 0, in mlx4_en_sysctl_conf()
2690 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, priv, 0, in mlx4_en_sysctl_conf()
2693 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, priv, 0, in mlx4_en_sysctl_conf()
2696 CTLFLAG_RD, &priv->port, 0, in mlx4_en_sysctl_conf()
2707 CTLFLAG_RW, &priv->pkt_rate_low, 0, in mlx4_en_sysctl_conf()
2710 CTLFLAG_RW, &priv->rx_usecs_low, 0, in mlx4_en_sysctl_conf()
2713 CTLFLAG_RW, &priv->pkt_rate_high, 0, in mlx4_en_sysctl_conf()
2716 CTLFLAG_RW, &priv->rx_usecs_high, 0, in mlx4_en_sysctl_conf()
2719 CTLFLAG_RW, &priv->sample_interval, 0, in mlx4_en_sysctl_conf()
2722 CTLFLAG_RW, &priv->adaptive_rx_coal, 0, in mlx4_en_sysctl_conf()
2726 CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, priv, 0, in mlx4_en_sysctl_conf()
2730 static void mlx4_en_sysctl_stat(struct mlx4_en_priv *priv) in mlx4_en_sysctl_stat() argument
2741 ctx = &priv->stat_ctx; in mlx4_en_sysctl_stat()
2743 priv->stat_sysctl = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(priv->conf_sysctl), OID_AUTO, in mlx4_en_sysctl_stat()
2745 node_list = SYSCTL_CHILDREN(priv->stat_sysctl); in mlx4_en_sysctl_stat()
2749 &priv->pstats.tx_poll, "TX Poll calls"); in mlx4_en_sysctl_stat()
2751 &priv->pstats.tx_pktsz_avg, "TX average packet size"); in mlx4_en_sysctl_stat()
2753 &priv->pstats.inflight_avg, "TX average packets in-flight"); in mlx4_en_sysctl_stat()
2755 &priv->pstats.tx_coal_avg, "TX average coalesced completions"); in mlx4_en_sysctl_stat()
2757 &priv->pstats.rx_coal_avg, "RX average coalesced completions"); in mlx4_en_sysctl_stat()
2761 &priv->port_stats.tso_packets, 0, "TSO packets sent"); in mlx4_en_sysctl_stat()
2763 &priv->port_stats.queue_stopped, 0, "Queue full"); in mlx4_en_sysctl_stat()
2765 &priv->port_stats.wake_queue, 0, "Queue resumed after full"); in mlx4_en_sysctl_stat()
2767 &priv->port_stats.tx_timeout, 0, "Transmit timeouts"); in mlx4_en_sysctl_stat()
2769 &priv->port_stats.oversized_packets, 0, "TX oversized packets, m_defrag failed"); in mlx4_en_sysctl_stat()
2771 &priv->port_stats.rx_alloc_failed, 0, "RX failed to allocate mbuf"); in mlx4_en_sysctl_stat()
2773 &priv->port_stats.rx_chksum_good, 0, "RX checksum offload success"); in mlx4_en_sysctl_stat()
2775 &priv->port_stats.rx_chksum_none, 0, "RX without checksum offload"); in mlx4_en_sysctl_stat()
2777 CTLFLAG_RD, &priv->port_stats.tx_chksum_offload, 0, in mlx4_en_sysctl_stat()
2780 CTLFLAG_RD, &priv->port_stats.defrag_attempts, 0, in mlx4_en_sysctl_stat()
2785 &priv->pkstats.rx_bytes, 0, "RX Bytes"); in mlx4_en_sysctl_stat()
2787 &priv->pkstats.rx_packets, 0, "RX packets"); in mlx4_en_sysctl_stat()
2789 &priv->pkstats.rx_multicast_packets, 0, "RX Multicast Packets"); in mlx4_en_sysctl_stat()
2791 &priv->pkstats.rx_broadcast_packets, 0, "RX Broadcast Packets"); in mlx4_en_sysctl_stat()
2793 &priv->pkstats.rx_errors, 0, "RX Errors"); in mlx4_en_sysctl_stat()
2795 &priv->pkstats.rx_dropped, 0, "RX Dropped"); in mlx4_en_sysctl_stat()
2797 &priv->pkstats.rx_length_errors, 0, "RX Length Errors"); in mlx4_en_sysctl_stat()
2799 &priv->pkstats.rx_over_errors, 0, "RX Over Errors"); in mlx4_en_sysctl_stat()
2801 &priv->pkstats.rx_crc_errors, 0, "RX CRC Errors"); in mlx4_en_sysctl_stat()
2803 &priv->pkstats.rx_jabbers, 0, "RX Jabbers"); in mlx4_en_sysctl_stat()
2806 &priv->pkstats.rx_in_range_length_error, 0, "RX IN_Range Length Error"); in mlx4_en_sysctl_stat()
2808 CTLFLAG_RD, &priv->pkstats.rx_out_range_length_error, 0, in mlx4_en_sysctl_stat()
2811 &priv->pkstats.rx_lt_64_bytes_packets, 0, "RX Lt 64 Bytes Packets"); in mlx4_en_sysctl_stat()
2813 &priv->pkstats.rx_127_bytes_packets, 0, "RX 127 bytes Packets"); in mlx4_en_sysctl_stat()
2815 &priv->pkstats.rx_255_bytes_packets, 0, "RX 255 bytes Packets"); in mlx4_en_sysctl_stat()
2817 &priv->pkstats.rx_511_bytes_packets, 0, "RX 511 bytes Packets"); in mlx4_en_sysctl_stat()
2819 &priv->pkstats.rx_1023_bytes_packets, 0, "RX 1023 bytes Packets"); in mlx4_en_sysctl_stat()
2821 &priv->pkstats.rx_1518_bytes_packets, 0, "RX 1518 bytes Packets"); in mlx4_en_sysctl_stat()
2823 &priv->pkstats.rx_1522_bytes_packets, 0, "RX 1522 bytes Packets"); in mlx4_en_sysctl_stat()
2825 &priv->pkstats.rx_1548_bytes_packets, 0, "RX 1548 bytes Packets"); in mlx4_en_sysctl_stat()
2827 &priv->pkstats.rx_gt_1548_bytes_packets, 0, in mlx4_en_sysctl_stat()
2831 &priv->pkstats.tx_packets, 0, "TX packets"); in mlx4_en_sysctl_stat()
2833 &priv->pkstats.tx_bytes, 0, "TX Bytes"); in mlx4_en_sysctl_stat()
2835 &priv->pkstats.tx_multicast_packets, 0, "TX Multicast Packets"); in mlx4_en_sysctl_stat()
2837 &priv->pkstats.tx_broadcast_packets, 0, "TX Broadcast Packets"); in mlx4_en_sysctl_stat()
2839 &priv->pkstats.tx_errors, 0, "TX Errors"); in mlx4_en_sysctl_stat()
2841 &priv->pkstats.tx_dropped, 0, "TX Dropped"); in mlx4_en_sysctl_stat()
2843 &priv->pkstats.tx_lt_64_bytes_packets, 0, "TX Less Then 64 Bytes Packets"); in mlx4_en_sysctl_stat()
2845 &priv->pkstats.tx_127_bytes_packets, 0, "TX 127 Bytes Packets"); in mlx4_en_sysctl_stat()
2847 &priv->pkstats.tx_255_bytes_packets, 0, "TX 255 Bytes Packets"); in mlx4_en_sysctl_stat()
2849 &priv->pkstats.tx_511_bytes_packets, 0, "TX 511 Bytes Packets"); in mlx4_en_sysctl_stat()
2851 &priv->pkstats.tx_1023_bytes_packets, 0, "TX 1023 Bytes Packets"); in mlx4_en_sysctl_stat()
2853 &priv->pkstats.tx_1518_bytes_packets, 0, "TX 1518 Bytes Packets"); in mlx4_en_sysctl_stat()
2855 &priv->pkstats.tx_1522_bytes_packets, 0, "TX 1522 Bytes Packets"); in mlx4_en_sysctl_stat()
2857 &priv->pkstats.tx_1548_bytes_packets, 0, "TX 1548 Bytes Packets"); in mlx4_en_sysctl_stat()
2859 &priv->pkstats.tx_gt_1548_bytes_packets, 0, in mlx4_en_sysctl_stat()
2862 for (i = 0; i < priv->tx_ring_num; i++) { in mlx4_en_sysctl_stat()
2863 tx_ring = priv->tx_ring[i]; in mlx4_en_sysctl_stat()
2879 for (i = 0; i < priv->rx_ring_num; i++) { in mlx4_en_sysctl_stat()
2880 rx_ring = priv->rx_ring[i]; in mlx4_en_sysctl_stat()
2898 struct mlx4_en_priv *priv; in mlx4_en_debugnet_init() local
2900 priv = if_getsoftc(dev); in mlx4_en_debugnet_init()
2901 mutex_lock(&priv->mdev->state_lock); in mlx4_en_debugnet_init()
2902 *nrxr = priv->rx_ring_num; in mlx4_en_debugnet_init()
2905 mutex_unlock(&priv->mdev->state_lock); in mlx4_en_debugnet_init()
2916 struct mlx4_en_priv *priv; in mlx4_en_debugnet_transmit() local
2919 priv = if_getsoftc(dev); in mlx4_en_debugnet_transmit()
2921 IFF_DRV_RUNNING || !priv->link_state) in mlx4_en_debugnet_transmit()
2924 err = mlx4_en_xmit(priv, 0, &m); in mlx4_en_debugnet_transmit()
2933 struct mlx4_en_priv *priv; in mlx4_en_debugnet_poll() local
2935 priv = if_getsoftc(dev); in mlx4_en_debugnet_poll()
2936 if ((if_getdrvflags(dev) & IFF_DRV_RUNNING) == 0 || !priv->link_state) in mlx4_en_debugnet_poll()
2939 mlx4_poll_interrupts(priv->mdev->dev); in mlx4_en_debugnet_poll()