1 /* 2 * Copyright 2011 Cisco Systems, Inc. All rights reserved. 3 * 4 * This program is free software; you may redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; version 2 of the License. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 9 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 10 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 11 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 12 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 13 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 14 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 15 * SOFTWARE. 16 * 17 */ 18 19 #include <linux/pci.h> 20 #include <linux/etherdevice.h> 21 22 #include "vnic_dev.h" 23 #include "vnic_vic.h" 24 #include "enic_res.h" 25 #include "enic.h" 26 #include "enic_dev.h" 27 28 int enic_dev_fw_info(struct enic *enic, struct vnic_devcmd_fw_info **fw_info) 29 { 30 int err; 31 32 spin_lock_bh(&enic->devcmd_lock); 33 err = vnic_dev_fw_info(enic->vdev, fw_info); 34 spin_unlock_bh(&enic->devcmd_lock); 35 36 return err; 37 } 38 39 int enic_dev_stats_dump(struct enic *enic, struct vnic_stats **vstats) 40 { 41 int err; 42 43 spin_lock_bh(&enic->devcmd_lock); 44 err = vnic_dev_stats_dump(enic->vdev, vstats); 45 spin_unlock_bh(&enic->devcmd_lock); 46 47 return err; 48 } 49 50 int enic_dev_add_station_addr(struct enic *enic) 51 { 52 int err; 53 54 if (!is_valid_ether_addr(enic->netdev->dev_addr)) 55 return -EADDRNOTAVAIL; 56 57 spin_lock_bh(&enic->devcmd_lock); 58 err = vnic_dev_add_addr(enic->vdev, enic->netdev->dev_addr); 59 spin_unlock_bh(&enic->devcmd_lock); 60 61 return err; 62 } 63 64 int enic_dev_del_station_addr(struct enic *enic) 65 { 66 int err; 67 68 if (!is_valid_ether_addr(enic->netdev->dev_addr)) 69 return -EADDRNOTAVAIL; 70 71 spin_lock_bh(&enic->devcmd_lock); 72 err = vnic_dev_del_addr(enic->vdev, enic->netdev->dev_addr); 73 spin_unlock_bh(&enic->devcmd_lock); 74 75 return err; 76 } 77 78 int enic_dev_packet_filter(struct enic *enic, int directed, int multicast, 79 int broadcast, int promisc, int allmulti) 80 { 81 int err; 82 83 spin_lock_bh(&enic->devcmd_lock); 84 err = vnic_dev_packet_filter(enic->vdev, directed, 85 multicast, broadcast, promisc, allmulti); 86 spin_unlock_bh(&enic->devcmd_lock); 87 88 return err; 89 } 90 91 int enic_dev_add_addr(struct enic *enic, const u8 *addr) 92 { 93 int err; 94 95 spin_lock_bh(&enic->devcmd_lock); 96 err = vnic_dev_add_addr(enic->vdev, addr); 97 spin_unlock_bh(&enic->devcmd_lock); 98 99 return err; 100 } 101 102 int enic_dev_del_addr(struct enic *enic, const u8 *addr) 103 { 104 int err; 105 106 spin_lock_bh(&enic->devcmd_lock); 107 err = vnic_dev_del_addr(enic->vdev, addr); 108 spin_unlock_bh(&enic->devcmd_lock); 109 110 return err; 111 } 112 113 int enic_dev_notify_unset(struct enic *enic) 114 { 115 int err; 116 117 spin_lock_bh(&enic->devcmd_lock); 118 err = vnic_dev_notify_unset(enic->vdev); 119 spin_unlock_bh(&enic->devcmd_lock); 120 121 return err; 122 } 123 124 int enic_dev_hang_notify(struct enic *enic) 125 { 126 int err; 127 128 spin_lock_bh(&enic->devcmd_lock); 129 err = vnic_dev_hang_notify(enic->vdev); 130 spin_unlock_bh(&enic->devcmd_lock); 131 132 return err; 133 } 134 135 int enic_dev_set_ig_vlan_rewrite_mode(struct enic *enic) 136 { 137 int err; 138 139 spin_lock_bh(&enic->devcmd_lock); 140 err = vnic_dev_set_ig_vlan_rewrite_mode(enic->vdev, 141 IG_VLAN_REWRITE_MODE_PRIORITY_TAG_DEFAULT_VLAN); 142 spin_unlock_bh(&enic->devcmd_lock); 143 144 return err; 145 } 146 147 int enic_dev_enable(struct enic *enic) 148 { 149 int err; 150 151 spin_lock_bh(&enic->devcmd_lock); 152 err = vnic_dev_enable_wait(enic->vdev); 153 spin_unlock_bh(&enic->devcmd_lock); 154 155 return err; 156 } 157 158 int enic_dev_disable(struct enic *enic) 159 { 160 int err; 161 162 spin_lock_bh(&enic->devcmd_lock); 163 err = vnic_dev_disable(enic->vdev); 164 spin_unlock_bh(&enic->devcmd_lock); 165 166 return err; 167 } 168 169 int enic_dev_intr_coal_timer_info(struct enic *enic) 170 { 171 int err; 172 173 spin_lock_bh(&enic->devcmd_lock); 174 err = vnic_dev_intr_coal_timer_info(enic->vdev); 175 spin_unlock_bh(&enic->devcmd_lock); 176 177 return err; 178 } 179 180 int enic_vnic_dev_deinit(struct enic *enic) 181 { 182 int err; 183 184 spin_lock_bh(&enic->devcmd_lock); 185 err = vnic_dev_deinit(enic->vdev); 186 spin_unlock_bh(&enic->devcmd_lock); 187 188 return err; 189 } 190 191 int enic_dev_init_prov2(struct enic *enic, struct vic_provinfo *vp) 192 { 193 int err; 194 195 spin_lock_bh(&enic->devcmd_lock); 196 err = vnic_dev_init_prov2(enic->vdev, 197 (u8 *)vp, vic_provinfo_size(vp)); 198 spin_unlock_bh(&enic->devcmd_lock); 199 200 return err; 201 } 202 203 int enic_dev_deinit_done(struct enic *enic, int *status) 204 { 205 int err; 206 207 spin_lock_bh(&enic->devcmd_lock); 208 err = vnic_dev_deinit_done(enic->vdev, status); 209 spin_unlock_bh(&enic->devcmd_lock); 210 211 return err; 212 } 213 214 /* rtnl lock is held */ 215 int enic_vlan_rx_add_vid(struct net_device *netdev, __be16 proto, u16 vid) 216 { 217 struct enic *enic = netdev_priv(netdev); 218 int err; 219 220 spin_lock_bh(&enic->devcmd_lock); 221 err = enic_add_vlan(enic, vid); 222 spin_unlock_bh(&enic->devcmd_lock); 223 224 return err; 225 } 226 227 /* rtnl lock is held */ 228 int enic_vlan_rx_kill_vid(struct net_device *netdev, __be16 proto, u16 vid) 229 { 230 struct enic *enic = netdev_priv(netdev); 231 int err; 232 233 spin_lock_bh(&enic->devcmd_lock); 234 err = enic_del_vlan(enic, vid); 235 spin_unlock_bh(&enic->devcmd_lock); 236 237 return err; 238 } 239 240 int enic_dev_enable2(struct enic *enic, int active) 241 { 242 int err; 243 244 spin_lock_bh(&enic->devcmd_lock); 245 err = vnic_dev_enable2(enic->vdev, active); 246 spin_unlock_bh(&enic->devcmd_lock); 247 248 return err; 249 } 250 251 int enic_dev_enable2_done(struct enic *enic, int *status) 252 { 253 int err; 254 255 spin_lock_bh(&enic->devcmd_lock); 256 err = vnic_dev_enable2_done(enic->vdev, status); 257 spin_unlock_bh(&enic->devcmd_lock); 258 259 return err; 260 } 261 262 int enic_dev_status_to_errno(int devcmd_status) 263 { 264 switch (devcmd_status) { 265 case ERR_SUCCESS: 266 return 0; 267 case ERR_EINVAL: 268 return -EINVAL; 269 case ERR_EFAULT: 270 return -EFAULT; 271 case ERR_EPERM: 272 return -EPERM; 273 case ERR_EBUSY: 274 return -EBUSY; 275 case ERR_ECMDUNKNOWN: 276 case ERR_ENOTSUPPORTED: 277 return -EOPNOTSUPP; 278 case ERR_EBADSTATE: 279 return -EINVAL; 280 case ERR_ENOMEM: 281 return -ENOMEM; 282 case ERR_ETIMEDOUT: 283 return -ETIMEDOUT; 284 case ERR_ELINKDOWN: 285 return -ENETDOWN; 286 case ERR_EINPROGRESS: 287 return -EINPROGRESS; 288 case ERR_EMAXRES: 289 default: 290 return (devcmd_status < 0) ? devcmd_status : -1; 291 } 292 } 293