brintos

brintos / linux-shallow public Read only

0
0
Text · 4.3 KiB · 2cbae7c Raw
222 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2// 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 13int 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 24int 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 35int 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 49int 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 63int 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 76int 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 87int 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 98int 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 109int 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 120int 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 132int 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 143int 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 154int 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 */166int 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 */179int 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 191int 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