Lines Matching refs:priv

74 	struct ipoib_dev_priv *priv;
130 ipoib_open(struct ipoib_dev_priv *priv)
132 if_t dev = priv->dev;
134 ipoib_dbg(priv, "bringing up interface\n");
136 set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
138 if (ipoib_pkey_dev_delay_open(priv))
141 if (ipoib_ib_dev_open(priv))
144 if (ipoib_ib_dev_up(priv))
147 if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
151 mutex_lock(&priv->vlan_mutex);
152 list_for_each_entry(cpriv, &priv->child_intfs, list)
155 mutex_unlock(&priv->vlan_mutex);
162 ipoib_ib_dev_stop(priv, 1);
165 clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
174 struct ipoib_dev_priv *priv;
176 priv = arg;
177 dev = priv->dev;
179 ipoib_open(priv);
180 queue_work(ipoib_workqueue, &priv->flush_light);
185 ipoib_stop(struct ipoib_dev_priv *priv)
187 if_t dev = priv->dev;
189 ipoib_dbg(priv, "stopping interface\n");
191 clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
195 ipoib_ib_dev_down(priv, 0);
196 ipoib_ib_dev_stop(priv, 0);
198 if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
202 mutex_lock(&priv->vlan_mutex);
203 list_for_each_entry(cpriv, &priv->child_intfs, list)
206 mutex_unlock(&priv->vlan_mutex);
213 ipoib_propagate_ifnet_mtu(struct ipoib_dev_priv *priv, int new_mtu,
220 ifp = priv->dev;
237 ipoib_change_mtu(struct ipoib_dev_priv *priv, int new_mtu, bool propagate)
242 if (ipoib_cm_admin_enabled(priv)) {
243 if (new_mtu > IPOIB_CM_MTU(ipoib_cm_max_mtu(priv)))
246 if (new_mtu > priv->mcast_mtu)
247 ipoib_warn(priv, "mtu > %d will cause multicast packet drops.\n",
248 priv->mcast_mtu);
250 return (ipoib_propagate_ifnet_mtu(priv, new_mtu, propagate));
253 if (new_mtu > IPOIB_UD_MTU(priv->max_ib_mtu))
256 prev_admin_mtu = priv->admin_mtu;
257 priv->admin_mtu = new_mtu;
258 error = ipoib_propagate_ifnet_mtu(priv, min(priv->mcast_mtu,
259 priv->admin_mtu), propagate);
263 queue_work(ipoib_workqueue, &priv->flush_light);
265 priv->admin_mtu = prev_admin_mtu;
272 struct ipoib_dev_priv *priv = if_getsoftc(ifp);
278 if (priv == NULL)
281 while (priv->gone == 2)
284 if (priv->gone != 0)
291 error = -ipoib_open(priv);
294 ipoib_stop(priv);
299 queue_work(ipoib_workqueue, &priv->restart_task);
326 error = -ipoib_change_mtu(priv, ifr->ifr_mtu, false);
337 __path_find(struct ipoib_dev_priv *priv, void *gid)
339 struct rb_node *n = priv->path_tree.rb_node;
361 __path_add(struct ipoib_dev_priv *priv, struct ipoib_path *path)
363 struct rb_node **n = &priv->path_tree.rb_node;
383 rb_insert_color(&path->rb_node, &priv->path_tree);
385 list_add_tail(&path->list, &priv->path_list);
391 ipoib_path_free(struct ipoib_dev_priv *priv, struct ipoib_path *path)
407 ipoib_path_iter_init(struct ipoib_dev_priv *priv)
415 iter->priv = priv;
429 struct ipoib_dev_priv *priv = iter->priv;
434 spin_lock_irq(&priv->lock);
436 n = rb_first(&priv->path_tree);
451 spin_unlock_irq(&priv->lock);
465 ipoib_mark_paths_invalid(struct ipoib_dev_priv *priv)
469 spin_lock_irq(&priv->lock);
471 list_for_each_entry_safe(path, tp, &priv->path_list, list) {
472 ipoib_dbg(priv, "mark path LID 0x%04x GID %16D invalid\n",
478 spin_unlock_irq(&priv->lock);
482 ipoib_flush_paths(struct ipoib_dev_priv *priv)
488 spin_lock_irqsave(&priv->lock, flags);
490 list_splice_init(&priv->path_list, &remove_list);
493 rb_erase(&path->rb_node, &priv->path_tree);
498 spin_unlock_irqrestore(&priv->lock, flags);
500 ipoib_path_free(priv, path);
501 spin_lock_irqsave(&priv->lock, flags);
504 spin_unlock_irqrestore(&priv->lock, flags);
511 struct ipoib_dev_priv *priv = path->priv;
512 if_t dev = priv->dev;
521 ipoib_dbg(priv, "PathRec LID 0x%04x for GID %16D\n",
524 ipoib_dbg(priv, "PathRec status %d for GID %16D\n",
532 if (!ib_init_ah_from_path(priv->ca, priv->port, pathrec, &av))
533 ah = ipoib_create_ah(priv, priv->pd, &av);
536 spin_lock_irqsave(&priv->lock, flags);
544 ipoib_dbg(priv, "created address handle %p for LID 0x%04x, SL %d\n",
555 if (ipoib_cm_enabled(priv, path->hwaddr) && !ipoib_cm_get(path))
556 ipoib_cm_set(path, ipoib_cm_create_tx(priv, path));
565 spin_unlock_irqrestore(&priv->lock, flags);
577 ipoib_warn(priv, "dev_queue_xmit failed "
584 path_rec_create(struct ipoib_dev_priv *priv, uint8_t *hwaddr)
588 if (!priv->broadcast)
595 path->priv = priv;
603 path->pathrec.sgid = priv->local_gid;
604 path->pathrec.pkey = cpu_to_be16(priv->pkey);
606 path->pathrec.traffic_class = priv->broadcast->mcmember.traffic_class;
612 path_rec_start(struct ipoib_dev_priv *priv, struct ipoib_path *path)
614 if_t dev = priv->dev;
642 ipoib_dbg(priv, "Start path record lookup for %16D MTU > %d\n",
649 ib_sa_path_rec_get(&ipoib_sa_client, priv->ca, priv->port,
660 ipoib_warn(priv, "ib_sa_path_rec_get failed: %d\n", path->query_id);
670 ipoib_unicast_send(struct mbuf *mb, struct ipoib_dev_priv *priv, struct ipoib_header *eh)
674 path = __path_find(priv, eh->hwaddr + 4);
679 path = path_rec_create(priv, eh->hwaddr);
686 if_inc_counter(priv->dev, IFCOUNTER_OERRORS, 1);
690 if (!path->query && path_rec_start(priv, path)) {
692 ipoib_path_free(priv, path);
695 __path_add(priv, path);
697 if_inc_counter(priv->dev, IFCOUNTER_OERRORS, 1);
705 ipoib_cm_send(priv, mb, ipoib_cm_get(path));
707 ipoib_send(priv, mb, path->ah, IPOIB_QPN(eh->hwaddr));
708 } else if ((path->query || !path_rec_start(priv, path)) &&
712 if_inc_counter(priv->dev, IFCOUNTER_OERRORS, 1);
718 ipoib_send_one(struct ipoib_dev_priv *priv, struct mbuf *mb)
725 eh->hwaddr[8] = (priv->pkey >> 8) & 0xff;
726 eh->hwaddr[9] = priv->pkey & 0xff;
728 ipoib_mcast_send(priv, eh->hwaddr + 4, mb);
730 ipoib_unicast_send(mb, priv, eh);
736 ipoib_start_locked(if_t dev, struct ipoib_dev_priv *priv)
740 assert_spin_locked(&priv->lock);
748 ipoib_send_one(priv, mb);
753 _ipoib_start(if_t dev, struct ipoib_dev_priv *priv)
760 spin_lock(&priv->lock);
761 ipoib_start_locked(dev, priv);
762 spin_unlock(&priv->lock);
774 struct ipoib_dev_priv *priv;
777 priv = VLAN_COOKIE(dev);
778 if (priv != NULL)
779 return _ipoib_start(dev, priv);
790 ipoib_dev_init(struct ipoib_dev_priv *priv, struct ib_device *ca, int port)
794 priv->rx_ring = kzalloc(ipoib_recvq_size * sizeof *priv->rx_ring,
796 if (!priv->rx_ring) {
802 priv->tx_ring = kzalloc(ipoib_sendq_size * sizeof *priv->tx_ring, GFP_KERNEL);
803 if (!priv->tx_ring) {
808 memset(priv->tx_ring, 0, ipoib_sendq_size * sizeof *priv->tx_ring);
810 /* priv->tx_head, tx_tail & tx_outstanding are already 0 */
812 if (ipoib_ib_dev_init(priv, ca, port))
818 kfree(priv->tx_ring);
821 kfree(priv->rx_ring);
828 ipoib_ifdetach(struct ipoib_dev_priv *priv)
832 dev = priv->dev;
833 if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
834 priv->gone = 1;
840 ipoib_detach(struct ipoib_dev_priv *priv)
844 dev = priv->dev;
845 if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) {
847 free_unr(ipoib_unrhdr, priv->unit);
849 VLAN_SETCOOKIE(priv->dev, NULL);
851 free(priv, M_TEMP);
855 ipoib_dev_cleanup(struct ipoib_dev_priv *priv)
860 list_for_each_entry_safe(cpriv, tcpriv, &priv->child_intfs, list) {
866 ipoib_ib_dev_cleanup(priv);
868 kfree(priv->rx_ring);
869 kfree(priv->tx_ring);
871 priv->rx_ring = NULL;
872 priv->tx_ring = NULL;
878 struct ipoib_dev_priv *priv;
880 priv = malloc(sizeof(struct ipoib_dev_priv), M_TEMP, M_ZERO|M_WAITOK);
881 spin_lock_init(&priv->lock);
882 spin_lock_init(&priv->drain_lock);
883 mutex_init(&priv->vlan_mutex);
884 INIT_LIST_HEAD(&priv->path_list);
885 INIT_LIST_HEAD(&priv->child_intfs);
886 INIT_LIST_HEAD(&priv->dead_ahs);
887 INIT_LIST_HEAD(&priv->multicast_list);
888 INIT_DELAYED_WORK(&priv->pkey_poll_task, ipoib_pkey_poll);
889 INIT_DELAYED_WORK(&priv->mcast_task, ipoib_mcast_join_task);
890 INIT_WORK(&priv->carrier_on_task, ipoib_mcast_carrier_on_task);
891 INIT_WORK(&priv->flush_light, ipoib_ib_dev_flush_light);
892 INIT_WORK(&priv->flush_normal, ipoib_ib_dev_flush_normal);
893 INIT_WORK(&priv->flush_heavy, ipoib_ib_dev_flush_heavy);
894 INIT_WORK(&priv->restart_task, ipoib_mcast_restart_task);
895 INIT_DELAYED_WORK(&priv->ah_reap_task, ipoib_reap_ah);
896 memcpy(priv->broadcastaddr, ipv4_bcast_addr, INFINIBAND_ALEN);
898 return (priv);
904 struct ipoib_dev_priv *priv;
907 priv = ipoib_priv_alloc();
908 dev = priv->dev = if_alloc(IFT_INFINIBAND);
910 free(priv, M_TEMP);
913 if_setsoftc(dev, priv);
914 priv->gone = 2; /* initializing */
915 priv->unit = alloc_unr(ipoib_unrhdr);
916 if (priv->unit == -1) {
918 free(priv, M_TEMP);
921 if_initname(dev, name, priv->unit);
926 infiniband_ifattach(priv->dev, NULL, priv->broadcastaddr);
934 priv->dev = dev;
935 if_link_state_change(priv->dev, LINK_STATE_DOWN);
941 ipoib_set_dev_features(struct ipoib_dev_priv *priv, struct ib_device *hca)
945 priv->hca_caps = device_attr->device_cap_flags;
947 if_sethwassist(priv->dev, 0);
948 if_setcapabilities(priv->dev, 0);
951 if (priv->hca_caps & IB_DEVICE_UD_IP_CSUM) {
952 set_bit(IPOIB_FLAG_CSUM, &priv->flags);
953 if_sethwassist(priv->dev, CSUM_IP | CSUM_TCP | CSUM_UDP);
954 if_setcapabilities(priv->dev, IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM);
958 if (priv->dev->features & NETIF_F_SG && priv->hca_caps & IB_DEVICE_UD_TSO) {
959 priv->dev->if_capabilities |= IFCAP_TSO4;
960 priv->dev->if_hwassist |= CSUM_TSO;
964 if_setcapabilitiesbit(priv->dev,
966 if_setcapenable(priv->dev, if_getcapabilities(priv->dev));
975 struct ipoib_dev_priv *priv;
979 priv = ipoib_intf_alloc(format, hca);
980 if (!priv)
984 priv->max_ib_mtu = ib_mtu_enum_to_int(attr.max_mtu);
992 if_setmtu(priv->dev, IPOIB_UD_MTU(priv->max_ib_mtu));
993 priv->mcast_mtu = priv->admin_mtu = if_getmtu(priv->dev);
995 result = ib_query_pkey(hca, port, 0, &priv->pkey);
1002 if (ipoib_set_dev_features(priv, hca))
1009 priv->pkey |= 0x8000;
1011 priv->broadcastaddr[8] = priv->pkey >> 8;
1012 priv->broadcastaddr[9] = priv->pkey & 0xff;
1014 result = ib_query_gid(hca, port, 0, &priv->local_gid, NULL);
1020 memcpy(if_getlladdr(priv->dev) + 4, priv->local_gid.raw, sizeof(union ib_gid));
1022 result = ipoib_dev_init(priv, hca, port);
1028 if (ipoib_cm_admin_enabled(priv))
1029 if_setmtu(priv->dev, IPOIB_CM_MTU(ipoib_cm_max_mtu(priv)));
1031 INIT_IB_EVENT_HANDLER(&priv->event_handler,
1032 priv->ca, ipoib_event);
1033 result = ib_register_event_handler(&priv->event_handler);
1040 if_printf(priv->dev, "Attached to %s port %d\n", hca->name, port);
1042 priv->gone = 0; /* ready */
1044 return priv->dev;
1047 ipoib_dev_cleanup(priv);
1050 ipoib_ifdetach(priv);
1051 ipoib_detach(priv);
1062 struct ipoib_dev_priv *priv;
1087 priv = if_getsoftc(dev);
1088 list_add_tail(&priv->list, dev_list);
1098 struct ipoib_dev_priv *priv, *tmp;
1107 list_for_each_entry_safe(priv, tmp, dev_list, list) {
1108 if (rdma_port_get_link_layer(device, priv->port) != IB_LINK_LAYER_INFINIBAND)
1111 ipoib_ifdetach(priv);
1112 ipoib_stop(priv);
1114 ib_unregister_event_handler(&priv->event_handler);
1118 ipoib_dev_cleanup(priv);
1119 ipoib_detach(priv);
1166 ipoib_match_gid_pkey_addr(struct ipoib_dev_priv *priv,
1173 if (priv->pkey_index == pkey_index &&
1174 (!gid || !memcmp(gid, &priv->local_gid, sizeof(*gid)))) {
1175 if (addr == NULL || ipoib_match_dev_addr(addr, priv->dev) != 0) {
1179 if (priv->parent != NULL)
1180 net_dev = priv->parent;
1182 net_dev = priv->dev;
1191 mutex_lock(&priv->vlan_mutex);
1192 list_for_each_entry(child_priv, &priv->child_intfs, list) {
1198 mutex_unlock(&priv->vlan_mutex);
1214 struct ipoib_dev_priv *priv;
1219 list_for_each_entry(priv, dev_list, list) {
1220 if (priv->port != port)
1223 matches += ipoib_match_gid_pkey_addr(priv, gid, pkey_index,
1286 struct ipoib_dev_priv *priv;
1299 priv = NULL;
1310 list_for_each_entry(priv, &parent->child_intfs, list) {
1311 if (priv->pkey == pkey) {
1312 priv = NULL;
1317 priv = ipoib_priv_alloc();
1318 priv->dev = dev;
1319 priv->max_ib_mtu = parent->max_ib_mtu;
1320 priv->mcast_mtu = priv->admin_mtu = if_getmtu(parent->dev);
1321 set_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags);
1322 error = ipoib_set_dev_features(priv, parent->ca);
1325 priv->pkey = pkey;
1326 priv->broadcastaddr[8] = pkey >> 8;
1327 priv->broadcastaddr[9] = pkey & 0xff;
1328 if_setbroadcastaddr(dev, priv->broadcastaddr);
1329 error = ipoib_dev_init(priv, parent->ca, parent->port);
1332 priv->parent = parent->dev;
1333 list_add_tail(&priv->list, &parent->child_intfs);
1334 VLAN_SETCOOKIE(dev, priv);
1339 ipoib_open(priv);
1344 if (priv)
1345 free(priv, M_TEMP);
1357 struct ipoib_dev_priv *priv;
1373 list_for_each_entry(priv, &parent->child_intfs, list) {
1374 if (priv->pkey == pkey) {
1375 ipoib_dev_cleanup(priv);
1376 list_del(&priv->list);