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