if (veth_stack_is_empty(cnx)) veth_stop_queues(cnx);  
static int veth_transmit_to_one(struct sk_buff *skb, HvLpIndex rlp,				struct net_device *dev){	struct veth_lpar_connection *cnx = veth_cnx[rlp];	struct veth_port *port = (struct veth_port *) dev->priv;	HvLpEvent_Rc rc;	struct veth_msg *msg = NULL;	int err = 0;	unsigned long flags;	if (! cnx) {		port->stats.tx_errors++;		dev_kfree_skb(skb);		return 0;	}	spin_lock_irqsave(&cnx->lock, flags);	if (! (cnx->state & VETH_STATE_READY))		goto drop;	if ((skb->len - 14) > VETH_MAX_MTU)		goto drop;	msg = veth_stack_pop(cnx);	if (! msg) {		err = 1;		goto drop;	}	msg->in_use = 1;	msg->data.addr[0] = dma_map_single(port->dev, skb->data,				skb->len, DMA_TO_DEVICE);	if (dma_mapping_error(msg->data.addr[0]))		goto recycle_and_drop;	/* Is it really necessary to check the length and address	 * fields of the first entry here? */	msg->skb = skb;	msg->dev = port->dev;	msg->data.len[0] = skb->len;	msg->data.eofmask = 1 << VETH_EOF_SHIFT;	rc = veth_signaldata(cnx, VethEventTypeFrames, msg->token, &msg->data);	if (rc != HvLpEvent_Rc_Good)		goto recycle_and_drop;	/* If the timer's not already running, start it now. */	if (0 == cnx->outstanding_tx)		mod_timer(&cnx->reset_timer, jiffies + cnx->reset_timeout);	cnx->last_contact = jiffies;	cnx->outstanding_tx++;	spin_unlock_irqrestore(&cnx->lock, flags);	return 0; recycle_and_drop:	/* we free the skb below, so tell veth_recycle_msg() not to. */	msg->skb = NULL;	veth_recycle_msg(cnx, msg); drop:	port->stats.tx_errors++;	dev_kfree_skb(skb);	spin_unlock_irqrestore(&cnx->lock, flags);	return err;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/e0808494ff44d5cedcaf286bb8a93d08e8d9af49/iseries_veth.c/clean/drivers/net/iseries_veth.c