Lines Matching refs:devlink_port
21 #define ASSERT_DEVLINK_PORT_REGISTERED(devlink_port) \
22 WARN_ON_ONCE(!(devlink_port)->registered)
23 #define ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port) \
24 WARN_ON_ONCE((devlink_port)->registered)
26 struct devlink_port *devlink_port_get_by_index(struct devlink *devlink,
32 struct devlink_port *devlink_port_get_from_attrs(struct devlink *devlink,
37 struct devlink_port *devlink_port;
39 devlink_port = devlink_port_get_by_index(devlink, port_index);
40 if (!devlink_port)
42 return devlink_port;
47 struct devlink_port *devlink_port_get_from_info(struct devlink *devlink,
61 static int devlink_port_fn_roce_fill(struct devlink_port *devlink_port,
68 if (!devlink_port->ops->port_fn_roce_get)
71 err = devlink_port->ops->port_fn_roce_get(devlink_port, &is_enable,
83 static int devlink_port_fn_migratable_fill(struct devlink_port *devlink_port,
90 if (!devlink_port->ops->port_fn_migratable_get ||
91 devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF)
94 err = devlink_port->ops->port_fn_migratable_get(devlink_port,
106 static int devlink_port_fn_ipsec_crypto_fill(struct devlink_port *devlink_port,
113 if (!devlink_port->ops->port_fn_ipsec_crypto_get ||
114 devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF)
117 err = devlink_port->ops->port_fn_ipsec_crypto_get(devlink_port, &is_enable, extack);
128 static int devlink_port_fn_ipsec_packet_fill(struct devlink_port *devlink_port,
135 if (!devlink_port->ops->port_fn_ipsec_packet_get ||
136 devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF)
139 err = devlink_port->ops->port_fn_ipsec_packet_get(devlink_port, &is_enable, extack);
150 static int devlink_port_fn_caps_fill(struct devlink_port *devlink_port,
158 err = devlink_port_fn_roce_fill(devlink_port, &caps, extack);
162 err = devlink_port_fn_migratable_fill(devlink_port, &caps, extack);
166 err = devlink_port_fn_ipsec_crypto_fill(devlink_port, &caps, extack);
170 err = devlink_port_fn_ipsec_packet_fill(devlink_port, &caps, extack);
185 int devlink_nl_port_handle_fill(struct sk_buff *msg, struct devlink_port *devlink_port)
187 if (devlink_nl_put_handle(msg, devlink_port->devlink))
189 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, devlink_port->index))
194 size_t devlink_nl_port_handle_size(struct devlink_port *devlink_port)
196 struct devlink *devlink = devlink_port->devlink;
204 struct devlink_port *devlink_port)
206 struct devlink_port_attrs *attrs = &devlink_port->attrs;
208 if (!devlink_port->attrs_set)
218 switch (devlink_port->attrs.flavour) {
266 static int devlink_port_fn_hw_addr_fill(struct devlink_port *port,
306 static int devlink_port_fn_state_fill(struct devlink_port *port,
342 devlink_port_fn_mig_set(struct devlink_port *devlink_port, bool enable,
345 return devlink_port->ops->port_fn_migratable_set(devlink_port, enable,
350 devlink_port_fn_roce_set(struct devlink_port *devlink_port, bool enable,
353 return devlink_port->ops->port_fn_roce_set(devlink_port, enable,
358 devlink_port_fn_ipsec_crypto_set(struct devlink_port *devlink_port, bool enable,
361 return devlink_port->ops->port_fn_ipsec_crypto_set(devlink_port, enable, extack);
365 devlink_port_fn_ipsec_packet_set(struct devlink_port *devlink_port, bool enable,
368 return devlink_port->ops->port_fn_ipsec_packet_set(devlink_port, enable, extack);
371 static int devlink_port_fn_caps_set(struct devlink_port *devlink_port,
382 err = devlink_port_fn_roce_set(devlink_port,
389 err = devlink_port_fn_mig_set(devlink_port, caps_value &
396 err = devlink_port_fn_ipsec_crypto_set(devlink_port, caps_value &
403 err = devlink_port_fn_ipsec_packet_set(devlink_port, caps_value &
413 devlink_nl_port_function_attrs_put(struct sk_buff *msg, struct devlink_port *port,
440 struct devlink_port *devlink_port,
444 struct devlink *devlink = devlink_port->devlink;
453 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, devlink_port->index))
456 spin_lock_bh(&devlink_port->type_lock);
457 if (nla_put_u16(msg, DEVLINK_ATTR_PORT_TYPE, devlink_port->type))
459 if (devlink_port->desired_type != DEVLINK_PORT_TYPE_NOTSET &&
461 devlink_port->desired_type))
463 if (devlink_port->type == DEVLINK_PORT_TYPE_ETH) {
464 if (devlink_port->type_eth.netdev &&
466 devlink_port->type_eth.ifindex) ||
468 devlink_port->type_eth.ifname)))
471 if (devlink_port->type == DEVLINK_PORT_TYPE_IB) {
472 struct ib_device *ibdev = devlink_port->type_ib.ibdev;
479 spin_unlock_bh(&devlink_port->type_lock);
480 if (devlink_nl_port_attrs_put(msg, devlink_port))
482 if (devlink_nl_port_function_attrs_put(msg, devlink_port, extack))
484 if (devlink_port->linecard &&
486 devlink_port->linecard->index))
493 spin_unlock_bh(&devlink_port->type_lock);
499 static void devlink_port_notify(struct devlink_port *devlink_port,
502 struct devlink *devlink = devlink_port->devlink;
515 err = devlink_nl_port_fill(msg, devlink_port, cmd, 0, 0, 0, NULL);
528 struct devlink_port *devlink_port;
531 xa_for_each(&devlink->ports, port_index, devlink_port)
532 devlink_port_notify(devlink_port, cmd);
547 struct devlink_port *devlink_port = info->user_ptr[1];
555 err = devlink_nl_port_fill(msg, devlink_port, DEVLINK_CMD_PORT_NEW,
571 struct devlink_port *devlink_port;
575 xa_for_each_start(&devlink->ports, port_index, devlink_port, state->idx) {
576 err = devlink_nl_port_fill(msg, devlink_port,
595 static int devlink_port_type_set(struct devlink_port *devlink_port,
601 if (!devlink_port->ops->port_type_set)
604 if (port_type == devlink_port->type)
607 err = devlink_port->ops->port_type_set(devlink_port, port_type);
611 devlink_port->desired_type = port_type;
612 devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
616 static int devlink_port_function_hw_addr_set(struct devlink_port *port,
644 static int devlink_port_fn_state_set(struct devlink_port *port,
654 static int devlink_port_function_validate(struct devlink_port *devlink_port,
658 const struct devlink_port_ops *ops = devlink_port->ops;
689 if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF) {
701 if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF) {
713 if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PCI_VF) {
723 static int devlink_port_function_set(struct devlink_port *port,
770 struct devlink_port *devlink_port = info->user_ptr[1];
777 err = devlink_port_type_set(devlink_port, port_type);
786 err = devlink_port_function_set(devlink_port, attr, extack);
796 struct devlink_port *devlink_port = info->user_ptr[1];
802 if (!devlink_port->ops->port_split)
807 if (!devlink_port->attrs.splittable) {
809 if (devlink_port->attrs.split)
816 if (count < 2 || !is_power_of_2(count) || count > devlink_port->attrs.lanes) {
821 return devlink_port->ops->port_split(devlink, devlink_port, count,
828 struct devlink_port *devlink_port = info->user_ptr[1];
831 if (!devlink_port->ops->port_unsplit)
833 return devlink_port->ops->port_unsplit(devlink, devlink_port, info->extack);
841 struct devlink_port *devlink_port;
875 extack, &devlink_port);
884 err = devlink_nl_port_fill(msg, devlink_port, DEVLINK_CMD_PORT_NEW,
896 devlink_port->ops->port_del(devlink, devlink_port, NULL);
902 struct devlink_port *devlink_port = info->user_ptr[1];
906 if (!devlink_port->ops->port_del)
909 return devlink_port->ops->port_del(devlink, devlink_port, extack);
914 struct devlink_port *port = container_of(to_delayed_work(work),
915 struct devlink_port,
920 static bool devlink_port_type_should_warn(struct devlink_port *devlink_port)
923 return devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_CPU &&
924 devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_DSA &&
925 devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_UNUSED;
930 static void devlink_port_type_warn_schedule(struct devlink_port *devlink_port)
932 if (!devlink_port_type_should_warn(devlink_port))
937 schedule_delayed_work(&devlink_port->type_warn_dw,
941 static void devlink_port_type_warn_cancel(struct devlink_port *devlink_port)
943 if (!devlink_port_type_should_warn(devlink_port))
945 cancel_delayed_work_sync(&devlink_port->type_warn_dw);
952 * @devlink_port: devlink port
960 struct devlink_port *devlink_port)
962 if (devlink_port->initialized)
964 devlink_port->devlink = devlink;
965 INIT_LIST_HEAD(&devlink_port->region_list);
966 devlink_port->initialized = true;
973 * @devlink_port: devlink port
980 void devlink_port_fini(struct devlink_port *devlink_port)
982 WARN_ON(!list_empty(&devlink_port->region_list));
992 * @devlink_port: devlink port
997 * any indexing, even hw-related one. devlink_port structure
999 * Note that the caller should take care of zeroing the devlink_port
1003 struct devlink_port *devlink_port,
1011 ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1013 devlink_port_init(devlink, devlink_port);
1014 devlink_port->registered = true;
1015 devlink_port->index = port_index;
1016 devlink_port->ops = ops ? ops : &devlink_port_dummy_ops;
1017 spin_lock_init(&devlink_port->type_lock);
1018 INIT_LIST_HEAD(&devlink_port->reporter_list);
1019 err = xa_insert(&devlink->ports, port_index, devlink_port, GFP_KERNEL);
1021 devlink_port->registered = false;
1025 INIT_DELAYED_WORK(&devlink_port->type_warn_dw, &devlink_port_type_warn);
1026 devlink_port_type_warn_schedule(devlink_port);
1027 devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
1036 * @devlink_port: devlink port
1041 * any indexing, even hw-related one. devlink_port structure
1043 * Note that the caller should take care of zeroing the devlink_port
1049 struct devlink_port *devlink_port,
1056 err = devl_port_register_with_ops(devlink, devlink_port,
1066 * @devlink_port: devlink port
1068 void devl_port_unregister(struct devlink_port *devlink_port)
1070 lockdep_assert_held(&devlink_port->devlink->lock);
1071 WARN_ON(devlink_port->type != DEVLINK_PORT_TYPE_NOTSET);
1073 devlink_port_type_warn_cancel(devlink_port);
1074 devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_DEL);
1075 xa_erase(&devlink_port->devlink->ports, devlink_port->index);
1076 WARN_ON(!list_empty(&devlink_port->reporter_list));
1077 devlink_port->registered = false;
1084 * @devlink_port: devlink port
1088 void devlink_port_unregister(struct devlink_port *devlink_port)
1090 struct devlink *devlink = devlink_port->devlink;
1093 devl_port_unregister(devlink_port);
1098 static void devlink_port_type_netdev_checks(struct devlink_port *devlink_port,
1109 * that have devlink_port registered and also for
1122 * that have devlink_port registered and also for
1135 static void __devlink_port_type_set(struct devlink_port *devlink_port,
1141 ASSERT_DEVLINK_PORT_REGISTERED(devlink_port);
1144 devlink_port_type_warn_schedule(devlink_port);
1146 devlink_port_type_warn_cancel(devlink_port);
1148 devlink_port_type_netdev_checks(devlink_port, netdev);
1151 spin_lock_bh(&devlink_port->type_lock);
1152 devlink_port->type = type;
1155 devlink_port->type_eth.netdev = netdev;
1158 devlink_port->type_eth.ifindex = netdev->ifindex;
1159 BUILD_BUG_ON(sizeof(devlink_port->type_eth.ifname) !=
1161 strcpy(devlink_port->type_eth.ifname, netdev->name);
1165 devlink_port->type_ib.ibdev = type_dev;
1170 spin_unlock_bh(&devlink_port->type_lock);
1171 devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
1177 * @devlink_port: devlink port
1181 void devlink_port_type_eth_set(struct devlink_port *devlink_port)
1183 dev_warn(devlink_port->devlink->dev,
1185 devlink_port->index);
1186 __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH, NULL);
1193 * @devlink_port: devlink port
1196 void devlink_port_type_ib_set(struct devlink_port *devlink_port,
1199 __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_IB, ibdev);
1206 * @devlink_port: devlink port
1211 void devlink_port_type_clear(struct devlink_port *devlink_port)
1213 if (devlink_port->type == DEVLINK_PORT_TYPE_ETH)
1214 dev_warn(devlink_port->devlink->dev,
1216 devlink_port->index);
1217 __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_NOTSET, NULL);
1225 struct devlink_port *devlink_port = netdev->devlink_port;
1228 if (!devlink_port)
1230 devlink = devlink_port->devlink;
1238 __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_ETH,
1250 __devlink_port_type_set(devlink_port, devlink_port->type,
1260 __devlink_port_type_set(devlink_port, devlink_port->type,
1267 __devlink_port_type_set(devlink_port, DEVLINK_PORT_TYPE_NOTSET,
1275 static int __devlink_port_attrs_set(struct devlink_port *devlink_port,
1278 struct devlink_port_attrs *attrs = &devlink_port->attrs;
1280 devlink_port->attrs_set = true;
1283 devlink_port->switch_port = true;
1287 devlink_port->switch_port = false;
1295 * @devlink_port: devlink port
1298 void devlink_port_attrs_set(struct devlink_port *devlink_port,
1303 ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1305 devlink_port->attrs = *attrs;
1306 ret = __devlink_port_attrs_set(devlink_port, attrs->flavour);
1316 * @devlink_port: devlink port
1321 void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u32 controller,
1324 struct devlink_port_attrs *attrs = &devlink_port->attrs;
1327 ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1329 ret = __devlink_port_attrs_set(devlink_port,
1342 * @devlink_port: devlink port
1348 void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 controller,
1351 struct devlink_port_attrs *attrs = &devlink_port->attrs;
1354 ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1356 ret = __devlink_port_attrs_set(devlink_port,
1370 * @devlink_port: devlink port
1376 void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port, u32 controller,
1379 struct devlink_port_attrs *attrs = &devlink_port->attrs;
1382 ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1384 ret = __devlink_port_attrs_set(devlink_port,
1398 * @devlink_port: devlink port
1401 void devlink_port_linecard_set(struct devlink_port *devlink_port,
1404 ASSERT_DEVLINK_PORT_NOT_REGISTERED(devlink_port);
1406 devlink_port->linecard = linecard;
1410 static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
1413 struct devlink_port_attrs *attrs = &devlink_port->attrs;
1416 if (!devlink_port->attrs_set)
1421 if (devlink_port->linecard)
1423 devlink_port->linecard->index);
1484 struct devlink_port *devlink_port;
1486 /* RTNL mutex is held here which ensures that devlink_port
1492 devlink_port = dev->devlink_port;
1493 if (!devlink_port)
1496 return __devlink_port_phys_port_name_get(devlink_port, name, len);
1502 struct devlink_port *devlink_port;
1505 * devlink_port instance cannot disappear in the middle. No need to take
1508 devlink_port = dev->devlink_port;
1509 if (!devlink_port || !devlink_port->switch_port)
1512 memcpy(ppid, &devlink_port->attrs.switch_id, sizeof(*ppid));