Automatic merge of 'misc-fixes' branch from
rsync://rsync.kernel.org/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
This commit is contained in:
commit
d304506405
|
@ -1274,6 +1274,9 @@ static int el3_close(struct net_device *dev)
|
||||||
spin_lock_irqsave(&lp->window_lock, flags);
|
spin_lock_irqsave(&lp->window_lock, flags);
|
||||||
update_stats(dev);
|
update_stats(dev);
|
||||||
spin_unlock_irqrestore(&lp->window_lock, flags);
|
spin_unlock_irqrestore(&lp->window_lock, flags);
|
||||||
|
|
||||||
|
/* force interrupts off */
|
||||||
|
outw(SetIntrEnb | 0x0000, ioaddr + EL3_CMD);
|
||||||
}
|
}
|
||||||
|
|
||||||
link->open--;
|
link->open--;
|
||||||
|
|
|
@ -1585,8 +1585,8 @@ rtl8169_hw_start(struct net_device *dev)
|
||||||
RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
|
RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
|
||||||
RTL_W8(EarlyTxThres, EarlyTxThld);
|
RTL_W8(EarlyTxThres, EarlyTxThld);
|
||||||
|
|
||||||
/* For gigabit rtl8169, MTU + header + CRC + VLAN */
|
/* Low hurts. Let's disable the filtering. */
|
||||||
RTL_W16(RxMaxSize, tp->rx_buf_sz);
|
RTL_W16(RxMaxSize, 16383);
|
||||||
|
|
||||||
/* Set Rx Config register */
|
/* Set Rx Config register */
|
||||||
i = rtl8169_rx_config |
|
i = rtl8169_rx_config |
|
||||||
|
@ -2127,6 +2127,11 @@ rtl8169_tx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int rtl8169_fragmented_frame(u32 status)
|
||||||
|
{
|
||||||
|
return (status & (FirstFrag | LastFrag)) != (FirstFrag | LastFrag);
|
||||||
|
}
|
||||||
|
|
||||||
static inline void rtl8169_rx_csum(struct sk_buff *skb, struct RxDesc *desc)
|
static inline void rtl8169_rx_csum(struct sk_buff *skb, struct RxDesc *desc)
|
||||||
{
|
{
|
||||||
u32 opts1 = le32_to_cpu(desc->opts1);
|
u32 opts1 = le32_to_cpu(desc->opts1);
|
||||||
|
@ -2177,27 +2182,41 @@ rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
|
||||||
|
|
||||||
while (rx_left > 0) {
|
while (rx_left > 0) {
|
||||||
unsigned int entry = cur_rx % NUM_RX_DESC;
|
unsigned int entry = cur_rx % NUM_RX_DESC;
|
||||||
|
struct RxDesc *desc = tp->RxDescArray + entry;
|
||||||
u32 status;
|
u32 status;
|
||||||
|
|
||||||
rmb();
|
rmb();
|
||||||
status = le32_to_cpu(tp->RxDescArray[entry].opts1);
|
status = le32_to_cpu(desc->opts1);
|
||||||
|
|
||||||
if (status & DescOwn)
|
if (status & DescOwn)
|
||||||
break;
|
break;
|
||||||
if (status & RxRES) {
|
if (status & RxRES) {
|
||||||
printk(KERN_INFO "%s: Rx ERROR!!!\n", dev->name);
|
printk(KERN_INFO "%s: Rx ERROR. status = %08x\n",
|
||||||
|
dev->name, status);
|
||||||
tp->stats.rx_errors++;
|
tp->stats.rx_errors++;
|
||||||
if (status & (RxRWT | RxRUNT))
|
if (status & (RxRWT | RxRUNT))
|
||||||
tp->stats.rx_length_errors++;
|
tp->stats.rx_length_errors++;
|
||||||
if (status & RxCRC)
|
if (status & RxCRC)
|
||||||
tp->stats.rx_crc_errors++;
|
tp->stats.rx_crc_errors++;
|
||||||
|
rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
|
||||||
} else {
|
} else {
|
||||||
struct RxDesc *desc = tp->RxDescArray + entry;
|
|
||||||
struct sk_buff *skb = tp->Rx_skbuff[entry];
|
struct sk_buff *skb = tp->Rx_skbuff[entry];
|
||||||
int pkt_size = (status & 0x00001FFF) - 4;
|
int pkt_size = (status & 0x00001FFF) - 4;
|
||||||
void (*pci_action)(struct pci_dev *, dma_addr_t,
|
void (*pci_action)(struct pci_dev *, dma_addr_t,
|
||||||
size_t, int) = pci_dma_sync_single_for_device;
|
size_t, int) = pci_dma_sync_single_for_device;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The driver does not support incoming fragmented
|
||||||
|
* frames. They are seen as a symptom of over-mtu
|
||||||
|
* sized frames.
|
||||||
|
*/
|
||||||
|
if (unlikely(rtl8169_fragmented_frame(status))) {
|
||||||
|
tp->stats.rx_dropped++;
|
||||||
|
tp->stats.rx_length_errors++;
|
||||||
|
rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
|
||||||
|
goto move_on;
|
||||||
|
}
|
||||||
|
|
||||||
rtl8169_rx_csum(skb, desc);
|
rtl8169_rx_csum(skb, desc);
|
||||||
|
|
||||||
pci_dma_sync_single_for_cpu(tp->pci_dev,
|
pci_dma_sync_single_for_cpu(tp->pci_dev,
|
||||||
|
@ -2224,7 +2243,7 @@ rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
|
||||||
tp->stats.rx_bytes += pkt_size;
|
tp->stats.rx_bytes += pkt_size;
|
||||||
tp->stats.rx_packets++;
|
tp->stats.rx_packets++;
|
||||||
}
|
}
|
||||||
|
move_on:
|
||||||
cur_rx++;
|
cur_rx++;
|
||||||
rx_left--;
|
rx_left--;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue