* Re: [PATCH 06/10] net: remove NETIF_F_ALL_TX_OFFLOADS
From: Michał Mirosław @ 2011-07-14 21:54 UTC (permalink / raw)
To: David Miller; +Cc: netdev, fubar, andy, kaber
In-Reply-To: <20110714.144314.1353889855984029341.davem@davemloft.net>
On Thu, Jul 14, 2011 at 02:43:14PM -0700, David Miller wrote:
> From: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> Date: Thu, 14 Jul 2011 02:10:29 +0200 (CEST)
>
> > There is no software fallback implemented for SCTP or FCoE checksumming,
> > and so it should not be passed on by software devices like bridge or bonding.
> >
> > For VLAN devices, this is different. First, the driver for underlying device
> > should be prepared to get offloaded packets even when the feature is disabled
> > (especially if it advertises it in vlan_features). Second, devices under
> > VLANs do not get replaced without tearing down the VLAN first.
> >
> > This fixes a mess I accidentally introduced while converting bonding to
> > ndo_fix_features.
> >
> > NETIF_F_SOFT_FEATURES are removed from BOND_VLAN_FEATURES because they
> > are unused as of commit 712ae51afd.
> >
> > Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
>
> This is not the answer.
>
> We have to implement software fallbacks for the checksum offloads.
>
> That is easier than having this ever growing set of exceptions for
> feature bit propagation, which at best will end up being a steaming
> pile of unmaintainable poo.
I agree about the fallbacks, but this patch is about fixing a regression
that's going to hit 3.0. Now all bonding devices always advertise e.g.
SCTP_CSUM. Sorry if I was unclear about this.
Best Regards,
Michał Mirosław
^ permalink raw reply
* Re: [PATCH 06/10] net: remove NETIF_F_ALL_TX_OFFLOADS
From: David Miller @ 2011-07-14 21:58 UTC (permalink / raw)
To: mirq-linux; +Cc: netdev, fubar, andy, kaber
In-Reply-To: <20110714215401.GA17618@rere.qmqm.pl>
From: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Date: Thu, 14 Jul 2011 23:54:01 +0200
> I agree about the fallbacks, but this patch is about fixing a regression
> that's going to hit 3.0. Now all bonding devices always advertise e.g.
> SCTP_CSUM. Sorry if I was unclear about this.
Why are you mixing cleanups and bug fixes?
^ permalink raw reply
* Re: [Bugme-new] [Bug 39372] New: Problems with HFSC Scheduler
From: Andrew Morton @ 2011-07-14 22:14 UTC (permalink / raw)
To: netdev; +Cc: bugme-daemon, Jamal Hadi Salim, lucas.bocchi, Patrick McHardy
In-Reply-To: <bug-39372-10286@https.bugzilla.kernel.org/>
(switched to email. Please respond via emailed reply-to-all, not via the
bugzilla web interface).
On Thu, 14 Jul 2011 13:07:59 GMT
bugzilla-daemon@bugzilla.kernel.org wrote:
> https://bugzilla.kernel.org/show_bug.cgi?id=39372
>
> Summary: Problems with HFSC Scheduler
> Product: Networking
> Version: 2.5
> Kernel Version: 2.6.39.3
> Platform: All
> OS/Version: Linux
> Tree: Mainline
> Status: NEW
> Severity: normal
> Priority: P1
> Component: Other
> AssignedTo: acme@ghostprotocols.net
> ReportedBy: lucas.bocchi@gmail.com
> Regression: No
>
>
> We have a problem with HFSC scheduler. When use it with my configuration, in
> aleatory times the kernel hang and the network device with attached scheduler
> hangs and kernel stops to work for a long time.
>
> Above I'll attach the files with the scheduler used by me
>
> Additional Information
>
> Linux optimus 2.6.39.3 #1 SMP Wed Jul 13 09:40:20 BRT 2011 x86_64 GNU/Linux
>
> Gnu C 4.6.1
> Gnu make 3.81
> binutils 2.21.52.20110606
> util-linux 2.17.2
> mount support
> module-init-tools 3.16
> e2fsprogs 1.42-WIP
> xfsprogs 3.1.5
> PPP 2.4.5
> Linux C Library 2.13
> Dynamic linker (ldd) 2.13
> Procps 3.2.8
> Net-tools 1.60
> Console-tools 0.2.3
> Sh-utils 8.5
> Modules Loaded cls_u32 sch_sfq sch_hfsc sch_prio pppoe pppox nf_nat_sip
> nf_conntrack_sip nf_nat_ftp nf_conntrack_ftp xt_owner ipt_LOG xt_recent
> xt_hashlimit xt_TCPMSS xt_tcpmss xt_mark xt_connmark xt_state ipt_MASQUERADE
> ipt_REDIRECT ipt_REJECT xt_tcpudp iptable_mangle iptable_nat nf_nat
> nf_conntrack_ipv4 nf_conntrack nf_defrag_ipv4 iptable_filter ip_tables x_tables
> tun fuse nfsd nfs lockd fscache auth_rpcgss nfs_acl sunrpc sit tunnel4
> ppp_generic slhc ext4 jbd2 crc16 sbs sbshc it87 hwmon_vid coretemp loop
> kvm_intel kvm snd_hda_codec_via snd_hda_intel snd_hda_codec snd_hwdep snd_pcm
> snd_timer snd soundcore snd_page_alloc psmouse serio_raw parport_pc parport
> processor pcspkr evdev asus_atk0110 rng_core button thermal_sys ext3 jbd
> mbcache btrfs zlib_deflate crc32c libcrc32c usbhid hid ide_gd_mod sd_mod
> crc_t10dif ata_generic pata_acpi uhci_hcd ata_piix libata scsi_mod floppy
> ehci_hcd ide_pci_generic r8169 8139too 8139cp mii piix ide_core usbcore
>
It's a warning storm, not really an oops:
Jul 13 18:00:22 optimus kernel: [28933.952120] ------------[ cut here ]------------
Jul 13 18:00:22 optimus kernel: [28933.952171] WARNING: at net/sched/sch_hfsc.c:1427 hfsc_dequeue+0x12c/0x275 [sch_hfsc]()
Jul 13 18:00:22 optimus kernel: [28933.952234] Hardware name: System Product Name
Jul 13 18:00:22 optimus kernel: [28933.952265] Modules linked in: cls_u32 sch_sfq sch_hfsc sch_prio xfs nf_nat_sip nf_conntrack_sip nf_nat_ftp nf_conntrack_ftp xt_owner ipt_LOG xt_recent xt_hashlimit xt_TCPMSS xt_tcpmss xt_mark xt_connmark xt_state ipt_MASQUERADE ipt_REDIRECT ipt_REJECT xt_tcpudp iptable_mangle tun iptable_filter iptable_nat nf_nat nf_conntrack_ipv4 nf_conntrack nf_defrag_ipv4 ip_tables x_tables pppoe pppox fuse nfsd nfs lockd fscache auth_rpcgss nfs_acl sunrpc sit tunnel4 ppp_generic slhc ext4 jbd2 crc16 sbs sbshc it87 hwmon_vid coretemp loop kvm_intel kvm snd_hda_codec_via snd_hda_intel snd_hda_codec snd_hwdep snd_pcm snd_timer snd asus_atk0110 soundcore evdev snd_page_alloc rng_core processor parport_pc parport thermal_sys button pcspkr psmouse serio_raw ext3 jbd mbcach
e btrfs zlib_deflate crc32c libcrc32c sd_mod ide_gd_mod crc_t10dif ata_generic pata_acpi ata_piix libata scsi_mod piix floppy uhci_hcd ide_pci_generic ehci_hcd 8139too 8139cp ide_core r8169!
mii usbcore [last unloaded: scsi_wait_
Jul 13 18:00:22 optimus kernel: scan]
Jul 13 18:00:22 optimus kernel: [28933.952811] Pid: 0, comm: swapper Tainted: G W 2.6.39.3 #1
Jul 13 18:00:22 optimus kernel: [28933.952843] Call Trace:
Jul 13 18:00:22 optimus kernel: [28933.952866] <IRQ> [<ffffffff81031aae>] ? warn_slowpath_common+0x78/0x8c
Jul 13 18:00:22 optimus kernel: [28933.952906] [<ffffffffa00fb9ec>] ? hfsc_dequeue+0x12c/0x275 [sch_hfsc]
Jul 13 18:00:22 optimus kernel: [28933.952940] [<ffffffffa000704d>] ? prio_dequeue+0x1c/0x6e [sch_prio]
Jul 13 18:00:22 optimus kernel: [28933.952977] [<ffffffffa0112920>] ? rtl8139_start_xmit+0x6a/0xf7 [8139too]
Jul 13 18:00:22 optimus kernel: [28933.953012] [<ffffffff8123408e>] ? __qdisc_run+0x8e/0x115
Jul 13 18:00:22 optimus kernel: [28933.953044] [<ffffffff8121ae48>] ? net_tx_action+0xef/0x124
Jul 13 18:00:22 optimus kernel: [28933.953075] [<ffffffff81036bbb>] ? __do_softirq+0xc7/0x192
Jul 13 18:00:22 optimus kernel: [28933.953105] [<ffffffff812d5fdc>] ? call_softirq+0x1c/0x26
Jul 13 18:00:22 optimus kernel: [28933.953105] [<ffffffff810037ba>] ? do_softirq+0x3c/0x7a
Jul 13 18:00:22 optimus kernel: [28933.953105] [<ffffffff81036e4c>] ? irq_exit+0x4a/0x94
Jul 13 18:00:22 optimus kernel: [28933.953105] [<ffffffff810156fb>] ? smp_apic_timer_interrupt+0x75/0x82
Jul 13 18:00:22 optimus kernel: [28933.953105] [<ffffffff812d578e>] ? apic_timer_interrupt+0xe/0x20
Jul 13 18:00:22 optimus kernel: [28933.953105] [<ffffffff812d5793>] ? apic_timer_interrupt+0x13/0x20
Jul 13 18:00:22 optimus kernel: [28933.953105] <EOI> [<ffffffff81007be7>] ? mwait_idle+0x8b/0xb7
Jul 13 18:00:22 optimus kernel: [28933.953105] [<ffffffff81007bda>] ? mwait_idle+0x7e/0xb7
Jul 13 18:00:22 optimus kernel: [28933.953105] [<ffffffff810011e2>] ? cpu_idle+0x9d/0xd7
Jul 13 18:00:22 optimus kernel: [28933.953105] [<ffffffff81b91b16>] ? start_kernel+0x3b4/0x3bf
Jul 13 18:00:22 optimus kernel: [28933.953105] [<ffffffff81b91140>] ? early_idt_handlers+0x140/0x140
Jul 13 18:00:22 optimus kernel: [28933.953105] [<ffffffff81b913a8>] ? x86_64_start_kernel+0x104/0x111
Jul 13 18:00:22 optimus kernel: [28933.953105] ---[ end trace 05058983c1ade13b ]---
Jul 13 18:00:22 optimus kernel: [28933.953105] ------------[ cut here ]------------
Here:
WARN_ON(next_time == 0);
There's some more info in the bugzilla report.
^ permalink raw reply
* [PATCH 1/1 net] net: fix bonding advertising offloads it can't support
From: Michał Mirosław @ 2011-07-14 22:34 UTC (permalink / raw)
To: netdev; +Cc: Jay Vosburgh, Andy Gospodarek, Patrick McHardy, David Miller
In-Reply-To: <20110714.145857.1611970250010658023.davem@davemloft.net>
There is no software fallback implemented for SCTP or FCoE checksumming,
and so it should not be passed on by software devices like bridge or
bonding.
For VLAN devices, this is different. First, the driver for underlying
device should be prepared to get offloaded packets even when the feature
is disabled (especially if it advertises it in vlan_features). Second,
devices under VLANs do not get replaced without tearing down the VLAN
first.
This fixes a mess I accidentally introduced while converting bonding to
ndo_fix_features in b2a103e6d0.
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
drivers/net/bonding/bond_main.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index eafe44a..63c22b0 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -1428,9 +1428,9 @@ out:
return features;
}
-#define BOND_VLAN_FEATURES (NETIF_F_ALL_TX_OFFLOADS | \
- NETIF_F_SOFT_FEATURES | \
- NETIF_F_LRO)
+#define BOND_VLAN_FEATURES (NETIF_F_ALL_CSUM | NETIF_F_SG | \
+ NETIF_F_FRAGLIST | NETIF_F_ALL_TSO | \
+ NETIF_F_HIGHDMA | NETIF_F_LRO)
static void bond_compute_features(struct bonding *bond)
{
--
1.7.5.4
^ permalink raw reply related
* Re: [PATCH 1/1 net] net: fix bonding advertising offloads it can't support
From: David Miller @ 2011-07-14 22:37 UTC (permalink / raw)
To: mirq-linux; +Cc: netdev, fubar, andy, kaber
In-Reply-To: <45ec1e78b1bf8934a84e68968a0bb8b747eec6bf.1310682766.git.mirq-linux@rere.qmqm.pl>
From: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Date: Fri, 15 Jul 2011 00:34:50 +0200 (CEST)
> There is no software fallback implemented for SCTP or FCoE checksumming,
> and so it should not be passed on by software devices like bridge or
> bonding.
>
> For VLAN devices, this is different. First, the driver for underlying
> device should be prepared to get offloaded packets even when the feature
> is disabled (especially if it advertises it in vlan_features). Second,
> devices under VLANs do not get replaced without tearing down the VLAN
> first.
>
> This fixes a mess I accidentally introduced while converting bonding to
> ndo_fix_features in b2a103e6d0.
>
> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
I already applied this, and the SCTP patch, to net-2.6
^ permalink raw reply
* Re: [PATCH 07/10] net: remove NETIF_F_NO_CSUM feature
From: Michał Mirosław @ 2011-07-14 22:44 UTC (permalink / raw)
To: David Miller; +Cc: therbert, bhutchings, netdev
In-Reply-To: <20110714.143121.1603730405553208694.davem@davemloft.net>
On Thu, Jul 14, 2011 at 02:31:21PM -0700, David Miller wrote:
> From: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> Date: Thu, 14 Jul 2011 22:56:23 +0200
> > That's why its turned off by default and should be enabled only when user
> > knows he will win some pps with it.
> More people are going to lose than win by your change.
>
> The nocopy feature helps more real situations than it hurts, the
> existing default is the best.
I see. I still want to remove NO_CSUM (as I explained in other mail),
so would you accept replacing it with something more specific to
nocache-copy feature? READS_DATA maybe? That could be later added to
sk_route_caps whenever it's known for a route there will be need to
read packets' data.
Best Regards,
Michał Mirosław
^ permalink raw reply
* Pull request for 'davem-next.r8169' branch
From: Francois Romieu @ 2011-07-14 22:44 UTC (permalink / raw)
To: davem; +Cc: netdev, Realtek linux nic maintainers, Hayes Wang
Please pull from branch 'davem-next.r8169' in repository
git://git.kernel.org/pub/scm/linux/kernel/git/romieu/netdev-2.6.git davem-next.r8169
to get the changes below.
Patches have been tested with :
- RTL8102e XID 04a00000 (RTL8102E-VB-GR)
- RTL8102e XID 14c00000 (RTL8103E-GR)
- RTL8110s XID 04000000
- RTL8169sb/8110sb XID 10000000
- RTL8169sc/8110sc XID 98000000 (RTL8110SC)
- RTL8168evl/8111evl XID 0c900880
- RTL8168b/8111b XID 18000000
- RTL8168d/8111d XID 083000c0 (RTL8111D-VB-GR)
- RTL8168d/8111d XID 081000c0 (RTL8168D-GR)
The series include Hayes's fix for the missed RxConfig register writes
(included in e542a2269f232d61270ceddd42b73a4348dee2bb to avoid a
regression).
The 8110SC is not rock-solid and chipsets (XID 18000000, 083000c0 and
98000000) are sometimes unable to resume from sleep when sent a magic
packet : it seems to happen when the devices do not perform a link
down / up cycle fast enough when suspending. It is not a regression
though.
RTL8168evl has been tested without firmware and with both old and
new format firmwares.
Distance from 'davem-next' (d84e0bd7971eb8357c700151ee4e8e4101ee65fa)
---------------------------------------------------------------------
e542a2269f232d61270ceddd42b73a4348dee2bb
aaa89c08d9ffa3739c93d65d98b73ec2aa2e93a5
d4ed95d796e5126bba51466dc07e287cebc8bd19
70090424e59652c4b2e777b533cc23134b176b83
133ac40ac26a6cba957ad5765892f0531ba6ccee
92fc43b4159b518f5baae57301f26d770b0834c9
4f6b00e5f139d7be3ca8371b769778f94fa549dd
Diffstat
--------
drivers/net/r8169.c | 392 ++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 329 insertions(+), 63 deletions(-)
Shortlog
--------
Hayes Wang (7):
r8169: adjust some registers.
r8169: modify the flow of the hw reset.
r8169: add ERI functions.
r8169: support RTL8111E-VL.
r8169: fix wake on lan setting for non-8111E.
r8169: don't enable rx when shutdown.
r8169: adjust the RxConfig settings.
Patch
-----
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index ef1a43d..3ddd339 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -41,6 +41,7 @@
#define FIRMWARE_8168D_2 "rtl_nic/rtl8168d-2.fw"
#define FIRMWARE_8168E_1 "rtl_nic/rtl8168e-1.fw"
#define FIRMWARE_8168E_2 "rtl_nic/rtl8168e-2.fw"
+#define FIRMWARE_8168E_3 "rtl_nic/rtl8168e-3.fw"
#define FIRMWARE_8105E_1 "rtl_nic/rtl8105e-1.fw"
#ifdef RTL8169_DEBUG
@@ -70,8 +71,6 @@ static const int multicast_filter_limit = 32;
#define MAC_ADDR_LEN 6
#define MAX_READ_REQUEST_SHIFT 12
-#define RX_FIFO_THRESH 7 /* 7 means NO threshold, Rx buffer level before first PCI xfer. */
-#define RX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */
#define TX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */
#define SafeMtu 0x1c20 /* ... actually life sucks beyond ~7k */
#define InterFrameGap 0x03 /* 3 means InterFrameGap = the shortest one */
@@ -133,6 +132,7 @@ enum mac_version {
RTL_GIGA_MAC_VER_31,
RTL_GIGA_MAC_VER_32,
RTL_GIGA_MAC_VER_33,
+ RTL_GIGA_MAC_VER_34,
RTL_GIGA_MAC_NONE = 0xff,
};
@@ -216,7 +216,9 @@ static const struct {
[RTL_GIGA_MAC_VER_32] =
_R("RTL8168e/8111e", RTL_TD_1, FIRMWARE_8168E_1),
[RTL_GIGA_MAC_VER_33] =
- _R("RTL8168e/8111e", RTL_TD_1, FIRMWARE_8168E_2)
+ _R("RTL8168e/8111e", RTL_TD_1, FIRMWARE_8168E_2),
+ [RTL_GIGA_MAC_VER_34] =
+ _R("RTL8168evl/8111evl",RTL_TD_1, FIRMWARE_8168E_3)
};
#undef _R
@@ -270,10 +272,20 @@ enum rtl_registers {
TxPoll = 0x38,
IntrMask = 0x3c,
IntrStatus = 0x3e,
+
TxConfig = 0x40,
- RxConfig = 0x44,
+#define TXCFG_AUTO_FIFO (1 << 7) /* 8111e-vl */
+#define TXCFG_EMPTY (1 << 11) /* 8111e-vl */
-#define RTL_RX_CONFIG_MASK 0xff7e1880u
+ RxConfig = 0x44,
+#define RX128_INT_EN (1 << 15) /* 8111c and later */
+#define RX_MULTI_EN (1 << 14) /* 8111c only */
+#define RXCFG_FIFO_SHIFT 13
+ /* No threshold before first PCI xfer */
+#define RX_FIFO_THRESH (7 << RXCFG_FIFO_SHIFT)
+#define RXCFG_DMA_SHIFT 8
+ /* Unlimited maximum PCI burst. */
+#define RX_DMA_BURST (7 << RXCFG_DMA_SHIFT)
RxMissed = 0x4c,
Cfg9346 = 0x50,
@@ -327,12 +339,13 @@ enum rtl8168_8101_registers {
#define EPHYAR_REG_SHIFT 16
#define EPHYAR_DATA_MASK 0xffff
DLLPR = 0xd0,
-#define PM_SWITCH (1 << 6)
+#define PFM_EN (1 << 6)
DBG_REG = 0xd1,
#define FIX_NAK_1 (1 << 4)
#define FIX_NAK_2 (1 << 3)
TWSI = 0xd2,
MCU = 0xd3,
+#define NOW_IS_OOB (1 << 7)
#define EN_NDP (1 << 3)
#define EN_OOB_RESET (1 << 2)
EFUSEAR = 0xdc,
@@ -345,18 +358,22 @@ enum rtl8168_8101_registers {
};
enum rtl8168_registers {
+ LED_FREQ = 0x1a,
+ EEE_LED = 0x1b,
ERIDR = 0x70,
ERIAR = 0x74,
#define ERIAR_FLAG 0x80000000
#define ERIAR_WRITE_CMD 0x80000000
#define ERIAR_READ_CMD 0x00000000
#define ERIAR_ADDR_BYTE_ALIGN 4
-#define ERIAR_EXGMAC 0
-#define ERIAR_MSIX 1
-#define ERIAR_ASF 2
#define ERIAR_TYPE_SHIFT 16
-#define ERIAR_BYTEEN 0x0f
-#define ERIAR_BYTEEN_SHIFT 12
+#define ERIAR_EXGMAC (0x00 << ERIAR_TYPE_SHIFT)
+#define ERIAR_MSIX (0x01 << ERIAR_TYPE_SHIFT)
+#define ERIAR_ASF (0x02 << ERIAR_TYPE_SHIFT)
+#define ERIAR_MASK_SHIFT 12
+#define ERIAR_MASK_0001 (0x1 << ERIAR_MASK_SHIFT)
+#define ERIAR_MASK_0011 (0x3 << ERIAR_MASK_SHIFT)
+#define ERIAR_MASK_1111 (0xf << ERIAR_MASK_SHIFT)
EPHY_RXER_NUM = 0x7c,
OCPDR = 0xb0, /* OCP GPHY access */
#define OCPDR_WRITE_CMD 0x80000000
@@ -371,6 +388,7 @@ enum rtl8168_registers {
RDSAR1 = 0xd0, /* 8168c only. Undocumented on 8168dp */
MISC = 0xf0, /* 8168e only. */
#define TXPLA_RST (1 << 29)
+#define PWM_EN (1 << 22)
};
enum rtl_register_content {
@@ -395,6 +413,7 @@ enum rtl_register_content {
RxCRC = (1 << 19),
/* ChipCmdBits */
+ StopReq = 0x80,
CmdReset = 0x10,
CmdRxEnb = 0x08,
CmdTxEnb = 0x04,
@@ -417,10 +436,6 @@ enum rtl_register_content {
AcceptMyPhys = 0x02,
AcceptAllPhys = 0x01,
- /* RxConfigBits */
- RxCfgFIFOShift = 13,
- RxCfgDMAShift = 8,
-
/* TxConfigBits */
TxInterFrameGapShift = 24,
TxDMAShift = 8, /* DMA burst value (0-7) is shift this many bits */
@@ -712,9 +727,6 @@ static void rtl8169_down(struct net_device *dev);
static void rtl8169_rx_clear(struct rtl8169_private *tp);
static int rtl8169_poll(struct napi_struct *napi, int budget);
-static const unsigned int rtl8169_rx_config =
- (RX_FIFO_THRESH << RxCfgFIFOShift) | (RX_DMA_BURST << RxCfgDMAShift);
-
static u32 ocp_read(struct rtl8169_private *tp, u8 mask, u16 reg)
{
void __iomem *ioaddr = tp->mmio_addr;
@@ -1035,6 +1047,49 @@ static u32 rtl_csi_read(void __iomem *ioaddr, int addr)
return value;
}
+static
+void rtl_eri_write(void __iomem *ioaddr, int addr, u32 mask, u32 val, int type)
+{
+ unsigned int i;
+
+ BUG_ON((addr & 3) || (mask == 0));
+ RTL_W32(ERIDR, val);
+ RTL_W32(ERIAR, ERIAR_WRITE_CMD | type | mask | addr);
+
+ for (i = 0; i < 100; i++) {
+ if (!(RTL_R32(ERIAR) & ERIAR_FLAG))
+ break;
+ udelay(100);
+ }
+}
+
+static u32 rtl_eri_read(void __iomem *ioaddr, int addr, int type)
+{
+ u32 value = ~0x00;
+ unsigned int i;
+
+ RTL_W32(ERIAR, ERIAR_READ_CMD | type | ERIAR_MASK_1111 | addr);
+
+ for (i = 0; i < 100; i++) {
+ if (RTL_R32(ERIAR) & ERIAR_FLAG) {
+ value = RTL_R32(ERIDR);
+ break;
+ }
+ udelay(100);
+ }
+
+ return value;
+}
+
+static void
+rtl_w1w0_eri(void __iomem *ioaddr, int addr, u32 mask, u32 p, u32 m, int type)
+{
+ u32 val;
+
+ val = rtl_eri_read(ioaddr, addr, type);
+ rtl_eri_write(ioaddr, addr, mask, (val & ~m) | p, type);
+}
+
static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr)
{
u8 value = 0xff;
@@ -1060,13 +1115,6 @@ static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
RTL_W16(IntrStatus, 0xffff);
}
-static void rtl8169_asic_down(void __iomem *ioaddr)
-{
- RTL_W8(ChipCmd, 0x00);
- rtl8169_irq_mask_and_ack(ioaddr);
- RTL_R16(CPlusCmd);
-}
-
static unsigned int rtl8169_tbi_reset_pending(struct rtl8169_private *tp)
{
void __iomem *ioaddr = tp->mmio_addr;
@@ -1104,6 +1152,39 @@ static void rtl8169_xmii_reset_enable(struct rtl8169_private *tp)
rtl_writephy(tp, MII_BMCR, val & 0xffff);
}
+static void rtl_link_chg_patch(struct rtl8169_private *tp)
+{
+ void __iomem *ioaddr = tp->mmio_addr;
+ struct net_device *dev = tp->dev;
+
+ if (!netif_running(dev))
+ return;
+
+ if (tp->mac_version == RTL_GIGA_MAC_VER_34) {
+ if (RTL_R8(PHYstatus) & _1000bpsF) {
+ rtl_eri_write(ioaddr, 0x1bc, ERIAR_MASK_1111,
+ 0x00000011, ERIAR_EXGMAC);
+ rtl_eri_write(ioaddr, 0x1dc, ERIAR_MASK_1111,
+ 0x00000005, ERIAR_EXGMAC);
+ } else if (RTL_R8(PHYstatus) & _100bps) {
+ rtl_eri_write(ioaddr, 0x1bc, ERIAR_MASK_1111,
+ 0x0000001f, ERIAR_EXGMAC);
+ rtl_eri_write(ioaddr, 0x1dc, ERIAR_MASK_1111,
+ 0x00000005, ERIAR_EXGMAC);
+ } else {
+ rtl_eri_write(ioaddr, 0x1bc, ERIAR_MASK_1111,
+ 0x0000001f, ERIAR_EXGMAC);
+ rtl_eri_write(ioaddr, 0x1dc, ERIAR_MASK_1111,
+ 0x0000003f, ERIAR_EXGMAC);
+ }
+ /* Reset packet filter */
+ rtl_w1w0_eri(ioaddr, 0xdc, ERIAR_MASK_0001, 0x00, 0x01,
+ ERIAR_EXGMAC);
+ rtl_w1w0_eri(ioaddr, 0xdc, ERIAR_MASK_0001, 0x01, 0x00,
+ ERIAR_EXGMAC);
+ }
+}
+
static void __rtl8169_check_link_status(struct net_device *dev,
struct rtl8169_private *tp,
void __iomem *ioaddr, bool pm)
@@ -1112,6 +1193,7 @@ static void __rtl8169_check_link_status(struct net_device *dev,
spin_lock_irqsave(&tp->lock, flags);
if (tp->link_ok(ioaddr)) {
+ rtl_link_chg_patch(tp);
/* This is to cancel a scheduled suspend if there's one. */
if (pm)
pm_request_resume(&tp->pci_dev->dev);
@@ -1640,6 +1722,7 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
int mac_version;
} mac_info[] = {
/* 8168E family. */
+ { 0x7c800000, 0x2c800000, RTL_GIGA_MAC_VER_34 },
{ 0x7cf00000, 0x2c200000, RTL_GIGA_MAC_VER_33 },
{ 0x7cf00000, 0x2c100000, RTL_GIGA_MAC_VER_32 },
{ 0x7c800000, 0x2c000000, RTL_GIGA_MAC_VER_33 },
@@ -2617,7 +2700,7 @@ static void rtl8168d_4_hw_phy_config(struct rtl8169_private *tp)
rtl_patchphy(tp, 0x0d, 1 << 5);
}
-static void rtl8168e_hw_phy_config(struct rtl8169_private *tp)
+static void rtl8168e_1_hw_phy_config(struct rtl8169_private *tp)
{
static const struct phy_reg phy_reg_init[] = {
/* Enable Delay cap */
@@ -2690,6 +2773,91 @@ static void rtl8168e_hw_phy_config(struct rtl8169_private *tp)
rtl_writephy(tp, 0x0d, 0x0000);
}
+static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp)
+{
+ static const struct phy_reg phy_reg_init[] = {
+ /* Enable Delay cap */
+ { 0x1f, 0x0004 },
+ { 0x1f, 0x0007 },
+ { 0x1e, 0x00ac },
+ { 0x18, 0x0006 },
+ { 0x1f, 0x0002 },
+ { 0x1f, 0x0000 },
+ { 0x1f, 0x0000 },
+
+ /* Channel estimation fine tune */
+ { 0x1f, 0x0003 },
+ { 0x09, 0xa20f },
+ { 0x1f, 0x0000 },
+ { 0x1f, 0x0000 },
+
+ /* Green Setting */
+ { 0x1f, 0x0005 },
+ { 0x05, 0x8b5b },
+ { 0x06, 0x9222 },
+ { 0x05, 0x8b6d },
+ { 0x06, 0x8000 },
+ { 0x05, 0x8b76 },
+ { 0x06, 0x8000 },
+ { 0x1f, 0x0000 }
+ };
+
+ rtl_apply_firmware(tp);
+
+ rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
+
+ /* For 4-corner performance improve */
+ rtl_writephy(tp, 0x1f, 0x0005);
+ rtl_writephy(tp, 0x05, 0x8b80);
+ rtl_w1w0_phy(tp, 0x17, 0x0006, 0x0000);
+ rtl_writephy(tp, 0x1f, 0x0000);
+
+ /* PHY auto speed down */
+ rtl_writephy(tp, 0x1f, 0x0004);
+ rtl_writephy(tp, 0x1f, 0x0007);
+ rtl_writephy(tp, 0x1e, 0x002d);
+ rtl_w1w0_phy(tp, 0x18, 0x0010, 0x0000);
+ rtl_writephy(tp, 0x1f, 0x0002);
+ rtl_writephy(tp, 0x1f, 0x0000);
+ rtl_w1w0_phy(tp, 0x14, 0x8000, 0x0000);
+
+ /* improve 10M EEE waveform */
+ rtl_writephy(tp, 0x1f, 0x0005);
+ rtl_writephy(tp, 0x05, 0x8b86);
+ rtl_w1w0_phy(tp, 0x06, 0x0001, 0x0000);
+ rtl_writephy(tp, 0x1f, 0x0000);
+
+ /* Improve 2-pair detection performance */
+ rtl_writephy(tp, 0x1f, 0x0005);
+ rtl_writephy(tp, 0x05, 0x8b85);
+ rtl_w1w0_phy(tp, 0x06, 0x4000, 0x0000);
+ rtl_writephy(tp, 0x1f, 0x0000);
+
+ /* EEE setting */
+ rtl_w1w0_eri(tp->mmio_addr, 0x1b0, ERIAR_MASK_1111, 0x0000, 0x0003,
+ ERIAR_EXGMAC);
+ rtl_writephy(tp, 0x1f, 0x0005);
+ rtl_writephy(tp, 0x05, 0x8b85);
+ rtl_w1w0_phy(tp, 0x06, 0x0000, 0x2000);
+ rtl_writephy(tp, 0x1f, 0x0004);
+ rtl_writephy(tp, 0x1f, 0x0007);
+ rtl_writephy(tp, 0x1e, 0x0020);
+ rtl_w1w0_phy(tp, 0x06, 0x0000, 0x0100);
+ rtl_writephy(tp, 0x1f, 0x0002);
+ rtl_writephy(tp, 0x1f, 0x0000);
+ rtl_writephy(tp, 0x0d, 0x0007);
+ rtl_writephy(tp, 0x0e, 0x003c);
+ rtl_writephy(tp, 0x0d, 0x4007);
+ rtl_writephy(tp, 0x0e, 0x0000);
+ rtl_writephy(tp, 0x0d, 0x0000);
+
+ /* Green feature */
+ rtl_writephy(tp, 0x1f, 0x0003);
+ rtl_w1w0_phy(tp, 0x19, 0x0000, 0x0001);
+ rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400);
+ rtl_writephy(tp, 0x1f, 0x0000);
+}
+
static void rtl8102e_hw_phy_config(struct rtl8169_private *tp)
{
static const struct phy_reg phy_reg_init[] = {
@@ -2809,7 +2977,10 @@ static void rtl_hw_phy_config(struct net_device *dev)
break;
case RTL_GIGA_MAC_VER_32:
case RTL_GIGA_MAC_VER_33:
- rtl8168e_hw_phy_config(tp);
+ rtl8168e_1_hw_phy_config(tp);
+ break;
+ case RTL_GIGA_MAC_VER_34:
+ rtl8168e_2_hw_phy_config(tp);
break;
default:
@@ -3219,8 +3390,10 @@ static void r8168_pll_power_down(struct rtl8169_private *tp)
rtl_writephy(tp, 0x1f, 0x0000);
rtl_writephy(tp, MII_BMCR, 0x0000);
- RTL_W32(RxConfig, RTL_R32(RxConfig) |
- AcceptBroadcast | AcceptMulticast | AcceptMyPhys);
+ if (tp->mac_version == RTL_GIGA_MAC_VER_32 ||
+ tp->mac_version == RTL_GIGA_MAC_VER_33)
+ RTL_W32(RxConfig, RTL_R32(RxConfig) | AcceptBroadcast |
+ AcceptMulticast | AcceptMyPhys);
return;
}
@@ -3315,6 +3488,7 @@ static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp)
case RTL_GIGA_MAC_VER_31:
case RTL_GIGA_MAC_VER_32:
case RTL_GIGA_MAC_VER_33:
+ case RTL_GIGA_MAC_VER_34:
ops->down = r8168_pll_power_down;
ops->up = r8168_pll_power_up;
break;
@@ -3326,6 +3500,47 @@ static void __devinit rtl_init_pll_power_ops(struct rtl8169_private *tp)
}
}
+static void rtl_init_rxcfg(struct rtl8169_private *tp)
+{
+ void __iomem *ioaddr = tp->mmio_addr;
+
+ switch (tp->mac_version) {
+ case RTL_GIGA_MAC_VER_01:
+ case RTL_GIGA_MAC_VER_02:
+ case RTL_GIGA_MAC_VER_03:
+ case RTL_GIGA_MAC_VER_04:
+ case RTL_GIGA_MAC_VER_05:
+ case RTL_GIGA_MAC_VER_06:
+ case RTL_GIGA_MAC_VER_10:
+ case RTL_GIGA_MAC_VER_11:
+ case RTL_GIGA_MAC_VER_12:
+ case RTL_GIGA_MAC_VER_13:
+ case RTL_GIGA_MAC_VER_14:
+ case RTL_GIGA_MAC_VER_15:
+ case RTL_GIGA_MAC_VER_16:
+ case RTL_GIGA_MAC_VER_17:
+ RTL_W32(RxConfig, RX_FIFO_THRESH | RX_DMA_BURST);
+ break;
+ case RTL_GIGA_MAC_VER_18:
+ case RTL_GIGA_MAC_VER_19:
+ case RTL_GIGA_MAC_VER_20:
+ case RTL_GIGA_MAC_VER_21:
+ case RTL_GIGA_MAC_VER_22:
+ case RTL_GIGA_MAC_VER_23:
+ case RTL_GIGA_MAC_VER_24:
+ RTL_W32(RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST);
+ break;
+ default:
+ RTL_W32(RxConfig, RX128_INT_EN | RX_DMA_BURST);
+ break;
+ }
+}
+
+static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
+{
+ tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
+}
+
static void rtl_hw_reset(struct rtl8169_private *tp)
{
void __iomem *ioaddr = tp->mmio_addr;
@@ -3338,8 +3553,10 @@ static void rtl_hw_reset(struct rtl8169_private *tp)
for (i = 0; i < 100; i++) {
if ((RTL_R8(ChipCmd) & CmdReset) == 0)
break;
- msleep_interruptible(1);
+ udelay(100);
}
+
+ rtl8169_init_ring_indexes(tp);
}
static int __devinit
@@ -3446,6 +3663,11 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (!pci_is_pcie(pdev))
netif_info(tp, probe, dev, "not PCI Express\n");
+ /* Identify chip attached to board */
+ rtl8169_get_mac_version(tp, dev, cfg->default_ver);
+
+ rtl_init_rxcfg(tp);
+
RTL_W16(IntrMask, 0x0000);
rtl_hw_reset(tp);
@@ -3454,9 +3676,6 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
pci_set_master(pdev);
- /* Identify chip attached to board */
- rtl8169_get_mac_version(tp, dev, cfg->default_ver);
-
/*
* Pretend we are using VLANs; This bypasses a nasty bug where
* Interrupts stop flowing on high load on 8110SCd controllers.
@@ -3721,6 +3940,16 @@ err_pm_runtime_put:
goto out;
}
+static void rtl_rx_close(struct rtl8169_private *tp)
+{
+ void __iomem *ioaddr = tp->mmio_addr;
+ u32 rxcfg = RTL_R32(RxConfig);
+
+ rxcfg &= ~(AcceptErr | AcceptRunt | AcceptBroadcast | AcceptMulticast |
+ AcceptMyPhys | AcceptAllPhys);
+ RTL_W32(RxConfig, rxcfg);
+}
+
static void rtl8169_hw_reset(struct rtl8169_private *tp)
{
void __iomem *ioaddr = tp->mmio_addr;
@@ -3728,28 +3957,27 @@ static void rtl8169_hw_reset(struct rtl8169_private *tp)
/* Disable interrupts */
rtl8169_irq_mask_and_ack(ioaddr);
+ rtl_rx_close(tp);
+
if (tp->mac_version == RTL_GIGA_MAC_VER_27 ||
tp->mac_version == RTL_GIGA_MAC_VER_28 ||
tp->mac_version == RTL_GIGA_MAC_VER_31) {
while (RTL_R8(TxPoll) & NPQ)
udelay(20);
-
+ } else if (tp->mac_version == RTL_GIGA_MAC_VER_34) {
+ while (!(RTL_R32(TxConfig) & TXCFG_EMPTY))
+ udelay(100);
+ } else {
+ RTL_W8(ChipCmd, RTL_R8(ChipCmd) | StopReq);
+ udelay(100);
}
- /* Reset the chipset */
- RTL_W8(ChipCmd, CmdReset);
-
- /* PCI commit */
- RTL_R8(ChipCmd);
+ rtl_hw_reset(tp);
}
static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
{
void __iomem *ioaddr = tp->mmio_addr;
- u32 cfg = rtl8169_rx_config;
-
- cfg |= (RTL_R32(RxConfig) & RTL_RX_CONFIG_MASK);
- RTL_W32(RxConfig, cfg);
/* Set DMA burst size and Interframe Gap Time */
RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
@@ -3760,8 +3988,6 @@ static void rtl_hw_start(struct net_device *dev)
{
struct rtl8169_private *tp = netdev_priv(dev);
- rtl_hw_reset(tp);
-
tp->hw_start(dev);
netif_start_queue(dev);
@@ -3839,6 +4065,8 @@ static void rtl_hw_start_8169(struct net_device *dev)
tp->mac_version == RTL_GIGA_MAC_VER_04)
RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
+ rtl_init_rxcfg(tp);
+
RTL_W8(EarlyTxThres, NoEarlyTx);
rtl_set_rx_max_size(ioaddr, rx_buf_sz);
@@ -4148,9 +4376,9 @@ static void rtl_hw_start_8168d_4(void __iomem *ioaddr, struct pci_dev *pdev)
rtl_enable_clock_request(pdev);
}
-static void rtl_hw_start_8168e(void __iomem *ioaddr, struct pci_dev *pdev)
+static void rtl_hw_start_8168e_1(void __iomem *ioaddr, struct pci_dev *pdev)
{
- static const struct ephy_info e_info_8168e[] = {
+ static const struct ephy_info e_info_8168e_1[] = {
{ 0x00, 0x0200, 0x0100 },
{ 0x00, 0x0000, 0x0004 },
{ 0x06, 0x0002, 0x0001 },
@@ -4168,7 +4396,7 @@ static void rtl_hw_start_8168e(void __iomem *ioaddr, struct pci_dev *pdev)
rtl_csi_access_enable_2(ioaddr);
- rtl_ephy_init(ioaddr, e_info_8168e, ARRAY_SIZE(e_info_8168e));
+ rtl_ephy_init(ioaddr, e_info_8168e_1, ARRAY_SIZE(e_info_8168e_1));
rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
@@ -4183,6 +4411,44 @@ static void rtl_hw_start_8168e(void __iomem *ioaddr, struct pci_dev *pdev)
RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
}
+static void rtl_hw_start_8168e_2(void __iomem *ioaddr, struct pci_dev *pdev)
+{
+ static const struct ephy_info e_info_8168e_2[] = {
+ { 0x09, 0x0000, 0x0080 },
+ { 0x19, 0x0000, 0x0224 }
+ };
+
+ rtl_csi_access_enable_1(ioaddr);
+
+ rtl_ephy_init(ioaddr, e_info_8168e_2, ARRAY_SIZE(e_info_8168e_2));
+
+ rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+
+ rtl_eri_write(ioaddr, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
+ rtl_eri_write(ioaddr, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
+ rtl_eri_write(ioaddr, 0xc8, ERIAR_MASK_1111, 0x00100002, ERIAR_EXGMAC);
+ rtl_eri_write(ioaddr, 0xe8, ERIAR_MASK_1111, 0x00100006, ERIAR_EXGMAC);
+ rtl_eri_write(ioaddr, 0xcc, ERIAR_MASK_1111, 0x00000050, ERIAR_EXGMAC);
+ rtl_eri_write(ioaddr, 0xd0, ERIAR_MASK_1111, 0x07ff0060, ERIAR_EXGMAC);
+ rtl_w1w0_eri(ioaddr, 0x1b0, ERIAR_MASK_0001, 0x10, 0x00, ERIAR_EXGMAC);
+ rtl_w1w0_eri(ioaddr, 0x0d4, ERIAR_MASK_0011, 0x0c00, 0xff00,
+ ERIAR_EXGMAC);
+
+ RTL_W8(MaxTxPacketSize, 0x27);
+
+ rtl_disable_clock_request(pdev);
+
+ RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
+ RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
+
+ /* Adjust EEE LED frequency */
+ RTL_W8(EEE_LED, RTL_R8(EEE_LED) & ~0x07);
+
+ RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
+ RTL_W32(MISC, RTL_R32(MISC) | PWM_EN);
+ RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
+}
+
static void rtl_hw_start_8168(struct net_device *dev)
{
struct rtl8169_private *tp = netdev_priv(dev);
@@ -4271,7 +4537,10 @@ static void rtl_hw_start_8168(struct net_device *dev)
case RTL_GIGA_MAC_VER_32:
case RTL_GIGA_MAC_VER_33:
- rtl_hw_start_8168e(ioaddr, pdev);
+ rtl_hw_start_8168e_1(ioaddr, pdev);
+ break;
+ case RTL_GIGA_MAC_VER_34:
+ rtl_hw_start_8168e_2(ioaddr, pdev);
break;
default:
@@ -4368,7 +4637,7 @@ static void rtl_hw_start_8105e_1(void __iomem *ioaddr, struct pci_dev *pdev)
RTL_W32(FuncEvent, RTL_R32(FuncEvent) & ~0x010000);
RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
- RTL_W8(DLLPR, RTL_R8(DLLPR) | PM_SWITCH);
+ RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
rtl_ephy_init(ioaddr, e_info_8105e_1, ARRAY_SIZE(e_info_8105e_1));
}
@@ -4570,11 +4839,6 @@ err_out:
return -ENOMEM;
}
-static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
-{
- tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0;
-}
-
static int rtl8169_init_ring(struct net_device *dev)
{
struct rtl8169_private *tp = netdev_priv(dev);
@@ -4702,7 +4966,7 @@ static void rtl8169_reset_task(struct work_struct *work)
rtl8169_tx_clear(tp);
- rtl8169_init_ring_indexes(tp);
+ rtl8169_hw_reset(tp);
rtl_hw_start(dev);
netif_wake_queue(dev);
rtl8169_check_link_status(dev, tp, tp->mmio_addr);
@@ -5116,7 +5380,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
* the chip, so just exit the loop.
*/
if (unlikely(!netif_running(dev))) {
- rtl8169_asic_down(ioaddr);
+ rtl8169_hw_reset(tp);
break;
}
@@ -5239,7 +5503,7 @@ static void rtl8169_down(struct net_device *dev)
spin_lock_irq(&tp->lock);
- rtl8169_asic_down(ioaddr);
+ rtl8169_hw_reset(tp);
/*
* At this point device interrupts can not be enabled in any function,
* as netif_running is not true (rtl8169_interrupt, rtl8169_reset_task,
@@ -5322,8 +5586,7 @@ static void rtl_set_rx_mode(struct net_device *dev)
spin_lock_irqsave(&tp->lock, flags);
- tmp = rtl8169_rx_config | rx_mode |
- (RTL_R32(RxConfig) & RTL_RX_CONFIG_MASK);
+ tmp = RTL_R32(RxConfig) | rx_mode;
if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
u32 data = mc_filter[0];
@@ -5493,13 +5756,16 @@ static void rtl_shutdown(struct pci_dev *pdev)
spin_lock_irq(&tp->lock);
- rtl8169_asic_down(ioaddr);
+ rtl8169_hw_reset(tp);
spin_unlock_irq(&tp->lock);
if (system_state == SYSTEM_POWER_OFF) {
- /* WoL fails with some 8168 when the receiver is disabled. */
- if (tp->features & RTL_FEATURE_WOL) {
+ /* WoL fails with 8168b when the receiver is disabled. */
+ if ((tp->mac_version == RTL_GIGA_MAC_VER_11 ||
+ tp->mac_version == RTL_GIGA_MAC_VER_12 ||
+ tp->mac_version == RTL_GIGA_MAC_VER_17) &&
+ (tp->features & RTL_FEATURE_WOL)) {
pci_clear_master(pdev);
RTL_W8(ChipCmd, CmdRxEnb);
--
Ueimor
^ permalink raw reply related
* Re: Pull request for 'davem-next.r8169' branch
From: David Miller @ 2011-07-14 23:00 UTC (permalink / raw)
To: romieu; +Cc: netdev, nic_swsd, hayeswang
In-Reply-To: <20110714224411.GA6445@electric-eye.fr.zoreil.com>
From: Francois Romieu <romieu@fr.zoreil.com>
Date: Fri, 15 Jul 2011 00:44:11 +0200
> Please pull from branch 'davem-next.r8169' in repository
>
> git://git.kernel.org/pub/scm/linux/kernel/git/romieu/netdev-2.6.git davem-next.r8169
>
> to get the changes below.
Pulled, thanks Francois.
^ permalink raw reply
* Re: [PATCH 1/2 net-next] bnx2x: Renaming the "reset_task" to "sp_rtnl_task"
From: David Miller @ 2011-07-14 23:02 UTC (permalink / raw)
To: ariele; +Cc: netdev, eilong
In-Reply-To: <1310668279.16772.84.camel@lb-tlvb-ariel.il.broadcom.com>
From: "Ariel Elior" <ariele@broadcom.com>
Date: Thu, 14 Jul 2011 21:31:19 +0300
> Renaming the "reset_task" to a more general purpose name,
> "sp_rtnl_task", as it is already used for another purpose
> other than reset which is parity recovery, and since I
> plan to add a third operation for this task, updating the
> priority to traffic class and traffic class to transmission
> queues mappings after dcbx negotiation takes place.
> Signed-off-by: Ariel Elior <ariele@broadcom.com>
> Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Applied.
^ permalink raw reply
* Re: [PATCH 2/2 net-next] bnx2x: Multiple concurrent l2 traffic classes
From: David Miller @ 2011-07-14 23:02 UTC (permalink / raw)
To: ariele; +Cc: netdev, eilong
In-Reply-To: <1310668317.16772.87.camel@lb-tlvb-ariel.il.broadcom.com>
From: "Ariel Elior" <ariele@broadcom.com>
Date: Thu, 14 Jul 2011 21:31:57 +0300
> Overview:
> Support mapping of priorities to traffic classes and
> traffic classes to transmission queues ranges in the net device.
> The queue ranges are (count, offset) pairs relating to the txq
> array.
> This can be done via DCBX negotiation or by kernel.
> As a result Enhanced Transmission Selection (ETS) and Priority Flow
> Control (PFC) are supported between L2 network traffic classes.
>
> Mapping:
> This patch uses the netdev_set_num_tc, netdev_set_prio_tc_map and
> netdev_set_tc_queue functions to map priorities to traffic classes
> and traffic classes to transmission queue ranges.
> This mapping is performed by bnx2x_setup_tc function which is
> connected to the ndo_setup_tc.
> This function is always called at nic load where by default it
> maps all priorities to tc 0, and it may also be called by the
> kernel or by the bnx2x upon DCBX negotiation to modify the mapping.
>
> rtnl lock:
> When the ndo_setup_tc is called at nic load or by kernel the rtnl
> lock is already taken. However, when DCBX negotiation takes place
> the lock is not taken. The work is therefore scheduled to be
> handled by the sp_rtnl task.
>
> Fastpath:
> The fastpath structure of the bnx2x which was previously used
> to hold the information of one tx queue and one rx queue was
> redesigned to represent multiple tx queues, one for each traffic
> class.
> The transmission queue supplied in the skb by the kernel can no
> longer be interpreted as a straightforward index into the fastpath
> structure array, but it must rather be decoded to the appropriate
> fastpath index and the tc within that fastpath.
>
> Slowpath:
> The bnx2x's queue object was redesigned to accommodate multiple
> transmission queues. The queue object's state machine was enhanced
> to allow opening multiple transmission-only connections on top of
> the regular tx-rx connection.
>
> Firmware:
> This feature relies on the tx-only queue feature introduced in the
> bnx2x 7.0.23 firmware and the FW likewise must have the bnx2x multi
> cos support.
>
> Signed-off-by: Ariel Elior <ariele@broadcom.com>
> Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Applied.
^ permalink raw reply
* Re: preempting while holding rtnl_lock
From: Ben Hutchings @ 2011-07-14 23:06 UTC (permalink / raw)
To: Flavio Leitner; +Cc: netdev
In-Reply-To: <20110714181502.4a5602aa@asterix.rh>
On Thu, 2011-07-14 at 18:15 -0300, Flavio Leitner wrote:
> Hi,
>
> I was reviewing driver sources and found that
> ethtool ops holds rtnl_lock() and there are few
> drivers (for example: tg3, bnx2) that use napi_disable()
> in this context.
[...]
> The msleep() above will preempt. I believe this is wrong.
[...]
> What am I missing?
The RTNL lock is a mutex so it's OK to sleep (but preferably not very
long) while holding it.
Ben.
--
Ben Hutchings, Senior Software Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
^ permalink raw reply
* Re: [PATCH] net/ps3: Fix gelic RX DMA restart
From: David Miller @ 2011-07-14 23:03 UTC (permalink / raw)
To: geoff; +Cc: netdev, cbe-oss-dev
In-Reply-To: <4E1F242E.7070509@infradead.org>
From: Geoff Levand <geoff@infradead.org>
Date: Thu, 14 Jul 2011 10:15:26 -0700
> Fix the condition where PS3 network RX hangs when no network
> TX is occurring by calling gelic_card_enable_rxdmac() during
> RX_DMA_CHAIN_END event processing.
>
> The gelic hardware automatically clears its RX_DMA_EN flag when
> it detects an RX_DMA_CHAIN_END event. In its processing of
> RX_DMA_CHAIN_END the gelic driver is required to set RX_DMA_EN
> (with a call to gelic_card_enable_rxdmac()) to restart RX DMA
> transfers. The existing gelic driver code does not set
> RX_DMA_EN directly in its processing of the RX_DMA_CHAIN_END
> event, but uses a flag variable card->rx_dma_restart_required
> to schedule the setting of RX_DMA_EN until next inside the
> interrupt handler.
>
> It seems this delayed setting of RX_DMA_EN causes the hang since
> the next RX interrupt after the RX_DMA_CHAIN_END event where
> RX_DMA_EN is scheduled to be set will not occur since RX_DMA_EN
> was not set. In the case were network TX is occuring, RX_DMA_EN
> is set in the next TX interrupt and RX processing continues.
>
> Signed-off-by: Geoff Levand <geoff@infradead.org>
Applied.
^ permalink raw reply
* [PATCH 1/7] at91rm9200: emac move register header to drivers
From: Jean-Christophe PLAGNIOL-VILLARD @ 2011-07-14 23:51 UTC (permalink / raw)
To: linux-arm-kernel; +Cc: Nicolas Ferre, Jean-Christophe PLAGNIOL-VILLARD, netdev
move from mach-at91/include/mach/at91rm9200_emac.h to drivers/net/arm/at91_ether.h
Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Cc: Nicolas Ferre <nicolas.ferre@atmel.com>
Cc: netdev@vger.kernel.org
---
drivers/net/arm/at91_ether.c | 1 -
.../net/arm/at91_ether.h | 112 ++++++++++++++++++--
2 files changed, 101 insertions(+), 12 deletions(-)
rename arch/arm/mach-at91/include/mach/at91rm9200_emac.h => drivers/net/arm/at91_ether.h (65%)
diff --git a/drivers/net/arm/at91_ether.c b/drivers/net/arm/at91_ether.c
index e07b314..8f0b212 100644
--- a/drivers/net/arm/at91_ether.c
+++ b/drivers/net/arm/at91_ether.c
@@ -33,7 +33,6 @@
#include <asm/uaccess.h>
#include <asm/mach-types.h>
-#include <mach/at91rm9200_emac.h>
#include <mach/gpio.h>
#include <mach/board.h>
diff --git a/arch/arm/mach-at91/include/mach/at91rm9200_emac.h b/drivers/net/arm/at91_ether.h
similarity index 65%
rename from arch/arm/mach-at91/include/mach/at91rm9200_emac.h
rename to drivers/net/arm/at91_ether.h
index b8260cd..58aed66 100644
--- a/arch/arm/mach-at91/include/mach/at91rm9200_emac.h
+++ b/drivers/net/arm/at91_ether.h
@@ -1,21 +1,21 @@
/*
- * arch/arm/mach-at91/include/mach/at91rm9200_emac.h
+ * Ethernet driver for the Atmel AT91RM9200 (Thunder)
*
- * Copyright (C) 2005 Ivan Kokshaysky
- * Copyright (C) SAN People
+ * Copyright (C) SAN People (Pty) Ltd
*
- * Ethernet MAC registers.
- * Based on AT91RM9200 datasheet revision E.
+ * Based on an earlier Atmel EMAC macrocell driver by Atmel and Lineo Inc.
+ * Initial version by Rick Bronson.
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
*/
-#ifndef AT91RM9200_EMAC_H
-#define AT91RM9200_EMAC_H
+#ifndef AT91_ETHERNET
+#define AT91_ETHERNET
+/* registers */
#define AT91_EMAC_CTL 0x00 /* Control Register */
#define AT91_EMAC_LB (1 << 0) /* Loopback */
#define AT91_EMAC_LBL (1 << 1) /* Loopback Local */
@@ -135,4 +135,94 @@
#define AT91_EMAC_SA4L 0xb0 /* Specific Address 4 Low, bytes 0-3 */
#define AT91_EMAC_SA4H 0xb4 /* Specific Address 4 High, bytes 4-5 */
+/* Davicom 9161 PHY */
+#define MII_DM9161_ID 0x0181b880
+#define MII_DM9161A_ID 0x0181b8a0
+#define MII_DSCR_REG 16
+#define MII_DSCSR_REG 17
+#define MII_DSINTR_REG 21
+
+/* Intel LXT971A PHY */
+#define MII_LXT971A_ID 0x001378E0
+#define MII_ISINTE_REG 18
+#define MII_ISINTS_REG 19
+#define MII_LEDCTRL_REG 20
+
+/* Realtek RTL8201 PHY */
+#define MII_RTL8201_ID 0x00008200
+
+/* Broadcom BCM5221 PHY */
+#define MII_BCM5221_ID 0x004061e0
+#define MII_BCMINTR_REG 26
+
+/* National Semiconductor DP83847 */
+#define MII_DP83847_ID 0x20005c30
+
+/* National Semiconductor DP83848 */
+#define MII_DP83848_ID 0x20005c90
+#define MII_DPPHYSTS_REG 16
+#define MII_DPMICR_REG 17
+#define MII_DPMISR_REG 18
+
+/* Altima AC101L PHY */
+#define MII_AC101L_ID 0x00225520
+
+/* Micrel KS8721 PHY */
+#define MII_KS8721_ID 0x00221610
+
+/* Teridian 78Q2123/78Q2133 */
+#define MII_T78Q21x3_ID 0x000e7230
+#define MII_T78Q21INT_REG 17
+
+/* SMSC LAN83C185 */
+#define MII_LAN83C185_ID 0x0007C0A0
+
+/* ........................................................................ */
+
+#define MAX_RBUFF_SZ 0x600 /* 1518 rounded up */
+#define MAX_RX_DESCR 9 /* max number of receive buffers */
+
+#define EMAC_DESC_DONE 0x00000001 /* bit for if DMA is done */
+#define EMAC_DESC_WRAP 0x00000002 /* bit for wrap */
+
+#define EMAC_BROADCAST 0x80000000 /* broadcast address */
+#define EMAC_MULTICAST 0x40000000 /* multicast address */
+#define EMAC_UNICAST 0x20000000 /* unicast address */
+
+struct rbf_t
+{
+ unsigned int addr;
+ unsigned long size;
+};
+
+struct recv_desc_bufs
+{
+ struct rbf_t descriptors[MAX_RX_DESCR]; /* must be on sizeof (rbf_t) boundary */
+ char recv_buf[MAX_RX_DESCR][MAX_RBUFF_SZ]; /* must be on long boundary */
+};
+
+struct at91_private
+{
+ struct mii_if_info mii; /* ethtool support */
+ struct at91_eth_data board_data; /* board-specific configuration */
+ struct clk *ether_clk; /* clock */
+
+ /* PHY */
+ unsigned long phy_type; /* type of PHY (PHY_ID) */
+ spinlock_t lock; /* lock for MDI interface */
+ short phy_media; /* media interface type */
+ unsigned short phy_address; /* 5-bit MDI address of PHY (0..31) */
+ struct timer_list check_timer; /* Poll link status */
+
+ /* Transmit */
+ struct sk_buff *skb; /* holds skb until xmit interrupt completes */
+ dma_addr_t skb_physaddr; /* phys addr from pci_map_single */
+ int skb_length; /* saved skb length for pci_unmap_single */
+
+ /* Receive */
+ int rxBuffIndex; /* index into receive descriptor list */
+ struct recv_desc_bufs *dlist; /* descriptor list address */
+ struct recv_desc_bufs *dlist_phys; /* descriptor list physical address */
+};
+
#endif
--
1.7.5.4
^ permalink raw reply related
* Re: [PATCH] bnx2: do not start the interface if reset fails
From: David Miller @ 2011-07-15 0:06 UTC (permalink / raw)
To: fbl; +Cc: netdev, mchan
In-Reply-To: <1310579690-24622-1-git-send-email-fbl@redhat.com>
From: Flavio Leitner <fbl@redhat.com>
Date: Wed, 13 Jul 2011 14:54:50 -0300
> When bnx2_reset_task() is called, it will stop,
> (re)initialize and start the interface to restore
> the working condition.
>
> The bnx2_init_nic() calls bnx2_reset_nic() which will
> reset the chip and then call bnx2_free_skbs() to free
> all the skbs.
>
> The problem happens when bnx2_init_chip() fails because
> bnx2_reset_nic() will just return skipping the ring
> initializations at bnx2_init_all_rings(). Later, the
> reset task starts the interface again and the system
> crashes due a NULL pointer access (no skb in the ring).
>
> This patch just check the return code and if an error is
> reported, warn the user and abort. It's better to have a
> non working interface than a crash.
>
> Signed-off-by: Flavio Leitner <fbl@redhat.com>
Broadcom folks?
^ permalink raw reply
* Re: [PATCH 07/10] net: remove NETIF_F_NO_CSUM feature
From: David Miller @ 2011-07-15 0:05 UTC (permalink / raw)
To: mirq-linux; +Cc: therbert, bhutchings, netdev
In-Reply-To: <20110714224445.GA18237@rere.qmqm.pl>
From: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Date: Fri, 15 Jul 2011 00:44:45 +0200
> On Thu, Jul 14, 2011 at 02:31:21PM -0700, David Miller wrote:
>> From: Michał Mirosław <mirq-linux@rere.qmqm.pl>
>> Date: Thu, 14 Jul 2011 22:56:23 +0200
>> > That's why its turned off by default and should be enabled only when user
>> > knows he will win some pps with it.
>> More people are going to lose than win by your change.
>>
>> The nocopy feature helps more real situations than it hurts, the
>> existing default is the best.
>
> I see. I still want to remove NO_CSUM (as I explained in other mail),
> so would you accept replacing it with something more specific to
> nocache-copy feature? READS_DATA maybe? That could be later added to
> sk_route_caps whenever it's known for a route there will be need to
> read packets' data.
I don't actually see what the problem is.
The code wants to conditionalize the nocache-copy feature based upon
whether hardware will checksum the packet or not.
And that's exactly what it's testing.
The reason, of course, is because it doesn't want to enable
nocache-copy if the cpu is just going to read the data back into it's
caches during the checksum. But that's no reason to change the
flag name to have the word "read" instead of "checksum" in it.
^ permalink raw reply
* Re: [RFC 46/72] ixp2000: Move the Radisys driver
From: Lennert Buytenhek @ 2011-07-15 0:08 UTC (permalink / raw)
To: Jeff Kirsher; +Cc: davem@davemloft.net, netdev@vger.kernel.org
In-Reply-To: <1310227137.26989.43.camel@jtkirshe-mobl>
On Sat, Jul 09, 2011 at 08:58:56AM -0700, Jeff Kirsher wrote:
> > > Move the Radisys driver into drivers/net/ethernet/radisys/ and
> > > make the necessary Kconfig and Makefile changes
> > >
> > > CC: Lennert Buytenhek <kernel@wantstofly.org>
> > > Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
> > > ---
> > > MAINTAINERS | 2 +-
> > > drivers/net/Kconfig | 2 --
> > > drivers/net/Makefile | 1 -
> > > drivers/net/ethernet/Kconfig | 1 +
> > > drivers/net/ethernet/Makefile | 1 +
> > > drivers/net/ethernet/radisys/Kconfig | 16 ++++++++++++++++
> > > drivers/net/ethernet/radisys/Makefile | 5 +++++
> > > drivers/net/{ => ethernet/radisys}/ixp2000/Kconfig | 2 +-
> > > .../net/{ => ethernet/radisys}/ixp2000/Makefile | 0
> >
> > The ixp2000 is a series of Intel ARM SoCs, and the ENP2611 is a Radisys
> > PCI board based on the ixp2000 series (ixp2400), so it doesn't make
> > sense to put everything in the radisys/ directory.
>
> It was suggested earlier that it probably should be in either ixp/ or
> radisys/, and someone suggested that ixp/ might be confusing. If you
> would like to keep it under drivers/net/ethernet/ixp2000, I am fine with
> that as well.
>
> > If you insist on moving all drivers into vendor directories (I don't
> > like that idea at all -- are we going to rename directories and shuffle
> > stuff around every time vendor A buys vendor B or takes over one of
> > vendor B's products?), at least the core ixp2000 code should be under
> > intel/.
>
> It was not my preference to place drivers into vendor specific
> directories because of that very reason, as I did the work, it just
> tended to work out that way.
>
> The reason (as stated before) that it was not moved into intel/
> directory is because the driver was not written (and supported) by
> Intel.
I didn't follow the discussion, but that seems like a silly argument.
Does that mean that any non-vendor supported driver can't go into
drivers/net/$vendor/? What if the vendor starts contributing to the
driver later on, will the driver be moved then?
It seems that what you're saying is that you don't want the ixp2000
driver in "your" subdirectory.
^ permalink raw reply
* Re: [PATCH] bnx2: do not start the interface if reset fails
From: Michael Chan @ 2011-07-15 0:13 UTC (permalink / raw)
To: Flavio Leitner; +Cc: netdev
In-Reply-To: <1310579690-24622-1-git-send-email-fbl@redhat.com>
On Wed, 2011-07-13 at 10:54 -0700, Flavio Leitner wrote:
> When bnx2_reset_task() is called, it will stop,
> (re)initialize and start the interface to restore
> the working condition.
>
> The bnx2_init_nic() calls bnx2_reset_nic() which will
> reset the chip and then call bnx2_free_skbs() to free
> all the skbs.
>
> The problem happens when bnx2_init_chip() fails because
> bnx2_reset_nic() will just return skipping the ring
> initializations at bnx2_init_all_rings(). Later, the
> reset task starts the interface again and the system
> crashes due a NULL pointer access (no skb in the ring).
>
> This patch just check the return code and if an error is
> reported, warn the user and abort. It's better to have a
> non working interface than a crash.
>
> Signed-off-by: Flavio Leitner <fbl@redhat.com>
> ---
> drivers/net/bnx2.c | 8 +++++++-
> 1 files changed, 7 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
> index 7915d14..7fb71fc 100644
> --- a/drivers/net/bnx2.c
> +++ b/drivers/net/bnx2.c
> @@ -6296,6 +6296,7 @@ static void
> bnx2_reset_task(struct work_struct *work)
> {
> struct bnx2 *bp = container_of(work, struct bnx2, reset_task);
> + int rc;
>
> rtnl_lock();
> if (!netif_running(bp->dev)) {
> @@ -6305,10 +6306,15 @@ bnx2_reset_task(struct work_struct *work)
>
> bnx2_netif_stop(bp, true);
>
> - bnx2_init_nic(bp, 1);
> + rc = bnx2_init_nic(bp, 1);
> + if (rc) {
> + netdev_err(bp->dev, "failed to reset the NIC, aborting\n");
> + goto out;
> + }
I think it is better to call dev_close() instead. I'll post a patch
soon. Thanks.
>
> atomic_set(&bp->intr_sem, 1);
> bnx2_netif_start(bp, true);
> +out:
> rtnl_unlock();
> }
>
^ permalink raw reply
* Re: [PATCH 07/10] net: remove NETIF_F_NO_CSUM feature
From: Michał Mirosław @ 2011-07-15 0:28 UTC (permalink / raw)
To: David Miller; +Cc: therbert, bhutchings, netdev
In-Reply-To: <20110714.170506.1425372007221475085.davem@davemloft.net>
On Thu, Jul 14, 2011 at 05:05:06PM -0700, David Miller wrote:
> From: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> Date: Fri, 15 Jul 2011 00:44:45 +0200
>
> > On Thu, Jul 14, 2011 at 02:31:21PM -0700, David Miller wrote:
> >> From: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> >> Date: Thu, 14 Jul 2011 22:56:23 +0200
> >> > That's why its turned off by default and should be enabled only when user
> >> > knows he will win some pps with it.
> >> More people are going to lose than win by your change.
> >>
> >> The nocopy feature helps more real situations than it hurts, the
> >> existing default is the best.
> >
> > I see. I still want to remove NO_CSUM (as I explained in other mail),
> > so would you accept replacing it with something more specific to
> > nocache-copy feature? READS_DATA maybe? That could be later added to
> > sk_route_caps whenever it's known for a route there will be need to
> > read packets' data.
>
> I don't actually see what the problem is.
>
> The code wants to conditionalize the nocache-copy feature based upon
> whether hardware will checksum the packet or not.
>
> And that's exactly what it's testing.
>
> The reason, of course, is because it doesn't want to enable
> nocache-copy if the cpu is just going to read the data back into it's
> caches during the checksum. But that's no reason to change the
> flag name to have the word "read" instead of "checksum" in it.
But the real condition is that CPU doesn't read the data. I doesn't matter
if reading is to calculate the checksum or parsing it. The change would
make this obvious.
BTW,
Best Regards,
Michał Mirosław
^ permalink raw reply
* [PATCH] [net][bna] Separate handling of irq type flags variable from the irq_flags request_irq variable
From: Shyam Iyer @ 2011-07-15 1:00 UTC (permalink / raw)
To: netdev; +Cc: rmody, ddutt, huangj, davem, ivecera, Shyam Iyer
Commit 5f77898de17ff983ff0e2988b73a6bdf4b6f9f8b does not completely fix the problem of handling allocations with irqs disabled..
The below patch on top of it fixes the problem completely.
Based on review by "Ivan Vecera" <ivecera@redhat.com>..
"
Small note, the root of the problem was that non-atomic allocation was requested with IRQs disabled. Your patch description does not contain wwhy were the IRQs disabled.
The function bnad_mbox_irq_alloc incorrectly uses 'flags' var for two different things, 1) to save current CPU flags and 2) for request_irq
call.
First the spin_lock_irqsave disables the IRQs and saves _all_ CPU flags (including one that enables/disables interrupts) to 'flags'. Then the 'flags' is overwritten by 0 or 0x80 (IRQF_SHARED). Finally the spin_unlock_irqrestore should restore saved flags, but these flags are now either 0x00 or 0x80. The interrupt bit value in flags register on x86 arch is 0x100.
This means that the interrupt bit is zero (IRQs disabled) after spin_unlock_irqrestore so the request_irq function is called with disabled interrupts.
"
Signed-off-by: Shyam Iyer <shyam_iyer@dell.com>
---
drivers/net/bna/bnad.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/bna/bnad.c b/drivers/net/bna/bnad.c
index 44e219c..ea13605 100644
--- a/drivers/net/bna/bnad.c
+++ b/drivers/net/bna/bnad.c
@@ -1111,7 +1111,7 @@ bnad_mbox_irq_alloc(struct bnad *bnad,
struct bna_intr_info *intr_info)
{
int err = 0;
- unsigned long irq_flags = 0, flags;
+ unsigned long irq_flags, flags;
u32 irq;
irq_handler_t irq_handler;
@@ -1125,6 +1125,7 @@ bnad_mbox_irq_alloc(struct bnad *bnad,
if (bnad->cfg_flags & BNAD_CF_MSIX) {
irq_handler = (irq_handler_t)bnad_msix_mbox_handler;
irq = bnad->msix_table[bnad->msix_num - 1].vector;
+ irq_flags = 0;
intr_info->intr_type = BNA_INTR_T_MSIX;
intr_info->idl[0].vector = bnad->msix_num - 1;
} else {
@@ -1135,7 +1136,6 @@ bnad_mbox_irq_alloc(struct bnad *bnad,
/* intr_info->idl.vector = 0 ? */
}
spin_unlock_irqrestore(&bnad->bna_lock, flags);
- flags = irq_flags;
sprintf(bnad->mbox_irq_name, "%s", BNAD_NAME);
/*
@@ -1146,7 +1146,7 @@ bnad_mbox_irq_alloc(struct bnad *bnad,
BNAD_UPDATE_CTR(bnad, mbox_intr_disabled);
- err = request_irq(irq, irq_handler, flags,
+ err = request_irq(irq, irq_handler, irq_flags,
bnad->mbox_irq_name, bnad);
if (err) {
--
1.7.5.4
^ permalink raw reply related
* Re: [RFC 46/72] ixp2000: Move the Radisys driver
From: Jeff Kirsher @ 2011-07-15 1:19 UTC (permalink / raw)
To: Lennert Buytenhek; +Cc: davem@davemloft.net, netdev@vger.kernel.org
In-Reply-To: <20110715000819.GK951@wantstofly.org>
[-- Attachment #1: Type: text/plain, Size: 3337 bytes --]
On Thu, 2011-07-14 at 17:08 -0700, Lennert Buytenhek wrote:
> On Sat, Jul 09, 2011 at 08:58:56AM -0700, Jeff Kirsher wrote:
>
> > > > Move the Radisys driver into drivers/net/ethernet/radisys/ and
> > > > make the necessary Kconfig and Makefile changes
> > > >
> > > > CC: Lennert Buytenhek <kernel@wantstofly.org>
> > > > Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
> > > > ---
> > > > MAINTAINERS | 2 +-
> > > > drivers/net/Kconfig | 2 --
> > > > drivers/net/Makefile | 1 -
> > > > drivers/net/ethernet/Kconfig | 1 +
> > > > drivers/net/ethernet/Makefile | 1 +
> > > > drivers/net/ethernet/radisys/Kconfig | 16 ++++++++++++++++
> > > > drivers/net/ethernet/radisys/Makefile | 5 +++++
> > > > drivers/net/{ => ethernet/radisys}/ixp2000/Kconfig | 2 +-
> > > > .../net/{ => ethernet/radisys}/ixp2000/Makefile | 0
> > >
> > > The ixp2000 is a series of Intel ARM SoCs, and the ENP2611 is a Radisys
> > > PCI board based on the ixp2000 series (ixp2400), so it doesn't make
> > > sense to put everything in the radisys/ directory.
> >
> > It was suggested earlier that it probably should be in either ixp/ or
> > radisys/, and someone suggested that ixp/ might be confusing. If you
> > would like to keep it under drivers/net/ethernet/ixp2000, I am fine with
> > that as well.
> >
> > > If you insist on moving all drivers into vendor directories (I don't
> > > like that idea at all -- are we going to rename directories and shuffle
> > > stuff around every time vendor A buys vendor B or takes over one of
> > > vendor B's products?), at least the core ixp2000 code should be under
> > > intel/.
> >
> > It was not my preference to place drivers into vendor specific
> > directories because of that very reason, as I did the work, it just
> > tended to work out that way.
> >
> > The reason (as stated before) that it was not moved into intel/
> > directory is because the driver was not written (and supported) by
> > Intel.
>
> I didn't follow the discussion, but that seems like a silly argument.
> Does that mean that any non-vendor supported driver can't go into
> drivers/net/$vendor/? What if the vendor starts contributing to the
> driver later on, will the driver be moved then?
>
> It seems that what you're saying is that you don't want the ixp2000
> driver in "your" subdirectory.
It is more that all the drivers that in intel/ are all very similar and
have "common" code which potentially code be shared. We have been
looking at what possibilities there are for the common code between the
Intel supported drivers. So it really did not make sense to throw a
driver into the intel/ directory just because it used an Intel chip, but
has nothing in common with the other drivers in that directory. Sorry
if my previous explanation sounded like it I just did not want the
drivers in the intel/ because we did not write or support it.
After looking at ixp2000/ixp4xx drivers and the 82586/82596 drivers a
bit more, I came up with the solution of putting the IXP drivers in
xscale/ and the 82586/82596 drivers in i825xx/ directory.
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 490 bytes --]
^ permalink raw reply
* Re: [PATCH v2 1/5] dt: add of_alias_scan and of_alias_get_id
From: Grant Likely @ 2011-07-15 2:53 UTC (permalink / raw)
To: Shawn Guo
Cc: linux-arm-kernel, linux-kernel, netdev, linux-serial,
devicetree-discuss, patches
In-Reply-To: <1308938676-31121-2-git-send-email-shawn.guo@linaro.org>
On Sat, Jun 25, 2011 at 02:04:32AM +0800, Shawn Guo wrote:
> The patch adds function of_alias_scan to populate a global lookup
> table with the properties of 'aliases' node and function
> of_alias_get_id for drivers to find alias id from the lookup table.
>
> Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
> Cc: Grant Likely <grant.likely@secretlab.ca>
Hey Shawn,
Comments below, but I've gone ahead and fixed them because I'm keen to
get this patch merged. I just wanted to let you know what I changed.
I'll post the modified version so you can test it.
> ---
> drivers/of/base.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> drivers/of/fdt.c | 6 ++
> include/linux/of.h | 7 ++
> 3 files changed, 194 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/of/base.c b/drivers/of/base.c
> index 632ebae..89efd10 100644
> --- a/drivers/of/base.c
> +++ b/drivers/of/base.c
> @@ -17,14 +17,38 @@
> * as published by the Free Software Foundation; either version
> * 2 of the License, or (at your option) any later version.
> */
> +#include <linux/bootmem.h>
> +#include <linux/ctype.h>
> #include <linux/module.h>
> #include <linux/of.h>
> #include <linux/spinlock.h>
> #include <linux/slab.h>
> #include <linux/proc_fs.h>
>
> +/**
> + * struct alias_prop - Alias property in 'aliases' node
> + * @link: List node to link the structure in aliases_lookup list
> + * @alias: Alias property name
> + * @np: Pointer to device_node that the alias stands for
> + * @alias_id: Alias id decoded from alias
> + * @alias_stem: Alias stem name decoded from alias
> + *
> + * The structure represents one alias property of 'aliases' node as
> + * an entry in aliases_lookup list.
> + */
> +struct alias_prop {
> + struct list_head link;
> + const char *alias;
> + struct device_node *np;
> + int alias_id;
> + char alias_stem[0];
> +};
> +
> +static LIST_HEAD(aliases_lookup);
> +
> struct device_node *allnodes;
> struct device_node *of_chosen;
> +struct device_node *of_aliases;
>
> /* use when traversing tree through the allnext, child, sibling,
> * or parent members of struct device_node.
> @@ -922,3 +946,160 @@ out_unlock:
> }
> #endif /* defined(CONFIG_OF_DYNAMIC) */
>
> +/*
> + * of_alias_find_available_id - Find an available id for the given device_node
Nit: kerneldoc format is "/**" to start the comment, and function
names should have '()' on it.
> + * @np: Pointer to the given device_node
> + * @stem: Alias stem of the given device_node
> + *
> + * The function travels the lookup table to find an available id for the
> + * given device_node with given alias stem. It returns the id found.
> + */
> +static int of_alias_find_available_id(struct device_node *np, const char *stem)
> +{
> + struct alias_prop *app;
> + int id = 0;
> +
> + while (1) {
> + bool used = false;
> + list_for_each_entry(app, &aliases_lookup, link) {
> + if (!strcmp(app->alias_stem, stem) &&
> + app->alias_id == id) {
> + used = true;
> + break;
> + }
> + }
> +
> + if (used)
> + id++;
> + else
> + return id;
> + }
> +}
I've simplified this somewhat to do the list_for_each_entry() only
once, and to bump up the id to +1 the largest entry:
list_for_each_entry(app, &aliases_lookup, link)
if ((strcmp(app->stem, stem) == 0) && id <= app->id)
id = app->id + 1;
.... actually, after looking further, I've rolled this code into the
of_alias_get_id() function.
> +
> +/**
> + * of_alias_lookup_add - Add alias into lookup table
> + * @alias: Alias name
> + * @id: Alias id
> + * @stem: Alias stem name
> + * @np: Pointer to device_node
> + *
> + * The function adds one alias into the lookup table and populate it
> + * with the info passed in. It returns 0 in sucess, or error code.
> + */
> +static int of_alias_lookup_add(char *alias, int id, const char *stem,
> + struct device_node *np)
> +{
> + struct alias_prop *app;
> + size_t sz = sizeof(*app) + strlen(stem) + 1;
> +
> + app = kzalloc(sz, GFP_KERNEL);
> + if (!app) {
> + /*
> + * It may fail due to being called by boot code,
> + * so try alloc_bootmem before return error.
> + */
> + app = alloc_bootmem(sz);
> + if (!app)
> + return -ENOMEM;
> + }
I'm not too fond of this since we *know* when this is going to be
called from early boot. So, instead, I've changed the code to use the
already existing dt_alloc functions as an argument to of_alias_lookup_add().
Also, alloc_bootmem() doesn't work on all platforms.
early_init_dt_alloc_memory_arch() needs to be used instead.
> +
> + app->np = np;
> + app->alias = alias;
> + app->alias_id = id;
> + strcpy(app->alias_stem, stem);
> + list_add_tail(&app->link, &aliases_lookup);
> +
> + return 0;
> +}
> +
> +/**
> + * of_alias_decode - Decode alias stem and id from alias name
> + * @alias: Alias name to be decoded
> + * @stem: Pointer used to return stem name
> + *
> + * The function decodes alias stem name and alias id from the given
> + * alias name. It returns stem name via parameter 'stem', and stem id
> + * via the return value. If no id is found in alias name, it returns 0
> + * as the default.
> + */
> +static int of_alias_decode(char *alias, char *stem)
> +{
> + int len = strlen(alias);
> + char *end = alias + len;
> +
> + while (isdigit(*--end))
> + len--;
Need to protect against len < 0
> +
> + strncpy(stem, alias, len);
> + stem[len] = '\0';
> +
> + return strlen(++end) ? simple_strtoul(end, NULL, 10) : 0;
> +}
> +
> +/**
> + * of_alias_scan - Scan all properties of 'aliases' node
> + *
> + * The function scans all the properties of 'aliases' node and populate
> + * the the global lookup table with the properties. It returns the
> + * number of alias_prop found, or error code in error case.
> + */
> +int of_alias_scan(void)
Changed to '__init void of_aliases_scan(void)'. There is no point in
returning an error code since it is never checked, and there is no
point in bailing on an error just in case it is a problem with only
one alias.
> +{
> + struct property *pp;
> + int ret, num = 0;
> +
> + if (!of_aliases)
> + return -ENODEV;
> +
> + for_each_property(pp, of_aliases->properties) {
> + char stem[32];
> + int id = of_alias_decode(pp->name, stem);
> +
> + /* Skip those we do not want to proceed */
> + if (!strcmp(pp->name, "name") ||
> + !strcmp(pp->name, "phandle") ||
> + !strcmp(pp->name, "linux,phandle"))
> + continue;
> +
> + ret = of_alias_lookup_add(pp->name, id, stem,
> + of_find_node_by_path(pp->value));
> + if (ret < 0)
> + return ret;
> + else
> + num++;
> + }
> +
> + return num;
> +}
> +
> +/**
> + * of_alias_get_id - Get alias id for the given device_node
> + * @np: Pointer to the given device_node
> + * @stem: Alias stem of the given device_node
> + *
> + * The function travels the lookup table to get alias id for the given
> + * device_node and alias stem. It returns the alias id if find it.
> + * If not, dynamically creates one in the lookup table and returns it,
> + * or returns error code if fail to create.
> + */
> +int of_alias_get_id(struct device_node *np, const char *stem)
> +{
> + struct alias_prop *app;
> + int id = -1;
> +
> + list_for_each_entry(app, &aliases_lookup, link) {
> + if (np == app->np) {
> + id = app->alias_id;
> + break;
> + }
> + }
> +
> + if (id == -1) {
> + id = of_alias_find_available_id(np, stem);
> + if (of_alias_lookup_add(NULL, id, stem, np) < 0)
> + return -ENODEV;
> + }
> +
> + return id;
> +}
This whole function needs to be protected by a mutex.
> +EXPORT_SYMBOL_GPL(of_alias_get_id);
> diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
> index 65200af..998dc63 100644
> --- a/drivers/of/fdt.c
> +++ b/drivers/of/fdt.c
> @@ -711,6 +711,12 @@ void __init unflatten_device_tree(void)
> of_chosen = of_find_node_by_path("/chosen");
> if (of_chosen == NULL)
> of_chosen = of_find_node_by_path("/chosen@0");
> +
> + of_aliases = of_find_node_by_path("/aliases");
> + if (of_aliases == NULL)
> + of_aliases = of_find_node_by_path("/aliases@0");
I don't think the /aliases@0 variant is necessary. I've dropped it.
g.
> +
> + of_alias_scan();
> }
>
> #endif /* CONFIG_OF_EARLY_FLATTREE */
> diff --git a/include/linux/of.h b/include/linux/of.h
> index bfc0ed1..c35cc47 100644
> --- a/include/linux/of.h
> +++ b/include/linux/of.h
> @@ -68,6 +68,7 @@ struct device_node {
> /* Pointer for first entry in chain of all nodes. */
> extern struct device_node *allnodes;
> extern struct device_node *of_chosen;
> +extern struct device_node *of_aliases;
> extern rwlock_t devtree_lock;
>
> static inline bool of_have_populated_dt(void)
> @@ -201,6 +202,9 @@ extern int of_device_is_available(const struct device_node *device);
> extern const void *of_get_property(const struct device_node *node,
> const char *name,
> int *lenp);
> +#define for_each_property(pp, properties) \
> + for (pp = properties; pp != NULL; pp = pp->next)
> +
> extern int of_n_addr_cells(struct device_node *np);
> extern int of_n_size_cells(struct device_node *np);
> extern const struct of_device_id *of_match_node(
> @@ -213,6 +217,9 @@ extern int of_parse_phandles_with_args(struct device_node *np,
> const char *list_name, const char *cells_name, int index,
> struct device_node **out_node, const void **out_args);
>
> +extern int of_alias_scan(void);
> +extern int of_alias_get_id(struct device_node *np, const char *stem);
> +
> extern int of_machine_is_compatible(const char *compat);
>
> extern int prom_add_property(struct device_node* np, struct property* prop);
> --
> 1.7.4.1
>
^ permalink raw reply
* Re: [PATCH] [net][bna] Separate handling of irq type flags variable from the irq_flags request_irq variable
From: Ivan Vecera @ 2011-07-15 6:35 UTC (permalink / raw)
To: Shyam Iyer; +Cc: netdev, rmody, ddutt, huangj, davem, Shyam Iyer
In-Reply-To: <1310691632-22914-1-git-send-email-shyam_iyer@dell.com>
On Thu, 2011-07-14 at 21:00 -0400, Shyam Iyer wrote:
> Commit 5f77898de17ff983ff0e2988b73a6bdf4b6f9f8b does not completely fix the problem of handling allocations with irqs disabled..
> The below patch on top of it fixes the problem completely.
The commit fixes the issue, but it does not separate enough the
'irq_flags' and the 'flags', so it is a little bit confusing. The patch
below corrects this imprecision and looks fine.
> Based on review by "Ivan Vecera" <ivecera@redhat.com>..
> "
> Small note, the root of the problem was that non-atomic allocation was requested with IRQs disabled. Your patch description does not contain wwhy were the IRQs disabled.
>
> The function bnad_mbox_irq_alloc incorrectly uses 'flags' var for two different things, 1) to save current CPU flags and 2) for request_irq
> call.
> First the spin_lock_irqsave disables the IRQs and saves _all_ CPU flags (including one that enables/disables interrupts) to 'flags'. Then the 'flags' is overwritten by 0 or 0x80 (IRQF_SHARED). Finally the spin_unlock_irqrestore should restore saved flags, but these flags are now either 0x00 or 0x80. The interrupt bit value in flags register on x86 arch is 0x100.
> This means that the interrupt bit is zero (IRQs disabled) after spin_unlock_irqrestore so the request_irq function is called with disabled interrupts.
> "
>
> Signed-off-by: Shyam Iyer <shyam_iyer@dell.com>
> ---
> drivers/net/bna/bnad.c | 6 +++---
> 1 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/bna/bnad.c b/drivers/net/bna/bnad.c
> index 44e219c..ea13605 100644
> --- a/drivers/net/bna/bnad.c
> +++ b/drivers/net/bna/bnad.c
> @@ -1111,7 +1111,7 @@ bnad_mbox_irq_alloc(struct bnad *bnad,
> struct bna_intr_info *intr_info)
> {
> int err = 0;
> - unsigned long irq_flags = 0, flags;
> + unsigned long irq_flags, flags;
> u32 irq;
> irq_handler_t irq_handler;
>
> @@ -1125,6 +1125,7 @@ bnad_mbox_irq_alloc(struct bnad *bnad,
> if (bnad->cfg_flags & BNAD_CF_MSIX) {
> irq_handler = (irq_handler_t)bnad_msix_mbox_handler;
> irq = bnad->msix_table[bnad->msix_num - 1].vector;
> + irq_flags = 0;
> intr_info->intr_type = BNA_INTR_T_MSIX;
> intr_info->idl[0].vector = bnad->msix_num - 1;
> } else {
> @@ -1135,7 +1136,6 @@ bnad_mbox_irq_alloc(struct bnad *bnad,
> /* intr_info->idl.vector = 0 ? */
> }
> spin_unlock_irqrestore(&bnad->bna_lock, flags);
> - flags = irq_flags;
> sprintf(bnad->mbox_irq_name, "%s", BNAD_NAME);
>
> /*
> @@ -1146,7 +1146,7 @@ bnad_mbox_irq_alloc(struct bnad *bnad,
>
> BNAD_UPDATE_CTR(bnad, mbox_intr_disabled);
>
> - err = request_irq(irq, irq_handler, flags,
> + err = request_irq(irq, irq_handler, irq_flags,
> bnad->mbox_irq_name, bnad);
>
> if (err) {
^ permalink raw reply
* [PATCH net-next-2.6] slcan: remove obsolete code in slcan initialisation
From: Oliver Hartkopp @ 2011-07-15 7:49 UTC (permalink / raw)
To: David Miller; +Cc: Linux Netdev List, Matvejchikov Ilya
This patch removes obsolete code in the initialisation/creation of
slcan devices.
It follows the suggested cleanups from Ilya Matvejchikov in
drivers/net/slip.c that where recently applied to net-next-2.6:
- slip: remove dead code within the slip initialization
- slip: remove redundant check slip_devs for NULL
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
---
diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c
index 1b49df6..aa8ad73 100644
--- a/drivers/net/can/slcan.c
+++ b/drivers/net/can/slcan.c
@@ -473,12 +473,10 @@ static void slc_sync(void)
static struct slcan *slc_alloc(dev_t line)
{
int i;
+ char name[IFNAMSIZ];
struct net_device *dev = NULL;
struct slcan *sl;
- if (slcan_devs == NULL)
- return NULL; /* Master array missing ! */
-
for (i = 0; i < maxdev; i++) {
dev = slcan_devs[i];
if (dev == NULL)
@@ -490,25 +488,12 @@ static struct slcan *slc_alloc(dev_t line)
if (i >= maxdev)
return NULL;
- if (dev) {
- sl = netdev_priv(dev);
- if (test_bit(SLF_INUSE, &sl->flags)) {
- unregister_netdevice(dev);
- dev = NULL;
- slcan_devs[i] = NULL;
- }
- }
-
- if (!dev) {
- char name[IFNAMSIZ];
- sprintf(name, "slcan%d", i);
-
- dev = alloc_netdev(sizeof(*sl), name, slc_setup);
- if (!dev)
- return NULL;
- dev->base_addr = i;
- }
+ sprintf(name, "slcan%d", i);
+ dev = alloc_netdev(sizeof(*sl), name, slc_setup);
+ if (!dev)
+ return NULL;
+ dev->base_addr = i;
sl = netdev_priv(dev);
/* Initialize channel control data */
^ permalink raw reply related
* RE: gianfar vlan
From: Sebastian Pöhn @ 2011-07-15 7:59 UTC (permalink / raw)
To: sandeep.kumar, sandeep.kumar, netdev, jpirko; +Cc: Sebastian Pöhn
Hi Jirka!
The rx queue filer table also needs the RCTRL_PRSDEP_INIT to be set. So I would suggest to add FILREN to RCTRL_REQ_PARSER.
Further I guess the parser should only be enabled if it is necessary (because of VLAN, IP, TCP or FILREN acceleration modes).
What about putting the
if (tempval & RCTRL_REQ_PARSER)
tempval |= RCTRL_PRSDEP_INIT;
else
tempval &= ~RCTRL_PRSDEP_INIT;
in a dedicated routine and call it every time one of the four features is altered?
Greetings
Sebastian
> Hi Sandeep.
>
> I'm trying to remove gfar_vlan_rx_register() and move the vlan accel
> enabling/disabling to gfar_set_features() -> startup_gfar() ->
> gfar_init_mac(). I'm not sure how to handle following lines in
> gfar_vlan_rx_register():
>
> /* If parse is no longer required, then disable parser */
> if (tempval & RCTRL_REQ_PARSER)
> tempval |= RCTRL_PRSDEP_INIT;
> else
> tempval &= ~RCTRL_PRSDEP_INIT;
>
> Should this be done only on disabling vlan accel (both rx an tx)?
> Or can I just do that always in startup_gfar() ?
>
> Thanks.
>
> Jirka
^ permalink raw reply
* Re: iwlagn: Random "Time out reading EEPROM".
From: Nicolas de Pesloüan @ 2011-07-15 8:22 UTC (permalink / raw)
To: wwguy, dhalperi; +Cc: netdev@vger.kernel.org, wireless
In-Reply-To: <1307284276.6918.17.camel@wwguy-ubuntu>
Le 05/06/2011 16:31, wwguy a écrit :
> On Sat, 2011-06-04 at 06:14 -0700, Nicolas de Pesloüan wrote:
>> Hi,
>>
>> From time to time, my Intel Wifi adapter fail on cold boot, with the following in dmesg:
>>
>> [ 7.442634] iwlagn: Intel(R) Wireless WiFi Link AGN driver for Linux, 1.3.27ks
>> [ 7.442636] iwlagn: Copyright(c) 2003-2009 Intel Corporation
>> [ 7.442701] iwlagn 0000:05:00.0: PCI INT A -> GSI 18 (level, low) -> IRQ 18
>> [ 7.442708] iwlagn 0000:05:00.0: setting latency timer to 64
>> [ 7.442788] iwlagn 0000:05:00.0: Detected Intel Wireless WiFi Link 5100AGN REV=0x54
>> [ 7.455547] iwlagn 0000:05:00.0: Time out reading EEPROM[0]
>> [ 7.455611] iwlagn 0000:05:00.0: Unable to init EEPROM
>> [ 7.455678] iwlagn 0000:05:00.0: PCI INT A disabled
>> [ 7.455685] iwlagn: probe of 0000:05:00.0 failed with error -110
>>
>> After "modprobe -r iwlagn ; modprobe iwlagn" or after a reboot, everything work fine:
>>
>> [ 346.332166] iwlagn: Intel(R) Wireless WiFi Link AGN driver for Linux, 1.3.27ks
>> [ 346.332169] iwlagn: Copyright(c) 2003-2009 Intel Corporation
>> [ 346.332225] iwlagn 0000:05:00.0: PCI INT A -> GSI 18 (level, low) -> IRQ 18
>> [ 346.332234] iwlagn 0000:05:00.0: setting latency timer to 64
>> [ 346.332277] iwlagn 0000:05:00.0: Detected Intel Wireless WiFi Link 5100AGN REV=0x54
>> [ 346.365739] iwlagn 0000:05:00.0: Tunable channels: 13 802.11bg, 24 802.11a channels
>> [ 346.365787] alloc irq_desc for 33 on node -1
>> [ 346.365788] alloc kstat_irqs on node -1
>> [ 346.365804] iwlagn 0000:05:00.0: irq 33 for MSI/MSI-X
>> [ 346.449989] phy0: Selected rate control algorithm 'iwl-agn-rs'
>>
>> This happens using 2.6.32-5 from Debian. I didn't had the opportunity to reproduce it using recent
>> kernel, but it occurs too rarely to conclude anything.
>>
>> I had a look at the git log, without finding something that seems related to this problem. Does this
>> ring a bell for someone?
>>
>> Nicolas.
>>
>> 05:00.0 Network controller: Intel Corporation WiFi Link 5100
>> Subsystem: Intel Corporation WiFi Link 5100 AGN
>> Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR-
>> FastB2B- DisINTx-
>> Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast>TAbort-<TAbort-<MAbort->SERR-
>> <PERR- INTx-
>> Latency: 0, Cache Line Size: 64 bytes
>> Interrupt: pin A routed to IRQ 33
>> Region 0: Memory at d6d00000 (64-bit, non-prefetchable) [size=8K]
>> Capabilities: [c8] Power Management version 3
>> Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0+,D1-,D2-,D3hot+,D3cold+)
>> Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
>> Capabilities: [d0] MSI: Enable+ Count=1/1 Maskable- 64bit+
>> Address: 00000000fee0300c Data: 41c9
>> Capabilities: [e0] Express (v1) Endpoint, MSI 00
>> DevCap: MaxPayload 128 bytes, PhantFunc 0, Latency L0s<512ns, L1 unlimited
>> ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset+
>> DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
>> RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+ FLReset-
>> MaxPayload 128 bytes, MaxReadReq 128 bytes
>> DevSta: CorrErr+ UncorrErr- FatalErr- UnsuppReq+ AuxPwr+ TransPend-
>> LnkCap: Port #0, Speed 2.5GT/s, Width x1, ASPM L0s L1, Latency L0<128ns, L1<32us
>> ClockPM+ Surprise- LLActRep- BwNot-
>> LnkCtl: ASPM L1 Enabled; RCB 64 bytes Disabled- Retrain- CommClk+
>> ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
>> LnkSta: Speed 2.5GT/s, Width x1, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
>> Capabilities: [100 v1] Advanced Error Reporting
>> UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC-
>> UnsupReq- ACSViol-
>> UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC-
>> UnsupReq- ACSViol-
>> UESvrt: DLP+ SDES- TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC-
>> UnsupReq- ACSViol-
>> CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
>> CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
>> AERCap: First Error Pointer: 00, GenCap- CGenEn- ChkCap- ChkEn-
>> Capabilities: [140 v1] Device Serial Number 00-22-fb-ff-ff-28-46-c8
>> Kernel driver in use: iwlagn
>>
>
> no sure, you are the ONLY one report this issue, since the device works
> after you reload the module, the HW/SW is ok. maybe the timing/sequence
> have problem on the kernel you are using on your system. The bus is not
> ready when you boot the system and access the EEPROM.
>
> What model of the laptop you have? could you try to upgrade to newer
> kernel?
This problem also happens using 2.6.39-2-amd64 from Debian.
[ 8.507426] iwlagn: Intel(R) Wireless WiFi Link AGN driver for Linux, in-tree:
[ 8.507429] iwlagn: Copyright(c) 2003-2010 Intel Corporation
[ 8.507521] iwlagn 0000:05:00.0: PCI INT A -> GSI 18 (level, low) -> IRQ 18
[ 8.507529] iwlagn 0000:05:00.0: setting latency timer to 64
[ 8.507556] iwlagn 0000:05:00.0: Detected Intel(R) WiFi Link 5100 AGN, REV=0x54
[ 8.516687] iwlagn 0000:05:00.0: Time out reading EEPROM[2]
[ 8.516724] iwlagn 0000:05:00.0: Unable to init EEPROM
[ 8.516739] iwlagn 0000:05:00.0: PCI INT A disabled
[ 8.516745] iwlagn: probe of 0000:05:00.0 failed with error -110
modprobe -r iwlagn ; modprobe iwlagn
[ 208.948664] iwlagn: Intel(R) Wireless WiFi Link AGN driver for Linux, in-tree:
[ 208.948666] iwlagn: Copyright(c) 2003-2010 Intel Corporation
[ 208.948743] iwlagn 0000:05:00.0: PCI INT A -> GSI 18 (level, low) -> IRQ 18
[ 208.948753] iwlagn 0000:05:00.0: setting latency timer to 64
[ 208.948817] iwlagn 0000:05:00.0: Detected Intel(R) WiFi Link 5100 AGN, REV=0x54
[ 208.969659] iwlagn 0000:05:00.0: device EEPROM VER=0x11f, CALIB=0x4
[ 208.969661] iwlagn 0000:05:00.0: Device SKU: 0Xb
[ 208.969701] iwlagn 0000:05:00.0: Tunable channels: 13 802.11bg, 24 802.11a channels
[ 208.969766] iwlagn 0000:05:00.0: irq 50 for MSI/MSI-X
[ 209.048366] iwlagn 0000:05:00.0: loaded firmware version 8.83.5.1 build 33692
Because it happens not very often, I still didn't had the opportunity to reproduce it with up to
date kernel.
The laptop is a two years old Sony Vaio VGN-AW21M.
Nicolas.
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox