sysfs.c (879f99ef2c4c05d9a7f0a67a05f1415663119825) sysfs.c (65fed8a8c155271cf647651bd62eecb5928ae3a4)
1/*
2 * Copyright (c) 2012 Mellanox Technologies. All rights reserved.
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:

--- 375 unchanged lines hidden (view full) ---

384 sprintf(name, "%s%.2d.%d", base_name, (i/8), (i%8));
385}
386
387struct mlx4_port {
388 struct kobject kobj;
389 struct mlx4_ib_dev *dev;
390 struct attribute_group pkey_group;
391 struct attribute_group gid_group;
1/*
2 * Copyright (c) 2012 Mellanox Technologies. All rights reserved.
3 *
4 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:

--- 375 unchanged lines hidden (view full) ---

384 sprintf(name, "%s%.2d.%d", base_name, (i/8), (i%8));
385}
386
387struct mlx4_port {
388 struct kobject kobj;
389 struct mlx4_ib_dev *dev;
390 struct attribute_group pkey_group;
391 struct attribute_group gid_group;
392 u8 port_num;
392 struct device_attribute enable_smi_admin;
393 struct device_attribute smi_enabled;
393 int slave;
394 int slave;
395 u8 port_num;
394};
395
396
397static void mlx4_port_release(struct kobject *kobj)
398{
399 struct mlx4_port *p = container_of(kobj, struct mlx4_port, kobj);
400 struct attribute *a;
401 int i;

--- 151 unchanged lines hidden (view full) ---

553
554err:
555 while (--i >= 0)
556 kfree(tab_attr[i]);
557 kfree(tab_attr);
558 return NULL;
559}
560
396};
397
398
399static void mlx4_port_release(struct kobject *kobj)
400{
401 struct mlx4_port *p = container_of(kobj, struct mlx4_port, kobj);
402 struct attribute *a;
403 int i;

--- 151 unchanged lines hidden (view full) ---

555
556err:
557 while (--i >= 0)
558 kfree(tab_attr[i]);
559 kfree(tab_attr);
560 return NULL;
561}
562
563static ssize_t sysfs_show_smi_enabled(struct device *dev,
564 struct device_attribute *attr, char *buf)
565{
566 struct mlx4_port *p =
567 container_of(attr, struct mlx4_port, smi_enabled);
568 ssize_t len = 0;
569
570 if (mlx4_vf_smi_enabled(p->dev->dev, p->slave, p->port_num))
571 len = sprintf(buf, "%d\n", 1);
572 else
573 len = sprintf(buf, "%d\n", 0);
574
575 return len;
576}
577
578static ssize_t sysfs_show_enable_smi_admin(struct device *dev,
579 struct device_attribute *attr,
580 char *buf)
581{
582 struct mlx4_port *p =
583 container_of(attr, struct mlx4_port, enable_smi_admin);
584 ssize_t len = 0;
585
586 if (mlx4_vf_get_enable_smi_admin(p->dev->dev, p->slave, p->port_num))
587 len = sprintf(buf, "%d\n", 1);
588 else
589 len = sprintf(buf, "%d\n", 0);
590
591 return len;
592}
593
594static ssize_t sysfs_store_enable_smi_admin(struct device *dev,
595 struct device_attribute *attr,
596 const char *buf, size_t count)
597{
598 struct mlx4_port *p =
599 container_of(attr, struct mlx4_port, enable_smi_admin);
600 int enable;
601
602 if (sscanf(buf, "%i", &enable) != 1 ||
603 enable < 0 || enable > 1)
604 return -EINVAL;
605
606 if (mlx4_vf_set_enable_smi_admin(p->dev->dev, p->slave, p->port_num, enable))
607 return -EINVAL;
608 return count;
609}
610
611static int add_vf_smi_entries(struct mlx4_port *p)
612{
613 int is_eth = rdma_port_get_link_layer(&p->dev->ib_dev, p->port_num) ==
614 IB_LINK_LAYER_ETHERNET;
615 int ret;
616
617 /* do not display entries if eth transport, or if master */
618 if (is_eth || p->slave == mlx4_master_func_num(p->dev->dev))
619 return 0;
620
621 sysfs_attr_init(&p->smi_enabled.attr);
622 p->smi_enabled.show = sysfs_show_smi_enabled;
623 p->smi_enabled.store = NULL;
624 p->smi_enabled.attr.name = "smi_enabled";
625 p->smi_enabled.attr.mode = 0444;
626 ret = sysfs_create_file(&p->kobj, &p->smi_enabled.attr);
627 if (ret) {
628 pr_err("failed to create smi_enabled\n");
629 return ret;
630 }
631
632 sysfs_attr_init(&p->enable_smi_admin.attr);
633 p->enable_smi_admin.show = sysfs_show_enable_smi_admin;
634 p->enable_smi_admin.store = sysfs_store_enable_smi_admin;
635 p->enable_smi_admin.attr.name = "enable_smi_admin";
636 p->enable_smi_admin.attr.mode = 0644;
637 ret = sysfs_create_file(&p->kobj, &p->enable_smi_admin.attr);
638 if (ret) {
639 pr_err("failed to create enable_smi_admin\n");
640 sysfs_remove_file(&p->kobj, &p->smi_enabled.attr);
641 return ret;
642 }
643 return 0;
644}
645
646static void remove_vf_smi_entries(struct mlx4_port *p)
647{
648 int is_eth = rdma_port_get_link_layer(&p->dev->ib_dev, p->port_num) ==
649 IB_LINK_LAYER_ETHERNET;
650
651 if (is_eth || p->slave == mlx4_master_func_num(p->dev->dev))
652 return;
653
654 sysfs_remove_file(&p->kobj, &p->smi_enabled.attr);
655 sysfs_remove_file(&p->kobj, &p->enable_smi_admin.attr);
656}
657
561static int add_port(struct mlx4_ib_dev *dev, int port_num, int slave)
562{
563 struct mlx4_port *p;
564 int i;
565 int ret;
566
567 p = kzalloc(sizeof *p, GFP_KERNEL);
568 if (!p)

--- 28 unchanged lines hidden (view full) ---

597 ret = -ENOMEM;
598 goto err_free_pkey;
599 }
600
601 ret = sysfs_create_group(&p->kobj, &p->gid_group);
602 if (ret)
603 goto err_free_gid;
604
658static int add_port(struct mlx4_ib_dev *dev, int port_num, int slave)
659{
660 struct mlx4_port *p;
661 int i;
662 int ret;
663
664 p = kzalloc(sizeof *p, GFP_KERNEL);
665 if (!p)

--- 28 unchanged lines hidden (view full) ---

694 ret = -ENOMEM;
695 goto err_free_pkey;
696 }
697
698 ret = sysfs_create_group(&p->kobj, &p->gid_group);
699 if (ret)
700 goto err_free_gid;
701
702 ret = add_vf_smi_entries(p);
703 if (ret)
704 goto err_free_gid;
705
605 list_add_tail(&p->kobj.entry, &dev->pkeys.pkey_port_list[slave]);
606 return 0;
607
608err_free_gid:
609 kfree(p->gid_group.attrs[0]);
610 kfree(p->gid_group.attrs);
611
612err_free_pkey:

--- 51 unchanged lines hidden (view full) ---

664err_add:
665 list_for_each_entry_safe(p, t,
666 &dev->pkeys.pkey_port_list[slave],
667 entry) {
668 list_del(&p->entry);
669 mport = container_of(p, struct mlx4_port, kobj);
670 sysfs_remove_group(p, &mport->pkey_group);
671 sysfs_remove_group(p, &mport->gid_group);
706 list_add_tail(&p->kobj.entry, &dev->pkeys.pkey_port_list[slave]);
707 return 0;
708
709err_free_gid:
710 kfree(p->gid_group.attrs[0]);
711 kfree(p->gid_group.attrs);
712
713err_free_pkey:

--- 51 unchanged lines hidden (view full) ---

765err_add:
766 list_for_each_entry_safe(p, t,
767 &dev->pkeys.pkey_port_list[slave],
768 entry) {
769 list_del(&p->entry);
770 mport = container_of(p, struct mlx4_port, kobj);
771 sysfs_remove_group(p, &mport->pkey_group);
772 sysfs_remove_group(p, &mport->gid_group);
773 remove_vf_smi_entries(mport);
672 kobject_put(p);
673 }
674 kobject_put(dev->dev_ports_parent[slave]);
675
676err_ports:
677 kobject_put(dev->pkeys.device_parent[slave]);
678 /* extra put for the device_parent create_and_add */
679 kobject_put(dev->pkeys.device_parent[slave]);

--- 28 unchanged lines hidden (view full) ---

708 for (slave = device->dev->num_vfs; slave >= 0; --slave) {
709 list_for_each_entry_safe(p, t,
710 &device->pkeys.pkey_port_list[slave],
711 entry) {
712 list_del(&p->entry);
713 port = container_of(p, struct mlx4_port, kobj);
714 sysfs_remove_group(p, &port->pkey_group);
715 sysfs_remove_group(p, &port->gid_group);
774 kobject_put(p);
775 }
776 kobject_put(dev->dev_ports_parent[slave]);
777
778err_ports:
779 kobject_put(dev->pkeys.device_parent[slave]);
780 /* extra put for the device_parent create_and_add */
781 kobject_put(dev->pkeys.device_parent[slave]);

--- 28 unchanged lines hidden (view full) ---

810 for (slave = device->dev->num_vfs; slave >= 0; --slave) {
811 list_for_each_entry_safe(p, t,
812 &device->pkeys.pkey_port_list[slave],
813 entry) {
814 list_del(&p->entry);
815 port = container_of(p, struct mlx4_port, kobj);
816 sysfs_remove_group(p, &port->pkey_group);
817 sysfs_remove_group(p, &port->gid_group);
818 remove_vf_smi_entries(port);
716 kobject_put(p);
717 kobject_put(device->dev_ports_parent[slave]);
718 }
719 kobject_put(device->dev_ports_parent[slave]);
720 kobject_put(device->pkeys.device_parent[slave]);
721 kobject_put(device->pkeys.device_parent[slave]);
722 kobject_put(device->iov_parent);
723 }

--- 80 unchanged lines hidden ---
819 kobject_put(p);
820 kobject_put(device->dev_ports_parent[slave]);
821 }
822 kobject_put(device->dev_ports_parent[slave]);
823 kobject_put(device->pkeys.device_parent[slave]);
824 kobject_put(device->pkeys.device_parent[slave]);
825 kobject_put(device->iov_parent);
826 }

--- 80 unchanged lines hidden ---