1 #include <linux/slab.h>
2 #include <linux/vmalloc.h>
3 #include <linux/interrupt.h>
7 #include <linux/swab.h>
8 #include <linux/dma-mapping.h>
10 #include <linux/ipv6.h>
11 #include <linux/inetdevice.h>
12 #include <linux/sysfs.h>
13 #include <linux/aer.h>
14 #include <linux/log2.h>
16 #include <linux/sysfs.h>
18 int qlcnicvf_config_bridged_mode(struct qlcnic_adapter *adapter, u32 enable)
23 int qlcnicvf_config_led(struct qlcnic_adapter *adapter, u32 state, u32 rate)
29 qlcnic_store_bridged_mode(struct device *dev,
30 struct device_attribute *attr, const char *buf, size_t len)
32 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
36 if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_BDG))
39 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
42 if (strict_strtoul(buf, 2, &new))
45 if (!adapter->nic_ops->config_bridged_mode(adapter, !!new))
53 qlcnic_show_bridged_mode(struct device *dev,
54 struct device_attribute *attr, char *buf)
56 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
59 if (adapter->capabilities & QLCNIC_FW_CAPABILITY_BDG)
60 bridged_mode = !!(adapter->flags & QLCNIC_BRIDGE_ENABLED);
62 return sprintf(buf, "%d\n", bridged_mode);
66 qlcnic_store_diag_mode(struct device *dev,
67 struct device_attribute *attr, const char *buf, size_t len)
69 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
72 if (strict_strtoul(buf, 2, &new))
75 if (!!new != !!(adapter->flags & QLCNIC_DIAG_ENABLED))
76 adapter->flags ^= QLCNIC_DIAG_ENABLED;
82 qlcnic_show_diag_mode(struct device *dev,
83 struct device_attribute *attr, char *buf)
85 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
87 return sprintf(buf, "%d\n",
88 !!(adapter->flags & QLCNIC_DIAG_ENABLED));
92 qlcnic_validate_beacon(struct qlcnic_adapter *adapter, u16 beacon, u8 *state,
98 QLCDB(adapter, DRV, "rate %x state %x\n", *rate, *state);
101 *rate = __QLCNIC_MAX_LED_RATE;
103 } else if (*state > __QLCNIC_MAX_LED_STATE)
106 if ((!*rate) || (*rate > __QLCNIC_MAX_LED_RATE))
113 qlcnic_store_beacon(struct device *dev,
114 struct device_attribute *attr, const char *buf, size_t len)
116 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
117 int max_sds_rings = adapter->max_sds_rings;
122 if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC) {
123 dev_warn(dev, "LED test not supported for non "
124 "privilege function\n");
128 if (len != sizeof(u16))
129 return QL_STATUS_INVALID_PARAM;
131 memcpy(&beacon, buf, sizeof(u16));
132 err = qlcnic_validate_beacon(adapter, beacon, &b_state, &b_rate);
136 if (adapter->ahw->beacon_state == b_state)
141 if (!adapter->ahw->beacon_state)
142 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) {
147 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
152 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
153 err = qlcnic_diag_alloc_res(adapter->netdev, QLCNIC_LED_TEST);
156 set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state);
159 err = qlcnic_config_led(adapter, b_state, b_rate);
163 adapter->ahw->beacon_state = b_state;
166 if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state))
167 qlcnic_diag_free_res(adapter->netdev, max_sds_rings);
170 if (!adapter->ahw->beacon_state)
171 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
178 qlcnic_show_beacon(struct device *dev,
179 struct device_attribute *attr, char *buf)
181 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
183 return sprintf(buf, "%d\n", adapter->ahw->beacon_state);
187 qlcnic_sysfs_validate_crb(struct qlcnic_adapter *adapter,
188 loff_t offset, size_t size)
192 if (!(adapter->flags & QLCNIC_DIAG_ENABLED))
195 if (offset < QLCNIC_PCI_CRBSPACE) {
196 if (ADDR_IN_RANGE(offset, QLCNIC_PCI_CAMQM,
197 QLCNIC_PCI_CAMQM_END))
203 if ((size != crb_size) || (offset & (crb_size-1)))
210 qlcnic_sysfs_read_crb(struct file *filp, struct kobject *kobj,
211 struct bin_attribute *attr,
212 char *buf, loff_t offset, size_t size)
214 struct device *dev = container_of(kobj, struct device, kobj);
215 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
220 ret = qlcnic_sysfs_validate_crb(adapter, offset, size);
224 if (ADDR_IN_RANGE(offset, QLCNIC_PCI_CAMQM, QLCNIC_PCI_CAMQM_END)) {
225 qlcnic_pci_camqm_read_2M(adapter, offset, &qmdata);
226 memcpy(buf, &qmdata, size);
228 data = QLCRD32(adapter, offset);
229 memcpy(buf, &data, size);
235 qlcnic_sysfs_write_crb(struct file *filp, struct kobject *kobj,
236 struct bin_attribute *attr,
237 char *buf, loff_t offset, size_t size)
239 struct device *dev = container_of(kobj, struct device, kobj);
240 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
245 ret = qlcnic_sysfs_validate_crb(adapter, offset, size);
249 if (ADDR_IN_RANGE(offset, QLCNIC_PCI_CAMQM, QLCNIC_PCI_CAMQM_END)) {
250 memcpy(&qmdata, buf, size);
251 qlcnic_pci_camqm_write_2M(adapter, offset, qmdata);
253 memcpy(&data, buf, size);
254 QLCWR32(adapter, offset, data);
260 qlcnic_sysfs_validate_mem(struct qlcnic_adapter *adapter,
261 loff_t offset, size_t size)
263 if (!(adapter->flags & QLCNIC_DIAG_ENABLED))
266 if ((size != 8) || (offset & 0x7))
273 qlcnic_sysfs_read_mem(struct file *filp, struct kobject *kobj,
274 struct bin_attribute *attr,
275 char *buf, loff_t offset, size_t size)
277 struct device *dev = container_of(kobj, struct device, kobj);
278 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
282 ret = qlcnic_sysfs_validate_mem(adapter, offset, size);
286 if (qlcnic_pci_mem_read_2M(adapter, offset, &data))
289 memcpy(buf, &data, size);
295 qlcnic_sysfs_write_mem(struct file *filp, struct kobject *kobj,
296 struct bin_attribute *attr,
297 char *buf, loff_t offset, size_t size)
299 struct device *dev = container_of(kobj, struct device, kobj);
300 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
304 ret = qlcnic_sysfs_validate_mem(adapter, offset, size);
308 memcpy(&data, buf, size);
310 if (qlcnic_pci_mem_write_2M(adapter, offset, data))
317 validate_pm_config(struct qlcnic_adapter *adapter,
318 struct qlcnic_pm_func_cfg *pm_cfg, int count)
321 u8 src_pci_func, s_esw_id, d_esw_id;
325 for (i = 0; i < count; i++) {
326 src_pci_func = pm_cfg[i].pci_func;
327 dest_pci_func = pm_cfg[i].dest_npar;
328 if (src_pci_func >= QLCNIC_MAX_PCI_FUNC
329 || dest_pci_func >= QLCNIC_MAX_PCI_FUNC)
330 return QL_STATUS_INVALID_PARAM;
332 if (adapter->npars[src_pci_func].type != QLCNIC_TYPE_NIC)
333 return QL_STATUS_INVALID_PARAM;
335 if (adapter->npars[dest_pci_func].type != QLCNIC_TYPE_NIC)
336 return QL_STATUS_INVALID_PARAM;
338 s_esw_id = adapter->npars[src_pci_func].phy_port;
339 d_esw_id = adapter->npars[dest_pci_func].phy_port;
341 if (s_esw_id != d_esw_id)
342 return QL_STATUS_INVALID_PARAM;
350 qlcnic_sysfs_write_pm_config(struct file *filp, struct kobject *kobj,
351 struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
353 struct device *dev = container_of(kobj, struct device, kobj);
354 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
355 struct qlcnic_pm_func_cfg *pm_cfg;
356 u32 id, action, pci_func;
357 int count, rem, i, ret;
359 count = size / sizeof(struct qlcnic_pm_func_cfg);
360 rem = size % sizeof(struct qlcnic_pm_func_cfg);
362 return QL_STATUS_INVALID_PARAM;
364 pm_cfg = (struct qlcnic_pm_func_cfg *) buf;
366 ret = validate_pm_config(adapter, pm_cfg, count);
369 for (i = 0; i < count; i++) {
370 pci_func = pm_cfg[i].pci_func;
371 action = !!pm_cfg[i].action;
372 id = adapter->npars[pci_func].phy_port;
373 ret = qlcnic_config_port_mirroring(adapter, id,
379 for (i = 0; i < count; i++) {
380 pci_func = pm_cfg[i].pci_func;
381 id = adapter->npars[pci_func].phy_port;
382 adapter->npars[pci_func].enable_pm = !!pm_cfg[i].action;
383 adapter->npars[pci_func].dest_npar = id;
389 qlcnic_sysfs_read_pm_config(struct file *filp, struct kobject *kobj,
390 struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
392 struct device *dev = container_of(kobj, struct device, kobj);
393 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
394 struct qlcnic_pm_func_cfg pm_cfg[QLCNIC_MAX_PCI_FUNC];
397 if (size != sizeof(pm_cfg))
398 return QL_STATUS_INVALID_PARAM;
400 for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++) {
401 if (adapter->npars[i].type != QLCNIC_TYPE_NIC)
403 pm_cfg[i].action = adapter->npars[i].enable_pm;
404 pm_cfg[i].dest_npar = 0;
405 pm_cfg[i].pci_func = i;
407 memcpy(buf, &pm_cfg, size);
413 validate_esw_config(struct qlcnic_adapter *adapter,
414 struct qlcnic_esw_func_cfg *esw_cfg, int count)
420 op_mode = readl(adapter->ahw->pci_base0 + QLCNIC_DRV_OP_MODE);
422 for (i = 0; i < count; i++) {
423 pci_func = esw_cfg[i].pci_func;
424 if (pci_func >= QLCNIC_MAX_PCI_FUNC)
425 return QL_STATUS_INVALID_PARAM;
427 if (adapter->op_mode == QLCNIC_MGMT_FUNC)
428 if (adapter->npars[pci_func].type != QLCNIC_TYPE_NIC)
429 return QL_STATUS_INVALID_PARAM;
431 switch (esw_cfg[i].op_mode) {
432 case QLCNIC_PORT_DEFAULTS:
433 if (QLC_DEV_GET_DRV(op_mode, pci_func) !=
434 QLCNIC_NON_PRIV_FUNC) {
435 if (esw_cfg[i].mac_anti_spoof != 0)
436 return QL_STATUS_INVALID_PARAM;
437 if (esw_cfg[i].mac_override != 1)
438 return QL_STATUS_INVALID_PARAM;
439 if (esw_cfg[i].promisc_mode != 1)
440 return QL_STATUS_INVALID_PARAM;
443 case QLCNIC_ADD_VLAN:
444 if (!IS_VALID_VLAN(esw_cfg[i].vlan_id))
445 return QL_STATUS_INVALID_PARAM;
446 if (!esw_cfg[i].op_type)
447 return QL_STATUS_INVALID_PARAM;
449 case QLCNIC_DEL_VLAN:
450 if (!esw_cfg[i].op_type)
451 return QL_STATUS_INVALID_PARAM;
454 return QL_STATUS_INVALID_PARAM;
461 qlcnic_sysfs_write_esw_config(struct file *file, struct kobject *kobj,
462 struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
464 struct device *dev = container_of(kobj, struct device, kobj);
465 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
466 struct qlcnic_esw_func_cfg *esw_cfg;
467 struct qlcnic_npar_info *npar;
468 int count, rem, i, ret;
469 u8 pci_func, op_mode = 0;
471 count = size / sizeof(struct qlcnic_esw_func_cfg);
472 rem = size % sizeof(struct qlcnic_esw_func_cfg);
474 return QL_STATUS_INVALID_PARAM;
476 esw_cfg = (struct qlcnic_esw_func_cfg *) buf;
477 ret = validate_esw_config(adapter, esw_cfg, count);
481 for (i = 0; i < count; i++) {
482 if (adapter->op_mode == QLCNIC_MGMT_FUNC)
483 if (qlcnic_config_switch_port(adapter, &esw_cfg[i]))
484 return QL_STATUS_INVALID_PARAM;
486 if (adapter->ahw->pci_func != esw_cfg[i].pci_func)
489 op_mode = esw_cfg[i].op_mode;
490 qlcnic_get_eswitch_port_config(adapter, &esw_cfg[i]);
491 esw_cfg[i].op_mode = op_mode;
492 esw_cfg[i].pci_func = adapter->ahw->pci_func;
494 switch (esw_cfg[i].op_mode) {
495 case QLCNIC_PORT_DEFAULTS:
496 qlcnic_set_eswitch_port_features(adapter, &esw_cfg[i]);
498 case QLCNIC_ADD_VLAN:
499 qlcnic_set_vlan_config(adapter, &esw_cfg[i]);
501 case QLCNIC_DEL_VLAN:
502 esw_cfg[i].vlan_id = 0;
503 qlcnic_set_vlan_config(adapter, &esw_cfg[i]);
508 if (adapter->op_mode != QLCNIC_MGMT_FUNC)
511 for (i = 0; i < count; i++) {
512 pci_func = esw_cfg[i].pci_func;
513 npar = &adapter->npars[pci_func];
514 switch (esw_cfg[i].op_mode) {
515 case QLCNIC_PORT_DEFAULTS:
516 npar->promisc_mode = esw_cfg[i].promisc_mode;
517 npar->mac_override = esw_cfg[i].mac_override;
518 npar->offload_flags = esw_cfg[i].offload_flags;
519 npar->mac_anti_spoof = esw_cfg[i].mac_anti_spoof;
520 npar->discard_tagged = esw_cfg[i].discard_tagged;
522 case QLCNIC_ADD_VLAN:
523 npar->pvid = esw_cfg[i].vlan_id;
525 case QLCNIC_DEL_VLAN:
535 qlcnic_sysfs_read_esw_config(struct file *file, struct kobject *kobj,
536 struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
538 struct device *dev = container_of(kobj, struct device, kobj);
539 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
540 struct qlcnic_esw_func_cfg esw_cfg[QLCNIC_MAX_PCI_FUNC];
543 if (size != sizeof(esw_cfg))
544 return QL_STATUS_INVALID_PARAM;
546 for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++) {
547 if (adapter->npars[i].type != QLCNIC_TYPE_NIC)
549 esw_cfg[i].pci_func = i;
550 if (qlcnic_get_eswitch_port_config(adapter, &esw_cfg[i]))
551 return QL_STATUS_INVALID_PARAM;
553 memcpy(buf, &esw_cfg, size);
559 validate_npar_config(struct qlcnic_adapter *adapter,
560 struct qlcnic_npar_func_cfg *np_cfg, int count)
564 for (i = 0; i < count; i++) {
565 pci_func = np_cfg[i].pci_func;
566 if (pci_func >= QLCNIC_MAX_PCI_FUNC)
567 return QL_STATUS_INVALID_PARAM;
569 if (adapter->npars[pci_func].type != QLCNIC_TYPE_NIC)
570 return QL_STATUS_INVALID_PARAM;
572 if (!IS_VALID_BW(np_cfg[i].min_bw) ||
573 !IS_VALID_BW(np_cfg[i].max_bw))
574 return QL_STATUS_INVALID_PARAM;
580 qlcnic_sysfs_write_npar_config(struct file *file, struct kobject *kobj,
581 struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
583 struct device *dev = container_of(kobj, struct device, kobj);
584 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
585 struct qlcnic_info nic_info;
586 struct qlcnic_npar_func_cfg *np_cfg;
587 int i, count, rem, ret;
590 count = size / sizeof(struct qlcnic_npar_func_cfg);
591 rem = size % sizeof(struct qlcnic_npar_func_cfg);
593 return QL_STATUS_INVALID_PARAM;
595 np_cfg = (struct qlcnic_npar_func_cfg *) buf;
596 ret = validate_npar_config(adapter, np_cfg, count);
600 for (i = 0; i < count ; i++) {
601 pci_func = np_cfg[i].pci_func;
602 ret = qlcnic_get_nic_info(adapter, &nic_info, pci_func);
605 nic_info.pci_func = pci_func;
606 nic_info.min_tx_bw = np_cfg[i].min_bw;
607 nic_info.max_tx_bw = np_cfg[i].max_bw;
608 ret = qlcnic_set_nic_info(adapter, &nic_info);
611 adapter->npars[i].min_bw = nic_info.min_tx_bw;
612 adapter->npars[i].max_bw = nic_info.max_tx_bw;
619 qlcnic_sysfs_read_npar_config(struct file *file, struct kobject *kobj,
620 struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
622 struct device *dev = container_of(kobj, struct device, kobj);
623 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
624 struct qlcnic_info nic_info;
625 struct qlcnic_npar_func_cfg np_cfg[QLCNIC_MAX_PCI_FUNC];
628 if (size != sizeof(np_cfg))
629 return QL_STATUS_INVALID_PARAM;
631 for (i = 0; i < QLCNIC_MAX_PCI_FUNC ; i++) {
632 if (adapter->npars[i].type != QLCNIC_TYPE_NIC)
634 ret = qlcnic_get_nic_info(adapter, &nic_info, i);
638 np_cfg[i].pci_func = i;
639 np_cfg[i].op_mode = (u8)nic_info.op_mode;
640 np_cfg[i].port_num = nic_info.phys_port;
641 np_cfg[i].fw_capab = nic_info.capabilities;
642 np_cfg[i].min_bw = nic_info.min_tx_bw ;
643 np_cfg[i].max_bw = nic_info.max_tx_bw;
644 np_cfg[i].max_tx_queues = nic_info.max_tx_ques;
645 np_cfg[i].max_rx_queues = nic_info.max_rx_ques;
647 memcpy(buf, &np_cfg, size);
652 qlcnic_sysfs_get_port_stats(struct file *file, struct kobject *kobj,
653 struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
655 struct device *dev = container_of(kobj, struct device, kobj);
656 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
657 struct qlcnic_esw_statistics port_stats;
660 if (size != sizeof(struct qlcnic_esw_statistics))
661 return QL_STATUS_INVALID_PARAM;
663 if (offset >= QLCNIC_MAX_PCI_FUNC)
664 return QL_STATUS_INVALID_PARAM;
666 memset(&port_stats, 0, size);
667 ret = qlcnic_get_port_stats(adapter, offset, QLCNIC_QUERY_RX_COUNTER,
672 ret = qlcnic_get_port_stats(adapter, offset, QLCNIC_QUERY_TX_COUNTER,
677 memcpy(buf, &port_stats, size);
682 qlcnic_sysfs_get_esw_stats(struct file *file, struct kobject *kobj,
683 struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
685 struct device *dev = container_of(kobj, struct device, kobj);
686 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
687 struct qlcnic_esw_statistics esw_stats;
690 if (size != sizeof(struct qlcnic_esw_statistics))
691 return QL_STATUS_INVALID_PARAM;
693 if (offset >= QLCNIC_NIU_MAX_XG_PORTS)
694 return QL_STATUS_INVALID_PARAM;
696 memset(&esw_stats, 0, size);
697 ret = qlcnic_get_eswitch_stats(adapter, offset, QLCNIC_QUERY_RX_COUNTER,
702 ret = qlcnic_get_eswitch_stats(adapter, offset, QLCNIC_QUERY_TX_COUNTER,
707 memcpy(buf, &esw_stats, size);
712 qlcnic_sysfs_clear_esw_stats(struct file *file, struct kobject *kobj,
713 struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
715 struct device *dev = container_of(kobj, struct device, kobj);
716 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
719 if (offset >= QLCNIC_NIU_MAX_XG_PORTS)
720 return QL_STATUS_INVALID_PARAM;
722 ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_ESWITCH, offset,
723 QLCNIC_QUERY_RX_COUNTER);
727 ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_ESWITCH, offset,
728 QLCNIC_QUERY_TX_COUNTER);
736 qlcnic_sysfs_clear_port_stats(struct file *file, struct kobject *kobj,
737 struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
740 struct device *dev = container_of(kobj, struct device, kobj);
741 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
744 if (offset >= QLCNIC_MAX_PCI_FUNC)
745 return QL_STATUS_INVALID_PARAM;
747 ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_PORT, offset,
748 QLCNIC_QUERY_RX_COUNTER);
752 ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_PORT, offset,
753 QLCNIC_QUERY_TX_COUNTER);
761 qlcnic_sysfs_read_pci_config(struct file *file, struct kobject *kobj,
762 struct bin_attribute *attr, char *buf, loff_t offset, size_t size)
764 struct device *dev = container_of(kobj, struct device, kobj);
765 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
766 struct qlcnic_pci_func_cfg pci_cfg[QLCNIC_MAX_PCI_FUNC];
767 struct qlcnic_pci_info *pci_info;
770 if (size != sizeof(pci_cfg))
771 return QL_STATUS_INVALID_PARAM;
773 pci_info = kcalloc(QLCNIC_MAX_PCI_FUNC, sizeof(*pci_info), GFP_KERNEL);
777 ret = qlcnic_get_pci_info(adapter, pci_info);
783 for (i = 0; i < QLCNIC_MAX_PCI_FUNC ; i++) {
784 pci_cfg[i].pci_func = pci_info[i].id;
785 pci_cfg[i].func_type = pci_info[i].type;
786 pci_cfg[i].port_num = pci_info[i].default_port;
787 pci_cfg[i].min_bw = pci_info[i].tx_min_bw;
788 pci_cfg[i].max_bw = pci_info[i].tx_max_bw;
789 memcpy(&pci_cfg[i].def_mac_addr, &pci_info[i].mac, ETH_ALEN);
791 memcpy(buf, &pci_cfg, size);
796 static struct device_attribute dev_attr_bridged_mode = {
797 .attr = {.name = "bridged_mode", .mode = (S_IRUGO | S_IWUSR)},
798 .show = qlcnic_show_bridged_mode,
799 .store = qlcnic_store_bridged_mode,
802 static struct device_attribute dev_attr_diag_mode = {
803 .attr = {.name = "diag_mode", .mode = (S_IRUGO | S_IWUSR)},
804 .show = qlcnic_show_diag_mode,
805 .store = qlcnic_store_diag_mode,
808 static struct device_attribute dev_attr_beacon = {
809 .attr = {.name = "beacon", .mode = (S_IRUGO | S_IWUSR)},
810 .show = qlcnic_show_beacon,
811 .store = qlcnic_store_beacon,
814 static struct bin_attribute bin_attr_crb = {
815 .attr = {.name = "crb", .mode = (S_IRUGO | S_IWUSR)},
817 .read = qlcnic_sysfs_read_crb,
818 .write = qlcnic_sysfs_write_crb,
821 static struct bin_attribute bin_attr_mem = {
822 .attr = {.name = "mem", .mode = (S_IRUGO | S_IWUSR)},
824 .read = qlcnic_sysfs_read_mem,
825 .write = qlcnic_sysfs_write_mem,
828 static struct bin_attribute bin_attr_npar_config = {
829 .attr = {.name = "npar_config", .mode = (S_IRUGO | S_IWUSR)},
831 .read = qlcnic_sysfs_read_npar_config,
832 .write = qlcnic_sysfs_write_npar_config,
835 static struct bin_attribute bin_attr_pci_config = {
836 .attr = {.name = "pci_config", .mode = (S_IRUGO | S_IWUSR)},
838 .read = qlcnic_sysfs_read_pci_config,
842 static struct bin_attribute bin_attr_port_stats = {
843 .attr = {.name = "port_stats", .mode = (S_IRUGO | S_IWUSR)},
845 .read = qlcnic_sysfs_get_port_stats,
846 .write = qlcnic_sysfs_clear_port_stats,
849 static struct bin_attribute bin_attr_esw_stats = {
850 .attr = {.name = "esw_stats", .mode = (S_IRUGO | S_IWUSR)},
852 .read = qlcnic_sysfs_get_esw_stats,
853 .write = qlcnic_sysfs_clear_esw_stats,
856 static struct bin_attribute bin_attr_esw_config = {
857 .attr = {.name = "esw_config", .mode = (S_IRUGO | S_IWUSR)},
859 .read = qlcnic_sysfs_read_esw_config,
860 .write = qlcnic_sysfs_write_esw_config,
863 static struct bin_attribute bin_attr_pm_config = {
864 .attr = {.name = "pm_config", .mode = (S_IRUGO | S_IWUSR)},
866 .read = qlcnic_sysfs_read_pm_config,
867 .write = qlcnic_sysfs_write_pm_config,
870 void qlcnic_create_sysfs_entries(struct qlcnic_adapter *adapter)
872 struct device *dev = &adapter->pdev->dev;
874 if (adapter->capabilities & QLCNIC_FW_CAPABILITY_BDG)
875 if (device_create_file(dev, &dev_attr_bridged_mode))
877 "failed to create bridged_mode sysfs entry\n");
880 void qlcnic_remove_sysfs_entries(struct qlcnic_adapter *adapter)
882 struct device *dev = &adapter->pdev->dev;
884 if (adapter->capabilities & QLCNIC_FW_CAPABILITY_BDG)
885 device_remove_file(dev, &dev_attr_bridged_mode);
888 void qlcnic_create_diag_entries(struct qlcnic_adapter *adapter)
890 struct device *dev = &adapter->pdev->dev;
891 u32 state = QLCRD32(adapter, QLCNIC_CRB_DEV_STATE);
893 if (device_create_bin_file(dev, &bin_attr_port_stats))
894 dev_info(dev, "failed to create port stats sysfs entry");
896 if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC)
898 if (device_create_file(dev, &dev_attr_diag_mode))
899 dev_info(dev, "failed to create diag_mode sysfs entry\n");
900 if (device_create_bin_file(dev, &bin_attr_crb))
901 dev_info(dev, "failed to create crb sysfs entry\n");
902 if (device_create_bin_file(dev, &bin_attr_mem))
903 dev_info(dev, "failed to create mem sysfs entry\n");
905 if (state == QLCNIC_DEV_FAILED || (state == QLCNIC_DEV_BADBAD))
908 if (device_create_bin_file(dev, &bin_attr_pci_config))
909 dev_info(dev, "failed to create pci config sysfs entry");
910 if (device_create_file(dev, &dev_attr_beacon))
911 dev_info(dev, "failed to create beacon sysfs entry");
913 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED))
915 if (device_create_bin_file(dev, &bin_attr_esw_config))
916 dev_info(dev, "failed to create esw config sysfs entry");
917 if (adapter->op_mode != QLCNIC_MGMT_FUNC)
919 if (device_create_bin_file(dev, &bin_attr_npar_config))
920 dev_info(dev, "failed to create npar config sysfs entry");
921 if (device_create_bin_file(dev, &bin_attr_pm_config))
922 dev_info(dev, "failed to create pm config sysfs entry");
923 if (device_create_bin_file(dev, &bin_attr_esw_stats))
924 dev_info(dev, "failed to create eswitch stats sysfs entry");
927 void qlcnic_remove_diag_entries(struct qlcnic_adapter *adapter)
929 struct device *dev = &adapter->pdev->dev;
930 u32 state = QLCRD32(adapter, QLCNIC_CRB_DEV_STATE);
932 device_remove_bin_file(dev, &bin_attr_port_stats);
934 if (adapter->op_mode == QLCNIC_NON_PRIV_FUNC)
936 device_remove_file(dev, &dev_attr_diag_mode);
937 device_remove_bin_file(dev, &bin_attr_crb);
938 device_remove_bin_file(dev, &bin_attr_mem);
939 if (state == QLCNIC_DEV_FAILED || (state == QLCNIC_DEV_BADBAD))
941 device_remove_bin_file(dev, &bin_attr_pci_config);
942 device_remove_file(dev, &dev_attr_beacon);
943 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED))
945 device_remove_bin_file(dev, &bin_attr_esw_config);
946 if (adapter->op_mode != QLCNIC_MGMT_FUNC)
948 device_remove_bin_file(dev, &bin_attr_npar_config);
949 device_remove_bin_file(dev, &bin_attr_pm_config);
950 device_remove_bin_file(dev, &bin_attr_esw_stats);