diff options
Diffstat (limited to 'drivers/net/xen-netfront.c')
| -rw-r--r-- | drivers/net/xen-netfront.c | 17 | 
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index 4dd0668003e7..a57daecf1d57 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c @@ -239,7 +239,7 @@ static void rx_refill_timeout(struct timer_list *t)  static int netfront_tx_slot_available(struct netfront_queue *queue)  {  	return (queue->tx.req_prod_pvt - queue->tx.rsp_cons) < -		(NET_TX_RING_SIZE - MAX_SKB_FRAGS - 2); +		(NET_TX_RING_SIZE - XEN_NETIF_NR_SLOTS_MIN - 1);  }  static void xennet_maybe_wake_tx(struct netfront_queue *queue) @@ -564,7 +564,7 @@ static u16 xennet_select_queue(struct net_device *dev, struct sk_buff *skb,  #define MAX_XEN_SKB_FRAGS (65536 / XEN_PAGE_SIZE + 1) -static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev) +static netdev_tx_t xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)  {  	struct netfront_info *np = netdev_priv(dev);  	struct netfront_stats *tx_stats = this_cpu_ptr(np->tx_stats); @@ -790,7 +790,7 @@ static int xennet_get_responses(struct netfront_queue *queue,  	RING_IDX cons = queue->rx.rsp_cons;  	struct sk_buff *skb = xennet_get_rx_skb(queue, cons);  	grant_ref_t ref = xennet_get_rx_ref(queue, cons); -	int max = MAX_SKB_FRAGS + (rx->status <= RX_COPY_THRESHOLD); +	int max = XEN_NETIF_NR_SLOTS_MIN + (rx->status <= RX_COPY_THRESHOLD);  	int slots = 1;  	int err = 0;  	unsigned long ret; @@ -1810,7 +1810,7 @@ static int talk_to_netback(struct xenbus_device *dev,  	err = xen_net_read_mac(dev, info->netdev->dev_addr);  	if (err) {  		xenbus_dev_fatal(dev, err, "parsing %s/mac", dev->nodename); -		goto out; +		goto out_unlocked;  	}  	rtnl_lock(); @@ -1925,6 +1925,7 @@ abort_transaction_no_dev_fatal:  	xennet_destroy_queues(info);   out:  	rtnl_unlock(); +out_unlocked:  	device_unregister(&dev->dev);  	return err;  } @@ -1950,10 +1951,6 @@ static int xennet_connect(struct net_device *dev)  	/* talk_to_netback() sets the correct number of queues */  	num_queues = dev->real_num_tx_queues; -	rtnl_lock(); -	netdev_update_features(dev); -	rtnl_unlock(); -  	if (dev->reg_state == NETREG_UNINITIALIZED) {  		err = register_netdev(dev);  		if (err) { @@ -1963,6 +1960,10 @@ static int xennet_connect(struct net_device *dev)  		}  	} +	rtnl_lock(); +	netdev_update_features(dev); +	rtnl_unlock(); +  	/*  	 * All public and private state should now be sane.  Get  	 * ready to start sending and receiving packets and give the driver  |