1 /* 2 * QLogic qlcnic NIC Driver 3 * Copyright (c) 2009-2013 QLogic Corporation 4 * 5 * See LICENSE.qlcnic for copyright and licensing details. 6 */ 7 8 #include <linux/slab.h> 9 #include <linux/interrupt.h> 10 #include <linux/swab.h> 11 #include <linux/dma-mapping.h> 12 #include <net/ip.h> 13 #include <linux/ipv6.h> 14 #include <linux/inetdevice.h> 15 #include <linux/sysfs.h> 16 #include <linux/aer.h> 17 #include <linux/log2.h> 18 #ifdef CONFIG_QLCNIC_HWMON 19 #include <linux/hwmon.h> 20 #include <linux/hwmon-sysfs.h> 21 #endif 22 23 #include "qlcnic.h" 24 #include "qlcnic_hw.h" 25 26 int qlcnicvf_config_bridged_mode(struct qlcnic_adapter *adapter, u32 enable) 27 { 28 return -EOPNOTSUPP; 29 } 30 31 int qlcnicvf_config_led(struct qlcnic_adapter *adapter, u32 state, u32 rate) 32 { 33 return -EOPNOTSUPP; 34 } 35 36 static ssize_t qlcnic_store_bridged_mode(struct device *dev, 37 struct device_attribute *attr, 38 const char *buf, size_t len) 39 { 40 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 41 unsigned long new; 42 int ret = -EINVAL; 43 44 if (!(adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_BDG)) 45 goto err_out; 46 47 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) 48 goto err_out; 49 50 if (kstrtoul(buf, 2, &new)) 51 goto err_out; 52 53 if (!qlcnic_config_bridged_mode(adapter, !!new)) 54 ret = len; 55 56 err_out: 57 return ret; 58 } 59 60 static ssize_t qlcnic_show_bridged_mode(struct device *dev, 61 struct device_attribute *attr, 62 char *buf) 63 { 64 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 65 int bridged_mode = 0; 66 67 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_BDG) 68 bridged_mode = !!(adapter->flags & QLCNIC_BRIDGE_ENABLED); 69 70 return sprintf(buf, "%d\n", bridged_mode); 71 } 72 73 static ssize_t qlcnic_store_diag_mode(struct device *dev, 74 struct device_attribute *attr, 75 const char *buf, size_t len) 76 { 77 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 78 unsigned long new; 79 80 if (kstrtoul(buf, 2, &new)) 81 return -EINVAL; 82 83 if (!!new != !!(adapter->flags & QLCNIC_DIAG_ENABLED)) 84 adapter->flags ^= QLCNIC_DIAG_ENABLED; 85 86 return len; 87 } 88 89 static ssize_t qlcnic_show_diag_mode(struct device *dev, 90 struct device_attribute *attr, char *buf) 91 { 92 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 93 return sprintf(buf, "%d\n", !!(adapter->flags & QLCNIC_DIAG_ENABLED)); 94 } 95 96 static int qlcnic_validate_beacon(struct qlcnic_adapter *adapter, u16 beacon, 97 u8 *state, u8 *rate) 98 { 99 *rate = LSB(beacon); 100 *state = MSB(beacon); 101 102 QLCDB(adapter, DRV, "rate %x state %x\n", *rate, *state); 103 104 if (!*state) { 105 *rate = __QLCNIC_MAX_LED_RATE; 106 return 0; 107 } else if (*state > __QLCNIC_MAX_LED_STATE) { 108 return -EINVAL; 109 } 110 111 if ((!*rate) || (*rate > __QLCNIC_MAX_LED_RATE)) 112 return -EINVAL; 113 114 return 0; 115 } 116 117 static int qlcnic_83xx_store_beacon(struct qlcnic_adapter *adapter, 118 const char *buf, size_t len) 119 { 120 struct qlcnic_hardware_context *ahw = adapter->ahw; 121 unsigned long h_beacon; 122 int err; 123 124 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) 125 return -EIO; 126 127 if (kstrtoul(buf, 2, &h_beacon)) 128 return -EINVAL; 129 130 qlcnic_get_beacon_state(adapter); 131 132 if (ahw->beacon_state == h_beacon) 133 return len; 134 135 rtnl_lock(); 136 if (!ahw->beacon_state) { 137 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) { 138 rtnl_unlock(); 139 return -EBUSY; 140 } 141 } 142 143 if (h_beacon) 144 err = qlcnic_83xx_config_led(adapter, 1, h_beacon); 145 else 146 err = qlcnic_83xx_config_led(adapter, 0, !h_beacon); 147 if (!err) 148 ahw->beacon_state = h_beacon; 149 150 if (!ahw->beacon_state) 151 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state); 152 153 rtnl_unlock(); 154 return len; 155 } 156 157 static int qlcnic_82xx_store_beacon(struct qlcnic_adapter *adapter, 158 const char *buf, size_t len) 159 { 160 struct qlcnic_hardware_context *ahw = adapter->ahw; 161 int err, drv_sds_rings = adapter->drv_sds_rings; 162 u16 beacon; 163 u8 b_state, b_rate; 164 165 if (len != sizeof(u16)) 166 return -EINVAL; 167 168 memcpy(&beacon, buf, sizeof(u16)); 169 err = qlcnic_validate_beacon(adapter, beacon, &b_state, &b_rate); 170 if (err) 171 return err; 172 173 qlcnic_get_beacon_state(adapter); 174 175 if (ahw->beacon_state == b_state) 176 return len; 177 178 rtnl_lock(); 179 if (!ahw->beacon_state) { 180 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) { 181 rtnl_unlock(); 182 return -EBUSY; 183 } 184 } 185 186 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { 187 err = -EIO; 188 goto out; 189 } 190 191 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) { 192 err = qlcnic_diag_alloc_res(adapter->netdev, QLCNIC_LED_TEST); 193 if (err) 194 goto out; 195 set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state); 196 } 197 198 err = qlcnic_config_led(adapter, b_state, b_rate); 199 if (!err) { 200 err = len; 201 ahw->beacon_state = b_state; 202 } 203 204 if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state)) 205 qlcnic_diag_free_res(adapter->netdev, drv_sds_rings); 206 207 out: 208 if (!ahw->beacon_state) 209 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state); 210 rtnl_unlock(); 211 212 return err; 213 } 214 215 static ssize_t qlcnic_store_beacon(struct device *dev, 216 struct device_attribute *attr, 217 const char *buf, size_t len) 218 { 219 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 220 int err = 0; 221 222 if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { 223 dev_warn(dev, 224 "LED test not supported in non privileged mode\n"); 225 return -EOPNOTSUPP; 226 } 227 228 if (qlcnic_82xx_check(adapter)) 229 err = qlcnic_82xx_store_beacon(adapter, buf, len); 230 else if (qlcnic_83xx_check(adapter)) 231 err = qlcnic_83xx_store_beacon(adapter, buf, len); 232 else 233 return -EIO; 234 235 return err; 236 } 237 238 static ssize_t qlcnic_show_beacon(struct device *dev, 239 struct device_attribute *attr, char *buf) 240 { 241 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 242 243 return sprintf(buf, "%d\n", adapter->ahw->beacon_state); 244 } 245 246 static int qlcnic_sysfs_validate_crb(struct qlcnic_adapter *adapter, 247 loff_t offset, size_t size) 248 { 249 size_t crb_size = 4; 250 251 if (!(adapter->flags & QLCNIC_DIAG_ENABLED)) 252 return -EIO; 253 254 if (offset < QLCNIC_PCI_CRBSPACE) { 255 if (ADDR_IN_RANGE(offset, QLCNIC_PCI_CAMQM, 256 QLCNIC_PCI_CAMQM_END)) 257 crb_size = 8; 258 else 259 return -EINVAL; 260 } 261 262 if ((size != crb_size) || (offset & (crb_size-1))) 263 return -EINVAL; 264 265 return 0; 266 } 267 268 static ssize_t qlcnic_sysfs_read_crb(struct file *filp, struct kobject *kobj, 269 struct bin_attribute *attr, char *buf, 270 loff_t offset, size_t size) 271 { 272 struct device *dev = kobj_to_dev(kobj); 273 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 274 int ret; 275 276 ret = qlcnic_sysfs_validate_crb(adapter, offset, size); 277 if (ret != 0) 278 return ret; 279 qlcnic_read_crb(adapter, buf, offset, size); 280 qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32)); 281 282 return size; 283 } 284 285 static ssize_t qlcnic_sysfs_write_crb(struct file *filp, struct kobject *kobj, 286 struct bin_attribute *attr, char *buf, 287 loff_t offset, size_t size) 288 { 289 struct device *dev = kobj_to_dev(kobj); 290 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 291 int ret; 292 293 ret = qlcnic_sysfs_validate_crb(adapter, offset, size); 294 if (ret != 0) 295 return ret; 296 297 qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32)); 298 qlcnic_write_crb(adapter, buf, offset, size); 299 return size; 300 } 301 302 static int qlcnic_sysfs_validate_mem(struct qlcnic_adapter *adapter, 303 loff_t offset, size_t size) 304 { 305 if (!(adapter->flags & QLCNIC_DIAG_ENABLED)) 306 return -EIO; 307 308 if ((size != 8) || (offset & 0x7)) 309 return -EIO; 310 311 return 0; 312 } 313 314 static ssize_t qlcnic_sysfs_read_mem(struct file *filp, struct kobject *kobj, 315 struct bin_attribute *attr, char *buf, 316 loff_t offset, size_t size) 317 { 318 struct device *dev = kobj_to_dev(kobj); 319 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 320 u64 data; 321 int ret; 322 323 ret = qlcnic_sysfs_validate_mem(adapter, offset, size); 324 if (ret != 0) 325 return ret; 326 327 if (qlcnic_pci_mem_read_2M(adapter, offset, &data)) 328 return -EIO; 329 330 memcpy(buf, &data, size); 331 qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32)); 332 333 return size; 334 } 335 336 static ssize_t qlcnic_sysfs_write_mem(struct file *filp, struct kobject *kobj, 337 struct bin_attribute *attr, char *buf, 338 loff_t offset, size_t size) 339 { 340 struct device *dev = kobj_to_dev(kobj); 341 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 342 u64 data; 343 int ret; 344 345 ret = qlcnic_sysfs_validate_mem(adapter, offset, size); 346 if (ret != 0) 347 return ret; 348 349 qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32)); 350 memcpy(&data, buf, size); 351 352 if (qlcnic_pci_mem_write_2M(adapter, offset, data)) 353 return -EIO; 354 355 return size; 356 } 357 358 int qlcnic_is_valid_nic_func(struct qlcnic_adapter *adapter, u8 pci_func) 359 { 360 int i; 361 362 for (i = 0; i < adapter->ahw->total_nic_func; i++) { 363 if (adapter->npars[i].pci_func == pci_func) 364 return i; 365 } 366 367 dev_err(&adapter->pdev->dev, "%s: Invalid nic function\n", __func__); 368 return -EINVAL; 369 } 370 371 static int validate_pm_config(struct qlcnic_adapter *adapter, 372 struct qlcnic_pm_func_cfg *pm_cfg, int count) 373 { 374 u8 src_pci_func, s_esw_id, d_esw_id; 375 u8 dest_pci_func; 376 int i, src_index, dest_index; 377 378 for (i = 0; i < count; i++) { 379 src_pci_func = pm_cfg[i].pci_func; 380 dest_pci_func = pm_cfg[i].dest_npar; 381 src_index = qlcnic_is_valid_nic_func(adapter, src_pci_func); 382 if (src_index < 0) 383 return -EINVAL; 384 385 dest_index = qlcnic_is_valid_nic_func(adapter, dest_pci_func); 386 if (dest_index < 0) 387 return -EINVAL; 388 389 s_esw_id = adapter->npars[src_index].phy_port; 390 d_esw_id = adapter->npars[dest_index].phy_port; 391 392 if (s_esw_id != d_esw_id) 393 return -EINVAL; 394 } 395 396 return 0; 397 } 398 399 static ssize_t qlcnic_sysfs_write_pm_config(struct file *filp, 400 struct kobject *kobj, 401 struct bin_attribute *attr, 402 char *buf, loff_t offset, 403 size_t size) 404 { 405 struct device *dev = kobj_to_dev(kobj); 406 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 407 struct qlcnic_pm_func_cfg *pm_cfg; 408 u32 id, action, pci_func; 409 int count, rem, i, ret, index; 410 411 count = size / sizeof(struct qlcnic_pm_func_cfg); 412 rem = size % sizeof(struct qlcnic_pm_func_cfg); 413 if (rem) 414 return -EINVAL; 415 416 qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32)); 417 pm_cfg = (struct qlcnic_pm_func_cfg *)buf; 418 ret = validate_pm_config(adapter, pm_cfg, count); 419 420 if (ret) 421 return ret; 422 for (i = 0; i < count; i++) { 423 pci_func = pm_cfg[i].pci_func; 424 action = !!pm_cfg[i].action; 425 index = qlcnic_is_valid_nic_func(adapter, pci_func); 426 if (index < 0) 427 return -EINVAL; 428 429 id = adapter->npars[index].phy_port; 430 ret = qlcnic_config_port_mirroring(adapter, id, 431 action, pci_func); 432 if (ret) 433 return ret; 434 } 435 436 for (i = 0; i < count; i++) { 437 pci_func = pm_cfg[i].pci_func; 438 index = qlcnic_is_valid_nic_func(adapter, pci_func); 439 if (index < 0) 440 return -EINVAL; 441 id = adapter->npars[index].phy_port; 442 adapter->npars[index].enable_pm = !!pm_cfg[i].action; 443 adapter->npars[index].dest_npar = id; 444 } 445 446 return size; 447 } 448 449 static ssize_t qlcnic_sysfs_read_pm_config(struct file *filp, 450 struct kobject *kobj, 451 struct bin_attribute *attr, 452 char *buf, loff_t offset, 453 size_t size) 454 { 455 struct device *dev = kobj_to_dev(kobj); 456 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 457 struct qlcnic_pm_func_cfg *pm_cfg; 458 u8 pci_func; 459 u32 count; 460 int i; 461 462 memset(buf, 0, size); 463 pm_cfg = (struct qlcnic_pm_func_cfg *)buf; 464 count = size / sizeof(struct qlcnic_pm_func_cfg); 465 for (i = 0; i < adapter->ahw->total_nic_func; i++) { 466 pci_func = adapter->npars[i].pci_func; 467 if (pci_func >= count) { 468 dev_dbg(dev, "%s: Total nic functions[%d], App sent function count[%d]\n", 469 __func__, adapter->ahw->total_nic_func, count); 470 continue; 471 } 472 if (!adapter->npars[i].eswitch_status) 473 continue; 474 475 pm_cfg[pci_func].action = adapter->npars[i].enable_pm; 476 pm_cfg[pci_func].dest_npar = 0; 477 pm_cfg[pci_func].pci_func = i; 478 } 479 qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32)); 480 return size; 481 } 482 483 static int validate_esw_config(struct qlcnic_adapter *adapter, 484 struct qlcnic_esw_func_cfg *esw_cfg, int count) 485 { 486 struct qlcnic_hardware_context *ahw = adapter->ahw; 487 int i, ret; 488 u32 op_mode; 489 u8 pci_func; 490 491 if (qlcnic_82xx_check(adapter)) 492 op_mode = readl(ahw->pci_base0 + QLCNIC_DRV_OP_MODE); 493 else 494 op_mode = QLCRDX(ahw, QLC_83XX_DRV_OP_MODE); 495 496 for (i = 0; i < count; i++) { 497 pci_func = esw_cfg[i].pci_func; 498 if (pci_func >= ahw->max_vnic_func) 499 return -EINVAL; 500 501 if (adapter->ahw->op_mode == QLCNIC_MGMT_FUNC) 502 if (qlcnic_is_valid_nic_func(adapter, pci_func) < 0) 503 return -EINVAL; 504 505 switch (esw_cfg[i].op_mode) { 506 case QLCNIC_PORT_DEFAULTS: 507 if (qlcnic_82xx_check(adapter)) { 508 ret = QLC_DEV_GET_DRV(op_mode, pci_func); 509 } else { 510 ret = QLC_83XX_GET_FUNC_PRIVILEGE(op_mode, 511 pci_func); 512 esw_cfg[i].offload_flags = 0; 513 } 514 515 if (ret != QLCNIC_NON_PRIV_FUNC) { 516 if (esw_cfg[i].mac_anti_spoof != 0) 517 return -EINVAL; 518 if (esw_cfg[i].mac_override != 1) 519 return -EINVAL; 520 if (esw_cfg[i].promisc_mode != 1) 521 return -EINVAL; 522 } 523 break; 524 case QLCNIC_ADD_VLAN: 525 if (!IS_VALID_VLAN(esw_cfg[i].vlan_id)) 526 return -EINVAL; 527 if (!esw_cfg[i].op_type) 528 return -EINVAL; 529 break; 530 case QLCNIC_DEL_VLAN: 531 if (!esw_cfg[i].op_type) 532 return -EINVAL; 533 break; 534 default: 535 return -EINVAL; 536 } 537 } 538 539 return 0; 540 } 541 542 static ssize_t qlcnic_sysfs_write_esw_config(struct file *file, 543 struct kobject *kobj, 544 struct bin_attribute *attr, 545 char *buf, loff_t offset, 546 size_t size) 547 { 548 struct device *dev = kobj_to_dev(kobj); 549 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 550 struct qlcnic_esw_func_cfg *esw_cfg; 551 struct qlcnic_npar_info *npar; 552 int count, rem, i, ret; 553 int index; 554 u8 op_mode = 0, pci_func; 555 556 count = size / sizeof(struct qlcnic_esw_func_cfg); 557 rem = size % sizeof(struct qlcnic_esw_func_cfg); 558 if (rem) 559 return -EINVAL; 560 561 qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32)); 562 esw_cfg = (struct qlcnic_esw_func_cfg *)buf; 563 ret = validate_esw_config(adapter, esw_cfg, count); 564 if (ret) 565 return ret; 566 567 for (i = 0; i < count; i++) { 568 if (adapter->ahw->op_mode == QLCNIC_MGMT_FUNC) 569 if (qlcnic_config_switch_port(adapter, &esw_cfg[i])) 570 return -EINVAL; 571 572 if (adapter->ahw->pci_func != esw_cfg[i].pci_func) 573 continue; 574 575 op_mode = esw_cfg[i].op_mode; 576 qlcnic_get_eswitch_port_config(adapter, &esw_cfg[i]); 577 esw_cfg[i].op_mode = op_mode; 578 esw_cfg[i].pci_func = adapter->ahw->pci_func; 579 580 switch (esw_cfg[i].op_mode) { 581 case QLCNIC_PORT_DEFAULTS: 582 qlcnic_set_eswitch_port_features(adapter, &esw_cfg[i]); 583 rtnl_lock(); 584 qlcnic_set_netdev_features(adapter, &esw_cfg[i]); 585 rtnl_unlock(); 586 break; 587 case QLCNIC_ADD_VLAN: 588 qlcnic_set_vlan_config(adapter, &esw_cfg[i]); 589 break; 590 case QLCNIC_DEL_VLAN: 591 esw_cfg[i].vlan_id = 0; 592 qlcnic_set_vlan_config(adapter, &esw_cfg[i]); 593 break; 594 } 595 } 596 597 if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) 598 goto out; 599 600 for (i = 0; i < count; i++) { 601 pci_func = esw_cfg[i].pci_func; 602 index = qlcnic_is_valid_nic_func(adapter, pci_func); 603 if (index < 0) 604 return -EINVAL; 605 npar = &adapter->npars[index]; 606 switch (esw_cfg[i].op_mode) { 607 case QLCNIC_PORT_DEFAULTS: 608 npar->promisc_mode = esw_cfg[i].promisc_mode; 609 npar->mac_override = esw_cfg[i].mac_override; 610 npar->offload_flags = esw_cfg[i].offload_flags; 611 npar->mac_anti_spoof = esw_cfg[i].mac_anti_spoof; 612 npar->discard_tagged = esw_cfg[i].discard_tagged; 613 break; 614 case QLCNIC_ADD_VLAN: 615 npar->pvid = esw_cfg[i].vlan_id; 616 break; 617 case QLCNIC_DEL_VLAN: 618 npar->pvid = 0; 619 break; 620 } 621 } 622 out: 623 return size; 624 } 625 626 static ssize_t qlcnic_sysfs_read_esw_config(struct file *file, 627 struct kobject *kobj, 628 struct bin_attribute *attr, 629 char *buf, loff_t offset, 630 size_t size) 631 { 632 struct device *dev = kobj_to_dev(kobj); 633 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 634 struct qlcnic_esw_func_cfg *esw_cfg; 635 u8 pci_func; 636 u32 count; 637 int i; 638 639 memset(buf, 0, size); 640 esw_cfg = (struct qlcnic_esw_func_cfg *)buf; 641 count = size / sizeof(struct qlcnic_esw_func_cfg); 642 for (i = 0; i < adapter->ahw->total_nic_func; i++) { 643 pci_func = adapter->npars[i].pci_func; 644 if (pci_func >= count) { 645 dev_dbg(dev, "%s: Total nic functions[%d], App sent function count[%d]\n", 646 __func__, adapter->ahw->total_nic_func, count); 647 continue; 648 } 649 if (!adapter->npars[i].eswitch_status) 650 continue; 651 652 esw_cfg[pci_func].pci_func = pci_func; 653 if (qlcnic_get_eswitch_port_config(adapter, &esw_cfg[pci_func])) 654 return -EINVAL; 655 } 656 qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32)); 657 return size; 658 } 659 660 static int validate_npar_config(struct qlcnic_adapter *adapter, 661 struct qlcnic_npar_func_cfg *np_cfg, 662 int count) 663 { 664 u8 pci_func, i; 665 666 for (i = 0; i < count; i++) { 667 pci_func = np_cfg[i].pci_func; 668 if (qlcnic_is_valid_nic_func(adapter, pci_func) < 0) 669 return -EINVAL; 670 671 if (!IS_VALID_BW(np_cfg[i].min_bw) || 672 !IS_VALID_BW(np_cfg[i].max_bw)) 673 return -EINVAL; 674 } 675 return 0; 676 } 677 678 static ssize_t qlcnic_sysfs_write_npar_config(struct file *file, 679 struct kobject *kobj, 680 struct bin_attribute *attr, 681 char *buf, loff_t offset, 682 size_t size) 683 { 684 struct device *dev = kobj_to_dev(kobj); 685 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 686 struct qlcnic_info nic_info; 687 struct qlcnic_npar_func_cfg *np_cfg; 688 int i, count, rem, ret, index; 689 u8 pci_func; 690 691 count = size / sizeof(struct qlcnic_npar_func_cfg); 692 rem = size % sizeof(struct qlcnic_npar_func_cfg); 693 if (rem) 694 return -EINVAL; 695 696 qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32)); 697 np_cfg = (struct qlcnic_npar_func_cfg *)buf; 698 ret = validate_npar_config(adapter, np_cfg, count); 699 if (ret) 700 return ret; 701 702 for (i = 0; i < count; i++) { 703 pci_func = np_cfg[i].pci_func; 704 705 memset(&nic_info, 0, sizeof(struct qlcnic_info)); 706 ret = qlcnic_get_nic_info(adapter, &nic_info, pci_func); 707 if (ret) 708 return ret; 709 nic_info.pci_func = pci_func; 710 nic_info.min_tx_bw = np_cfg[i].min_bw; 711 nic_info.max_tx_bw = np_cfg[i].max_bw; 712 ret = qlcnic_set_nic_info(adapter, &nic_info); 713 if (ret) 714 return ret; 715 index = qlcnic_is_valid_nic_func(adapter, pci_func); 716 if (index < 0) 717 return -EINVAL; 718 adapter->npars[index].min_bw = nic_info.min_tx_bw; 719 adapter->npars[index].max_bw = nic_info.max_tx_bw; 720 } 721 722 return size; 723 } 724 725 static ssize_t qlcnic_sysfs_read_npar_config(struct file *file, 726 struct kobject *kobj, 727 struct bin_attribute *attr, 728 char *buf, loff_t offset, 729 size_t size) 730 { 731 struct device *dev = kobj_to_dev(kobj); 732 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 733 struct qlcnic_npar_func_cfg *np_cfg; 734 struct qlcnic_info nic_info; 735 u8 pci_func; 736 int i, ret; 737 u32 count; 738 739 memset(&nic_info, 0, sizeof(struct qlcnic_info)); 740 memset(buf, 0, size); 741 np_cfg = (struct qlcnic_npar_func_cfg *)buf; 742 743 count = size / sizeof(struct qlcnic_npar_func_cfg); 744 for (i = 0; i < adapter->ahw->total_nic_func; i++) { 745 if (adapter->npars[i].pci_func >= count) { 746 dev_dbg(dev, "%s: Total nic functions[%d], App sent function count[%d]\n", 747 __func__, adapter->ahw->total_nic_func, count); 748 continue; 749 } 750 if (!adapter->npars[i].eswitch_status) 751 continue; 752 pci_func = adapter->npars[i].pci_func; 753 if (qlcnic_is_valid_nic_func(adapter, pci_func) < 0) 754 continue; 755 ret = qlcnic_get_nic_info(adapter, &nic_info, pci_func); 756 if (ret) 757 return ret; 758 759 np_cfg[pci_func].pci_func = pci_func; 760 np_cfg[pci_func].op_mode = (u8)nic_info.op_mode; 761 np_cfg[pci_func].port_num = nic_info.phys_port; 762 np_cfg[pci_func].fw_capab = nic_info.capabilities; 763 np_cfg[pci_func].min_bw = nic_info.min_tx_bw; 764 np_cfg[pci_func].max_bw = nic_info.max_tx_bw; 765 np_cfg[pci_func].max_tx_queues = nic_info.max_tx_ques; 766 np_cfg[pci_func].max_rx_queues = nic_info.max_rx_ques; 767 } 768 qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32)); 769 return size; 770 } 771 772 static ssize_t qlcnic_sysfs_get_port_stats(struct file *file, 773 struct kobject *kobj, 774 struct bin_attribute *attr, 775 char *buf, loff_t offset, 776 size_t size) 777 { 778 struct device *dev = kobj_to_dev(kobj); 779 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 780 struct qlcnic_esw_statistics port_stats; 781 int ret; 782 783 if (qlcnic_83xx_check(adapter)) 784 return -EOPNOTSUPP; 785 786 if (size != sizeof(struct qlcnic_esw_statistics)) 787 return -EINVAL; 788 789 if (offset >= adapter->ahw->max_vnic_func) 790 return -EINVAL; 791 792 memset(&port_stats, 0, size); 793 ret = qlcnic_get_port_stats(adapter, offset, QLCNIC_QUERY_RX_COUNTER, 794 &port_stats.rx); 795 if (ret) 796 return ret; 797 798 ret = qlcnic_get_port_stats(adapter, offset, QLCNIC_QUERY_TX_COUNTER, 799 &port_stats.tx); 800 if (ret) 801 return ret; 802 803 memcpy(buf, &port_stats, size); 804 return size; 805 } 806 807 static ssize_t qlcnic_sysfs_get_esw_stats(struct file *file, 808 struct kobject *kobj, 809 struct bin_attribute *attr, 810 char *buf, loff_t offset, 811 size_t size) 812 { 813 struct device *dev = kobj_to_dev(kobj); 814 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 815 struct qlcnic_esw_statistics esw_stats; 816 int ret; 817 818 if (qlcnic_83xx_check(adapter)) 819 return -EOPNOTSUPP; 820 821 if (size != sizeof(struct qlcnic_esw_statistics)) 822 return -EINVAL; 823 824 if (offset >= QLCNIC_NIU_MAX_XG_PORTS) 825 return -EINVAL; 826 827 memset(&esw_stats, 0, size); 828 ret = qlcnic_get_eswitch_stats(adapter, offset, QLCNIC_QUERY_RX_COUNTER, 829 &esw_stats.rx); 830 if (ret) 831 return ret; 832 833 ret = qlcnic_get_eswitch_stats(adapter, offset, QLCNIC_QUERY_TX_COUNTER, 834 &esw_stats.tx); 835 if (ret) 836 return ret; 837 838 memcpy(buf, &esw_stats, size); 839 return size; 840 } 841 842 static ssize_t qlcnic_sysfs_clear_esw_stats(struct file *file, 843 struct kobject *kobj, 844 struct bin_attribute *attr, 845 char *buf, loff_t offset, 846 size_t size) 847 { 848 struct device *dev = kobj_to_dev(kobj); 849 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 850 int ret; 851 852 if (qlcnic_83xx_check(adapter)) 853 return -EOPNOTSUPP; 854 855 if (offset >= QLCNIC_NIU_MAX_XG_PORTS) 856 return -EINVAL; 857 858 ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_ESWITCH, offset, 859 QLCNIC_QUERY_RX_COUNTER); 860 if (ret) 861 return ret; 862 863 ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_ESWITCH, offset, 864 QLCNIC_QUERY_TX_COUNTER); 865 if (ret) 866 return ret; 867 868 return size; 869 } 870 871 static ssize_t qlcnic_sysfs_clear_port_stats(struct file *file, 872 struct kobject *kobj, 873 struct bin_attribute *attr, 874 char *buf, loff_t offset, 875 size_t size) 876 { 877 878 struct device *dev = kobj_to_dev(kobj); 879 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 880 int ret; 881 882 if (qlcnic_83xx_check(adapter)) 883 return -EOPNOTSUPP; 884 885 if (offset >= adapter->ahw->max_vnic_func) 886 return -EINVAL; 887 888 ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_PORT, offset, 889 QLCNIC_QUERY_RX_COUNTER); 890 if (ret) 891 return ret; 892 893 ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_PORT, offset, 894 QLCNIC_QUERY_TX_COUNTER); 895 if (ret) 896 return ret; 897 898 return size; 899 } 900 901 static ssize_t qlcnic_sysfs_read_pci_config(struct file *file, 902 struct kobject *kobj, 903 struct bin_attribute *attr, 904 char *buf, loff_t offset, 905 size_t size) 906 { 907 struct device *dev = kobj_to_dev(kobj); 908 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 909 struct qlcnic_pci_func_cfg *pci_cfg; 910 struct qlcnic_pci_info *pci_info; 911 int i, ret; 912 u32 count; 913 914 pci_info = kcalloc(size, sizeof(*pci_info), GFP_KERNEL); 915 if (!pci_info) 916 return -ENOMEM; 917 918 ret = qlcnic_get_pci_info(adapter, pci_info); 919 if (ret) { 920 kfree(pci_info); 921 return ret; 922 } 923 924 pci_cfg = (struct qlcnic_pci_func_cfg *)buf; 925 count = size / sizeof(struct qlcnic_pci_func_cfg); 926 qlcnic_swap32_buffer((u32 *)pci_info, size / sizeof(u32)); 927 for (i = 0; i < count; i++) { 928 pci_cfg[i].pci_func = pci_info[i].id; 929 pci_cfg[i].func_type = pci_info[i].type; 930 pci_cfg[i].func_state = 0; 931 pci_cfg[i].port_num = pci_info[i].default_port; 932 pci_cfg[i].min_bw = pci_info[i].tx_min_bw; 933 pci_cfg[i].max_bw = pci_info[i].tx_max_bw; 934 memcpy(&pci_cfg[i].def_mac_addr, &pci_info[i].mac, ETH_ALEN); 935 } 936 937 kfree(pci_info); 938 return size; 939 } 940 941 static ssize_t qlcnic_83xx_sysfs_flash_read_handler(struct file *filp, 942 struct kobject *kobj, 943 struct bin_attribute *attr, 944 char *buf, loff_t offset, 945 size_t size) 946 { 947 unsigned char *p_read_buf; 948 int ret, count; 949 struct device *dev = kobj_to_dev(kobj); 950 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 951 952 if (!size) 953 return -EINVAL; 954 955 count = size / sizeof(u32); 956 957 if (size % sizeof(u32)) 958 count++; 959 960 p_read_buf = kcalloc(size, sizeof(unsigned char), GFP_KERNEL); 961 if (!p_read_buf) 962 return -ENOMEM; 963 if (qlcnic_83xx_lock_flash(adapter) != 0) { 964 kfree(p_read_buf); 965 return -EIO; 966 } 967 968 ret = qlcnic_83xx_lockless_flash_read32(adapter, offset, p_read_buf, 969 count); 970 971 if (ret) { 972 qlcnic_83xx_unlock_flash(adapter); 973 kfree(p_read_buf); 974 return ret; 975 } 976 977 qlcnic_83xx_unlock_flash(adapter); 978 qlcnic_swap32_buffer((u32 *)p_read_buf, count); 979 memcpy(buf, p_read_buf, size); 980 kfree(p_read_buf); 981 982 return size; 983 } 984 985 static int qlcnic_83xx_sysfs_flash_bulk_write(struct qlcnic_adapter *adapter, 986 char *buf, loff_t offset, 987 size_t size) 988 { 989 int i, ret, count; 990 unsigned char *p_cache, *p_src; 991 992 p_cache = kcalloc(size, sizeof(unsigned char), GFP_KERNEL); 993 if (!p_cache) 994 return -ENOMEM; 995 996 count = size / sizeof(u32); 997 qlcnic_swap32_buffer((u32 *)buf, count); 998 memcpy(p_cache, buf, size); 999 p_src = p_cache; 1000 1001 if (qlcnic_83xx_lock_flash(adapter) != 0) { 1002 kfree(p_cache); 1003 return -EIO; 1004 } 1005 1006 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) { 1007 ret = qlcnic_83xx_enable_flash_write(adapter); 1008 if (ret) { 1009 kfree(p_cache); 1010 qlcnic_83xx_unlock_flash(adapter); 1011 return -EIO; 1012 } 1013 } 1014 1015 for (i = 0; i < count / QLC_83XX_FLASH_WRITE_MAX; i++) { 1016 ret = qlcnic_83xx_flash_bulk_write(adapter, offset, 1017 (u32 *)p_src, 1018 QLC_83XX_FLASH_WRITE_MAX); 1019 1020 if (ret) { 1021 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) { 1022 ret = qlcnic_83xx_disable_flash_write(adapter); 1023 if (ret) { 1024 kfree(p_cache); 1025 qlcnic_83xx_unlock_flash(adapter); 1026 return -EIO; 1027 } 1028 } 1029 1030 kfree(p_cache); 1031 qlcnic_83xx_unlock_flash(adapter); 1032 return -EIO; 1033 } 1034 1035 p_src = p_src + sizeof(u32)*QLC_83XX_FLASH_WRITE_MAX; 1036 offset = offset + sizeof(u32)*QLC_83XX_FLASH_WRITE_MAX; 1037 } 1038 1039 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) { 1040 ret = qlcnic_83xx_disable_flash_write(adapter); 1041 if (ret) { 1042 kfree(p_cache); 1043 qlcnic_83xx_unlock_flash(adapter); 1044 return -EIO; 1045 } 1046 } 1047 1048 kfree(p_cache); 1049 qlcnic_83xx_unlock_flash(adapter); 1050 1051 return 0; 1052 } 1053 1054 static int qlcnic_83xx_sysfs_flash_write(struct qlcnic_adapter *adapter, 1055 char *buf, loff_t offset, size_t size) 1056 { 1057 int i, ret, count; 1058 unsigned char *p_cache, *p_src; 1059 1060 p_cache = kcalloc(size, sizeof(unsigned char), GFP_KERNEL); 1061 if (!p_cache) 1062 return -ENOMEM; 1063 1064 qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32)); 1065 memcpy(p_cache, buf, size); 1066 p_src = p_cache; 1067 count = size / sizeof(u32); 1068 1069 if (qlcnic_83xx_lock_flash(adapter) != 0) { 1070 kfree(p_cache); 1071 return -EIO; 1072 } 1073 1074 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) { 1075 ret = qlcnic_83xx_enable_flash_write(adapter); 1076 if (ret) { 1077 kfree(p_cache); 1078 qlcnic_83xx_unlock_flash(adapter); 1079 return -EIO; 1080 } 1081 } 1082 1083 for (i = 0; i < count; i++) { 1084 ret = qlcnic_83xx_flash_write32(adapter, offset, (u32 *)p_src); 1085 if (ret) { 1086 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) { 1087 ret = qlcnic_83xx_disable_flash_write(adapter); 1088 if (ret) { 1089 kfree(p_cache); 1090 qlcnic_83xx_unlock_flash(adapter); 1091 return -EIO; 1092 } 1093 } 1094 kfree(p_cache); 1095 qlcnic_83xx_unlock_flash(adapter); 1096 return -EIO; 1097 } 1098 1099 p_src = p_src + sizeof(u32); 1100 offset = offset + sizeof(u32); 1101 } 1102 1103 if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) { 1104 ret = qlcnic_83xx_disable_flash_write(adapter); 1105 if (ret) { 1106 kfree(p_cache); 1107 qlcnic_83xx_unlock_flash(adapter); 1108 return -EIO; 1109 } 1110 } 1111 1112 kfree(p_cache); 1113 qlcnic_83xx_unlock_flash(adapter); 1114 1115 return 0; 1116 } 1117 1118 static ssize_t qlcnic_83xx_sysfs_flash_write_handler(struct file *filp, 1119 struct kobject *kobj, 1120 struct bin_attribute *attr, 1121 char *buf, loff_t offset, 1122 size_t size) 1123 { 1124 int ret; 1125 static int flash_mode; 1126 unsigned long data; 1127 struct device *dev = kobj_to_dev(kobj); 1128 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 1129 1130 ret = kstrtoul(buf, 16, &data); 1131 if (ret) 1132 return ret; 1133 1134 switch (data) { 1135 case QLC_83XX_FLASH_SECTOR_ERASE_CMD: 1136 flash_mode = QLC_83XX_ERASE_MODE; 1137 ret = qlcnic_83xx_erase_flash_sector(adapter, offset); 1138 if (ret) { 1139 dev_err(&adapter->pdev->dev, 1140 "%s failed at %d\n", __func__, __LINE__); 1141 return -EIO; 1142 } 1143 break; 1144 1145 case QLC_83XX_FLASH_BULK_WRITE_CMD: 1146 flash_mode = QLC_83XX_BULK_WRITE_MODE; 1147 break; 1148 1149 case QLC_83XX_FLASH_WRITE_CMD: 1150 flash_mode = QLC_83XX_WRITE_MODE; 1151 break; 1152 default: 1153 if (flash_mode == QLC_83XX_BULK_WRITE_MODE) { 1154 ret = qlcnic_83xx_sysfs_flash_bulk_write(adapter, buf, 1155 offset, size); 1156 if (ret) { 1157 dev_err(&adapter->pdev->dev, 1158 "%s failed at %d\n", 1159 __func__, __LINE__); 1160 return -EIO; 1161 } 1162 } 1163 1164 if (flash_mode == QLC_83XX_WRITE_MODE) { 1165 ret = qlcnic_83xx_sysfs_flash_write(adapter, buf, 1166 offset, size); 1167 if (ret) { 1168 dev_err(&adapter->pdev->dev, 1169 "%s failed at %d\n", __func__, 1170 __LINE__); 1171 return -EIO; 1172 } 1173 } 1174 } 1175 1176 return size; 1177 } 1178 1179 static const struct device_attribute dev_attr_bridged_mode = { 1180 .attr = { .name = "bridged_mode", .mode = 0644 }, 1181 .show = qlcnic_show_bridged_mode, 1182 .store = qlcnic_store_bridged_mode, 1183 }; 1184 1185 static const struct device_attribute dev_attr_diag_mode = { 1186 .attr = { .name = "diag_mode", .mode = 0644 }, 1187 .show = qlcnic_show_diag_mode, 1188 .store = qlcnic_store_diag_mode, 1189 }; 1190 1191 static const struct device_attribute dev_attr_beacon = { 1192 .attr = { .name = "beacon", .mode = 0644 }, 1193 .show = qlcnic_show_beacon, 1194 .store = qlcnic_store_beacon, 1195 }; 1196 1197 static const struct bin_attribute bin_attr_crb = { 1198 .attr = { .name = "crb", .mode = 0644 }, 1199 .size = 0, 1200 .read = qlcnic_sysfs_read_crb, 1201 .write = qlcnic_sysfs_write_crb, 1202 }; 1203 1204 static const struct bin_attribute bin_attr_mem = { 1205 .attr = { .name = "mem", .mode = 0644 }, 1206 .size = 0, 1207 .read = qlcnic_sysfs_read_mem, 1208 .write = qlcnic_sysfs_write_mem, 1209 }; 1210 1211 static const struct bin_attribute bin_attr_npar_config = { 1212 .attr = { .name = "npar_config", .mode = 0644 }, 1213 .size = 0, 1214 .read = qlcnic_sysfs_read_npar_config, 1215 .write = qlcnic_sysfs_write_npar_config, 1216 }; 1217 1218 static const struct bin_attribute bin_attr_pci_config = { 1219 .attr = { .name = "pci_config", .mode = 0644 }, 1220 .size = 0, 1221 .read = qlcnic_sysfs_read_pci_config, 1222 .write = NULL, 1223 }; 1224 1225 static const struct bin_attribute bin_attr_port_stats = { 1226 .attr = { .name = "port_stats", .mode = 0644 }, 1227 .size = 0, 1228 .read = qlcnic_sysfs_get_port_stats, 1229 .write = qlcnic_sysfs_clear_port_stats, 1230 }; 1231 1232 static const struct bin_attribute bin_attr_esw_stats = { 1233 .attr = { .name = "esw_stats", .mode = 0644 }, 1234 .size = 0, 1235 .read = qlcnic_sysfs_get_esw_stats, 1236 .write = qlcnic_sysfs_clear_esw_stats, 1237 }; 1238 1239 static const struct bin_attribute bin_attr_esw_config = { 1240 .attr = { .name = "esw_config", .mode = 0644 }, 1241 .size = 0, 1242 .read = qlcnic_sysfs_read_esw_config, 1243 .write = qlcnic_sysfs_write_esw_config, 1244 }; 1245 1246 static const struct bin_attribute bin_attr_pm_config = { 1247 .attr = { .name = "pm_config", .mode = 0644 }, 1248 .size = 0, 1249 .read = qlcnic_sysfs_read_pm_config, 1250 .write = qlcnic_sysfs_write_pm_config, 1251 }; 1252 1253 static const struct bin_attribute bin_attr_flash = { 1254 .attr = { .name = "flash", .mode = 0644 }, 1255 .size = 0, 1256 .read = qlcnic_83xx_sysfs_flash_read_handler, 1257 .write = qlcnic_83xx_sysfs_flash_write_handler, 1258 }; 1259 1260 #ifdef CONFIG_QLCNIC_HWMON 1261 1262 static ssize_t qlcnic_hwmon_show_temp(struct device *dev, 1263 struct device_attribute *dev_attr, 1264 char *buf) 1265 { 1266 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 1267 unsigned int temperature = 0, value = 0; 1268 1269 if (qlcnic_83xx_check(adapter)) 1270 value = QLCRDX(adapter->ahw, QLC_83XX_ASIC_TEMP); 1271 else if (qlcnic_82xx_check(adapter)) 1272 value = QLC_SHARED_REG_RD32(adapter, QLCNIC_ASIC_TEMP); 1273 1274 temperature = qlcnic_get_temp_val(value); 1275 /* display millidegree celcius */ 1276 temperature *= 1000; 1277 return sprintf(buf, "%u\n", temperature); 1278 } 1279 1280 /* hwmon-sysfs attributes */ 1281 static SENSOR_DEVICE_ATTR(temp1_input, 0444, 1282 qlcnic_hwmon_show_temp, NULL, 1); 1283 1284 static struct attribute *qlcnic_hwmon_attrs[] = { 1285 &sensor_dev_attr_temp1_input.dev_attr.attr, 1286 NULL 1287 }; 1288 1289 ATTRIBUTE_GROUPS(qlcnic_hwmon); 1290 1291 void qlcnic_register_hwmon_dev(struct qlcnic_adapter *adapter) 1292 { 1293 struct device *dev = &adapter->pdev->dev; 1294 struct device *hwmon_dev; 1295 1296 /* Skip hwmon registration for a VF device */ 1297 if (qlcnic_sriov_vf_check(adapter)) { 1298 adapter->ahw->hwmon_dev = NULL; 1299 return; 1300 } 1301 hwmon_dev = hwmon_device_register_with_groups(dev, qlcnic_driver_name, 1302 adapter, 1303 qlcnic_hwmon_groups); 1304 if (IS_ERR(hwmon_dev)) { 1305 dev_err(dev, "Cannot register with hwmon, err=%ld\n", 1306 PTR_ERR(hwmon_dev)); 1307 hwmon_dev = NULL; 1308 } 1309 adapter->ahw->hwmon_dev = hwmon_dev; 1310 } 1311 1312 void qlcnic_unregister_hwmon_dev(struct qlcnic_adapter *adapter) 1313 { 1314 struct device *hwmon_dev = adapter->ahw->hwmon_dev; 1315 if (hwmon_dev) { 1316 hwmon_device_unregister(hwmon_dev); 1317 adapter->ahw->hwmon_dev = NULL; 1318 } 1319 } 1320 #endif 1321 1322 void qlcnic_create_sysfs_entries(struct qlcnic_adapter *adapter) 1323 { 1324 struct device *dev = &adapter->pdev->dev; 1325 1326 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_BDG) 1327 if (device_create_file(dev, &dev_attr_bridged_mode)) 1328 dev_warn(dev, 1329 "failed to create bridged_mode sysfs entry\n"); 1330 } 1331 1332 void qlcnic_remove_sysfs_entries(struct qlcnic_adapter *adapter) 1333 { 1334 struct device *dev = &adapter->pdev->dev; 1335 1336 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_BDG) 1337 device_remove_file(dev, &dev_attr_bridged_mode); 1338 } 1339 1340 static void qlcnic_create_diag_entries(struct qlcnic_adapter *adapter) 1341 { 1342 struct device *dev = &adapter->pdev->dev; 1343 1344 if (device_create_bin_file(dev, &bin_attr_port_stats)) 1345 dev_info(dev, "failed to create port stats sysfs entry"); 1346 1347 if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) 1348 return; 1349 if (device_create_file(dev, &dev_attr_diag_mode)) 1350 dev_info(dev, "failed to create diag_mode sysfs entry\n"); 1351 if (device_create_bin_file(dev, &bin_attr_crb)) 1352 dev_info(dev, "failed to create crb sysfs entry\n"); 1353 if (device_create_bin_file(dev, &bin_attr_mem)) 1354 dev_info(dev, "failed to create mem sysfs entry\n"); 1355 1356 if (test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) 1357 return; 1358 1359 if (device_create_bin_file(dev, &bin_attr_pci_config)) 1360 dev_info(dev, "failed to create pci config sysfs entry"); 1361 1362 if (device_create_file(dev, &dev_attr_beacon)) 1363 dev_info(dev, "failed to create beacon sysfs entry"); 1364 1365 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) 1366 return; 1367 if (device_create_bin_file(dev, &bin_attr_esw_config)) 1368 dev_info(dev, "failed to create esw config sysfs entry"); 1369 if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) 1370 return; 1371 if (device_create_bin_file(dev, &bin_attr_npar_config)) 1372 dev_info(dev, "failed to create npar config sysfs entry"); 1373 if (device_create_bin_file(dev, &bin_attr_pm_config)) 1374 dev_info(dev, "failed to create pm config sysfs entry"); 1375 if (device_create_bin_file(dev, &bin_attr_esw_stats)) 1376 dev_info(dev, "failed to create eswitch stats sysfs entry"); 1377 } 1378 1379 static void qlcnic_remove_diag_entries(struct qlcnic_adapter *adapter) 1380 { 1381 struct device *dev = &adapter->pdev->dev; 1382 1383 device_remove_bin_file(dev, &bin_attr_port_stats); 1384 1385 if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) 1386 return; 1387 device_remove_file(dev, &dev_attr_diag_mode); 1388 device_remove_bin_file(dev, &bin_attr_crb); 1389 device_remove_bin_file(dev, &bin_attr_mem); 1390 1391 if (test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) 1392 return; 1393 1394 device_remove_bin_file(dev, &bin_attr_pci_config); 1395 device_remove_file(dev, &dev_attr_beacon); 1396 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) 1397 return; 1398 device_remove_bin_file(dev, &bin_attr_esw_config); 1399 if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) 1400 return; 1401 device_remove_bin_file(dev, &bin_attr_npar_config); 1402 device_remove_bin_file(dev, &bin_attr_pm_config); 1403 device_remove_bin_file(dev, &bin_attr_esw_stats); 1404 } 1405 1406 void qlcnic_82xx_add_sysfs(struct qlcnic_adapter *adapter) 1407 { 1408 qlcnic_create_diag_entries(adapter); 1409 } 1410 1411 void qlcnic_82xx_remove_sysfs(struct qlcnic_adapter *adapter) 1412 { 1413 qlcnic_remove_diag_entries(adapter); 1414 } 1415 1416 void qlcnic_83xx_add_sysfs(struct qlcnic_adapter *adapter) 1417 { 1418 struct device *dev = &adapter->pdev->dev; 1419 1420 qlcnic_create_diag_entries(adapter); 1421 1422 if (sysfs_create_bin_file(&dev->kobj, &bin_attr_flash)) 1423 dev_info(dev, "failed to create flash sysfs entry\n"); 1424 } 1425 1426 void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *adapter) 1427 { 1428 struct device *dev = &adapter->pdev->dev; 1429 1430 qlcnic_remove_diag_entries(adapter); 1431 sysfs_remove_bin_file(&dev->kobj, &bin_attr_flash); 1432 } 1433