xref: /openbmc/linux/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1*004b26b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2577ae39dSJitendra Kalsaria /*
3577ae39dSJitendra Kalsaria  * QLogic qlcnic NIC Driver
4577ae39dSJitendra Kalsaria  * Copyright (c) 2009-2013 QLogic Corporation
5577ae39dSJitendra Kalsaria  */
6577ae39dSJitendra Kalsaria 
7ec079a07SSony Chacko #include <linux/slab.h>
8ec079a07SSony Chacko #include <linux/interrupt.h>
9ec079a07SSony Chacko #include <linux/swab.h>
10ec079a07SSony Chacko #include <linux/dma-mapping.h>
11ec079a07SSony Chacko #include <net/ip.h>
12ec079a07SSony Chacko #include <linux/ipv6.h>
13ec079a07SSony Chacko #include <linux/inetdevice.h>
14ec079a07SSony Chacko #include <linux/sysfs.h>
15ec079a07SSony Chacko #include <linux/log2.h>
161f0f467bSHarish Patil #ifdef CONFIG_QLCNIC_HWMON
171f0f467bSHarish Patil #include <linux/hwmon.h>
181f0f467bSHarish Patil #include <linux/hwmon-sysfs.h>
191f0f467bSHarish Patil #endif
20ec079a07SSony Chacko 
21a930a463SHarish Patil #include "qlcnic.h"
22a930a463SHarish Patil #include "qlcnic_hw.h"
23a930a463SHarish Patil 
qlcnicvf_config_bridged_mode(struct qlcnic_adapter * adapter,u32 enable)24ec079a07SSony Chacko int qlcnicvf_config_bridged_mode(struct qlcnic_adapter *adapter, u32 enable)
25ec079a07SSony Chacko {
26ec079a07SSony Chacko 	return -EOPNOTSUPP;
27ec079a07SSony Chacko }
28ec079a07SSony Chacko 
qlcnicvf_config_led(struct qlcnic_adapter * adapter,u32 state,u32 rate)29ec079a07SSony Chacko int qlcnicvf_config_led(struct qlcnic_adapter *adapter, u32 state, u32 rate)
30ec079a07SSony Chacko {
31ec079a07SSony Chacko 	return -EOPNOTSUPP;
32ec079a07SSony Chacko }
33ec079a07SSony Chacko 
qlcnic_store_bridged_mode(struct device * dev,struct device_attribute * attr,const char * buf,size_t len)34b66e29c9SSony Chacko static ssize_t qlcnic_store_bridged_mode(struct device *dev,
35b66e29c9SSony Chacko 					 struct device_attribute *attr,
36b66e29c9SSony Chacko 					 const char *buf, size_t len)
37ec079a07SSony Chacko {
38ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
39ec079a07SSony Chacko 	unsigned long new;
40ec079a07SSony Chacko 	int ret = -EINVAL;
41ec079a07SSony Chacko 
4279788450SSony Chacko 	if (!(adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_BDG))
43ec079a07SSony Chacko 		goto err_out;
44ec079a07SSony Chacko 
45ec079a07SSony Chacko 	if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
46ec079a07SSony Chacko 		goto err_out;
47ec079a07SSony Chacko 
4867d6bfa6SJingoo Han 	if (kstrtoul(buf, 2, &new))
49ec079a07SSony Chacko 		goto err_out;
50ec079a07SSony Chacko 
51319ecf12SSony Chacko 	if (!qlcnic_config_bridged_mode(adapter, !!new))
52ec079a07SSony Chacko 		ret = len;
53ec079a07SSony Chacko 
54ec079a07SSony Chacko err_out:
55ec079a07SSony Chacko 	return ret;
56ec079a07SSony Chacko }
57ec079a07SSony Chacko 
qlcnic_show_bridged_mode(struct device * dev,struct device_attribute * attr,char * buf)58b66e29c9SSony Chacko static ssize_t qlcnic_show_bridged_mode(struct device *dev,
59b66e29c9SSony Chacko 					struct device_attribute *attr,
60b66e29c9SSony Chacko 					char *buf)
61ec079a07SSony Chacko {
62ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
63ec079a07SSony Chacko 	int bridged_mode = 0;
64ec079a07SSony Chacko 
6579788450SSony Chacko 	if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_BDG)
66ec079a07SSony Chacko 		bridged_mode = !!(adapter->flags & QLCNIC_BRIDGE_ENABLED);
67ec079a07SSony Chacko 
68ec079a07SSony Chacko 	return sprintf(buf, "%d\n", bridged_mode);
69ec079a07SSony Chacko }
70ec079a07SSony Chacko 
qlcnic_store_diag_mode(struct device * dev,struct device_attribute * attr,const char * buf,size_t len)71b66e29c9SSony Chacko static ssize_t qlcnic_store_diag_mode(struct device *dev,
72b66e29c9SSony Chacko 				      struct device_attribute *attr,
73b66e29c9SSony Chacko 				      const char *buf, size_t len)
74ec079a07SSony Chacko {
75ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
76ec079a07SSony Chacko 	unsigned long new;
77ec079a07SSony Chacko 
7867d6bfa6SJingoo Han 	if (kstrtoul(buf, 2, &new))
79ec079a07SSony Chacko 		return -EINVAL;
80ec079a07SSony Chacko 
81ec079a07SSony Chacko 	if (!!new != !!(adapter->flags & QLCNIC_DIAG_ENABLED))
82ec079a07SSony Chacko 		adapter->flags ^= QLCNIC_DIAG_ENABLED;
83ec079a07SSony Chacko 
84ec079a07SSony Chacko 	return len;
85ec079a07SSony Chacko }
86ec079a07SSony Chacko 
qlcnic_show_diag_mode(struct device * dev,struct device_attribute * attr,char * buf)87b66e29c9SSony Chacko static ssize_t qlcnic_show_diag_mode(struct device *dev,
88ec079a07SSony Chacko 				     struct device_attribute *attr, char *buf)
89ec079a07SSony Chacko {
90ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
91319ecf12SSony Chacko 	return sprintf(buf, "%d\n", !!(adapter->flags & QLCNIC_DIAG_ENABLED));
92ec079a07SSony Chacko }
93ec079a07SSony Chacko 
qlcnic_validate_beacon(struct qlcnic_adapter * adapter,u16 beacon,u8 * state,u8 * rate)94b66e29c9SSony Chacko static int qlcnic_validate_beacon(struct qlcnic_adapter *adapter, u16 beacon,
95b66e29c9SSony Chacko 				  u8 *state, u8 *rate)
96ec079a07SSony Chacko {
97ec079a07SSony Chacko 	*rate = LSB(beacon);
98ec079a07SSony Chacko 	*state = MSB(beacon);
99ec079a07SSony Chacko 
100ec079a07SSony Chacko 	QLCDB(adapter, DRV, "rate %x state %x\n", *rate, *state);
101ec079a07SSony Chacko 
102ec079a07SSony Chacko 	if (!*state) {
103ec079a07SSony Chacko 		*rate = __QLCNIC_MAX_LED_RATE;
104ec079a07SSony Chacko 		return 0;
105b66e29c9SSony Chacko 	} else if (*state > __QLCNIC_MAX_LED_STATE) {
106ec079a07SSony Chacko 		return -EINVAL;
107b66e29c9SSony Chacko 	}
108ec079a07SSony Chacko 
109ec079a07SSony Chacko 	if ((!*rate) || (*rate > __QLCNIC_MAX_LED_RATE))
110ec079a07SSony Chacko 		return -EINVAL;
111ec079a07SSony Chacko 
112ec079a07SSony Chacko 	return 0;
113ec079a07SSony Chacko }
114ec079a07SSony Chacko 
qlcnic_83xx_store_beacon(struct qlcnic_adapter * adapter,const char * buf,size_t len)115487042afSHimanshu Madhani static int qlcnic_83xx_store_beacon(struct qlcnic_adapter *adapter,
116b66e29c9SSony Chacko 				    const char *buf, size_t len)
117ec079a07SSony Chacko {
118319ecf12SSony Chacko 	struct qlcnic_hardware_context *ahw = adapter->ahw;
119319ecf12SSony Chacko 	unsigned long h_beacon;
120487042afSHimanshu Madhani 	int err;
121ec079a07SSony Chacko 
122487042afSHimanshu Madhani 	if (test_bit(__QLCNIC_RESETTING, &adapter->state))
123487042afSHimanshu Madhani 		return -EIO;
124ec079a07SSony Chacko 
125319ecf12SSony Chacko 	if (kstrtoul(buf, 2, &h_beacon))
126319ecf12SSony Chacko 		return -EINVAL;
127319ecf12SSony Chacko 
128a0431589SHimanshu Madhani 	qlcnic_get_beacon_state(adapter);
129a0431589SHimanshu Madhani 
130319ecf12SSony Chacko 	if (ahw->beacon_state == h_beacon)
131319ecf12SSony Chacko 		return len;
132319ecf12SSony Chacko 
133319ecf12SSony Chacko 	rtnl_lock();
134319ecf12SSony Chacko 	if (!ahw->beacon_state) {
135487042afSHimanshu Madhani 		if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) {
136319ecf12SSony Chacko 			rtnl_unlock();
137319ecf12SSony Chacko 			return -EBUSY;
138319ecf12SSony Chacko 		}
139319ecf12SSony Chacko 	}
140487042afSHimanshu Madhani 
141487042afSHimanshu Madhani 	if (h_beacon)
142319ecf12SSony Chacko 		err = qlcnic_83xx_config_led(adapter, 1, h_beacon);
143487042afSHimanshu Madhani 	else
144319ecf12SSony Chacko 		err = qlcnic_83xx_config_led(adapter, 0, !h_beacon);
145487042afSHimanshu Madhani 	if (!err)
146319ecf12SSony Chacko 		ahw->beacon_state = h_beacon;
147487042afSHimanshu Madhani 
148319ecf12SSony Chacko 	if (!ahw->beacon_state)
149319ecf12SSony Chacko 		clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
150319ecf12SSony Chacko 
151319ecf12SSony Chacko 	rtnl_unlock();
152319ecf12SSony Chacko 	return len;
153319ecf12SSony Chacko }
154319ecf12SSony Chacko 
qlcnic_82xx_store_beacon(struct qlcnic_adapter * adapter,const char * buf,size_t len)155487042afSHimanshu Madhani static int qlcnic_82xx_store_beacon(struct qlcnic_adapter *adapter,
156487042afSHimanshu Madhani 				    const char *buf, size_t len)
157487042afSHimanshu Madhani {
158487042afSHimanshu Madhani 	struct qlcnic_hardware_context *ahw = adapter->ahw;
15934e8c406SHimanshu Madhani 	int err, drv_sds_rings = adapter->drv_sds_rings;
160487042afSHimanshu Madhani 	u16 beacon;
161a0431589SHimanshu Madhani 	u8 b_state, b_rate;
162487042afSHimanshu Madhani 
163ec079a07SSony Chacko 	if (len != sizeof(u16))
164d7a32b6eSVladimir Zapolskiy 		return -EINVAL;
165ec079a07SSony Chacko 
166ec079a07SSony Chacko 	memcpy(&beacon, buf, sizeof(u16));
167ec079a07SSony Chacko 	err = qlcnic_validate_beacon(adapter, beacon, &b_state, &b_rate);
168ec079a07SSony Chacko 	if (err)
169ec079a07SSony Chacko 		return err;
170ec079a07SSony Chacko 
171a0431589SHimanshu Madhani 	qlcnic_get_beacon_state(adapter);
172487042afSHimanshu Madhani 
173487042afSHimanshu Madhani 	if (ahw->beacon_state == b_state)
174ec079a07SSony Chacko 		return len;
175ec079a07SSony Chacko 
176ec079a07SSony Chacko 	rtnl_lock();
177487042afSHimanshu Madhani 	if (!ahw->beacon_state) {
178ec079a07SSony Chacko 		if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) {
179ec079a07SSony Chacko 			rtnl_unlock();
180ec079a07SSony Chacko 			return -EBUSY;
181ec079a07SSony Chacko 		}
182487042afSHimanshu Madhani 	}
183ec079a07SSony Chacko 
184ec079a07SSony Chacko 	if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
185ec079a07SSony Chacko 		err = -EIO;
186ec079a07SSony Chacko 		goto out;
187ec079a07SSony Chacko 	}
188ec079a07SSony Chacko 
189ec079a07SSony Chacko 	if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
190ec079a07SSony Chacko 		err = qlcnic_diag_alloc_res(adapter->netdev, QLCNIC_LED_TEST);
191ec079a07SSony Chacko 		if (err)
192ec079a07SSony Chacko 			goto out;
193ec079a07SSony Chacko 		set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state);
194ec079a07SSony Chacko 	}
195ec079a07SSony Chacko 
196ec079a07SSony Chacko 	err = qlcnic_config_led(adapter, b_state, b_rate);
197361cd29cSHimanshu Madhani 	if (!err) {
198ec079a07SSony Chacko 		err = len;
199319ecf12SSony Chacko 		ahw->beacon_state = b_state;
200361cd29cSHimanshu Madhani 	}
201ec079a07SSony Chacko 
202ec079a07SSony Chacko 	if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state))
20334e8c406SHimanshu Madhani 		qlcnic_diag_free_res(adapter->netdev, drv_sds_rings);
204ec079a07SSony Chacko 
205ec079a07SSony Chacko out:
206487042afSHimanshu Madhani 	if (!ahw->beacon_state)
207ec079a07SSony Chacko 		clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
208ec079a07SSony Chacko 	rtnl_unlock();
209ec079a07SSony Chacko 
210ec079a07SSony Chacko 	return err;
211ec079a07SSony Chacko }
212ec079a07SSony Chacko 
qlcnic_store_beacon(struct device * dev,struct device_attribute * attr,const char * buf,size_t len)213487042afSHimanshu Madhani static ssize_t qlcnic_store_beacon(struct device *dev,
214487042afSHimanshu Madhani 				   struct device_attribute *attr,
215487042afSHimanshu Madhani 				   const char *buf, size_t len)
216487042afSHimanshu Madhani {
217487042afSHimanshu Madhani 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
218487042afSHimanshu Madhani 	int err = 0;
219487042afSHimanshu Madhani 
220487042afSHimanshu Madhani 	if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
221487042afSHimanshu Madhani 		dev_warn(dev,
222487042afSHimanshu Madhani 			 "LED test not supported in non privileged mode\n");
223487042afSHimanshu Madhani 		return -EOPNOTSUPP;
224487042afSHimanshu Madhani 	}
225487042afSHimanshu Madhani 
226487042afSHimanshu Madhani 	if (qlcnic_82xx_check(adapter))
227487042afSHimanshu Madhani 		err = qlcnic_82xx_store_beacon(adapter, buf, len);
228487042afSHimanshu Madhani 	else if (qlcnic_83xx_check(adapter))
229487042afSHimanshu Madhani 		err = qlcnic_83xx_store_beacon(adapter, buf, len);
230487042afSHimanshu Madhani 	else
231487042afSHimanshu Madhani 		return -EIO;
232487042afSHimanshu Madhani 
233487042afSHimanshu Madhani 	return err;
234487042afSHimanshu Madhani }
235487042afSHimanshu Madhani 
qlcnic_show_beacon(struct device * dev,struct device_attribute * attr,char * buf)236b66e29c9SSony Chacko static ssize_t qlcnic_show_beacon(struct device *dev,
237ec079a07SSony Chacko 				  struct device_attribute *attr, char *buf)
238ec079a07SSony Chacko {
239ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
240ec079a07SSony Chacko 
241ec079a07SSony Chacko 	return sprintf(buf, "%d\n", adapter->ahw->beacon_state);
242ec079a07SSony Chacko }
243ec079a07SSony Chacko 
qlcnic_sysfs_validate_crb(struct qlcnic_adapter * adapter,loff_t offset,size_t size)244b66e29c9SSony Chacko static int qlcnic_sysfs_validate_crb(struct qlcnic_adapter *adapter,
245ec079a07SSony Chacko 				     loff_t offset, size_t size)
246ec079a07SSony Chacko {
247ec079a07SSony Chacko 	size_t crb_size = 4;
248ec079a07SSony Chacko 
249ec079a07SSony Chacko 	if (!(adapter->flags & QLCNIC_DIAG_ENABLED))
250ec079a07SSony Chacko 		return -EIO;
251ec079a07SSony Chacko 
252ec079a07SSony Chacko 	if (offset < QLCNIC_PCI_CRBSPACE) {
253ec079a07SSony Chacko 		if (ADDR_IN_RANGE(offset, QLCNIC_PCI_CAMQM,
254ec079a07SSony Chacko 				  QLCNIC_PCI_CAMQM_END))
255ec079a07SSony Chacko 			crb_size = 8;
256ec079a07SSony Chacko 		else
257ec079a07SSony Chacko 			return -EINVAL;
258ec079a07SSony Chacko 	}
259ec079a07SSony Chacko 
260ec079a07SSony Chacko 	if ((size != crb_size) || (offset & (crb_size-1)))
261ec079a07SSony Chacko 		return  -EINVAL;
262ec079a07SSony Chacko 
263ec079a07SSony Chacko 	return 0;
264ec079a07SSony Chacko }
265ec079a07SSony Chacko 
qlcnic_sysfs_read_crb(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)266b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_read_crb(struct file *filp, struct kobject *kobj,
267b66e29c9SSony Chacko 				     struct bin_attribute *attr, char *buf,
268b66e29c9SSony Chacko 				     loff_t offset, size_t size)
269ec079a07SSony Chacko {
2700acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
271ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
272ec079a07SSony Chacko 	int ret;
273ec079a07SSony Chacko 
274ec079a07SSony Chacko 	ret = qlcnic_sysfs_validate_crb(adapter, offset, size);
275ec079a07SSony Chacko 	if (ret != 0)
276ec079a07SSony Chacko 		return ret;
277319ecf12SSony Chacko 	qlcnic_read_crb(adapter, buf, offset, size);
27826acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
279ec079a07SSony Chacko 
280ec079a07SSony Chacko 	return size;
281ec079a07SSony Chacko }
282ec079a07SSony Chacko 
qlcnic_sysfs_write_crb(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)283b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_write_crb(struct file *filp, struct kobject *kobj,
284b66e29c9SSony Chacko 				      struct bin_attribute *attr, char *buf,
285b66e29c9SSony Chacko 				      loff_t offset, size_t size)
286ec079a07SSony Chacko {
2870acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
288ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
289ec079a07SSony Chacko 	int ret;
290ec079a07SSony Chacko 
291ec079a07SSony Chacko 	ret = qlcnic_sysfs_validate_crb(adapter, offset, size);
292ec079a07SSony Chacko 	if (ret != 0)
293ec079a07SSony Chacko 		return ret;
294ec079a07SSony Chacko 
29526acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
296319ecf12SSony Chacko 	qlcnic_write_crb(adapter, buf, offset, size);
297ec079a07SSony Chacko 	return size;
298ec079a07SSony Chacko }
299ec079a07SSony Chacko 
qlcnic_sysfs_validate_mem(struct qlcnic_adapter * adapter,loff_t offset,size_t size)300b66e29c9SSony Chacko static int qlcnic_sysfs_validate_mem(struct qlcnic_adapter *adapter,
301ec079a07SSony Chacko 				     loff_t offset, size_t size)
302ec079a07SSony Chacko {
303ec079a07SSony Chacko 	if (!(adapter->flags & QLCNIC_DIAG_ENABLED))
304ec079a07SSony Chacko 		return -EIO;
305ec079a07SSony Chacko 
306ec079a07SSony Chacko 	if ((size != 8) || (offset & 0x7))
307ec079a07SSony Chacko 		return  -EIO;
308ec079a07SSony Chacko 
309ec079a07SSony Chacko 	return 0;
310ec079a07SSony Chacko }
311ec079a07SSony Chacko 
qlcnic_sysfs_read_mem(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)312b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_read_mem(struct file *filp, struct kobject *kobj,
313b66e29c9SSony Chacko 				     struct bin_attribute *attr, char *buf,
314b66e29c9SSony Chacko 				     loff_t offset, size_t size)
315ec079a07SSony Chacko {
3160acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
317ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
318ec079a07SSony Chacko 	u64 data;
319ec079a07SSony Chacko 	int ret;
320ec079a07SSony Chacko 
321ec079a07SSony Chacko 	ret = qlcnic_sysfs_validate_mem(adapter, offset, size);
322ec079a07SSony Chacko 	if (ret != 0)
323ec079a07SSony Chacko 		return ret;
324ec079a07SSony Chacko 
325ec079a07SSony Chacko 	if (qlcnic_pci_mem_read_2M(adapter, offset, &data))
326ec079a07SSony Chacko 		return -EIO;
327ec079a07SSony Chacko 
328ec079a07SSony Chacko 	memcpy(buf, &data, size);
32926acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
330ec079a07SSony Chacko 
331ec079a07SSony Chacko 	return size;
332ec079a07SSony Chacko }
333ec079a07SSony Chacko 
qlcnic_sysfs_write_mem(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)334b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_write_mem(struct file *filp, struct kobject *kobj,
335b66e29c9SSony Chacko 				      struct bin_attribute *attr, char *buf,
336b66e29c9SSony Chacko 				      loff_t offset, size_t size)
337ec079a07SSony Chacko {
3380acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
339ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
340ec079a07SSony Chacko 	u64 data;
341ec079a07SSony Chacko 	int ret;
342ec079a07SSony Chacko 
343ec079a07SSony Chacko 	ret = qlcnic_sysfs_validate_mem(adapter, offset, size);
344ec079a07SSony Chacko 	if (ret != 0)
345ec079a07SSony Chacko 		return ret;
346ec079a07SSony Chacko 
34726acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
348ec079a07SSony Chacko 	memcpy(&data, buf, size);
349ec079a07SSony Chacko 
350ec079a07SSony Chacko 	if (qlcnic_pci_mem_write_2M(adapter, offset, data))
351ec079a07SSony Chacko 		return -EIO;
352ec079a07SSony Chacko 
353ec079a07SSony Chacko 	return size;
354ec079a07SSony Chacko }
355ec079a07SSony Chacko 
qlcnic_is_valid_nic_func(struct qlcnic_adapter * adapter,u8 pci_func)3562f514c52SJitendra Kalsaria int qlcnic_is_valid_nic_func(struct qlcnic_adapter *adapter, u8 pci_func)
3572f514c52SJitendra Kalsaria {
358319ecf12SSony Chacko 	int i;
3592f514c52SJitendra Kalsaria 
3604f030227SJitendra Kalsaria 	for (i = 0; i < adapter->ahw->total_nic_func; i++) {
361319ecf12SSony Chacko 		if (adapter->npars[i].pci_func == pci_func)
362319ecf12SSony Chacko 			return i;
363319ecf12SSony Chacko 	}
364c65762fcSSucheta Chakraborty 
365c65762fcSSucheta Chakraborty 	dev_err(&adapter->pdev->dev, "%s: Invalid nic function\n", __func__);
366d91abf90SJitendra Kalsaria 	return -EINVAL;
367319ecf12SSony Chacko }
368319ecf12SSony Chacko 
validate_pm_config(struct qlcnic_adapter * adapter,struct qlcnic_pm_func_cfg * pm_cfg,int count)369b66e29c9SSony Chacko static int validate_pm_config(struct qlcnic_adapter *adapter,
370ec079a07SSony Chacko 			      struct qlcnic_pm_func_cfg *pm_cfg, int count)
371ec079a07SSony Chacko {
372319ecf12SSony Chacko 	u8 src_pci_func, s_esw_id, d_esw_id;
373319ecf12SSony Chacko 	u8 dest_pci_func;
374319ecf12SSony Chacko 	int i, src_index, dest_index;
375ec079a07SSony Chacko 
376ec079a07SSony Chacko 	for (i = 0; i < count; i++) {
377ec079a07SSony Chacko 		src_pci_func = pm_cfg[i].pci_func;
378ec079a07SSony Chacko 		dest_pci_func = pm_cfg[i].dest_npar;
379319ecf12SSony Chacko 		src_index = qlcnic_is_valid_nic_func(adapter, src_pci_func);
380319ecf12SSony Chacko 		if (src_index < 0)
381d7a32b6eSVladimir Zapolskiy 			return -EINVAL;
382ec079a07SSony Chacko 
383319ecf12SSony Chacko 		dest_index = qlcnic_is_valid_nic_func(adapter, dest_pci_func);
384319ecf12SSony Chacko 		if (dest_index < 0)
385d7a32b6eSVladimir Zapolskiy 			return -EINVAL;
386ec079a07SSony Chacko 
387319ecf12SSony Chacko 		s_esw_id = adapter->npars[src_index].phy_port;
388319ecf12SSony Chacko 		d_esw_id = adapter->npars[dest_index].phy_port;
389ec079a07SSony Chacko 
390ec079a07SSony Chacko 		if (s_esw_id != d_esw_id)
391d7a32b6eSVladimir Zapolskiy 			return -EINVAL;
392ec079a07SSony Chacko 	}
393ec079a07SSony Chacko 
394319ecf12SSony Chacko 	return 0;
395ec079a07SSony Chacko }
396ec079a07SSony Chacko 
qlcnic_sysfs_write_pm_config(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)397b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_write_pm_config(struct file *filp,
398b66e29c9SSony Chacko 					    struct kobject *kobj,
399b66e29c9SSony Chacko 					    struct bin_attribute *attr,
400b66e29c9SSony Chacko 					    char *buf, loff_t offset,
401b66e29c9SSony Chacko 					    size_t size)
402ec079a07SSony Chacko {
4030acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
404ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
405ec079a07SSony Chacko 	struct qlcnic_pm_func_cfg *pm_cfg;
406ec079a07SSony Chacko 	u32 id, action, pci_func;
407319ecf12SSony Chacko 	int count, rem, i, ret, index;
408ec079a07SSony Chacko 
409ec079a07SSony Chacko 	count	= size / sizeof(struct qlcnic_pm_func_cfg);
410ec079a07SSony Chacko 	rem	= size % sizeof(struct qlcnic_pm_func_cfg);
411ec079a07SSony Chacko 	if (rem)
412d7a32b6eSVladimir Zapolskiy 		return -EINVAL;
413ec079a07SSony Chacko 
41426acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
415ec079a07SSony Chacko 	pm_cfg = (struct qlcnic_pm_func_cfg *)buf;
416ec079a07SSony Chacko 	ret = validate_pm_config(adapter, pm_cfg, count);
417319ecf12SSony Chacko 
418ec079a07SSony Chacko 	if (ret)
419ec079a07SSony Chacko 		return ret;
420ec079a07SSony Chacko 	for (i = 0; i < count; i++) {
421ec079a07SSony Chacko 		pci_func = pm_cfg[i].pci_func;
422ec079a07SSony Chacko 		action = !!pm_cfg[i].action;
423319ecf12SSony Chacko 		index = qlcnic_is_valid_nic_func(adapter, pci_func);
424319ecf12SSony Chacko 		if (index < 0)
425d7a32b6eSVladimir Zapolskiy 			return -EINVAL;
426319ecf12SSony Chacko 
427319ecf12SSony Chacko 		id = adapter->npars[index].phy_port;
428319ecf12SSony Chacko 		ret = qlcnic_config_port_mirroring(adapter, id,
429319ecf12SSony Chacko 						   action, pci_func);
430ec079a07SSony Chacko 		if (ret)
431ec079a07SSony Chacko 			return ret;
432ec079a07SSony Chacko 	}
433ec079a07SSony Chacko 
434ec079a07SSony Chacko 	for (i = 0; i < count; i++) {
435ec079a07SSony Chacko 		pci_func = pm_cfg[i].pci_func;
436319ecf12SSony Chacko 		index = qlcnic_is_valid_nic_func(adapter, pci_func);
4372f514c52SJitendra Kalsaria 		if (index < 0)
438d7a32b6eSVladimir Zapolskiy 			return -EINVAL;
439319ecf12SSony Chacko 		id = adapter->npars[index].phy_port;
440319ecf12SSony Chacko 		adapter->npars[index].enable_pm = !!pm_cfg[i].action;
441319ecf12SSony Chacko 		adapter->npars[index].dest_npar = id;
442ec079a07SSony Chacko 	}
443319ecf12SSony Chacko 
444ec079a07SSony Chacko 	return size;
445ec079a07SSony Chacko }
446ec079a07SSony Chacko 
qlcnic_sysfs_read_pm_config(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)447b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_read_pm_config(struct file *filp,
448b66e29c9SSony Chacko 					   struct kobject *kobj,
449b66e29c9SSony Chacko 					   struct bin_attribute *attr,
450b66e29c9SSony Chacko 					   char *buf, loff_t offset,
451b66e29c9SSony Chacko 					   size_t size)
452ec079a07SSony Chacko {
4530acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
454ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
4552f514c52SJitendra Kalsaria 	struct qlcnic_pm_func_cfg *pm_cfg;
456319ecf12SSony Chacko 	u8 pci_func;
457d91abf90SJitendra Kalsaria 	u32 count;
458d91abf90SJitendra Kalsaria 	int i;
459ec079a07SSony Chacko 
460d91abf90SJitendra Kalsaria 	memset(buf, 0, size);
4612f514c52SJitendra Kalsaria 	pm_cfg = (struct qlcnic_pm_func_cfg *)buf;
462d91abf90SJitendra Kalsaria 	count = size / sizeof(struct qlcnic_pm_func_cfg);
463d91abf90SJitendra Kalsaria 	for (i = 0; i < adapter->ahw->total_nic_func; i++) {
464319ecf12SSony Chacko 		pci_func = adapter->npars[i].pci_func;
465d91abf90SJitendra Kalsaria 		if (pci_func >= count) {
466d91abf90SJitendra Kalsaria 			dev_dbg(dev, "%s: Total nic functions[%d], App sent function count[%d]\n",
467d91abf90SJitendra Kalsaria 				__func__, adapter->ahw->total_nic_func, count);
46835dafcb0SSony Chacko 			continue;
469d91abf90SJitendra Kalsaria 		}
47035dafcb0SSony Chacko 		if (!adapter->npars[i].eswitch_status)
47135dafcb0SSony Chacko 			continue;
47235dafcb0SSony Chacko 
473319ecf12SSony Chacko 		pm_cfg[pci_func].action = adapter->npars[i].enable_pm;
474319ecf12SSony Chacko 		pm_cfg[pci_func].dest_npar = 0;
475319ecf12SSony Chacko 		pm_cfg[pci_func].pci_func = i;
476ec079a07SSony Chacko 	}
47726acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
478ec079a07SSony Chacko 	return size;
479ec079a07SSony Chacko }
480ec079a07SSony Chacko 
validate_esw_config(struct qlcnic_adapter * adapter,struct qlcnic_esw_func_cfg * esw_cfg,int count)481b66e29c9SSony Chacko static int validate_esw_config(struct qlcnic_adapter *adapter,
482ec079a07SSony Chacko 			       struct qlcnic_esw_func_cfg *esw_cfg, int count)
483ec079a07SSony Chacko {
4842f514c52SJitendra Kalsaria 	struct qlcnic_hardware_context *ahw = adapter->ahw;
4852f514c52SJitendra Kalsaria 	int i, ret;
486ec079a07SSony Chacko 	u32 op_mode;
487ec079a07SSony Chacko 	u8 pci_func;
488ec079a07SSony Chacko 
489319ecf12SSony Chacko 	if (qlcnic_82xx_check(adapter))
4902f514c52SJitendra Kalsaria 		op_mode = readl(ahw->pci_base0 + QLCNIC_DRV_OP_MODE);
491319ecf12SSony Chacko 	else
4922f514c52SJitendra Kalsaria 		op_mode = QLCRDX(ahw, QLC_83XX_DRV_OP_MODE);
493ec079a07SSony Chacko 
494ec079a07SSony Chacko 	for (i = 0; i < count; i++) {
495ec079a07SSony Chacko 		pci_func = esw_cfg[i].pci_func;
496d91abf90SJitendra Kalsaria 		if (pci_func >= ahw->max_vnic_func)
497d7a32b6eSVladimir Zapolskiy 			return -EINVAL;
498ec079a07SSony Chacko 
499319ecf12SSony Chacko 		if (adapter->ahw->op_mode == QLCNIC_MGMT_FUNC)
500319ecf12SSony Chacko 			if (qlcnic_is_valid_nic_func(adapter, pci_func) < 0)
501d7a32b6eSVladimir Zapolskiy 				return -EINVAL;
502ec079a07SSony Chacko 
503ec079a07SSony Chacko 		switch (esw_cfg[i].op_mode) {
504ec079a07SSony Chacko 		case QLCNIC_PORT_DEFAULTS:
505319ecf12SSony Chacko 			if (qlcnic_82xx_check(adapter)) {
506319ecf12SSony Chacko 				ret = QLC_DEV_GET_DRV(op_mode, pci_func);
507319ecf12SSony Chacko 			} else {
508319ecf12SSony Chacko 				ret = QLC_83XX_GET_FUNC_PRIVILEGE(op_mode,
509319ecf12SSony Chacko 								  pci_func);
510319ecf12SSony Chacko 				esw_cfg[i].offload_flags = 0;
511319ecf12SSony Chacko 			}
512319ecf12SSony Chacko 
513319ecf12SSony Chacko 			if (ret != QLCNIC_NON_PRIV_FUNC) {
514ec079a07SSony Chacko 				if (esw_cfg[i].mac_anti_spoof != 0)
515d7a32b6eSVladimir Zapolskiy 					return -EINVAL;
516ec079a07SSony Chacko 				if (esw_cfg[i].mac_override != 1)
517d7a32b6eSVladimir Zapolskiy 					return -EINVAL;
518ec079a07SSony Chacko 				if (esw_cfg[i].promisc_mode != 1)
519d7a32b6eSVladimir Zapolskiy 					return -EINVAL;
520ec079a07SSony Chacko 			}
521ec079a07SSony Chacko 			break;
522ec079a07SSony Chacko 		case QLCNIC_ADD_VLAN:
523ec079a07SSony Chacko 			if (!IS_VALID_VLAN(esw_cfg[i].vlan_id))
524d7a32b6eSVladimir Zapolskiy 				return -EINVAL;
525ec079a07SSony Chacko 			if (!esw_cfg[i].op_type)
526d7a32b6eSVladimir Zapolskiy 				return -EINVAL;
527ec079a07SSony Chacko 			break;
528ec079a07SSony Chacko 		case QLCNIC_DEL_VLAN:
529ec079a07SSony Chacko 			if (!esw_cfg[i].op_type)
530d7a32b6eSVladimir Zapolskiy 				return -EINVAL;
531ec079a07SSony Chacko 			break;
532ec079a07SSony Chacko 		default:
533d7a32b6eSVladimir Zapolskiy 			return -EINVAL;
534ec079a07SSony Chacko 		}
535ec079a07SSony Chacko 	}
536319ecf12SSony Chacko 
537ec079a07SSony Chacko 	return 0;
538ec079a07SSony Chacko }
539ec079a07SSony Chacko 
qlcnic_sysfs_write_esw_config(struct file * file,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)540b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_write_esw_config(struct file *file,
541b66e29c9SSony Chacko 					     struct kobject *kobj,
542b66e29c9SSony Chacko 					     struct bin_attribute *attr,
543b66e29c9SSony Chacko 					     char *buf, loff_t offset,
544b66e29c9SSony Chacko 					     size_t size)
545ec079a07SSony Chacko {
5460acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
547ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
548ec079a07SSony Chacko 	struct qlcnic_esw_func_cfg *esw_cfg;
549ec079a07SSony Chacko 	struct qlcnic_npar_info *npar;
550ec079a07SSony Chacko 	int count, rem, i, ret;
551319ecf12SSony Chacko 	int index;
552319ecf12SSony Chacko 	u8 op_mode = 0, pci_func;
553ec079a07SSony Chacko 
554ec079a07SSony Chacko 	count	= size / sizeof(struct qlcnic_esw_func_cfg);
555ec079a07SSony Chacko 	rem	= size % sizeof(struct qlcnic_esw_func_cfg);
556ec079a07SSony Chacko 	if (rem)
557d7a32b6eSVladimir Zapolskiy 		return -EINVAL;
558ec079a07SSony Chacko 
55926acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
560ec079a07SSony Chacko 	esw_cfg = (struct qlcnic_esw_func_cfg *)buf;
561ec079a07SSony Chacko 	ret = validate_esw_config(adapter, esw_cfg, count);
562ec079a07SSony Chacko 	if (ret)
563ec079a07SSony Chacko 		return ret;
564ec079a07SSony Chacko 
565ec079a07SSony Chacko 	for (i = 0; i < count; i++) {
566319ecf12SSony Chacko 		if (adapter->ahw->op_mode == QLCNIC_MGMT_FUNC)
567ec079a07SSony Chacko 			if (qlcnic_config_switch_port(adapter, &esw_cfg[i]))
568d7a32b6eSVladimir Zapolskiy 				return -EINVAL;
569ec079a07SSony Chacko 
570ec079a07SSony Chacko 		if (adapter->ahw->pci_func != esw_cfg[i].pci_func)
571ec079a07SSony Chacko 			continue;
572ec079a07SSony Chacko 
573ec079a07SSony Chacko 		op_mode = esw_cfg[i].op_mode;
574ec079a07SSony Chacko 		qlcnic_get_eswitch_port_config(adapter, &esw_cfg[i]);
575ec079a07SSony Chacko 		esw_cfg[i].op_mode = op_mode;
576ec079a07SSony Chacko 		esw_cfg[i].pci_func = adapter->ahw->pci_func;
577ec079a07SSony Chacko 
578ec079a07SSony Chacko 		switch (esw_cfg[i].op_mode) {
579ec079a07SSony Chacko 		case QLCNIC_PORT_DEFAULTS:
580ec079a07SSony Chacko 			qlcnic_set_eswitch_port_features(adapter, &esw_cfg[i]);
581147a9088SShahed Shaikh 			rtnl_lock();
582147a9088SShahed Shaikh 			qlcnic_set_netdev_features(adapter, &esw_cfg[i]);
583147a9088SShahed Shaikh 			rtnl_unlock();
584ec079a07SSony Chacko 			break;
585ec079a07SSony Chacko 		case QLCNIC_ADD_VLAN:
586ec079a07SSony Chacko 			qlcnic_set_vlan_config(adapter, &esw_cfg[i]);
587ec079a07SSony Chacko 			break;
588ec079a07SSony Chacko 		case QLCNIC_DEL_VLAN:
589ec079a07SSony Chacko 			esw_cfg[i].vlan_id = 0;
590ec079a07SSony Chacko 			qlcnic_set_vlan_config(adapter, &esw_cfg[i]);
591ec079a07SSony Chacko 			break;
592ec079a07SSony Chacko 		}
593ec079a07SSony Chacko 	}
594ec079a07SSony Chacko 
59579788450SSony Chacko 	if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC)
596ec079a07SSony Chacko 		goto out;
597ec079a07SSony Chacko 
598ec079a07SSony Chacko 	for (i = 0; i < count; i++) {
599ec079a07SSony Chacko 		pci_func = esw_cfg[i].pci_func;
600319ecf12SSony Chacko 		index = qlcnic_is_valid_nic_func(adapter, pci_func);
6012f514c52SJitendra Kalsaria 		if (index < 0)
602d7a32b6eSVladimir Zapolskiy 			return -EINVAL;
603319ecf12SSony Chacko 		npar = &adapter->npars[index];
604ec079a07SSony Chacko 		switch (esw_cfg[i].op_mode) {
605ec079a07SSony Chacko 		case QLCNIC_PORT_DEFAULTS:
606ec079a07SSony Chacko 			npar->promisc_mode = esw_cfg[i].promisc_mode;
607ec079a07SSony Chacko 			npar->mac_override = esw_cfg[i].mac_override;
608ec079a07SSony Chacko 			npar->offload_flags = esw_cfg[i].offload_flags;
609ec079a07SSony Chacko 			npar->mac_anti_spoof = esw_cfg[i].mac_anti_spoof;
610ec079a07SSony Chacko 			npar->discard_tagged = esw_cfg[i].discard_tagged;
611ec079a07SSony Chacko 			break;
612ec079a07SSony Chacko 		case QLCNIC_ADD_VLAN:
613ec079a07SSony Chacko 			npar->pvid = esw_cfg[i].vlan_id;
614ec079a07SSony Chacko 			break;
615ec079a07SSony Chacko 		case QLCNIC_DEL_VLAN:
616ec079a07SSony Chacko 			npar->pvid = 0;
617ec079a07SSony Chacko 			break;
618ec079a07SSony Chacko 		}
619ec079a07SSony Chacko 	}
620ec079a07SSony Chacko out:
621ec079a07SSony Chacko 	return size;
622ec079a07SSony Chacko }
623ec079a07SSony Chacko 
qlcnic_sysfs_read_esw_config(struct file * file,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)624b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_read_esw_config(struct file *file,
625b66e29c9SSony Chacko 					    struct kobject *kobj,
626b66e29c9SSony Chacko 					    struct bin_attribute *attr,
627b66e29c9SSony Chacko 					    char *buf, loff_t offset,
628b66e29c9SSony Chacko 					    size_t size)
629ec079a07SSony Chacko {
6300acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
631ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
6322f514c52SJitendra Kalsaria 	struct qlcnic_esw_func_cfg *esw_cfg;
633d91abf90SJitendra Kalsaria 	u8 pci_func;
634d91abf90SJitendra Kalsaria 	u32 count;
635d91abf90SJitendra Kalsaria 	int i;
636ec079a07SSony Chacko 
637d91abf90SJitendra Kalsaria 	memset(buf, 0, size);
6382f514c52SJitendra Kalsaria 	esw_cfg = (struct qlcnic_esw_func_cfg *)buf;
639d91abf90SJitendra Kalsaria 	count = size / sizeof(struct qlcnic_esw_func_cfg);
640d91abf90SJitendra Kalsaria 	for (i = 0; i < adapter->ahw->total_nic_func; i++) {
641319ecf12SSony Chacko 		pci_func = adapter->npars[i].pci_func;
642d91abf90SJitendra Kalsaria 		if (pci_func >= count) {
643d91abf90SJitendra Kalsaria 			dev_dbg(dev, "%s: Total nic functions[%d], App sent function count[%d]\n",
644d91abf90SJitendra Kalsaria 				__func__, adapter->ahw->total_nic_func, count);
64535dafcb0SSony Chacko 			continue;
646d91abf90SJitendra Kalsaria 		}
64735dafcb0SSony Chacko 		if (!adapter->npars[i].eswitch_status)
64835dafcb0SSony Chacko 			continue;
64935dafcb0SSony Chacko 
650319ecf12SSony Chacko 		esw_cfg[pci_func].pci_func = pci_func;
651319ecf12SSony Chacko 		if (qlcnic_get_eswitch_port_config(adapter, &esw_cfg[pci_func]))
652d7a32b6eSVladimir Zapolskiy 			return -EINVAL;
653ec079a07SSony Chacko 	}
65426acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
655ec079a07SSony Chacko 	return size;
656ec079a07SSony Chacko }
657ec079a07SSony Chacko 
validate_npar_config(struct qlcnic_adapter * adapter,struct qlcnic_npar_func_cfg * np_cfg,int count)658b66e29c9SSony Chacko static int validate_npar_config(struct qlcnic_adapter *adapter,
659b66e29c9SSony Chacko 				struct qlcnic_npar_func_cfg *np_cfg,
660b66e29c9SSony Chacko 				int count)
661ec079a07SSony Chacko {
662ec079a07SSony Chacko 	u8 pci_func, i;
663ec079a07SSony Chacko 
664ec079a07SSony Chacko 	for (i = 0; i < count; i++) {
665ec079a07SSony Chacko 		pci_func = np_cfg[i].pci_func;
666319ecf12SSony Chacko 		if (qlcnic_is_valid_nic_func(adapter, pci_func) < 0)
667d7a32b6eSVladimir Zapolskiy 			return -EINVAL;
668ec079a07SSony Chacko 
669ec079a07SSony Chacko 		if (!IS_VALID_BW(np_cfg[i].min_bw) ||
670ec079a07SSony Chacko 		    !IS_VALID_BW(np_cfg[i].max_bw))
671d7a32b6eSVladimir Zapolskiy 			return -EINVAL;
672ec079a07SSony Chacko 	}
673ec079a07SSony Chacko 	return 0;
674ec079a07SSony Chacko }
675ec079a07SSony Chacko 
qlcnic_sysfs_write_npar_config(struct file * file,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)676b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_write_npar_config(struct file *file,
677b66e29c9SSony Chacko 					      struct kobject *kobj,
678b66e29c9SSony Chacko 					      struct bin_attribute *attr,
679b66e29c9SSony Chacko 					      char *buf, loff_t offset,
680b66e29c9SSony Chacko 					      size_t size)
681ec079a07SSony Chacko {
6820acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
683ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
684ec079a07SSony Chacko 	struct qlcnic_info nic_info;
685ec079a07SSony Chacko 	struct qlcnic_npar_func_cfg *np_cfg;
686319ecf12SSony Chacko 	int i, count, rem, ret, index;
687ec079a07SSony Chacko 	u8 pci_func;
688ec079a07SSony Chacko 
689ec079a07SSony Chacko 	count	= size / sizeof(struct qlcnic_npar_func_cfg);
690ec079a07SSony Chacko 	rem	= size % sizeof(struct qlcnic_npar_func_cfg);
691ec079a07SSony Chacko 	if (rem)
692d7a32b6eSVladimir Zapolskiy 		return -EINVAL;
693ec079a07SSony Chacko 
69426acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
695ec079a07SSony Chacko 	np_cfg = (struct qlcnic_npar_func_cfg *)buf;
696ec079a07SSony Chacko 	ret = validate_npar_config(adapter, np_cfg, count);
697ec079a07SSony Chacko 	if (ret)
698ec079a07SSony Chacko 		return ret;
699ec079a07SSony Chacko 
700ec079a07SSony Chacko 	for (i = 0; i < count; i++) {
701ec079a07SSony Chacko 		pci_func = np_cfg[i].pci_func;
702319ecf12SSony Chacko 
703319ecf12SSony Chacko 		memset(&nic_info, 0, sizeof(struct qlcnic_info));
704ec079a07SSony Chacko 		ret = qlcnic_get_nic_info(adapter, &nic_info, pci_func);
705ec079a07SSony Chacko 		if (ret)
706ec079a07SSony Chacko 			return ret;
707ec079a07SSony Chacko 		nic_info.pci_func = pci_func;
708ec079a07SSony Chacko 		nic_info.min_tx_bw = np_cfg[i].min_bw;
709ec079a07SSony Chacko 		nic_info.max_tx_bw = np_cfg[i].max_bw;
710ec079a07SSony Chacko 		ret = qlcnic_set_nic_info(adapter, &nic_info);
711ec079a07SSony Chacko 		if (ret)
712ec079a07SSony Chacko 			return ret;
713319ecf12SSony Chacko 		index = qlcnic_is_valid_nic_func(adapter, pci_func);
7142f514c52SJitendra Kalsaria 		if (index < 0)
715d7a32b6eSVladimir Zapolskiy 			return -EINVAL;
716319ecf12SSony Chacko 		adapter->npars[index].min_bw = nic_info.min_tx_bw;
717319ecf12SSony Chacko 		adapter->npars[index].max_bw = nic_info.max_tx_bw;
718ec079a07SSony Chacko 	}
719ec079a07SSony Chacko 
720ec079a07SSony Chacko 	return size;
721ec079a07SSony Chacko }
722b66e29c9SSony Chacko 
qlcnic_sysfs_read_npar_config(struct file * file,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)723b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_read_npar_config(struct file *file,
724b66e29c9SSony Chacko 					     struct kobject *kobj,
725b66e29c9SSony Chacko 					     struct bin_attribute *attr,
726b66e29c9SSony Chacko 					     char *buf, loff_t offset,
727b66e29c9SSony Chacko 					     size_t size)
728ec079a07SSony Chacko {
7290acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
730ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
7312f514c52SJitendra Kalsaria 	struct qlcnic_npar_func_cfg *np_cfg;
732ec079a07SSony Chacko 	struct qlcnic_info nic_info;
7334f030227SJitendra Kalsaria 	u8 pci_func;
734ec079a07SSony Chacko 	int i, ret;
735d91abf90SJitendra Kalsaria 	u32 count;
736ec079a07SSony Chacko 
737319ecf12SSony Chacko 	memset(&nic_info, 0, sizeof(struct qlcnic_info));
738d91abf90SJitendra Kalsaria 	memset(buf, 0, size);
7392f514c52SJitendra Kalsaria 	np_cfg = (struct qlcnic_npar_func_cfg *)buf;
740319ecf12SSony Chacko 
741d91abf90SJitendra Kalsaria 	count = size / sizeof(struct qlcnic_npar_func_cfg);
742d91abf90SJitendra Kalsaria 	for (i = 0; i < adapter->ahw->total_nic_func; i++) {
743d91abf90SJitendra Kalsaria 		if (adapter->npars[i].pci_func >= count) {
744d91abf90SJitendra Kalsaria 			dev_dbg(dev, "%s: Total nic functions[%d], App sent function count[%d]\n",
745d91abf90SJitendra Kalsaria 				__func__, adapter->ahw->total_nic_func, count);
746d91abf90SJitendra Kalsaria 			continue;
747d91abf90SJitendra Kalsaria 		}
74835dafcb0SSony Chacko 		if (!adapter->npars[i].eswitch_status)
74935dafcb0SSony Chacko 			continue;
7504f030227SJitendra Kalsaria 		pci_func = adapter->npars[i].pci_func;
7514f030227SJitendra Kalsaria 		if (qlcnic_is_valid_nic_func(adapter, pci_func) < 0)
7524f030227SJitendra Kalsaria 			continue;
7534f030227SJitendra Kalsaria 		ret = qlcnic_get_nic_info(adapter, &nic_info, pci_func);
7544f030227SJitendra Kalsaria 		if (ret)
7554f030227SJitendra Kalsaria 			return ret;
7564f030227SJitendra Kalsaria 
7574f030227SJitendra Kalsaria 		np_cfg[pci_func].pci_func = pci_func;
7584f030227SJitendra Kalsaria 		np_cfg[pci_func].op_mode = (u8)nic_info.op_mode;
7594f030227SJitendra Kalsaria 		np_cfg[pci_func].port_num = nic_info.phys_port;
7604f030227SJitendra Kalsaria 		np_cfg[pci_func].fw_capab = nic_info.capabilities;
7614f030227SJitendra Kalsaria 		np_cfg[pci_func].min_bw = nic_info.min_tx_bw;
7624f030227SJitendra Kalsaria 		np_cfg[pci_func].max_bw = nic_info.max_tx_bw;
7634f030227SJitendra Kalsaria 		np_cfg[pci_func].max_tx_queues = nic_info.max_tx_ques;
7644f030227SJitendra Kalsaria 		np_cfg[pci_func].max_rx_queues = nic_info.max_rx_ques;
765ec079a07SSony Chacko 	}
76626acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
767ec079a07SSony Chacko 	return size;
768ec079a07SSony Chacko }
769ec079a07SSony Chacko 
qlcnic_sysfs_get_port_stats(struct file * file,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)770b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_get_port_stats(struct file *file,
771b66e29c9SSony Chacko 					   struct kobject *kobj,
772b66e29c9SSony Chacko 					   struct bin_attribute *attr,
773b66e29c9SSony Chacko 					   char *buf, loff_t offset,
774b66e29c9SSony Chacko 					   size_t size)
775ec079a07SSony Chacko {
7760acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
777ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
778ec079a07SSony Chacko 	struct qlcnic_esw_statistics port_stats;
779ec079a07SSony Chacko 	int ret;
780ec079a07SSony Chacko 
781319ecf12SSony Chacko 	if (qlcnic_83xx_check(adapter))
782d7a32b6eSVladimir Zapolskiy 		return -EOPNOTSUPP;
783319ecf12SSony Chacko 
784ec079a07SSony Chacko 	if (size != sizeof(struct qlcnic_esw_statistics))
785d7a32b6eSVladimir Zapolskiy 		return -EINVAL;
786ec079a07SSony Chacko 
787d91abf90SJitendra Kalsaria 	if (offset >= adapter->ahw->max_vnic_func)
788d7a32b6eSVladimir Zapolskiy 		return -EINVAL;
789ec079a07SSony Chacko 
790ec079a07SSony Chacko 	memset(&port_stats, 0, size);
791ec079a07SSony Chacko 	ret = qlcnic_get_port_stats(adapter, offset, QLCNIC_QUERY_RX_COUNTER,
792ec079a07SSony Chacko 				    &port_stats.rx);
793ec079a07SSony Chacko 	if (ret)
794ec079a07SSony Chacko 		return ret;
795ec079a07SSony Chacko 
796ec079a07SSony Chacko 	ret = qlcnic_get_port_stats(adapter, offset, QLCNIC_QUERY_TX_COUNTER,
797ec079a07SSony Chacko 				    &port_stats.tx);
798ec079a07SSony Chacko 	if (ret)
799ec079a07SSony Chacko 		return ret;
800ec079a07SSony Chacko 
801ec079a07SSony Chacko 	memcpy(buf, &port_stats, size);
802ec079a07SSony Chacko 	return size;
803ec079a07SSony Chacko }
804ec079a07SSony Chacko 
qlcnic_sysfs_get_esw_stats(struct file * file,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)805b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_get_esw_stats(struct file *file,
806b66e29c9SSony Chacko 					  struct kobject *kobj,
807b66e29c9SSony Chacko 					  struct bin_attribute *attr,
808b66e29c9SSony Chacko 					  char *buf, loff_t offset,
809b66e29c9SSony Chacko 					  size_t size)
810ec079a07SSony Chacko {
8110acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
812ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
813ec079a07SSony Chacko 	struct qlcnic_esw_statistics esw_stats;
814ec079a07SSony Chacko 	int ret;
815ec079a07SSony Chacko 
816319ecf12SSony Chacko 	if (qlcnic_83xx_check(adapter))
817d7a32b6eSVladimir Zapolskiy 		return -EOPNOTSUPP;
818319ecf12SSony Chacko 
819ec079a07SSony Chacko 	if (size != sizeof(struct qlcnic_esw_statistics))
820d7a32b6eSVladimir Zapolskiy 		return -EINVAL;
821ec079a07SSony Chacko 
822ec079a07SSony Chacko 	if (offset >= QLCNIC_NIU_MAX_XG_PORTS)
823d7a32b6eSVladimir Zapolskiy 		return -EINVAL;
824ec079a07SSony Chacko 
825ec079a07SSony Chacko 	memset(&esw_stats, 0, size);
826ec079a07SSony Chacko 	ret = qlcnic_get_eswitch_stats(adapter, offset, QLCNIC_QUERY_RX_COUNTER,
827ec079a07SSony Chacko 				       &esw_stats.rx);
828ec079a07SSony Chacko 	if (ret)
829ec079a07SSony Chacko 		return ret;
830ec079a07SSony Chacko 
831ec079a07SSony Chacko 	ret = qlcnic_get_eswitch_stats(adapter, offset, QLCNIC_QUERY_TX_COUNTER,
832ec079a07SSony Chacko 				       &esw_stats.tx);
833ec079a07SSony Chacko 	if (ret)
834ec079a07SSony Chacko 		return ret;
835ec079a07SSony Chacko 
836ec079a07SSony Chacko 	memcpy(buf, &esw_stats, size);
837ec079a07SSony Chacko 	return size;
838ec079a07SSony Chacko }
839ec079a07SSony Chacko 
qlcnic_sysfs_clear_esw_stats(struct file * file,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)840b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_clear_esw_stats(struct file *file,
841b66e29c9SSony Chacko 					    struct kobject *kobj,
842b66e29c9SSony Chacko 					    struct bin_attribute *attr,
843b66e29c9SSony Chacko 					    char *buf, loff_t offset,
844b66e29c9SSony Chacko 					    size_t size)
845ec079a07SSony Chacko {
8460acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
847ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
848ec079a07SSony Chacko 	int ret;
849ec079a07SSony Chacko 
850319ecf12SSony Chacko 	if (qlcnic_83xx_check(adapter))
851d7a32b6eSVladimir Zapolskiy 		return -EOPNOTSUPP;
852319ecf12SSony Chacko 
853ec079a07SSony Chacko 	if (offset >= QLCNIC_NIU_MAX_XG_PORTS)
854d7a32b6eSVladimir Zapolskiy 		return -EINVAL;
855ec079a07SSony Chacko 
856ec079a07SSony Chacko 	ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_ESWITCH, offset,
857ec079a07SSony Chacko 				     QLCNIC_QUERY_RX_COUNTER);
858ec079a07SSony Chacko 	if (ret)
859ec079a07SSony Chacko 		return ret;
860ec079a07SSony Chacko 
861ec079a07SSony Chacko 	ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_ESWITCH, offset,
862ec079a07SSony Chacko 				     QLCNIC_QUERY_TX_COUNTER);
863ec079a07SSony Chacko 	if (ret)
864ec079a07SSony Chacko 		return ret;
865ec079a07SSony Chacko 
866ec079a07SSony Chacko 	return size;
867ec079a07SSony Chacko }
868ec079a07SSony Chacko 
qlcnic_sysfs_clear_port_stats(struct file * file,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)869b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_clear_port_stats(struct file *file,
870b66e29c9SSony Chacko 					     struct kobject *kobj,
871b66e29c9SSony Chacko 					     struct bin_attribute *attr,
872b66e29c9SSony Chacko 					     char *buf, loff_t offset,
873b66e29c9SSony Chacko 					     size_t size)
874ec079a07SSony Chacko {
875319ecf12SSony Chacko 
8760acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
877ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
878ec079a07SSony Chacko 	int ret;
879ec079a07SSony Chacko 
880319ecf12SSony Chacko 	if (qlcnic_83xx_check(adapter))
881d7a32b6eSVladimir Zapolskiy 		return -EOPNOTSUPP;
882319ecf12SSony Chacko 
883d91abf90SJitendra Kalsaria 	if (offset >= adapter->ahw->max_vnic_func)
884d7a32b6eSVladimir Zapolskiy 		return -EINVAL;
885ec079a07SSony Chacko 
886ec079a07SSony Chacko 	ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_PORT, offset,
887ec079a07SSony Chacko 				     QLCNIC_QUERY_RX_COUNTER);
888ec079a07SSony Chacko 	if (ret)
889ec079a07SSony Chacko 		return ret;
890ec079a07SSony Chacko 
891ec079a07SSony Chacko 	ret = qlcnic_clear_esw_stats(adapter, QLCNIC_STATS_PORT, offset,
892ec079a07SSony Chacko 				     QLCNIC_QUERY_TX_COUNTER);
893ec079a07SSony Chacko 	if (ret)
894ec079a07SSony Chacko 		return ret;
895ec079a07SSony Chacko 
896ec079a07SSony Chacko 	return size;
897ec079a07SSony Chacko }
898ec079a07SSony Chacko 
qlcnic_sysfs_read_pci_config(struct file * file,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)899b66e29c9SSony Chacko static ssize_t qlcnic_sysfs_read_pci_config(struct file *file,
900b66e29c9SSony Chacko 					    struct kobject *kobj,
901b66e29c9SSony Chacko 					    struct bin_attribute *attr,
902b66e29c9SSony Chacko 					    char *buf, loff_t offset,
903b66e29c9SSony Chacko 					    size_t size)
904ec079a07SSony Chacko {
9050acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
906ec079a07SSony Chacko 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
9072f514c52SJitendra Kalsaria 	struct qlcnic_pci_func_cfg *pci_cfg;
908ec079a07SSony Chacko 	struct qlcnic_pci_info *pci_info;
909ec079a07SSony Chacko 	int i, ret;
910d91abf90SJitendra Kalsaria 	u32 count;
911ec079a07SSony Chacko 
912d91abf90SJitendra Kalsaria 	pci_info = kcalloc(size, sizeof(*pci_info), GFP_KERNEL);
913ec079a07SSony Chacko 	if (!pci_info)
914ec079a07SSony Chacko 		return -ENOMEM;
915ec079a07SSony Chacko 
916ec079a07SSony Chacko 	ret = qlcnic_get_pci_info(adapter, pci_info);
917ec079a07SSony Chacko 	if (ret) {
918f3c0773fSJoe Perches 		kfree(pci_info);
919ec079a07SSony Chacko 		return ret;
920ec079a07SSony Chacko 	}
921ec079a07SSony Chacko 
922f3c0773fSJoe Perches 	pci_cfg = (struct qlcnic_pci_func_cfg *)buf;
923d91abf90SJitendra Kalsaria 	count = size / sizeof(struct qlcnic_pci_func_cfg);
92426acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)pci_info, size / sizeof(u32));
925d91abf90SJitendra Kalsaria 	for (i = 0; i < count; i++) {
926ec079a07SSony Chacko 		pci_cfg[i].pci_func = pci_info[i].id;
927ec079a07SSony Chacko 		pci_cfg[i].func_type = pci_info[i].type;
928f3c0773fSJoe Perches 		pci_cfg[i].func_state = 0;
929ec079a07SSony Chacko 		pci_cfg[i].port_num = pci_info[i].default_port;
930ec079a07SSony Chacko 		pci_cfg[i].min_bw = pci_info[i].tx_min_bw;
931ec079a07SSony Chacko 		pci_cfg[i].max_bw = pci_info[i].tx_max_bw;
932ec079a07SSony Chacko 		memcpy(&pci_cfg[i].def_mac_addr, &pci_info[i].mac, ETH_ALEN);
933ec079a07SSony Chacko 	}
934319ecf12SSony Chacko 
935f3c0773fSJoe Perches 	kfree(pci_info);
936ec079a07SSony Chacko 	return size;
937ec079a07SSony Chacko }
938ec079a07SSony Chacko 
qlcnic_83xx_sysfs_flash_read_handler(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)939a520030eSHimanshu Madhani static ssize_t qlcnic_83xx_sysfs_flash_read_handler(struct file *filp,
940a520030eSHimanshu Madhani 						    struct kobject *kobj,
941a520030eSHimanshu Madhani 						    struct bin_attribute *attr,
942a520030eSHimanshu Madhani 						    char *buf, loff_t offset,
943a520030eSHimanshu Madhani 						    size_t size)
944a520030eSHimanshu Madhani {
945a520030eSHimanshu Madhani 	unsigned char *p_read_buf;
946a520030eSHimanshu Madhani 	int  ret, count;
9470acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
948a520030eSHimanshu Madhani 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
949a520030eSHimanshu Madhani 
950a520030eSHimanshu Madhani 	if (!size)
951d7a32b6eSVladimir Zapolskiy 		return -EINVAL;
952a520030eSHimanshu Madhani 
953a520030eSHimanshu Madhani 	count = size / sizeof(u32);
954a520030eSHimanshu Madhani 
955a520030eSHimanshu Madhani 	if (size % sizeof(u32))
956a520030eSHimanshu Madhani 		count++;
957a520030eSHimanshu Madhani 
958a520030eSHimanshu Madhani 	p_read_buf = kcalloc(size, sizeof(unsigned char), GFP_KERNEL);
959a520030eSHimanshu Madhani 	if (!p_read_buf)
960a520030eSHimanshu Madhani 		return -ENOMEM;
961a520030eSHimanshu Madhani 	if (qlcnic_83xx_lock_flash(adapter) != 0) {
962a520030eSHimanshu Madhani 		kfree(p_read_buf);
963a520030eSHimanshu Madhani 		return -EIO;
964a520030eSHimanshu Madhani 	}
965a520030eSHimanshu Madhani 
966a520030eSHimanshu Madhani 	ret = qlcnic_83xx_lockless_flash_read32(adapter, offset, p_read_buf,
967a520030eSHimanshu Madhani 						count);
968a520030eSHimanshu Madhani 
969a520030eSHimanshu Madhani 	if (ret) {
970a520030eSHimanshu Madhani 		qlcnic_83xx_unlock_flash(adapter);
971a520030eSHimanshu Madhani 		kfree(p_read_buf);
972a520030eSHimanshu Madhani 		return ret;
973a520030eSHimanshu Madhani 	}
974a520030eSHimanshu Madhani 
975a520030eSHimanshu Madhani 	qlcnic_83xx_unlock_flash(adapter);
97626acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)p_read_buf, count);
977a520030eSHimanshu Madhani 	memcpy(buf, p_read_buf, size);
978a520030eSHimanshu Madhani 	kfree(p_read_buf);
979a520030eSHimanshu Madhani 
980a520030eSHimanshu Madhani 	return size;
981a520030eSHimanshu Madhani }
982a520030eSHimanshu Madhani 
qlcnic_83xx_sysfs_flash_bulk_write(struct qlcnic_adapter * adapter,char * buf,loff_t offset,size_t size)983a520030eSHimanshu Madhani static int qlcnic_83xx_sysfs_flash_bulk_write(struct qlcnic_adapter *adapter,
984a520030eSHimanshu Madhani 					      char *buf, loff_t offset,
985a520030eSHimanshu Madhani 					      size_t size)
986a520030eSHimanshu Madhani {
987a520030eSHimanshu Madhani 	int  i, ret, count;
988a520030eSHimanshu Madhani 	unsigned char *p_cache, *p_src;
989a520030eSHimanshu Madhani 
990a520030eSHimanshu Madhani 	p_cache = kcalloc(size, sizeof(unsigned char), GFP_KERNEL);
991a520030eSHimanshu Madhani 	if (!p_cache)
992a520030eSHimanshu Madhani 		return -ENOMEM;
993a520030eSHimanshu Madhani 
99426acc712SJitendra Kalsaria 	count = size / sizeof(u32);
99526acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)buf, count);
996a520030eSHimanshu Madhani 	memcpy(p_cache, buf, size);
997a520030eSHimanshu Madhani 	p_src = p_cache;
998a520030eSHimanshu Madhani 
999a520030eSHimanshu Madhani 	if (qlcnic_83xx_lock_flash(adapter) != 0) {
1000a520030eSHimanshu Madhani 		kfree(p_cache);
1001a520030eSHimanshu Madhani 		return -EIO;
1002a520030eSHimanshu Madhani 	}
1003a520030eSHimanshu Madhani 
1004a520030eSHimanshu Madhani 	if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) {
1005a520030eSHimanshu Madhani 		ret = qlcnic_83xx_enable_flash_write(adapter);
1006a520030eSHimanshu Madhani 		if (ret) {
1007a520030eSHimanshu Madhani 			kfree(p_cache);
1008a520030eSHimanshu Madhani 			qlcnic_83xx_unlock_flash(adapter);
1009a520030eSHimanshu Madhani 			return -EIO;
1010a520030eSHimanshu Madhani 		}
1011a520030eSHimanshu Madhani 	}
1012a520030eSHimanshu Madhani 
1013a520030eSHimanshu Madhani 	for (i = 0; i < count / QLC_83XX_FLASH_WRITE_MAX; i++) {
1014a520030eSHimanshu Madhani 		ret = qlcnic_83xx_flash_bulk_write(adapter, offset,
1015a520030eSHimanshu Madhani 						   (u32 *)p_src,
1016a520030eSHimanshu Madhani 						   QLC_83XX_FLASH_WRITE_MAX);
1017a520030eSHimanshu Madhani 
1018a520030eSHimanshu Madhani 		if (ret) {
1019a520030eSHimanshu Madhani 			if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) {
1020a520030eSHimanshu Madhani 				ret = qlcnic_83xx_disable_flash_write(adapter);
1021a520030eSHimanshu Madhani 				if (ret) {
1022a520030eSHimanshu Madhani 					kfree(p_cache);
1023a520030eSHimanshu Madhani 					qlcnic_83xx_unlock_flash(adapter);
1024a520030eSHimanshu Madhani 					return -EIO;
1025a520030eSHimanshu Madhani 				}
1026a520030eSHimanshu Madhani 			}
1027a520030eSHimanshu Madhani 
1028a520030eSHimanshu Madhani 			kfree(p_cache);
1029a520030eSHimanshu Madhani 			qlcnic_83xx_unlock_flash(adapter);
1030a520030eSHimanshu Madhani 			return -EIO;
1031a520030eSHimanshu Madhani 		}
1032a520030eSHimanshu Madhani 
1033a520030eSHimanshu Madhani 		p_src = p_src + sizeof(u32)*QLC_83XX_FLASH_WRITE_MAX;
1034a520030eSHimanshu Madhani 		offset = offset + sizeof(u32)*QLC_83XX_FLASH_WRITE_MAX;
1035a520030eSHimanshu Madhani 	}
1036a520030eSHimanshu Madhani 
1037a520030eSHimanshu Madhani 	if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) {
1038a520030eSHimanshu Madhani 		ret = qlcnic_83xx_disable_flash_write(adapter);
1039a520030eSHimanshu Madhani 		if (ret) {
1040a520030eSHimanshu Madhani 			kfree(p_cache);
1041a520030eSHimanshu Madhani 			qlcnic_83xx_unlock_flash(adapter);
1042a520030eSHimanshu Madhani 			return -EIO;
1043a520030eSHimanshu Madhani 		}
1044a520030eSHimanshu Madhani 	}
1045a520030eSHimanshu Madhani 
1046a520030eSHimanshu Madhani 	kfree(p_cache);
1047a520030eSHimanshu Madhani 	qlcnic_83xx_unlock_flash(adapter);
1048a520030eSHimanshu Madhani 
1049a520030eSHimanshu Madhani 	return 0;
1050a520030eSHimanshu Madhani }
1051a520030eSHimanshu Madhani 
qlcnic_83xx_sysfs_flash_write(struct qlcnic_adapter * adapter,char * buf,loff_t offset,size_t size)1052a520030eSHimanshu Madhani static int qlcnic_83xx_sysfs_flash_write(struct qlcnic_adapter *adapter,
1053a520030eSHimanshu Madhani 					 char *buf, loff_t offset, size_t size)
1054a520030eSHimanshu Madhani {
1055a520030eSHimanshu Madhani 	int  i, ret, count;
1056a520030eSHimanshu Madhani 	unsigned char *p_cache, *p_src;
1057a520030eSHimanshu Madhani 
1058a520030eSHimanshu Madhani 	p_cache = kcalloc(size, sizeof(unsigned char), GFP_KERNEL);
1059a520030eSHimanshu Madhani 	if (!p_cache)
1060a520030eSHimanshu Madhani 		return -ENOMEM;
1061a520030eSHimanshu Madhani 
106226acc712SJitendra Kalsaria 	qlcnic_swap32_buffer((u32 *)buf, size / sizeof(u32));
1063a520030eSHimanshu Madhani 	memcpy(p_cache, buf, size);
1064a520030eSHimanshu Madhani 	p_src = p_cache;
1065a520030eSHimanshu Madhani 	count = size / sizeof(u32);
1066a520030eSHimanshu Madhani 
1067a520030eSHimanshu Madhani 	if (qlcnic_83xx_lock_flash(adapter) != 0) {
1068a520030eSHimanshu Madhani 		kfree(p_cache);
1069a520030eSHimanshu Madhani 		return -EIO;
1070a520030eSHimanshu Madhani 	}
1071a520030eSHimanshu Madhani 
1072a520030eSHimanshu Madhani 	if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) {
1073a520030eSHimanshu Madhani 		ret = qlcnic_83xx_enable_flash_write(adapter);
1074a520030eSHimanshu Madhani 		if (ret) {
1075a520030eSHimanshu Madhani 			kfree(p_cache);
1076a520030eSHimanshu Madhani 			qlcnic_83xx_unlock_flash(adapter);
1077a520030eSHimanshu Madhani 			return -EIO;
1078a520030eSHimanshu Madhani 		}
1079a520030eSHimanshu Madhani 	}
1080a520030eSHimanshu Madhani 
1081a520030eSHimanshu Madhani 	for (i = 0; i < count; i++) {
1082a520030eSHimanshu Madhani 		ret = qlcnic_83xx_flash_write32(adapter, offset, (u32 *)p_src);
1083a520030eSHimanshu Madhani 		if (ret) {
1084a520030eSHimanshu Madhani 			if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) {
1085a520030eSHimanshu Madhani 				ret = qlcnic_83xx_disable_flash_write(adapter);
1086a520030eSHimanshu Madhani 				if (ret) {
1087a520030eSHimanshu Madhani 					kfree(p_cache);
1088a520030eSHimanshu Madhani 					qlcnic_83xx_unlock_flash(adapter);
1089a520030eSHimanshu Madhani 					return -EIO;
1090a520030eSHimanshu Madhani 				}
1091a520030eSHimanshu Madhani 			}
1092a520030eSHimanshu Madhani 			kfree(p_cache);
1093a520030eSHimanshu Madhani 			qlcnic_83xx_unlock_flash(adapter);
1094a520030eSHimanshu Madhani 			return -EIO;
1095a520030eSHimanshu Madhani 		}
1096a520030eSHimanshu Madhani 
1097a520030eSHimanshu Madhani 		p_src = p_src + sizeof(u32);
1098a520030eSHimanshu Madhani 		offset = offset + sizeof(u32);
1099a520030eSHimanshu Madhani 	}
1100a520030eSHimanshu Madhani 
1101a520030eSHimanshu Madhani 	if (adapter->ahw->fdt.mfg_id == adapter->flash_mfg_id) {
1102a520030eSHimanshu Madhani 		ret = qlcnic_83xx_disable_flash_write(adapter);
1103a520030eSHimanshu Madhani 		if (ret) {
1104a520030eSHimanshu Madhani 			kfree(p_cache);
1105a520030eSHimanshu Madhani 			qlcnic_83xx_unlock_flash(adapter);
1106a520030eSHimanshu Madhani 			return -EIO;
1107a520030eSHimanshu Madhani 		}
1108a520030eSHimanshu Madhani 	}
1109a520030eSHimanshu Madhani 
1110a520030eSHimanshu Madhani 	kfree(p_cache);
1111a520030eSHimanshu Madhani 	qlcnic_83xx_unlock_flash(adapter);
1112a520030eSHimanshu Madhani 
1113a520030eSHimanshu Madhani 	return 0;
1114a520030eSHimanshu Madhani }
1115a520030eSHimanshu Madhani 
qlcnic_83xx_sysfs_flash_write_handler(struct file * filp,struct kobject * kobj,struct bin_attribute * attr,char * buf,loff_t offset,size_t size)1116a520030eSHimanshu Madhani static ssize_t qlcnic_83xx_sysfs_flash_write_handler(struct file *filp,
1117a520030eSHimanshu Madhani 						     struct kobject *kobj,
1118a520030eSHimanshu Madhani 						     struct bin_attribute *attr,
1119a520030eSHimanshu Madhani 						     char *buf, loff_t offset,
1120a520030eSHimanshu Madhani 						     size_t size)
1121a520030eSHimanshu Madhani {
1122a520030eSHimanshu Madhani 	int  ret;
1123a520030eSHimanshu Madhani 	static int flash_mode;
1124a520030eSHimanshu Madhani 	unsigned long data;
11250acb47a3SWang Qing 	struct device *dev = kobj_to_dev(kobj);
1126a520030eSHimanshu Madhani 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
1127a520030eSHimanshu Madhani 
1128a520030eSHimanshu Madhani 	ret = kstrtoul(buf, 16, &data);
11295fc853ccSDan Carpenter 	if (ret)
11305fc853ccSDan Carpenter 		return ret;
1131a520030eSHimanshu Madhani 
1132a520030eSHimanshu Madhani 	switch (data) {
1133a520030eSHimanshu Madhani 	case QLC_83XX_FLASH_SECTOR_ERASE_CMD:
1134a520030eSHimanshu Madhani 		flash_mode = QLC_83XX_ERASE_MODE;
1135a520030eSHimanshu Madhani 		ret = qlcnic_83xx_erase_flash_sector(adapter, offset);
1136a520030eSHimanshu Madhani 		if (ret) {
1137a520030eSHimanshu Madhani 			dev_err(&adapter->pdev->dev,
1138a520030eSHimanshu Madhani 				"%s failed at %d\n", __func__, __LINE__);
1139a520030eSHimanshu Madhani 			return -EIO;
1140a520030eSHimanshu Madhani 		}
1141a520030eSHimanshu Madhani 		break;
1142a520030eSHimanshu Madhani 
1143a520030eSHimanshu Madhani 	case QLC_83XX_FLASH_BULK_WRITE_CMD:
1144a520030eSHimanshu Madhani 		flash_mode = QLC_83XX_BULK_WRITE_MODE;
1145a520030eSHimanshu Madhani 		break;
1146a520030eSHimanshu Madhani 
1147a520030eSHimanshu Madhani 	case QLC_83XX_FLASH_WRITE_CMD:
1148a520030eSHimanshu Madhani 		flash_mode = QLC_83XX_WRITE_MODE;
1149a520030eSHimanshu Madhani 		break;
1150a520030eSHimanshu Madhani 	default:
1151a520030eSHimanshu Madhani 		if (flash_mode == QLC_83XX_BULK_WRITE_MODE) {
1152a520030eSHimanshu Madhani 			ret = qlcnic_83xx_sysfs_flash_bulk_write(adapter, buf,
1153a520030eSHimanshu Madhani 								 offset, size);
1154a520030eSHimanshu Madhani 			if (ret) {
1155a520030eSHimanshu Madhani 				dev_err(&adapter->pdev->dev,
1156a520030eSHimanshu Madhani 					"%s failed at %d\n",
1157a520030eSHimanshu Madhani 					__func__, __LINE__);
1158a520030eSHimanshu Madhani 				return -EIO;
1159a520030eSHimanshu Madhani 			}
1160a520030eSHimanshu Madhani 		}
1161a520030eSHimanshu Madhani 
1162a520030eSHimanshu Madhani 		if (flash_mode == QLC_83XX_WRITE_MODE) {
1163a520030eSHimanshu Madhani 			ret = qlcnic_83xx_sysfs_flash_write(adapter, buf,
1164a520030eSHimanshu Madhani 							    offset, size);
1165a520030eSHimanshu Madhani 			if (ret) {
1166a520030eSHimanshu Madhani 				dev_err(&adapter->pdev->dev,
1167a520030eSHimanshu Madhani 					"%s failed at %d\n", __func__,
1168a520030eSHimanshu Madhani 					__LINE__);
1169a520030eSHimanshu Madhani 				return -EIO;
1170a520030eSHimanshu Madhani 			}
1171a520030eSHimanshu Madhani 		}
1172a520030eSHimanshu Madhani 	}
1173a520030eSHimanshu Madhani 
1174a520030eSHimanshu Madhani 	return size;
1175a520030eSHimanshu Madhani }
1176a520030eSHimanshu Madhani 
1177da6817ebSBhumika Goyal static const struct device_attribute dev_attr_bridged_mode = {
1178d3757ba4SJoe Perches 	.attr = { .name = "bridged_mode", .mode = 0644 },
1179ec079a07SSony Chacko 	.show = qlcnic_show_bridged_mode,
1180ec079a07SSony Chacko 	.store = qlcnic_store_bridged_mode,
1181ec079a07SSony Chacko };
1182ec079a07SSony Chacko 
1183da6817ebSBhumika Goyal static const struct device_attribute dev_attr_diag_mode = {
1184d3757ba4SJoe Perches 	.attr = { .name = "diag_mode", .mode = 0644 },
1185ec079a07SSony Chacko 	.show = qlcnic_show_diag_mode,
1186ec079a07SSony Chacko 	.store = qlcnic_store_diag_mode,
1187ec079a07SSony Chacko };
1188ec079a07SSony Chacko 
1189da6817ebSBhumika Goyal static const struct device_attribute dev_attr_beacon = {
1190d3757ba4SJoe Perches 	.attr = { .name = "beacon", .mode = 0644 },
1191ec079a07SSony Chacko 	.show = qlcnic_show_beacon,
1192ec079a07SSony Chacko 	.store = qlcnic_store_beacon,
1193ec079a07SSony Chacko };
1194ec079a07SSony Chacko 
11950ccea221SBhumika Goyal static const struct bin_attribute bin_attr_crb = {
1196d3757ba4SJoe Perches 	.attr = { .name = "crb", .mode = 0644 },
1197ec079a07SSony Chacko 	.size = 0,
1198ec079a07SSony Chacko 	.read = qlcnic_sysfs_read_crb,
1199ec079a07SSony Chacko 	.write = qlcnic_sysfs_write_crb,
1200ec079a07SSony Chacko };
1201ec079a07SSony Chacko 
12020ccea221SBhumika Goyal static const struct bin_attribute bin_attr_mem = {
1203d3757ba4SJoe Perches 	.attr = { .name = "mem", .mode = 0644 },
1204ec079a07SSony Chacko 	.size = 0,
1205ec079a07SSony Chacko 	.read = qlcnic_sysfs_read_mem,
1206ec079a07SSony Chacko 	.write = qlcnic_sysfs_write_mem,
1207ec079a07SSony Chacko };
1208ec079a07SSony Chacko 
12090ccea221SBhumika Goyal static const struct bin_attribute bin_attr_npar_config = {
1210d3757ba4SJoe Perches 	.attr = { .name = "npar_config", .mode = 0644 },
1211ec079a07SSony Chacko 	.size = 0,
1212ec079a07SSony Chacko 	.read = qlcnic_sysfs_read_npar_config,
1213ec079a07SSony Chacko 	.write = qlcnic_sysfs_write_npar_config,
1214ec079a07SSony Chacko };
1215ec079a07SSony Chacko 
12160ccea221SBhumika Goyal static const struct bin_attribute bin_attr_pci_config = {
1217d3757ba4SJoe Perches 	.attr = { .name = "pci_config", .mode = 0644 },
1218ec079a07SSony Chacko 	.size = 0,
1219ec079a07SSony Chacko 	.read = qlcnic_sysfs_read_pci_config,
1220ec079a07SSony Chacko 	.write = NULL,
1221ec079a07SSony Chacko };
1222ec079a07SSony Chacko 
12230ccea221SBhumika Goyal static const struct bin_attribute bin_attr_port_stats = {
1224d3757ba4SJoe Perches 	.attr = { .name = "port_stats", .mode = 0644 },
1225ec079a07SSony Chacko 	.size = 0,
1226ec079a07SSony Chacko 	.read = qlcnic_sysfs_get_port_stats,
1227ec079a07SSony Chacko 	.write = qlcnic_sysfs_clear_port_stats,
1228ec079a07SSony Chacko };
1229ec079a07SSony Chacko 
12300ccea221SBhumika Goyal static const struct bin_attribute bin_attr_esw_stats = {
1231d3757ba4SJoe Perches 	.attr = { .name = "esw_stats", .mode = 0644 },
1232ec079a07SSony Chacko 	.size = 0,
1233ec079a07SSony Chacko 	.read = qlcnic_sysfs_get_esw_stats,
1234ec079a07SSony Chacko 	.write = qlcnic_sysfs_clear_esw_stats,
1235ec079a07SSony Chacko };
1236ec079a07SSony Chacko 
12370ccea221SBhumika Goyal static const struct bin_attribute bin_attr_esw_config = {
1238d3757ba4SJoe Perches 	.attr = { .name = "esw_config", .mode = 0644 },
1239ec079a07SSony Chacko 	.size = 0,
1240ec079a07SSony Chacko 	.read = qlcnic_sysfs_read_esw_config,
1241ec079a07SSony Chacko 	.write = qlcnic_sysfs_write_esw_config,
1242ec079a07SSony Chacko };
1243ec079a07SSony Chacko 
12440ccea221SBhumika Goyal static const struct bin_attribute bin_attr_pm_config = {
1245d3757ba4SJoe Perches 	.attr = { .name = "pm_config", .mode = 0644 },
1246ec079a07SSony Chacko 	.size = 0,
1247ec079a07SSony Chacko 	.read = qlcnic_sysfs_read_pm_config,
1248ec079a07SSony Chacko 	.write = qlcnic_sysfs_write_pm_config,
1249ec079a07SSony Chacko };
1250ec079a07SSony Chacko 
12512d29b397SBhumika Goyal static const struct bin_attribute bin_attr_flash = {
1252d3757ba4SJoe Perches 	.attr = { .name = "flash", .mode = 0644 },
1253a520030eSHimanshu Madhani 	.size = 0,
1254a520030eSHimanshu Madhani 	.read = qlcnic_83xx_sysfs_flash_read_handler,
1255a520030eSHimanshu Madhani 	.write = qlcnic_83xx_sysfs_flash_write_handler,
1256a520030eSHimanshu Madhani };
1257a520030eSHimanshu Madhani 
12581f0f467bSHarish Patil #ifdef CONFIG_QLCNIC_HWMON
12591f0f467bSHarish Patil 
qlcnic_hwmon_show_temp(struct device * dev,struct device_attribute * dev_attr,char * buf)12601f0f467bSHarish Patil static ssize_t qlcnic_hwmon_show_temp(struct device *dev,
12611f0f467bSHarish Patil 				      struct device_attribute *dev_attr,
12621f0f467bSHarish Patil 				      char *buf)
12631f0f467bSHarish Patil {
12641f0f467bSHarish Patil 	struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
12651f0f467bSHarish Patil 	unsigned int temperature = 0, value = 0;
12661f0f467bSHarish Patil 
12671f0f467bSHarish Patil 	if (qlcnic_83xx_check(adapter))
12681f0f467bSHarish Patil 		value = QLCRDX(adapter->ahw, QLC_83XX_ASIC_TEMP);
12691f0f467bSHarish Patil 	else if (qlcnic_82xx_check(adapter))
12701f0f467bSHarish Patil 		value = QLC_SHARED_REG_RD32(adapter, QLCNIC_ASIC_TEMP);
12711f0f467bSHarish Patil 
12721f0f467bSHarish Patil 	temperature = qlcnic_get_temp_val(value);
12731f0f467bSHarish Patil 	/* display millidegree celcius */
12741f0f467bSHarish Patil 	temperature *= 1000;
12751f0f467bSHarish Patil 	return sprintf(buf, "%u\n", temperature);
12761f0f467bSHarish Patil }
12771f0f467bSHarish Patil 
12781f0f467bSHarish Patil /* hwmon-sysfs attributes */
1279d3757ba4SJoe Perches static SENSOR_DEVICE_ATTR(temp1_input, 0444,
12801f0f467bSHarish Patil 			  qlcnic_hwmon_show_temp, NULL, 1);
12811f0f467bSHarish Patil 
12821f0f467bSHarish Patil static struct attribute *qlcnic_hwmon_attrs[] = {
12831f0f467bSHarish Patil 	&sensor_dev_attr_temp1_input.dev_attr.attr,
12841f0f467bSHarish Patil 	NULL
12851f0f467bSHarish Patil };
12861f0f467bSHarish Patil 
12871f0f467bSHarish Patil ATTRIBUTE_GROUPS(qlcnic_hwmon);
12881f0f467bSHarish Patil 
qlcnic_register_hwmon_dev(struct qlcnic_adapter * adapter)12891f0f467bSHarish Patil void qlcnic_register_hwmon_dev(struct qlcnic_adapter *adapter)
12901f0f467bSHarish Patil {
12911f0f467bSHarish Patil 	struct device *dev = &adapter->pdev->dev;
12921f0f467bSHarish Patil 	struct device *hwmon_dev;
12931f0f467bSHarish Patil 
12941f0f467bSHarish Patil 	/* Skip hwmon registration for a VF device */
12951f0f467bSHarish Patil 	if (qlcnic_sriov_vf_check(adapter)) {
12961f0f467bSHarish Patil 		adapter->ahw->hwmon_dev = NULL;
12971f0f467bSHarish Patil 		return;
12981f0f467bSHarish Patil 	}
12991f0f467bSHarish Patil 	hwmon_dev = hwmon_device_register_with_groups(dev, qlcnic_driver_name,
13001f0f467bSHarish Patil 						      adapter,
13011f0f467bSHarish Patil 						      qlcnic_hwmon_groups);
13021f0f467bSHarish Patil 	if (IS_ERR(hwmon_dev)) {
13031f0f467bSHarish Patil 		dev_err(dev, "Cannot register with hwmon, err=%ld\n",
13041f0f467bSHarish Patil 			PTR_ERR(hwmon_dev));
13051f0f467bSHarish Patil 		hwmon_dev = NULL;
13061f0f467bSHarish Patil 	}
13071f0f467bSHarish Patil 	adapter->ahw->hwmon_dev = hwmon_dev;
13081f0f467bSHarish Patil }
13091f0f467bSHarish Patil 
qlcnic_unregister_hwmon_dev(struct qlcnic_adapter * adapter)13101f0f467bSHarish Patil void qlcnic_unregister_hwmon_dev(struct qlcnic_adapter *adapter)
13111f0f467bSHarish Patil {
13121f0f467bSHarish Patil 	struct device *hwmon_dev = adapter->ahw->hwmon_dev;
13131f0f467bSHarish Patil 	if (hwmon_dev) {
13141f0f467bSHarish Patil 		hwmon_device_unregister(hwmon_dev);
13151f0f467bSHarish Patil 		adapter->ahw->hwmon_dev = NULL;
13161f0f467bSHarish Patil 	}
13171f0f467bSHarish Patil }
13181f0f467bSHarish Patil #endif
13191f0f467bSHarish Patil 
qlcnic_create_sysfs_entries(struct qlcnic_adapter * adapter)1320ec079a07SSony Chacko void qlcnic_create_sysfs_entries(struct qlcnic_adapter *adapter)
1321ec079a07SSony Chacko {
1322ec079a07SSony Chacko 	struct device *dev = &adapter->pdev->dev;
1323ec079a07SSony Chacko 
132479788450SSony Chacko 	if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_BDG)
1325ec079a07SSony Chacko 		if (device_create_file(dev, &dev_attr_bridged_mode))
1326ec079a07SSony Chacko 			dev_warn(dev,
1327ec079a07SSony Chacko 				 "failed to create bridged_mode sysfs entry\n");
1328ec079a07SSony Chacko }
1329ec079a07SSony Chacko 
qlcnic_remove_sysfs_entries(struct qlcnic_adapter * adapter)1330ec079a07SSony Chacko void qlcnic_remove_sysfs_entries(struct qlcnic_adapter *adapter)
1331ec079a07SSony Chacko {
1332ec079a07SSony Chacko 	struct device *dev = &adapter->pdev->dev;
1333ec079a07SSony Chacko 
133479788450SSony Chacko 	if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_BDG)
1335ec079a07SSony Chacko 		device_remove_file(dev, &dev_attr_bridged_mode);
1336ec079a07SSony Chacko }
1337ec079a07SSony Chacko 
qlcnic_create_diag_entries(struct qlcnic_adapter * adapter)133821041400Sstephen hemminger static void qlcnic_create_diag_entries(struct qlcnic_adapter *adapter)
1339ec079a07SSony Chacko {
1340ec079a07SSony Chacko 	struct device *dev = &adapter->pdev->dev;
1341ec079a07SSony Chacko 
1342ec079a07SSony Chacko 	if (device_create_bin_file(dev, &bin_attr_port_stats))
1343ec079a07SSony Chacko 		dev_info(dev, "failed to create port stats sysfs entry");
1344ec079a07SSony Chacko 
134579788450SSony Chacko 	if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC)
1346ec079a07SSony Chacko 		return;
1347ec079a07SSony Chacko 	if (device_create_file(dev, &dev_attr_diag_mode))
1348ec079a07SSony Chacko 		dev_info(dev, "failed to create diag_mode sysfs entry\n");
1349ec079a07SSony Chacko 	if (device_create_bin_file(dev, &bin_attr_crb))
1350ec079a07SSony Chacko 		dev_info(dev, "failed to create crb sysfs entry\n");
1351ec079a07SSony Chacko 	if (device_create_bin_file(dev, &bin_attr_mem))
1352ec079a07SSony Chacko 		dev_info(dev, "failed to create mem sysfs entry\n");
1353ec079a07SSony Chacko 
135478ea2d97SSucheta Chakraborty 	if (test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state))
135566451615SSucheta Chakraborty 		return;
135666451615SSucheta Chakraborty 
1357ec079a07SSony Chacko 	if (device_create_bin_file(dev, &bin_attr_pci_config))
1358ec079a07SSony Chacko 		dev_info(dev, "failed to create pci config sysfs entry");
135966451615SSucheta Chakraborty 
1360ec079a07SSony Chacko 	if (device_create_file(dev, &dev_attr_beacon))
1361ec079a07SSony Chacko 		dev_info(dev, "failed to create beacon sysfs entry");
1362ec079a07SSony Chacko 
1363ec079a07SSony Chacko 	if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED))
1364ec079a07SSony Chacko 		return;
1365ec079a07SSony Chacko 	if (device_create_bin_file(dev, &bin_attr_esw_config))
1366ec079a07SSony Chacko 		dev_info(dev, "failed to create esw config sysfs entry");
136779788450SSony Chacko 	if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC)
1368ec079a07SSony Chacko 		return;
1369ec079a07SSony Chacko 	if (device_create_bin_file(dev, &bin_attr_npar_config))
1370ec079a07SSony Chacko 		dev_info(dev, "failed to create npar config sysfs entry");
1371ec079a07SSony Chacko 	if (device_create_bin_file(dev, &bin_attr_pm_config))
1372ec079a07SSony Chacko 		dev_info(dev, "failed to create pm config sysfs entry");
1373ec079a07SSony Chacko 	if (device_create_bin_file(dev, &bin_attr_esw_stats))
1374ec079a07SSony Chacko 		dev_info(dev, "failed to create eswitch stats sysfs entry");
1375ec079a07SSony Chacko }
1376ec079a07SSony Chacko 
qlcnic_remove_diag_entries(struct qlcnic_adapter * adapter)137721041400Sstephen hemminger static void qlcnic_remove_diag_entries(struct qlcnic_adapter *adapter)
1378ec079a07SSony Chacko {
1379ec079a07SSony Chacko 	struct device *dev = &adapter->pdev->dev;
1380ec079a07SSony Chacko 
1381ec079a07SSony Chacko 	device_remove_bin_file(dev, &bin_attr_port_stats);
1382ec079a07SSony Chacko 
138379788450SSony Chacko 	if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC)
1384ec079a07SSony Chacko 		return;
1385ec079a07SSony Chacko 	device_remove_file(dev, &dev_attr_diag_mode);
1386ec079a07SSony Chacko 	device_remove_bin_file(dev, &bin_attr_crb);
1387ec079a07SSony Chacko 	device_remove_bin_file(dev, &bin_attr_mem);
138866451615SSucheta Chakraborty 
138978ea2d97SSucheta Chakraborty 	if (test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state))
139066451615SSucheta Chakraborty 		return;
139166451615SSucheta Chakraborty 
1392ec079a07SSony Chacko 	device_remove_bin_file(dev, &bin_attr_pci_config);
1393ec079a07SSony Chacko 	device_remove_file(dev, &dev_attr_beacon);
1394ec079a07SSony Chacko 	if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED))
1395ec079a07SSony Chacko 		return;
1396ec079a07SSony Chacko 	device_remove_bin_file(dev, &bin_attr_esw_config);
139779788450SSony Chacko 	if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC)
1398ec079a07SSony Chacko 		return;
1399ec079a07SSony Chacko 	device_remove_bin_file(dev, &bin_attr_npar_config);
1400ec079a07SSony Chacko 	device_remove_bin_file(dev, &bin_attr_pm_config);
1401ec079a07SSony Chacko 	device_remove_bin_file(dev, &bin_attr_esw_stats);
1402ec079a07SSony Chacko }
14037e2cf4feSSony Chacko 
qlcnic_82xx_add_sysfs(struct qlcnic_adapter * adapter)14047e2cf4feSSony Chacko void qlcnic_82xx_add_sysfs(struct qlcnic_adapter *adapter)
14057e2cf4feSSony Chacko {
14067e2cf4feSSony Chacko 	qlcnic_create_diag_entries(adapter);
14077e2cf4feSSony Chacko }
14087e2cf4feSSony Chacko 
qlcnic_82xx_remove_sysfs(struct qlcnic_adapter * adapter)14097e2cf4feSSony Chacko void qlcnic_82xx_remove_sysfs(struct qlcnic_adapter *adapter)
14107e2cf4feSSony Chacko {
14117e2cf4feSSony Chacko 	qlcnic_remove_diag_entries(adapter);
14127e2cf4feSSony Chacko }
1413319ecf12SSony Chacko 
qlcnic_83xx_add_sysfs(struct qlcnic_adapter * adapter)1414319ecf12SSony Chacko void qlcnic_83xx_add_sysfs(struct qlcnic_adapter *adapter)
1415319ecf12SSony Chacko {
1416a520030eSHimanshu Madhani 	struct device *dev = &adapter->pdev->dev;
1417a520030eSHimanshu Madhani 
1418319ecf12SSony Chacko 	qlcnic_create_diag_entries(adapter);
1419a520030eSHimanshu Madhani 
1420a520030eSHimanshu Madhani 	if (sysfs_create_bin_file(&dev->kobj, &bin_attr_flash))
1421a520030eSHimanshu Madhani 		dev_info(dev, "failed to create flash sysfs entry\n");
1422319ecf12SSony Chacko }
1423319ecf12SSony Chacko 
qlcnic_83xx_remove_sysfs(struct qlcnic_adapter * adapter)1424319ecf12SSony Chacko void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *adapter)
1425319ecf12SSony Chacko {
1426a520030eSHimanshu Madhani 	struct device *dev = &adapter->pdev->dev;
1427a520030eSHimanshu Madhani 
1428319ecf12SSony Chacko 	qlcnic_remove_diag_entries(adapter);
1429a520030eSHimanshu Madhani 	sysfs_remove_bin_file(&dev->kobj, &bin_attr_flash);
1430319ecf12SSony Chacko }
1431