projects
/
openwrt
/
svn-archive
/
archive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ramips: Fix too small rx buffer
[openwrt/svn-archive/archive.git]
/
target
/
linux
/
ramips
/
files
/
drivers
/
net
/
ethernet
/
ralink
/
ralink_soc_eth.c
diff --git
a/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c
b/target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c
index 2691cfb71051aa230fc1ec680e750d1e4748b251..05b810a78a1f14e62222b523bcba57972b0a45ba 100644
(file)
--- a/
target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c
+++ b/
target/linux/ramips/files/drivers/net/ethernet/ralink/ralink_soc_eth.c
@@
-32,6
+32,7
@@
#include <linux/reset.h>
#include <linux/tcp.h>
#include <linux/io.h>
#include <linux/reset.h>
#include <linux/tcp.h>
#include <linux/io.h>
+#include <linux/bug.h>
#include <asm/mach-ralink/ralink_regs.h>
#include <asm/mach-ralink/ralink_regs.h>
@@
-41,8
+42,8
@@
#include "ralink_ethtool.h"
#define MAX_RX_LENGTH 1536
#include "ralink_ethtool.h"
#define MAX_RX_LENGTH 1536
-#define FE_RX_
HLEN (NET_SKB_PAD + VLAN_ETH_HLEN + VLAN_HLEN + \
-
+ NET_IP_ALIGN + ETH_FCS_LE
N)
+#define FE_RX_
ETH_HLEN (VLAN_ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN)
+
#define FE_RX_HLEN (NET_SKB_PAD + FE_RX_ETH_HLEN + NET_IP_ALIG
N)
#define DMA_DUMMY_DESC 0xffffffff
#define FE_DEFAULT_MSG_ENABLE \
(NETIF_MSG_DRV | \
#define DMA_DUMMY_DESC 0xffffffff
#define FE_DEFAULT_MSG_ENABLE \
(NETIF_MSG_DRV | \
@@
-172,14
+173,21
@@
static int fe_set_mac_address(struct net_device *dev, void *p)
static inline int fe_max_frag_size(int mtu)
{
static inline int fe_max_frag_size(int mtu)
{
+ /* make sure buf_size will be at least MAX_RX_LENGTH */
+ if (mtu + FE_RX_ETH_HLEN < MAX_RX_LENGTH)
+ mtu = MAX_RX_LENGTH - FE_RX_ETH_HLEN;
+
return SKB_DATA_ALIGN(FE_RX_HLEN + mtu) +
SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
}
static inline int fe_max_buf_size(int frag_size)
{
return SKB_DATA_ALIGN(FE_RX_HLEN + mtu) +
SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
}
static inline int fe_max_buf_size(int frag_size)
{
- return frag_size - NET_SKB_PAD - NET_IP_ALIGN -
- SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
+ int buf_size = frag_size - NET_SKB_PAD - NET_IP_ALIGN -
+ SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
+
+ BUG_ON(buf_size < MAX_RX_LENGTH);
+ return buf_size;
}
static inline void fe_get_rxd(struct fe_rx_dma *rxd, struct fe_rx_dma *dma_rxd)
}
static inline void fe_get_rxd(struct fe_rx_dma *rxd, struct fe_rx_dma *dma_rxd)