From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ben Warren Date: Sun, 25 Apr 2010 21:53:09 -0700 Subject: [U-Boot] [PATCH v2] smc911x driver frame alignment patch In-Reply-To: <4BD132C7.9060604@niistt.ru> References: <4BD132C7.9060604@niistt.ru> Message-ID: <4BD51C35.4080009@gmail.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Valentin, On 4/22/2010 10:40 PM, Valentin Yakovenkov wrote: > SMSC911x chips have alignment function to allow frame payload data > (which comes after 14-bytes ethernet header) to be aligned at some > boundary when reading it from fifo (usually - 4 bytes boundary). > This is done by inserting fake zeros bytes BEFORE actual frame data when > reading from SMSC's fifo. > This function controlled by RX_CFG register. There are bits that > represents amount of fake bytes to be inserted. > > Linux uses alignment of 4 bytes. Ethernet frame header is 14 bytes long, > so we need to add 2 fake bytes to get payload data aligned at 4-bytes > boundary. > Linux driver does this by adding IP_ALIGNMENT constant (defined at > skb.h) when calculating fifo data length. All network subsystem of Linux > uses this constant too when calculating different offsets. > > But u-boot does not use any packet data alignment, so we don't need to > add anything when calculating fifo data length. > Moreover, driver zeros the RX_CFG register just one line up, so chip > does not insert any fake data at the beginig. So calculated data length > is always bigger by 1 word. > > It seems that at almost every packet read we get an underflow condition > at fifo and possible corruption of data. Especially at continuous > transfers, such as tftp. > > Just after removing this magic addition, I've got tftp transfer speed as > it aught to be at 100Mbps. It was really slow before. > > It seems that fifo underflow occurs only when using byte packing on > 32-bit blackfin bus (may be because of very small delay between reads). > > > > Signed-off-by: Valentin Yakovenkov > diff -r 7dc8ff189175 a/drivers/net/smc911x.c > --- a/drivers/net/smc911x.c Mon Mar 29 11:08:55 2010 +0400 > +++ b/drivers/net/smc911x.c Mon Apr 19 10:46:02 2010 +0400 > @@ -220,7 +220,7 @@ > > smc911x_reg_write(dev, RX_CFG, 0); > > - tmplen = (pktlen + 2+ 3) / 4; > + tmplen = (pktlen + 3) / 4; > while (tmplen--) > *data++ = pkt_data_pull(dev, RX_DATA_FIFO); > > -- > WBR, Valentin > CJSC "NII STT", Russia, Smolensk > http://www.niistt.ru > > Applied to net repo. thanks, Ben