diff options
author | Neil Horman <nhorman@redhat.com> | 2015-07-21 09:55:41 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-07-22 21:20:03 -0700 |
commit | 0d5073935a662564d46dff071874fe2cab11c651 (patch) | |
tree | f2142bec39ce0073cd000a6746213746b9c31314 /drivers | |
parent | 8cf12de41bb772fccd2807780ad23639e4fcce89 (diff) |
staging: unisys: simplify visornic_serverdown_complete
Theres a lot of code duplication going on in visornic_serverdown_complete.
We should just be able to send it through the dev_close path and have it
do the right things.
Signed-off-by: Neil Horman <nhorman@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/unisys/visornic/visornic_main.c | 36 |
1 files changed, 8 insertions, 28 deletions
diff --git a/drivers/staging/unisys/visornic/visornic_main.c b/drivers/staging/unisys/visornic/visornic_main.c index 6c60e18b3be4..aeb379e169da 100644 --- a/drivers/staging/unisys/visornic/visornic_main.c +++ b/drivers/staging/unisys/visornic/visornic_main.c @@ -19,10 +19,11 @@ */ #include <linux/debugfs.h> -#include <linux/netdevice.h> #include <linux/etherdevice.h> -#include <linux/skbuff.h> +#include <linux/netdevice.h> #include <linux/kthread.h> +#include <linux/skbuff.h> +#include <linux/rtnetlink.h> #include "visorbus.h" #include "iochannel.h" @@ -370,8 +371,6 @@ visornic_serverdown_complete(struct work_struct *work) { struct visornic_devdata *devdata; struct net_device *netdev; - unsigned long flags; - int i = 0, count = 0; devdata = container_of(work, struct visornic_devdata, serverdown_completion); @@ -380,27 +379,11 @@ visornic_serverdown_complete(struct work_struct *work) /* Stop using datachan */ visor_thread_stop(&devdata->threadinfo); - /* Inform Linux that the link is down */ - netif_carrier_off(netdev); - netif_stop_queue(netdev); + rtnl_lock(); + dev_close(netdev); + rtnl_unlock(); - /* Free the skb for XMITs that haven't been serviced by the server - * We shouldn't have to inform Linux about these IOs because they - * are "lost in the ethernet" - */ - skb_queue_purge(&devdata->xmitbufhead); - - spin_lock_irqsave(&devdata->priv_lock, flags); - /* free rcv buffers */ - for (i = 0; i < devdata->num_rcv_bufs; i++) { - if (devdata->rcvbuf[i]) { - kfree_skb(devdata->rcvbuf[i]); - devdata->rcvbuf[i] = NULL; - count++; - } - } atomic_set(&devdata->num_rcvbuf_in_iovm, 0); - spin_unlock_irqrestore(&devdata->priv_lock, flags); if (devdata->server_down_complete_func) (*devdata->server_down_complete_func)(devdata->dev, 0); @@ -605,6 +588,8 @@ visornic_disable_with_timeout(struct net_device *netdev, const int timeout) /* we've set enabled to 0, so we can give up the lock. */ spin_unlock_irqrestore(&devdata->priv_lock, flags); + skb_queue_purge(&devdata->xmitbufhead); + /* Free rcv buffers - other end has automatically unposed them on * disable */ @@ -1174,7 +1159,6 @@ repost_return(struct uiscmdrsp *cmdrsp, struct visornic_devdata *devdata, devdata->bad_rcv_buf++; } } - atomic_dec(&devdata->usage); return status; } @@ -1228,10 +1212,6 @@ visornic_rx(struct uiscmdrsp *cmdrsp) devdata->net_stats.rx_packets++; devdata->net_stats.rx_bytes = skb->len; - atomic_inc(&devdata->usage); /* don't want a close to happen before - * we're done here - */ - /* set length to how much was ACTUALLY received - * NOTE: rcv_done_len includes actual length of data rcvd * including ethhdr |