From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stefan Roese Date: Wed, 8 Jul 2009 14:35:25 +0200 Subject: [U-Boot] [PATCH 4/4]: arm: Kirkwood: See to it that sent data is 8-byte aligned In-Reply-To: <20090708130542.321f7951@marrow.netinsight.se> References: <20090708130134.4b100399@marrow.netinsight.se> <20090708130542.321f7951@marrow.netinsight.se> Message-ID: <200907081435.26019.sr@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Wednesday 08 July 2009 13:05:42 Simon Kagstrom wrote: > U-boot might use non-8-byte-aligned addresses for sending data, which > the kwgbe_send doesn't accept (bootp does this for me). This patch > copies the data to be sent to a temporary buffer if it is non-aligned. > > Signed-off-by: Simon Kagstrom > --- > drivers/net/kirkwood_egiga.c | 26 ++++++++++++++++++++------ > 1 files changed, 20 insertions(+), 6 deletions(-) > > diff --git a/drivers/net/kirkwood_egiga.c b/drivers/net/kirkwood_egiga.c > index 537343f..24269c1 100644 > --- a/drivers/net/kirkwood_egiga.c > +++ b/drivers/net/kirkwood_egiga.c > @@ -481,7 +481,7 @@ static int kwgbe_halt(struct eth_device *dev) > return 0; > } > > -static int kwgbe_send(struct eth_device *dev, volatile void *dataptr, > +static int kwgbe_send_aligned(struct eth_device *dev, volatile void > *dataptr, int datasize) > { > struct kwgbe_device *dkwgbe = to_dkwgbe(dev); > @@ -489,11 +489,6 @@ static int kwgbe_send(struct eth_device *dev, volatile > void *dataptr, struct kwgbe_txdesc *p_txdesc = dkwgbe->p_txdesc; > u32 cmd_sts; > > - if ((u32) dataptr & 0x07) { > - printf("Err..(%s) xmit dataptr not 64bit aligned\n", > - __FUNCTION__); > - return -1; > - } > 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; > @@ -522,6 +517,25 @@ static int kwgbe_send(struct eth_device *dev, volatile > void *dataptr, return 0; > } > > +static int kwgbe_send(struct eth_device *dev, volatile void *dataptr, > + int datasize) > +{ > + static u8 __attribute__((aligned(8))) aligned_buf[9000]; I would prefer to malloc such big area's. And I second Prafulla's comment, that this should be handled by the upper network layer. Thanks. Best regards, Stefan ===================================================================== DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office at denx.de =====================================================================