提交 a1342206 编写于 作者: L Linus Torvalds
...@@ -426,9 +426,30 @@ static void tg3_enable_ints(struct tg3 *tp) ...@@ -426,9 +426,30 @@ static void tg3_enable_ints(struct tg3 *tp)
tg3_cond_int(tp); tg3_cond_int(tp);
} }
static inline unsigned int tg3_has_work(struct tg3 *tp)
{
struct tg3_hw_status *sblk = tp->hw_status;
unsigned int work_exists = 0;
/* check for phy events */
if (!(tp->tg3_flags &
(TG3_FLAG_USE_LINKCHG_REG |
TG3_FLAG_POLL_SERDES))) {
if (sblk->status & SD_STATUS_LINK_CHG)
work_exists = 1;
}
/* check for RX/TX work to do */
if (sblk->idx[0].tx_consumer != tp->tx_cons ||
sblk->idx[0].rx_producer != tp->rx_rcb_ptr)
work_exists = 1;
return work_exists;
}
/* tg3_restart_ints /* tg3_restart_ints
* similar to tg3_enable_ints, but it can return without flushing the * similar to tg3_enable_ints, but it accurately determines whether there
* PIO write which reenables interrupts * is new work pending and can return without flushing the PIO write
* which reenables interrupts
*/ */
static void tg3_restart_ints(struct tg3 *tp) static void tg3_restart_ints(struct tg3 *tp)
{ {
...@@ -437,7 +458,9 @@ static void tg3_restart_ints(struct tg3 *tp) ...@@ -437,7 +458,9 @@ static void tg3_restart_ints(struct tg3 *tp)
tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000000); tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000000);
mmiowb(); mmiowb();
tg3_cond_int(tp); if (tg3_has_work(tp))
tw32(HOSTCC_MODE, tp->coalesce_mode |
(HOSTCC_MODE_ENABLE | HOSTCC_MODE_NOW));
} }
static inline void tg3_netif_stop(struct tg3 *tp) static inline void tg3_netif_stop(struct tg3 *tp)
...@@ -2686,8 +2709,8 @@ static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag) ...@@ -2686,8 +2709,8 @@ static int tg3_vlan_rx(struct tg3 *tp, struct sk_buff *skb, u16 vlan_tag)
static int tg3_rx(struct tg3 *tp, int budget) static int tg3_rx(struct tg3 *tp, int budget)
{ {
u32 work_mask; u32 work_mask;
u32 rx_rcb_ptr = tp->rx_rcb_ptr; u32 sw_idx = tp->rx_rcb_ptr;
u16 hw_idx, sw_idx; u16 hw_idx;
int received; int received;
hw_idx = tp->hw_status->idx[0].rx_producer; hw_idx = tp->hw_status->idx[0].rx_producer;
...@@ -2696,7 +2719,6 @@ static int tg3_rx(struct tg3 *tp, int budget) ...@@ -2696,7 +2719,6 @@ static int tg3_rx(struct tg3 *tp, int budget)
* the opaque cookie. * the opaque cookie.
*/ */
rmb(); rmb();
sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp);
work_mask = 0; work_mask = 0;
received = 0; received = 0;
while (sw_idx != hw_idx && budget > 0) { while (sw_idx != hw_idx && budget > 0) {
...@@ -2801,14 +2823,19 @@ static int tg3_rx(struct tg3 *tp, int budget) ...@@ -2801,14 +2823,19 @@ static int tg3_rx(struct tg3 *tp, int budget)
next_pkt: next_pkt:
(*post_ptr)++; (*post_ptr)++;
next_pkt_nopost: next_pkt_nopost:
rx_rcb_ptr++; sw_idx++;
sw_idx = rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp); sw_idx %= TG3_RX_RCB_RING_SIZE(tp);
/* Refresh hw_idx to see if there is new work */
if (sw_idx == hw_idx) {
hw_idx = tp->hw_status->idx[0].rx_producer;
rmb();
}
} }
/* ACK the status ring. */ /* ACK the status ring. */
tp->rx_rcb_ptr = rx_rcb_ptr; tp->rx_rcb_ptr = sw_idx;
tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, tw32_rx_mbox(MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW, sw_idx);
(rx_rcb_ptr % TG3_RX_RCB_RING_SIZE(tp)));
/* Refill RX ring(s). */ /* Refill RX ring(s). */
if (work_mask & RXD_OPAQUE_RING_STD) { if (work_mask & RXD_OPAQUE_RING_STD) {
...@@ -2887,26 +2914,6 @@ static int tg3_poll(struct net_device *netdev, int *budget) ...@@ -2887,26 +2914,6 @@ static int tg3_poll(struct net_device *netdev, int *budget)
return (done ? 0 : 1); return (done ? 0 : 1);
} }
static inline unsigned int tg3_has_work(struct net_device *dev, struct tg3 *tp)
{
struct tg3_hw_status *sblk = tp->hw_status;
unsigned int work_exists = 0;
/* check for phy events */
if (!(tp->tg3_flags &
(TG3_FLAG_USE_LINKCHG_REG |
TG3_FLAG_POLL_SERDES))) {
if (sblk->status & SD_STATUS_LINK_CHG)
work_exists = 1;
}
/* check for RX/TX work to do */
if (sblk->idx[0].tx_consumer != tp->tx_cons ||
sblk->idx[0].rx_producer != tp->rx_rcb_ptr)
work_exists = 1;
return work_exists;
}
/* MSI ISR - No need to check for interrupt sharing and no need to /* MSI ISR - No need to check for interrupt sharing and no need to
* flush status block and interrupt mailbox. PCI ordering rules * flush status block and interrupt mailbox. PCI ordering rules
* guarantee that MSI will arrive after the status block. * guarantee that MSI will arrive after the status block.
...@@ -2930,7 +2937,7 @@ static irqreturn_t tg3_msi(int irq, void *dev_id, struct pt_regs *regs) ...@@ -2930,7 +2937,7 @@ static irqreturn_t tg3_msi(int irq, void *dev_id, struct pt_regs *regs)
tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001);
sblk->status &= ~SD_STATUS_UPDATED; sblk->status &= ~SD_STATUS_UPDATED;
if (likely(tg3_has_work(dev, tp))) if (likely(tg3_has_work(tp)))
netif_rx_schedule(dev); /* schedule NAPI poll */ netif_rx_schedule(dev); /* schedule NAPI poll */
else { else {
/* no work, re-enable interrupts /* no work, re-enable interrupts
...@@ -2977,7 +2984,7 @@ static irqreturn_t tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -2977,7 +2984,7 @@ static irqreturn_t tg3_interrupt(int irq, void *dev_id, struct pt_regs *regs)
tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW); tr32(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW);
sblk->status &= ~SD_STATUS_UPDATED; sblk->status &= ~SD_STATUS_UPDATED;
if (likely(tg3_has_work(dev, tp))) if (likely(tg3_has_work(tp)))
netif_rx_schedule(dev); /* schedule NAPI poll */ netif_rx_schedule(dev); /* schedule NAPI poll */
else { else {
/* no work, shared interrupt perhaps? re-enable /* no work, shared interrupt perhaps? re-enable
......
...@@ -195,6 +195,8 @@ static inline int ip_finish_output2(struct sk_buff *skb) ...@@ -195,6 +195,8 @@ static inline int ip_finish_output2(struct sk_buff *skb)
nf_debug_ip_finish_output2(skb); nf_debug_ip_finish_output2(skb);
#endif /*CONFIG_NETFILTER_DEBUG*/ #endif /*CONFIG_NETFILTER_DEBUG*/
nf_reset(skb);
if (hh) { if (hh) {
int hh_alen; int hh_alen;
......
...@@ -252,7 +252,7 @@ static int find_pattern(const char *data, size_t dlen, ...@@ -252,7 +252,7 @@ static int find_pattern(const char *data, size_t dlen,
} }
/* Look up to see if we're just after a \n. */ /* Look up to see if we're just after a \n. */
static int find_nl_seq(u16 seq, const struct ip_ct_ftp_master *info, int dir) static int find_nl_seq(u32 seq, const struct ip_ct_ftp_master *info, int dir)
{ {
unsigned int i; unsigned int i;
...@@ -263,7 +263,7 @@ static int find_nl_seq(u16 seq, const struct ip_ct_ftp_master *info, int dir) ...@@ -263,7 +263,7 @@ static int find_nl_seq(u16 seq, const struct ip_ct_ftp_master *info, int dir)
} }
/* We don't update if it's older than what we have. */ /* We don't update if it's older than what we have. */
static void update_nl_seq(u16 nl_seq, struct ip_ct_ftp_master *info, int dir) static void update_nl_seq(u32 nl_seq, struct ip_ct_ftp_master *info, int dir)
{ {
unsigned int i, oldest = NUM_SEQ_TO_REMEMBER; unsigned int i, oldest = NUM_SEQ_TO_REMEMBER;
......
...@@ -431,13 +431,6 @@ static unsigned int ip_conntrack_defrag(unsigned int hooknum, ...@@ -431,13 +431,6 @@ static unsigned int ip_conntrack_defrag(unsigned int hooknum,
const struct net_device *out, const struct net_device *out,
int (*okfn)(struct sk_buff *)) int (*okfn)(struct sk_buff *))
{ {
#if !defined(CONFIG_IP_NF_NAT) && !defined(CONFIG_IP_NF_NAT_MODULE)
/* Previously seen (loopback)? Ignore. Do this before
fragment check. */
if ((*pskb)->nfct)
return NF_ACCEPT;
#endif
/* Gather fragments. */ /* Gather fragments. */
if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) { if ((*pskb)->nh.iph->frag_off & htons(IP_MF|IP_OFFSET)) {
*pskb = ip_ct_gather_frags(*pskb, *pskb = ip_ct_gather_frags(*pskb,
......
...@@ -3517,7 +3517,6 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb) ...@@ -3517,7 +3517,6 @@ static void tcp_data_queue(struct sock *sk, struct sk_buff *skb)
if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq) if (TCP_SKB_CB(skb)->seq == TCP_SKB_CB(skb)->end_seq)
goto drop; goto drop;
th = skb->h.th;
__skb_pull(skb, th->doff*4); __skb_pull(skb, th->doff*4);
TCP_ECN_accept_cwr(tp, skb); TCP_ECN_accept_cwr(tp, skb);
......
...@@ -10,27 +10,13 @@ ...@@ -10,27 +10,13 @@
* *
*/ */
#include <asm/uaccess.h>
#include <asm/system.h>
#include <asm/bitops.h>
#include <linux/config.h> #include <linux/config.h>
#include <linux/types.h> #include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/socket.h>
#include <linux/sockios.h>
#include <linux/in.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/rtnetlink.h> #include <linux/rtnetlink.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <net/sock.h>
#include <net/pkt_sched.h> #include <net/pkt_sched.h>
#define TCA_ACT_SIMP 22 #define TCA_ACT_SIMP 22
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册