diff options
| -rw-r--r-- | drivers/net/kirkwood_egiga.c | 21 | ||||
| -rw-r--r-- | drivers/net/kirkwood_egiga.h | 1 | 
2 files changed, 18 insertions, 4 deletions
| diff --git a/drivers/net/kirkwood_egiga.c b/drivers/net/kirkwood_egiga.c index 9f3663379..479035d55 100644 --- a/drivers/net/kirkwood_egiga.c +++ b/drivers/net/kirkwood_egiga.c @@ -500,18 +500,26 @@ static int kwgbe_send(struct eth_device *dev, volatile void *dataptr,  	struct kwgbe_device *dkwgbe = to_dkwgbe(dev);  	struct kwgbe_registers *regs = dkwgbe->regs;  	struct kwgbe_txdesc *p_txdesc = dkwgbe->p_txdesc; +	void *p = (void *)dataptr;  	u32 cmd_sts; +	/* Copy buffer if it's misaligned */  	if ((u32) dataptr & 0x07) { -		printf("Err..(%s) xmit dataptr not 64bit aligned\n", -			__FUNCTION__); -		return -1; +		if (datasize > PKTSIZE_ALIGN) { +			printf("Non-aligned data too large (%d)\n", +					datasize); +			return -1; +		} + +		memcpy(dkwgbe->p_aligned_txbuf, p, datasize); +		p = dkwgbe->p_aligned_txbuf;  	} +  	p_txdesc->cmd_sts = KWGBE_ZERO_PADDING | KWGBE_GEN_CRC;  	p_txdesc->cmd_sts |= KWGBE_TX_FIRST_DESC | KWGBE_TX_LAST_DESC;  	p_txdesc->cmd_sts |= KWGBE_BUFFER_OWNED_BY_DMA;  	p_txdesc->cmd_sts |= KWGBE_TX_EN_INTERRUPT; -	p_txdesc->buf_ptr = (u8 *) dataptr; +	p_txdesc->buf_ptr = (u8 *) p;  	p_txdesc->byte_cnt = datasize;  	/* Apply send command using zeroth RXUQ */ @@ -628,8 +636,13 @@ int kirkwood_egiga_initialize(bd_t * bis)  							* PKTSIZE_ALIGN + 1)))  			goto error3; +		if (!(dkwgbe->p_aligned_txbuf = memalign(8, PKTSIZE_ALIGN))) +			goto error4; +  		if (!(dkwgbe->p_txdesc = (struct kwgbe_txdesc *)  		      memalign(PKTALIGN, sizeof(struct kwgbe_txdesc) + 1))) { +			free(dkwgbe->p_aligned_txbuf); +		      error4:  			free(dkwgbe->p_rxbuf);  		      error3:  			free(dkwgbe->p_rxdesc); diff --git a/drivers/net/kirkwood_egiga.h b/drivers/net/kirkwood_egiga.h index 9c893d131..16d52141e 100644 --- a/drivers/net/kirkwood_egiga.h +++ b/drivers/net/kirkwood_egiga.h @@ -499,6 +499,7 @@ struct kwgbe_device {  	struct kwgbe_rxdesc *p_rxdesc;  	struct kwgbe_rxdesc *p_rxdesc_curr;  	u8 *p_rxbuf; +	u8 *p_aligned_txbuf;  };  #endif /* __EGIGA_H__ */ |