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