Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8953f128 authored by Sakari Ailus's avatar Sakari Ailus Committed by David S. Miller
Browse files

tlan: Fix small (< 64 bytes) datagram transmissions

The TLAN chip does not support tranmissions smaller than 64
bytes. Smaller transfers need to be padded up to that size. This was
broken by commit id 41873e9a ("tlan:
get rid of padding buffer").

<URL:http://bugzilla.kernel.org/show_bug.cgi?id=11754

>

Signed-off-by: default avatarSakari Ailus <sakari.ailus@iki.fi>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 092cab7e
Loading
Loading
Loading
Loading
+6 −4
Original line number Original line Diff line number Diff line
@@ -1098,6 +1098,7 @@ static int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )
	dma_addr_t	tail_list_phys;
	dma_addr_t	tail_list_phys;
	u8		*tail_buffer;
	u8		*tail_buffer;
	unsigned long	flags;
	unsigned long	flags;
	unsigned int    txlen;


	if ( ! priv->phyOnline ) {
	if ( ! priv->phyOnline ) {
		TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT:  %s PHY is not ready\n",
		TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT:  %s PHY is not ready\n",
@@ -1108,6 +1109,7 @@ static int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )


	if (skb_padto(skb, TLAN_MIN_FRAME_SIZE))
	if (skb_padto(skb, TLAN_MIN_FRAME_SIZE))
		return 0;
		return 0;
	txlen = max(skb->len, (unsigned int)TLAN_MIN_FRAME_SIZE);


	tail_list = priv->txList + priv->txTail;
	tail_list = priv->txList + priv->txTail;
	tail_list_phys = priv->txListDMA + sizeof(TLanList) * priv->txTail;
	tail_list_phys = priv->txListDMA + sizeof(TLanList) * priv->txTail;
@@ -1125,16 +1127,16 @@ static int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )


	if ( bbuf ) {
	if ( bbuf ) {
		tail_buffer = priv->txBuffer + ( priv->txTail * TLAN_MAX_FRAME_SIZE );
		tail_buffer = priv->txBuffer + ( priv->txTail * TLAN_MAX_FRAME_SIZE );
		skb_copy_from_linear_data(skb, tail_buffer, skb->len);
		skb_copy_from_linear_data(skb, tail_buffer, txlen);
	} else {
	} else {
		tail_list->buffer[0].address = pci_map_single(priv->pciDev,
		tail_list->buffer[0].address = pci_map_single(priv->pciDev,
							      skb->data, skb->len,
							      skb->data, txlen,
							      PCI_DMA_TODEVICE);
							      PCI_DMA_TODEVICE);
		TLan_StoreSKB(tail_list, skb);
		TLan_StoreSKB(tail_list, skb);
	}
	}


	tail_list->frameSize = (u16) skb->len;
	tail_list->frameSize = (u16) txlen;
	tail_list->buffer[0].count = TLAN_LAST_BUFFER | (u32) skb->len;
	tail_list->buffer[0].count = TLAN_LAST_BUFFER | (u32) txlen;
	tail_list->buffer[1].count = 0;
	tail_list->buffer[1].count = 0;
	tail_list->buffer[1].address = 0;
	tail_list->buffer[1].address = 0;