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 |