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; 135 136 spin_lock_bh(&enic->devcmd_lock); 137 err = vnic_dev_enable_wait(enic->vdev); 138 spin_unlock_bh(&enic->devcmd_lock); 139 140 return err; 141 } 142 143 int enic_dev_disable(struct enic *enic) 144 { 145 int err; 146 147 spin_lock_bh(&enic->devcmd_lock); 148 err = vnic_dev_disable(enic->vdev); 149 spin_unlock_bh(&enic->devcmd_lock); 150 151 return err; 152 } 153 154 int enic_dev_intr_coal_timer_info(struct enic *enic) 155 { 156 int err; 157 158 spin_lock_bh(&enic->devcmd_lock); 159 err = vnic_dev_intr_coal_timer_info(enic->vdev); 160 spin_unlock_bh(&enic->devcmd_lock); 161 162 return err; 163 } 164 165 /* rtnl lock is held */ 166 int enic_vlan_rx_add_vid(struct net_device *netdev, __be16 proto, u16 vid) 167 { 168 struct enic *enic = netdev_priv(netdev); 169 int err; 170 171 spin_lock_bh(&enic->devcmd_lock); 172 err = enic_add_vlan(enic, vid); 173 spin_unlock_bh(&enic->devcmd_lock); 174 175 return err; 176 } 177 178 /* rtnl lock is held */ 179 int enic_vlan_rx_kill_vid(struct net_device *netdev, __be16 proto, u16 vid) 180 { 181 struct enic *enic = netdev_priv(netdev); 182 int err; 183 184 spin_lock_bh(&enic->devcmd_lock); 185 err = enic_del_vlan(enic, vid); 186 spin_unlock_bh(&enic->devcmd_lock); 187 188 return err; 189 } 190 191 int enic_dev_status_to_errno(int devcmd_status) 192 { 193 switch (devcmd_status) { 194 case ERR_SUCCESS: 195 return 0; 196 case ERR_EINVAL: 197 return -EINVAL; 198 case ERR_EFAULT: 199 return -EFAULT; 200 case ERR_EPERM: 201 return -EPERM; 202 case ERR_EBUSY: 203 return -EBUSY; 204 case ERR_ECMDUNKNOWN: 205 case ERR_ENOTSUPPORTED: 206 return -EOPNOTSUPP; 207 case ERR_EBADSTATE: 208 return -EINVAL; 209 case ERR_ENOMEM: 210 return -ENOMEM; 211 case ERR_ETIMEDOUT: 212 return -ETIMEDOUT; 213 case ERR_ELINKDOWN: 214 return -ENETDOWN; 215 case ERR_EINPROGRESS: 216 return -EINPROGRESS; 217 case ERR_EMAXRES: 218 default: 219 return (devcmd_status < 0) ? devcmd_status : -1; 220 } 221 } 222