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