37 #include <linux/slab.h>
38 #include <linux/stat.h>
39 #include <linux/string.h>
58 #define PORT_ATTR(_name, _mode, _show, _store) \
59 struct port_attribute port_attr_##_name = __ATTR(_name, _mode, _show, _store)
61 #define PORT_ATTR_RO(_name) \
62 struct port_attribute port_attr_##_name = __ATTR_RO(_name)
80 return port_attr->
show(p, port_attr, buf);
83 static const struct sysfs_ops port_sysfs_ops = {
84 .show = port_attr_show
93 static const char *state_name[] = {
108 state_name[
attr.state] :
"UNKNOWN");
174 return sprintf(buf,
"0x%08x\n",
attr.port_cap_flags);
189 switch (
attr.active_speed) {
216 rate *= ib_width_enum_to_int(
attr.active_width);
220 return sprintf(buf,
"%d%s Gb/sec (%dX%s)\n",
221 rate / 10, rate % 10 ?
".5" :
"",
222 ib_width_enum_to_int(
attr.active_width), speed);
236 switch (
attr.phys_state) {
237 case 1:
return sprintf(buf,
"1: Sleep\n");
238 case 2:
return sprintf(buf,
"2: Polling\n");
239 case 3:
return sprintf(buf,
"3: Disabled\n");
240 case 4:
return sprintf(buf,
"4: PortConfigurationTraining\n");
241 case 5:
return sprintf(buf,
"5: LinkUp\n");
242 case 6:
return sprintf(buf,
"6: LinkErrorRecovery\n");
243 case 7:
return sprintf(buf,
"7: Phy Test\n");
244 default:
return sprintf(buf,
"%d: <unknown>\n",
attr.phys_state);
253 return sprintf(buf,
"%s\n",
"InfiniBand");
255 return sprintf(buf,
"%s\n",
"Ethernet");
257 return sprintf(buf,
"%s\n",
"Unknown");
271 static struct attribute *port_default_attrs[] = {
272 &port_attr_state.attr,
274 &port_attr_lid_mask_count.attr,
275 &port_attr_sm_lid.attr,
276 &port_attr_sm_sl.attr,
277 &port_attr_cap_mask.attr,
278 &port_attr_rate.attr,
279 &port_attr_phys_state.attr,
280 &port_attr_link_layer.attr,
311 return sprintf(buf,
"0x%04x\n", pkey);
314 #define PORT_PMA_ATTR(_name, _counter, _width, _offset) \
315 struct port_table_attribute port_pma_attr_##_name = { \
316 .attr = __ATTR(_name, S_IRUGO, show_pma_counter, NULL), \
317 .index = (_offset) | ((_width) << 16) | ((_counter) << 24) \
331 if (!p->
ibdev->process_mad)
332 return sprintf(buf,
"N/A (no PMA)\n");
336 if (!in_mad || !out_mad) {
341 in_mad->
mad_hdr.base_version = 1;
343 in_mad->
mad_hdr.class_version = 1;
359 ret =
sprintf(buf,
"%u\n", (out_mad->
data[40 + offset / 8] >>
360 (4 - (offset % 8))) & 0xf);
363 ret =
sprintf(buf,
"%u\n", out_mad->
data[40 + offset / 8]);
388 static PORT_PMA_ATTR(port_rcv_remote_physical_errors, 4, 16, 80);
393 static PORT_PMA_ATTR(local_link_integrity_errors , 9, 4, 152);
394 static PORT_PMA_ATTR(excessive_buffer_overrun_errors, 10, 4, 156);
402 &port_pma_attr_symbol_error.attr.attr,
403 &port_pma_attr_link_error_recovery.attr.attr,
404 &port_pma_attr_link_downed.attr.attr,
405 &port_pma_attr_port_rcv_errors.attr.attr,
406 &port_pma_attr_port_rcv_remote_physical_errors.attr.attr,
407 &port_pma_attr_port_rcv_switch_relay_errors.attr.attr,
408 &port_pma_attr_port_xmit_discards.attr.attr,
409 &port_pma_attr_port_xmit_constraint_errors.attr.attr,
410 &port_pma_attr_port_rcv_constraint_errors.attr.attr,
411 &port_pma_attr_local_link_integrity_errors.attr.attr,
412 &port_pma_attr_excessive_buffer_overrun_errors.attr.attr,
413 &port_pma_attr_VL15_dropped.attr.attr,
414 &port_pma_attr_port_xmit_data.attr.attr,
415 &port_pma_attr_port_rcv_data.attr.attr,
416 &port_pma_attr_port_xmit_packets.attr.attr,
417 &port_pma_attr_port_rcv_packets.attr.attr,
426 static void ib_port_release(
struct kobject *kobj)
447 .sysfs_ops = &port_sysfs_ops,
448 .default_attrs = port_default_attrs
486 for (i = 0; i < len; i++) {
493 "%d", i) >=
sizeof(element->
name)) {
498 element->
attr.attr.name = element->
name;
504 tab_attr[
i] = &element->
attr.attr;
547 p->
gid_group.attrs = alloc_group_attrs(show_port_gid, attr.gid_tbl_len);
556 p->
pkey_group.attrs = alloc_group_attrs(show_port_pkey,
566 ret = port_callback(device, port_num, &p->
kobj);
568 goto err_remove_pkey;
580 for (i = 0; i < attr.pkey_tbl_len; ++
i)
589 for (i = 0; i < attr.gid_tbl_len; ++
i)
603 static ssize_t show_node_type(
struct device *device,
617 static ssize_t show_sys_image_guid(
struct device *device,
628 return sprintf(buf,
"%04x:%04x:%04x:%04x\n",
635 static ssize_t show_node_guid(
struct device *device,
640 return sprintf(buf,
"%04x:%04x:%04x:%04x\n",
647 static ssize_t show_node_desc(
struct device *device,
655 static ssize_t set_node_desc(
struct device *device,
657 const char *buf,
size_t count)
681 &dev_attr_sys_image_guid,
686 static struct class ib_class = {
687 .name =
"infiniband",
688 .dev_release = ib_device_release,
689 .dev_uevent = ib_device_uevent,
693 static ssize_t show_protocol_stat(
const struct device *device,
706 (
unsigned long long) ((
u64 *) &
stats)[offset]);
710 #define IW_STATS_ENTRY(name) \
711 static ssize_t show_##name(struct device *device, \
712 struct device_attribute *attr, char *buf) \
714 return show_protocol_stat(device, attr, buf, \
715 offsetof(struct iw_protocol_stats, name) / \
718 static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL)
759 static struct attribute *iw_proto_stats_attrs[] = {
760 &dev_attr_ipInReceives.attr,
761 &dev_attr_ipInHdrErrors.attr,
762 &dev_attr_ipInTooBigErrors.attr,
763 &dev_attr_ipInNoRoutes.attr,
764 &dev_attr_ipInAddrErrors.attr,
765 &dev_attr_ipInUnknownProtos.attr,
766 &dev_attr_ipInTruncatedPkts.attr,
767 &dev_attr_ipInDiscards.attr,
768 &dev_attr_ipInDelivers.attr,
769 &dev_attr_ipOutForwDatagrams.attr,
770 &dev_attr_ipOutRequests.attr,
771 &dev_attr_ipOutDiscards.attr,
772 &dev_attr_ipOutNoRoutes.attr,
773 &dev_attr_ipReasmTimeout.attr,
774 &dev_attr_ipReasmReqds.attr,
775 &dev_attr_ipReasmOKs.attr,
776 &dev_attr_ipReasmFails.attr,
777 &dev_attr_ipFragOKs.attr,
778 &dev_attr_ipFragFails.attr,
779 &dev_attr_ipFragCreates.attr,
780 &dev_attr_ipInMcastPkts.attr,
781 &dev_attr_ipOutMcastPkts.attr,
782 &dev_attr_ipInBcastPkts.attr,
783 &dev_attr_ipOutBcastPkts.attr,
784 &dev_attr_tcpRtoAlgorithm.attr,
785 &dev_attr_tcpRtoMin.attr,
786 &dev_attr_tcpRtoMax.attr,
787 &dev_attr_tcpMaxConn.attr,
788 &dev_attr_tcpActiveOpens.attr,
789 &dev_attr_tcpPassiveOpens.attr,
790 &dev_attr_tcpAttemptFails.attr,
791 &dev_attr_tcpEstabResets.attr,
792 &dev_attr_tcpCurrEstab.attr,
793 &dev_attr_tcpInSegs.attr,
794 &dev_attr_tcpOutSegs.attr,
795 &dev_attr_tcpRetransSegs.attr,
796 &dev_attr_tcpInErrs.attr,
797 &dev_attr_tcpOutRsts.attr,
802 .name =
"proto_stats",
803 .attrs = iw_proto_stats_attrs,
810 struct device *class_dev = &device->
dev;
814 class_dev->
class = &ib_class;
825 for (i = 0; i <
ARRAY_SIZE(ib_class_attributes); ++
i) {
839 ret = add_port(device, 0, port_callback);
844 ret = add_port(device, i, port_callback);