* RE: Multicast problem
From: Joakim Tjernlund @ 2007-10-16 18:54 UTC (permalink / raw)
To: 'David Stevens'; +Cc: 'Netdev'
In-Reply-To: <OFB45E9AE1.F95FB289-ON88257376.005D25C3-88257376.005DB70D@us.ibm.com>
> -----Original Message-----
> From: David Stevens [mailto:dlstevens@us.ibm.com]
> Sent: den 16 oktober 2007 19:05
> To: joakim.tjernlund@transmode.se
> Cc: Netdev
> Subject: Re: Multicast problem
>
> If you have icmp_echo_ignore_broadcasts set to 1, it won't respond to
> multicasts. That should be all you need to do for 224.0.0.1.
hmm maybe I misunderstand here, but the we are trying to make OSPF work
in 2.6 and the problem appears to be that our board does not pick up
multicasts.
Is icmp_echo_ignore_broadcasts=0 required to make OSPF work in 2.6?
Jocke
^ permalink raw reply
* [PATCH 0/7] skge: patches for 2.6.24
From: Stephen Hemminger @ 2007-10-16 19:15 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
The first three are bug fixes, followed by cleanup
and addition of new eeprom and debug interface.
Patches are against current linux-2.6 git tree which
is at pre 2.6.24 state.
--
Stephen Hemminger <shemminger@linux-foundation.org>
^ permalink raw reply
* [PATCH 1/7] skge: fix ram buffer size calculation
From: Stephen Hemminger @ 2007-10-16 19:15 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
In-Reply-To: <20071016191548.447710749@linux-foundation.org>
[-- Attachment #1: skge-ram-buffer-fix.patch --]
[-- Type: text/plain, Size: 3525 bytes --]
This fixes problems with transmit hangs on older fiber based SysKonnect boards.
Adjust ram buffer sizing calculation to make it correct on all boards
and make it like the code in sky2 driver.
Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
--- a/drivers/net/skge.c 2007-10-16 10:55:13.000000000 -0700
+++ b/drivers/net/skge.c 2007-10-16 10:55:33.000000000 -0700
@@ -2403,32 +2403,31 @@ static int skge_ioctl(struct net_device
return err;
}
-static void skge_ramset(struct skge_hw *hw, u16 q, u32 start, size_t len)
+/* Assign Ram Buffer allocation to queue */
+static void skge_ramset(struct skge_hw *hw, u16 q, u32 start, u32 space)
{
u32 end;
- start /= 8;
- len /= 8;
- end = start + len - 1;
+ /* convert from K bytes to qwords used for hw register */
+ start *= 1024/8;
+ space *= 1024/8;
+ end = start + space - 1;
skge_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR);
skge_write32(hw, RB_ADDR(q, RB_START), start);
+ skge_write32(hw, RB_ADDR(q, RB_END), end);
skge_write32(hw, RB_ADDR(q, RB_WP), start);
skge_write32(hw, RB_ADDR(q, RB_RP), start);
- skge_write32(hw, RB_ADDR(q, RB_END), end);
if (q == Q_R1 || q == Q_R2) {
+ u32 tp = space - space/4;
+
/* Set thresholds on receive queue's */
- skge_write32(hw, RB_ADDR(q, RB_RX_UTPP),
- start + (2*len)/3);
- skge_write32(hw, RB_ADDR(q, RB_RX_LTPP),
- start + (len/3));
- } else {
- /* Enable store & forward on Tx queue's because
- * Tx FIFO is only 4K on Genesis and 1K on Yukon
- */
+ skge_write32(hw, RB_ADDR(q, RB_RX_UTPP), tp);
+ skge_write32(hw, RB_ADDR(q, RB_RX_LTPP), space/4);
+ } else if (hw->chip_id != CHIP_ID_GENESIS)
+ /* Genesis Tx Fifo is too small for normal store/forward */
skge_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_STFWD);
- }
skge_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_OP_MD);
}
@@ -2456,7 +2455,7 @@ static int skge_up(struct net_device *de
struct skge_port *skge = netdev_priv(dev);
struct skge_hw *hw = skge->hw;
int port = skge->port;
- u32 chunk, ram_addr;
+ u32 ramaddr, ramsize, rxspace;
size_t rx_size, tx_size;
int err;
@@ -2511,14 +2510,15 @@ static int skge_up(struct net_device *de
spin_unlock_bh(&hw->phy_lock);
/* Configure RAMbuffers */
- chunk = hw->ram_size / ((hw->ports + 1)*2);
- ram_addr = hw->ram_offset + 2 * chunk * port;
+ ramsize = (hw->ram_size - hw->ram_offset) / hw->ports;
+ ramaddr = hw->ram_offset + port * ramsize;
+ rxspace = 8 + (2*(ramsize - 16))/3;
- skge_ramset(hw, rxqaddr[port], ram_addr, chunk);
- skge_qset(skge, rxqaddr[port], skge->rx_ring.to_clean);
+ skge_ramset(hw, rxqaddr[port], ramaddr, rxspace);
+ skge_ramset(hw, txqaddr[port], ramaddr + rxspace, ramsize - rxspace);
+ skge_qset(skge, rxqaddr[port], skge->rx_ring.to_clean);
BUG_ON(skge->tx_ring.to_use != skge->tx_ring.to_clean);
- skge_ramset(hw, txqaddr[port], ram_addr+chunk, chunk);
skge_qset(skge, txqaddr[port], skge->tx_ring.to_use);
/* Start receiver BMU */
@@ -3450,15 +3450,12 @@ static int skge_reset(struct skge_hw *hw
if (hw->chip_id == CHIP_ID_GENESIS) {
if (t8 == 3) {
/* special case: 4 x 64k x 36, offset = 0x80000 */
- hw->ram_size = 0x100000;
- hw->ram_offset = 0x80000;
+ hw->ram_size = 1024;
+ hw->ram_offset = 512;
} else
hw->ram_size = t8 * 512;
- }
- else if (t8 == 0)
- hw->ram_size = 0x20000;
- else
- hw->ram_size = t8 * 4096;
+ } else /* Yukon */
+ hw->ram_size = t8 ? t8 * 4 : 128;
hw->intr_mask = IS_HW_ERR;
--
Stephen Hemminger <shemminger@linux-foundation.org>
^ permalink raw reply
* [PATCH 2/7] skge: changing MTU while running causes problems
From: Stephen Hemminger @ 2007-10-16 19:15 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
In-Reply-To: <20071016191548.447710749@linux-foundation.org>
[-- Attachment #1: skge-mtu.patch --]
[-- Type: text/plain, Size: 2702 bytes --]
Rather than bring network down/up when changing MTU,
only need to impact receiver.
Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
--- a/drivers/net/skge.c 2007-10-16 11:17:02.000000000 -0700
+++ b/drivers/net/skge.c 2007-10-16 11:22:41.000000000 -0700
@@ -2544,6 +2544,15 @@ static int skge_up(struct net_device *de
return err;
}
+/* stop receiver */
+static void skge_rx_stop(struct skge_hw *hw, int port)
+{
+ skge_write8(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_STOP);
+ skge_write32(hw, RB_ADDR(port ? Q_R2 : Q_R1, RB_CTRL),
+ RB_RST_SET|RB_DIS_OP_MD);
+ skge_write32(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_SET_RESET);
+}
+
static int skge_down(struct net_device *dev)
{
struct skge_port *skge = netdev_priv(dev);
@@ -2595,11 +2604,8 @@ static int skge_down(struct net_device *
/* Reset the RAM Buffer async Tx queue */
skge_write8(hw, RB_ADDR(port == 0 ? Q_XA1 : Q_XA2, RB_CTRL), RB_RST_SET);
- /* stop receiver */
- skge_write8(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_STOP);
- skge_write32(hw, RB_ADDR(port ? Q_R2 : Q_R1, RB_CTRL),
- RB_RST_SET|RB_DIS_OP_MD);
- skge_write32(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_SET_RESET);
+
+ skge_rx_stop(hw, port);
if (hw->chip_id == CHIP_ID_GENESIS) {
skge_write8(hw, SK_REG(port, TX_MFF_CTRL2), MFF_RST_SET);
@@ -2782,7 +2788,11 @@ static void skge_tx_timeout(struct net_d
static int skge_change_mtu(struct net_device *dev, int new_mtu)
{
+ struct skge_port *skge = netdev_priv(dev);
+ struct skge_hw *hw = skge->hw;
+ int port = skge->port;
int err;
+ u16 ctl, reg;
if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU)
return -EINVAL;
@@ -2792,13 +2802,40 @@ static int skge_change_mtu(struct net_de
return 0;
}
- skge_down(dev);
+ skge_write32(hw, B0_IMSK, 0);
+ dev->trans_start = jiffies; /* prevent tx timeout */
+ netif_stop_queue(dev);
+ napi_disable(&skge->napi);
+
+ ctl = gma_read16(hw, port, GM_GP_CTRL);
+ gma_write16(hw, port, GM_GP_CTRL, ctl & ~GM_GPCR_RX_ENA);
+
+ skge_rx_clean(skge);
+ skge_rx_stop(hw, port);
dev->mtu = new_mtu;
- err = skge_up(dev);
+ reg = GM_SMOD_VLAN_ENA | IPG_DATA_VAL(IPG_DATA_DEF);
+ if (new_mtu > 1500)
+ reg |= GM_SMOD_JUMBO_ENA;
+ gma_write16(hw, port, GM_SERIAL_MODE, reg);
+
+ skge_write8(hw, RB_ADDR(rxqaddr[port], RB_CTRL), RB_ENA_OP_MD);
+
+ err = skge_rx_fill(dev);
+ wmb();
+ if (!err)
+ skge_write8(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_START | CSR_IRQ_CL_F);
+ skge_write32(hw, B0_IMSK, hw->intr_mask);
+
if (err)
dev_close(dev);
+ else {
+ gma_write16(hw, port, GM_GP_CTRL, ctl);
+
+ napi_enable(&skge->napi);
+ netif_wake_queue(dev);
+ }
return err;
}
--
Stephen Hemminger <shemminger@linux-foundation.org>
^ permalink raw reply
* [PATCH 7/7] skge 1.12
From: Stephen Hemminger @ 2007-10-16 19:15 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
In-Reply-To: <20071016191548.447710749@linux-foundation.org>
[-- Attachment #1: skge-1.12 --]
[-- Type: text/plain, Size: 451 bytes --]
version update
Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
--- a/drivers/net/skge.c 2007-10-16 10:57:42.000000000 -0700
+++ b/drivers/net/skge.c 2007-10-16 10:57:50.000000000 -0700
@@ -44,7 +44,7 @@
#include "skge.h"
#define DRV_NAME "skge"
-#define DRV_VERSION "1.11"
+#define DRV_VERSION "1.12"
#define PFX DRV_NAME " "
#define DEFAULT_TX_RING_SIZE 128
--
Stephen Hemminger <shemminger@linux-foundation.org>
^ permalink raw reply
* [PATCH 4/7] skge: internal stats
From: Stephen Hemminger @ 2007-10-16 19:15 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
In-Reply-To: <20071016191548.447710749@linux-foundation.org>
[-- Attachment #1: skge-stats.patch --]
[-- Type: text/plain, Size: 4518 bytes --]
Use internal stats structure
Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
--- a/drivers/net/skge.c 2007-10-16 11:23:09.000000000 -0700
+++ b/drivers/net/skge.c 2007-10-16 11:23:14.000000000 -0700
@@ -445,15 +445,15 @@ static struct net_device_stats *skge_get
else
yukon_get_stats(skge, data);
- skge->net_stats.tx_bytes = data[0];
- skge->net_stats.rx_bytes = data[1];
- skge->net_stats.tx_packets = data[2] + data[4] + data[6];
- skge->net_stats.rx_packets = data[3] + data[5] + data[7];
- skge->net_stats.multicast = data[3] + data[5];
- skge->net_stats.collisions = data[10];
- skge->net_stats.tx_aborted_errors = data[12];
+ dev->stats.tx_bytes = data[0];
+ dev->stats.rx_bytes = data[1];
+ dev->stats.tx_packets = data[2] + data[4] + data[6];
+ dev->stats.rx_packets = data[3] + data[5] + data[7];
+ dev->stats.multicast = data[3] + data[5];
+ dev->stats.collisions = data[10];
+ dev->stats.tx_aborted_errors = data[12];
- return &skge->net_stats;
+ return &dev->stats;
}
static void skge_get_strings(struct net_device *dev, u32 stringset, u8 *data)
@@ -1684,12 +1684,13 @@ static void genesis_get_stats(struct skg
static void genesis_mac_intr(struct skge_hw *hw, int port)
{
- struct skge_port *skge = netdev_priv(hw->dev[port]);
+ struct net_device *dev = hw->dev[port];
+ struct skge_port *skge = netdev_priv(dev);
u16 status = xm_read16(hw, port, XM_ISRC);
if (netif_msg_intr(skge))
printk(KERN_DEBUG PFX "%s: mac interrupt status 0x%x\n",
- skge->netdev->name, status);
+ dev->name, status);
if (hw->phy_type == SK_PHY_XMAC && (status & XM_IS_INP_ASS)) {
xm_link_down(hw, port);
@@ -1698,12 +1699,12 @@ static void genesis_mac_intr(struct skge
if (status & XM_IS_TXF_UR) {
xm_write32(hw, port, XM_MODE, XM_MD_FTF);
- ++skge->net_stats.tx_fifo_errors;
+ ++dev->stats.tx_fifo_errors;
}
if (status & XM_IS_RXF_OV) {
xm_write32(hw, port, XM_MODE, XM_MD_FRF);
- ++skge->net_stats.rx_fifo_errors;
+ ++dev->stats.rx_fifo_errors;
}
}
@@ -2200,12 +2201,12 @@ static void yukon_mac_intr(struct skge_h
dev->name, status);
if (status & GM_IS_RX_FF_OR) {
- ++skge->net_stats.rx_fifo_errors;
+ ++dev->stats.rx_fifo_errors;
skge_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_CLI_RX_FO);
}
if (status & GM_IS_TX_FF_UR) {
- ++skge->net_stats.tx_fifo_errors;
+ ++dev->stats.tx_fifo_errors;
skge_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_CLI_TX_FU);
}
@@ -3039,18 +3040,18 @@ error:
if (skge->hw->chip_id == CHIP_ID_GENESIS) {
if (status & (XMR_FS_RUNT|XMR_FS_LNG_ERR))
- skge->net_stats.rx_length_errors++;
+ dev->stats.rx_length_errors++;
if (status & XMR_FS_FRA_ERR)
- skge->net_stats.rx_frame_errors++;
+ dev->stats.rx_frame_errors++;
if (status & XMR_FS_FCS_ERR)
- skge->net_stats.rx_crc_errors++;
+ dev->stats.rx_crc_errors++;
} else {
if (status & (GMR_FS_LONG_ERR|GMR_FS_UN_SIZE))
- skge->net_stats.rx_length_errors++;
+ dev->stats.rx_length_errors++;
if (status & GMR_FS_FRAGMENT)
- skge->net_stats.rx_frame_errors++;
+ dev->stats.rx_frame_errors++;
if (status & GMR_FS_CRC_ERR)
- skge->net_stats.rx_crc_errors++;
+ dev->stats.rx_crc_errors++;
}
resubmit:
@@ -3148,10 +3149,7 @@ static void skge_mac_parity(struct skge_
{
struct net_device *dev = hw->dev[port];
- if (dev) {
- struct skge_port *skge = netdev_priv(dev);
- ++skge->net_stats.tx_heartbeat_errors;
- }
+ ++dev->stats.tx_heartbeat_errors;
if (hw->chip_id == CHIP_ID_GENESIS)
skge_write16(hw, SK_REG(port, TX_MFF_CTRL1),
@@ -3304,9 +3302,7 @@ static irqreturn_t skge_intr(int irq, vo
skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_TX1);
if (status & IS_PA_TO_RX1) {
- struct skge_port *skge = netdev_priv(hw->dev[0]);
-
- ++skge->net_stats.rx_over_errors;
+ ++hw->dev[0]->stats.rx_over_errors;
skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_RX1);
}
@@ -3323,7 +3319,7 @@ static irqreturn_t skge_intr(int irq, vo
}
if (status & IS_PA_TO_RX2) {
- ++skge->net_stats.rx_over_errors;
+ ++hw->dev[1]->stats.rx_over_errors;
skge_write16(hw, B3_PA_CTRL, PA_CLR_TO_RX2);
}
--- a/drivers/net/skge.h 2007-10-16 11:23:09.000000000 -0700
+++ b/drivers/net/skge.h 2007-10-16 11:23:14.000000000 -0700
@@ -2467,8 +2467,6 @@ struct skge_port {
void *mem; /* PCI memory for rings */
dma_addr_t dma;
unsigned long mem_size;
-
- struct net_device_stats net_stats;
};
--
Stephen Hemminger <shemminger@linux-foundation.org>
^ permalink raw reply
* [PATCH 6/7] skge: add a debug interface
From: Stephen Hemminger @ 2007-10-16 19:15 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
In-Reply-To: <20071016191548.447710749@linux-foundation.org>
[-- Attachment #1: skge-debug.patch --]
[-- Type: text/plain, Size: 5412 bytes --]
Add a debugfs interface to look at internal ring state.
Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
---
drivers/net/Kconfig | 10 +++
drivers/net/skge.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++
drivers/net/skge.h | 3 +
3 files changed, 156 insertions(+)
--- a/drivers/net/Kconfig 2007-10-16 10:55:13.000000000 -0700
+++ b/drivers/net/Kconfig 2007-10-16 10:57:42.000000000 -0700
@@ -2173,6 +2173,16 @@ config SKGE
To compile this driver as a module, choose M here: the module
will be called skge. This is recommended.
+config SKGE_DEBUG
+ bool "Debugging interface"
+ depends on SKGE && DEBUG_FS
+ help
+ This option adds the ability to dump driver state for debugging.
+ The file debugfs/skge/ethX displays the state of the internal
+ transmit and receive rings.
+
+ If unsure, say N.
+
config SKY2
tristate "SysKonnect Yukon2 support"
depends on PCI
--- a/drivers/net/skge.c 2007-10-16 10:57:37.000000000 -0700
+++ b/drivers/net/skge.c 2007-10-16 10:57:42.000000000 -0700
@@ -36,6 +36,8 @@
#include <linux/delay.h>
#include <linux/crc32.h>
#include <linux/dma-mapping.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
#include <linux/mii.h>
#include <asm/irq.h>
@@ -3676,6 +3678,145 @@ static int skge_reset(struct skge_hw *hw
return 0;
}
+
+#ifdef CONFIG_SKGE_DEBUG
+
+static struct dentry *skge_debug;
+
+static int skge_debug_show(struct seq_file *seq, void *v)
+{
+ struct net_device *dev = seq->private;
+ const struct skge_port *skge = netdev_priv(dev);
+ const struct skge_hw *hw = skge->hw;
+ const struct skge_element *e;
+
+ if (!netif_running(dev))
+ return -ENETDOWN;
+
+ seq_printf(seq, "IRQ src=%x mask=%x\n", skge_read32(hw, B0_ISRC),
+ skge_read32(hw, B0_IMSK));
+
+ seq_printf(seq, "Tx Ring: (%d)\n", skge_avail(&skge->tx_ring));
+ for (e = skge->tx_ring.to_clean; e != skge->tx_ring.to_use; e = e->next) {
+ const struct skge_tx_desc *t = e->desc;
+ seq_printf(seq, "%#x dma=%#x%08x %#x csum=%#x/%x/%x\n",
+ t->control, t->dma_hi, t->dma_lo, t->status,
+ t->csum_offs, t->csum_write, t->csum_start);
+ }
+
+ seq_printf(seq, "\nRx Ring: \n");
+ for (e = skge->rx_ring.to_clean; ; e = e->next) {
+ const struct skge_rx_desc *r = e->desc;
+
+ if (r->control & BMU_OWN)
+ break;
+
+ seq_printf(seq, "%#x dma=%#x%08x %#x %#x csum=%#x/%x\n",
+ r->control, r->dma_hi, r->dma_lo, r->status,
+ r->timestamp, r->csum1, r->csum1_start);
+ }
+
+ return 0;
+}
+
+static int skge_debug_open(struct inode *inode, struct file *file)
+{
+ return single_open(file, skge_debug_show, inode->i_private);
+}
+
+static const struct file_operations skge_debug_fops = {
+ .owner = THIS_MODULE,
+ .open = skge_debug_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+/*
+ * Use network device events to create/remove/rename
+ * debugfs file entries
+ */
+static int skge_device_event(struct notifier_block *unused,
+ unsigned long event, void *ptr)
+{
+ struct net_device *dev = ptr;
+ struct skge_port *skge;
+ struct dentry *d;
+
+ if (dev->open != &skge_up || !skge_debug)
+ goto done;
+
+ skge = netdev_priv(dev);
+ switch(event) {
+ case NETDEV_CHANGENAME:
+ if (skge->debugfs) {
+ d = debugfs_rename(skge_debug, skge->debugfs,
+ skge_debug, dev->name);
+ if (d)
+ skge->debugfs = d;
+ else {
+ pr_info(PFX "%s: rename failed\n", dev->name);
+ debugfs_remove(skge->debugfs);
+ }
+ }
+ break;
+
+ case NETDEV_GOING_DOWN:
+ if (skge->debugfs) {
+ debugfs_remove(skge->debugfs);
+ skge->debugfs = NULL;
+ }
+ break;
+
+ case NETDEV_UP:
+ d = debugfs_create_file(dev->name, S_IRUGO,
+ skge_debug, dev,
+ &skge_debug_fops);
+ if (!d || IS_ERR(d))
+ pr_info(PFX "%s: debugfs create failed\n",
+ dev->name);
+ else
+ skge->debugfs = d;
+ break;
+ }
+
+done:
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block skge_notifier = {
+ .notifier_call = skge_device_event,
+};
+
+
+static __init void skge_debug_init(void)
+{
+ struct dentry *ent;
+
+ ent = debugfs_create_dir("skge", NULL);
+ if (!ent || IS_ERR(ent)) {
+ pr_info(PFX "debugfs create directory failed\n");
+ return;
+ }
+
+ skge_debug = ent;
+ register_netdevice_notifier(&skge_notifier);
+}
+
+static __exit void skge_debug_cleanup(void)
+{
+ if (skge_debug) {
+ unregister_netdevice_notifier(&skge_notifier);
+ debugfs_remove(skge_debug);
+ skge_debug = NULL;
+ }
+}
+
+#else
+#define skge_debug_init()
+#define skge_debug_cleanup()
+#endif
+
/* Initialize network device */
static struct net_device *skge_devinit(struct skge_hw *hw, int port,
int highmem)
@@ -4040,12 +4181,14 @@ static struct pci_driver skge_driver = {
static int __init skge_init_module(void)
{
+ skge_debug_init();
return pci_register_driver(&skge_driver);
}
static void __exit skge_cleanup_module(void)
{
pci_unregister_driver(&skge_driver);
+ skge_debug_cleanup();
}
module_init(skge_init_module);
--- a/drivers/net/skge.h 2007-10-16 10:57:37.000000000 -0700
+++ b/drivers/net/skge.h 2007-10-16 10:57:42.000000000 -0700
@@ -2469,6 +2469,9 @@ struct skge_port {
void *mem; /* PCI memory for rings */
dma_addr_t dma;
unsigned long mem_size;
+#ifdef CONFIG_SKGE_DEBUG
+ struct dentry *debugfs;
+#endif
};
--
Stephen Hemminger <shemminger@linux-foundation.org>
^ permalink raw reply
* [PATCH 5/7] skge: eeprom support
From: Stephen Hemminger @ 2007-10-16 19:15 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
In-Reply-To: <20071016191548.447710749@linux-foundation.org>
[-- Attachment #1: skge-eeprom.patch --]
[-- Type: text/plain, Size: 4201 bytes --]
Add ability to read/write EEPROM
Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
---
drivers/net/skge.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++
drivers/net/skge.h | 6 ++-
2 files changed, 102 insertions(+), 2 deletions(-)
--- a/drivers/net/skge.c 2007-10-16 11:23:14.000000000 -0700
+++ b/drivers/net/skge.c 2007-10-16 11:23:17.000000000 -0700
@@ -59,6 +59,9 @@
#define BLINK_MS 250
#define LINK_HZ HZ
+#define SKGE_EEPROM_MAGIC 0x9933aabb
+
+
MODULE_DESCRIPTION("SysKonnect Gigabit Ethernet driver");
MODULE_AUTHOR("Stephen Hemminger <shemminger@linux-foundation.org>");
MODULE_LICENSE("GPL");
@@ -798,6 +801,98 @@ static int skge_phys_id(struct net_devic
return 0;
}
+static int skge_get_eeprom_len(struct net_device *dev)
+{
+ struct skge_port *skge = netdev_priv(dev);
+ u32 reg2;
+
+ pci_read_config_dword(skge->hw->pdev, PCI_DEV_REG2, ®2);
+ return 1 << ( ((reg2 & PCI_VPD_ROM_SZ) >> 14) + 8);
+}
+
+static u32 skge_vpd_read(struct pci_dev *pdev, int cap, u16 offset)
+{
+ u32 val;
+
+ pci_write_config_word(pdev, cap + PCI_VPD_ADDR, offset);
+
+ do {
+ pci_read_config_word(pdev, cap + PCI_VPD_ADDR, &offset);
+ } while (!(offset & PCI_VPD_ADDR_F));
+
+ pci_read_config_dword(pdev, cap + PCI_VPD_DATA, &val);
+ return val;
+}
+
+static void skge_vpd_write(struct pci_dev *pdev, int cap, u16 offset, u32 val)
+{
+ pci_write_config_dword(pdev, cap + PCI_VPD_DATA, val);
+ pci_write_config_word(pdev, cap + PCI_VPD_ADDR,
+ offset | PCI_VPD_ADDR_F);
+
+ do {
+ pci_read_config_word(pdev, cap + PCI_VPD_ADDR, &offset);
+ } while (offset & PCI_VPD_ADDR_F);
+}
+
+static int skge_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
+ u8 *data)
+{
+ struct skge_port *skge = netdev_priv(dev);
+ struct pci_dev *pdev = skge->hw->pdev;
+ int cap = pci_find_capability(pdev, PCI_CAP_ID_VPD);
+ int length = eeprom->len;
+ u16 offset = eeprom->offset;
+
+ if (!cap)
+ return -EINVAL;
+
+ eeprom->magic = SKGE_EEPROM_MAGIC;
+
+ while (length > 0) {
+ u32 val = skge_vpd_read(pdev, cap, offset);
+ int n = min_t(int, length, sizeof(val));
+
+ memcpy(data, &val, n);
+ length -= n;
+ data += n;
+ offset += n;
+ }
+ return 0;
+}
+
+static int skge_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
+ u8 *data)
+{
+ struct skge_port *skge = netdev_priv(dev);
+ struct pci_dev *pdev = skge->hw->pdev;
+ int cap = pci_find_capability(pdev, PCI_CAP_ID_VPD);
+ int length = eeprom->len;
+ u16 offset = eeprom->offset;
+
+ if (!cap)
+ return -EINVAL;
+
+ if (eeprom->magic != SKGE_EEPROM_MAGIC)
+ return -EINVAL;
+
+ while (length > 0) {
+ u32 val;
+ int n = min_t(int, length, sizeof(val));
+
+ if (n < sizeof(val))
+ val = skge_vpd_read(pdev, cap, offset);
+ memcpy(&val, data, n);
+
+ skge_vpd_write(pdev, cap, offset, val);
+
+ length -= n;
+ data += n;
+ offset += n;
+ }
+ return 0;
+}
+
static const struct ethtool_ops skge_ethtool_ops = {
.get_settings = skge_get_settings,
.set_settings = skge_set_settings,
@@ -810,6 +905,9 @@ static const struct ethtool_ops skge_eth
.set_msglevel = skge_set_msglevel,
.nway_reset = skge_nway_reset,
.get_link = ethtool_op_get_link,
+ .get_eeprom_len = skge_get_eeprom_len,
+ .get_eeprom = skge_get_eeprom,
+ .set_eeprom = skge_set_eeprom,
.get_ringparam = skge_get_ring_param,
.set_ringparam = skge_set_ring_param,
.get_pauseparam = skge_get_pauseparam,
--- a/drivers/net/skge.h 2007-10-16 11:23:14.000000000 -0700
+++ b/drivers/net/skge.h 2007-10-16 11:23:17.000000000 -0700
@@ -1,5 +1,5 @@
/*
- * Definitions for the new Marvell Yukon / SysKonenct driver.
+ * Definitions for the new Marvell Yukon / SysKonnect driver.
*/
#ifndef _SKGE_H
#define _SKGE_H
@@ -8,8 +8,10 @@
#define PCI_DEV_REG1 0x40
#define PCI_PHY_COMA 0x8000000
#define PCI_VIO 0x2000000
+
#define PCI_DEV_REG2 0x44
-#define PCI_REV_DESC 0x4
+#define PCI_VPD_ROM_SZ 7L<<14 /* VPD ROM size 0=256, 1=512, ... */
+#define PCI_REV_DESC 1<<2 /* Reverse Descriptor bytes */
#define PCI_STATUS_ERROR_BITS (PCI_STATUS_DETECTED_PARITY | \
PCI_STATUS_SIG_SYSTEM_ERROR | \
--
Stephen Hemminger <shemminger@linux-foundation.org>
^ permalink raw reply
* [PATCH 3/7] skge: XM PHY handling fixes
From: Stephen Hemminger @ 2007-10-16 19:15 UTC (permalink / raw)
To: Jeff Garzik; +Cc: netdev
In-Reply-To: <20071016191548.447710749@linux-foundation.org>
[-- Attachment #1: skge-xm-phy-poll.patch --]
[-- Type: text/plain, Size: 6893 bytes --]
Change how PHY is managed on SysKonnect fibre based boards.
Poll for PHY coming up 1 per second, but use interrupt to detect loss.
Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
--- a/drivers/net/skge.c 2007-10-16 12:14:08.000000000 -0700
+++ b/drivers/net/skge.c 2007-10-16 12:14:09.000000000 -0700
@@ -57,7 +57,7 @@
#define TX_WATCHDOG (5 * HZ)
#define NAPI_WEIGHT 64
#define BLINK_MS 250
-#define LINK_HZ (HZ/2)
+#define LINK_HZ HZ
MODULE_DESCRIPTION("SysKonnect Gigabit Ethernet driver");
MODULE_AUTHOR("Stephen Hemminger <shemminger@linux-foundation.org>");
@@ -995,19 +995,15 @@ static void xm_link_down(struct skge_hw
{
struct net_device *dev = hw->dev[port];
struct skge_port *skge = netdev_priv(dev);
- u16 cmd, msk;
+ u16 cmd = xm_read16(hw, port, XM_MMU_CMD);
- if (hw->phy_type == SK_PHY_XMAC) {
- msk = xm_read16(hw, port, XM_IMSK);
- msk |= XM_IS_INP_ASS | XM_IS_LIPA_RC | XM_IS_RX_PAGE | XM_IS_AND;
- xm_write16(hw, port, XM_IMSK, msk);
- }
+ xm_write16(hw, port, XM_IMSK, XM_IMSK_DISABLE);
- cmd = xm_read16(hw, port, XM_MMU_CMD);
cmd &= ~(XM_MMU_ENA_RX | XM_MMU_ENA_TX);
xm_write16(hw, port, XM_MMU_CMD, cmd);
+
/* dummy read to ensure writing */
- (void) xm_read16(hw, port, XM_MMU_CMD);
+ xm_read16(hw, port, XM_MMU_CMD);
if (netif_carrier_ok(dev))
skge_link_down(skge);
@@ -1103,7 +1099,7 @@ static void genesis_reset(struct skge_hw
/* reset the statistics module */
xm_write32(hw, port, XM_GP_PORT, XM_GP_RES_STAT);
- xm_write16(hw, port, XM_IMSK, 0xffff); /* disable XMAC IRQs */
+ xm_write16(hw, port, XM_IMSK, XM_IMSK_DISABLE);
xm_write32(hw, port, XM_MODE, 0); /* clear Mode Reg */
xm_write16(hw, port, XM_TX_CMD, 0); /* reset TX CMD Reg */
xm_write16(hw, port, XM_RX_CMD, 0); /* reset RX CMD Reg */
@@ -1141,7 +1137,7 @@ static void bcom_check_link(struct skge_
u16 status;
/* read twice because of latch */
- (void) xm_phy_read(hw, port, PHY_BCOM_STAT);
+ xm_phy_read(hw, port, PHY_BCOM_STAT);
status = xm_phy_read(hw, port, PHY_BCOM_STAT);
if ((status & PHY_ST_LSYNC) == 0) {
@@ -1342,7 +1338,7 @@ static void xm_phy_init(struct skge_port
mod_timer(&skge->link_timer, jiffies + LINK_HZ);
}
-static void xm_check_link(struct net_device *dev)
+static int xm_check_link(struct net_device *dev)
{
struct skge_port *skge = netdev_priv(dev);
struct skge_hw *hw = skge->hw;
@@ -1350,25 +1346,25 @@ static void xm_check_link(struct net_dev
u16 status;
/* read twice because of latch */
- (void) xm_phy_read(hw, port, PHY_XMAC_STAT);
+ xm_phy_read(hw, port, PHY_XMAC_STAT);
status = xm_phy_read(hw, port, PHY_XMAC_STAT);
if ((status & PHY_ST_LSYNC) == 0) {
xm_link_down(hw, port);
- return;
+ return 0;
}
if (skge->autoneg == AUTONEG_ENABLE) {
u16 lpa, res;
if (!(status & PHY_ST_AN_OVER))
- return;
+ return 0;
lpa = xm_phy_read(hw, port, PHY_XMAC_AUNE_LP);
if (lpa & PHY_B_AN_RF) {
printk(KERN_NOTICE PFX "%s: remote fault\n",
dev->name);
- return;
+ return 0;
}
res = xm_phy_read(hw, port, PHY_XMAC_RES_ABI);
@@ -1384,7 +1380,7 @@ static void xm_check_link(struct net_dev
default:
printk(KERN_NOTICE PFX "%s: duplex mismatch\n",
dev->name);
- return;
+ return 0;
}
/* We are using IEEE 802.3z/D5.0 Table 37-4 */
@@ -1408,11 +1404,14 @@ static void xm_check_link(struct net_dev
if (!netif_carrier_ok(dev))
genesis_link_up(skge);
+ return 1;
}
/* Poll to check for link coming up.
+ *
* Since internal PHY is wired to a level triggered pin, can't
- * get an interrupt when carrier is detected.
+ * get an interrupt when carrier is detected, need to poll for
+ * link coming up.
*/
static void xm_link_timer(unsigned long arg)
{
@@ -1420,29 +1419,35 @@ static void xm_link_timer(unsigned long
struct net_device *dev = skge->netdev;
struct skge_hw *hw = skge->hw;
int port = skge->port;
+ int i;
+ unsigned long flags;
if (!netif_running(dev))
return;
- if (netif_carrier_ok(dev)) {
+ spin_lock_irqsave(&hw->phy_lock, flags);
+
+ /*
+ * Verify that the link by checking GPIO register three times.
+ * This pin has the signal from the link_sync pin connected to it.
+ */
+ for (i = 0; i < 3; i++) {
+ if (xm_read16(hw, port, XM_GP_PORT) & XM_GP_INP_ASS)
+ goto link_down;
+ }
+
+ /* Re-enable interrupt to detect link down */
+ if (xm_check_link(dev)) {
+ u16 msk = xm_read16(hw, port, XM_IMSK);
+ msk &= ~XM_IS_INP_ASS;
+ xm_write16(hw, port, XM_IMSK, msk);
xm_read16(hw, port, XM_ISRC);
- if (!(xm_read16(hw, port, XM_ISRC) & XM_IS_INP_ASS))
- goto nochange;
} else {
- if (xm_read32(hw, port, XM_GP_PORT) & XM_GP_INP_ASS)
- goto nochange;
- xm_read16(hw, port, XM_ISRC);
- if (xm_read16(hw, port, XM_ISRC) & XM_IS_INP_ASS)
- goto nochange;
+link_down:
+ mod_timer(&skge->link_timer,
+ round_jiffies(jiffies + LINK_HZ));
}
-
- spin_lock(&hw->phy_lock);
- xm_check_link(dev);
- spin_unlock(&hw->phy_lock);
-
-nochange:
- if (netif_running(dev))
- mod_timer(&skge->link_timer, jiffies + LINK_HZ);
+ spin_unlock_irqrestore(&hw->phy_lock, flags);
}
static void genesis_mac_init(struct skge_hw *hw, int port)
@@ -1686,14 +1691,16 @@ static void genesis_mac_intr(struct skge
printk(KERN_DEBUG PFX "%s: mac interrupt status 0x%x\n",
skge->netdev->name, status);
- if (hw->phy_type == SK_PHY_XMAC &&
- (status & (XM_IS_INP_ASS | XM_IS_LIPA_RC)))
- xm_link_down(hw, port);
+ if (hw->phy_type == SK_PHY_XMAC && (status & XM_IS_INP_ASS)) {
+ xm_link_down(hw, port);
+ mod_timer(&skge->link_timer, jiffies + 1);
+ }
if (status & XM_IS_TXF_UR) {
xm_write32(hw, port, XM_MODE, XM_MD_FTF);
++skge->net_stats.tx_fifo_errors;
}
+
if (status & XM_IS_RXF_OV) {
xm_write32(hw, port, XM_MODE, XM_MD_FRF);
++skge->net_stats.rx_fifo_errors;
@@ -1753,11 +1760,12 @@ static void genesis_link_up(struct skge_
}
xm_write32(hw, port, XM_MODE, mode);
- msk = XM_DEF_MSK;
- if (hw->phy_type != SK_PHY_XMAC)
- msk |= XM_IS_INP_ASS; /* disable GP0 interrupt bit */
+ /* Turn on detection of Tx underrun, Rx overrun */
+ msk = xm_read16(hw, port, XM_IMSK);
+ msk &= ~(XM_IS_RXF_OV | XM_IS_TXF_UR);
xm_write16(hw, port, XM_IMSK, msk);
+
xm_read16(hw, port, XM_ISRC);
/* get MMU Command Reg. */
--- a/drivers/net/skge.h 2007-10-16 10:57:54.000000000 -0700
+++ b/drivers/net/skge.h 2007-10-16 12:14:09.000000000 -0700
@@ -2191,11 +2191,9 @@ enum {
XM_IS_TXF_UR = 1<<2, /* Bit 2: Transmit FIFO Underrun */
XM_IS_TX_COMP = 1<<1, /* Bit 1: Frame Tx Complete */
XM_IS_RX_COMP = 1<<0, /* Bit 0: Frame Rx Complete */
-};
-
-#define XM_DEF_MSK (~(XM_IS_INP_ASS | XM_IS_LIPA_RC | \
- XM_IS_RXF_OV | XM_IS_TXF_UR))
+ XM_IMSK_DISABLE = 0xffff,
+};
/* XM_HW_CFG 16 bit r/w Hardware Config Register */
enum {
--
Stephen Hemminger <shemminger@linux-foundation.org>
^ permalink raw reply
* Re: [PATCH] Disable polling in rtl8169_suspend() to prevent race with rtl8169_interrupt()
From: Karsten Wiese @ 2007-10-16 19:27 UTC (permalink / raw)
To: romieu; +Cc: netdev
In-Reply-To: <200710161846.52509.fzu@wemgehoertderstaat.de>
Am Dienstag, 16. Oktober 2007 schrieb Karsten Wiese:
> Hi,
>
> Sometimes (~ 1 in 10) after suspend to disk my r8169 nic doesn't work and a
> "r8169: eth0: link down" gets mingled up with those suspend messages.
> First tests show nothing bad, so maybe this patch really helps.
> Will post again, if it doesn't.
>
> Karsten
> ------------------>
>
> Disable polling in rtl8169_suspend() to prevent race with rtl8169_interrupt()
>
> rtl8169_interrupt() is called during polling.
> Without patch, rtl8169_interrupt() could run after rtl8169_asic_down(),
> causing a disabled link state being saved later in rtl8169_suspend() by
> pci_save_state().
> netif_stop_queue() can go as it is called by netif_device_detach().
>
> Signed-off-by: Karsten Wiese <fzu@wemgehoertderstaat.de>
Forgot to say: patch is against 2.6.23. Stable material, if it gets an ACK.
The BUG happens since months here, if not since I hibernate this pc.
git HEAD would need a similar fix I think, haven't tried yet.
Karsten
^ permalink raw reply
* RE: Multicast problem
From: David Stevens @ 2007-10-16 19:40 UTC (permalink / raw)
To: Joakim Tjernlund; +Cc: 'Netdev'
In-Reply-To: <002601c81025$ee0af8f0$04ac10ac@Jocke>
>
> hmm maybe I misunderstand here, but the we are trying to make OSPF work
> in 2.6 and the problem appears to be that our board does not pick up
> multicasts.
> Is icmp_echo_ignore_broadcasts=0 required to make OSPF work in 2.6?
>
> Jocke
>
No, it's required to make "ping" to a multicast address
work, which is what your mail said was the problem. :-) "ping"
uses ICMP, OSPF does not.
If you receive ping responses with ignore_broadcasts=0
and not in promiscuous mode, then the problem may be a smart
switch that doesn't understand IGMPv3. In that case, you
can try:
sysctl -w net.ipv4.conf.all.force_igmp_version=2
You can also, of course, check /proc/net/igmp and
/proc/net/dev_mcast to make sure you've joined the OSPF
multicast address on the interface(s) you care about.
+-DLS
^ permalink raw reply
* Re: MSI interrupts and disable_irq
From: Jeff Garzik @ 2007-10-16 19:44 UTC (permalink / raw)
To: Yinghai Lu
Cc: Manfred Spraul, Ayaz Abdulla, nedev, Linux Kernel Mailing List,
David Miller, Andrew Morton
In-Reply-To: <86802c440710161059x17fdb4f2sb1b9582d64a883f9@mail.gmail.com>
Yinghai Lu wrote:
> On 10/16/07, Jeff Garzik <jgarzik@pobox.com> wrote:
>> Yinghai Lu wrote:
>>> On 10/15/07, Jeff Garzik <jgarzik@pobox.com> wrote:
>>>> Manfred Spraul wrote:
>>>>> Jeff Garzik wrote:
>>>>>> I think the scenario you outline is an illustration of the approach's
>>>>>> fragility: disable_irq() is a heavy hammer that originated with INTx,
>>>>>> and it relies on a chip-specific disable method (kernel/irq/manage.c)
>>>>>> that practically guarantees behavior will vary across MSI/INTx/etc.
>>>>>>
>>>>> I checked the code: IRQ_DISABLE is implemented in software, i.e.
>>>>> handle_level_irq() only calls handle_IRQ_event() [and then the nic irq
>>>>> handler] if IRQ_DISABLE is not set.
>>>>> OTHO: The last trace looks as if nv_do_nic_poll() is interrupted by an irq.
>>>>>
>>>>> Perhaps something corrupts dev->irq? The irq is requested with
>>>>> request_irq(np->pci_dev->irq, handler, IRQF_SHARED, dev->name, dev)
>>>>> and disabled with
>>>>> disable_irq_lockdep(dev->irq);
>>>>>
>>>>> Someone around with a MSI capable board? The forcedeth driver does
>>>>> dev->irq = pci_dev->irq
>>>>> in nv_probe(), especially before pci_enable_msi().
>>>>> Does pci_enable_msi() change pci_dev->irq? Then we would disable the
>>>>> wrong interrupt....
>>>> Remember, fundamentally MSI-X is a one-to-many relationship, when you
>>>> consider a single PCI device might have multiple vectors.
>>> msi-x is using other entry
>>>
>>> if (np->msi_flags & NV_MSI_X_ENABLED)
>>>
>>> enable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector);
>> Correct, but the overall point was that MSI-X conceptually conflicts
>> with the existing "lockless" disable_irq() schedule, which was written
>> when there was a one-one relationship between irq, PCI device, and work
>> to be done.
>
> Can I use your new driver with RHEL 5 or RHEL 5.1?
Not without modification, since it depends on the napi_struct work
currently in torvalds/linux-2.6.git.
But I am currently rewriting the fe-lock yet again, and most of those
changes can be applied to pre-napi_struct forcedeth.
Jeff
^ permalink raw reply
* RE: Multicast problem
From: David Stevens @ 2007-10-16 19:46 UTC (permalink / raw)
To: Joakim Tjernlund; +Cc: 'Netdev', netdev-owner
In-Reply-To: <002501c8101a$6005dc10$04ac10ac@Jocke>
> dev_mcast and igmp looks:
> root@Challenger:/proc/net# m dev_mcast
> 1 eth0 1 0 01005e000001
> 2 eth1 1 0 01005e000001
These are the hardware multicast addresses for
224.0.0.1 (so, correct).
> root@Challenger:/proc/net# m igmp
> Idx Device : Count Querier Group Users Timer Reporter
> 1 eth0 : 1 V3
> E0000001 1 0:00000000 0
> 2 eth1 : 1 V2
> E0000001 1 0:00000000 0
> 4 lo : 0 V3
> E0000001 1 0:00000000 0
...and these are the group memberships for 224.0.0.1, so
also correct. This should receive and answer pings to 224.0.0.1
as long as you don't have ICMP set to ignore broadcasts. You should
not need to put the device in promiscuous mode for a ping of
224.0.0.1 to work, so if you do, then you have a driver, device
or switch problem.
None of these interfaces have memberships in the OSPF groups,
so if you had OSPF running when you did this, it didn't join.
+-DLS
^ permalink raw reply
* [PATCH,RFC] Marvell Orion SoC ethernet driver
From: Lennert Buytenhek @ 2007-10-16 19:28 UTC (permalink / raw)
To: netdev; +Cc: tzachi, nico
Attached is a driver for the built-in 10/100/1000 ethernet MAC in
the Marvell Orion series of ARM SoCs.
This ethernet MAC supports the MII/GMII/RGMII PCS interface types,
and offers a pretty standard set of MAC features, such as RX/TX
checksum offload, scatter-gather, interrupt coalescing, PAUSE,
jumbo frames, etc.
This patch is against 2.6.22.1, and the driver has not yet been
adapted to the recent NAPI changes. Nevertheless, we wanted to
get this out there for feedback/review.
Comments appreciated!
Signed-off-by: Tzachi Perelstein <tzachi@marvell.com>
Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
Signed-off-by: Nicolas Pitre <nico@marvell.com>
Index: linux-2.6.22.1-orion.3.3/drivers/net/Kconfig
===================================================================
--- linux-2.6.22.1-orion.3.3.orig/drivers/net/Kconfig
+++ linux-2.6.22.1-orion.3.3/drivers/net/Kconfig
@@ -1995,6 +1995,12 @@ config E1000_DISABLE_PACKET_SPLIT
source "drivers/net/ixp2000/Kconfig"
+config ORION_ETH
+ tristate "Marvell Orion Gigabit Ethernet support"
+ depends on ARCH_ORION
+ ---help---
+ This driver supports the Orion's on chip gigabit ethernet port.
+
config MYRI_SBUS
tristate "MyriCOM Gigabit Ethernet support"
depends on SBUS
Index: linux-2.6.22.1-orion.3.3/drivers/net/Makefile
===================================================================
--- linux-2.6.22.1-orion.3.3.orig/drivers/net/Makefile
+++ linux-2.6.22.1-orion.3.3/drivers/net/Makefile
@@ -221,6 +221,7 @@ obj-$(CONFIG_HAMRADIO) += hamradio/
obj-$(CONFIG_IRDA) += irda/
obj-$(CONFIG_ETRAX_ETHERNET) += cris/
obj-$(CONFIG_ENP2611_MSF_NET) += ixp2000/
+obj-$(CONFIG_ORION_ETH) += orion_eth.o
obj-$(CONFIG_NETCONSOLE) += netconsole.o
Index: linux-2.6.22.1-orion.3.3/drivers/net/orion_eth.c
===================================================================
--- /dev/null
+++ linux-2.6.22.1-orion.3.3/drivers/net/orion_eth.c
@@ -0,0 +1,1506 @@
+/*
+ * Marvell Orion Gigabit Ethernet network device driver
+ *
+ * Maintainer: Tzachi Perelstein <tzachi@marvell.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2. This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/dma-mapping.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/netdevice.h>
+#include <linux/mii.h>
+#include <linux/etherdevice.h>
+#include <linux/ethtool.h>
+#include <linux/ip.h>
+#include <linux/in.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/delay.h>
+#include <asm/arch/platform.h>
+#include <asm/io.h>
+
+#define DRV_NAME "orion-eth"
+#define DRV_VERSION "0.3"
+
+/*****************************************************************************
+ * Orion Gigabit Ethernet Registers
+ ****************************************************************************/
+#define rdl(op, off) __raw_readl((op)->base_addr + (off))
+#define wrl(op, off, val) __raw_writel((val), (op)->base_addr + (off))
+#define wrb(op, off, val) __raw_writeb((val), (op)->base_addr + (off))
+
+/*
+ * Unit Global Registers
+ */
+#define ETH_PHY_ID 0x000
+#define ETH_SMI 0x004
+#define ETH_CAUSE 0x080
+#define ETH_MASK 0x084
+#define ETH_CTRL 0x0b0
+
+/*
+ * Port Registers
+ */
+#define PORT_CONF 0x400
+#define PORT_CONF_EXT 0x404
+#define PORT_MAC_LO 0x414
+#define PORT_MAC_HI 0x418
+#define PORT_SDMA 0x41c
+#define PORT_SERIAL 0x43c
+#define PORT_STAT 0x444
+#define PORT_TXQ_CMD 0x448
+#define PORT_MTU 0x458
+#define PORT_CAUSE 0x460
+#define PORT_CAUSE_EXT 0x464
+#define PORT_MASK 0x468
+#define PORT_MASK_EXT 0x46c
+#define PORT_TX_THRESH 0x474
+#define PORT_CURR_RXD 0x60c
+#define PORT_RXQ_CMD 0x680
+#define PORT_CURR_TXD 0x6c0
+#define PORT_MIB_BASE 0x1000
+#define PORT_MIB_SIZE 128
+#define PORT_SPEC_MCAST_BASE 0x1400
+#define PORT_SPEC_MCAST_SIZE 256
+#define PORT_OTHER_MCAST_BASE 0x1500
+#define PORT_OTHER_MCAST_SIZE 256
+#define PORT_UCAST_BASE 0x1600
+#define PORT_UCAST_SIZE 16
+
+/*
+ * ETH_SMI bits
+ */
+#define SMI_DEV_OFFS 16
+#define SMI_REG_OFFS 21
+#define SMI_READ (1 << 26)
+#define SMI_READ_VALID (1 << 27)
+#define SMI_BUSY (1 << 28)
+
+/*
+ * PORT_STAT bits
+ */
+#define STAT_LINK_UP (1 << 1)
+#define STAT_FULL_DUPLEX (1 << 2)
+#define STAT_SPEED_1000 (1 << 4)
+#define STAT_SPEED_100 (1 << 5)
+
+/*
+ * PORT_[T/R]XQ_CMD bits
+ */
+#define PORT_EN_TXQ0 1
+#define PORT_EN_RXQ0 1
+#define PORT_DIS_RXQ0 (1 << 8)
+#define PORT_DIS_TXQ0 (1 << 8)
+
+/*
+ * Descriptors bits
+ */
+#define TXD_ERR 1
+#define TXD_IP_NO_FRAG (1 << 10)
+#define TXD_IP_HDRLEN_OFFS 11
+#define TXD_L4_UDP (1 << 16)
+#define TXD_L4_CSUM (1 << 17)
+#define TXD_IP_CSUM (1 << 18)
+#define TXD_PAD (1 << 19)
+#define TXD_LAST (1 << 20)
+#define TXD_FRST (1 << 21)
+#define TXD_CRC (1 << 22)
+#define TXD_INT (1 << 23)
+#define TXD_DMA (1 << 31)
+
+#define RXD_ERR 1
+#define RXD_L4_CSUM_OFFS 3
+#define RXD_L4_CSUM_MASK (0xffff << 3)
+#define RXD_L4_NO_TYPE (1 << 22)
+#define RXD_IP_TYPE (1 << 24)
+#define RXD_IP_HDR_OK (1 << 25)
+#define RXD_LAST (1 << 26)
+#define RXD_FRST (1 << 27)
+#define RXD_INT (1 << 29)
+#define RXD_L4_CSUM_OK (1 << 30)
+#define RXD_DMA (1 << 31)
+
+/* RX descriptor buf_size field */
+#define RXD_IP_FRAG (1 << 2)
+#define RXD_SIZE_MASK 0xfff8
+
+/*
+ * Interrupt bits
+ */
+#define PIC_EXT (1 << 1)
+#define PIC_RX (1 << 2)
+#define PIC_RX_RES (1 << 11)
+#define PICE_TX 1
+#define PICE_PHY (1 << 16)
+#define PICE_LINK (1 << 20)
+
+#define RX_DESC_NR 128
+#define TX_DESC_NR 128
+#define MAX_PKT_SIZE 1536
+
+#define PIC_MASK (PIC_EXT | PIC_RX | PIC_RX_RES)
+#define PICE_MASK (PICE_TX | PICE_PHY | PICE_LINK)
+
+#define ORION_TX_CSUM_OFFLOAD
+#define ORION_RX_CSUM_OFFLOAD
+
+/*
+ * 2do:
+ * do not use ORION_TX_DONE_IN_TX unless you add orion_tx_done timer to
+ * avoid deadlock when netif_stop_queue was called due to unavailable txd
+ */
+#undef ORION_TX_DONE_IN_TX
+#ifdef ORION_TX_DONE_IN_TX
+#define TX_DONE_THRESH 16
+#endif
+
+struct rx_desc {
+ u32 cmd_sts;
+ u16 size;
+ u16 count;
+ u32 buf;
+ u32 next;
+};
+
+struct tx_desc {
+ u32 cmd_sts;
+ u16 l4i_chk;
+ u16 count;
+ u32 buf;
+ u32 next;
+};
+
+struct orion_priv {
+ unsigned long base_addr;
+
+ /*
+ * RX stuff
+ */
+ u32 rxd_used;
+ u32 rxd_curr;
+ u32 rxd_count;
+ u32 rxd_max_pending;
+ struct sk_buff *rx_skb[RX_DESC_NR];
+ struct rx_desc *rxd_base;
+ dma_addr_t rxd_base_dma;
+ spinlock_t rx_lock;
+ struct timer_list rx_fill_timer;
+
+ /*
+ * TX stuff
+ */
+ u32 txd_used;
+ u32 txd_curr;
+ u32 txd_count;
+ u32 txd_max_pending;
+ struct sk_buff *tx_skb[TX_DESC_NR];
+ struct tx_desc *txd_base;
+ dma_addr_t txd_base_dma;
+ spinlock_t tx_lock;
+
+ /*
+ * PHY stuff
+ */
+ struct mii_if_info mii;
+ spinlock_t mii_lock;
+
+ /*
+ * Statistics counters
+ */
+ struct net_device_stats stats;
+};
+
+/*****************************************************************************
+ * PHY access
+ ****************************************************************************/
+static int orion_mii_read(struct net_device *dev, int phy_id, int reg)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ int val, i;
+
+ spin_lock(&op->mii_lock);
+
+ /*
+ * Poll until not busy
+ */
+ for (i = 10000; i && (rdl(op, ETH_SMI) & SMI_BUSY); i--)
+ rmb();
+
+ if (i == 0) {
+ printk("orion-eth mii read busy timeout\n");
+ val = -1;
+ goto out;
+ }
+
+ /*
+ * Issue read command
+ */
+ wrl(op, ETH_SMI, (phy_id << SMI_DEV_OFFS) |
+ (reg << SMI_REG_OFFS) | SMI_READ);
+
+ /*
+ * Poll until data is ready
+ */
+ for (i = 10000; i && !(rdl(op, ETH_SMI) & SMI_READ_VALID); i--)
+ rmb();
+
+ if (i == 0) {
+ printk("orion-eth mii read busy timeout\n");
+ val = -1;
+ goto out;
+ }
+
+ /*
+ * Read data
+ */
+ val = rdl(op, ETH_SMI) & 0xffff;
+
+out:
+ spin_unlock(&op->mii_lock);
+ return val;
+}
+
+static void orion_mii_write(struct net_device *dev, int phy_id, int reg, int data)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ int i;
+
+ spin_lock(&op->mii_lock);
+
+ /*
+ * Poll until not busy
+ */
+ for (i = 10000; i && (rdl(op, ETH_SMI) & SMI_BUSY); i--)
+ rmb();
+
+ if (i == 0) {
+ printk("orion-eth mii write busy timeout\n");
+ goto out;
+ }
+
+ /*
+ * Issue write command
+ */
+ wrl(op, ETH_SMI, (phy_id << 16) | (reg << 21) | data);
+
+out:
+ spin_unlock(&op->mii_lock);
+}
+
+/*
+ * Called from orion_irq in interrupt context.
+ * Not going out to read PHY status, using Orion registers instead.
+ */
+static inline void orion_phy_link_change(struct net_device *dev)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ u32 stat = rdl(op, PORT_STAT);
+
+ if (!(stat & STAT_LINK_UP)) {
+ netif_carrier_off(dev);
+ netif_stop_queue(dev);
+ printk(KERN_NOTICE "%s: link down.\n", dev->name);
+ } else {
+ netif_carrier_on(dev);
+ netif_wake_queue(dev);
+ netif_poll_enable(dev);
+ printk(KERN_NOTICE "%s: link up, ", dev->name);
+ if (stat & STAT_FULL_DUPLEX)
+ printk("full duplex, ");
+ else
+ printk("half duplex, ");
+ if (stat & STAT_SPEED_1000)
+ printk("1000Mbps.\n");
+ else if (stat & STAT_SPEED_100)
+ printk("100Mbps\n");
+ else
+ printk("10Mbps\n");
+ }
+}
+
+/*****************************************************************************
+ * MAC address filtering
+ ****************************************************************************/
+static void orion_set_unicast(struct orion_priv *op, u8 *addr)
+{
+ int i;
+
+ /*
+ * Clear unicast table
+ */
+ for (i = 0; i < PORT_UCAST_SIZE; i += 4)
+ wrl(op, PORT_UCAST_BASE + i, 0);
+
+ /*
+ * Setup MAC addr registers
+ */
+ wrl(op, PORT_MAC_HI, (addr[0] << 24) | (addr[1] << 16) |
+ (addr[2] << 8) | addr[3]);
+ wrl(op, PORT_MAC_LO, (addr[4] << 8) | addr[5]);
+
+ /*
+ * Enable our entry in unicat table
+ */
+ wrb(op, PORT_UCAST_BASE + (addr[5] & 0xf), 1);
+}
+
+static void orion_set_promisc(struct orion_priv *op)
+{
+ int i;
+
+ /*
+ * Turn on promiscuous mode
+ */
+ wrl(op, PORT_CONF, rdl(op, PORT_CONF) | 1);
+
+ /*
+ * Remove our addr from MAC addr registers
+ */
+ wrl(op, PORT_MAC_LO, 0xffff);
+ wrl(op, PORT_MAC_HI, 0xffffffff);
+
+ /*
+ * Enable all entries in address filter tables
+ */
+ for (i = 0; i < PORT_SPEC_MCAST_SIZE; i += 4)
+ wrl(op, PORT_SPEC_MCAST_BASE + i, 0x01010101);
+ for (i = 0; i < PORT_OTHER_MCAST_SIZE; i += 4)
+ wrl(op, PORT_OTHER_MCAST_BASE + i, 0x01010101);
+ for (i = 0; i < PORT_UCAST_SIZE; i += 4)
+ wrl(op, PORT_UCAST_BASE + i, 0x01010101);
+}
+
+static void orion_set_allmulti(struct orion_priv *op)
+{
+ int i;
+
+ /*
+ * Enable all entries in multicast address tables
+ */
+ for (i = 0; i < PORT_SPEC_MCAST_SIZE; i += 4)
+ wrl(op, PORT_SPEC_MCAST_BASE + i, 0x01010101);
+ for (i = 0; i < PORT_OTHER_MCAST_SIZE; i += 4)
+ wrl(op, PORT_OTHER_MCAST_BASE + i, 0x01010101);
+}
+
+static u8 orion_mcast_hash(u8 *addr)
+{
+ /*
+ * CRC-8 x^8+x^2+x^1+1
+ */
+#define b(bit) (((addr[(bit)/8]) >> (7 - ((bit) % 8))) & 1)
+
+ return(((b(2)^b(4)^b(7)^b(8)^b(12)^b(13)^b(16)^b(17)^b(19)^
+ b(24)^b(26)^b(28)^b(29)^b(31)^b(33)^b(35)^b(39)^b(40)^
+ b(41)^b(47) ) << 0)
+ |
+ ((b(1)^b(2)^b(3)^b(4)^b(6)^b(8)^b(11)^b(13)^b(15)^
+ b(17)^b(18)^b(19)^b(23)^b(24)^b(25)^b(26)^b(27)^b(29)^
+ b(30)^b(31)^b(32)^b(33)^b(34)^b(35)^b(38)^b(41)^b(46)^
+ b(47)) << 1)
+ |
+ ((b(0)^b(1)^b(3)^b(4)^b(5)^b(8)^b(10)^b(13)^b(14)^
+ b(18)^b(19)^b(22)^b(23)^b(25)^b(30)^b(32)^b(34)^b(35)^
+ b(37)^b(39)^b(41)^b(45)^b(46)^b(47)) << 2)
+ |
+ ((b(0)^b(2)^b(3)^b(4)^b(7)^b(9)^b(12)^b(13)^b(17)^
+ b(18)^b(21)^b(22)^b(24)^b(29)^b(31)^b(33)^b(34)^b(36)^
+ b(38)^b(40)^b(44)^b(45)^b(46)) << 3)
+ |
+ ((b(1)^b(2)^b(3)^b(6)^b(8)^b(11)^b(12)^b(16)^b(17)^
+ b(20)^b(21)^b(23)^b(28)^b(30)^b(32)^b(33)^b(35)^b(37)^
+ b(39)^b(43)^b(44)^b(45)) << 4)
+ |
+ ((b(0)^b(1)^b(2)^b(5)^b(7)^b(10)^b(11)^b(15)^b(16)^
+ b(19)^b(20)^b(22)^b(27)^b(29)^b(31)^b(32)^b(34)^b(36)^
+ b(38)^b(42)^b(43)^b(44)) << 5)
+ |
+ ((b(0)^b(1)^b(4)^b(6)^b(9)^b(10)^b(14)^b(15)^b(18)^
+ b(19)^b(21)^b(26)^b(28)^b(30)^b(31)^b(33)^b(35)^b(37)^
+ b(41)^b(42)^b(43)) << 6)
+ |
+ ((b(0)^b(3)^b(5)^b(8)^b(9)^b(13)^b(14)^b(17)^b(18)^
+ b(20)^b(25)^b(27)^b(29)^b(30)^b(32)^b(34)^b(36)^b(40)^
+ b(41)^b(42)) << 7));
+}
+
+static void orion_set_multi_list(struct net_device *dev)
+{
+ struct dev_mc_list *addr = dev->mc_list;
+ struct orion_priv *op = netdev_priv(dev);
+ int i;
+ u8 *p;
+
+ /*
+ * Enable specific entries in multicast filter table
+ */
+ for (i = 0; i < dev->mc_count; i++, addr = addr->next) {
+ if (!addr)
+ break;
+ p = addr->dmi_addr;
+ if ((p[0] == 0x01) && (p[1] == 0x00) && (p[2] == 0x5E) &&
+ (p[3] == 0x00) && (p[4] == 0x00)) {
+ wrb(op, PORT_SPEC_MCAST_BASE + p[5], 1);
+ } else {
+ u8 entry = orion_mcast_hash(p);
+ wrb(op, PORT_OTHER_MCAST_BASE + entry, 1);
+ }
+ }
+}
+
+static void orion_clr_allmulti(struct orion_priv *op)
+{
+ int i;
+
+ /*
+ * Clear multicast tables
+ */
+ for (i = 0; i < PORT_SPEC_MCAST_SIZE; i += 4)
+ wrl(op, PORT_SPEC_MCAST_BASE + i, 0);
+ for (i = 0; i < PORT_OTHER_MCAST_SIZE; i += 4)
+ wrl(op, PORT_OTHER_MCAST_BASE + i, 0);
+}
+
+static void orion_multicast(struct net_device *dev)
+{
+ struct orion_priv *op = netdev_priv(dev);
+
+ if (dev->flags & IFF_PROMISC) {
+ orion_set_promisc(op);
+ } else {
+ /*
+ * If we were in promisc mode, we now must turn it off and
+ * setup our MAC addr again in HW registers and unicast table
+ */
+ wrl(op, PORT_CONF, rdl(op, PORT_CONF) & (~1));
+ orion_set_unicast(op, dev->dev_addr);
+
+ if (dev->flags & IFF_ALLMULTI) {
+ orion_set_allmulti(op);
+ } else {
+ /*
+ * If we were in promiscuous/allmulti mode, we now
+ * must clear the multicast tables first
+ */
+ orion_clr_allmulti(op);
+
+ if (dev->mc_count) {
+ orion_set_multi_list(dev);
+ }
+ }
+ }
+}
+
+static int orion_set_mac_addr(struct net_device *dev, void *p)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ struct sockaddr *addr = p;
+
+ if (!is_valid_ether_addr(addr->sa_data))
+ return -EADDRNOTAVAIL;
+
+ /*
+ * Setup addr to HW registers and unicast table
+ */
+ orion_set_unicast(op, addr->sa_data);
+
+ /*
+ * Store new addr in net_dev
+ */
+ memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
+
+ return 0;
+}
+
+/*****************************************************************************
+ * Data flow RX/TX
+ ****************************************************************************/
+static u32 orion_tx_done(struct net_device *dev)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ struct tx_desc *txd;
+ u32 count = 0, cmd_sts;
+
+#ifndef ORION_TX_DONE_IN_TX
+ spin_lock_bh(&op->tx_lock);
+#endif
+
+ while ((op->txd_count > 0)) {
+
+ txd = &op->txd_base[op->txd_used];
+ cmd_sts = txd->cmd_sts;
+
+ if (cmd_sts & TXD_DMA)
+ break;
+
+ dma_unmap_single(NULL, txd->buf, txd->count, DMA_TO_DEVICE);
+
+ if (cmd_sts & TXD_LAST) {
+ /*
+ * The skb was stored at the packet's last frag index
+ */
+ dev_kfree_skb_any(op->tx_skb[op->txd_used]);
+
+ if (cmd_sts & TXD_ERR)
+ op->stats.tx_errors++;
+ }
+
+ count++;
+ op->txd_count--;
+ op->txd_used = (op->txd_used + 1) % TX_DESC_NR;
+ }
+
+ /*
+ * If transmission was previously stopped, now it can be restarted
+ */
+ if (count && netif_queue_stopped(dev) && (dev->flags & IFF_UP))
+ netif_wake_queue(dev);
+
+#ifndef ORION_TX_DONE_IN_TX
+ spin_unlock_bh(&op->tx_lock);
+#endif
+ return count;
+}
+
+static int orion_tx(struct sk_buff *skb, struct net_device *dev)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ struct tx_desc *txd, *txd_first;
+ u32 count = 0, txd_flags = 0;
+ int ret = NETDEV_TX_OK;
+
+ spin_lock_bh(&op->tx_lock);
+
+ if (unlikely(skb->len > MAX_PKT_SIZE)) {
+ op->stats.tx_dropped++;
+ dev_kfree_skb(skb);
+ goto out;
+ }
+
+ /*
+ * Stop TX if there are not enough descriptors available. The next
+ * TX-Done will enable TX back after making available descriptors.
+ */
+ if (TX_DESC_NR - op->txd_count < skb_shinfo(skb)->nr_frags + 1) {
+ netif_stop_queue(dev);
+ ret = NETDEV_TX_BUSY;
+ goto out;
+ }
+
+ /*
+ * Buffers with a payload <= 8 bytes must be aligned on 8 bytes boundary.
+ * If there is such a small unaligned fragment we linearize the skb.
+ */
+ if (skb_is_nonlinear(skb)) {
+ int i;
+ for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
+ skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
+ if (unlikely(frag->size <= 8 && frag->page_offset & 0x7)) {
+ if (__skb_linearize(skb)) {
+ op->stats.tx_dropped++;
+ goto out;
+ }
+ break;
+ }
+ }
+ }
+
+ /*
+ * Need to remember the first desc to handle multiple frags
+ */
+ txd_first = &op->txd_base[op->txd_curr];
+
+ do {
+ u8* buf;
+ u32 size;
+
+ txd = &op->txd_base[op->txd_curr];
+
+ if (skb_shinfo(skb)->nr_frags == 0) {
+ buf = skb->data;
+ size = skb->len;
+ } else {
+ if (count == 0) {
+ buf = skb->data;
+ size = skb_headlen(skb);
+ } else {
+ skb_frag_t *frag = &skb_shinfo(skb)->frags[count - 1];
+ buf = page_address(frag->page) + frag->page_offset;
+ size = frag->size;
+ }
+ }
+
+ /*
+ * Setup the descriptor and only pass ownership to HW for the non-first
+ * descriptors. Some cmd_sts flags for the first and last descriptos are
+ * being set outside the loop.
+ */
+ txd->buf = dma_map_single(NULL, buf, size, DMA_TO_DEVICE);
+ txd->count = size;
+ if (count > 0)
+ txd->cmd_sts = TXD_DMA;
+
+ op->tx_skb[op->txd_curr] = (void *)0xffffffff;
+
+ count++;
+ op->txd_curr = (op->txd_curr + 1) % TX_DESC_NR;
+
+ } while (count < skb_shinfo(skb)->nr_frags + 1);
+
+#ifdef ORION_TX_CSUM_OFFLOAD
+ /*
+ * Setup checksum offloading flags for the 'first' txd
+ */
+ if (skb->ip_summed == CHECKSUM_COMPLETE ||
+ skb->ip_summed == CHECKSUM_PARTIAL) {
+ txd_flags = TXD_IP_CSUM | TXD_IP_NO_FRAG | TXD_L4_CSUM |
+ (ip_hdr(skb)->ihl << TXD_IP_HDRLEN_OFFS);
+ if (ip_hdr(skb)->protocol == IPPROTO_UDP)
+ txd_flags |= TXD_L4_UDP;
+ } else {
+ /*
+ * Workaround (Errata). Leaving IP hdr len '0' might cause
+ * a wrong checksum calc of the next packet.
+ */
+ txd_flags = 5 << TXD_IP_HDRLEN_OFFS;
+ }
+#endif
+
+ wmb();
+
+ if (count == 1) {
+ /*
+ * Single buffer case - set 'first' & 'last' flags
+ */
+ txd->cmd_sts = txd_flags | TXD_DMA | TXD_CRC | TXD_INT |
+ TXD_PAD | TXD_FRST | TXD_LAST;
+ } else {
+ /*
+ * Multiple buffers case - set 'last' flags first,
+ * and 'first' flags last.
+ */
+ txd->cmd_sts = TXD_DMA | TXD_INT | TXD_PAD | TXD_LAST;
+ wmb();
+ txd_first->cmd_sts = txd_flags | TXD_DMA | TXD_CRC | TXD_FRST;
+ }
+
+ /*
+ * Store skb for tx_done in the last frag index
+ */
+ if(op->txd_curr != 0)
+ op->tx_skb[op->txd_curr - 1] = skb;
+ else
+ op->tx_skb[TX_DESC_NR - 1] = skb;
+
+ /*
+ * Apply send command
+ */
+ wmb();
+ wrl(op, PORT_TXQ_CMD, PORT_EN_TXQ0);
+
+ op->txd_count += count;
+ if (op->txd_count > op->txd_max_pending)
+ op->txd_max_pending = op->txd_count;
+
+ op->stats.tx_bytes += skb->len;
+ op->stats.tx_packets++;
+ dev->trans_start = jiffies;
+
+#ifdef ORION_TX_DONE_IN_TX
+ if(op->txd_count > TX_DONE_THRESH)
+ orion_tx_done(dev);
+#endif
+
+out:
+ spin_unlock_bh(&op->tx_lock);
+ return ret;
+}
+
+static void orion_rx_fill(struct orion_priv *op)
+{
+ struct sk_buff *skb;
+ struct rx_desc *rxd;
+ int alloc_skb_failed = 0;
+ u32 unaligned;
+
+ spin_lock_bh(&op->rx_lock);
+
+ while (op->rxd_count < RX_DESC_NR) {
+
+ rxd = &op->rxd_base[op->rxd_used];
+
+ if (rxd->cmd_sts & RXD_DMA) {
+ printk(KERN_ERR "orion_rx_fill error, desc owned by DMA\n");
+ break;
+ }
+
+ skb = dev_alloc_skb(MAX_PKT_SIZE + dma_get_cache_alignment());
+ if (!skb) {
+ alloc_skb_failed = 1;
+ break;
+ }
+
+ unaligned = (u32)skb->data & (dma_get_cache_alignment() - 1);
+ if (unaligned)
+ skb_reserve(skb, dma_get_cache_alignment() - unaligned);
+
+ /*
+ * HW skips on first 2B to align the IP header
+ */
+ skb_reserve(skb, 2);
+
+ op->rx_skb[op->rxd_used] = skb;
+
+ rxd->buf = dma_map_single(NULL, skb->data, MAX_PKT_SIZE - 2,
+ DMA_FROM_DEVICE);
+ rxd->size = MAX_PKT_SIZE & RXD_SIZE_MASK;
+ rxd->count = 0;
+ wmb();
+ rxd->cmd_sts = RXD_DMA | RXD_INT;
+
+ op->rxd_count++;
+ op->rxd_used = (op->rxd_used + 1) % RX_DESC_NR;
+ }
+
+ /*
+ * If skb_alloc failed and the number of rx buffers in the ring is
+ * less than half of the ring size, then set a timer to try again
+ * later (100ms).
+ */
+ if (alloc_skb_failed && op->rxd_count < RX_DESC_NR / 2) {
+ printk(KERN_INFO "orion_rx_fill set timer to alloc bufs\n");
+ if (!timer_pending(&op->rx_fill_timer))
+ mod_timer(&op->rx_fill_timer, jiffies + (HZ / 10));
+ }
+
+ spin_unlock_bh(&op->rx_lock);
+}
+
+static void orion_rx_fill_on_timeout(unsigned long data)
+{
+ orion_rx_fill(((struct net_device *)data)->priv);
+}
+
+#ifdef ORION_RX_CSUM_OFFLOAD
+static inline int orion_rx_is_good_csum(struct rx_desc *rxd)
+{
+ if ((rxd->count > 72) &&
+ (rxd->cmd_sts & RXD_IP_TYPE) &&
+ (rxd->cmd_sts & RXD_IP_HDR_OK) &&
+ (!(rxd->size & RXD_IP_FRAG)) &&
+ (!(rxd->cmd_sts & RXD_L4_NO_TYPE)) &&
+ (rxd->cmd_sts & RXD_L4_CSUM_OK))
+ return 1;
+
+ return 0;
+}
+#endif
+
+static inline int get_rx_pending(struct orion_priv *op)
+{
+ u32 hw_rxd = (rdl(op, PORT_CURR_RXD) - op->rxd_base_dma) / sizeof(struct rx_desc);
+ u32 sw_rxd = (&op->rxd_base[op->rxd_curr] - op->rxd_base) / sizeof(struct rx_desc);
+
+ if (hw_rxd > sw_rxd)
+ return(hw_rxd - sw_rxd);
+ else
+ return(RX_DESC_NR - (sw_rxd - hw_rxd));
+}
+
+static int orion_rx(struct net_device *dev, u32 work_to_do)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ struct rx_desc *rxd;
+ u32 work_done = 0, cmd_sts;
+ struct sk_buff *skb;
+ u32 pending;
+
+ spin_lock_bh(&op->rx_lock);
+
+ pending = get_rx_pending(op);
+ if (pending > op->rxd_max_pending)
+ op->rxd_max_pending = pending;
+
+ while (op->rxd_count > 0 && work_done < work_to_do) {
+
+ rxd = &op->rxd_base[op->rxd_curr];
+ cmd_sts = rxd->cmd_sts;
+
+ if (cmd_sts & RXD_DMA)
+ break;
+
+ skb = op->rx_skb[op->rxd_curr];
+ dma_unmap_single(NULL, rxd->buf, rxd->size & RXD_SIZE_MASK, DMA_FROM_DEVICE);
+
+ if ((cmd_sts & RXD_FRST) && (cmd_sts & RXD_LAST) &&
+ !(cmd_sts & RXD_ERR)) {
+
+ /*
+ * Good RX
+ */
+ op->stats.rx_packets++;
+ op->stats.rx_bytes += rxd->count;
+
+ /*
+ * Reduce 4B crc + 2B offset
+ */
+ skb_put(skb, (rxd->count - 4 - 2));
+
+#ifdef ORION_RX_CSUM_OFFLOAD
+ if (orion_rx_is_good_csum(rxd)) {
+ skb->csum = htons((rxd->cmd_sts & RXD_L4_CSUM_MASK)
+ >> RXD_L4_CSUM_OFFS);
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
+ } else {
+ skb->ip_summed = CHECKSUM_NONE;
+ }
+#else
+ skb->ip_summed = CHECKSUM_NONE;
+#endif
+
+ skb->protocol = eth_type_trans(skb, dev);
+ skb->dev = dev;
+
+ netif_receive_skb(skb);
+ work_done++;
+
+ } else {
+ dev_kfree_skb(skb);
+ op->stats.rx_errors++;
+ op->stats.rx_dropped++;
+ }
+
+ dev->last_rx = jiffies;
+
+ op->rxd_count--;
+ op->rxd_curr = (op->rxd_curr + 1) % RX_DESC_NR;
+ }
+
+ spin_unlock_bh(&op->rx_lock);
+
+ /*
+ * Refill RX buffers when only half of the decriptors left available
+ */
+ if (work_done && (op->rxd_count < RX_DESC_NR / 2))
+ orion_rx_fill(op);
+
+ return work_done;
+}
+
+static int orion_poll(struct net_device *dev, int *budget)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ int rx_work_done = 0, tx_work_done = 0;
+
+#ifndef ORION_TX_DONE_IN_TX
+ /*
+ * Release transmitted buffers
+ */
+ tx_work_done = orion_tx_done(dev);
+#endif
+
+ /*
+ * Push up receive buffers
+ */
+ rx_work_done = orion_rx(dev, min(*budget, dev->quota));
+ *budget -= rx_work_done;
+ dev->quota -= rx_work_done;
+
+ /*
+ * If no work was done, go down from NAPI list and enable interrupts
+ */
+ if (((tx_work_done == 0) && (rx_work_done == 0)) ||
+ (!netif_running(dev)) ) {
+ netif_rx_complete(dev);
+ wrl(op, PORT_MASK, PIC_MASK);
+ wrl(op, PORT_MASK_EXT, PICE_MASK);
+ return 0;
+ }
+
+ return 1;
+}
+
+static irqreturn_t orion_irq(int irq , void *dev_id)
+{
+ struct net_device *dev = (struct net_device *)dev_id;
+ struct orion_priv *op = netdev_priv(dev);
+ u32 pic, pice = 0;
+
+ pic = rdl(op, PORT_CAUSE) & rdl(op, PORT_MASK);
+ if (pic == 0)
+ return IRQ_NONE;
+ wrl(op, PORT_CAUSE, ~pic);
+
+ if (pic & PIC_EXT) {
+ pice = rdl(op, PORT_CAUSE_EXT) & rdl(op, PORT_MASK_EXT);
+ wrl(op, PORT_CAUSE_EXT, ~pice);
+
+ /*
+ * Link status change event
+ */
+ if (pice & (PICE_PHY | PICE_LINK)) {
+ orion_phy_link_change(dev);
+ pice &= ~(PICE_PHY | PICE_LINK);
+ }
+ pic &= ~(PIC_EXT);
+ }
+
+ /*
+ * RX/TX events handled outside IRQ context (NAPI) while interrups
+ * disabled (PHY Link interrupts left unmask)
+ */
+ if (pic || pice) {
+ if (netif_rx_schedule_prep(dev)) {
+ wrl(op, PORT_MASK, PIC_EXT);
+ wrl(op, PORT_MASK_EXT, PICE_PHY | PICE_LINK);
+ wrl(op, PORT_CAUSE, 0);
+ wrl(op, PORT_CAUSE_EXT, 0);
+
+ __netif_rx_schedule(dev);
+ }
+ }
+
+ return IRQ_HANDLED;
+}
+
+/*****************************************************************************
+ * Tools and statistics
+ ****************************************************************************/
+static struct net_device_stats *orion_get_stats(struct net_device *dev)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ return &(op->stats);
+}
+
+static void orion_get_drvinfo(struct net_device *dev,
+ struct ethtool_drvinfo *info)
+{
+ strcpy(info->driver, DRV_NAME);
+ strcpy(info->version, DRV_VERSION);
+ strcpy(info->fw_version, "N/A");
+}
+
+static int orion_get_settings(struct net_device *dev,
+ struct ethtool_cmd *cmd)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ return mii_ethtool_gset(&op->mii, cmd);
+}
+
+static int orion_set_settings(struct net_device *dev,
+ struct ethtool_cmd *cmd)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ return mii_ethtool_sset(&op->mii, cmd);
+}
+
+static int orion_nway_reset(struct net_device *dev)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ return mii_nway_restart(&op->mii);
+}
+
+static u32 orion_get_link(struct net_device *dev)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ return mii_link_ok(&op->mii);
+}
+
+static void orion_get_ringparam(struct net_device *dev,
+ struct ethtool_ringparam *ring)
+{
+ struct orion_priv *op = netdev_priv(dev);
+
+ ring->rx_max_pending = op->rxd_max_pending;
+ ring->tx_max_pending = op->txd_max_pending;
+ ring->rx_pending = get_rx_pending(op);
+ ring->tx_pending = op->txd_count;
+ ring->rx_mini_max_pending = -1;
+ ring->rx_jumbo_max_pending = -1;
+ ring->rx_mini_pending = -1;
+ ring->rx_jumbo_pending = -1;
+}
+
+static u32 orion_get_rx_csum(struct net_device *netdev)
+{
+#ifdef ORION_RX_CSUM_OFFLOAD
+ return 1;
+#else
+ return 0;
+#endif
+}
+
+static u32 orion_get_tx_csum(struct net_device *netdev)
+{
+#ifdef ORION_TX_CSUM_OFFLOAD
+ return 1;
+#else
+ return 0;
+#endif
+}
+
+static struct ethtool_ops orion_ethtool_ops = {
+ .get_drvinfo = orion_get_drvinfo,
+ .get_settings = orion_get_settings,
+ .set_settings = orion_set_settings,
+ .nway_reset = orion_nway_reset,
+ .get_link = orion_get_link,
+ .get_ringparam = orion_get_ringparam,
+ .get_rx_csum = orion_get_rx_csum,
+ .get_tx_csum = orion_get_tx_csum,
+};
+
+static int orion_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ struct mii_ioctl_data *data = if_mii(ifr);
+
+ return generic_mii_ioctl(&op->mii, data, cmd, NULL);
+}
+
+void orion_clr_mib(struct orion_priv *op)
+{
+ /*
+ * Dummy reads do the work
+ */
+ int i, dummy;
+ for (i = 0; i < PORT_MIB_SIZE; i += 4)
+ dummy = rdl(op, (PORT_MIB_BASE + i));
+}
+
+/*****************************************************************************
+ * Start/Stop
+ ****************************************************************************/
+static void orion_init_hw(struct orion_priv *op)
+{
+ int i;
+
+ /*
+ * Mask and clear Ethernet unit interrupts
+ */
+ wrl(op, ETH_MASK, 0);
+ wrl(op, ETH_CAUSE, 0);
+
+ /*
+ * Clear address filter tables
+ */
+ for (i = 0; i < PORT_UCAST_SIZE; i += 4)
+ wrl(op, PORT_UCAST_BASE + i, 0);
+ for (i = 0; i < PORT_SPEC_MCAST_SIZE; i += 4)
+ wrl(op, PORT_SPEC_MCAST_BASE + i, 0);
+ for (i = 0; i < PORT_OTHER_MCAST_SIZE; i += 4)
+ wrl(op, PORT_OTHER_MCAST_BASE + i, 0);
+}
+
+static void orion_start_hw(struct orion_priv *op)
+{
+ /*
+ * Clear and mask interrupts
+ */
+ wrl(op, PORT_CAUSE, 0);
+ wrl(op, PORT_CAUSE_EXT, 0);
+ wrl(op, PORT_MASK, 0);
+ wrl(op, PORT_MASK_EXT, 0);
+
+ /*
+ * Clear MIB counters
+ */
+ orion_clr_mib(op);
+
+ /*
+ * Setup HW with TXD/RXD base
+ */
+ wrl(op, PORT_CURR_TXD, op->txd_base_dma);
+ wrl(op, PORT_CURR_RXD, op->rxd_base_dma);
+
+ /*
+ * Basic default port config
+ */
+ wrl(op, PORT_CONF, (1 << 25));
+ wrl(op, PORT_CONF_EXT, 0);
+ wrl(op, PORT_SERIAL, 0x0240609);
+ wrl(op, PORT_SDMA, 0x01021038);
+ wrl(op, PORT_MTU, 0x0);
+ wrl(op, PORT_TX_THRESH, 0x2100);
+
+ /*
+ * Enable RX & TX queues (using only queue '0')
+ */
+ wrl(op, PORT_RXQ_CMD, PORT_EN_RXQ0);
+ wrl(op, PORT_TXQ_CMD, PORT_EN_TXQ0);
+
+ /*
+ * Unmask interrupts
+ */
+ wrl(op, PORT_MASK, PIC_MASK);
+ wrl(op, PORT_MASK_EXT, PICE_MASK);
+}
+
+static int orion_open(struct net_device *dev)
+{
+ struct orion_priv *op = netdev_priv(dev);
+ int err;
+
+ setup_timer(&op->rx_fill_timer, orion_rx_fill_on_timeout,
+ (unsigned long)dev);
+
+ err = request_irq(dev->irq, orion_irq, IRQF_SAMPLE_RANDOM, dev->name, dev);
+ if (err) {
+ del_timer(&op->rx_fill_timer);
+ printk(KERN_ERR "Failed to request IRQ %d\n", dev->irq);
+ return err;
+ }
+
+ /*
+ * Fill RX buffers and start the HW
+ */
+ orion_rx_fill(op);
+ orion_start_hw(op);
+ orion_phy_link_change(dev);
+
+ return 0;
+}
+
+static int orion_close(struct net_device *dev)
+{
+ struct orion_priv *op = netdev_priv(dev);
+
+ /*
+ * Clear and mask interrupts
+ */
+ wrl(op, PORT_MASK, 0);
+ wrl(op, PORT_MASK_EXT, 0);
+ wrl(op, PORT_CAUSE, 0);
+ wrl(op, PORT_CAUSE_EXT, 0);
+
+ /*
+ * Stop RX, reset descriptors, free buffers and RX timer
+ */
+ spin_lock_bh(&op->rx_lock);
+
+ wrl(op, PORT_RXQ_CMD, PORT_DIS_RXQ0);
+ mdelay(1);
+
+ while (op->rxd_count > 0) {
+ struct rx_desc *rxd = &op->rxd_base[op->rxd_curr];
+ dma_unmap_single(NULL, rxd->buf, rxd->size & RXD_SIZE_MASK, DMA_FROM_DEVICE);
+ rxd->cmd_sts = rxd->size = rxd->count = rxd->buf = 0;
+ dev_kfree_skb_any(op->rx_skb[op->rxd_curr]);
+ op->rxd_count--;
+ op->rxd_curr = (op->rxd_curr + 1) % RX_DESC_NR;
+ }
+ op->rxd_curr = op->rxd_used = op->rxd_max_pending = 0;
+ wrl(op, PORT_CURR_RXD, op->rxd_base_dma);
+
+
+ spin_unlock_bh(&op->rx_lock);
+
+ /*
+ * Stop TX, reset descriptors, free buffers
+ */
+ spin_lock_bh(&op->tx_lock);
+
+ netif_stop_queue(dev);
+
+ wrl(op, PORT_TXQ_CMD, PORT_DIS_TXQ0);
+ mdelay(1);
+
+ while (op->txd_count > 0) {
+ struct tx_desc *txd = &op->txd_base[op->txd_curr];
+ dma_unmap_single(NULL, txd->buf, txd->count, DMA_TO_DEVICE);
+ if ((txd->cmd_sts & TXD_LAST))
+ dev_kfree_skb_any(op->tx_skb[op->txd_used]);
+ txd->cmd_sts = txd->l4i_chk = txd->count = txd->buf = 0;
+ op->txd_count--;
+ op->txd_used = (op->txd_used + 1) % TX_DESC_NR;
+ }
+ op->txd_curr = op->txd_used = op->txd_max_pending = 0;
+ wrl(op, PORT_CURR_TXD, op->txd_base_dma);
+
+ spin_unlock_bh(&op->tx_lock);
+
+ /*
+ * Diable serial interface
+ */
+ wrl(op, PORT_SERIAL, rdl(op, PORT_SERIAL) & (~1));
+ mdelay(1);
+
+ free_irq(dev->irq, dev);
+
+ /*
+ * Stop poll and set Link down state
+ */
+ netif_poll_disable(dev);
+ netif_carrier_off(dev);
+
+ return 0;
+}
+
+/*****************************************************************************
+ * Probe/Remove
+ ****************************************************************************/
+static int orion_remove(struct platform_device *pdev)
+{
+ struct net_device *dev;
+ struct orion_priv *op;
+
+ /*
+ * Remove net_device link
+ */
+ dev = platform_get_drvdata(pdev);
+ if (dev == NULL)
+ return 0;
+ platform_set_drvdata(pdev, NULL);
+
+ /*
+ * Close and remove interface
+ */
+ unregister_netdev(dev);
+
+ /*
+ * Free our private data and net_device
+ */
+ op = netdev_priv(dev);
+ if (op == NULL)
+ return 0;
+
+ iounmap((void *)op->base_addr);
+ del_timer(&op->rx_fill_timer);
+
+ if (op->rxd_base)
+ dma_free_coherent(NULL, sizeof(struct rx_desc) * RX_DESC_NR,
+ op->rxd_base, op->rxd_base_dma);
+
+ if (op->txd_base)
+ dma_free_coherent(NULL, sizeof(struct tx_desc) * TX_DESC_NR,
+ op->txd_base, op->txd_base_dma);
+
+ free_netdev(dev);
+
+ return 0;
+}
+
+static int orion_probe(struct platform_device *pdev)
+{
+ struct orion_eth_data *data;
+ struct net_device *dev;
+ struct orion_priv *op;
+ struct rx_desc *rxd;
+ struct tx_desc *txd;
+ int i, err, irq;
+ struct resource *res;
+ u32 base_addr;
+
+ if (pdev == NULL)
+ return -ENODEV;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (res == NULL)
+ return -ENODEV;
+ base_addr = res->start;
+
+ res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+ if (res == NULL)
+ return -ENODEV;
+ irq = res->start;
+
+ data = pdev->dev.platform_data;
+
+ dev = alloc_etherdev(sizeof(struct orion_priv));
+ if (dev == NULL)
+ return -ENOMEM;
+
+ platform_set_drvdata(pdev, dev);
+
+ op = netdev_priv(dev);
+ op->base_addr = (u32)ioremap(base_addr, 64 * 1024);
+ if (!op->base_addr) {
+ err = -EIO;
+ goto err_out;
+ }
+
+ /*
+ * Put HW in quite mode
+ */
+ orion_init_hw(op);
+
+ /*
+ * Setup our net_device
+ */
+ dev->base_addr = op->base_addr;
+ dev->irq = irq;
+ dev->open = orion_open;
+ dev->stop = orion_close;
+ dev->hard_start_xmit = orion_tx;
+ dev->do_ioctl = orion_ioctl;
+ dev->get_stats = orion_get_stats;
+ dev->ethtool_ops = &orion_ethtool_ops;
+ dev->set_mac_address = orion_set_mac_addr;
+ dev->set_multicast_list = orion_multicast;
+ dev->poll = orion_poll;
+ dev->weight = 64;
+ dev->tx_queue_len = TX_DESC_NR;
+ SET_ETHTOOL_OPS(dev, &orion_ethtool_ops);
+#ifdef ORION_TX_CSUM_OFFLOAD
+ dev->features = NETIF_F_SG | NETIF_F_IP_CSUM;
+#endif
+
+ /*
+ * Use MAC address from (1) board specific data, or (2) current HW
+ * settings, or (3) random address.
+ */
+ if (is_valid_ether_addr(data->dev_addr)) {
+ memcpy(dev->dev_addr, data->dev_addr, ETH_ALEN);
+ printk(KERN_INFO "Using board specific MAC address\n");
+ } else {
+ /*
+ * Read from HW (Boot loader settings)
+ */
+ u32 mac_h, mac_l;
+ mac_h = rdl(op, PORT_MAC_HI);
+ mac_l = rdl(op, PORT_MAC_LO);
+
+ dev->dev_addr[0] = (mac_h >> 24) & 0xff;
+ dev->dev_addr[1] = (mac_h >> 16) & 0xff;
+ dev->dev_addr[2] = (mac_h >> 8) & 0xff;
+ dev->dev_addr[3] = mac_h & 0xff;
+ dev->dev_addr[4] = (mac_l >> 8) & 0xff;
+ dev->dev_addr[5] = mac_l & 0xff;
+
+ if (!is_valid_ether_addr(dev->dev_addr)) {
+ printk(KERN_INFO "Invalid MAC address "
+ "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x, "
+ "using random address instead\n",
+ dev->dev_addr[0], dev->dev_addr[1],
+ dev->dev_addr[2], dev->dev_addr[3],
+ dev->dev_addr[4], dev->dev_addr[5]);
+ random_ether_addr(dev->dev_addr);
+ }
+ }
+
+ orion_set_unicast(op, dev->dev_addr);
+
+ /*
+ * Setup MII data
+ */
+ op->mii.phy_id = data->phy_id;
+ op->mii.phy_id_mask = 0x1f;
+ op->mii.reg_num_mask = 0x1f;
+ op->mii.dev = dev;
+ op->mii.supports_gmii = 1;
+ op->mii.mdio_read = orion_mii_read;
+ op->mii.mdio_write = orion_mii_write;
+
+ /*
+ * Enable PHY autoneg
+ */
+ orion_mii_write(dev, op->mii.phy_id, MII_BMCR, orion_mii_read(dev,
+ op->mii.phy_id, MII_BMCR) | BMCR_ANENABLE);
+
+ /*
+ * Setup our net_device private date
+ */
+ spin_lock_init(&op->tx_lock);
+ spin_lock_init(&op->rx_lock);
+ spin_lock_init(&op->mii_lock);
+
+ /*
+ * Setup RX descriptors rings
+ */
+ op->rxd_used = op->rxd_curr = op->rxd_count = 0;
+ op->rxd_base = dma_alloc_coherent(NULL, sizeof(struct rx_desc) *
+ RX_DESC_NR, &op->rxd_base_dma, GFP_KERNEL | GFP_DMA);
+ if (op->rxd_base == NULL) {
+ printk(KERN_ERR "Failed to alloc RX descriptors\n");
+ err = -ENOMEM;
+ goto err_out;
+ }
+ memset(op->rxd_base, 0, sizeof(struct rx_desc) * RX_DESC_NR);
+ for (i = 0, rxd = op->rxd_base; i < RX_DESC_NR - 1; i++, rxd++)
+ rxd->next = op->rxd_base_dma +
+ ((i + 1) * sizeof(struct rx_desc));
+ rxd->next = op->rxd_base_dma;
+
+ /*
+ * Setup TX descriptors rings
+ */
+ op->txd_used = op->txd_curr = op->txd_count = 0;
+ op->txd_base = dma_alloc_coherent(NULL, sizeof(struct tx_desc) *
+ TX_DESC_NR, &op->txd_base_dma, GFP_KERNEL | GFP_DMA);
+ if (op->txd_base == NULL) {
+ dev_err(&pdev->dev, "Failed to alloc TX descriptors\n");
+ err = -ENOMEM;
+ goto err_out;
+ }
+ memset(op->txd_base, 0, sizeof(struct tx_desc) * TX_DESC_NR);
+ for (i = 0, txd = op->txd_base; i < TX_DESC_NR - 1; i++, txd++)
+ txd->next = op->txd_base_dma +
+ ((i + 1) * sizeof(struct tx_desc));
+ txd->next = op->txd_base_dma;
+
+ /*
+ * Register our device
+ */
+ err = register_netdev(dev);
+ if (err) {
+ dev_err(&pdev->dev, "Failed to register netdev\n");
+ goto err_out;
+ }
+
+ printk(KERN_INFO "%s: Orion on-chip gigabit ethernet, IRQ %d, "
+ "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x, PHY ID %d.\n", dev->name,
+ dev->irq, dev->dev_addr[0], dev->dev_addr[1],
+ dev->dev_addr[2], dev->dev_addr[3],
+ dev->dev_addr[4], dev->dev_addr[5], op->mii.phy_id);
+
+ return 0;
+
+err_out:
+ orion_remove(pdev);
+ return err;
+}
+
+int orion_suspend(struct platform_device *pdev, pm_message_t state)
+{
+ /* Not implemented yet */
+ return -ENOSYS;
+}
+
+int orion_resume(struct platform_device *pdev)
+{
+ /* Not implemented yet */
+ return -ENOSYS;
+}
+
+static struct platform_driver orion_eth_driver = {
+ .probe = orion_probe,
+ .remove = orion_remove,
+ .suspend = orion_suspend,
+ .resume = orion_resume,
+ .driver = {
+ .name = "orion-eth",
+ },
+};
+
+static int __init orion_eth_init_module(void)
+{
+ int err;
+ printk(KERN_INFO DRV_NAME " version " DRV_VERSION " loading\n");
+ err = platform_driver_register(&orion_eth_driver);
+ if (err)
+ printk(KERN_NOTICE DRV_NAME "loading failed\n");
+ return err;
+}
+
+static void __exit orion_eth_cleanup_module(void)
+{
+ platform_driver_unregister(&orion_eth_driver);
+}
+
+module_init(orion_eth_init_module);
+module_exit(orion_eth_cleanup_module);
+MODULE_LICENSE("GPL");
^ permalink raw reply
* RE: Multicast problem
From: Joakim Tjernlund @ 2007-10-16 20:07 UTC (permalink / raw)
To: 'David Stevens'; +Cc: 'Netdev'
In-Reply-To: <OF169A6A3A.47A4FACF-ON88257376.006C1CEA-88257376.006C7CC8@us.ibm.com>
> -----Original Message-----
> From: David Stevens [mailto:dlstevens@us.ibm.com]
> Sent: den 16 oktober 2007 21:46
> To: Joakim Tjernlund
> Cc: 'Netdev'; netdev-owner@vger.kernel.org
> Subject: RE: Multicast problem
>
> > dev_mcast and igmp looks:
> > root@Challenger:/proc/net# m dev_mcast
> > 1 eth0 1 0 01005e000001
> > 2 eth1 1 0 01005e000001
>
> These are the hardware multicast addresses for
> 224.0.0.1 (so, correct).
>
> > root@Challenger:/proc/net# m igmp
> > Idx Device : Count Querier Group Users
> Timer Reporter
> > 1 eth0 : 1 V3
> > E0000001 1 0:00000000 0
> > 2 eth1 : 1 V2
> > E0000001 1 0:00000000 0
> > 4 lo : 0 V3
> > E0000001 1 0:00000000 0
>
> ...and these are the group memberships for 224.0.0.1, so
> also correct. This should receive and answer pings to 224.0.0.1
> as long as you don't have ICMP set to ignore broadcasts. You should
> not need to put the device in promiscuous mode for a ping of
> 224.0.0.1 to work, so if you do, then you have a driver, device
> or switch problem.
> None of these interfaces have memberships in the OSPF groups,
> so if you had OSPF running when you did this, it didn't join.
>
> +-DLS
>
OK, so from all this and earlier mail I think that the device driver don't
receive multicast pkgs. Tomorrow I will try the real OSPF test case with
promisc mode enabled, se if that works. If so, it means there is
a bug in the drivers(ucc_geth.c) set_multicast_list() function.
Thank you for helping me to narrow it down.
Jocke
^ permalink raw reply
* Re: Multicast problem
From: Stephen Hemminger @ 2007-10-16 20:13 UTC (permalink / raw)
To: Joakim Tjernlund; +Cc: 'David Stevens', 'Netdev'
In-Reply-To: <002701c81030$31908a90$04ac10ac@Jocke>
On Tue, 16 Oct 2007 22:07:35 +0200
"Joakim Tjernlund" <joakim.tjernlund@transmode.se> wrote:
> > -----Original Message-----
> > From: David Stevens [mailto:dlstevens@us.ibm.com]
> > Sent: den 16 oktober 2007 21:46
> > To: Joakim Tjernlund
> > Cc: 'Netdev'; netdev-owner@vger.kernel.org
> > Subject: RE: Multicast problem
> >
> > > dev_mcast and igmp looks:
> > > root@Challenger:/proc/net# m dev_mcast
> > > 1 eth0 1 0 01005e000001
> > > 2 eth1 1 0 01005e000001
> >
> > These are the hardware multicast addresses for
> > 224.0.0.1 (so, correct).
> >
> > > root@Challenger:/proc/net# m igmp
> > > Idx Device : Count Querier Group Users
> > Timer Reporter
> > > 1 eth0 : 1 V3
> > > E0000001 1 0:00000000 0
> > > 2 eth1 : 1 V2
> > > E0000001 1 0:00000000 0
> > > 4 lo : 0 V3
> > > E0000001 1 0:00000000 0
> >
> > ...and these are the group memberships for 224.0.0.1, so
> > also correct. This should receive and answer pings to 224.0.0.1
> > as long as you don't have ICMP set to ignore broadcasts. You should
> > not need to put the device in promiscuous mode for a ping of
> > 224.0.0.1 to work, so if you do, then you have a driver, device
> > or switch problem.
> > None of these interfaces have memberships in the OSPF groups,
> > so if you had OSPF running when you did this, it didn't join.
> >
> > +-DLS
> >
>
> OK, so from all this and earlier mail I think that the device driver don't
> receive multicast pkgs. Tomorrow I will try the real OSPF test case with
> promisc mode enabled, se if that works. If so, it means there is
> a bug in the drivers(ucc_geth.c) set_multicast_list() function.
>
> Thank you for helping me to narrow it down.
>
> Jocke
You can test multicast easily standalone with iperf:
http://dast.nlanr.net/Projects/Iperf/#multicast
--
Stephen Hemminger <shemminger@linux-foundation.org>
^ permalink raw reply
* Re: [patch] ipv6.7: IPV6_ROUTER_ALERT sockopt correction
From: Andrew McDonald @ 2007-10-16 20:15 UTC (permalink / raw)
To: Pekka Savola; +Cc: netdev
In-Reply-To: <Pine.LNX.4.64.0710150849580.17284@netcore.fi>
On Mon, Oct 15, 2007 at 08:51:16AM +0300, Pekka Savola wrote:
> Took off linux-man from cc:,
>
> On Sun, 14 Oct 2007, Andrew McDonald wrote:
> >+The tapped packets are not forwarded by the kernel, it is the
> >+user's responsibility to send them out again.
>
> This is probably incompliant (and from users' perspective,
> unacceptible) behaviour that IMHO should be fixed.
I disagree. This is basically the behaviour you want.
It might be an improvement to that sentence to simply say: "The tapped
packets are not forwarded by the kernel." The second half of the
sentence possibly suggests that you always want to forward the packet
after router alert processing.
For why you don't want to packets to be forwarded, consider a simple
example that applies to something like RSVP:
- packet hits router, identified as potentially interesting from router
alert option
- packet passed to user space, confirmed as really interesting and
processed
- create new packet (based on the one that came in and the RSVP
processing you've done) and send it out
You don't want the original packet you received to be forwarded, only
your new packet.
There is the possible case that you decide that you aren't interested
in the packet once it has reached userspace, in which case the user
will need to forward it themself. I can imagine ways of improving this
(e.g. LSF/BPF filters that run before deciding not to forward the
packet to reduce the likelihood of intercepting 'uninteresting'
packets), but they would not completely remove this situation.
--
Andrew McDonald
E-mail: andrew@mcdonald.org.uk
http://www.mcdonald.org.uk/andrew/
^ permalink raw reply
* Re: [PATCH,RFC] Marvell Orion SoC ethernet driver
From: Stephen Hemminger @ 2007-10-16 20:22 UTC (permalink / raw)
To: Lennert Buytenhek; +Cc: netdev, tzachi, nico
In-Reply-To: <20071016192806.GD19618@xi.wantstofly.org>
On Tue, 16 Oct 2007 21:28:06 +0200
Lennert Buytenhek <buytenh@wantstofly.org> wrote:
> Attached is a driver for the built-in 10/100/1000 ethernet MAC in
> the Marvell Orion series of ARM SoCs.
>
> This ethernet MAC supports the MII/GMII/RGMII PCS interface types,
> and offers a pretty standard set of MAC features, such as RX/TX
> checksum offload, scatter-gather, interrupt coalescing, PAUSE,
> jumbo frames, etc.
>
> This patch is against 2.6.22.1, and the driver has not yet been
> adapted to the recent NAPI changes. Nevertheless, we wanted to
> get this out there for feedback/review.
>
> Comments appreciated!
>
> Signed-off-by: Tzachi Perelstein <tzachi@marvell.com>
> Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
> Signed-off-by: Nicolas Pitre <nico@marvell.com>
>
> +static u8 orion_mcast_hash(u8 *addr)
> +{
> + /*
> + * CRC-8 x^8+x^2+x^1+1
> + */
>
Why not add a crc-8 set of generic code?
> +static void orion_rx_fill(struct orion_priv *op)
> +{
> + struct sk_buff *skb;
> + struct rx_desc *rxd;
> + int alloc_skb_failed = 0;
> + u32 unaligned;
> +
> + spin_lock_bh(&op->rx_lock);
> +
> + while (op->rxd_count < RX_DESC_NR) {
> +
> + rxd = &op->rxd_base[op->rxd_used];
> +
> + if (rxd->cmd_sts & RXD_DMA) {
> + printk(KERN_ERR "orion_rx_fill error, desc owned by DMA\n");
> + break;
> + }
> +
> + skb = dev_alloc_skb(MAX_PKT_SIZE + dma_get_cache_alignment());
> + if (!skb) {
> + alloc_skb_failed = 1;
> + break;
> + }
Use netdev_alloc_skb in new drivers.
If you define SLAB DEBUGGING skb->data won't be aligned??
> + unaligned = (u32)skb->data & (dma_get_cache_alignment() - 1);
> + if (unaligned)
> + skb_reserve(skb, dma_get_cache_alignment() - unaligned);
> +
> + /*
> + * HW skips on first 2B to align the IP header
> + */
> + skb_reserve(skb, 2);
Use NET_IP_ALIGN instead of 2. That way platforms that don't like unaligned
dma's can override it.
> +
> + op->rx_skb[op->rxd_used] = skb;
> +
> + rxd->buf = dma_map_single(NULL, skb->data, MAX_PKT_SIZE - 2,
> + DMA_FROM_DEVICE);
> + rxd->size = MAX_PKT_SIZE & RXD_SIZE_MASK;
> + rxd->count = 0;
> + wmb();
> + rxd->cmd_sts = RXD_DMA | RXD_INT;
> +
> + op->rxd_count++;
> + op->rxd_used = (op->rxd_used + 1) % RX_DESC_NR;
> + }
> +
> + /*
> + * If skb_alloc failed and the number of rx buffers in the ring is
> + * less than half of the ring size, then set a timer to try again
> + * later (100ms).
> + */
> + if (alloc_skb_failed && op->rxd_count < RX_DESC_NR / 2) {
> + printk(KERN_INFO "orion_rx_fill set timer to alloc bufs\n");
> + if (!timer_pending(&op->rx_fill_timer))
> + mod_timer(&op->rx_fill_timer, jiffies + (HZ / 10));
> + }
> +
> + spin_unlock_bh(&op->rx_lock);
> +}
> +static u32 orion_get_rx_csum(struct net_device *netdev)
> +{
> +#ifdef ORION_RX_CSUM_OFFLOAD
> + return 1;
> +#else
> + return 0;
> +#endif
> +}
Please allow real disabling of rx checksum.
> +static u32 orion_get_tx_csum(struct net_device *netdev)
> +{
> +#ifdef ORION_TX_CSUM_OFFLOAD
> + return 1;
> +#else
> + return 0;
> +#endif
> +}
Please allow control of tx checksum via ethtool_op_get_tx_sum()??
> +static struct ethtool_ops orion_ethtool_ops = {
> + .get_drvinfo = orion_get_drvinfo,
> + .get_settings = orion_get_settings,
> + .set_settings = orion_set_settings,
> + .nway_reset = orion_nway_reset,
> + .get_link = orion_get_link,
> + .get_ringparam = orion_get_ringparam,
> + .get_rx_csum = orion_get_rx_csum,
> + .get_tx_csum = orion_get_tx_csum,
> +};
> +
> +static int orion_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
> +{
> + struct orion_priv *op = netdev_priv(dev);
> + struct mii_ioctl_data *data = if_mii(ifr);
> +
> + return generic_mii_ioctl(&op->mii, data, cmd, NULL);
> +}
>
--
Stephen Hemminger <shemminger@linux-foundation.org>
^ permalink raw reply
* Re: r8169 Driver History
From: Francois Romieu @ 2007-10-16 20:29 UTC (permalink / raw)
To: Kirk Bocek; +Cc: netdev, Edward Hsu
In-Reply-To: <47139917.6050001@kbocek.com>
Kirk Bocek <t004@kbocek.com> :
> I'm maintaining a CentOS wiki page for the RTL8110 NIC:
>
> http://wiki.centos.org/HardwareList/RealTekr1000
>
> I don't think I have the version history quite right between the 2.2LK-NAPI
> version of the driver that's included in the kernel and the 6.003.00-NAPI
> version that Realtek has posted on their site. Can anyone point me to correct
> information that I can post on the wiki.
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=history;f=drivers/net/r8169.c;h=419c00cbe6e962bac5e1ea095848628415566e51;hb=HEAD
2.2LK-NAPI has stopped being a relevant identifier loooong ago.
The comments at the start of the 6.00x.00 files suggest a different history,
but 6.00x.00 is quite close to some in-kernel 2.6.x version.
> On a related issue, I also have a page for the RTL8111 NIC that requires
> Realtek's r8168 driver. What are the plans for adding that driver to the
> kernel ?
The current in-kernel r8169 driver has some support for the 8168 devices,
especially the "B" ones. People should try it and report when its behavior
and the 6.00x.00 one differ. Otherwise my plan is very simple: compare
6.00n.00 against 6.00(n-1), figure the candidate changes, compare against
the in-kernel driver, test the changes, add them, try again, repeat until
judgment day.
--
Ueimor
^ permalink raw reply
* RE: Multicast problem
From: Joakim Tjernlund @ 2007-10-16 20:57 UTC (permalink / raw)
To: 'Stephen Hemminger'; +Cc: 'David Stevens', 'Netdev'
In-Reply-To: <20071016131324.0bad17a5@freepuppy.rosehill>
> -----Original Message-----
> From: Stephen Hemminger [mailto:shemminger@linux-foundation.org]
> Sent: den 16 oktober 2007 22:13
>
> On Tue, 16 Oct 2007 22:07:35 +0200
> "Joakim Tjernlund" <joakim.tjernlund@transmode.se> wrote:
>
> > > -----Original Message-----
> > > From: David Stevens [mailto:dlstevens@us.ibm.com]
> > > Sent: den 16 oktober 2007 21:46
> > > To: Joakim Tjernlund
> > > Cc: 'Netdev'; netdev-owner@vger.kernel.org
> > > Subject: RE: Multicast problem
> > >
> > > > dev_mcast and igmp looks:
> > > > root@Challenger:/proc/net# m dev_mcast
> > > > 1 eth0 1 0 01005e000001
> > > > 2 eth1 1 0 01005e000001
> > >
> > > These are the hardware multicast addresses for
> > > 224.0.0.1 (so, correct).
> > >
> > > > root@Challenger:/proc/net# m igmp
> > > > Idx Device : Count Querier Group Users
> > > Timer Reporter
> > > > 1 eth0 : 1 V3
> > > > E0000001 1 0:00000000 0
> > > > 2 eth1 : 1 V2
> > > > E0000001 1 0:00000000 0
> > > > 4 lo : 0 V3
> > > > E0000001 1 0:00000000 0
> > >
> > > ...and these are the group memberships for 224.0.0.1, so
> > > also correct. This should receive and answer pings to 224.0.0.1
> > > as long as you don't have ICMP set to ignore broadcasts.
> You should
> > > not need to put the device in promiscuous mode for a ping of
> > > 224.0.0.1 to work, so if you do, then you have a driver, device
> > > or switch problem.
> > > None of these interfaces have memberships in the
> OSPF groups,
> > > so if you had OSPF running when you did this, it didn't join.
> > >
> > > +-DLS
> > >
> >
> > OK, so from all this and earlier mail I think that the
> device driver don't
> > receive multicast pkgs. Tomorrow I will try the real OSPF
> test case with
> > promisc mode enabled, se if that works. If so, it means there is
> > a bug in the drivers(ucc_geth.c) set_multicast_list() function.
> >
> > Thank you for helping me to narrow it down.
> >
> > Jocke
>
> You can test multicast easily standalone with iperf:
> http://dast.nlanr.net/Projects/Iperf/#multicast
>
Thanks, will give it a try.
^ permalink raw reply
* Re: new NAPI interface broken
From: Anton Blanchard @ 2007-10-16 21:01 UTC (permalink / raw)
To: Benjamin Herrenschmidt
Cc: David Miller, ossthema, shemminger, netdev, themann, raisch,
arjan
In-Reply-To: <1192525309.7205.16.camel@pasglop>
Hi,
> As far as I know, the x86 in-kernel thingy doesn't but yeah, the
> userland one seems much more evolved and does things based on the
> "class" of the device.
>
> Christoph, have any of you tried it on powerpc ?
FYI It works fine on PowerPC and its installed by default on some
distros (eg RHEL5).
Anton
^ permalink raw reply
* atm: panic when loading clip 2nd time
From: Randy Dunlap @ 2007-10-16 21:04 UTC (permalink / raw)
To: linux-kernel, NetDev; +Cc: chas
[-- Attachment #1: Type: text/plain, Size: 638 bytes --]
2.6.23-git7, using SLAB (not SLUB) [config attached]:
# modprobe clip
# rmmod clip
# modprobe clip
results in panic:
kmem_cache_create: duplicate cache clip_arp_cache
Call Trace:
[<ffffffff8028c682>] kmem_cache_create+0x3bf/0x3fd
[<ffffffff8046ba1d>] neigh_table_init_no_netlink+0x6c/0x242
[<ffffffff8800a010>] :clip:atm_clip_init+0x10/0x8a
[<ffffffff80258ba4>] sys_init_module+0x146c/0x15cd
[<ffffffff8046be0a>] neigh_lookup+0x0/0xd5
[<ffffffff8020ef44>] syscall_trace_enter+0x95/0x99
[<ffffffff8020beec>] tracesys+0xdc/0xe1
Kernel panic - not syncing: kmem_cache_create(): failed to create slab `clip_arp_cache'
--
~Randy
[-- Attachment #2: config.base_mods3 --]
[-- Type: text/plain, Size: 51862 bytes --]
#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.23-git7
# Tue Oct 16 12:59:13 2007
#
CONFIG_X86_64=y
CONFIG_64BIT=y
CONFIG_X86=y
CONFIG_GENERIC_TIME=y
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_ZONE_DMA32=y
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_SEMAPHORE_SLEEPERS=y
CONFIG_MMU=y
CONFIG_ZONE_DMA=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_X86_CMPXCHG=y
CONFIG_EARLY_PRINTK=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_IOMAP=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
CONFIG_ARCH_POPULATES_NODE_MAP=y
CONFIG_DMI=y
CONFIG_AUDIT_ARCH=y
CONFIG_GENERIC_BUG=y
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
#
# General setup
#
CONFIG_EXPERIMENTAL=y
CONFIG_LOCK_KERNEL=y
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_BSD_PROCESS_ACCT_V3=y
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
# CONFIG_TASK_XACCT is not set
# CONFIG_USER_NS is not set
CONFIG_AUDIT=y
CONFIG_AUDITSYSCALL=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=18
# CONFIG_CPUSETS is not set
CONFIG_SYSFS_DEPRECATED=y
CONFIG_RELAY=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
CONFIG_SYSCTL=y
CONFIG_EMBEDDED=y
CONFIG_UID16=y
CONFIG_SYSCTL_SYSCALL=y
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_KALLSYMS_EXTRA_PASS=y
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_ANON_INODES=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_EVENTFD=y
CONFIG_SHMEM=y
CONFIG_VM_EVENT_COUNTERS=y
CONFIG_SLAB=y
# CONFIG_SLUB is not set
# CONFIG_SLOB is not set
CONFIG_RT_MUTEXES=y
# CONFIG_TINY_SHMEM is not set
CONFIG_BASE_SMALL=0
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
# CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y
CONFIG_STOP_MACHINE=y
CONFIG_BLOCK=y
# CONFIG_BLK_DEV_IO_TRACE is not set
CONFIG_BLK_DEV_BSG=y
CONFIG_BLOCK_COMPAT=y
#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
# CONFIG_IOSCHED_AS is not set
# CONFIG_IOSCHED_DEADLINE is not set
CONFIG_IOSCHED_CFQ=y
# CONFIG_DEFAULT_AS is not set
# CONFIG_DEFAULT_DEADLINE is not set
CONFIG_DEFAULT_CFQ=y
# CONFIG_DEFAULT_NOOP is not set
CONFIG_DEFAULT_IOSCHED="cfq"
#
# Processor type and features
#
# CONFIG_TICK_ONESHOT is not set
# CONFIG_NO_HZ is not set
# CONFIG_HIGH_RES_TIMERS is not set
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
CONFIG_X86_PC=y
# CONFIG_X86_VSMP is not set
# CONFIG_MK8 is not set
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not set
CONFIG_GENERIC_CPU=y
CONFIG_X86_L1_CACHE_BYTES=128
CONFIG_X86_L1_CACHE_SHIFT=7
CONFIG_X86_INTERNODE_CACHE_BYTES=128
CONFIG_X86_TSC=y
CONFIG_X86_GOOD_APIC=y
CONFIG_MICROCODE=y
CONFIG_MICROCODE_OLD_INTERFACE=y
CONFIG_X86_MSR=y
CONFIG_X86_CPUID=y
CONFIG_X86_HT=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_LOCAL_APIC=y
CONFIG_MTRR=y
CONFIG_SMP=y
CONFIG_SCHED_SMT=y
CONFIG_SCHED_MC=y
# CONFIG_PREEMPT_NONE is not set
CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set
CONFIG_PREEMPT_BKL=y
CONFIG_NUMA=y
CONFIG_K8_NUMA=y
CONFIG_NODES_SHIFT=6
CONFIG_X86_64_ACPI_NUMA=y
CONFIG_NUMA_EMU=y
CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_SELECT_MEMORY_MODEL=y
# CONFIG_FLATMEM_MANUAL is not set
CONFIG_DISCONTIGMEM_MANUAL=y
# CONFIG_SPARSEMEM_MANUAL is not set
CONFIG_DISCONTIGMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y
CONFIG_NEED_MULTIPLE_NODES=y
# CONFIG_SPARSEMEM_STATIC is not set
# CONFIG_MEMORY_HOTPLUG is not set
CONFIG_SPLIT_PTLOCK_CPUS=4
# CONFIG_MIGRATION is not set
CONFIG_RESOURCES_64BIT=y
CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y
CONFIG_VIRT_TO_BUS=y
CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y
CONFIG_OUT_OF_LINE_PFN_TO_PAGE=y
CONFIG_NR_CPUS=8
CONFIG_PHYSICAL_ALIGN=0x200000
CONFIG_HOTPLUG_CPU=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
CONFIG_HPET_TIMER=y
CONFIG_HPET_EMULATE_RTC=y
CONFIG_IOMMU=y
# CONFIG_CALGARY_IOMMU is not set
CONFIG_SWIOTLB=y
CONFIG_X86_MCE=y
CONFIG_X86_MCE_INTEL=y
CONFIG_X86_MCE_AMD=y
CONFIG_KEXEC=y
CONFIG_CRASH_DUMP=y
CONFIG_RELOCATABLE=y
CONFIG_PHYSICAL_START=0x200000
# CONFIG_SECCOMP is not set
# CONFIG_CC_STACKPROTECTOR is not set
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250
CONFIG_K8_NB=y
CONFIG_GENERIC_HARDIRQS=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_ISA_DMA_API=y
CONFIG_GENERIC_PENDING_IRQ=y
#
# Power management options
#
CONFIG_PM=y
# CONFIG_PM_LEGACY is not set
# CONFIG_PM_DEBUG is not set
CONFIG_PM_SLEEP_SMP=y
CONFIG_PM_SLEEP=y
CONFIG_SUSPEND_SMP_POSSIBLE=y
CONFIG_SUSPEND=y
CONFIG_HIBERNATION_SMP_POSSIBLE=y
# CONFIG_HIBERNATION is not set
CONFIG_ACPI=y
CONFIG_ACPI_SLEEP=y
CONFIG_ACPI_PROCFS=y
CONFIG_ACPI_PROC_EVENT=y
CONFIG_ACPI_AC=y
CONFIG_ACPI_BATTERY=y
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_FAN=y
CONFIG_ACPI_DOCK=y
# CONFIG_ACPI_BAY is not set
CONFIG_ACPI_PROCESSOR=y
CONFIG_ACPI_HOTPLUG_CPU=y
CONFIG_ACPI_THERMAL=y
CONFIG_ACPI_NUMA=y
# CONFIG_ACPI_ASUS is not set
# CONFIG_ACPI_TOSHIBA is not set
CONFIG_ACPI_BLACKLIST_YEAR=0
# CONFIG_ACPI_DEBUG is not set
CONFIG_ACPI_EC=y
CONFIG_ACPI_POWER=y
CONFIG_ACPI_SYSTEM=y
CONFIG_X86_PM_TIMER=y
CONFIG_ACPI_CONTAINER=y
# CONFIG_ACPI_SBS is not set
#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_TABLE=m
# CONFIG_CPU_FREQ_DEBUG is not set
CONFIG_CPU_FREQ_STAT=m
# CONFIG_CPU_FREQ_STAT_DETAILS is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=m
CONFIG_CPU_FREQ_GOV_USERSPACE=m
CONFIG_CPU_FREQ_GOV_ONDEMAND=m
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m
#
# CPUFreq processor drivers
#
CONFIG_X86_POWERNOW_K8=m
CONFIG_X86_POWERNOW_K8_ACPI=y
CONFIG_X86_SPEEDSTEP_CENTRINO=m
CONFIG_X86_ACPI_CPUFREQ=m
#
# shared options
#
CONFIG_X86_ACPI_CPUFREQ_PROC_INTF=y
CONFIG_X86_P4_CLOCKMOD=m
CONFIG_X86_SPEEDSTEP_LIB=m
#
# Bus options (PCI etc.)
#
CONFIG_PCI=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_MMCONFIG=y
CONFIG_PCI_DOMAINS=y
CONFIG_PCIEPORTBUS=y
# CONFIG_HOTPLUG_PCI_PCIE is not set
CONFIG_PCIEAER=y
CONFIG_ARCH_SUPPORTS_MSI=y
# CONFIG_PCI_MSI is not set
# CONFIG_PCI_DEBUG is not set
CONFIG_HT_IRQ=y
#
# PCCARD (PCMCIA/CardBus) support
#
CONFIG_PCCARD=m
# CONFIG_PCMCIA_DEBUG is not set
CONFIG_PCMCIA=m
CONFIG_PCMCIA_LOAD_CIS=y
CONFIG_PCMCIA_IOCTL=y
CONFIG_CARDBUS=y
#
# PC-card bridges
#
CONFIG_YENTA=m
CONFIG_YENTA_O2=y
CONFIG_YENTA_RICOH=y
CONFIG_YENTA_TI=y
CONFIG_YENTA_ENE_TUNE=y
CONFIG_YENTA_TOSHIBA=y
CONFIG_PD6729=m
CONFIG_I82092=m
CONFIG_PCCARD_NONSTATIC=m
CONFIG_HOTPLUG_PCI=m
CONFIG_HOTPLUG_PCI_FAKE=m
CONFIG_HOTPLUG_PCI_ACPI=m
# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set
CONFIG_HOTPLUG_PCI_CPCI=y
CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m
CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m
CONFIG_HOTPLUG_PCI_SHPC=m
#
# Executable file formats / Emulations
#
CONFIG_BINFMT_ELF=y
CONFIG_BINFMT_MISC=y
CONFIG_IA32_EMULATION=y
CONFIG_IA32_AOUT=y
CONFIG_COMPAT=y
CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
CONFIG_SYSVIPC_COMPAT=y
#
# Networking
#
CONFIG_NET=y
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_UNIX=y
CONFIG_XFRM=y
CONFIG_XFRM_USER=m
CONFIG_XFRM_SUB_POLICY=y
CONFIG_XFRM_MIGRATE=y
CONFIG_NET_KEY=y
CONFIG_NET_KEY_MIGRATE=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_ASK_IP_FIB_HASH=y
# CONFIG_IP_FIB_TRIE is not set
CONFIG_IP_FIB_HASH=y
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_IP_PNP_RARP=y
CONFIG_NET_IPIP=y
CONFIG_NET_IPGRE=y
CONFIG_NET_IPGRE_BROADCAST=y
CONFIG_IP_MROUTE=y
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
CONFIG_ARPD=y
CONFIG_SYN_COOKIES=y
CONFIG_INET_AH=y
CONFIG_INET_ESP=y
CONFIG_INET_IPCOMP=y
CONFIG_INET_XFRM_TUNNEL=y
CONFIG_INET_TUNNEL=y
CONFIG_INET_XFRM_MODE_TRANSPORT=y
CONFIG_INET_XFRM_MODE_TUNNEL=y
CONFIG_INET_XFRM_MODE_BEET=y
CONFIG_INET_LRO=y
CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y
CONFIG_TCP_CONG_ADVANCED=y
CONFIG_TCP_CONG_BIC=m
CONFIG_TCP_CONG_CUBIC=y
CONFIG_TCP_CONG_WESTWOOD=m
CONFIG_TCP_CONG_HTCP=m
CONFIG_TCP_CONG_HSTCP=m
CONFIG_TCP_CONG_HYBLA=m
CONFIG_TCP_CONG_VEGAS=m
CONFIG_TCP_CONG_SCALABLE=m
CONFIG_TCP_CONG_LP=m
CONFIG_TCP_CONG_VENO=m
CONFIG_TCP_CONG_YEAH=m
CONFIG_TCP_CONG_ILLINOIS=m
# CONFIG_DEFAULT_BIC is not set
CONFIG_DEFAULT_CUBIC=y
# CONFIG_DEFAULT_HTCP is not set
# CONFIG_DEFAULT_VEGAS is not set
# CONFIG_DEFAULT_WESTWOOD is not set
# CONFIG_DEFAULT_RENO is not set
CONFIG_DEFAULT_TCP_CONG="cubic"
CONFIG_TCP_MD5SIG=y
# CONFIG_IP_VS is not set
CONFIG_IPV6=y
CONFIG_IPV6_PRIVACY=y
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
CONFIG_IPV6_OPTIMISTIC_DAD=y
CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m
CONFIG_INET6_IPCOMP=m
CONFIG_IPV6_MIP6=m
CONFIG_INET6_XFRM_TUNNEL=m
CONFIG_INET6_TUNNEL=m
CONFIG_INET6_XFRM_MODE_TRANSPORT=m
CONFIG_INET6_XFRM_MODE_TUNNEL=m
CONFIG_INET6_XFRM_MODE_BEET=m
CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
CONFIG_IPV6_SIT=m
CONFIG_IPV6_TUNNEL=m
CONFIG_IPV6_MULTIPLE_TABLES=y
CONFIG_IPV6_SUBTREES=y
CONFIG_NETLABEL=y
CONFIG_NETWORK_SECMARK=y
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_BRIDGE_NETFILTER=y
#
# Core Netfilter Configuration
#
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m
CONFIG_NF_CONNTRACK_ENABLED=m
CONFIG_NF_CONNTRACK=m
CONFIG_NF_CT_ACCT=y
CONFIG_NF_CONNTRACK_MARK=y
CONFIG_NF_CONNTRACK_SECMARK=y
CONFIG_NF_CONNTRACK_EVENTS=y
CONFIG_NF_CT_PROTO_GRE=m
CONFIG_NF_CT_PROTO_SCTP=m
CONFIG_NF_CT_PROTO_UDPLITE=m
CONFIG_NF_CONNTRACK_AMANDA=m
CONFIG_NF_CONNTRACK_FTP=m
CONFIG_NF_CONNTRACK_H323=m
CONFIG_NF_CONNTRACK_IRC=m
CONFIG_NF_CONNTRACK_NETBIOS_NS=m
CONFIG_NF_CONNTRACK_PPTP=m
CONFIG_NF_CONNTRACK_SANE=m
CONFIG_NF_CONNTRACK_SIP=m
CONFIG_NF_CONNTRACK_TFTP=m
CONFIG_NF_CT_NETLINK=m
CONFIG_NETFILTER_XTABLES=m
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
# CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set
# CONFIG_NETFILTER_XT_TARGET_DSCP is not set
CONFIG_NETFILTER_XT_TARGET_MARK=m
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
# CONFIG_NETFILTER_XT_TARGET_NOTRACK is not set
# CONFIG_NETFILTER_XT_TARGET_TRACE is not set
CONFIG_NETFILTER_XT_TARGET_SECMARK=m
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
CONFIG_NETFILTER_XT_MATCH_DCCP=m
CONFIG_NETFILTER_XT_MATCH_DSCP=m
CONFIG_NETFILTER_XT_MATCH_ESP=m
CONFIG_NETFILTER_XT_MATCH_HELPER=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
# CONFIG_NETFILTER_XT_MATCH_PHYSDEV is not set
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
CONFIG_NETFILTER_XT_MATCH_QUOTA=m
CONFIG_NETFILTER_XT_MATCH_REALM=m
CONFIG_NETFILTER_XT_MATCH_SCTP=m
CONFIG_NETFILTER_XT_MATCH_STATE=m
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
CONFIG_NETFILTER_XT_MATCH_STRING=m
CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
CONFIG_NETFILTER_XT_MATCH_TIME=m
CONFIG_NETFILTER_XT_MATCH_U32=m
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
#
# IP: Netfilter Configuration
#
CONFIG_NF_CONNTRACK_IPV4=m
CONFIG_NF_CONNTRACK_PROC_COMPAT=y
CONFIG_IP_NF_QUEUE=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_IPRANGE=m
CONFIG_IP_NF_MATCH_TOS=m
CONFIG_IP_NF_MATCH_RECENT=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_AH=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_MATCH_OWNER=m
CONFIG_IP_NF_MATCH_ADDRTYPE=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_NF_NAT=m
CONFIG_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_IP_NF_TARGET_NETMAP=m
CONFIG_IP_NF_TARGET_SAME=m
CONFIG_NF_NAT_SNMP_BASIC=m
CONFIG_NF_NAT_PROTO_GRE=m
CONFIG_NF_NAT_FTP=m
CONFIG_NF_NAT_IRC=m
CONFIG_NF_NAT_TFTP=m
CONFIG_NF_NAT_AMANDA=m
CONFIG_NF_NAT_PPTP=m
CONFIG_NF_NAT_H323=m
CONFIG_NF_NAT_SIP=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_TOS=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_TTL=m
CONFIG_IP_NF_TARGET_CLUSTERIP=m
CONFIG_IP_NF_RAW=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m
#
# IPv6: Netfilter Configuration (EXPERIMENTAL)
#
CONFIG_NF_CONNTRACK_IPV6=m
CONFIG_IP6_NF_QUEUE=m
CONFIG_IP6_NF_IPTABLES=m
CONFIG_IP6_NF_MATCH_RT=m
CONFIG_IP6_NF_MATCH_OPTS=m
CONFIG_IP6_NF_MATCH_FRAG=m
CONFIG_IP6_NF_MATCH_HL=m
CONFIG_IP6_NF_MATCH_OWNER=m
CONFIG_IP6_NF_MATCH_IPV6HEADER=m
CONFIG_IP6_NF_MATCH_AH=m
CONFIG_IP6_NF_MATCH_MH=m
CONFIG_IP6_NF_MATCH_EUI64=m
CONFIG_IP6_NF_FILTER=m
CONFIG_IP6_NF_TARGET_LOG=m
CONFIG_IP6_NF_TARGET_REJECT=m
CONFIG_IP6_NF_MANGLE=m
CONFIG_IP6_NF_TARGET_HL=m
CONFIG_IP6_NF_RAW=m
#
# DECnet: Netfilter Configuration
#
# CONFIG_DECNET_NF_GRABULATOR is not set
#
# Bridge: Netfilter Configuration
#
# CONFIG_BRIDGE_NF_EBTABLES is not set
CONFIG_IP_DCCP=m
CONFIG_INET_DCCP_DIAG=m
CONFIG_IP_DCCP_ACKVEC=y
#
# DCCP CCIDs Configuration (EXPERIMENTAL)
#
CONFIG_IP_DCCP_CCID2=m
# CONFIG_IP_DCCP_CCID2_DEBUG is not set
CONFIG_IP_DCCP_CCID3=m
CONFIG_IP_DCCP_TFRC_LIB=m
# CONFIG_IP_DCCP_CCID3_DEBUG is not set
CONFIG_IP_DCCP_CCID3_RTO=100
#
# DCCP Kernel Hacking
#
# CONFIG_IP_DCCP_DEBUG is not set
CONFIG_NET_DCCPPROBE=m
CONFIG_IP_SCTP=m
# CONFIG_SCTP_DBG_MSG is not set
# CONFIG_SCTP_DBG_OBJCNT is not set
# CONFIG_SCTP_HMAC_NONE is not set
# CONFIG_SCTP_HMAC_SHA1 is not set
CONFIG_SCTP_HMAC_MD5=y
CONFIG_TIPC=m
CONFIG_TIPC_ADVANCED=y
CONFIG_TIPC_ZONES=3
CONFIG_TIPC_CLUSTERS=1
CONFIG_TIPC_NODES=255
CONFIG_TIPC_SLAVE_NODES=0
CONFIG_TIPC_PORTS=8191
CONFIG_TIPC_LOG=0
# CONFIG_TIPC_DEBUG is not set
CONFIG_ATM=m
CONFIG_ATM_CLIP=m
CONFIG_ATM_CLIP_NO_ICMP=y
CONFIG_ATM_LANE=m
CONFIG_ATM_MPOA=m
CONFIG_ATM_BR2684=m
CONFIG_ATM_BR2684_IPFILTER=y
CONFIG_BRIDGE=m
CONFIG_VLAN_8021Q=m
CONFIG_DECNET=m
CONFIG_DECNET_ROUTER=y
CONFIG_LLC=m
CONFIG_LLC2=m
CONFIG_IPX=m
CONFIG_IPX_INTERN=y
CONFIG_ATALK=m
CONFIG_DEV_APPLETALK=m
CONFIG_IPDDP=m
CONFIG_IPDDP_ENCAP=y
CONFIG_IPDDP_DECAP=y
CONFIG_X25=m
CONFIG_LAPB=m
CONFIG_ECONET=m
CONFIG_ECONET_AUNUDP=y
CONFIG_ECONET_NATIVE=y
CONFIG_WAN_ROUTER=m
#
# QoS and/or fair queueing
#
CONFIG_NET_SCHED=y
CONFIG_NET_SCH_FIFO=y
#
# Queueing/Scheduling
#
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_HFSC=m
CONFIG_NET_SCH_ATM=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_RR=m
CONFIG_NET_SCH_RED=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_SCH_NETEM=m
CONFIG_NET_SCH_INGRESS=m
#
# Classification
#
CONFIG_NET_CLS=y
CONFIG_NET_CLS_BASIC=m
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_ROUTE=y
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
CONFIG_CLS_U32_PERF=y
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_STACK=32
CONFIG_NET_EMATCH_CMP=m
CONFIG_NET_EMATCH_NBYTE=m
CONFIG_NET_EMATCH_U32=m
CONFIG_NET_EMATCH_META=m
CONFIG_NET_EMATCH_TEXT=m
CONFIG_NET_CLS_ACT=y
CONFIG_NET_ACT_POLICE=y
CONFIG_NET_ACT_GACT=m
CONFIG_GACT_PROB=y
CONFIG_NET_ACT_MIRRED=m
CONFIG_NET_ACT_IPT=m
CONFIG_NET_ACT_NAT=m
CONFIG_NET_ACT_PEDIT=m
CONFIG_NET_ACT_SIMP=m
CONFIG_NET_CLS_POLICE=y
CONFIG_NET_CLS_IND=y
#
# Network testing
#
CONFIG_NET_PKTGEN=m
CONFIG_NET_TCPPROBE=m
CONFIG_HAMRADIO=y
#
# Packet Radio protocols
#
CONFIG_AX25=m
CONFIG_AX25_DAMA_SLAVE=y
CONFIG_NETROM=m
CONFIG_ROSE=m
#
# AX.25 network device drivers
#
CONFIG_MKISS=m
CONFIG_6PACK=m
CONFIG_BPQETHER=m
CONFIG_BAYCOM_SER_FDX=m
CONFIG_BAYCOM_SER_HDX=m
CONFIG_BAYCOM_PAR=m
CONFIG_YAM=m
CONFIG_IRDA=m
#
# IrDA protocols
#
CONFIG_IRLAN=m
CONFIG_IRCOMM=m
CONFIG_IRDA_ULTRA=y
#
# IrDA options
#
CONFIG_IRDA_CACHE_LAST_LSAP=y
CONFIG_IRDA_FAST_RR=y
CONFIG_IRDA_DEBUG=y
#
# Infrared-port device drivers
#
#
# SIR device drivers
#
CONFIG_IRTTY_SIR=m
#
# Dongle support
#
CONFIG_DONGLE=y
CONFIG_ESI_DONGLE=m
CONFIG_ACTISYS_DONGLE=m
CONFIG_TEKRAM_DONGLE=m
CONFIG_TOIM3232_DONGLE=m
CONFIG_LITELINK_DONGLE=m
CONFIG_MA600_DONGLE=m
CONFIG_GIRBIL_DONGLE=m
CONFIG_MCP2120_DONGLE=m
CONFIG_OLD_BELKIN_DONGLE=m
CONFIG_ACT200L_DONGLE=m
CONFIG_KINGSUN_DONGLE=m
CONFIG_KSDAZZLE_DONGLE=m
CONFIG_KS959_DONGLE=m
#
# Old SIR device drivers
#
#
# Old Serial dongle support
#
#
# FIR device drivers
#
CONFIG_USB_IRDA=m
CONFIG_SIGMATEL_FIR=m
CONFIG_NSC_FIR=m
CONFIG_WINBOND_FIR=m
CONFIG_SMC_IRCC_FIR=m
CONFIG_ALI_FIR=m
CONFIG_VLSI_FIR=m
CONFIG_VIA_FIR=m
CONFIG_MCS_FIR=m
CONFIG_BT=m
CONFIG_BT_L2CAP=m
CONFIG_BT_SCO=m
CONFIG_BT_RFCOMM=m
CONFIG_BT_RFCOMM_TTY=y
CONFIG_BT_BNEP=m
CONFIG_BT_BNEP_MC_FILTER=y
CONFIG_BT_BNEP_PROTO_FILTER=y
CONFIG_BT_HIDP=m
#
# Bluetooth device drivers
#
CONFIG_BT_HCIUSB=m
CONFIG_BT_HCIUSB_SCO=y
CONFIG_BT_HCIUART=m
CONFIG_BT_HCIUART_H4=y
CONFIG_BT_HCIUART_BCSP=y
CONFIG_BT_HCIBCM203X=m
CONFIG_BT_HCIBPA10X=m
CONFIG_BT_HCIBFUSB=m
CONFIG_BT_HCIDTL1=m
CONFIG_BT_HCIBT3C=m
CONFIG_BT_HCIBLUECARD=m
CONFIG_BT_HCIBTUART=m
CONFIG_BT_HCIVHCI=m
CONFIG_AF_RXRPC=m
CONFIG_AF_RXRPC_DEBUG=y
CONFIG_RXKAD=m
CONFIG_FIB_RULES=y
#
# Wireless
#
CONFIG_CFG80211=m
CONFIG_NL80211=y
CONFIG_WIRELESS_EXT=y
CONFIG_MAC80211=m
CONFIG_MAC80211_DEBUGFS=y
CONFIG_MAC80211_DEBUG=y
CONFIG_MAC80211_VERBOSE_DEBUG=y
CONFIG_MAC80211_LOWTX_FRAME_DUMP=y
CONFIG_TKIP_DEBUG=y
CONFIG_MAC80211_DEBUG_COUNTERS=y
CONFIG_MAC80211_IBSS_DEBUG=y
CONFIG_MAC80211_VERBOSE_PS_DEBUG=y
CONFIG_IEEE80211=m
CONFIG_IEEE80211_DEBUG=y
CONFIG_IEEE80211_CRYPT_WEP=m
CONFIG_IEEE80211_CRYPT_CCMP=m
CONFIG_IEEE80211_CRYPT_TKIP=m
CONFIG_IEEE80211_SOFTMAC=m
CONFIG_IEEE80211_SOFTMAC_DEBUG=y
CONFIG_RFKILL=m
CONFIG_RFKILL_INPUT=m
CONFIG_NET_9P=m
# CONFIG_NET_9P_DEBUG is not set
#
# Device Drivers
#
#
# Generic Driver Options
#
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=y
# CONFIG_DEBUG_DRIVER is not set
# CONFIG_DEBUG_DEVRES is not set
# CONFIG_SYS_HYPERVISOR is not set
CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y
# CONFIG_MTD is not set
CONFIG_PARPORT=y
CONFIG_PARPORT_PC=y
# CONFIG_PARPORT_SERIAL is not set
CONFIG_PARPORT_PC_FIFO=y
# CONFIG_PARPORT_PC_SUPERIO is not set
# CONFIG_PARPORT_PC_PCMCIA is not set
# CONFIG_PARPORT_GSC is not set
# CONFIG_PARPORT_AX88796 is not set
CONFIG_PARPORT_1284=y
CONFIG_PNP=y
# CONFIG_PNP_DEBUG is not set
#
# Protocols
#
CONFIG_PNPACPI=y
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_FD=y
# CONFIG_PARIDE is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=m
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
# CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_SX8 is not set
# CONFIG_BLK_DEV_UB is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
CONFIG_CDROM_PKTCDVD=y
CONFIG_CDROM_PKTCDVD_BUFFERS=8
CONFIG_CDROM_PKTCDVD_WCACHE=y
# CONFIG_ATA_OVER_ETH is not set
# CONFIG_MISC_DEVICES is not set
CONFIG_IDE=y
CONFIG_IDE_MAX_HWIFS=4
CONFIG_BLK_DEV_IDE=y
#
# Please see Documentation/ide.txt for help/info on IDE drives
#
# CONFIG_BLK_DEV_IDE_SATA is not set
# CONFIG_BLK_DEV_HD_IDE is not set
CONFIG_BLK_DEV_IDEDISK=y
CONFIG_IDEDISK_MULTI_MODE=y
# CONFIG_BLK_DEV_IDECS is not set
# CONFIG_BLK_DEV_DELKIN is not set
CONFIG_BLK_DEV_IDECD=y
# CONFIG_BLK_DEV_IDETAPE is not set
# CONFIG_BLK_DEV_IDEFLOPPY is not set
CONFIG_BLK_DEV_IDESCSI=y
# CONFIG_BLK_DEV_IDEACPI is not set
# CONFIG_IDE_TASK_IOCTL is not set
CONFIG_IDE_PROC_FS=y
#
# IDE chipset support/bugfixes
#
CONFIG_IDE_GENERIC=y
# CONFIG_BLK_DEV_PLATFORM is not set
# CONFIG_BLK_DEV_CMD640 is not set
# CONFIG_BLK_DEV_IDEPNP is not set
#
# PCI IDE chipsets support
#
CONFIG_BLK_DEV_IDEPCI=y
CONFIG_IDEPCI_SHARE_IRQ=y
CONFIG_IDEPCI_PCIBUS_ORDER=y
# CONFIG_BLK_DEV_OFFBOARD is not set
CONFIG_BLK_DEV_GENERIC=y
# CONFIG_BLK_DEV_OPTI621 is not set
# CONFIG_BLK_DEV_RZ1000 is not set
CONFIG_BLK_DEV_IDEDMA_PCI=y
# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
# CONFIG_IDEDMA_ONLYDISK is not set
# CONFIG_BLK_DEV_AEC62XX is not set
# CONFIG_BLK_DEV_ALI15X3 is not set
# CONFIG_BLK_DEV_AMD74XX is not set
# CONFIG_BLK_DEV_ATIIXP is not set
# CONFIG_BLK_DEV_CMD64X is not set
# CONFIG_BLK_DEV_TRIFLEX is not set
# CONFIG_BLK_DEV_CY82C693 is not set
# CONFIG_BLK_DEV_CS5520 is not set
# CONFIG_BLK_DEV_CS5530 is not set
# CONFIG_BLK_DEV_HPT34X is not set
# CONFIG_BLK_DEV_HPT366 is not set
# CONFIG_BLK_DEV_JMICRON is not set
# CONFIG_BLK_DEV_SC1200 is not set
CONFIG_BLK_DEV_PIIX=y
# CONFIG_BLK_DEV_IT8213 is not set
# CONFIG_BLK_DEV_IT821X is not set
# CONFIG_BLK_DEV_NS87415 is not set
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
# CONFIG_BLK_DEV_PDC202XX_NEW is not set
# CONFIG_BLK_DEV_SVWKS is not set
# CONFIG_BLK_DEV_SIIMAGE is not set
# CONFIG_BLK_DEV_SIS5513 is not set
# CONFIG_BLK_DEV_SLC90E66 is not set
# CONFIG_BLK_DEV_TRM290 is not set
# CONFIG_BLK_DEV_VIA82CXXX is not set
# CONFIG_BLK_DEV_TC86C001 is not set
# CONFIG_IDE_ARM is not set
CONFIG_BLK_DEV_IDEDMA=y
# CONFIG_BLK_DEV_HD is not set
#
# SCSI device support
#
# CONFIG_RAID_ATTRS is not set
CONFIG_SCSI=y
CONFIG_SCSI_DMA=y
# CONFIG_SCSI_TGT is not set
# CONFIG_SCSI_NETLINK is not set
CONFIG_SCSI_PROC_FS=y
#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=y
# CONFIG_CHR_DEV_ST is not set
# CONFIG_CHR_DEV_OSST is not set
CONFIG_BLK_DEV_SR=y
# CONFIG_BLK_DEV_SR_VENDOR is not set
CONFIG_CHR_DEV_SG=y
CONFIG_CHR_DEV_SCH=m
#
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
#
CONFIG_SCSI_MULTI_LUN=y
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
# CONFIG_SCSI_SCAN_ASYNC is not set
CONFIG_SCSI_WAIT_SCAN=m
#
# SCSI Transports
#
CONFIG_SCSI_SPI_ATTRS=y
# CONFIG_SCSI_FC_ATTRS is not set
# CONFIG_SCSI_ISCSI_ATTRS is not set
CONFIG_SCSI_SAS_ATTRS=y
CONFIG_SCSI_SAS_LIBSAS=y
CONFIG_SCSI_SAS_LIBSAS_DEBUG=y
CONFIG_SCSI_LOWLEVEL=y
# CONFIG_ISCSI_TCP is not set
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
# CONFIG_SCSI_3W_9XXX is not set
# CONFIG_SCSI_ACARD is not set
# CONFIG_SCSI_AACRAID is not set
CONFIG_SCSI_AIC7XXX=m
CONFIG_AIC7XXX_CMDS_PER_DEVICE=32
CONFIG_AIC7XXX_RESET_DELAY_MS=5000
# CONFIG_AIC7XXX_DEBUG_ENABLE is not set
CONFIG_AIC7XXX_DEBUG_MASK=0
CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
# CONFIG_SCSI_AIC7XXX_OLD is not set
CONFIG_SCSI_AIC79XX=m
CONFIG_AIC79XX_CMDS_PER_DEVICE=32
CONFIG_AIC79XX_RESET_DELAY_MS=15000
# CONFIG_AIC79XX_DEBUG_ENABLE is not set
CONFIG_AIC79XX_DEBUG_MASK=0
CONFIG_AIC79XX_REG_PRETTY_PRINT=y
CONFIG_SCSI_AIC94XX=m
CONFIG_AIC94XX_DEBUG=y
CONFIG_SCSI_ARCMSR=m
# CONFIG_MEGARAID_NEWGEN is not set
# CONFIG_MEGARAID_LEGACY is not set
# CONFIG_MEGARAID_SAS is not set
# CONFIG_SCSI_HPTIOP is not set
# CONFIG_SCSI_BUSLOGIC is not set
# CONFIG_SCSI_DMX3191D is not set
# CONFIG_SCSI_EATA is not set
# CONFIG_SCSI_FUTURE_DOMAIN is not set
# CONFIG_SCSI_GDTH is not set
# CONFIG_SCSI_IPS is not set
# CONFIG_SCSI_INITIO is not set
# CONFIG_SCSI_INIA100 is not set
CONFIG_SCSI_PPA=m
CONFIG_SCSI_IMM=m
# CONFIG_SCSI_IZIP_EPP16 is not set
# CONFIG_SCSI_IZIP_SLOW_CTR is not set
# CONFIG_SCSI_STEX is not set
# CONFIG_SCSI_SYM53C8XX_2 is not set
# CONFIG_SCSI_IPR is not set
# CONFIG_SCSI_QLOGIC_1280 is not set
# CONFIG_SCSI_QLA_FC is not set
# CONFIG_SCSI_QLA_ISCSI is not set
# CONFIG_SCSI_LPFC is not set
# CONFIG_SCSI_DC395x is not set
# CONFIG_SCSI_DC390T is not set
CONFIG_SCSI_DEBUG=m
# CONFIG_SCSI_SRP is not set
# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
CONFIG_ATA=m
# CONFIG_ATA_NONSTANDARD is not set
CONFIG_ATA_ACPI=y
CONFIG_SATA_AHCI=m
# CONFIG_SATA_SVW is not set
# CONFIG_ATA_PIIX is not set
# CONFIG_SATA_MV is not set
# CONFIG_SATA_NV is not set
# CONFIG_PDC_ADMA is not set
# CONFIG_SATA_QSTOR is not set
# CONFIG_SATA_PROMISE is not set
# CONFIG_SATA_SX4 is not set
# CONFIG_SATA_SIL is not set
# CONFIG_SATA_SIL24 is not set
# CONFIG_SATA_SIS is not set
# CONFIG_SATA_ULI is not set
CONFIG_SATA_VIA=m
# CONFIG_SATA_VITESSE is not set
# CONFIG_SATA_INIC162X is not set
# CONFIG_PATA_ACPI is not set
# CONFIG_PATA_ALI is not set
# CONFIG_PATA_AMD is not set
# CONFIG_PATA_ARTOP is not set
# CONFIG_PATA_ATIIXP is not set
# CONFIG_PATA_CMD640_PCI is not set
# CONFIG_PATA_CMD64X is not set
# CONFIG_PATA_CS5520 is not set
# CONFIG_PATA_CS5530 is not set
# CONFIG_PATA_CYPRESS is not set
# CONFIG_PATA_EFAR is not set
# CONFIG_ATA_GENERIC is not set
# CONFIG_PATA_HPT366 is not set
# CONFIG_PATA_HPT37X is not set
# CONFIG_PATA_HPT3X2N is not set
# CONFIG_PATA_HPT3X3 is not set
# CONFIG_PATA_IT821X is not set
# CONFIG_PATA_IT8213 is not set
# CONFIG_PATA_JMICRON is not set
# CONFIG_PATA_TRIFLEX is not set
# CONFIG_PATA_MARVELL is not set
# CONFIG_PATA_MPIIX is not set
# CONFIG_PATA_OLDPIIX is not set
# CONFIG_PATA_NETCELL is not set
# CONFIG_PATA_NS87410 is not set
# CONFIG_PATA_NS87415 is not set
# CONFIG_PATA_OPTI is not set
# CONFIG_PATA_OPTIDMA is not set
# CONFIG_PATA_PCMCIA is not set
# CONFIG_PATA_PDC_OLD is not set
# CONFIG_PATA_RADISYS is not set
# CONFIG_PATA_RZ1000 is not set
# CONFIG_PATA_SC1200 is not set
# CONFIG_PATA_SERVERWORKS is not set
# CONFIG_PATA_PDC2027X is not set
# CONFIG_PATA_SIL680 is not set
# CONFIG_PATA_SIS is not set
# CONFIG_PATA_VIA is not set
# CONFIG_PATA_WINBOND is not set
# CONFIG_PATA_PLATFORM is not set
# CONFIG_MD is not set
#
# Fusion MPT device support
#
# CONFIG_FUSION is not set
# CONFIG_FUSION_SPI is not set
# CONFIG_FUSION_FC is not set
# CONFIG_FUSION_SAS is not set
#
# IEEE 1394 (FireWire) support
#
# CONFIG_FIREWIRE is not set
CONFIG_IEEE1394=m
#
# Subsystem Options
#
# CONFIG_IEEE1394_VERBOSEDEBUG is not set
#
# Controllers
#
#
# Texas Instruments PCILynx requires I2C
#
CONFIG_IEEE1394_OHCI1394=m
#
# Protocols
#
CONFIG_IEEE1394_VIDEO1394=m
CONFIG_IEEE1394_SBP2=m
# CONFIG_IEEE1394_SBP2_PHYS_DMA is not set
CONFIG_IEEE1394_ETH1394_ROM_ENTRY=y
CONFIG_IEEE1394_ETH1394=m
CONFIG_IEEE1394_DV1394=m
CONFIG_IEEE1394_RAWIO=m
# CONFIG_I2O is not set
# CONFIG_MACINTOSH_DRIVERS is not set
CONFIG_NETDEVICES=y
# CONFIG_NETDEVICES_MULTIQUEUE is not set
# CONFIG_IFB is not set
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_MACVLAN is not set
# CONFIG_EQUALIZER is not set
CONFIG_TUN=y
# CONFIG_VETH is not set
# CONFIG_NET_SB1000 is not set
# CONFIG_IP1000 is not set
# CONFIG_ARCNET is not set
# CONFIG_PHYLIB is not set
CONFIG_NET_ETHERNET=y
CONFIG_MII=y
# CONFIG_HAPPYMEAL is not set
# CONFIG_SUNGEM is not set
# CONFIG_CASSINI is not set
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_NET_TULIP is not set
# CONFIG_HP100 is not set
# CONFIG_IBM_NEW_EMAC_ZMII is not set
# CONFIG_IBM_NEW_EMAC_RGMII is not set
# CONFIG_IBM_NEW_EMAC_TAH is not set
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
CONFIG_NET_PCI=y
# CONFIG_PCNET32 is not set
# CONFIG_AMD8111_ETH is not set
# CONFIG_ADAPTEC_STARFIRE is not set
CONFIG_B44=y
CONFIG_B44_PCI_AUTOSELECT=y
CONFIG_B44_PCICORE_AUTOSELECT=y
CONFIG_B44_PCI=y
# CONFIG_FORCEDETH is not set
# CONFIG_EEPRO100 is not set
CONFIG_E100=y
# CONFIG_FEALNX is not set
# CONFIG_NATSEMI is not set
# CONFIG_NE2K_PCI is not set
# CONFIG_8139CP is not set
# CONFIG_8139TOO is not set
# CONFIG_SIS900 is not set
# CONFIG_EPIC100 is not set
# CONFIG_SUNDANCE is not set
CONFIG_VIA_RHINE=y
CONFIG_VIA_RHINE_MMIO=y
CONFIG_VIA_RHINE_NAPI=y
# CONFIG_SC92031 is not set
# CONFIG_NET_POCKET is not set
CONFIG_NETDEV_1000=y
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
CONFIG_E1000=y
# CONFIG_E1000_NAPI is not set
# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
# CONFIG_E1000E is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_R8169 is not set
# CONFIG_SIS190 is not set
# CONFIG_SKGE is not set
# CONFIG_SKY2 is not set
# CONFIG_SK98LIN is not set
# CONFIG_VIA_VELOCITY is not set
CONFIG_TIGON3=y
# CONFIG_BNX2 is not set
# CONFIG_QLA3XXX is not set
# CONFIG_ATL1 is not set
# CONFIG_NETDEV_10000 is not set
# CONFIG_TR is not set
#
# Wireless LAN
#
# CONFIG_WLAN_PRE80211 is not set
# CONFIG_WLAN_80211 is not set
#
# USB Network Adapters
#
# CONFIG_USB_CATC is not set
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_RTL8150 is not set
# CONFIG_USB_USBNET_MII is not set
# CONFIG_USB_USBNET is not set
# CONFIG_NET_PCMCIA is not set
# CONFIG_WAN is not set
CONFIG_ATM_DRIVERS=y
# CONFIG_ATM_DUMMY is not set
# CONFIG_ATM_TCP is not set
# CONFIG_ATM_LANAI is not set
# CONFIG_ATM_ENI is not set
# CONFIG_ATM_FIRESTREAM is not set
# CONFIG_ATM_ZATM is not set
# CONFIG_ATM_IDT77252 is not set
# CONFIG_ATM_AMBASSADOR is not set
# CONFIG_ATM_HORIZON is not set
# CONFIG_ATM_FORE200E_MAYBE is not set
# CONFIG_ATM_HE is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PLIP is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set
# CONFIG_NET_FC is not set
# CONFIG_SHAPER is not set
CONFIG_NETCONSOLE=y
# CONFIG_NETCONSOLE_DYNAMIC is not set
CONFIG_NETPOLL=y
# CONFIG_NETPOLL_TRAP is not set
CONFIG_NET_POLL_CONTROLLER=y
# CONFIG_ISDN is not set
# CONFIG_PHONE is not set
#
# Input device support
#
CONFIG_INPUT=y
# CONFIG_INPUT_FF_MEMLESS is not set
# CONFIG_INPUT_POLLDEV is not set
#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_MOUSEDEV_PSAUX=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_TSDEV is not set
CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set
#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
CONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not set
# CONFIG_KEYBOARD_STOWAWAY is not set
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
# CONFIG_MOUSE_PS2_ALPS is not set
# CONFIG_MOUSE_PS2_LOGIPS2PP is not set
# CONFIG_MOUSE_PS2_SYNAPTICS is not set
# CONFIG_MOUSE_PS2_LIFEBOOK is not set
# CONFIG_MOUSE_PS2_TRACKPOINT is not set
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
# CONFIG_MOUSE_SERIAL is not set
# CONFIG_MOUSE_APPLETOUCH is not set
# CONFIG_MOUSE_VSXXXAA is not set
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TABLET is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
CONFIG_INPUT_MISC=y
CONFIG_INPUT_PCSPKR=y
# CONFIG_INPUT_ATLAS_BTNS is not set
# CONFIG_INPUT_ATI_REMOTE is not set
# CONFIG_INPUT_ATI_REMOTE2 is not set
# CONFIG_INPUT_KEYSPAN_REMOTE is not set
# CONFIG_INPUT_POWERMATE is not set
# CONFIG_INPUT_YEALINK is not set
CONFIG_INPUT_UINPUT=y
#
# Hardware I/O ports
#
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
CONFIG_SERIO_SERPORT=y
# CONFIG_SERIO_CT82C710 is not set
# CONFIG_SERIO_PARKBD is not set
# CONFIG_SERIO_PCIPS2 is not set
CONFIG_SERIO_LIBPS2=y
CONFIG_SERIO_RAW=y
# CONFIG_GAMEPORT is not set
#
# Character devices
#
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
# CONFIG_VT_HW_CONSOLE_BINDING is not set
# CONFIG_SERIAL_NONSTANDARD is not set
#
# Serial drivers
#
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_FIX_EARLYCON_MEM=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_PNP=y
# CONFIG_SERIAL_8250_CS is not set
CONFIG_SERIAL_8250_NR_UARTS=4
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
# CONFIG_SERIAL_8250_EXTENDED is not set
#
# Non-8250 serial port support
#
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
# CONFIG_SERIAL_JSM is not set
CONFIG_UNIX98_PTYS=y
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=64
CONFIG_PRINTER=m
CONFIG_LP_CONSOLE=y
CONFIG_PPDEV=y
# CONFIG_TIPAR is not set
# CONFIG_IPMI_HANDLER is not set
CONFIG_WATCHDOG=y
# CONFIG_WATCHDOG_NOWAYOUT is not set
#
# Watchdog Device Drivers
#
CONFIG_SOFT_WATCHDOG=y
# CONFIG_ACQUIRE_WDT is not set
# CONFIG_ADVANTECH_WDT is not set
# CONFIG_ALIM1535_WDT is not set
# CONFIG_ALIM7101_WDT is not set
# CONFIG_SC520_WDT is not set
# CONFIG_EUROTECH_WDT is not set
# CONFIG_IB700_WDT is not set
# CONFIG_IBMASR is not set
# CONFIG_WAFER_WDT is not set
# CONFIG_I6300ESB_WDT is not set
# CONFIG_ITCO_WDT is not set
# CONFIG_SC1200_WDT is not set
# CONFIG_PC87413_WDT is not set
# CONFIG_60XX_WDT is not set
# CONFIG_SBC8360_WDT is not set
# CONFIG_CPU5_WDT is not set
# CONFIG_SMSC37B787_WDT is not set
# CONFIG_W83627HF_WDT is not set
# CONFIG_W83697HF_WDT is not set
# CONFIG_W83877F_WDT is not set
# CONFIG_W83977F_WDT is not set
# CONFIG_MACHZ_WDT is not set
# CONFIG_SBC_EPX_C3_WATCHDOG is not set
#
# PCI-based Watchdog Cards
#
# CONFIG_PCIPCWATCHDOG is not set
# CONFIG_WDTPCI is not set
#
# USB-based Watchdog Cards
#
# CONFIG_USBPCWATCHDOG is not set
CONFIG_HW_RANDOM=y
# CONFIG_HW_RANDOM_INTEL is not set
# CONFIG_HW_RANDOM_AMD is not set
CONFIG_NVRAM=y
CONFIG_RTC=y
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
CONFIG_AGP=y
CONFIG_AGP_AMD64=y
# CONFIG_AGP_INTEL is not set
# CONFIG_AGP_SIS is not set
# CONFIG_AGP_VIA is not set
CONFIG_DRM=y
# CONFIG_DRM_TDFX is not set
# CONFIG_DRM_R128 is not set
# CONFIG_DRM_RADEON is not set
# CONFIG_DRM_MGA is not set
# CONFIG_DRM_SIS is not set
# CONFIG_DRM_VIA is not set
# CONFIG_DRM_SAVAGE is not set
#
# PCMCIA character devices
#
# CONFIG_SYNCLINK_CS is not set
# CONFIG_CARDMAN_4000 is not set
# CONFIG_CARDMAN_4040 is not set
# CONFIG_MWAVE is not set
# CONFIG_PC8736x_GPIO is not set
CONFIG_RAW_DRIVER=m
CONFIG_MAX_RAW_DEVS=4096
CONFIG_HPET=y
# CONFIG_HPET_RTC_IRQ is not set
CONFIG_HPET_MMAP=y
CONFIG_HANGCHECK_TIMER=y
# CONFIG_TCG_TPM is not set
# CONFIG_TELCLOCK is not set
CONFIG_DEVPORT=y
# CONFIG_I2C is not set
#
# SPI support
#
# CONFIG_SPI is not set
# CONFIG_SPI_MASTER is not set
# CONFIG_W1 is not set
# CONFIG_POWER_SUPPLY is not set
# CONFIG_HWMON is not set
#
# Sonics Silicon Backplane
#
CONFIG_SSB_POSSIBLE=y
CONFIG_SSB=y
CONFIG_SSB_PCIHOST_POSSIBLE=y
CONFIG_SSB_PCIHOST=y
CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
# CONFIG_SSB_PCMCIAHOST is not set
# CONFIG_SSB_SILENT is not set
# CONFIG_SSB_DEBUG is not set
CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
CONFIG_SSB_DRIVER_PCICORE=y
#
# Multifunction device drivers
#
# CONFIG_MFD_SM501 is not set
#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set
# CONFIG_DVB_CORE is not set
# CONFIG_DAB is not set
#
# Graphics support
#
CONFIG_BACKLIGHT_LCD_SUPPORT=y
# CONFIG_LCD_CLASS_DEVICE is not set
CONFIG_BACKLIGHT_CLASS_DEVICE=y
# CONFIG_BACKLIGHT_CORGI is not set
# CONFIG_BACKLIGHT_PROGEAR is not set
#
# Display device support
#
CONFIG_DISPLAY_SUPPORT=y
#
# Display hardware drivers
#
# CONFIG_VGASTATE is not set
# CONFIG_VIDEO_OUTPUT_CONTROL is not set
CONFIG_FB=y
CONFIG_FIRMWARE_EDID=y
# CONFIG_FB_DDC is not set
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
# CONFIG_FB_SYS_FILLRECT is not set
# CONFIG_FB_SYS_COPYAREA is not set
# CONFIG_FB_SYS_IMAGEBLIT is not set
# CONFIG_FB_SYS_FOPS is not set
CONFIG_FB_DEFERRED_IO=y
# CONFIG_FB_SVGALIB is not set
# CONFIG_FB_MACMODES is not set
# CONFIG_FB_BACKLIGHT is not set
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y
#
# Frame buffer hardware drivers
#
# CONFIG_FB_CIRRUS is not set
# CONFIG_FB_PM2 is not set
# CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_ARC is not set
# CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set
# CONFIG_FB_VGA16 is not set
CONFIG_FB_VESA=y
# CONFIG_FB_HECUBA is not set
# CONFIG_FB_HGA is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_NVIDIA is not set
# CONFIG_FB_RIVA is not set
# CONFIG_FB_LE80578 is not set
# CONFIG_FB_INTEL is not set
# CONFIG_FB_MATROX is not set
# CONFIG_FB_RADEON is not set
# CONFIG_FB_ATY128 is not set
# CONFIG_FB_ATY is not set
# CONFIG_FB_S3 is not set
# CONFIG_FB_SAVAGE is not set
# CONFIG_FB_SIS is not set
# CONFIG_FB_NEOMAGIC is not set
# CONFIG_FB_KYRO is not set
# CONFIG_FB_3DFX is not set
# CONFIG_FB_VOODOO1 is not set
# CONFIG_FB_VT8623 is not set
# CONFIG_FB_TRIDENT is not set
# CONFIG_FB_ARK is not set
# CONFIG_FB_PM3 is not set
# CONFIG_FB_GEODE is not set
# CONFIG_FB_VIRTUAL is not set
#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
CONFIG_VGACON_SOFT_SCROLLBACK=y
CONFIG_VGACON_SOFT_SCROLLBACK_SIZE=64
CONFIG_VIDEO_SELECT=y
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
# CONFIG_LOGO is not set
#
# Sound
#
CONFIG_SOUND=m
#
# Advanced Linux Sound Architecture
#
CONFIG_SND=m
CONFIG_SND_TIMER=m
CONFIG_SND_PCM=m
CONFIG_SND_RAWMIDI=m
CONFIG_SND_SEQUENCER=m
CONFIG_SND_SEQ_DUMMY=m
CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m
CONFIG_SND_PCM_OSS_PLUGINS=y
CONFIG_SND_SEQUENCER_OSS=y
CONFIG_SND_RTCTIMER=m
CONFIG_SND_SEQ_RTCTIMER_DEFAULT=y
CONFIG_SND_DYNAMIC_MINORS=y
CONFIG_SND_SUPPORT_OLD_API=y
# CONFIG_SND_VERBOSE_PROCFS is not set
# CONFIG_SND_VERBOSE_PRINTK is not set
# CONFIG_SND_DEBUG is not set
#
# Generic devices
#
CONFIG_SND_MPU401_UART=m
CONFIG_SND_AC97_CODEC=m
# CONFIG_SND_DUMMY is not set
# CONFIG_SND_VIRMIDI is not set
# CONFIG_SND_MTPAV is not set
# CONFIG_SND_MTS64 is not set
# CONFIG_SND_SERIAL_U16550 is not set
# CONFIG_SND_MPU401 is not set
# CONFIG_SND_PORTMAN2X4 is not set
#
# PCI devices
#
# CONFIG_SND_AD1889 is not set
# CONFIG_SND_ALS300 is not set
# CONFIG_SND_ALS4000 is not set
# CONFIG_SND_ALI5451 is not set
# CONFIG_SND_ATIIXP is not set
# CONFIG_SND_ATIIXP_MODEM is not set
# CONFIG_SND_AU8810 is not set
# CONFIG_SND_AU8820 is not set
# CONFIG_SND_AU8830 is not set
# CONFIG_SND_AZT3328 is not set
# CONFIG_SND_BT87X is not set
# CONFIG_SND_CA0106 is not set
# CONFIG_SND_CMIPCI is not set
# CONFIG_SND_CS4281 is not set
# CONFIG_SND_CS46XX is not set
# CONFIG_SND_CS5530 is not set
# CONFIG_SND_DARLA20 is not set
# CONFIG_SND_GINA20 is not set
# CONFIG_SND_LAYLA20 is not set
# CONFIG_SND_DARLA24 is not set
# CONFIG_SND_GINA24 is not set
# CONFIG_SND_LAYLA24 is not set
# CONFIG_SND_MONA is not set
# CONFIG_SND_MIA is not set
# CONFIG_SND_ECHO3G is not set
# CONFIG_SND_INDIGO is not set
# CONFIG_SND_INDIGOIO is not set
# CONFIG_SND_INDIGODJ is not set
# CONFIG_SND_EMU10K1 is not set
# CONFIG_SND_EMU10K1X is not set
# CONFIG_SND_ENS1370 is not set
# CONFIG_SND_ENS1371 is not set
# CONFIG_SND_ES1938 is not set
# CONFIG_SND_ES1968 is not set
# CONFIG_SND_FM801 is not set
CONFIG_SND_HDA_INTEL=m
# CONFIG_SND_HDSP is not set
# CONFIG_SND_HDSPM is not set
# CONFIG_SND_ICE1712 is not set
# CONFIG_SND_ICE1724 is not set
CONFIG_SND_INTEL8X0=m
# CONFIG_SND_INTEL8X0M is not set
# CONFIG_SND_KORG1212 is not set
# CONFIG_SND_MAESTRO3 is not set
# CONFIG_SND_MIXART is not set
# CONFIG_SND_NM256 is not set
# CONFIG_SND_PCXHR is not set
# CONFIG_SND_RIPTIDE is not set
# CONFIG_SND_RME32 is not set
# CONFIG_SND_RME96 is not set
# CONFIG_SND_RME9652 is not set
# CONFIG_SND_SONICVIBES is not set
# CONFIG_SND_TRIDENT is not set
CONFIG_SND_VIA82XX=m
# CONFIG_SND_VIA82XX_MODEM is not set
# CONFIG_SND_VX222 is not set
# CONFIG_SND_YMFPCI is not set
# CONFIG_SND_AC97_POWER_SAVE is not set
#
# USB devices
#
# CONFIG_SND_USB_AUDIO is not set
# CONFIG_SND_USB_USX2Y is not set
# CONFIG_SND_USB_CAIAQ is not set
#
# PCMCIA devices
#
# CONFIG_SND_VXPOCKET is not set
# CONFIG_SND_PDAUDIOCF is not set
#
# System on Chip audio support
#
# CONFIG_SND_SOC is not set
#
# SoC Audio support for SuperH
#
#
# Open Sound System
#
# CONFIG_SOUND_PRIME is not set
CONFIG_AC97_BUS=m
CONFIG_HID_SUPPORT=y
CONFIG_HID=y
# CONFIG_HID_DEBUG is not set
CONFIG_HIDRAW=y
#
# USB Input Devices
#
CONFIG_USB_HID=y
CONFIG_USB_HIDINPUT_POWERBOOK=y
# CONFIG_HID_FF is not set
CONFIG_USB_HIDDEV=y
CONFIG_USB_SUPPORT=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y
CONFIG_USB_ARCH_HAS_EHCI=y
CONFIG_USB=y
# CONFIG_USB_DEBUG is not set
#
# Miscellaneous USB options
#
CONFIG_USB_DEVICEFS=y
# CONFIG_USB_DEVICE_CLASS is not set
# CONFIG_USB_DYNAMIC_MINORS is not set
# CONFIG_USB_SUSPEND is not set
# CONFIG_USB_PERSIST is not set
# CONFIG_USB_OTG is not set
#
# USB Host Controller Drivers
#
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_SPLIT_ISO=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
# CONFIG_USB_ISP116X_HCD is not set
CONFIG_USB_OHCI_HCD=y
# CONFIG_USB_OHCI_HCD_SSB is not set
# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_UHCI_HCD=y
# CONFIG_USB_SL811_HCD is not set
# CONFIG_USB_R8A66597_HCD is not set
#
# USB Device Class drivers
#
CONFIG_USB_ACM=m
CONFIG_USB_PRINTER=m
#
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
#
#
# may also be needed; see USB_STORAGE Help for more information
#
CONFIG_USB_STORAGE=m
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_DATAFAB is not set
# CONFIG_USB_STORAGE_FREECOM is not set
# CONFIG_USB_STORAGE_ISD200 is not set
# CONFIG_USB_STORAGE_DPCM is not set
# CONFIG_USB_STORAGE_USBAT is not set
# CONFIG_USB_STORAGE_SDDR09 is not set
# CONFIG_USB_STORAGE_SDDR55 is not set
# CONFIG_USB_STORAGE_JUMPSHOT is not set
# CONFIG_USB_STORAGE_ALAUDA is not set
# CONFIG_USB_STORAGE_KARMA is not set
CONFIG_USB_LIBUSUAL=y
#
# USB Imaging devices
#
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_MICROTEK is not set
CONFIG_USB_MON=y
#
# USB port drivers
#
# CONFIG_USB_USS720 is not set
#
# USB Serial Converter support
#
CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_GENERIC=y
# CONFIG_USB_SERIAL_AIRCABLE is not set
# CONFIG_USB_SERIAL_AIRPRIME is not set
# CONFIG_USB_SERIAL_ARK3116 is not set
CONFIG_USB_SERIAL_BELKIN=m
# CONFIG_USB_SERIAL_CH341 is not set
# CONFIG_USB_SERIAL_WHITEHEAT is not set
# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
# CONFIG_USB_SERIAL_CP2101 is not set
# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
# CONFIG_USB_SERIAL_EMPEG is not set
# CONFIG_USB_SERIAL_FTDI_SIO is not set
# CONFIG_USB_SERIAL_FUNSOFT is not set
# CONFIG_USB_SERIAL_VISOR is not set
# CONFIG_USB_SERIAL_IPAQ is not set
# CONFIG_USB_SERIAL_IR is not set
# CONFIG_USB_SERIAL_EDGEPORT is not set
# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
# CONFIG_USB_SERIAL_GARMIN is not set
# CONFIG_USB_SERIAL_IPW is not set
# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
# CONFIG_USB_SERIAL_KEYSPAN is not set
# CONFIG_USB_SERIAL_KLSI is not set
# CONFIG_USB_SERIAL_KOBIL_SCT is not set
# CONFIG_USB_SERIAL_MCT_U232 is not set
# CONFIG_USB_SERIAL_MOS7720 is not set
# CONFIG_USB_SERIAL_MOS7840 is not set
# CONFIG_USB_SERIAL_NAVMAN is not set
# CONFIG_USB_SERIAL_PL2303 is not set
# CONFIG_USB_SERIAL_OTI6858 is not set
# CONFIG_USB_SERIAL_HP4X is not set
# CONFIG_USB_SERIAL_SAFE is not set
# CONFIG_USB_SERIAL_SIERRAWIRELESS is not set
# CONFIG_USB_SERIAL_TI is not set
# CONFIG_USB_SERIAL_CYBERJACK is not set
# CONFIG_USB_SERIAL_XIRCOM is not set
# CONFIG_USB_SERIAL_OPTION is not set
# CONFIG_USB_SERIAL_OMNINET is not set
CONFIG_USB_SERIAL_DEBUG=m
#
# USB Miscellaneous drivers
#
# CONFIG_USB_EMI62 is not set
# CONFIG_USB_EMI26 is not set
# CONFIG_USB_ADUTUX is not set
# CONFIG_USB_AUERSWALD is not set
# CONFIG_USB_RIO500 is not set
# CONFIG_USB_LEGOTOWER is not set
# CONFIG_USB_LCD is not set
# CONFIG_USB_BERRY_CHARGE is not set
# CONFIG_USB_LED is not set
# CONFIG_USB_CYPRESS_CY7C63 is not set
# CONFIG_USB_CYTHERM is not set
# CONFIG_USB_PHIDGET is not set
# CONFIG_USB_IDMOUSE is not set
# CONFIG_USB_FTDI_ELAN is not set
# CONFIG_USB_APPLEDISPLAY is not set
# CONFIG_USB_SISUSBVGA is not set
# CONFIG_USB_LD is not set
# CONFIG_USB_TRANCEVIBRATOR is not set
# CONFIG_USB_IOWARRIOR is not set
# CONFIG_USB_TEST is not set
#
# USB DSL modem support
#
# CONFIG_USB_ATM is not set
#
# USB Gadget Support
#
# CONFIG_USB_GADGET is not set
# CONFIG_MMC is not set
# CONFIG_NEW_LEDS is not set
# CONFIG_INFINIBAND is not set
# CONFIG_EDAC is not set
# CONFIG_RTC_CLASS is not set
#
# DMA Engine support
#
# CONFIG_DMA_ENGINE is not set
#
# DMA Clients
#
#
# DMA Devices
#
# CONFIG_AUXDISPLAY is not set
# CONFIG_VIRTUALIZATION is not set
#
# Userspace I/O
#
# CONFIG_UIO is not set
#
# Firmware Drivers
#
CONFIG_EDD=m
CONFIG_DELL_RBU=m
CONFIG_DCDBAS=m
CONFIG_DMIID=y
#
# File systems
#
CONFIG_EXT2_FS=y
# CONFIG_EXT2_FS_XATTR is not set
# CONFIG_EXT2_FS_XIP is not set
CONFIG_EXT3_FS=y
# CONFIG_EXT3_FS_XATTR is not set
CONFIG_EXT4DEV_FS=m
CONFIG_EXT4DEV_FS_XATTR=y
CONFIG_EXT4DEV_FS_POSIX_ACL=y
CONFIG_EXT4DEV_FS_SECURITY=y
CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set
CONFIG_JBD2=m
CONFIG_JBD2_DEBUG=y
CONFIG_FS_MBCACHE=y
CONFIG_REISERFS_FS=m
# CONFIG_REISERFS_CHECK is not set
CONFIG_REISERFS_PROC_INFO=y
# CONFIG_REISERFS_FS_XATTR is not set
CONFIG_JFS_FS=m
# CONFIG_JFS_POSIX_ACL is not set
# CONFIG_JFS_SECURITY is not set
# CONFIG_JFS_DEBUG is not set
CONFIG_JFS_STATISTICS=y
CONFIG_FS_POSIX_ACL=y
CONFIG_XFS_FS=m
# CONFIG_XFS_QUOTA is not set
# CONFIG_XFS_SECURITY is not set
# CONFIG_XFS_POSIX_ACL is not set
# CONFIG_XFS_RT is not set
CONFIG_GFS2_FS=m
CONFIG_GFS2_FS_LOCKING_NOLOCK=m
CONFIG_GFS2_FS_LOCKING_DLM=m
CONFIG_OCFS2_FS=m
CONFIG_OCFS2_DEBUG_MASKLOG=y
CONFIG_MINIX_FS=m
CONFIG_ROMFS_FS=m
CONFIG_INOTIFY=y
CONFIG_INOTIFY_USER=y
CONFIG_QUOTA=y
CONFIG_QFMT_V1=y
CONFIG_QFMT_V2=y
CONFIG_QUOTACTL=y
CONFIG_DNOTIFY=y
CONFIG_AUTOFS_FS=m
CONFIG_AUTOFS4_FS=m
CONFIG_FUSE_FS=m
#
# CD-ROM/DVD Filesystems
#
CONFIG_ISO9660_FS=m
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
CONFIG_UDF_FS=m
CONFIG_UDF_NLS=y
#
# DOS/FAT/NT Filesystems
#
CONFIG_FAT_FS=m
CONFIG_MSDOS_FS=m
CONFIG_VFAT_FS=m
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
CONFIG_NTFS_FS=m
# CONFIG_NTFS_DEBUG is not set
# CONFIG_NTFS_RW is not set
#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_VMCORE=y
CONFIG_PROC_SYSCTL=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
# CONFIG_TMPFS_POSIX_ACL is not set
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_RAMFS=y
CONFIG_CONFIGFS_FS=m
#
# Miscellaneous filesystems
#
CONFIG_ADFS_FS=m
# CONFIG_ADFS_FS_RW is not set
CONFIG_AFFS_FS=m
CONFIG_ECRYPT_FS=m
CONFIG_HFS_FS=m
CONFIG_HFSPLUS_FS=m
CONFIG_BEFS_FS=m
# CONFIG_BEFS_DEBUG is not set
CONFIG_BFS_FS=m
CONFIG_EFS_FS=m
CONFIG_CRAMFS=m
CONFIG_VXFS_FS=m
CONFIG_HPFS_FS=m
CONFIG_QNX4FS_FS=m
CONFIG_SYSV_FS=m
CONFIG_UFS_FS=m
# CONFIG_UFS_FS_WRITE is not set
# CONFIG_UFS_DEBUG is not set
#
# Network File Systems
#
CONFIG_NFS_FS=m
# CONFIG_NFS_V3 is not set
# CONFIG_NFS_V4 is not set
# CONFIG_NFS_DIRECTIO is not set
CONFIG_NFSD=m
# CONFIG_NFSD_V3 is not set
CONFIG_NFSD_TCP=y
CONFIG_LOCKD=m
CONFIG_EXPORTFS=m
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=m
CONFIG_SUNRPC_GSS=m
# CONFIG_SUNRPC_BIND34 is not set
CONFIG_RPCSEC_GSS_KRB5=m
CONFIG_RPCSEC_GSS_SPKM3=m
CONFIG_SMB_FS=m
# CONFIG_SMB_NLS_DEFAULT is not set
CONFIG_CIFS=m
# CONFIG_CIFS_STATS is not set
# CONFIG_CIFS_WEAK_PW_HASH is not set
# CONFIG_CIFS_XATTR is not set
# CONFIG_CIFS_DEBUG2 is not set
# CONFIG_CIFS_EXPERIMENTAL is not set
CONFIG_NCP_FS=m
# CONFIG_NCPFS_PACKET_SIGNING is not set
# CONFIG_NCPFS_IOCTL_LOCKING is not set
# CONFIG_NCPFS_STRONG is not set
# CONFIG_NCPFS_NFS_NS is not set
# CONFIG_NCPFS_OS2_NS is not set
# CONFIG_NCPFS_SMALLDOS is not set
# CONFIG_NCPFS_NLS is not set
# CONFIG_NCPFS_EXTRAS is not set
CONFIG_CODA_FS=m
# CONFIG_CODA_FS_OLD_API is not set
CONFIG_AFS_FS=m
# CONFIG_AFS_DEBUG is not set
# CONFIG_9P_FS is not set
#
# Partition Types
#
CONFIG_PARTITION_ADVANCED=y
# CONFIG_ACORN_PARTITION is not set
# CONFIG_OSF_PARTITION is not set
# CONFIG_AMIGA_PARTITION is not set
# CONFIG_ATARI_PARTITION is not set
# CONFIG_MAC_PARTITION is not set
CONFIG_MSDOS_PARTITION=y
# CONFIG_BSD_DISKLABEL is not set
# CONFIG_MINIX_SUBPARTITION is not set
# CONFIG_SOLARIS_X86_PARTITION is not set
# CONFIG_UNIXWARE_DISKLABEL is not set
# CONFIG_LDM_PARTITION is not set
# CONFIG_SGI_PARTITION is not set
# CONFIG_ULTRIX_PARTITION is not set
# CONFIG_SUN_PARTITION is not set
# CONFIG_KARMA_PARTITION is not set
CONFIG_EFI_PARTITION=y
# CONFIG_SYSV68_PARTITION is not set
#
# Native Language Support
#
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="utf8"
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_CODEPAGE_737=m
CONFIG_NLS_CODEPAGE_775=m
CONFIG_NLS_CODEPAGE_850=y
CONFIG_NLS_CODEPAGE_852=m
CONFIG_NLS_CODEPAGE_855=m
CONFIG_NLS_CODEPAGE_857=m
CONFIG_NLS_CODEPAGE_860=m
CONFIG_NLS_CODEPAGE_861=m
CONFIG_NLS_CODEPAGE_862=m
CONFIG_NLS_CODEPAGE_863=m
CONFIG_NLS_CODEPAGE_864=m
CONFIG_NLS_CODEPAGE_865=m
CONFIG_NLS_CODEPAGE_866=m
CONFIG_NLS_CODEPAGE_869=m
CONFIG_NLS_CODEPAGE_936=m
CONFIG_NLS_CODEPAGE_950=m
CONFIG_NLS_CODEPAGE_932=m
CONFIG_NLS_CODEPAGE_949=m
CONFIG_NLS_CODEPAGE_874=m
CONFIG_NLS_ISO8859_8=m
CONFIG_NLS_CODEPAGE_1250=m
CONFIG_NLS_CODEPAGE_1251=m
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_ISO8859_2=m
CONFIG_NLS_ISO8859_3=m
CONFIG_NLS_ISO8859_4=m
CONFIG_NLS_ISO8859_5=m
CONFIG_NLS_ISO8859_6=m
CONFIG_NLS_ISO8859_7=m
CONFIG_NLS_ISO8859_9=m
CONFIG_NLS_ISO8859_13=m
CONFIG_NLS_ISO8859_14=m
CONFIG_NLS_ISO8859_15=y
CONFIG_NLS_KOI8_R=m
CONFIG_NLS_KOI8_U=m
CONFIG_NLS_UTF8=y
#
# Distributed Lock Manager
#
CONFIG_DLM=m
# CONFIG_DLM_DEBUG is not set
#
# Instrumentation Support
#
CONFIG_PROFILING=y
CONFIG_OPROFILE=m
CONFIG_KPROBES=y
#
# Kernel hacking
#
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
# CONFIG_PRINTK_TIME is not set
# CONFIG_ENABLE_MUST_CHECK is not set
CONFIG_MAGIC_SYSRQ=y
CONFIG_UNUSED_SYMBOLS=y
CONFIG_DEBUG_FS=y
# CONFIG_HEADERS_CHECK is not set
CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SHIRQ is not set
CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_SCHED_DEBUG is not set
CONFIG_SCHEDSTATS=y
CONFIG_TIMER_STATS=y
# CONFIG_DEBUG_SLAB is not set
# CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_RT_MUTEX_TESTER is not set
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_MUTEXES=y
CONFIG_DEBUG_LOCK_ALLOC=y
# CONFIG_PROVE_LOCKING is not set
CONFIG_LOCKDEP=y
CONFIG_LOCK_STAT=y
# CONFIG_DEBUG_LOCKDEP is not set
CONFIG_DEBUG_SPINLOCK_SLEEP=y
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
CONFIG_STACKTRACE=y
# CONFIG_DEBUG_KOBJECT is not set
CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_VM is not set
CONFIG_DEBUG_LIST=y
CONFIG_FRAME_POINTER=y
CONFIG_FORCED_INLINING=y
# CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_LKDTM is not set
# CONFIG_FAULT_INJECTION is not set
CONFIG_DEBUG_RODATA=y
CONFIG_IOMMU_DEBUG=y
# CONFIG_IOMMU_LEAK is not set
CONFIG_DEBUG_STACKOVERFLOW=y
CONFIG_DEBUG_STACK_USAGE=y
#
# Security options
#
CONFIG_KEYS=y
CONFIG_KEYS_DEBUG_PROC_KEYS=y
CONFIG_SECURITY=y
CONFIG_SECURITY_NETWORK=y
CONFIG_SECURITY_NETWORK_XFRM=y
CONFIG_SECURITY_CAPABILITIES=m
CONFIG_SECURITY_ROOTPLUG=m
# CONFIG_SECURITY_SELINUX is not set
CONFIG_CRYPTO=y
CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_ABLKCIPHER=m
CONFIG_CRYPTO_AEAD=m
CONFIG_CRYPTO_BLKCIPHER=y
CONFIG_CRYPTO_HASH=y
CONFIG_CRYPTO_MANAGER=y
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_XCBC=m
CONFIG_CRYPTO_NULL=m
CONFIG_CRYPTO_MD4=m
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_SHA512=m
CONFIG_CRYPTO_WP512=m
CONFIG_CRYPTO_TGR192=m
CONFIG_CRYPTO_GF128MUL=y
CONFIG_CRYPTO_ECB=m
CONFIG_CRYPTO_CBC=y
CONFIG_CRYPTO_PCBC=m
CONFIG_CRYPTO_LRW=m
CONFIG_CRYPTO_XTS=m
CONFIG_CRYPTO_CRYPTD=m
CONFIG_CRYPTO_DES=y
CONFIG_CRYPTO_FCRYPT=m
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_TWOFISH=m
CONFIG_CRYPTO_TWOFISH_COMMON=m
CONFIG_CRYPTO_TWOFISH_X86_64=m
CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_AES=m
CONFIG_CRYPTO_AES_X86_64=m
CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST6=m
CONFIG_CRYPTO_TEA=m
CONFIG_CRYPTO_ARC4=m
CONFIG_CRYPTO_KHAZAD=m
CONFIG_CRYPTO_ANUBIS=m
CONFIG_CRYPTO_SEED=m
CONFIG_CRYPTO_DEFLATE=y
CONFIG_CRYPTO_MICHAEL_MIC=m
CONFIG_CRYPTO_CRC32C=m
CONFIG_CRYPTO_CAMELLIA=m
# CONFIG_CRYPTO_TEST is not set
CONFIG_CRYPTO_AUTHENC=m
CONFIG_CRYPTO_HW=y
#
# Library routines
#
CONFIG_BITREVERSE=y
CONFIG_CRC_CCITT=y
CONFIG_CRC16=y
CONFIG_CRC_ITU_T=y
CONFIG_CRC32=y
CONFIG_CRC7=y
CONFIG_LIBCRC32C=y
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=m
CONFIG_TEXTSEARCH_BM=m
CONFIG_TEXTSEARCH_FSM=m
CONFIG_PLIST=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y
^ permalink raw reply
* Re: [PATCH] Disable polling in rtl8169_suspend() to prevent race with rtl8169_interrupt()
From: Francois Romieu @ 2007-10-16 21:04 UTC (permalink / raw)
To: Karsten Wiese; +Cc: netdev
In-Reply-To: <200710162127.52228.fzu@wemgehoertderstaat.de>
Karsten Wiese <fzu@wemgehoertderstaat.de> :
[...]
> Forgot to say: patch is against 2.6.23. Stable material, if it gets an ACK.
> The BUG happens since months here, if not since I hibernate this pc.
Can you give the patch below a try too ?
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index 285b2b2..fcd79b7 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -2424,6 +2424,7 @@ static void rtl8169_reset_task(struct work_struct *work)
rtl8169_init_ring_indexes(tp);
rtl_hw_start(dev);
netif_wake_queue(dev);
+ rtl8169_check_link_status(dev, tp, tp->mmio_addr);
} else {
if (net_ratelimit() && netif_msg_intr(tp)) {
printk(PFX KERN_EMERG "%s: Rx buffers shortage\n",
--
Ueimor
^ permalink raw reply related
* RE: Multicast problem
From: Joakim Tjernlund @ 2007-10-16 21:15 UTC (permalink / raw)
To: 'Stephen Hemminger'
Cc: 'David Stevens', 'Netdev', Li Yang
> > >
> > > OK, so from all this and earlier mail I think that the
> > device driver don't
> > > receive multicast pkgs. Tomorrow I will try the real OSPF
> > test case with
> > > promisc mode enabled, se if that works. If so, it means there is
> > > a bug in the drivers(ucc_geth.c) set_multicast_list() function.
> > >
> > > Thank you for helping me to narrow it down.
> > >
> > > Jocke
> >
> > You can test multicast easily standalone with iperf:
> > http://dast.nlanr.net/Projects/Iperf/#multicast
> >
>
> Thanks, will give it a try.
>
Managed to cross compile iperf and ran the test. I need promisc mode
on the ethernet i/f to receive anything from that test so I guess this
confirms it, the set_multicast_list() in ucc_geth driver is broken.
Leo, forgot to CC you earlier. Seem like the multicast function
is somewhat buggy.
Jocke
^ permalink raw reply
* Re: [PATCH/RFC] net: Add __napi_sycnhronize() to sync with napi poll
From: Benjamin Herrenschmidt @ 2007-10-16 21:14 UTC (permalink / raw)
To: Stephen Hemminger
Cc: netdev, David S. Miller, Roland Dreier, linuxppc-dev list
In-Reply-To: <20071016115318.0fc36af3@freepuppy.rosehill>
> So this is really just like synchronize_irq()? Using msleep is bogus
> because you want to spin, you are only waiting for a softirq on the other
> cpu to finish. If you wait for a whole millisecond and sleep that
> is far longer than the napi routine should take.
>
> You could even optimize it like synchronize_irq() for the non-SMP case.
It's just like synchronize_irq() indeed. I used the mlseep() just like
napi_disable() mostly because I use it in a very similar context, for
disabling my sub-channels on things like link change etc... where I need
to reconfigure parts of the chip.
I prefer sleeping in my case but I agree that if somebody else was going
to use for something else more performance critical, it might be an
issue. On the other hand, spinning will not be nice for my usage
scenario :-)
I agree about the SMP optimisation though again, in my usage pattern,
it's very unimportant (similar code path as napi_disable)
I'll respin later today though.
Cheers,
Ben.
^ 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