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 --- |