qib_sysfs.c (20380B)
1/* 2 * Copyright (c) 2012 Intel Corporation. All rights reserved. 3 * Copyright (c) 2006 - 2012 QLogic Corporation. All rights reserved. 4 * Copyright (c) 2006 PathScale, Inc. All rights reserved. 5 * 6 * This software is available to you under a choice of one of two 7 * licenses. You may choose to be licensed under the terms of the GNU 8 * General Public License (GPL) Version 2, available from the file 9 * COPYING in the main directory of this source tree, or the 10 * OpenIB.org BSD license below: 11 * 12 * Redistribution and use in source and binary forms, with or 13 * without modification, are permitted provided that the following 14 * conditions are met: 15 * 16 * - Redistributions of source code must retain the above 17 * copyright notice, this list of conditions and the following 18 * disclaimer. 19 * 20 * - Redistributions in binary form must reproduce the above 21 * copyright notice, this list of conditions and the following 22 * disclaimer in the documentation and/or other materials 23 * provided with the distribution. 24 * 25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 32 * SOFTWARE. 33 */ 34#include <linux/ctype.h> 35#include <rdma/ib_sysfs.h> 36 37#include "qib.h" 38#include "qib_mad.h" 39 40static struct qib_pportdata *qib_get_pportdata_kobj(struct kobject *kobj) 41{ 42 u32 port_num; 43 struct ib_device *ibdev = ib_port_sysfs_get_ibdev_kobj(kobj, &port_num); 44 struct qib_devdata *dd = dd_from_ibdev(ibdev); 45 46 return &dd->pport[port_num - 1]; 47} 48 49/* 50 * Get/Set heartbeat enable. OR of 1=enabled, 2=auto 51 */ 52static ssize_t hrtbt_enable_show(struct ib_device *ibdev, u32 port_num, 53 struct ib_port_attribute *attr, char *buf) 54{ 55 struct qib_devdata *dd = dd_from_ibdev(ibdev); 56 struct qib_pportdata *ppd = &dd->pport[port_num - 1]; 57 58 return sysfs_emit(buf, "%d\n", dd->f_get_ib_cfg(ppd, QIB_IB_CFG_HRTBT)); 59} 60 61static ssize_t hrtbt_enable_store(struct ib_device *ibdev, u32 port_num, 62 struct ib_port_attribute *attr, 63 const char *buf, size_t count) 64{ 65 struct qib_devdata *dd = dd_from_ibdev(ibdev); 66 struct qib_pportdata *ppd = &dd->pport[port_num - 1]; 67 int ret; 68 u16 val; 69 70 ret = kstrtou16(buf, 0, &val); 71 if (ret) { 72 qib_dev_err(dd, "attempt to set invalid Heartbeat enable\n"); 73 return ret; 74 } 75 76 /* 77 * Set the "intentional" heartbeat enable per either of 78 * "Enable" and "Auto", as these are normally set together. 79 * This bit is consulted when leaving loopback mode, 80 * because entering loopback mode overrides it and automatically 81 * disables heartbeat. 82 */ 83 ret = dd->f_set_ib_cfg(ppd, QIB_IB_CFG_HRTBT, val); 84 return ret < 0 ? ret : count; 85} 86static IB_PORT_ATTR_RW(hrtbt_enable); 87 88static ssize_t loopback_store(struct ib_device *ibdev, u32 port_num, 89 struct ib_port_attribute *attr, const char *buf, 90 size_t count) 91{ 92 struct qib_devdata *dd = dd_from_ibdev(ibdev); 93 struct qib_pportdata *ppd = &dd->pport[port_num - 1]; 94 int ret = count, r; 95 96 r = dd->f_set_ib_loopback(ppd, buf); 97 if (r < 0) 98 ret = r; 99 100 return ret; 101} 102static IB_PORT_ATTR_WO(loopback); 103 104static ssize_t led_override_store(struct ib_device *ibdev, u32 port_num, 105 struct ib_port_attribute *attr, 106 const char *buf, size_t count) 107{ 108 struct qib_devdata *dd = dd_from_ibdev(ibdev); 109 struct qib_pportdata *ppd = &dd->pport[port_num - 1]; 110 int ret; 111 u16 val; 112 113 ret = kstrtou16(buf, 0, &val); 114 if (ret) { 115 qib_dev_err(dd, "attempt to set invalid LED override\n"); 116 return ret; 117 } 118 119 qib_set_led_override(ppd, val); 120 return count; 121} 122static IB_PORT_ATTR_WO(led_override); 123 124static ssize_t status_show(struct ib_device *ibdev, u32 port_num, 125 struct ib_port_attribute *attr, char *buf) 126{ 127 struct qib_devdata *dd = dd_from_ibdev(ibdev); 128 struct qib_pportdata *ppd = &dd->pport[port_num - 1]; 129 130 if (!ppd->statusp) 131 return -EINVAL; 132 133 return sysfs_emit(buf, "0x%llx\n", (unsigned long long)*(ppd->statusp)); 134} 135static IB_PORT_ATTR_RO(status); 136 137/* 138 * For userland compatibility, these offsets must remain fixed. 139 * They are strings for QIB_STATUS_* 140 */ 141static const char * const qib_status_str[] = { 142 "Initted", 143 "", 144 "", 145 "", 146 "", 147 "Present", 148 "IB_link_up", 149 "IB_configured", 150 "", 151 "Fatal_Hardware_Error", 152 NULL, 153}; 154 155static ssize_t status_str_show(struct ib_device *ibdev, u32 port_num, 156 struct ib_port_attribute *attr, char *buf) 157{ 158 struct qib_devdata *dd = dd_from_ibdev(ibdev); 159 struct qib_pportdata *ppd = &dd->pport[port_num - 1]; 160 int i, any; 161 u64 s; 162 ssize_t ret; 163 164 if (!ppd->statusp) { 165 ret = -EINVAL; 166 goto bail; 167 } 168 169 s = *(ppd->statusp); 170 *buf = '\0'; 171 for (any = i = 0; s && qib_status_str[i]; i++) { 172 if (s & 1) { 173 /* if overflow */ 174 if (any && strlcat(buf, " ", PAGE_SIZE) >= PAGE_SIZE) 175 break; 176 if (strlcat(buf, qib_status_str[i], PAGE_SIZE) >= 177 PAGE_SIZE) 178 break; 179 any = 1; 180 } 181 s >>= 1; 182 } 183 if (any) 184 strlcat(buf, "\n", PAGE_SIZE); 185 186 ret = strlen(buf); 187 188bail: 189 return ret; 190} 191static IB_PORT_ATTR_RO(status_str); 192 193/* end of per-port functions */ 194 195static struct attribute *port_linkcontrol_attributes[] = { 196 &ib_port_attr_loopback.attr, 197 &ib_port_attr_led_override.attr, 198 &ib_port_attr_hrtbt_enable.attr, 199 &ib_port_attr_status.attr, 200 &ib_port_attr_status_str.attr, 201 NULL 202}; 203 204static const struct attribute_group port_linkcontrol_group = { 205 .name = "linkcontrol", 206 .attrs = port_linkcontrol_attributes, 207}; 208 209/* 210 * Start of per-port congestion control structures and support code 211 */ 212 213/* 214 * Congestion control table size followed by table entries 215 */ 216static ssize_t cc_table_bin_read(struct file *filp, struct kobject *kobj, 217 struct bin_attribute *bin_attr, char *buf, 218 loff_t pos, size_t count) 219{ 220 struct qib_pportdata *ppd = qib_get_pportdata_kobj(kobj); 221 int ret; 222 223 if (!qib_cc_table_size || !ppd->ccti_entries_shadow) 224 return -EINVAL; 225 226 ret = ppd->total_cct_entry * sizeof(struct ib_cc_table_entry_shadow) 227 + sizeof(__be16); 228 229 if (pos > ret) 230 return -EINVAL; 231 232 if (count > ret - pos) 233 count = ret - pos; 234 235 if (!count) 236 return count; 237 238 spin_lock(&ppd->cc_shadow_lock); 239 memcpy(buf, ppd->ccti_entries_shadow, count); 240 spin_unlock(&ppd->cc_shadow_lock); 241 242 return count; 243} 244static BIN_ATTR_RO(cc_table_bin, PAGE_SIZE); 245 246/* 247 * Congestion settings: port control, control map and an array of 16 248 * entries for the congestion entries - increase, timer, event log 249 * trigger threshold and the minimum injection rate delay. 250 */ 251static ssize_t cc_setting_bin_read(struct file *filp, struct kobject *kobj, 252 struct bin_attribute *bin_attr, char *buf, 253 loff_t pos, size_t count) 254{ 255 struct qib_pportdata *ppd = qib_get_pportdata_kobj(kobj); 256 int ret; 257 258 if (!qib_cc_table_size || !ppd->congestion_entries_shadow) 259 return -EINVAL; 260 261 ret = sizeof(struct ib_cc_congestion_setting_attr_shadow); 262 263 if (pos > ret) 264 return -EINVAL; 265 if (count > ret - pos) 266 count = ret - pos; 267 268 if (!count) 269 return count; 270 271 spin_lock(&ppd->cc_shadow_lock); 272 memcpy(buf, ppd->congestion_entries_shadow, count); 273 spin_unlock(&ppd->cc_shadow_lock); 274 275 return count; 276} 277static BIN_ATTR_RO(cc_setting_bin, PAGE_SIZE); 278 279static struct bin_attribute *port_ccmgta_attributes[] = { 280 &bin_attr_cc_setting_bin, 281 &bin_attr_cc_table_bin, 282 NULL, 283}; 284 285static umode_t qib_ccmgta_is_bin_visible(struct kobject *kobj, 286 struct bin_attribute *attr, int n) 287{ 288 struct qib_pportdata *ppd = qib_get_pportdata_kobj(kobj); 289 290 if (!qib_cc_table_size || !ppd->congestion_entries_shadow) 291 return 0; 292 return attr->attr.mode; 293} 294 295static const struct attribute_group port_ccmgta_attribute_group = { 296 .name = "CCMgtA", 297 .is_bin_visible = qib_ccmgta_is_bin_visible, 298 .bin_attrs = port_ccmgta_attributes, 299}; 300 301/* Start sl2vl */ 302 303struct qib_sl2vl_attr { 304 struct ib_port_attribute attr; 305 int sl; 306}; 307 308static ssize_t sl2vl_attr_show(struct ib_device *ibdev, u32 port_num, 309 struct ib_port_attribute *attr, char *buf) 310{ 311 struct qib_sl2vl_attr *sattr = 312 container_of(attr, struct qib_sl2vl_attr, attr); 313 struct qib_devdata *dd = dd_from_ibdev(ibdev); 314 struct qib_ibport *qibp = &dd->pport[port_num - 1].ibport_data; 315 316 return sysfs_emit(buf, "%u\n", qibp->sl_to_vl[sattr->sl]); 317} 318 319#define QIB_SL2VL_ATTR(N) \ 320 static struct qib_sl2vl_attr qib_sl2vl_attr_##N = { \ 321 .attr = __ATTR(N, 0444, sl2vl_attr_show, NULL), \ 322 .sl = N, \ 323 } 324 325QIB_SL2VL_ATTR(0); 326QIB_SL2VL_ATTR(1); 327QIB_SL2VL_ATTR(2); 328QIB_SL2VL_ATTR(3); 329QIB_SL2VL_ATTR(4); 330QIB_SL2VL_ATTR(5); 331QIB_SL2VL_ATTR(6); 332QIB_SL2VL_ATTR(7); 333QIB_SL2VL_ATTR(8); 334QIB_SL2VL_ATTR(9); 335QIB_SL2VL_ATTR(10); 336QIB_SL2VL_ATTR(11); 337QIB_SL2VL_ATTR(12); 338QIB_SL2VL_ATTR(13); 339QIB_SL2VL_ATTR(14); 340QIB_SL2VL_ATTR(15); 341 342static struct attribute *port_sl2vl_attributes[] = { 343 &qib_sl2vl_attr_0.attr.attr, 344 &qib_sl2vl_attr_1.attr.attr, 345 &qib_sl2vl_attr_2.attr.attr, 346 &qib_sl2vl_attr_3.attr.attr, 347 &qib_sl2vl_attr_4.attr.attr, 348 &qib_sl2vl_attr_5.attr.attr, 349 &qib_sl2vl_attr_6.attr.attr, 350 &qib_sl2vl_attr_7.attr.attr, 351 &qib_sl2vl_attr_8.attr.attr, 352 &qib_sl2vl_attr_9.attr.attr, 353 &qib_sl2vl_attr_10.attr.attr, 354 &qib_sl2vl_attr_11.attr.attr, 355 &qib_sl2vl_attr_12.attr.attr, 356 &qib_sl2vl_attr_13.attr.attr, 357 &qib_sl2vl_attr_14.attr.attr, 358 &qib_sl2vl_attr_15.attr.attr, 359 NULL 360}; 361 362static const struct attribute_group port_sl2vl_group = { 363 .name = "sl2vl", 364 .attrs = port_sl2vl_attributes, 365}; 366 367/* End sl2vl */ 368 369/* Start diag_counters */ 370 371struct qib_diagc_attr { 372 struct ib_port_attribute attr; 373 size_t counter; 374}; 375 376static ssize_t diagc_attr_show(struct ib_device *ibdev, u32 port_num, 377 struct ib_port_attribute *attr, char *buf) 378{ 379 struct qib_diagc_attr *dattr = 380 container_of(attr, struct qib_diagc_attr, attr); 381 struct qib_devdata *dd = dd_from_ibdev(ibdev); 382 struct qib_ibport *qibp = &dd->pport[port_num - 1].ibport_data; 383 384 return sysfs_emit(buf, "%llu\n", *((u64 *)qibp + dattr->counter)); 385} 386 387static ssize_t diagc_attr_store(struct ib_device *ibdev, u32 port_num, 388 struct ib_port_attribute *attr, const char *buf, 389 size_t count) 390{ 391 struct qib_diagc_attr *dattr = 392 container_of(attr, struct qib_diagc_attr, attr); 393 struct qib_devdata *dd = dd_from_ibdev(ibdev); 394 struct qib_ibport *qibp = &dd->pport[port_num - 1].ibport_data; 395 u64 val; 396 int ret; 397 398 ret = kstrtou64(buf, 0, &val); 399 if (ret) 400 return ret; 401 *((u64 *)qibp + dattr->counter) = val; 402 return count; 403} 404 405#define QIB_DIAGC_ATTR(N) \ 406 static_assert(__same_type(((struct qib_ibport *)0)->rvp.n_##N, u64)); \ 407 static struct qib_diagc_attr qib_diagc_attr_##N = { \ 408 .attr = __ATTR(N, 0664, diagc_attr_show, diagc_attr_store), \ 409 .counter = \ 410 offsetof(struct qib_ibport, rvp.n_##N) / sizeof(u64) \ 411 } 412 413QIB_DIAGC_ATTR(rc_resends); 414QIB_DIAGC_ATTR(seq_naks); 415QIB_DIAGC_ATTR(rdma_seq); 416QIB_DIAGC_ATTR(rnr_naks); 417QIB_DIAGC_ATTR(other_naks); 418QIB_DIAGC_ATTR(rc_timeouts); 419QIB_DIAGC_ATTR(loop_pkts); 420QIB_DIAGC_ATTR(pkt_drops); 421QIB_DIAGC_ATTR(dmawait); 422QIB_DIAGC_ATTR(unaligned); 423QIB_DIAGC_ATTR(rc_dupreq); 424QIB_DIAGC_ATTR(rc_seqnak); 425QIB_DIAGC_ATTR(rc_crwaits); 426 427static u64 get_all_cpu_total(u64 __percpu *cntr) 428{ 429 int cpu; 430 u64 counter = 0; 431 432 for_each_possible_cpu(cpu) 433 counter += *per_cpu_ptr(cntr, cpu); 434 return counter; 435} 436 437static ssize_t qib_store_per_cpu(struct qib_devdata *dd, const char *buf, 438 size_t count, u64 *zero, u64 cur) 439{ 440 u32 val; 441 int ret; 442 443 ret = kstrtou32(buf, 0, &val); 444 if (ret) 445 return ret; 446 if (val != 0) { 447 qib_dev_err(dd, "Per CPU cntrs can only be zeroed"); 448 return count; 449 } 450 *zero = cur; 451 return count; 452} 453 454static ssize_t rc_acks_show(struct ib_device *ibdev, u32 port_num, 455 struct ib_port_attribute *attr, char *buf) 456{ 457 struct qib_devdata *dd = dd_from_ibdev(ibdev); 458 struct qib_ibport *qibp = &dd->pport[port_num - 1].ibport_data; 459 460 return sysfs_emit(buf, "%llu\n", 461 get_all_cpu_total(qibp->rvp.rc_acks) - 462 qibp->rvp.z_rc_acks); 463} 464 465static ssize_t rc_acks_store(struct ib_device *ibdev, u32 port_num, 466 struct ib_port_attribute *attr, const char *buf, 467 size_t count) 468{ 469 struct qib_devdata *dd = dd_from_ibdev(ibdev); 470 struct qib_ibport *qibp = &dd->pport[port_num - 1].ibport_data; 471 472 return qib_store_per_cpu(dd, buf, count, &qibp->rvp.z_rc_acks, 473 get_all_cpu_total(qibp->rvp.rc_acks)); 474} 475static IB_PORT_ATTR_RW(rc_acks); 476 477static ssize_t rc_qacks_show(struct ib_device *ibdev, u32 port_num, 478 struct ib_port_attribute *attr, char *buf) 479{ 480 struct qib_devdata *dd = dd_from_ibdev(ibdev); 481 struct qib_ibport *qibp = &dd->pport[port_num - 1].ibport_data; 482 483 return sysfs_emit(buf, "%llu\n", 484 get_all_cpu_total(qibp->rvp.rc_qacks) - 485 qibp->rvp.z_rc_qacks); 486} 487 488static ssize_t rc_qacks_store(struct ib_device *ibdev, u32 port_num, 489 struct ib_port_attribute *attr, const char *buf, 490 size_t count) 491{ 492 struct qib_devdata *dd = dd_from_ibdev(ibdev); 493 struct qib_ibport *qibp = &dd->pport[port_num - 1].ibport_data; 494 495 return qib_store_per_cpu(dd, buf, count, &qibp->rvp.z_rc_qacks, 496 get_all_cpu_total(qibp->rvp.rc_qacks)); 497} 498static IB_PORT_ATTR_RW(rc_qacks); 499 500static ssize_t rc_delayed_comp_show(struct ib_device *ibdev, u32 port_num, 501 struct ib_port_attribute *attr, char *buf) 502{ 503 struct qib_devdata *dd = dd_from_ibdev(ibdev); 504 struct qib_ibport *qibp = &dd->pport[port_num - 1].ibport_data; 505 506 return sysfs_emit(buf, "%llu\n", 507 get_all_cpu_total(qibp->rvp.rc_delayed_comp) - 508 qibp->rvp.z_rc_delayed_comp); 509} 510 511static ssize_t rc_delayed_comp_store(struct ib_device *ibdev, u32 port_num, 512 struct ib_port_attribute *attr, 513 const char *buf, size_t count) 514{ 515 struct qib_devdata *dd = dd_from_ibdev(ibdev); 516 struct qib_ibport *qibp = &dd->pport[port_num - 1].ibport_data; 517 518 return qib_store_per_cpu(dd, buf, count, &qibp->rvp.z_rc_delayed_comp, 519 get_all_cpu_total(qibp->rvp.rc_delayed_comp)); 520} 521static IB_PORT_ATTR_RW(rc_delayed_comp); 522 523static struct attribute *port_diagc_attributes[] = { 524 &qib_diagc_attr_rc_resends.attr.attr, 525 &qib_diagc_attr_seq_naks.attr.attr, 526 &qib_diagc_attr_rdma_seq.attr.attr, 527 &qib_diagc_attr_rnr_naks.attr.attr, 528 &qib_diagc_attr_other_naks.attr.attr, 529 &qib_diagc_attr_rc_timeouts.attr.attr, 530 &qib_diagc_attr_loop_pkts.attr.attr, 531 &qib_diagc_attr_pkt_drops.attr.attr, 532 &qib_diagc_attr_dmawait.attr.attr, 533 &qib_diagc_attr_unaligned.attr.attr, 534 &qib_diagc_attr_rc_dupreq.attr.attr, 535 &qib_diagc_attr_rc_seqnak.attr.attr, 536 &qib_diagc_attr_rc_crwaits.attr.attr, 537 &ib_port_attr_rc_acks.attr, 538 &ib_port_attr_rc_qacks.attr, 539 &ib_port_attr_rc_delayed_comp.attr, 540 NULL 541}; 542 543static const struct attribute_group port_diagc_group = { 544 .name = "diag_counters", 545 .attrs = port_diagc_attributes, 546}; 547 548/* End diag_counters */ 549 550const struct attribute_group *qib_attr_port_groups[] = { 551 &port_linkcontrol_group, 552 &port_ccmgta_attribute_group, 553 &port_sl2vl_group, 554 &port_diagc_group, 555 NULL, 556}; 557 558/* end of per-port file structures and support code */ 559 560/* 561 * Start of per-unit (or driver, in some cases, but replicated 562 * per unit) functions (these get a device *) 563 */ 564static ssize_t hw_rev_show(struct device *device, struct device_attribute *attr, 565 char *buf) 566{ 567 struct qib_ibdev *dev = 568 rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); 569 570 return sysfs_emit(buf, "%x\n", dd_from_dev(dev)->minrev); 571} 572static DEVICE_ATTR_RO(hw_rev); 573 574static ssize_t hca_type_show(struct device *device, 575 struct device_attribute *attr, char *buf) 576{ 577 struct qib_ibdev *dev = 578 rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); 579 struct qib_devdata *dd = dd_from_dev(dev); 580 581 if (!dd->boardname) 582 return -EINVAL; 583 return sysfs_emit(buf, "%s\n", dd->boardname); 584} 585static DEVICE_ATTR_RO(hca_type); 586static DEVICE_ATTR(board_id, 0444, hca_type_show, NULL); 587 588static ssize_t version_show(struct device *device, 589 struct device_attribute *attr, char *buf) 590{ 591 /* The string printed here is already newline-terminated. */ 592 return sysfs_emit(buf, "%s", (char *)ib_qib_version); 593} 594static DEVICE_ATTR_RO(version); 595 596static ssize_t boardversion_show(struct device *device, 597 struct device_attribute *attr, char *buf) 598{ 599 struct qib_ibdev *dev = 600 rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); 601 struct qib_devdata *dd = dd_from_dev(dev); 602 603 /* The string printed here is already newline-terminated. */ 604 return sysfs_emit(buf, "%s", dd->boardversion); 605} 606static DEVICE_ATTR_RO(boardversion); 607 608static ssize_t localbus_info_show(struct device *device, 609 struct device_attribute *attr, char *buf) 610{ 611 struct qib_ibdev *dev = 612 rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); 613 struct qib_devdata *dd = dd_from_dev(dev); 614 615 /* The string printed here is already newline-terminated. */ 616 return sysfs_emit(buf, "%s", dd->lbus_info); 617} 618static DEVICE_ATTR_RO(localbus_info); 619 620static ssize_t nctxts_show(struct device *device, 621 struct device_attribute *attr, char *buf) 622{ 623 struct qib_ibdev *dev = 624 rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); 625 struct qib_devdata *dd = dd_from_dev(dev); 626 627 /* Return the number of user ports (contexts) available. */ 628 /* The calculation below deals with a special case where 629 * cfgctxts is set to 1 on a single-port board. */ 630 return sysfs_emit(buf, "%u\n", 631 (dd->first_user_ctxt > dd->cfgctxts) ? 632 0 : 633 (dd->cfgctxts - dd->first_user_ctxt)); 634} 635static DEVICE_ATTR_RO(nctxts); 636 637static ssize_t nfreectxts_show(struct device *device, 638 struct device_attribute *attr, char *buf) 639{ 640 struct qib_ibdev *dev = 641 rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); 642 struct qib_devdata *dd = dd_from_dev(dev); 643 644 /* Return the number of free user ports (contexts) available. */ 645 return sysfs_emit(buf, "%u\n", dd->freectxts); 646} 647static DEVICE_ATTR_RO(nfreectxts); 648 649static ssize_t serial_show(struct device *device, struct device_attribute *attr, 650 char *buf) 651{ 652 struct qib_ibdev *dev = 653 rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); 654 struct qib_devdata *dd = dd_from_dev(dev); 655 const u8 *end = memchr(dd->serial, 0, ARRAY_SIZE(dd->serial)); 656 int size = end ? end - dd->serial : ARRAY_SIZE(dd->serial); 657 658 return sysfs_emit(buf, ".%*s\n", size, dd->serial); 659} 660static DEVICE_ATTR_RO(serial); 661 662static ssize_t chip_reset_store(struct device *device, 663 struct device_attribute *attr, const char *buf, 664 size_t count) 665{ 666 struct qib_ibdev *dev = 667 rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); 668 struct qib_devdata *dd = dd_from_dev(dev); 669 int ret; 670 671 if (count < 5 || memcmp(buf, "reset", 5) || !dd->diag_client) { 672 ret = -EINVAL; 673 goto bail; 674 } 675 676 ret = qib_reset_device(dd->unit); 677bail: 678 return ret < 0 ? ret : count; 679} 680static DEVICE_ATTR_WO(chip_reset); 681 682/* 683 * Dump tempsense regs. in decimal, to ease shell-scripts. 684 */ 685static ssize_t tempsense_show(struct device *device, 686 struct device_attribute *attr, char *buf) 687{ 688 struct qib_ibdev *dev = 689 rdma_device_to_drv_device(device, struct qib_ibdev, rdi.ibdev); 690 struct qib_devdata *dd = dd_from_dev(dev); 691 int i; 692 u8 regvals[8]; 693 694 for (i = 0; i < 8; i++) { 695 int ret; 696 697 if (i == 6) 698 continue; 699 ret = dd->f_tempsense_rd(dd, i); 700 if (ret < 0) 701 return ret; /* return error on bad read */ 702 regvals[i] = ret; 703 } 704 return sysfs_emit(buf, "%d %d %02X %02X %d %d\n", 705 (signed char)regvals[0], 706 (signed char)regvals[1], 707 regvals[2], 708 regvals[3], 709 (signed char)regvals[5], 710 (signed char)regvals[7]); 711} 712static DEVICE_ATTR_RO(tempsense); 713 714/* 715 * end of per-unit (or driver, in some cases, but replicated 716 * per unit) functions 717 */ 718 719/* start of per-unit file structures and support code */ 720static struct attribute *qib_attributes[] = { 721 &dev_attr_hw_rev.attr, 722 &dev_attr_hca_type.attr, 723 &dev_attr_board_id.attr, 724 &dev_attr_version.attr, 725 &dev_attr_nctxts.attr, 726 &dev_attr_nfreectxts.attr, 727 &dev_attr_serial.attr, 728 &dev_attr_boardversion.attr, 729 &dev_attr_tempsense.attr, 730 &dev_attr_localbus_info.attr, 731 &dev_attr_chip_reset.attr, 732 NULL, 733}; 734 735const struct attribute_group qib_attr_group = { 736 .attrs = qib_attributes, 737};