net: make vlan ndo_vlan_rx_[add/kill]_vid return error value

Let caller know the result of adding/removing vlan id to/from vlan
filter.

In some drivers I make those functions to just return 0. But in those
where there is able to see if hw setup went correctly, return value is
set appropriately.

Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Jiri Pirko 2011-12-08 19:52:37 -05:00 committed by David S. Miller
parent 7da82c06de
commit 8e586137e6
28 changed files with 210 additions and 107 deletions

View File

@ -428,7 +428,7 @@ int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb,
* @bond_dev: bonding net device that got called * @bond_dev: bonding net device that got called
* @vid: vlan id being added * @vid: vlan id being added
*/ */
static void bond_vlan_rx_add_vid(struct net_device *bond_dev, uint16_t vid) static int bond_vlan_rx_add_vid(struct net_device *bond_dev, uint16_t vid)
{ {
struct bonding *bond = netdev_priv(bond_dev); struct bonding *bond = netdev_priv(bond_dev);
struct slave *slave; struct slave *slave;
@ -448,7 +448,10 @@ static void bond_vlan_rx_add_vid(struct net_device *bond_dev, uint16_t vid)
if (res) { if (res) {
pr_err("%s: Error: Failed to add vlan id %d\n", pr_err("%s: Error: Failed to add vlan id %d\n",
bond_dev->name, vid); bond_dev->name, vid);
return res;
} }
return 0;
} }
/** /**
@ -456,7 +459,7 @@ static void bond_vlan_rx_add_vid(struct net_device *bond_dev, uint16_t vid)
* @bond_dev: bonding net device that got called * @bond_dev: bonding net device that got called
* @vid: vlan id being removed * @vid: vlan id being removed
*/ */
static void bond_vlan_rx_kill_vid(struct net_device *bond_dev, uint16_t vid) static int bond_vlan_rx_kill_vid(struct net_device *bond_dev, uint16_t vid)
{ {
struct bonding *bond = netdev_priv(bond_dev); struct bonding *bond = netdev_priv(bond_dev);
struct slave *slave; struct slave *slave;
@ -476,7 +479,10 @@ static void bond_vlan_rx_kill_vid(struct net_device *bond_dev, uint16_t vid)
if (res) { if (res) {
pr_err("%s: Error: Failed to remove vlan id %d\n", pr_err("%s: Error: Failed to remove vlan id %d\n",
bond_dev->name, vid); bond_dev->name, vid);
return res;
} }
return 0;
} }
static void bond_add_vlans_on_slave(struct bonding *bond, struct net_device *slave_dev) static void bond_add_vlans_on_slave(struct bonding *bond, struct net_device *slave_dev)

View File

@ -607,7 +607,7 @@ static const struct ethtool_ops ethtool_ops;
#ifdef VLAN_SUPPORT #ifdef VLAN_SUPPORT
static void netdev_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) static int netdev_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
{ {
struct netdev_private *np = netdev_priv(dev); struct netdev_private *np = netdev_priv(dev);
@ -617,9 +617,11 @@ static void netdev_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
set_bit(vid, np->active_vlans); set_bit(vid, np->active_vlans);
set_rx_mode(dev); set_rx_mode(dev);
spin_unlock(&np->lock); spin_unlock(&np->lock);
return 0;
} }
static void netdev_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) static int netdev_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
{ {
struct netdev_private *np = netdev_priv(dev); struct netdev_private *np = netdev_priv(dev);
@ -629,6 +631,8 @@ static void netdev_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
clear_bit(vid, np->active_vlans); clear_bit(vid, np->active_vlans);
set_rx_mode(dev); set_rx_mode(dev);
spin_unlock(&np->lock); spin_unlock(&np->lock);
return 0;
} }
#endif /* VLAN_SUPPORT */ #endif /* VLAN_SUPPORT */

View File

@ -2968,7 +2968,7 @@ bnad_change_mtu(struct net_device *netdev, int new_mtu)
return err; return err;
} }
static void static int
bnad_vlan_rx_add_vid(struct net_device *netdev, bnad_vlan_rx_add_vid(struct net_device *netdev,
unsigned short vid) unsigned short vid)
{ {
@ -2976,7 +2976,7 @@ bnad_vlan_rx_add_vid(struct net_device *netdev,
unsigned long flags; unsigned long flags;
if (!bnad->rx_info[0].rx) if (!bnad->rx_info[0].rx)
return; return 0;
mutex_lock(&bnad->conf_mutex); mutex_lock(&bnad->conf_mutex);
@ -2986,9 +2986,11 @@ bnad_vlan_rx_add_vid(struct net_device *netdev,
spin_unlock_irqrestore(&bnad->bna_lock, flags); spin_unlock_irqrestore(&bnad->bna_lock, flags);
mutex_unlock(&bnad->conf_mutex); mutex_unlock(&bnad->conf_mutex);
return 0;
} }
static void static int
bnad_vlan_rx_kill_vid(struct net_device *netdev, bnad_vlan_rx_kill_vid(struct net_device *netdev,
unsigned short vid) unsigned short vid)
{ {
@ -2996,7 +2998,7 @@ bnad_vlan_rx_kill_vid(struct net_device *netdev,
unsigned long flags; unsigned long flags;
if (!bnad->rx_info[0].rx) if (!bnad->rx_info[0].rx)
return; return 0;
mutex_lock(&bnad->conf_mutex); mutex_lock(&bnad->conf_mutex);
@ -3006,6 +3008,8 @@ bnad_vlan_rx_kill_vid(struct net_device *netdev,
spin_unlock_irqrestore(&bnad->bna_lock, flags); spin_unlock_irqrestore(&bnad->bna_lock, flags);
mutex_unlock(&bnad->conf_mutex); mutex_unlock(&bnad->conf_mutex);
return 0;
} }
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER

View File

@ -212,23 +212,29 @@ int enic_dev_deinit_done(struct enic *enic, int *status)
} }
/* rtnl lock is held */ /* rtnl lock is held */
void enic_vlan_rx_add_vid(struct net_device *netdev, u16 vid) int enic_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
{ {
struct enic *enic = netdev_priv(netdev); struct enic *enic = netdev_priv(netdev);
int err;
spin_lock(&enic->devcmd_lock); spin_lock(&enic->devcmd_lock);
enic_add_vlan(enic, vid); err = enic_add_vlan(enic, vid);
spin_unlock(&enic->devcmd_lock); spin_unlock(&enic->devcmd_lock);
return err;
} }
/* rtnl lock is held */ /* rtnl lock is held */
void enic_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) int enic_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
{ {
struct enic *enic = netdev_priv(netdev); struct enic *enic = netdev_priv(netdev);
int err;
spin_lock(&enic->devcmd_lock); spin_lock(&enic->devcmd_lock);
enic_del_vlan(enic, vid); err = enic_del_vlan(enic, vid);
spin_unlock(&enic->devcmd_lock); spin_unlock(&enic->devcmd_lock);
return err;
} }
int enic_dev_enable2(struct enic *enic, int active) int enic_dev_enable2(struct enic *enic, int active)

View File

@ -46,8 +46,8 @@ int enic_dev_packet_filter(struct enic *enic, int directed, int multicast,
int broadcast, int promisc, int allmulti); int broadcast, int promisc, int allmulti);
int enic_dev_add_addr(struct enic *enic, u8 *addr); int enic_dev_add_addr(struct enic *enic, u8 *addr);
int enic_dev_del_addr(struct enic *enic, u8 *addr); int enic_dev_del_addr(struct enic *enic, u8 *addr);
void enic_vlan_rx_add_vid(struct net_device *netdev, u16 vid); int enic_vlan_rx_add_vid(struct net_device *netdev, u16 vid);
void enic_vlan_rx_kill_vid(struct net_device *netdev, u16 vid); int enic_vlan_rx_kill_vid(struct net_device *netdev, u16 vid);
int enic_dev_notify_unset(struct enic *enic); int enic_dev_notify_unset(struct enic *enic);
int enic_dev_hang_notify(struct enic *enic); int enic_dev_hang_notify(struct enic *enic);
int enic_dev_set_ig_vlan_rewrite_mode(struct enic *enic); int enic_dev_set_ig_vlan_rewrite_mode(struct enic *enic);

View File

@ -780,31 +780,35 @@ static int be_vid_config(struct be_adapter *adapter, bool vf, u32 vf_num)
return status; return status;
} }
static void be_vlan_add_vid(struct net_device *netdev, u16 vid) static int be_vlan_add_vid(struct net_device *netdev, u16 vid)
{ {
struct be_adapter *adapter = netdev_priv(netdev); struct be_adapter *adapter = netdev_priv(netdev);
adapter->vlans_added++; adapter->vlans_added++;
if (!be_physfn(adapter)) if (!be_physfn(adapter))
return; return 0;
adapter->vlan_tag[vid] = 1; adapter->vlan_tag[vid] = 1;
if (adapter->vlans_added <= (adapter->max_vlans + 1)) if (adapter->vlans_added <= (adapter->max_vlans + 1))
be_vid_config(adapter, false, 0); be_vid_config(adapter, false, 0);
return 0;
} }
static void be_vlan_rem_vid(struct net_device *netdev, u16 vid) static int be_vlan_rem_vid(struct net_device *netdev, u16 vid)
{ {
struct be_adapter *adapter = netdev_priv(netdev); struct be_adapter *adapter = netdev_priv(netdev);
adapter->vlans_added--; adapter->vlans_added--;
if (!be_physfn(adapter)) if (!be_physfn(adapter))
return; return 0;
adapter->vlan_tag[vid] = 0; adapter->vlan_tag[vid] = 0;
if (adapter->vlans_added <= adapter->max_vlans) if (adapter->vlans_added <= adapter->max_vlans)
be_vid_config(adapter, false, 0); be_vid_config(adapter, false, 0);
return 0;
} }
static void be_set_rx_mode(struct net_device *netdev) static void be_set_rx_mode(struct net_device *netdev)

View File

@ -2114,17 +2114,19 @@ static int ehea_start_xmit(struct sk_buff *skb, struct net_device *dev)
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
static void ehea_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) static int ehea_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
{ {
struct ehea_port *port = netdev_priv(dev); struct ehea_port *port = netdev_priv(dev);
struct ehea_adapter *adapter = port->adapter; struct ehea_adapter *adapter = port->adapter;
struct hcp_ehea_port_cb1 *cb1; struct hcp_ehea_port_cb1 *cb1;
int index; int index;
u64 hret; u64 hret;
int err = 0;
cb1 = (void *)get_zeroed_page(GFP_KERNEL); cb1 = (void *)get_zeroed_page(GFP_KERNEL);
if (!cb1) { if (!cb1) {
pr_err("no mem for cb1\n"); pr_err("no mem for cb1\n");
err = -ENOMEM;
goto out; goto out;
} }
@ -2132,6 +2134,7 @@ static void ehea_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
H_PORT_CB1, H_PORT_CB1_ALL, cb1); H_PORT_CB1, H_PORT_CB1_ALL, cb1);
if (hret != H_SUCCESS) { if (hret != H_SUCCESS) {
pr_err("query_ehea_port failed\n"); pr_err("query_ehea_port failed\n");
err = -EINVAL;
goto out; goto out;
} }
@ -2140,24 +2143,28 @@ static void ehea_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id, hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id,
H_PORT_CB1, H_PORT_CB1_ALL, cb1); H_PORT_CB1, H_PORT_CB1_ALL, cb1);
if (hret != H_SUCCESS) if (hret != H_SUCCESS) {
pr_err("modify_ehea_port failed\n"); pr_err("modify_ehea_port failed\n");
err = -EINVAL;
}
out: out:
free_page((unsigned long)cb1); free_page((unsigned long)cb1);
return; return err;
} }
static void ehea_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) static int ehea_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
{ {
struct ehea_port *port = netdev_priv(dev); struct ehea_port *port = netdev_priv(dev);
struct ehea_adapter *adapter = port->adapter; struct ehea_adapter *adapter = port->adapter;
struct hcp_ehea_port_cb1 *cb1; struct hcp_ehea_port_cb1 *cb1;
int index; int index;
u64 hret; u64 hret;
int err = 0;
cb1 = (void *)get_zeroed_page(GFP_KERNEL); cb1 = (void *)get_zeroed_page(GFP_KERNEL);
if (!cb1) { if (!cb1) {
pr_err("no mem for cb1\n"); pr_err("no mem for cb1\n");
err = -ENOMEM;
goto out; goto out;
} }
@ -2165,6 +2172,7 @@ static void ehea_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
H_PORT_CB1, H_PORT_CB1_ALL, cb1); H_PORT_CB1, H_PORT_CB1_ALL, cb1);
if (hret != H_SUCCESS) { if (hret != H_SUCCESS) {
pr_err("query_ehea_port failed\n"); pr_err("query_ehea_port failed\n");
err = -EINVAL;
goto out; goto out;
} }
@ -2173,10 +2181,13 @@ static void ehea_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id, hret = ehea_h_modify_ehea_port(adapter->handle, port->logical_port_id,
H_PORT_CB1, H_PORT_CB1_ALL, cb1); H_PORT_CB1, H_PORT_CB1_ALL, cb1);
if (hret != H_SUCCESS) if (hret != H_SUCCESS) {
pr_err("modify_ehea_port failed\n"); pr_err("modify_ehea_port failed\n");
err = -EINVAL;
}
out: out:
free_page((unsigned long)cb1); free_page((unsigned long)cb1);
return err;
} }
int ehea_activate_qp(struct ehea_adapter *adapter, struct ehea_qp *qp) int ehea_activate_qp(struct ehea_adapter *adapter, struct ehea_qp *qp)

View File

@ -169,8 +169,8 @@ static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter,
static bool e1000_vlan_used(struct e1000_adapter *adapter); static bool e1000_vlan_used(struct e1000_adapter *adapter);
static void e1000_vlan_mode(struct net_device *netdev, static void e1000_vlan_mode(struct net_device *netdev,
netdev_features_t features); netdev_features_t features);
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid); static int e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid);
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid); static int e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid);
static void e1000_restore_vlan(struct e1000_adapter *adapter); static void e1000_restore_vlan(struct e1000_adapter *adapter);
#ifdef CONFIG_PM #ifdef CONFIG_PM
@ -4604,7 +4604,7 @@ static void e1000_vlan_mode(struct net_device *netdev,
e1000_irq_enable(adapter); e1000_irq_enable(adapter);
} }
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid) static int e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
{ {
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
@ -4613,7 +4613,7 @@ static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
if ((hw->mng_cookie.status & if ((hw->mng_cookie.status &
E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) && E1000_MNG_DHCP_COOKIE_STATUS_VLAN_SUPPORT) &&
(vid == adapter->mng_vlan_id)) (vid == adapter->mng_vlan_id))
return; return 0;
if (!e1000_vlan_used(adapter)) if (!e1000_vlan_used(adapter))
e1000_vlan_filter_on_off(adapter, true); e1000_vlan_filter_on_off(adapter, true);
@ -4625,9 +4625,11 @@ static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
e1000_write_vfta(hw, index, vfta); e1000_write_vfta(hw, index, vfta);
set_bit(vid, adapter->active_vlans); set_bit(vid, adapter->active_vlans);
return 0;
} }
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) static int e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
{ {
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
@ -4648,6 +4650,8 @@ static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
if (!e1000_vlan_used(adapter)) if (!e1000_vlan_used(adapter))
e1000_vlan_filter_on_off(adapter, false); e1000_vlan_filter_on_off(adapter, false);
return 0;
} }
static void e1000_restore_vlan(struct e1000_adapter *adapter) static void e1000_restore_vlan(struct e1000_adapter *adapter)

View File

@ -2522,7 +2522,7 @@ static int e1000_clean(struct napi_struct *napi, int budget)
return work_done; return work_done;
} }
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid) static int e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
{ {
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
@ -2532,7 +2532,7 @@ static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
if ((adapter->hw.mng_cookie.status & if ((adapter->hw.mng_cookie.status &
E1000_MNG_DHCP_COOKIE_STATUS_VLAN) && E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
(vid == adapter->mng_vlan_id)) (vid == adapter->mng_vlan_id))
return; return 0;
/* add VID to filter table */ /* add VID to filter table */
if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) { if (adapter->flags & FLAG_HAS_HW_VLAN_FILTER) {
@ -2543,9 +2543,11 @@ static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
} }
set_bit(vid, adapter->active_vlans); set_bit(vid, adapter->active_vlans);
return 0;
} }
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) static int e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
{ {
struct e1000_adapter *adapter = netdev_priv(netdev); struct e1000_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
@ -2556,7 +2558,7 @@ static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
(vid == adapter->mng_vlan_id)) { (vid == adapter->mng_vlan_id)) {
/* release control to f/w */ /* release control to f/w */
e1000e_release_hw_control(adapter); e1000e_release_hw_control(adapter);
return; return 0;
} }
/* remove VID from filter table */ /* remove VID from filter table */
@ -2568,6 +2570,8 @@ static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
} }
clear_bit(vid, adapter->active_vlans); clear_bit(vid, adapter->active_vlans);
return 0;
} }
/** /**

View File

@ -148,8 +148,8 @@ static int igb_ioctl(struct net_device *, struct ifreq *, int cmd);
static void igb_tx_timeout(struct net_device *); static void igb_tx_timeout(struct net_device *);
static void igb_reset_task(struct work_struct *); static void igb_reset_task(struct work_struct *);
static void igb_vlan_mode(struct net_device *netdev, netdev_features_t features); static void igb_vlan_mode(struct net_device *netdev, netdev_features_t features);
static void igb_vlan_rx_add_vid(struct net_device *, u16); static int igb_vlan_rx_add_vid(struct net_device *, u16);
static void igb_vlan_rx_kill_vid(struct net_device *, u16); static int igb_vlan_rx_kill_vid(struct net_device *, u16);
static void igb_restore_vlan(struct igb_adapter *); static void igb_restore_vlan(struct igb_adapter *);
static void igb_rar_set_qsel(struct igb_adapter *, u8 *, u32 , u8); static void igb_rar_set_qsel(struct igb_adapter *, u8 *, u32 , u8);
static void igb_ping_all_vfs(struct igb_adapter *); static void igb_ping_all_vfs(struct igb_adapter *);
@ -6491,7 +6491,7 @@ static void igb_vlan_mode(struct net_device *netdev, netdev_features_t features)
igb_rlpml_set(adapter); igb_rlpml_set(adapter);
} }
static void igb_vlan_rx_add_vid(struct net_device *netdev, u16 vid) static int igb_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
{ {
struct igb_adapter *adapter = netdev_priv(netdev); struct igb_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
@ -6504,9 +6504,11 @@ static void igb_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
igb_vfta_set(hw, vid, true); igb_vfta_set(hw, vid, true);
set_bit(vid, adapter->active_vlans); set_bit(vid, adapter->active_vlans);
return 0;
} }
static void igb_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) static int igb_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
{ {
struct igb_adapter *adapter = netdev_priv(netdev); struct igb_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
@ -6521,6 +6523,8 @@ static void igb_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
igb_vfta_set(hw, vid, false); igb_vfta_set(hw, vid, false);
clear_bit(vid, adapter->active_vlans); clear_bit(vid, adapter->active_vlans);
return 0;
} }
static void igb_restore_vlan(struct igb_adapter *adapter) static void igb_restore_vlan(struct igb_adapter *adapter)

View File

@ -1176,18 +1176,20 @@ static void igbvf_set_rlpml(struct igbvf_adapter *adapter)
e1000_rlpml_set_vf(hw, max_frame_size); e1000_rlpml_set_vf(hw, max_frame_size);
} }
static void igbvf_vlan_rx_add_vid(struct net_device *netdev, u16 vid) static int igbvf_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
{ {
struct igbvf_adapter *adapter = netdev_priv(netdev); struct igbvf_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
if (hw->mac.ops.set_vfta(hw, vid, true)) if (hw->mac.ops.set_vfta(hw, vid, true)) {
dev_err(&adapter->pdev->dev, "Failed to add vlan id %d\n", vid); dev_err(&adapter->pdev->dev, "Failed to add vlan id %d\n", vid);
else return -EINVAL;
set_bit(vid, adapter->active_vlans); }
set_bit(vid, adapter->active_vlans);
return 0;
} }
static void igbvf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) static int igbvf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
{ {
struct igbvf_adapter *adapter = netdev_priv(netdev); struct igbvf_adapter *adapter = netdev_priv(netdev);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
@ -1197,11 +1199,13 @@ static void igbvf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
if (!test_bit(__IGBVF_DOWN, &adapter->state)) if (!test_bit(__IGBVF_DOWN, &adapter->state))
igbvf_irq_enable(adapter); igbvf_irq_enable(adapter);
if (hw->mac.ops.set_vfta(hw, vid, false)) if (hw->mac.ops.set_vfta(hw, vid, false)) {
dev_err(&adapter->pdev->dev, dev_err(&adapter->pdev->dev,
"Failed to remove vlan id %d\n", vid); "Failed to remove vlan id %d\n", vid);
else return -EINVAL;
clear_bit(vid, adapter->active_vlans); }
clear_bit(vid, adapter->active_vlans);
return 0;
} }
static void igbvf_restore_vlan(struct igbvf_adapter *adapter) static void igbvf_restore_vlan(struct igbvf_adapter *adapter)

View File

@ -101,8 +101,8 @@ static void ixgb_tx_timeout_task(struct work_struct *work);
static void ixgb_vlan_strip_enable(struct ixgb_adapter *adapter); static void ixgb_vlan_strip_enable(struct ixgb_adapter *adapter);
static void ixgb_vlan_strip_disable(struct ixgb_adapter *adapter); static void ixgb_vlan_strip_disable(struct ixgb_adapter *adapter);
static void ixgb_vlan_rx_add_vid(struct net_device *netdev, u16 vid); static int ixgb_vlan_rx_add_vid(struct net_device *netdev, u16 vid);
static void ixgb_vlan_rx_kill_vid(struct net_device *netdev, u16 vid); static int ixgb_vlan_rx_kill_vid(struct net_device *netdev, u16 vid);
static void ixgb_restore_vlan(struct ixgb_adapter *adapter); static void ixgb_restore_vlan(struct ixgb_adapter *adapter);
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
@ -2217,7 +2217,7 @@ ixgb_vlan_strip_disable(struct ixgb_adapter *adapter)
IXGB_WRITE_REG(&adapter->hw, CTRL0, ctrl); IXGB_WRITE_REG(&adapter->hw, CTRL0, ctrl);
} }
static void static int
ixgb_vlan_rx_add_vid(struct net_device *netdev, u16 vid) ixgb_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
{ {
struct ixgb_adapter *adapter = netdev_priv(netdev); struct ixgb_adapter *adapter = netdev_priv(netdev);
@ -2230,9 +2230,11 @@ ixgb_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
vfta |= (1 << (vid & 0x1F)); vfta |= (1 << (vid & 0x1F));
ixgb_write_vfta(&adapter->hw, index, vfta); ixgb_write_vfta(&adapter->hw, index, vfta);
set_bit(vid, adapter->active_vlans); set_bit(vid, adapter->active_vlans);
return 0;
} }
static void static int
ixgb_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) ixgb_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
{ {
struct ixgb_adapter *adapter = netdev_priv(netdev); struct ixgb_adapter *adapter = netdev_priv(netdev);
@ -2245,6 +2247,8 @@ ixgb_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
vfta &= ~(1 << (vid & 0x1F)); vfta &= ~(1 << (vid & 0x1F));
ixgb_write_vfta(&adapter->hw, index, vfta); ixgb_write_vfta(&adapter->hw, index, vfta);
clear_bit(vid, adapter->active_vlans); clear_bit(vid, adapter->active_vlans);
return 0;
} }
static void static void

View File

@ -3044,7 +3044,7 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
hw->mac.ops.enable_rx_dma(hw, rxctrl); hw->mac.ops.enable_rx_dma(hw, rxctrl);
} }
static void ixgbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid) static int ixgbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
{ {
struct ixgbe_adapter *adapter = netdev_priv(netdev); struct ixgbe_adapter *adapter = netdev_priv(netdev);
struct ixgbe_hw *hw = &adapter->hw; struct ixgbe_hw *hw = &adapter->hw;
@ -3053,9 +3053,11 @@ static void ixgbe_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
/* add VID to filter table */ /* add VID to filter table */
hw->mac.ops.set_vfta(&adapter->hw, vid, pool_ndx, true); hw->mac.ops.set_vfta(&adapter->hw, vid, pool_ndx, true);
set_bit(vid, adapter->active_vlans); set_bit(vid, adapter->active_vlans);
return 0;
} }
static void ixgbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) static int ixgbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
{ {
struct ixgbe_adapter *adapter = netdev_priv(netdev); struct ixgbe_adapter *adapter = netdev_priv(netdev);
struct ixgbe_hw *hw = &adapter->hw; struct ixgbe_hw *hw = &adapter->hw;
@ -3064,6 +3066,8 @@ static void ixgbe_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
/* remove VID from filter table */ /* remove VID from filter table */
hw->mac.ops.set_vfta(&adapter->hw, vid, pool_ndx, false); hw->mac.ops.set_vfta(&adapter->hw, vid, pool_ndx, false);
clear_bit(vid, adapter->active_vlans); clear_bit(vid, adapter->active_vlans);
return 0;
} }
/** /**

View File

@ -1403,7 +1403,7 @@ static void ixgbevf_configure_rx(struct ixgbevf_adapter *adapter)
} }
} }
static void ixgbevf_vlan_rx_add_vid(struct net_device *netdev, u16 vid) static int ixgbevf_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
{ {
struct ixgbevf_adapter *adapter = netdev_priv(netdev); struct ixgbevf_adapter *adapter = netdev_priv(netdev);
struct ixgbe_hw *hw = &adapter->hw; struct ixgbe_hw *hw = &adapter->hw;
@ -1412,9 +1412,11 @@ static void ixgbevf_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
if (hw->mac.ops.set_vfta) if (hw->mac.ops.set_vfta)
hw->mac.ops.set_vfta(hw, vid, 0, true); hw->mac.ops.set_vfta(hw, vid, 0, true);
set_bit(vid, adapter->active_vlans); set_bit(vid, adapter->active_vlans);
return 0;
} }
static void ixgbevf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) static int ixgbevf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
{ {
struct ixgbevf_adapter *adapter = netdev_priv(netdev); struct ixgbevf_adapter *adapter = netdev_priv(netdev);
struct ixgbe_hw *hw = &adapter->hw; struct ixgbe_hw *hw = &adapter->hw;
@ -1423,6 +1425,8 @@ static void ixgbevf_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
if (hw->mac.ops.set_vfta) if (hw->mac.ops.set_vfta)
hw->mac.ops.set_vfta(hw, vid, 0, false); hw->mac.ops.set_vfta(hw, vid, 0, false);
clear_bit(vid, adapter->active_vlans); clear_bit(vid, adapter->active_vlans);
return 0;
} }
static void ixgbevf_restore_vlan(struct ixgbevf_adapter *adapter) static void ixgbevf_restore_vlan(struct ixgbevf_adapter *adapter)

View File

@ -45,7 +45,7 @@
#include "mlx4_en.h" #include "mlx4_en.h"
#include "en_port.h" #include "en_port.h"
static void mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) static int mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
{ {
struct mlx4_en_priv *priv = netdev_priv(dev); struct mlx4_en_priv *priv = netdev_priv(dev);
struct mlx4_en_dev *mdev = priv->mdev; struct mlx4_en_dev *mdev = priv->mdev;
@ -67,9 +67,10 @@ static void mlx4_en_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
en_err(priv, "failed adding vlan %d\n", vid); en_err(priv, "failed adding vlan %d\n", vid);
mutex_unlock(&mdev->state_lock); mutex_unlock(&mdev->state_lock);
return 0;
} }
static void mlx4_en_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) static int mlx4_en_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
{ {
struct mlx4_en_priv *priv = netdev_priv(dev); struct mlx4_en_priv *priv = netdev_priv(dev);
struct mlx4_en_dev *mdev = priv->mdev; struct mlx4_en_dev *mdev = priv->mdev;
@ -93,6 +94,8 @@ static void mlx4_en_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
en_err(priv, "Failed configuring VLAN filter\n"); en_err(priv, "Failed configuring VLAN filter\n");
} }
mutex_unlock(&mdev->state_lock); mutex_unlock(&mdev->state_lock);
return 0;
} }
u64 mlx4_en_mac_to_u64(u8 *addr) u64 mlx4_en_mac_to_u64(u8 *addr)

View File

@ -3305,7 +3305,7 @@ static void vxge_tx_watchdog(struct net_device *dev)
* *
* Add the vlan id to the devices vlan id table * Add the vlan id to the devices vlan id table
*/ */
static void static int
vxge_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) vxge_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
{ {
struct vxgedev *vdev = netdev_priv(dev); struct vxgedev *vdev = netdev_priv(dev);
@ -3320,6 +3320,7 @@ vxge_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
vxge_hw_vpath_vid_add(vpath->handle, vid); vxge_hw_vpath_vid_add(vpath->handle, vid);
} }
set_bit(vid, vdev->active_vlans); set_bit(vid, vdev->active_vlans);
return 0;
} }
/** /**
@ -3329,7 +3330,7 @@ vxge_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
* *
* Remove the vlan id from the device's vlan id table * Remove the vlan id from the device's vlan id table
*/ */
static void static int
vxge_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) vxge_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
{ {
struct vxgedev *vdev = netdev_priv(dev); struct vxgedev *vdev = netdev_priv(dev);
@ -3348,6 +3349,7 @@ vxge_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
vxge_debug_entryexit(VXGE_TRACE, vxge_debug_entryexit(VXGE_TRACE,
"%s:%d Exiting...", __func__, __LINE__); "%s:%d Exiting...", __func__, __LINE__);
clear_bit(vid, vdev->active_vlans); clear_bit(vid, vdev->active_vlans);
return 0;
} }
static const struct net_device_ops vxge_netdev_ops = { static const struct net_device_ops vxge_netdev_ops = {

View File

@ -97,8 +97,8 @@ static int qlcnicvf_config_bridged_mode(struct qlcnic_adapter *, u32);
static int qlcnicvf_start_firmware(struct qlcnic_adapter *); static int qlcnicvf_start_firmware(struct qlcnic_adapter *);
static void qlcnic_set_netdev_features(struct qlcnic_adapter *, static void qlcnic_set_netdev_features(struct qlcnic_adapter *,
struct qlcnic_esw_func_cfg *); struct qlcnic_esw_func_cfg *);
static void qlcnic_vlan_rx_add(struct net_device *, u16); static int qlcnic_vlan_rx_add(struct net_device *, u16);
static void qlcnic_vlan_rx_del(struct net_device *, u16); static int qlcnic_vlan_rx_del(struct net_device *, u16);
/* PCI Device ID Table */ /* PCI Device ID Table */
#define ENTRY(device) \ #define ENTRY(device) \
@ -735,20 +735,22 @@ qlcnic_set_vlan_config(struct qlcnic_adapter *adapter,
adapter->pvid = 0; adapter->pvid = 0;
} }
static void static int
qlcnic_vlan_rx_add(struct net_device *netdev, u16 vid) qlcnic_vlan_rx_add(struct net_device *netdev, u16 vid)
{ {
struct qlcnic_adapter *adapter = netdev_priv(netdev); struct qlcnic_adapter *adapter = netdev_priv(netdev);
set_bit(vid, adapter->vlans); set_bit(vid, adapter->vlans);
return 0;
} }
static void static int
qlcnic_vlan_rx_del(struct net_device *netdev, u16 vid) qlcnic_vlan_rx_del(struct net_device *netdev, u16 vid)
{ {
struct qlcnic_adapter *adapter = netdev_priv(netdev); struct qlcnic_adapter *adapter = netdev_priv(netdev);
qlcnic_restore_indev_addr(netdev, NETDEV_DOWN); qlcnic_restore_indev_addr(netdev, NETDEV_DOWN);
clear_bit(vid, adapter->vlans); clear_bit(vid, adapter->vlans);
return 0;
} }
static void static void

View File

@ -2349,56 +2349,66 @@ static int qlge_set_features(struct net_device *ndev,
return 0; return 0;
} }
static void __qlge_vlan_rx_add_vid(struct ql_adapter *qdev, u16 vid) static int __qlge_vlan_rx_add_vid(struct ql_adapter *qdev, u16 vid)
{ {
u32 enable_bit = MAC_ADDR_E; u32 enable_bit = MAC_ADDR_E;
int err;
if (ql_set_mac_addr_reg err = ql_set_mac_addr_reg(qdev, (u8 *) &enable_bit,
(qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) { MAC_ADDR_TYPE_VLAN, vid);
if (err)
netif_err(qdev, ifup, qdev->ndev, netif_err(qdev, ifup, qdev->ndev,
"Failed to init vlan address.\n"); "Failed to init vlan address.\n");
} return err;
} }
static void qlge_vlan_rx_add_vid(struct net_device *ndev, u16 vid) static int qlge_vlan_rx_add_vid(struct net_device *ndev, u16 vid)
{ {
struct ql_adapter *qdev = netdev_priv(ndev); struct ql_adapter *qdev = netdev_priv(ndev);
int status; int status;
int err;
status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK); status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
if (status) if (status)
return; return status;
__qlge_vlan_rx_add_vid(qdev, vid); err = __qlge_vlan_rx_add_vid(qdev, vid);
set_bit(vid, qdev->active_vlans); set_bit(vid, qdev->active_vlans);
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK); ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
return err;
} }
static void __qlge_vlan_rx_kill_vid(struct ql_adapter *qdev, u16 vid) static int __qlge_vlan_rx_kill_vid(struct ql_adapter *qdev, u16 vid)
{ {
u32 enable_bit = 0; u32 enable_bit = 0;
int err;
if (ql_set_mac_addr_reg err = ql_set_mac_addr_reg(qdev, (u8 *) &enable_bit,
(qdev, (u8 *) &enable_bit, MAC_ADDR_TYPE_VLAN, vid)) { MAC_ADDR_TYPE_VLAN, vid);
if (err)
netif_err(qdev, ifup, qdev->ndev, netif_err(qdev, ifup, qdev->ndev,
"Failed to clear vlan address.\n"); "Failed to clear vlan address.\n");
} return err;
} }
static void qlge_vlan_rx_kill_vid(struct net_device *ndev, u16 vid) static int qlge_vlan_rx_kill_vid(struct net_device *ndev, u16 vid)
{ {
struct ql_adapter *qdev = netdev_priv(ndev); struct ql_adapter *qdev = netdev_priv(ndev);
int status; int status;
int err;
status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK); status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
if (status) if (status)
return; return status;
__qlge_vlan_rx_kill_vid(qdev, vid); err = __qlge_vlan_rx_kill_vid(qdev, vid);
clear_bit(vid, qdev->active_vlans); clear_bit(vid, qdev->active_vlans);
ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK); ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
return err;
} }
static void qlge_restore_vlan(struct ql_adapter *qdev) static void qlge_restore_vlan(struct ql_adapter *qdev)

View File

@ -727,9 +727,10 @@ static void __bdx_vlan_rx_vid(struct net_device *ndev, uint16_t vid, int enable)
* @ndev network device * @ndev network device
* @vid VLAN vid to add * @vid VLAN vid to add
*/ */
static void bdx_vlan_rx_add_vid(struct net_device *ndev, uint16_t vid) static int bdx_vlan_rx_add_vid(struct net_device *ndev, uint16_t vid)
{ {
__bdx_vlan_rx_vid(ndev, vid, 1); __bdx_vlan_rx_vid(ndev, vid, 1);
return 0;
} }
/* /*
@ -737,9 +738,10 @@ static void bdx_vlan_rx_add_vid(struct net_device *ndev, uint16_t vid)
* @ndev network device * @ndev network device
* @vid VLAN vid to kill * @vid VLAN vid to kill
*/ */
static void bdx_vlan_rx_kill_vid(struct net_device *ndev, unsigned short vid) static int bdx_vlan_rx_kill_vid(struct net_device *ndev, unsigned short vid)
{ {
__bdx_vlan_rx_vid(ndev, vid, 0); __bdx_vlan_rx_vid(ndev, vid, 0);
return 0;
} }
/** /**

View File

@ -488,8 +488,8 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
static const struct ethtool_ops netdev_ethtool_ops; static const struct ethtool_ops netdev_ethtool_ops;
static int rhine_close(struct net_device *dev); static int rhine_close(struct net_device *dev);
static void rhine_shutdown (struct pci_dev *pdev); static void rhine_shutdown (struct pci_dev *pdev);
static void rhine_vlan_rx_add_vid(struct net_device *dev, unsigned short vid); static int rhine_vlan_rx_add_vid(struct net_device *dev, unsigned short vid);
static void rhine_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid); static int rhine_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid);
static void rhine_set_cam(void __iomem *ioaddr, int idx, u8 *addr); static void rhine_set_cam(void __iomem *ioaddr, int idx, u8 *addr);
static void rhine_set_vlan_cam(void __iomem *ioaddr, int idx, u8 *addr); static void rhine_set_vlan_cam(void __iomem *ioaddr, int idx, u8 *addr);
static void rhine_set_cam_mask(void __iomem *ioaddr, u32 mask); static void rhine_set_cam_mask(void __iomem *ioaddr, u32 mask);
@ -1261,7 +1261,7 @@ static void rhine_update_vcam(struct net_device *dev)
rhine_set_vlan_cam_mask(ioaddr, vCAMmask); rhine_set_vlan_cam_mask(ioaddr, vCAMmask);
} }
static void rhine_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) static int rhine_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
{ {
struct rhine_private *rp = netdev_priv(dev); struct rhine_private *rp = netdev_priv(dev);
@ -1269,9 +1269,10 @@ static void rhine_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
set_bit(vid, rp->active_vlans); set_bit(vid, rp->active_vlans);
rhine_update_vcam(dev); rhine_update_vcam(dev);
spin_unlock_irq(&rp->lock); spin_unlock_irq(&rp->lock);
return 0;
} }
static void rhine_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) static int rhine_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
{ {
struct rhine_private *rp = netdev_priv(dev); struct rhine_private *rp = netdev_priv(dev);
@ -1279,6 +1280,7 @@ static void rhine_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
clear_bit(vid, rp->active_vlans); clear_bit(vid, rp->active_vlans);
rhine_update_vcam(dev); rhine_update_vcam(dev);
spin_unlock_irq(&rp->lock); spin_unlock_irq(&rp->lock);
return 0;
} }
static void init_registers(struct net_device *dev) static void init_registers(struct net_device *dev)

View File

@ -522,7 +522,7 @@ static void velocity_init_cam_filter(struct velocity_info *vptr)
mac_set_vlan_cam_mask(regs, vptr->vCAMmask); mac_set_vlan_cam_mask(regs, vptr->vCAMmask);
} }
static void velocity_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) static int velocity_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
{ {
struct velocity_info *vptr = netdev_priv(dev); struct velocity_info *vptr = netdev_priv(dev);
@ -530,9 +530,10 @@ static void velocity_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
set_bit(vid, vptr->active_vlans); set_bit(vid, vptr->active_vlans);
velocity_init_cam_filter(vptr); velocity_init_cam_filter(vptr);
spin_unlock_irq(&vptr->lock); spin_unlock_irq(&vptr->lock);
return 0;
} }
static void velocity_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) static int velocity_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
{ {
struct velocity_info *vptr = netdev_priv(dev); struct velocity_info *vptr = netdev_priv(dev);
@ -540,6 +541,7 @@ static void velocity_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid
clear_bit(vid, vptr->active_vlans); clear_bit(vid, vptr->active_vlans);
velocity_init_cam_filter(vptr); velocity_init_cam_filter(vptr);
spin_unlock_irq(&vptr->lock); spin_unlock_irq(&vptr->lock);
return 0;
} }
static void velocity_init_rx_ring_indexes(struct velocity_info *vptr) static void velocity_init_rx_ring_indexes(struct velocity_info *vptr)

View File

@ -520,7 +520,7 @@ static struct rtnl_link_stats64 *macvlan_dev_get_stats64(struct net_device *dev,
return stats; return stats;
} }
static void macvlan_vlan_rx_add_vid(struct net_device *dev, static int macvlan_vlan_rx_add_vid(struct net_device *dev,
unsigned short vid) unsigned short vid)
{ {
struct macvlan_dev *vlan = netdev_priv(dev); struct macvlan_dev *vlan = netdev_priv(dev);
@ -528,10 +528,11 @@ static void macvlan_vlan_rx_add_vid(struct net_device *dev,
const struct net_device_ops *ops = lowerdev->netdev_ops; const struct net_device_ops *ops = lowerdev->netdev_ops;
if (ops->ndo_vlan_rx_add_vid) if (ops->ndo_vlan_rx_add_vid)
ops->ndo_vlan_rx_add_vid(lowerdev, vid); return ops->ndo_vlan_rx_add_vid(lowerdev, vid);
return 0;
} }
static void macvlan_vlan_rx_kill_vid(struct net_device *dev, static int macvlan_vlan_rx_kill_vid(struct net_device *dev,
unsigned short vid) unsigned short vid)
{ {
struct macvlan_dev *vlan = netdev_priv(dev); struct macvlan_dev *vlan = netdev_priv(dev);
@ -539,7 +540,8 @@ static void macvlan_vlan_rx_kill_vid(struct net_device *dev,
const struct net_device_ops *ops = lowerdev->netdev_ops; const struct net_device_ops *ops = lowerdev->netdev_ops;
if (ops->ndo_vlan_rx_kill_vid) if (ops->ndo_vlan_rx_kill_vid)
ops->ndo_vlan_rx_kill_vid(lowerdev, vid); return ops->ndo_vlan_rx_kill_vid(lowerdev, vid);
return 0;
} }
static void macvlan_ethtool_get_drvinfo(struct net_device *dev, static void macvlan_ethtool_get_drvinfo(struct net_device *dev,

View File

@ -902,7 +902,7 @@ team_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
return stats; return stats;
} }
static void team_vlan_rx_add_vid(struct net_device *dev, uint16_t vid) static int team_vlan_rx_add_vid(struct net_device *dev, uint16_t vid)
{ {
struct team *team = netdev_priv(dev); struct team *team = netdev_priv(dev);
struct team_port *port; struct team_port *port;
@ -915,9 +915,11 @@ static void team_vlan_rx_add_vid(struct net_device *dev, uint16_t vid)
ops->ndo_vlan_rx_add_vid(port->dev, vid); ops->ndo_vlan_rx_add_vid(port->dev, vid);
} }
rcu_read_unlock(); rcu_read_unlock();
return 0;
} }
static void team_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid) static int team_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid)
{ {
struct team *team = netdev_priv(dev); struct team *team = netdev_priv(dev);
struct team_port *port; struct team_port *port;
@ -930,6 +932,8 @@ static void team_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid)
ops->ndo_vlan_rx_kill_vid(port->dev, vid); ops->ndo_vlan_rx_kill_vid(port->dev, vid);
} }
rcu_read_unlock(); rcu_read_unlock();
return 0;
} }
static int team_add_slave(struct net_device *dev, struct net_device *port_dev) static int team_add_slave(struct net_device *dev, struct net_device *port_dev)

View File

@ -855,7 +855,7 @@ static void virtnet_set_rx_mode(struct net_device *dev)
kfree(buf); kfree(buf);
} }
static void virtnet_vlan_rx_add_vid(struct net_device *dev, u16 vid) static int virtnet_vlan_rx_add_vid(struct net_device *dev, u16 vid)
{ {
struct virtnet_info *vi = netdev_priv(dev); struct virtnet_info *vi = netdev_priv(dev);
struct scatterlist sg; struct scatterlist sg;
@ -865,9 +865,10 @@ static void virtnet_vlan_rx_add_vid(struct net_device *dev, u16 vid)
if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_VLAN, if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_VLAN,
VIRTIO_NET_CTRL_VLAN_ADD, &sg, 1, 0)) VIRTIO_NET_CTRL_VLAN_ADD, &sg, 1, 0))
dev_warn(&dev->dev, "Failed to add VLAN ID %d.\n", vid); dev_warn(&dev->dev, "Failed to add VLAN ID %d.\n", vid);
return 0;
} }
static void virtnet_vlan_rx_kill_vid(struct net_device *dev, u16 vid) static int virtnet_vlan_rx_kill_vid(struct net_device *dev, u16 vid)
{ {
struct virtnet_info *vi = netdev_priv(dev); struct virtnet_info *vi = netdev_priv(dev);
struct scatterlist sg; struct scatterlist sg;
@ -877,6 +878,7 @@ static void virtnet_vlan_rx_kill_vid(struct net_device *dev, u16 vid)
if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_VLAN, if (!virtnet_send_command(vi, VIRTIO_NET_CTRL_VLAN,
VIRTIO_NET_CTRL_VLAN_DEL, &sg, 1, 0)) VIRTIO_NET_CTRL_VLAN_DEL, &sg, 1, 0))
dev_warn(&dev->dev, "Failed to kill VLAN ID %d.\n", vid); dev_warn(&dev->dev, "Failed to kill VLAN ID %d.\n", vid);
return 0;
} }
static void virtnet_get_ringparam(struct net_device *dev, static void virtnet_get_ringparam(struct net_device *dev,

View File

@ -1926,7 +1926,7 @@ vmxnet3_restore_vlan(struct vmxnet3_adapter *adapter)
} }
static void static int
vmxnet3_vlan_rx_add_vid(struct net_device *netdev, u16 vid) vmxnet3_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
{ {
struct vmxnet3_adapter *adapter = netdev_priv(netdev); struct vmxnet3_adapter *adapter = netdev_priv(netdev);
@ -1943,10 +1943,12 @@ vmxnet3_vlan_rx_add_vid(struct net_device *netdev, u16 vid)
} }
set_bit(vid, adapter->active_vlans); set_bit(vid, adapter->active_vlans);
return 0;
} }
static void static int
vmxnet3_vlan_rx_kill_vid(struct net_device *netdev, u16 vid) vmxnet3_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
{ {
struct vmxnet3_adapter *adapter = netdev_priv(netdev); struct vmxnet3_adapter *adapter = netdev_priv(netdev);
@ -1963,6 +1965,8 @@ vmxnet3_vlan_rx_kill_vid(struct net_device *netdev, u16 vid)
} }
clear_bit(vid, adapter->active_vlans); clear_bit(vid, adapter->active_vlans);
return 0;
} }

View File

@ -301,21 +301,21 @@ static void qeth_l2_process_vlans(struct qeth_card *card)
spin_unlock_bh(&card->vlanlock); spin_unlock_bh(&card->vlanlock);
} }
static void qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) static int qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
{ {
struct qeth_card *card = dev->ml_priv; struct qeth_card *card = dev->ml_priv;
struct qeth_vlan_vid *id; struct qeth_vlan_vid *id;
QETH_CARD_TEXT_(card, 4, "aid:%d", vid); QETH_CARD_TEXT_(card, 4, "aid:%d", vid);
if (!vid) if (!vid)
return; return 0;
if (card->info.type == QETH_CARD_TYPE_OSM) { if (card->info.type == QETH_CARD_TYPE_OSM) {
QETH_CARD_TEXT(card, 3, "aidOSM"); QETH_CARD_TEXT(card, 3, "aidOSM");
return; return 0;
} }
if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
QETH_CARD_TEXT(card, 3, "aidREC"); QETH_CARD_TEXT(card, 3, "aidREC");
return; return 0;
} }
id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC); id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC);
if (id) { if (id) {
@ -324,10 +324,13 @@ static void qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
spin_lock_bh(&card->vlanlock); spin_lock_bh(&card->vlanlock);
list_add_tail(&id->list, &card->vid_list); list_add_tail(&id->list, &card->vid_list);
spin_unlock_bh(&card->vlanlock); spin_unlock_bh(&card->vlanlock);
} else {
return -ENOMEM;
} }
return 0;
} }
static void qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) static int qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
{ {
struct qeth_vlan_vid *id, *tmpid = NULL; struct qeth_vlan_vid *id, *tmpid = NULL;
struct qeth_card *card = dev->ml_priv; struct qeth_card *card = dev->ml_priv;
@ -335,11 +338,11 @@ static void qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
QETH_CARD_TEXT_(card, 4, "kid:%d", vid); QETH_CARD_TEXT_(card, 4, "kid:%d", vid);
if (card->info.type == QETH_CARD_TYPE_OSM) { if (card->info.type == QETH_CARD_TYPE_OSM) {
QETH_CARD_TEXT(card, 3, "kidOSM"); QETH_CARD_TEXT(card, 3, "kidOSM");
return; return 0;
} }
if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
QETH_CARD_TEXT(card, 3, "kidREC"); QETH_CARD_TEXT(card, 3, "kidREC");
return; return 0;
} }
spin_lock_bh(&card->vlanlock); spin_lock_bh(&card->vlanlock);
list_for_each_entry(id, &card->vid_list, list) { list_for_each_entry(id, &card->vid_list, list) {
@ -355,6 +358,7 @@ static void qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
kfree(tmpid); kfree(tmpid);
} }
qeth_l2_set_multicast_list(card->dev); qeth_l2_set_multicast_list(card->dev);
return 0;
} }
static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode) static int qeth_l2_stop_card(struct qeth_card *card, int recovery_mode)

View File

@ -1869,15 +1869,15 @@ static void qeth_l3_free_vlan_addresses(struct qeth_card *card,
qeth_l3_free_vlan_addresses6(card, vid); qeth_l3_free_vlan_addresses6(card, vid);
} }
static void qeth_l3_vlan_rx_add_vid(struct net_device *dev, unsigned short vid) static int qeth_l3_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)
{ {
struct qeth_card *card = dev->ml_priv; struct qeth_card *card = dev->ml_priv;
set_bit(vid, card->active_vlans); set_bit(vid, card->active_vlans);
return; return 0;
} }
static void qeth_l3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid) static int qeth_l3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
{ {
struct qeth_card *card = dev->ml_priv; struct qeth_card *card = dev->ml_priv;
unsigned long flags; unsigned long flags;
@ -1885,7 +1885,7 @@ static void qeth_l3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
QETH_CARD_TEXT_(card, 4, "kid:%d", vid); QETH_CARD_TEXT_(card, 4, "kid:%d", vid);
if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) {
QETH_CARD_TEXT(card, 3, "kidREC"); QETH_CARD_TEXT(card, 3, "kidREC");
return; return 0;
} }
spin_lock_irqsave(&card->vlanlock, flags); spin_lock_irqsave(&card->vlanlock, flags);
/* unregister IP addresses of vlan device */ /* unregister IP addresses of vlan device */
@ -1893,6 +1893,7 @@ static void qeth_l3_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
clear_bit(vid, card->active_vlans); clear_bit(vid, card->active_vlans);
spin_unlock_irqrestore(&card->vlanlock, flags); spin_unlock_irqrestore(&card->vlanlock, flags);
qeth_l3_set_multicast_list(card->dev); qeth_l3_set_multicast_list(card->dev);
return 0;
} }
static inline int qeth_l3_rebuild_skb(struct qeth_card *card, static inline int qeth_l3_rebuild_skb(struct qeth_card *card,

View File

@ -792,11 +792,11 @@ struct netdev_tc_txq {
* 3. Update dev->stats asynchronously and atomically, and define * 3. Update dev->stats asynchronously and atomically, and define
* neither operation. * neither operation.
* *
* void (*ndo_vlan_rx_add_vid)(struct net_device *dev, unsigned short vid); * int (*ndo_vlan_rx_add_vid)(struct net_device *dev, unsigned short vid);
* If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER) * If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER)
* this function is called when a VLAN id is registered. * this function is called when a VLAN id is registered.
* *
* void (*ndo_vlan_rx_kill_vid)(struct net_device *dev, unsigned short vid); * int (*ndo_vlan_rx_kill_vid)(struct net_device *dev, unsigned short vid);
* If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER) * If device support VLAN filtering (dev->features & NETIF_F_HW_VLAN_FILTER)
* this function is called when a VLAN id is unregistered. * this function is called when a VLAN id is unregistered.
* *
@ -911,9 +911,9 @@ struct net_device_ops {
struct rtnl_link_stats64 *storage); struct rtnl_link_stats64 *storage);
struct net_device_stats* (*ndo_get_stats)(struct net_device *dev); struct net_device_stats* (*ndo_get_stats)(struct net_device *dev);
void (*ndo_vlan_rx_add_vid)(struct net_device *dev, int (*ndo_vlan_rx_add_vid)(struct net_device *dev,
unsigned short vid); unsigned short vid);
void (*ndo_vlan_rx_kill_vid)(struct net_device *dev, int (*ndo_vlan_rx_kill_vid)(struct net_device *dev,
unsigned short vid); unsigned short vid);
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
void (*ndo_poll_controller)(struct net_device *dev); void (*ndo_poll_controller)(struct net_device *dev);