xref: /linux/drivers/net/ethernet/cisco/enic/enic_dev.c (revision 1e91c98bc9a8ef8198e73151b2a118cd3748925d)
1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright 2011 Cisco Systems, Inc.  All rights reserved.
3 
4 #include <linux/pci.h>
5 #include <linux/etherdevice.h>
6 
7 #include "vnic_dev.h"
8 #include "vnic_vic.h"
9 #include "enic_res.h"
10 #include "enic.h"
11 #include "enic_dev.h"
12 
13 int enic_dev_fw_info(struct enic *enic, struct vnic_devcmd_fw_info **fw_info)
14 {
15 	int err;
16 
17 	spin_lock_bh(&enic->devcmd_lock);
18 	err = vnic_dev_fw_info(enic->vdev, fw_info);
19 	spin_unlock_bh(&enic->devcmd_lock);
20 
21 	return err;
22 }
23 
24 int enic_dev_stats_dump(struct enic *enic, struct vnic_stats **vstats)
25 {
26 	int err;
27 
28 	spin_lock_bh(&enic->devcmd_lock);
29 	err = vnic_dev_stats_dump(enic->vdev, vstats);
30 	spin_unlock_bh(&enic->devcmd_lock);
31 
32 	return err;
33 }
34 
35 int enic_dev_add_station_addr(struct enic *enic)
36 {
37 	int err;
38 
39 	if (!is_valid_ether_addr(enic->netdev->dev_addr))
40 		return -EADDRNOTAVAIL;
41 
42 	spin_lock_bh(&enic->devcmd_lock);
43 	err = vnic_dev_add_addr(enic->vdev, enic->netdev->dev_addr);
44 	spin_unlock_bh(&enic->devcmd_lock);
45 
46 	return err;
47 }
48 
49 int enic_dev_del_station_addr(struct enic *enic)
50 {
51 	int err;
52 
53 	if (!is_valid_ether_addr(enic->netdev->dev_addr))
54 		return -EADDRNOTAVAIL;
55 
56 	spin_lock_bh(&enic->devcmd_lock);
57 	err = vnic_dev_del_addr(enic->vdev, enic->netdev->dev_addr);
58 	spin_unlock_bh(&enic->devcmd_lock);
59 
60 	return err;
61 }
62 
63 int enic_dev_packet_filter(struct enic *enic, int directed, int multicast,
64 	int broadcast, int promisc, int allmulti)
65 {
66 	int err;
67 
68 	spin_lock_bh(&enic->devcmd_lock);
69 	err = vnic_dev_packet_filter(enic->vdev, directed,
70 		multicast, broadcast, promisc, allmulti);
71 	spin_unlock_bh(&enic->devcmd_lock);
72 
73 	return err;
74 }
75 
76 int enic_dev_add_addr(struct enic *enic, const u8 *addr)
77 {
78 	int err;
79 
80 	spin_lock_bh(&enic->devcmd_lock);
81 	err = vnic_dev_add_addr(enic->vdev, addr);
82 	spin_unlock_bh(&enic->devcmd_lock);
83 
84 	return err;
85 }
86 
87 int enic_dev_del_addr(struct enic *enic, const u8 *addr)
88 {
89 	int err;
90 
91 	spin_lock_bh(&enic->devcmd_lock);
92 	err = vnic_dev_del_addr(enic->vdev, addr);
93 	spin_unlock_bh(&enic->devcmd_lock);
94 
95 	return err;
96 }
97 
98 int enic_dev_notify_unset(struct enic *enic)
99 {
100 	int err;
101 
102 	spin_lock_bh(&enic->devcmd_lock);
103 	err = vnic_dev_notify_unset(enic->vdev);
104 	spin_unlock_bh(&enic->devcmd_lock);
105 
106 	return err;
107 }
108 
109 int enic_dev_hang_notify(struct enic *enic)
110 {
111 	int err;
112 
113 	spin_lock_bh(&enic->devcmd_lock);
114 	err = vnic_dev_hang_notify(enic->vdev);
115 	spin_unlock_bh(&enic->devcmd_lock);
116 
117 	return err;
118 }
119 
120 int enic_dev_set_ig_vlan_rewrite_mode(struct enic *enic)
121 {
122 	int err;
123 
124 	spin_lock_bh(&enic->devcmd_lock);
125 	err = vnic_dev_set_ig_vlan_rewrite_mode(enic->vdev,
126 		IG_VLAN_REWRITE_MODE_PRIORITY_TAG_DEFAULT_VLAN);
127 	spin_unlock_bh(&enic->devcmd_lock);
128 
129 	return err;
130 }
131 
132 int enic_dev_enable(struct enic *enic)
133 {
134 	int err = 0;
135 
136 	spin_lock_bh(&enic->devcmd_lock);
137 	if (enic->enable_count == 0)
138 		err = vnic_dev_enable_wait(enic->vdev);
139 	if (!err)
140 		enic->enable_count++;
141 	spin_unlock_bh(&enic->devcmd_lock);
142 
143 	return err;
144 }
145 
146 int enic_dev_disable(struct enic *enic)
147 {
148 	int err = 0;
149 
150 	spin_lock_bh(&enic->devcmd_lock);
151 	if (enic->enable_count == 0) {
152 		spin_unlock_bh(&enic->devcmd_lock);
153 		return 0;
154 	}
155 	enic->enable_count--;
156 	if (enic->enable_count == 0)
157 		err = vnic_dev_disable(enic->vdev);
158 	spin_unlock_bh(&enic->devcmd_lock);
159 
160 	return err;
161 }
162 
163 int enic_dev_intr_coal_timer_info(struct enic *enic)
164 {
165 	int err;
166 
167 	spin_lock_bh(&enic->devcmd_lock);
168 	err = vnic_dev_intr_coal_timer_info(enic->vdev);
169 	spin_unlock_bh(&enic->devcmd_lock);
170 
171 	return err;
172 }
173 
174 /* rtnl lock is held */
175 int enic_vlan_rx_add_vid(struct net_device *netdev, __be16 proto, u16 vid)
176 {
177 	struct enic *enic = netdev_priv(netdev);
178 	int err;
179 
180 	spin_lock_bh(&enic->devcmd_lock);
181 	err = enic_add_vlan(enic, vid);
182 	spin_unlock_bh(&enic->devcmd_lock);
183 
184 	return err;
185 }
186 
187 /* rtnl lock is held */
188 int enic_vlan_rx_kill_vid(struct net_device *netdev, __be16 proto, u16 vid)
189 {
190 	struct enic *enic = netdev_priv(netdev);
191 	int err;
192 
193 	spin_lock_bh(&enic->devcmd_lock);
194 	err = enic_del_vlan(enic, vid);
195 	spin_unlock_bh(&enic->devcmd_lock);
196 
197 	return err;
198 }
199 
200 int enic_dev_status_to_errno(int devcmd_status)
201 {
202 	switch (devcmd_status) {
203 	case ERR_SUCCESS:
204 		return 0;
205 	case ERR_EINVAL:
206 		return -EINVAL;
207 	case ERR_EFAULT:
208 		return -EFAULT;
209 	case ERR_EPERM:
210 		return -EPERM;
211 	case ERR_EBUSY:
212 		return -EBUSY;
213 	case ERR_ECMDUNKNOWN:
214 	case ERR_ENOTSUPPORTED:
215 		return -EOPNOTSUPP;
216 	case ERR_EBADSTATE:
217 		return -EINVAL;
218 	case ERR_ENOMEM:
219 		return -ENOMEM;
220 	case ERR_ETIMEDOUT:
221 		return -ETIMEDOUT;
222 	case ERR_ELINKDOWN:
223 		return -ENETDOWN;
224 	case ERR_EINPROGRESS:
225 		return -EINPROGRESS;
226 	case ERR_EMAXRES:
227 	default:
228 		return (devcmd_status < 0) ? devcmd_status : -1;
229 	}
230 }
231