devices/8139too-2.6.32-ethercat.c
changeset 2205 a2fe325bb62c
parent 2130 625d87822620
child 2589 2b9c78543663
equal deleted inserted replaced
2195:d9146c0ff00f 2205:a2fe325bb62c
  1787 	/* Note: the chip doesn't have auto-pad! */
  1787 	/* Note: the chip doesn't have auto-pad! */
  1788 	if (likely(len < TX_BUF_SIZE)) {
  1788 	if (likely(len < TX_BUF_SIZE)) {
  1789 		if (len < ETH_ZLEN)
  1789 		if (len < ETH_ZLEN)
  1790 			memset(tp->tx_buf[entry], 0, ETH_ZLEN);
  1790 			memset(tp->tx_buf[entry], 0, ETH_ZLEN);
  1791 		skb_copy_and_csum_dev(skb, tp->tx_buf[entry]);
  1791 		skb_copy_and_csum_dev(skb, tp->tx_buf[entry]);
  1792 		if (!tp->ecdev) dev_kfree_skb(skb);
  1792 		if (!tp->ecdev) {
       
  1793 			dev_kfree_skb(skb);
       
  1794 		}
  1793 	} else {
  1795 	} else {
  1794 		if (!tp->ecdev) dev_kfree_skb(skb);
  1796 		if (!tp->ecdev) {
       
  1797 			dev_kfree_skb(skb);
       
  1798 		}
  1795 		dev->stats.tx_dropped++;
  1799 		dev->stats.tx_dropped++;
  1796 		return NETDEV_TX_OK;
  1800 		return NETDEV_TX_OK;
  1797 	}
  1801 	}
  1798 
  1802 
  1799 	if (tp->ecdev) {
  1803 	if (!tp->ecdev) {
  1800 		wmb();
       
  1801 		RTL_W32_F (TxStatus0 + (entry * sizeof (u32)),
       
  1802 			tp->tx_flag | max(len, (unsigned int)ETH_ZLEN));
       
  1803  
       
  1804 		dev->trans_start = jiffies;
       
  1805  
       
  1806 		tp->cur_tx++;
       
  1807 	} else {
       
  1808 		spin_lock_irqsave(&tp->lock, flags);
  1804 		spin_lock_irqsave(&tp->lock, flags);
  1809 		/*
  1805 	}
  1810 		 * Writing to TxStatus triggers a DMA transfer of the data
  1806 	/*
  1811 		 * copied to tp->tx_buf[entry] above. Use a memory barrier
  1807 	 * Writing to TxStatus triggers a DMA transfer of the data
  1812 		 * to make sure that the device sees the updated data.
  1808 	 * copied to tp->tx_buf[entry] above. Use a memory barrier
  1813 		 */
  1809 	 * to make sure that the device sees the updated data.
  1814 		wmb();
  1810 	 */
  1815 		RTL_W32_F (TxStatus0 + (entry * sizeof (u32)),
  1811 	wmb();
  1816 			   tp->tx_flag | max(len, (unsigned int)ETH_ZLEN));
  1812 	RTL_W32_F (TxStatus0 + (entry * sizeof (u32)),
  1817 
  1813 		   tp->tx_flag | max(len, (unsigned int)ETH_ZLEN));
  1818 		dev->trans_start = jiffies;
  1814 
  1819 
  1815 	dev->trans_start = jiffies;
  1820 		tp->cur_tx++;
  1816 
  1821 
  1817 	tp->cur_tx++;
       
  1818 
       
  1819 	if (!tp->ecdev) {
  1822 		if ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx)
  1820 		if ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx)
  1823 			netif_stop_queue (dev);
  1821 			netif_stop_queue (dev);
  1824 		spin_unlock_irqrestore(&tp->lock, flags);
  1822 		spin_unlock_irqrestore(&tp->lock, flags);
  1825 
  1823 
  1826 		if (netif_msg_tx_queued(tp))
  1824 		if (netif_msg_tx_queued(tp))
  1827 			pr_debug("%s: Queued Tx packet size %u to slot %d.\n",
  1825 			pr_debug("%s: Queued Tx packet size %u to slot %d.\n",
  1828 				dev->name, len, entry);
  1826 					dev->name, len, entry);
  1829 	}
  1827 	}
  1830 
  1828 
  1831 	return NETDEV_TX_OK;
  1829 	return NETDEV_TX_OK;
  1832 }
  1830 }
  1833 
  1831