* [patch 2.6.11-rc3 1/5] r8169: endianness fixes
@ 2005-02-11 23:39 Francois Romieu
2005-02-11 23:41 ` [patch 2.6.11-rc3 2/5] r8169: merge of Realtek's code Francois Romieu
2005-02-13 17:49 ` [patch 2.6.11-rc3 1/5] r8169: endianness fixes Jeff Garzik
0 siblings, 2 replies; 8+ messages in thread
From: Francois Romieu @ 2005-02-11 23:39 UTC (permalink / raw)
To: Jeff Garzik; +Cc: akpm, jdmason, netdev
Endianness fixes
- rtl8169_rx_csum() forgot to convert the descriptor to cpu order,
- same thing for rtl8169_rx_vlan_skb() but this one is more tricky as
the layout of the (u32) word in the 8169 descriptor calls for a
second level of swap at the vlan tag level (u16). The old code only
did the second part (in an endian-dependant way, how fun).
- rtl8169_tx_vlan_tag(): this time the (u32 descriptor level) cpu_to_le32
is issued in rtl8169_start_xmit but the (u16 vlan tag level) cpu_to_be16
is not right any more.
Summary: avoid even calls to cpu_to_{b/l}eXX on a given piece of data.
The change has no effect on x86. Now sparc64 talks to x86.
Pinpointed-by: Jon Mason <jdmason@us.ibm.com>
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
diff -puN drivers/net/r8169.c~r8169-350 drivers/net/r8169.c
--- a/drivers/net/r8169.c~r8169-350 2005-02-05 21:04:12.000000000 +0100
+++ b/drivers/net/r8169.c 2005-02-12 00:25:12.992726954 +0100
@@ -698,7 +698,7 @@ static inline u32 rtl8169_tx_vlan_tag(st
struct sk_buff *skb)
{
return (tp->vlgrp && vlan_tx_tag_present(skb)) ?
- TxVlanTag | cpu_to_be16(vlan_tx_tag_get(skb)) : 0x00;
+ TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
}
static void rtl8169_vlan_rx_register(struct net_device *dev,
@@ -733,12 +733,12 @@ static void rtl8169_vlan_rx_kill_vid(str
static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
struct sk_buff *skb)
{
- u32 opts2 = desc->opts2;
+ u32 opts2 = le32_to_cpu(desc->opts2);
int ret;
if (tp->vlgrp && (opts2 & RxVlanTag)) {
rtl8169_rx_hwaccel_skb(skb, tp->vlgrp,
- be16_to_cpu(opts2 & 0xffff));
+ swab16(opts2 & 0xffff));
ret = 0;
} else
ret = -1;
@@ -2084,7 +2084,7 @@ rtl8169_tx_interrupt(struct net_device *
static inline void rtl8169_rx_csum(struct sk_buff *skb, struct RxDesc *desc)
{
- u32 opts1 = desc->opts1;
+ u32 opts1 = le32_to_cpu(desc->opts1);
u32 status = opts1 & RxProtoMask;
if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
_
^ permalink raw reply [flat|nested] 8+ messages in thread
* [patch 2.6.11-rc3 2/5] r8169: merge of Realtek's code
2005-02-11 23:39 [patch 2.6.11-rc3 1/5] r8169: endianness fixes Francois Romieu
@ 2005-02-11 23:41 ` Francois Romieu
2005-02-11 23:42 ` [patch 2.6.11-rc3 3/5] r8169: typo in debugging code Francois Romieu
2005-02-13 17:49 ` [patch 2.6.11-rc3 1/5] r8169: endianness fixes Jeff Garzik
1 sibling, 1 reply; 8+ messages in thread
From: Francois Romieu @ 2005-02-11 23:41 UTC (permalink / raw)
To: Jeff Garzik; +Cc: akpm, jdmason, rich, netdev
Merge of Realtek's code
- code dedicated to a new phy (spotted by Richard Dawe);
- C+ register fiddling seems required for both RTL_GIGA_MAC_VER_{D/E};
- apart from being reserved, register at address 0xe2 is named 'IntrMitigate';
- bump version number.
A bunch of people do not use the vanilla kernel module simply because
Realtek's driver has a higher revision number. This is not an issue per
se but their driver is buggy due to some partial merge of in-kernel code.
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
Signed-off-by: Richard Dawe <rich@phekda.gotadsl.co.uk>
diff -puN drivers/net/r8169.c~r8169-360 drivers/net/r8169.c
--- a/drivers/net/r8169.c~r8169-360 2005-02-05 21:04:17.000000000 +0100
+++ b/drivers/net/r8169.c 2005-02-12 00:25:10.895067209 +0100
@@ -41,6 +41,13 @@ VERSION 1.6LK <2004/04/14>
- Suspend/resume
- Endianness
- Misc Rx/Tx bugs
+
+VERSION 2.2LK <2005/01/25>
+
+ - RX csum, TX csum/SG, TSO
+ - VLAN
+ - baby (< 7200) Jumbo frames support
+ - Merge of Realtek's version 2.2 (new phy)
*/
#include <linux/module.h>
@@ -62,7 +69,7 @@ VERSION 1.6LK <2004/04/14>
#include <asm/io.h>
#include <asm/irq.h>
-#define RTL8169_VERSION "1.6LK"
+#define RTL8169_VERSION "2.2LK"
#define MODULENAME "r8169"
#define PFX MODULENAME ": "
@@ -149,6 +156,7 @@ enum phy_version {
RTL_GIGA_PHY_VER_E = 0x05, /* PHY Reg 0x03 bit0-3 == 0x0000 */
RTL_GIGA_PHY_VER_F = 0x06, /* PHY Reg 0x03 bit0-3 == 0x0001 */
RTL_GIGA_PHY_VER_G = 0x07, /* PHY Reg 0x03 bit0-3 == 0x0002 */
+ RTL_GIGA_PHY_VER_H = 0x08, /* PHY Reg 0x03 bit0-3 == 0x0003 */
};
@@ -162,7 +170,8 @@ const static struct {
} rtl_chip_info[] = {
_R("RTL8169", RTL_GIGA_MAC_VER_B, 0xff7e1880),
_R("RTL8169s/8110s", RTL_GIGA_MAC_VER_D, 0xff7e1880),
- _R("RTL8169s/8110s", RTL_GIGA_MAC_VER_E, 0xff7e1880)
+ _R("RTL8169s/8110s", RTL_GIGA_MAC_VER_E, 0xff7e1880),
+ _R("RTL8169s/8110s", RTL_GIGA_MAC_VER_X, 0xff7e1880),
};
#undef _R
@@ -208,6 +217,7 @@ enum RTL8169_registers {
PHYstatus = 0x6C,
RxMaxSize = 0xDA,
CPlusCmd = 0xE0,
+ IntrMitigate = 0xE2,
RxDescAddrLow = 0xE4,
RxDescAddrHigh = 0xE8,
EarlyTxThres = 0xEC,
@@ -407,7 +417,7 @@ struct rtl8169_private {
struct work_struct task;
};
-MODULE_AUTHOR("Realtek");
+MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@oss.sgi.com>");
MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
module_param_array(media, int, &num_media, 0);
module_param(rx_copybreak, int, 0);
@@ -1002,7 +1012,7 @@ static void rtl8169_hw_phy_config(struct
if (tp->mac_version <= RTL_GIGA_MAC_VER_B)
return;
- if (tp->phy_version >= RTL_GIGA_PHY_VER_F)
+ if (tp->phy_version >= RTL_GIGA_PHY_VER_H)
return;
dprintk("MAC version != 0 && PHY version == 0 or 1\n");
@@ -1010,6 +1020,18 @@ static void rtl8169_hw_phy_config(struct
/* Shazam ! */
+ if (tp->mac_version == RTL_GIGA_MAC_VER_X) {
+ mdio_write(ioaddr, 31, 0x0001);
+ mdio_write(ioaddr, 9, 0x273a);
+ mdio_write(ioaddr, 14, 0x7bfb);
+ mdio_write(ioaddr, 27, 0x841e);
+
+ mdio_write(ioaddr, 31, 0x0002);
+ mdio_write(ioaddr, 1, 0x90d0);
+ mdio_write(ioaddr, 31, 0x0000);
+ return;
+ }
+
// phy config for RTL8169s mac_version C chip
mdio_write(ioaddr, 31, 0x0001); //w 31 2 0 1
mdio_write(ioaddr, 21, 0x1000); //w 21 15 0 1000
@@ -1038,7 +1060,7 @@ static void rtl8169_phy_timer(unsigned l
unsigned long timeout = RTL8169_PHY_TIMEOUT;
assert(tp->mac_version > RTL_GIGA_MAC_VER_B);
- assert(tp->phy_version < RTL_GIGA_PHY_VER_G);
+ assert(tp->phy_version < RTL_GIGA_PHY_VER_H);
if (!(tp->phy_1000_ctrl_reg & PHY_Cap_1000_Full))
return;
@@ -1073,7 +1095,7 @@ static inline void rtl8169_delete_timer(
struct timer_list *timer = &tp->timer;
if ((tp->mac_version <= RTL_GIGA_MAC_VER_B) ||
- (tp->phy_version >= RTL_GIGA_PHY_VER_G))
+ (tp->phy_version >= RTL_GIGA_PHY_VER_H))
return;
del_timer_sync(timer);
@@ -1085,7 +1107,7 @@ static inline void rtl8169_request_timer
struct timer_list *timer = &tp->timer;
if ((tp->mac_version <= RTL_GIGA_MAC_VER_B) ||
- (tp->phy_version >= RTL_GIGA_PHY_VER_G))
+ (tp->phy_version >= RTL_GIGA_PHY_VER_H))
return;
init_timer(timer);
@@ -1563,13 +1585,20 @@ rtl8169_hw_start(struct net_device *dev)
tp->cp_cmd |= RTL_R16(CPlusCmd);
RTL_W16(CPlusCmd, tp->cp_cmd);
- if (tp->mac_version == RTL_GIGA_MAC_VER_D) {
+ if ((tp->mac_version == RTL_GIGA_MAC_VER_D) ||
+ (tp->mac_version == RTL_GIGA_MAC_VER_E)) {
dprintk(KERN_INFO PFX "Set MAC Reg C+CR Offset 0xE0. "
"Bit-3 and bit-14 MUST be 1\n");
tp->cp_cmd |= (1 << 14) | PCIMulRW;
RTL_W16(CPlusCmd, tp->cp_cmd);
}
+ /*
+ * Undocumented corner. Supposedly:
+ * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
+ */
+ RTL_W16(IntrMitigate, 0x0000);
+
RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr & DMA_32BIT_MASK));
RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr >> 32));
RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr & DMA_32BIT_MASK));
_
^ permalink raw reply [flat|nested] 8+ messages in thread
* [patch 2.6.11-rc3 3/5] r8169: typo in debugging code
2005-02-11 23:41 ` [patch 2.6.11-rc3 2/5] r8169: merge of Realtek's code Francois Romieu
@ 2005-02-11 23:42 ` Francois Romieu
2005-02-11 23:44 ` [patch 2.6.11-rc3 4/5] r8169: screaming irq when the device is closed Francois Romieu
0 siblings, 1 reply; 8+ messages in thread
From: Francois Romieu @ 2005-02-11 23:42 UTC (permalink / raw)
To: Jeff Garzik; +Cc: akpm, jdmason, netdev
Typo in debugging code.
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
diff -puN drivers/net/r8169.c~r8169-370 drivers/net/r8169.c
--- a/drivers/net/r8169.c~r8169-370 2005-02-05 21:04:22.000000000 +0100
+++ b/drivers/net/r8169.c 2005-02-12 00:25:04.364126556 +0100
@@ -79,7 +79,7 @@ VERSION 2.2LK <2005/01/25>
printk( "Assertion failed! %s,%s,%s,line=%d\n", \
#expr,__FILE__,__FUNCTION__,__LINE__); \
}
-#define dprintk(fmt, args...) do { printk(PFX fmt, ## args) } while (0)
+#define dprintk(fmt, args...) do { printk(PFX fmt, ## args); } while (0)
#else
#define assert(expr) do {} while (0)
#define dprintk(fmt, args...) do {} while (0)
_
^ permalink raw reply [flat|nested] 8+ messages in thread
* [patch 2.6.11-rc3 4/5] r8169: screaming irq when the device is closed
2005-02-11 23:42 ` [patch 2.6.11-rc3 3/5] r8169: typo in debugging code Francois Romieu
@ 2005-02-11 23:44 ` Francois Romieu
2005-02-11 23:45 ` [patch 2.6.11-rc3 5/5] r8169: synchronization and balancing " Francois Romieu
0 siblings, 1 reply; 8+ messages in thread
From: Francois Romieu @ 2005-02-11 23:44 UTC (permalink / raw)
To: Jeff Garzik; +Cc: akpm, jdmason, netdev
Close the race for a screaming irq when the device is closed.
- rtl8169_interrupt() try to properly IRQ_HANDLE an interrupt even when
the network device is going down. As a benefit, rtl8169_poll() does not
need to care about the close race any more;
- factor code with rtl8169_irq_mask_and_ack();
- rtl8169_init_board(): mitigate some really unexpected events.
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
diff -puN drivers/net/r8169.c~r8169-380 drivers/net/r8169.c
--- a/drivers/net/r8169.c~r8169-380 2005-02-05 21:04:32.000000000 +0100
+++ b/drivers/net/r8169.c 2005-02-12 00:25:00.002833963 +0100
@@ -490,6 +490,13 @@ static int mdio_read(void __iomem *ioadd
return value;
}
+static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
+{
+ RTL_W16(IntrMask, 0x0000);
+
+ RTL_W16(IntrStatus, 0xffff);
+}
+
static unsigned int rtl8169_tbi_reset_pending(void __iomem *ioaddr)
{
return RTL_R32(TBICSR) & TBIReset;
@@ -1234,6 +1241,9 @@ rtl8169_init_board(struct pci_dev *pdev,
goto err_out_free_res;
}
+ // Unneeded ? Don't mess with Mrs. Murphy.
+ rtl8169_irq_mask_and_ack(ioaddr);
+
// Soft reset the chip.
RTL_W8(ChipCmd, CmdReset);
@@ -1540,7 +1550,7 @@ err_free_irq:
static void rtl8169_hw_reset(void __iomem *ioaddr)
{
/* Disable interrupts */
- RTL_W16(IntrMask, 0x0000);
+ rtl8169_irq_mask_and_ack(ioaddr);
/* Reset the chipset */
RTL_W8(ChipCmd, CmdReset);
@@ -1824,9 +1834,7 @@ static void rtl8169_wait_for_quiescence(
/* Wait for any pending NAPI task to complete */
netif_poll_disable(dev);
- RTL_W16(IntrMask, 0x0000);
-
- RTL_W16(IntrStatus, 0xffff);
+ rtl8169_irq_mask_and_ack(ioaddr);
netif_poll_enable(dev);
}
@@ -2244,12 +2252,9 @@ rtl8169_interrupt(int irq, void *dev_ins
struct rtl8169_private *tp = netdev_priv(dev);
int boguscnt = max_interrupt_work;
void __iomem *ioaddr = tp->mmio_addr;
- int status = 0;
+ int status;
int handled = 0;
- if (unlikely(!netif_running(dev)))
- goto out;
-
do {
status = RTL_R16(IntrStatus);
@@ -2259,6 +2264,9 @@ rtl8169_interrupt(int irq, void *dev_ins
handled = 1;
+ if (unlikely(!netif_running(dev)))
+ goto out_asic_stop;
+
status &= tp->intr_mask;
RTL_W16(IntrStatus,
(status & RxFIFOOver) ? (status | RxOverflow) : status);
@@ -2306,6 +2314,12 @@ rtl8169_interrupt(int irq, void *dev_ins
}
out:
return IRQ_RETVAL(handled);
+
+out_asic_stop:
+ RTL_W8(ChipCmd, 0x00);
+ rtl8169_irq_mask_and_ack(ioaddr);
+ RTL_R16(CPlusCmd);
+ goto out;
}
#ifdef CONFIG_R8169_NAPI
@@ -2321,7 +2335,7 @@ static int rtl8169_poll(struct net_devic
*budget -= work_done;
dev->quota -= work_done;
- if ((work_done < work_to_do) || !netif_running(dev)) {
+ if (work_done < work_to_do) {
netif_rx_complete(dev);
tp->intr_mask = 0xffff;
/*
_
^ permalink raw reply [flat|nested] 8+ messages in thread
* [patch 2.6.11-rc3 5/5] r8169: synchronization and balancing when the device is closed
2005-02-11 23:44 ` [patch 2.6.11-rc3 4/5] r8169: screaming irq when the device is closed Francois Romieu
@ 2005-02-11 23:45 ` Francois Romieu
2005-02-14 17:16 ` Jon Mason
0 siblings, 1 reply; 8+ messages in thread
From: Francois Romieu @ 2005-02-11 23:45 UTC (permalink / raw)
To: Jeff Garzik; +Cc: akpm, jdmason, netdev
rtl8169_close synchronization and balancing
- use synchronize_kernel() to sync with the xmit thread (kindly suggested
by davem);
- balance the netif_poll_disable issued in rtl8169_down.
Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
diff -puN drivers/net/r8169.c~r8169-390 drivers/net/r8169.c
--- a/drivers/net/r8169.c~r8169-390 2005-02-12 00:06:40.381648524 +0100
+++ b/drivers/net/r8169.c 2005-02-12 00:06:48.015420988 +0100
@@ -2382,8 +2382,7 @@ static void rtl8169_down(struct net_devi
netif_poll_disable(dev);
/* Give a racing hard_start_xmit a few cycles to complete. */
- set_current_state(TASK_UNINTERRUPTIBLE);
- schedule_timeout(1);
+ synchronize_kernel();
rtl8169_tx_clear(tp);
@@ -2399,6 +2398,8 @@ static int rtl8169_close(struct net_devi
free_irq(dev->irq, dev);
+ netif_poll_enable(dev);
+
pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
tp->RxPhyAddr);
pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
_
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [patch 2.6.11-rc3 1/5] r8169: endianness fixes
2005-02-11 23:39 [patch 2.6.11-rc3 1/5] r8169: endianness fixes Francois Romieu
2005-02-11 23:41 ` [patch 2.6.11-rc3 2/5] r8169: merge of Realtek's code Francois Romieu
@ 2005-02-13 17:49 ` Jeff Garzik
1 sibling, 0 replies; 8+ messages in thread
From: Jeff Garzik @ 2005-02-13 17:49 UTC (permalink / raw)
To: Francois Romieu; +Cc: akpm, jdmason, netdev
applied 1-5
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [patch 2.6.11-rc3 5/5] r8169: synchronization and balancing when the device is closed
2005-02-11 23:45 ` [patch 2.6.11-rc3 5/5] r8169: synchronization and balancing " Francois Romieu
@ 2005-02-14 17:16 ` Jon Mason
2005-02-14 19:31 ` Francois Romieu
0 siblings, 1 reply; 8+ messages in thread
From: Jon Mason @ 2005-02-14 17:16 UTC (permalink / raw)
To: Francois Romieu; +Cc: Jeff Garzik, akpm, netdev
[...]
> @@ -2399,6 +2398,8 @@ static int rtl8169_close(struct net_devi
>
> free_irq(dev->irq, dev);
>
> + netif_poll_enable(dev);
> +
> pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
> tp->RxPhyAddr);
> pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
>
> _
Dumb question....Why is this needed? dev_close has already checked for the
bit before it calls the rtl8169_close routine (and it was already ripped out
by netif_poll_disable in rtl8169_down).
--
Jon Mason
jdmason@us.ibm.com
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [patch 2.6.11-rc3 5/5] r8169: synchronization and balancing when the device is closed
2005-02-14 17:16 ` Jon Mason
@ 2005-02-14 19:31 ` Francois Romieu
0 siblings, 0 replies; 8+ messages in thread
From: Francois Romieu @ 2005-02-14 19:31 UTC (permalink / raw)
To: Jon Mason; +Cc: Jeff Garzik, akpm, netdev
Jon Mason <jdmason@us.ibm.com> :
> [...]
> > @@ -2399,6 +2398,8 @@ static int rtl8169_close(struct net_devi
> >
> > free_irq(dev->irq, dev);
> >
> > + netif_poll_enable(dev);
> > +
> > pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
> > tp->RxPhyAddr);
> > pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
> >
> > _
>
> Dumb question....Why is this needed? dev_close has already checked for the
dev_open() after dev_close(): netif_rx_schedule_prep() always fails in
rtl8169_interrupt() and the device can not be scheduled for poll. Sucky.
So, if someone wants to push it before 2.6.11 goes out...
--
Ueimor
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2005-02-14 19:31 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-02-11 23:39 [patch 2.6.11-rc3 1/5] r8169: endianness fixes Francois Romieu
2005-02-11 23:41 ` [patch 2.6.11-rc3 2/5] r8169: merge of Realtek's code Francois Romieu
2005-02-11 23:42 ` [patch 2.6.11-rc3 3/5] r8169: typo in debugging code Francois Romieu
2005-02-11 23:44 ` [patch 2.6.11-rc3 4/5] r8169: screaming irq when the device is closed Francois Romieu
2005-02-11 23:45 ` [patch 2.6.11-rc3 5/5] r8169: synchronization and balancing " Francois Romieu
2005-02-14 17:16 ` Jon Mason
2005-02-14 19:31 ` Francois Romieu
2005-02-13 17:49 ` [patch 2.6.11-rc3 1/5] r8169: endianness fixes Jeff Garzik
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).