aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/mv643xx_eth.c
diff options
context:
space:
mode:
authorLennert Buytenhek <buytenh@wantstofly.org>2008-07-10 18:39:41 -0400
committerLennert Buytenhek <buytenh@marvell.com>2008-07-24 00:22:51 -0400
commit65193a91fc60fdb79e392c9842c10552a1fa3e1c (patch)
tree767d12ee1ba8830232fed5ef7b56b85d20b18645 /drivers/net/mv643xx_eth.c
parent4dfc1c87af46f9d8abf2ef78a4e22891d7a564c3 (diff)
mv643xx_eth: don't fiddle with maximum receive packet size setting
The maximum receive packet size field in the Port Serial Control register controls at what size received packets are flagged overlength in the receive descriptor, but it doesn't prevent overlength packets from being DMAd to memory and signaled to the host like other received packets. mv643xx_eth does not support receiving jumbo frames in 10/100 mode, but setting the packet threshold to larger than 1522 bytes in 10/100 mode won't cause breakage by itself. If we really want to enforce maximum packet size on the receiving end instead of on the sending end where it should be done, we can always just add a length check to the software receive handler instead of relying on the hardware to do the comparison for us. What's more, changing the maximum packet size field requires temporarily disabling the RX/TX paths. So once the link comes up in 10/100 Mb/s mode or 1000 Mb/s mode, we'd have to disable it again just to set the right maximum packet size field (1522 in 10/100 Mb/s mode or 9700 in 1000 Mb/s mode), just so that we can offload one comparison operation to hardware that we might as well do in software, assuming that we'd want to do it at all. Contrary to what the documentation suggests, there is no harm in just setting a 9700 byte maximum packet size in 10/100 mode, so use the maximum maximum packet size for all modes. Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
Diffstat (limited to 'drivers/net/mv643xx_eth.c')
-rw-r--r--drivers/net/mv643xx_eth.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c
index 3211369a4320..207d4391a6de 100644
--- a/drivers/net/mv643xx_eth.c
+++ b/drivers/net/mv643xx_eth.c
@@ -154,7 +154,6 @@ static char mv643xx_eth_driver_version[] = "1.1";
154#define SET_MII_SPEED_TO_100 (1 << 24) 154#define SET_MII_SPEED_TO_100 (1 << 24)
155#define SET_GMII_SPEED_TO_1000 (1 << 23) 155#define SET_GMII_SPEED_TO_1000 (1 << 23)
156#define SET_FULL_DUPLEX_MODE (1 << 21) 156#define SET_FULL_DUPLEX_MODE (1 << 21)
157#define MAX_RX_PACKET_1522BYTE (1 << 17)
158#define MAX_RX_PACKET_9700BYTE (5 << 17) 157#define MAX_RX_PACKET_9700BYTE (5 << 17)
159#define MAX_RX_PACKET_MASK (7 << 17) 158#define MAX_RX_PACKET_MASK (7 << 17)
160#define DISABLE_AUTO_NEG_SPEED_GMII (1 << 13) 159#define DISABLE_AUTO_NEG_SPEED_GMII (1 << 13)
@@ -1674,13 +1673,12 @@ static void update_pscr(struct mv643xx_eth_private *mp, int speed, int duplex)
1674 SET_FULL_DUPLEX_MODE | 1673 SET_FULL_DUPLEX_MODE |
1675 MAX_RX_PACKET_MASK); 1674 MAX_RX_PACKET_MASK);
1676 1675
1677 if (speed == SPEED_1000) { 1676 pscr_n |= MAX_RX_PACKET_9700BYTE;
1678 pscr_n |= SET_GMII_SPEED_TO_1000 | MAX_RX_PACKET_9700BYTE; 1677
1679 } else { 1678 if (speed == SPEED_1000)
1680 if (speed == SPEED_100) 1679 pscr_n |= SET_GMII_SPEED_TO_1000;
1681 pscr_n |= SET_MII_SPEED_TO_100; 1680 else if (speed == SPEED_100)
1682 pscr_n |= MAX_RX_PACKET_1522BYTE; 1681 pscr_n |= SET_MII_SPEED_TO_100;
1683 }
1684 1682
1685 if (duplex == DUPLEX_FULL) 1683 if (duplex == DUPLEX_FULL)
1686 pscr_n |= SET_FULL_DUPLEX_MODE; 1684 pscr_n |= SET_FULL_DUPLEX_MODE;