* [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 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
* 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
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 an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.