Skip to content

Commit

Permalink
smsc911x: add fifo byteswap support V2
Browse files Browse the repository at this point in the history
This is V2 of the smsc911x fifo byteswap patch.

The smsc911x hardware supports both big and little and endian
hardware configurations, and the linux smsc911x driver currently
detects word order.

For correct operation on big endian platforms lacking swapped
byte lanes the following patch is needed. Only fifo data is
swapped, register data does not require any swapping.

Signed-off-by: Magnus Damm <damm@igel.co.jp>
Acked-by: Steve Glendinning <steve.glendinning@smsc.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Magnus Damm authored and David S. Miller committed Apr 28, 2009
1 parent 52fbc10 commit 833cc67
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
13 changes: 13 additions & 0 deletions drivers/net/smsc911x.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
#include <linux/bitops.h>
#include <linux/irq.h>
#include <linux/io.h>
#include <linux/swab.h>
#include <linux/phy.h>
#include <linux/smsc911x.h>
#include "smsc911x.h"
Expand Down Expand Up @@ -175,6 +176,12 @@ static inline void
smsc911x_tx_writefifo(struct smsc911x_data *pdata, unsigned int *buf,
unsigned int wordcount)
{
if (pdata->config.flags & SMSC911X_SWAP_FIFO) {
while (wordcount--)
smsc911x_reg_write(pdata, TX_DATA_FIFO, swab32(*buf++));
return;
}

if (pdata->config.flags & SMSC911X_USE_32BIT) {
writesl(pdata->ioaddr + TX_DATA_FIFO, buf, wordcount);
return;
Expand All @@ -194,6 +201,12 @@ static inline void
smsc911x_rx_readfifo(struct smsc911x_data *pdata, unsigned int *buf,
unsigned int wordcount)
{
if (pdata->config.flags & SMSC911X_SWAP_FIFO) {
while (wordcount--)
*buf++ = swab32(smsc911x_reg_read(pdata, RX_DATA_FIFO));
return;
}

if (pdata->config.flags & SMSC911X_USE_32BIT) {
readsl(pdata->ioaddr + RX_DATA_FIFO, buf, wordcount);
return;
Expand Down
10 changes: 10 additions & 0 deletions include/linux/smsc911x.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,14 @@ struct smsc911x_platform_config {
#define SMSC911X_FORCE_EXTERNAL_PHY (BIT(3))
#define SMSC911X_SAVE_MAC_ADDRESS (BIT(4))

/*
* SMSC911X_SWAP_FIFO:
* Enables software byte swap for fifo data. Should only be used as a
* "last resort" in the case of big endian mode on boards with incorrectly
* routed data bus to older devices such as LAN9118. Newer devices such as
* LAN9221 can handle this in hardware, there are registers to control
* this swapping but the driver doesn't currently use them.
*/
#define SMSC911X_SWAP_FIFO (BIT(5))

#endif /* __LINUX_SMSC911X_H__ */

0 comments on commit 833cc67

Please sign in to comment.