if (skb_shinfo(skb)->tso_size) { 
if (skb_shinfo(skb)->tso_size && !(large_send == QETH_LARGE_SEND_NO)) { 
qeth_send_packet(struct qeth_card *card, struct sk_buff *skb){	int ipv = 0;	int cast_type;	struct qeth_qdio_out_q *queue;	struct qeth_hdr *hdr;	int elements_needed = 0;	enum qeth_large_send_types large_send = QETH_LARGE_SEND_NO;	struct qeth_eddp_context *ctx = NULL;	int rc;	QETH_DBF_TEXT(trace, 6, "sendpkt");	if (!card->options.layer2) {		ipv = qeth_get_ip_version(skb);		if ((card->dev->hard_header == qeth_fake_header) && ipv) {               		if ((skb = qeth_pskb_unshare(skb,GFP_ATOMIC)) == NULL) {                        	card->stats.tx_dropped++;                        	dev_kfree_skb_irq(skb);                        	return 0;                	}			if(card->dev->type == ARPHRD_IEEE802_TR){				skb_pull(skb, QETH_FAKE_LL_LEN_TR);			} else {                		skb_pull(skb, QETH_FAKE_LL_LEN_ETH);			}		}	}	cast_type = qeth_get_cast_type(card, skb);	if ((cast_type == RTN_BROADCAST) && (card->info.broadcast_capable == 0)){		card->stats.tx_dropped++;		card->stats.tx_errors++;		dev_kfree_skb_any(skb);		return NETDEV_TX_OK;	}	queue = card->qdio.out_qs		[qeth_get_priority_queue(card, skb, ipv, cast_type)];	if (skb_shinfo(skb)->tso_size)		large_send = card->options.large_send;	if ((rc = qeth_prepare_skb(card, &skb, &hdr, ipv))){		QETH_DBF_TEXT_(trace, 4, "pskbe%d", rc);		return rc;	}	/*are we able to do TSO ? If so ,prepare and send it from here */	if ((large_send == QETH_LARGE_SEND_TSO) &&	    (cast_type == RTN_UNSPEC)) {		rc = qeth_tso_send_packet(card, skb, queue,					  ipv, cast_type);		goto do_statistics;	}	qeth_fill_header(card, hdr, skb, ipv, cast_type);	if (large_send == QETH_LARGE_SEND_EDDP) {		ctx = qeth_eddp_create_context(card, skb, hdr);		if (ctx == NULL) {			PRINT_WARN("could not create eddp context\n");			return -EINVAL;		}	} else {		elements_needed = qeth_get_elements_no(card,(void*) hdr, skb);		if (!elements_needed)			return -EINVAL;	}	if (card->info.type != QETH_CARD_TYPE_IQD)		rc = qeth_do_send_packet(card, queue, skb, hdr,					 elements_needed, ctx);	else		rc = qeth_do_send_packet_fast(card, queue, skb, hdr,					      elements_needed, ctx);do_statistics:	if (!rc){		card->stats.tx_packets++;		card->stats.tx_bytes += skb->len;#ifdef CONFIG_QETH_PERF_STATS		if (skb_shinfo(skb)->tso_size) {			card->perf_stats.large_send_bytes += skb->len;			card->perf_stats.large_send_cnt++;		} 		if (skb_shinfo(skb)->nr_frags > 0){			card->perf_stats.sg_skbs_sent++;			/* nr_frags + skb->data */			card->perf_stats.sg_frags_sent +=				skb_shinfo(skb)->nr_frags + 1;		}#endif /* CONFIG_QETH_PERF_STATS */	}	if (ctx != NULL) {		/* drop creator's reference */		qeth_eddp_put_context(ctx);		/* free skb; it's not referenced by a buffer */		if (rc == 0)			dev_kfree_skb_any(skb);	}	return rc;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/05e08a2a297371564020f76d1bf8b3a931d5e1ed/qeth_main.c/buggy/drivers/s390/net/qeth_main.c