[PATCH 22/26] atl1: update netpoll

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Rename atl1_poll_controller() to atl1_netpoll() and update to conform with
the current vendor driver version 1.2.40.2.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   11 +++
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 997c83c..f09928d 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -2691,11 +2691,14 @@ static int atl1_resume(struct pci_dev *pdev)
 #endif
 
 #ifdef CONFIG_NET_POLL_CONTROLLER
-static void atl1_poll_controller(struct net_device *netdev)
+static void atl1_netpoll(struct net_device *netdev)
 {
-   disable_irq(netdev->irq);
+   struct atl1_adapter *adapter = netdev_priv(netdev);
+
+   disable_irq(adapter->pdev->irq);
atl1_intr(netdev->irq, netdev);
-   enable_irq(netdev->irq);
+   atl1_clean_tx_irq(adapter);
+   enable_irq(adapter->pdev->irq);
 }
 #endif
 
@@ -2796,7 +2799,7 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
netdev->tx_timeout = &atlx_tx_timeout;
netdev->watchdog_timeo = 5 * HZ;
 #ifdef CONFIG_NET_POLL_CONTROLLER
-   netdev->poll_controller = atl1_poll_controller;
+   netdev->poll_controller = atl1_netpoll;
 #endif
netdev->vlan_rx_register = atlx_vlan_rx_register;
 
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 26/26] atl1: remove experimental tag and clean up comments

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

All major netdevice functionality is now present in the atl1 driver.  As
a result, remove the EXPERIMENTAL Kconfig tag in the main driver, but leave
it in the NAPI driver.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/Kconfig |4 ++--
 drivers/net/atlx/atl1.c |8 ++--
 drivers/net/atlx/atl1.h |2 +-
 drivers/net/atlx/atlx.c |5 ++---
 drivers/net/atlx/atlx.h |5 ++---
 5 files changed, 9 insertions(+), 15 deletions(-)

diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 095629f..638b90d 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -2361,8 +2361,8 @@ config QLA3XXX
  will be called qla3xxx.
 
 config ATL1
-   tristate "Attansic L1 Gigabit Ethernet support (EXPERIMENTAL)"
-   depends on PCI && EXPERIMENTAL
+   tristate "Attansic L1 Gigabit Ethernet support"
+   depends on PCI
select CRC32
select MII
help
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 10bccf6..411cd82 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -1,7 +1,7 @@
 /*
  * Copyright(c) 2005 - 2006 Attansic Corporation. All rights reserved.
  * Copyright(c) 2006 - 2007 Chris Snook <[EMAIL PROTECTED]>
- * Copyright(c) 2006 Jay Cliburn <[EMAIL PROTECTED]>
+ * Copyright(c) 2006 - 2007 Jay Cliburn <[EMAIL PROTECTED]>
  *
  * Derived from Intel e1000 driver
  * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
@@ -31,13 +31,9 @@
  * Chris Snook <[EMAIL PROTECTED]>
  * Jay Cliburn <[EMAIL PROTECTED]>
  *
- * This version is adapted from the Attansic reference driver for
- * inclusion in the Linux kernel.  It is currently under heavy development.
- * A very incomplete list of things that need to be dealt with:
+ * This version is adapted from the Attansic reference driver.
  *
  * TODO:
- * Wake on LAN.
- * Add more ethtool functions.
  * Fix abstruse irq enable/disable condition described here:
  * http://marc.theaimsgroup.com/?l=linux-netdev&m=116398508500553&w=2
  *
diff --git a/drivers/net/atlx/atl1.h b/drivers/net/atlx/atl1.h
index a1757a9..82129be 100644
--- a/drivers/net/atlx/atl1.h
+++ b/drivers/net/atlx/atl1.h
@@ -1,7 +1,7 @@
 /*
  * Copyright(c) 2005 - 2006 Attansic Corporation. All rights reserved.
  * Copyright(c) 2006 - 2007 Chris Snook <[EMAIL PROTECTED]>
- * Copyright(c) 2006 Jay Cliburn <[EMAIL PROTECTED]>
+ * Copyright(c) 2006 - 2007 Jay Cliburn <[EMAIL PROTECTED]>
  *
  * Derived from Intel e1000 driver
  * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved.
diff --git a/drivers/net/atlx/atlx.c b/drivers/net/atlx/atlx.c
index 9cc9441..fb3dd7a 100644
--- a/drivers/net/atlx/atlx.c
+++ b/drivers/net/atlx/atlx.c
@@ -1,8 +1,7 @@
-/* atlx.c -- common functions for Attansic network drivers
- *
+/*
  * Copyright(c) 2005 - 2006 Attansic Corporation. All rights reserved.
  * Copyright(c) 2006 - 2007 Chris Snook <[EMAIL PROTECTED]>
- * Copyright(c) 2006 Jay Cliburn <[EMAIL PROTECTED]>
+ * Copyright(c) 2006 - 2007 Jay Cliburn <[EMAIL PROTECTED]>
  * Copyright(c) 2007 Atheros Corporation. All rights reserved.
  *
  * Derived from Intel e1000 driver
diff --git a/drivers/net/atlx/atlx.h b/drivers/net/atlx/atlx.h
index 18021d9..3c39b27 100644
--- a/drivers/net/atlx/atlx.h
+++ b/drivers/net/atlx/atlx.h
@@ -1,8 +1,7 @@
-/* atlx_hw.h -- common hardware definitions for Attansic network drivers
- *
+/*
  * Copyright(c) 2005 - 2006 Attansic Corporation. All rights reserved.
  * Copyright(c) 2006 - 2007 Chris Snook <[EMAIL PROTECTED]>
- * Copyright(c) 2006 Jay Cliburn <[EMAIL PROTECTED]>
+ * Copyright(c) 2006 - 2007 Jay Cliburn <[EMAIL PROTECTED]>
  * Copyright(c) 2007 Atheros Corporation. All rights reserved.
  *
  * Derived from Intel e1000 driver
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 14/26] atl1: move stray defines to header file

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Move some stray defines out to a header file.  Improve indentation from
ghastly to horrid.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   29 -
 drivers/net/atlx/atl1.h |6 ++
 2 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 9c86ef4..f40cc6e 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -217,12 +217,6 @@ static s32 atl1_read_phy_reg(struct atl1_hw *hw, u16 
reg_addr, u16 *phy_data)
return ATLX_ERR_PHY;
 }
 
-#define CUSTOM_SPI_CS_SETUP2
-#define CUSTOM_SPI_CLK_HI  2
-#define CUSTOM_SPI_CLK_LO  2
-#define CUSTOM_SPI_CS_HOLD 2
-#define CUSTOM_SPI_CS_HI   3
-
 static bool atl1_spi_read(struct atl1_hw *hw, u32 addr, u32 *buf)
 {
int i;
@@ -232,17 +226,18 @@ static bool atl1_spi_read(struct atl1_hw *hw, u32 addr, 
u32 *buf)
iowrite32(addr, hw->hw_addr + REG_SPI_ADDR);
 
value = SPI_FLASH_CTRL_WAIT_READY |
-   (CUSTOM_SPI_CS_SETUP & SPI_FLASH_CTRL_CS_SETUP_MASK) <<
-   SPI_FLASH_CTRL_CS_SETUP_SHIFT | (CUSTOM_SPI_CLK_HI &
-SPI_FLASH_CTRL_CLK_HI_MASK) <<
-   SPI_FLASH_CTRL_CLK_HI_SHIFT | (CUSTOM_SPI_CLK_LO &
-  SPI_FLASH_CTRL_CLK_LO_MASK) <<
-   SPI_FLASH_CTRL_CLK_LO_SHIFT | (CUSTOM_SPI_CS_HOLD &
-  SPI_FLASH_CTRL_CS_HOLD_MASK) <<
-   SPI_FLASH_CTRL_CS_HOLD_SHIFT | (CUSTOM_SPI_CS_HI &
-   SPI_FLASH_CTRL_CS_HI_MASK) <<
-   SPI_FLASH_CTRL_CS_HI_SHIFT | (1 & SPI_FLASH_CTRL_INS_MASK) <<
-   SPI_FLASH_CTRL_INS_SHIFT;
+   (CUSTOM_SPI_CS_SETUP & SPI_FLASH_CTRL_CS_SETUP_MASK) <<
+   SPI_FLASH_CTRL_CS_SETUP_SHIFT |
+   (CUSTOM_SPI_CLK_HI & SPI_FLASH_CTRL_CLK_HI_MASK) <<
+   SPI_FLASH_CTRL_CLK_HI_SHIFT |
+   (CUSTOM_SPI_CLK_LO & SPI_FLASH_CTRL_CLK_LO_MASK) <<
+   SPI_FLASH_CTRL_CLK_LO_SHIFT |
+   (CUSTOM_SPI_CS_HOLD & SPI_FLASH_CTRL_CS_HOLD_MASK) <<
+   SPI_FLASH_CTRL_CS_HOLD_SHIFT |
+   (CUSTOM_SPI_CS_HI & SPI_FLASH_CTRL_CS_HI_MASK) <<
+   SPI_FLASH_CTRL_CS_HI_SHIFT |
+   (1 & SPI_FLASH_CTRL_INS_MASK) <<
+   SPI_FLASH_CTRL_INS_SHIFT;
 
iowrite32(value, hw->hw_addr + REG_SPI_FLASH_CTRL);
 
diff --git a/drivers/net/atlx/atl1.h b/drivers/net/atlx/atl1.h
index 8198f82..3db9a34 100644
--- a/drivers/net/atlx/atl1.h
+++ b/drivers/net/atlx/atl1.h
@@ -335,6 +335,12 @@ extern const struct ethtool_ops atl1_ethtool_ops;
 
 #define ATL1_EEDUMP_LEN48
 
+#define CUSTOM_SPI_CS_SETUP2
+#define CUSTOM_SPI_CLK_HI  2
+#define CUSTOM_SPI_CLK_LO  2
+#define CUSTOM_SPI_CS_HOLD 2
+#define CUSTOM_SPI_CS_HI   3
+
 /* Statistics counters collected by the MAC */
 struct stats_msg_block {
/* rx */
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 20/26] atl1: update change mtu

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Update atl1_change_mtu() to conform with the current vendor driver version
1.2.40.2.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   39 ++-
 1 files changed, 22 insertions(+), 17 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 972de34..7d84a51 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -2438,32 +2438,37 @@ static void atl1_reset_task(struct work_struct *work)
  * atl1_change_mtu - Change the Maximum Transfer Unit
  * @netdev: network interface device structure
  * @new_mtu: new value for maximum frame size
- *
- * Returns 0 on success, negative on failure
  */
 static int atl1_change_mtu(struct net_device *netdev, int new_mtu)
 {
struct atl1_adapter *adapter = netdev_priv(netdev);
-   int old_mtu = netdev->mtu;
-   int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
+   struct atl1_hw *hw = &adapter->hw;
 
-   if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
-   (max_frame > MAX_JUMBO_FRAME_SIZE)) {
-   dev_warn(&adapter->pdev->dev, "invalid MTU setting\n");
+   if ((new_mtu < 40) || (new_mtu > (ETH_DATA_LEN + VLAN_HLEN)))
return -EINVAL;
-   }
 
-   adapter->hw.max_frame_size = max_frame;
-   adapter->hw.tx_jumbo_task_th = (max_frame + 7) >> 3;
-   adapter->rx_buffer_len = (max_frame + 7) & ~7;
-   adapter->hw.rx_jumbo_th = adapter->rx_buffer_len / 8;
+   if (hw->max_frame_size != new_mtu) {
+   while (test_and_set_bit(__ATL1_RESETTING, &adapter->flags))
+   msleep(1);
 
-   netdev->mtu = new_mtu;
-   if ((old_mtu != new_mtu) && netif_running(netdev)) {
-   atl1_down(adapter);
-   atl1_up(adapter);
-   }
+   if (netif_running(netdev))
+   atl1_down(adapter);
+
+   netdev->mtu = new_mtu;
+   adapter->hw.max_frame_size = new_mtu;
+   adapter->hw.tx_jumbo_task_th = (new_mtu + ETH_HLEN +
+   ETH_FCS_LEN + VLAN_HLEN + 7) >> 3;
+   adapter->rx_buffer_len = (new_mtu + ETH_HLEN +
+   ETH_FCS_LEN + VLAN_HLEN + 7) & ~7;
+   adapter->hw.rx_jumbo_th = adapter->rx_buffer_len / 8;
 
+   if (netif_running(netdev))
+   atl1_up(adapter);
+   else
+   atl1_reset(adapter);
+
+   clear_bit(__ATL1_RESETTING, &adapter->flags);
+   }
return 0;
 }
 
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 21/26] atl1: update atl1_close

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Update atl1_close() to conform with current vendor driver version 1.2.40.2.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   14 ++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 7d84a51..997c83c 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -2558,6 +2558,18 @@ err_open:
return err;
 }
 
+static void atl1_free_irq(struct atl1_adapter *adapter)
+{
+   struct net_device *netdev = adapter->netdev;
+
+   free_irq(adapter->pdev->irq, netdev);
+
+#ifdef CONFIG_PCI_MSI
+   if (adapter->have_msi)
+   pci_disable_msi(adapter->pdev);
+#endif
+}
+
 /*
  * atl1_close - Disables a network interface
  * @netdev: network interface device structure
@@ -2572,7 +2584,9 @@ err_open:
 static int atl1_close(struct net_device *netdev)
 {
struct atl1_adapter *adapter = netdev_priv(netdev);
+
atl1_down(adapter);
+   atl1_free_irq(adapter);
atl1_free_ring_resources(adapter);
return 0;
 }
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 18/26] atl1: make function static

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Make atl1_reset() a static function.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   11 ++-
 1 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 6432956..7697e80 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -2351,12 +2351,13 @@ static void atl1_phy_config(unsigned long data)
clear_bit(0, &adapter->cfg_phy);
 }
 
-int atl1_reset(struct atl1_adapter *adapter)
+static int atl1_reset(struct atl1_adapter *adapter)
 {
-   int ret;
-   ret = atl1_reset_hw(&adapter->hw);
-   if (ret)
-   return ret;
+   int retval;
+
+   retval = atl1_reset_hw(&adapter->hw);
+   if (retval)
+   return retval;
return atl1_init_hw(&adapter->hw);
 }
 
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 16/26] atl1: modernize check link function

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Update atl1_check_link() to conform with the current vendor driver version
1.2.40.2.  Clean up vertical spacing, indentation, and remove dead code.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   65 +++---
 drivers/net/atlx/atl1.h |1 +
 2 files changed, 22 insertions(+), 44 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index db6e76c..abed547 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -1094,6 +1094,7 @@ static void atl1_setup_mac_ctrl(struct atl1_adapter 
*adapter)
u32 value;
struct atl1_hw *hw = &adapter->hw;
struct net_device *netdev = adapter->netdev;
+
/* Config MAC CTRL Register */
value = MAC_CTRL_TX_EN | MAC_CTRL_RX_EN;
/* duplex */
@@ -1101,8 +1102,8 @@ static void atl1_setup_mac_ctrl(struct atl1_adapter 
*adapter)
value |= MAC_CTRL_DUPLX;
/* speed */
value |= ((u32) ((SPEED_1000 == adapter->link_speed) ?
-MAC_CTRL_SPEED_1000 : MAC_CTRL_SPEED_10_100) <<
- MAC_CTRL_SPEED_SHIFT);
+   MAC_CTRL_SPEED_1000 : MAC_CTRL_SPEED_10_100) <<
+   MAC_CTRL_SPEED_SHIFT);
/* flow control */
value |= (MAC_CTRL_TX_FLOW | MAC_CTRL_RX_FLOW);
/* PAD & CRC */
@@ -1113,10 +1114,6 @@ static void atl1_setup_mac_ctrl(struct atl1_adapter 
*adapter)
/* vlan */
if (adapter->vlgrp)
value |= MAC_CTRL_RMV_VLAN;
-   /* rx checksum
-  if (adapter->rx_csum)
-  value |= MAC_CTRL_RX_CHKSUM_EN;
-*/
/* filter mode */
value |= MAC_CTRL_BC_EN;
if (netdev->flags & IFF_PROMISC)
@@ -1131,7 +1128,7 @@ static u32 atl1_check_link(struct atl1_adapter *adapter)
 {
struct atl1_hw *hw = &adapter->hw;
struct net_device *netdev = adapter->netdev;
-   u32 ret_val;
+   u32 val, retval;
u16 speed, duplex, phy_data;
int reconfig = 0;
 
@@ -1143,6 +1140,10 @@ static u32 atl1_check_link(struct atl1_adapter *adapter)
if (netif_carrier_ok(netdev)) {
/* old link state: Up */
dev_info(&adapter->pdev->dev, "link is down\n");
+   val = ioread32(hw->hw_addr + REG_MAC_CTRL);
+   val &= ~MAC_CTRL_RX_EN;
+   iowrite32(val, hw->hw_addr + REG_MAC_CTRL);
+   ioread32(hw->hw_addr + REG_MAC_CTRL);
adapter->link_speed = SPEED_0;
netif_carrier_off(netdev);
netif_stop_queue(netdev);
@@ -1151,15 +1152,12 @@ static u32 atl1_check_link(struct atl1_adapter *adapter)
}
 
/* Link Up */
-   ret_val = atl1_get_speed_and_duplex(hw, &speed, &duplex);
-   if (ret_val)
-   return ret_val;
+   retval = atl1_get_speed_and_duplex(hw, &speed, &duplex);
+   clear_bit(0, &hw->force_ps);
+   if (retval)
+   return retval;
 
switch (hw->media_type) {
-   case MEDIA_TYPE_1000M_FULL:
-   if (speed != SPEED_1000 || duplex != FULL_DUPLEX)
-   reconfig = 1;
-   break;
case MEDIA_TYPE_100M_FULL:
if (speed != SPEED_100 || duplex != FULL_DUPLEX)
reconfig = 1;
@@ -1180,8 +1178,8 @@ static u32 atl1_check_link(struct atl1_adapter *adapter)
 
/* link result is our setting */
if (!reconfig) {
-   if (adapter->link_speed != speed
-   || adapter->link_duplex != duplex) {
+   if (adapter->link_speed != speed ||
+   adapter->link_duplex != duplex) {
adapter->link_speed = speed;
adapter->link_duplex = duplex;
atl1_setup_mac_ctrl(adapter);
@@ -1201,39 +1199,18 @@ static u32 atl1_check_link(struct atl1_adapter *adapter)
 
/* change original link status */
if (netif_carrier_ok(netdev)) {
+   val = ioread32(hw->hw_addr + REG_MAC_CTRL);
+   val &= ~MAC_CTRL_RX_EN;
adapter->link_speed = SPEED_0;
+   iowrite32(val, hw->hw_addr + REG_MAC_CTRL);
+   ioread32(hw->hw_addr + REG_MAC_CTRL);
netif_carrier_off(netdev);
netif_stop_queue(netdev);
}
 
-   if (hw->media_type != MEDIA_TYPE_AUTO_SENSOR &&
-   hw->media_type != MEDIA_TYPE_1000M_FULL) {
-   switch (hw->media_type) {
-   case MEDIA_TYPE_100M_FULL:
-   phy_data = MII_CR_FULL_DUPLEX | MII_CR_SPEED_100 |
-  MII_CR_RESET;
-   break;
-   case MEDIA_TYPE_100M_HALF:
-   phy_data = MII_CR_SPEED_100 | MII_CR_RESET;
-   break;
-  

[PATCH 12/26] atl1: refactor atl1_probe

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Refactor atl1_probe to conform with current vendor driver version 1.2.40.2.
Also reorder functions to minimize the need for forward declarations.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c | 1397 +++
 drivers/net/atlx/atl1.h |   21 +-
 2 files changed, 691 insertions(+), 727 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index e96f706..d38f26f 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -101,17 +101,681 @@ static const struct pci_device_id atl1_pci_tbl[] = {
 MODULE_DEVICE_TABLE(pci, atl1_pci_tbl);
 
 /*
+ * Reset the transmit and receive units; mask and clear all interrupts.
+ * hw - Struct containing variables accessed by shared code
+ * return : 0  or  idle status (if error)
+ */
+static s32 atl1_reset_hw(struct atl1_hw *hw)
+{
+   struct pci_dev *pdev = hw->back->pdev;
+   u32 icr;
+   int i;
+
+   /*
+* Issue Soft Reset to the MAC.  This will reset the chip's
+* transmit, receive, DMA.  It will not effect
+* the current PCI configuration.  The global reset bit is self-
+* clearing, and should clear within a microsecond.
+*/
+   iowrite32(MASTER_CTRL_SOFT_RST, hw->hw_addr + REG_MASTER_CTRL);
+   ioread32(hw->hw_addr + REG_MASTER_CTRL);
+
+   /* delay about 1ms */
+   msleep(1);
+
+   /* wait at least 10ms for idle */
+   for (i = 0; i < 10; i++) {
+   icr = ioread32(hw->hw_addr + REG_IDLE_STATUS);
+   if (!icr)
+   break;
+   /* delay 1 ms */
+   msleep(1);
+   cpu_relax();
+   }
+
+   if (icr) {
+   dev_dbg(&pdev->dev, "ICR = 0x%x\n", icr);
+   return icr;
+   }
+
+   return 0;
+}
+
+/* function about EEPROM
+ *
+ * check_eeprom_exist
+ * return 0 if eeprom exist
+ */
+static int atl1_check_eeprom_exist(struct atl1_hw *hw)
+{
+   u32 value;
+
+   value = ioread32(hw->hw_addr + REG_SPI_FLASH_CTRL);
+   if (value & SPI_FLASH_CTRL_EN_VPD) {
+   value &= ~SPI_FLASH_CTRL_EN_VPD;
+   iowrite32(value, hw->hw_addr + REG_SPI_FLASH_CTRL);
+   }
+
+   value = ioread16(hw->hw_addr + REG_PCIE_CAP_LIST);
+   return ((value & 0xFF00) == 0x6C00) ? 0 : 1;
+}
+
+static bool atl1_read_eeprom(struct atl1_hw *hw, u32 offset, u32 *p_value)
+{
+   int i;
+   u32 control;
+
+   if (offset & 3)
+   /* address do not align */
+   return false;
+
+   iowrite32(0, hw->hw_addr + REG_VPD_DATA);
+   control = (offset & VPD_CAP_VPD_ADDR_MASK) << VPD_CAP_VPD_ADDR_SHIFT;
+   iowrite32(control, hw->hw_addr + REG_VPD_CAP);
+   ioread32(hw->hw_addr + REG_VPD_CAP);
+
+   for (i = 0; i < 10; i++) {
+   msleep(2);
+   control = ioread32(hw->hw_addr + REG_VPD_CAP);
+   if (control & VPD_CAP_VPD_FLAG)
+   break;
+   }
+   if (control & VPD_CAP_VPD_FLAG) {
+   *p_value = ioread32(hw->hw_addr + REG_VPD_DATA);
+   return true;
+   }
+   /* timeout */
+   return false;
+}
+
+/*
+ * Reads the value from a PHY register
+ * hw - Struct containing variables accessed by shared code
+ * reg_addr - address of the PHY register to read
+ */
+static s32 atl1_read_phy_reg(struct atl1_hw *hw, u16 reg_addr, u16 *phy_data)
+{
+   u32 val;
+   int i;
+
+   val = ((u32) (reg_addr & MDIO_REG_ADDR_MASK)) << MDIO_REG_ADDR_SHIFT |
+   MDIO_START | MDIO_SUP_PREAMBLE | MDIO_RW | MDIO_CLK_25_4 <<
+   MDIO_CLK_SEL_SHIFT;
+   iowrite32(val, hw->hw_addr + REG_MDIO_CTRL);
+   ioread32(hw->hw_addr + REG_MDIO_CTRL);
+
+   for (i = 0; i < MDIO_WAIT_TIMES; i++) {
+   udelay(2);
+   val = ioread32(hw->hw_addr + REG_MDIO_CTRL);
+   if (!(val & (MDIO_START | MDIO_BUSY)))
+   break;
+   }
+   if (!(val & (MDIO_START | MDIO_BUSY))) {
+   *phy_data = (u16) val;
+   return 0;
+   }
+   return ATLX_ERR_PHY;
+}
+
+#define CUSTOM_SPI_CS_SETUP2
+#define CUSTOM_SPI_CLK_HI  2
+#define CUSTOM_SPI_CLK_LO  2
+#define CUSTOM_SPI_CS_HOLD 2
+#define CUSTOM_SPI_CS_HI   3
+
+static bool atl1_spi_read(struct atl1_hw *hw, u32 addr, u32 *buf)
+{
+   int i;
+   u32 value;
+
+   iowrite32(0, hw->hw_addr + REG_SPI_DATA);
+   iowrite32(addr, hw->hw_addr + REG_SPI_ADDR);
+
+   value = SPI_FLASH_CTRL_WAIT_READY |
+   (CUSTOM_SPI_CS_SETUP & SPI_FLASH_CTRL_CS_SETUP_MASK) <<
+   SPI_FLASH_CTRL_CS_SETUP_SHIFT | (CUSTOM_SPI_CLK_HI &
+SPI_FLASH_CTRL_CLK_HI_MASK) <<
+   SPI_FLASH_CTRL_CLK_HI_SHIFT | (CUSTOM_SPI_CLK_LO &
+  SPI_FLASH_CTRL_CLK_LO_MASK) <<
+  

[PATCH 03/26] atl1: fix broken TSO

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

The L1 tx packet descriptor expects TCP Header Length to be expressed as a
number of 32-bit dwords.  The atl1 driver uses tcp_hdrlen() to populate the
field, but tcp_hdrlen() returns the header length in bytes, not in dwords.
Add a shift to convert tcp_hdrlen() to dwords when we write it to the tpd.

Also, some of our bit assignments are made to the wrong tpd words.  Change
those to the correct words.

Finally, since all this fixes TSO, enable TSO by default.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   29 +++--
 1 files changed, 11 insertions(+), 18 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 0df3f32..4e98c16 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -36,7 +36,6 @@
  * A very incomplete list of things that need to be dealt with:
  *
  * TODO:
- * Fix TSO; tx performance is horrible with TSO enabled.
  * Wake on LAN.
  * Add more ethtool functions.
  * Fix abstruse irq enable/disable condition described here:
@@ -1308,8 +1307,8 @@ static int atl1_tso(struct atl1_adapter *adapter, struct 
sk_buff *skb,
tso->tsopl |= 1 << TSO_PARAM_ETHTYPE_SHIFT;
 
tso->tsopl |= (iph->ihl &
-   CSUM_PARAM_IPHL_MASK) << CSUM_PARAM_IPHL_SHIFT;
-   tso->tsopl |= (tcp_hdrlen(skb) &
+   TSO_PARAM_IPHL_MASK) << TSO_PARAM_IPHL_SHIFT;
+   tso->tsopl |= ((tcp_hdrlen(skb) >> 2) &
TSO_PARAM_TCPHDRLEN_MASK) <<
TSO_PARAM_TCPHDRLEN_SHIFT;
tso->tsopl |= (skb_shinfo(skb)->gso_size &
@@ -1472,8 +1471,8 @@ static void atl1_tx_queue(struct atl1_adapter *adapter, 
int count,
tpd->desc.tso.tsopl = descr->tso.tsopl;
tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
tpd->desc.data = descr->data;
-   tpd->desc.csum.csumpu |= (cpu_to_le16(buffer_info->length) &
-   CSUM_PARAM_BUFLEN_MASK) << CSUM_PARAM_BUFLEN_SHIFT;
+   tpd->desc.tso.tsopu |= (cpu_to_le16(buffer_info->length) &
+   TSO_PARAM_BUFLEN_MASK) << TSO_PARAM_BUFLEN_SHIFT;
 
val = (descr->tso.tsopl >> TSO_PARAM_SEGMENT_SHIFT) &
TSO_PARAM_SEGMENT_MASK;
@@ -1481,7 +1480,7 @@ static void atl1_tx_queue(struct atl1_adapter *adapter, 
int count,
tpd->desc.tso.tsopl |= 1 << TSO_PARAM_HDRFLAG_SHIFT;
 
if (j == (count - 1))
-   tpd->desc.csum.csumpl |= 1 << CSUM_PARAM_EOP_SHIFT;
+   tpd->desc.tso.tsopl |= 1 << TSO_PARAM_EOP_SHIFT;
 
if (++tpd_next_to_use == tpd_ring->count)
tpd_next_to_use = 0;
@@ -1574,9 +1573,9 @@ static int atl1_xmit_frame(struct sk_buff *skb, struct 
net_device *netdev)
vlan_tag = vlan_tx_tag_get(skb);
vlan_tag = (vlan_tag << 4) | (vlan_tag >> 13) |
((vlan_tag >> 9) & 0x8);
-   param.csum.csumpl |= 1 << CSUM_PARAM_INSVLAG_SHIFT;
-   param.csum.csumpu |= (vlan_tag & CSUM_PARAM_VALANTAG_MASK) <<
-   CSUM_PARAM_VALAN_SHIFT;
+   param.tso.tsopl |= 1 << TSO_PARAM_INSVLAG_SHIFT;
+   param.tso.tsopu |= (vlan_tag & TSO_PARAM_VLANTAG_MASK) <<
+   TSO_PARAM_VLAN_SHIFT;
}
 
tso = atl1_tso(adapter, skb, ¶m.tso);
@@ -1595,8 +1594,8 @@ static int atl1_xmit_frame(struct sk_buff *skb, struct 
net_device *netdev)
}
}
 
-   val = (param.csum.csumpl >> CSUM_PARAM_SEGMENT_SHIFT) &
-   CSUM_PARAM_SEGMENT_MASK;
+   val = (param.tso.tsopl >> TSO_PARAM_SEGMENT_SHIFT) &
+   TSO_PARAM_SEGMENT_MASK;
atl1_tx_map(adapter, skb, 1 == val);
atl1_tx_queue(adapter, count, ¶m);
netdev->trans_start = jiffies;
@@ -2091,13 +2090,7 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
netdev->features = NETIF_F_HW_CSUM;
netdev->features |= NETIF_F_SG;
netdev->features |= (NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX);
-
-   /*
-* FIXME - Until tso performance gets fixed, disable the feature.
-* Enable it with ethtool -K if desired.
-*/
-   /* netdev->features |= NETIF_F_TSO; */
-
+   netdev->features |= NETIF_F_TSO;
netdev->features |= NETIF_F_LLTX;
 
/*
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 15/26] atl1: tidy up ring management

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Check for null pointers and such in ring handling functions.  Make
needlessly global functions static.  Clean up some comments and indentation.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   20 +++-
 1 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index f40cc6e..db6e76c 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -141,8 +141,7 @@ static s32 atl1_reset_hw(struct atl1_hw *hw)
return 0;
 }
 
-/* function about EEPROM
- *
+/*
  * check_eeprom_exist
  * return 0 if eeprom exist
  */
@@ -166,7 +165,7 @@ static bool atl1_read_eeprom(struct atl1_hw *hw, u32 
offset, u32 *p_value)
u32 control;
 
if (offset & 3)
-   /* address do not align */
+   /* unaligned address */
return false;
 
iowrite32(0, hw->hw_addr + REG_VPD_DATA);
@@ -417,7 +416,7 @@ static void atl1_hash_set(struct atl1_hw *hw, u32 
hash_value)
 * bit BitArray[hash_value]. So we figure out what register
 * the bit is in, read it, OR in the new bit, then write
 * back the new value.  The register is determined by the
-* upper 7 bits of the hash value and the bit within that
+* upper bit of the hash value, and the bits within that
 * register are determined by the lower 5 bits of the value.
 */
hash_reg = (hash_value >> 31) & 0x1;
@@ -439,9 +438,9 @@ static s32 atl1_write_phy_reg(struct atl1_hw *hw, u32 
reg_addr, u16 phy_data)
u32 val;
 
val = ((u32) (phy_data & MDIO_DATA_MASK)) << MDIO_DATA_SHIFT |
-   (reg_addr & MDIO_REG_ADDR_MASK) << MDIO_REG_ADDR_SHIFT |
-   MDIO_SUP_PREAMBLE |
-   MDIO_START | MDIO_CLK_25_4 << MDIO_CLK_SEL_SHIFT;
+   (reg_addr & MDIO_REG_ADDR_MASK) << MDIO_REG_ADDR_SHIFT |
+   MDIO_SUP_PREAMBLE | MDIO_START |
+   MDIO_CLK_25_4 << MDIO_CLK_SEL_SHIFT;
iowrite32(val, hw->hw_addr + REG_MDIO_CTRL);
ioread32(hw->hw_addr + REG_MDIO_CTRL);
 
@@ -872,7 +871,7 @@ static int atl1_mii_ioctl(struct net_device *netdev, struct 
ifreq *ifr, int cmd)
  *
  * Return 0 on success, negative on failure
  */
-s32 atl1_setup_ring_resources(struct atl1_adapter *adapter)
+static s32 atl1_setup_ring_resources(struct atl1_adapter *adapter)
 {
struct atl1_tpd_ring *tpd_ring = &adapter->tpd_ring;
struct atl1_rfd_ring *rfd_ring = &adapter->rfd_ring;
@@ -987,6 +986,9 @@ static void atl1_clean_rx_ring(struct atl1_adapter *adapter)
unsigned long size;
unsigned int i;
 
+   if (!rfd_ring->buffer_info || !rfd_ring->desc)
+   return;
+
/* Free all the Rx ring sk_buffs */
for (i = 0; i < rfd_ring->count; i++) {
buffer_info = &rfd_ring->buffer_info[i];
@@ -1060,7 +1062,7 @@ static void atl1_clean_tx_ring(struct atl1_adapter 
*adapter)
  *
  * Free all transmit software resources
  */
-void atl1_free_ring_resources(struct atl1_adapter *adapter)
+static void atl1_free_ring_resources(struct atl1_adapter *adapter)
 {
struct pci_dev *pdev = adapter->pdev;
struct atl1_tpd_ring *tpd_ring = &adapter->tpd_ring;
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 25/26] atl1: add NAPI support

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Add support for NAPI, styled after the e1000 NAPI implementation.  That we
follow the e1000 for NAPI shouldn't come as much of a surprise, since the
entire atl1 driver is based heavily upon it.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/Kconfig |   14 
 drivers/net/atlx/atl1.c |  151 +--
 drivers/net/atlx/atl1.h |   20 ++
 drivers/net/atlx/atlx.h |7 ++-
 4 files changed, 186 insertions(+), 6 deletions(-)

diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index d9107e5..095629f 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -2371,6 +2371,20 @@ config ATL1
  To compile this driver as a module, choose M here.  The module
  will be called atl1.
 
+config ATL1_NAPI
+   bool "Use Rx Polling (NAPI) (EXPERIMENTAL)"
+   depends on ATL1 && EXPERIMENTAL
+   help
+ NAPI is a new driver API designed to reduce CPU and interrupt load
+ when the driver is receiving lots of packets from the card. It is
+ still somewhat experimental and thus not yet enabled by default.
+
+ If your estimated Rx load is 10kpps or more, or if the card will be
+ deployed on potentially unfriendly networks (e.g. in a firewall),
+ then say Y here.
+
+ If in doubt, say N.
+
 endif # NETDEV_1000
 
 #
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 237622e..10bccf6 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -756,7 +756,16 @@ static void atl1_set_mac_addr(struct atl1_hw *hw)
 
 static int atl1_alloc_queues(struct atl1_adapter *adapter)
 {
-   /* temporary placeholder function for NAPI */
+#ifdef CONFIG_ATL1_NAPI
+   int size;
+
+   size = sizeof(struct net_device) * adapter->num_rx_queues;
+   adapter->polling_netdev = kmalloc(size, GFP_KERNEL);
+   if (!adapter->polling_netdev)
+   return -ENOMEM;
+
+   memset(adapter->polling_netdev, 0, size);
+#endif
 
return 0;
 }
@@ -770,6 +779,9 @@ static int __devinit atl1_sw_init(struct atl1_adapter 
*adapter)
struct atl1_hw *hw = &adapter->hw;
struct net_device *netdev = adapter->netdev;
int err;
+#ifdef CONFIG_ATL1_NAPI
+   int i;
+#endif
 
hw->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
hw->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
@@ -818,6 +830,14 @@ static int __devinit atl1_sw_init(struct atl1_adapter 
*adapter)
return -ENOMEM;
}
 
+#ifdef CONFIG_ATL1_NAPI
+   for (i = 0; i < adapter->num_rx_queues; i++) {
+   adapter->polling_netdev[i].priv = adapter;
+   dev_hold(&adapter->polling_netdev[i]);
+   set_bit(__LINK_STATE_START, &adapter->polling_netdev[i].state);
+   }
+#endif
+
spin_lock_init(&adapter->lock);
spin_lock_init(&adapter->mb_lock);
set_bit(__ATL1_DOWN, &adapter->flags);
@@ -1698,7 +1718,12 @@ next:
return num_alloc;
 }
 
+#ifdef CONFIG_ATL1_NAPI
+static void atl1_clean_rx_irq(struct atl1_adapter *adapter, int *work_done,
+   int work_to_do)
+#else
 static void atl1_clean_rx_irq(struct atl1_adapter *adapter)
+#endif
 {
struct net_device *netdev = adapter->netdev;
int i, count;
@@ -1768,6 +1793,11 @@ chk_rrd:
break;
}
 rrd_ok:
+#ifdef CONFIG_ATL1_NAPI
+   if (*work_done >= work_to_do)
+   break;
+   (*work_done)++;
+#endif
/* clean alloc flag for bad rrd */
atl1_clean_alloc_flag(adapter, rrd, 0);
 
@@ -1808,6 +1838,16 @@ rrd_ok:
atl1_rx_checksum(adapter, rrd, skb);
skb->protocol = eth_type_trans(skb, adapter->netdev);
 
+#ifdef CONFIG_ATL1_NAPI
+   if (adapter->vlgrp && (rrd->pkt_flg & PACKET_FLAG_VLAN_INS)) {
+   u16 vlan_tag = (rrd->vlan_tag >> 4) |
+   ((rrd->vlan_tag & 7) << 13) |
+   ((rrd->vlan_tag & 8) << 9);
+   vlan_hwaccel_receive_skb(skb, adapter->vlgrp, vlan_tag);
+   } else
+   netif_receive_skb(skb);
+
+#else
if (adapter->vlgrp && (rrd->pkt_flg & PACKET_FLAG_VLAN_INS)) {
u16 vlan_tag = (rrd->vlan_tag >> 4) |
((rrd->vlan_tag & 7) << 13) |
@@ -1815,6 +1855,7 @@ rrd_ok:
vlan_hwaccel_rx(skb, adapter->vlgrp, vlan_tag);
} else
netif_rx(skb);
+#endif
 
/* let protocol layer free skb */
buffer_info->skb = NULL;
@@ -1837,6 +1878,9 @@ static bool atl1_clean_tx_irq(struct atl1_adapter 
*adapter)
struct atl1_buffer *buffer_info;
u16 sw_tpd_next_to_clean;
u16 cmb_tpd_next_to_clean;
+#ifdef CONFIG_ATL1_NAP

[PATCH 24/26] atl1: update wake-on-lan

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Update wake-on-lan to conform with the current vendor driver version
1.2.40.2.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |  140 ---
 1 files changed, 84 insertions(+), 56 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index b89201e..237622e 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -1457,22 +1457,6 @@ static u32 atl1_configure(struct atl1_adapter *adapter)
return value;
 }
 
-/*
- * When ACPI resume on some VIA MotherBoard, the Interrupt Disable bit/0x400
- * on PCI Command register is disable.
- * The function enable this bit.
- * Brackett, 2006/03/15
- */
-static void atl1_via_workaround(struct atl1_adapter *adapter)
-{
-   unsigned long value;
-
-   value = ioread16(adapter->hw.hw_addr + PCI_COMMAND);
-   if (value & PCI_COMMAND_INTX_DISABLE)
-   value &= ~PCI_COMMAND_INTX_DISABLE;
-   iowrite32(value, adapter->hw.hw_addr + PCI_COMMAND);
-}
-
 static void atl1_inc_smb(struct atl1_adapter *adapter)
 {
struct stats_msg_block *smb = adapter->smb.smb;
@@ -2607,65 +2591,97 @@ static int atl1_suspend(struct pci_dev *pdev, 
pm_message_t state)
struct net_device *netdev = pci_get_drvdata(pdev);
struct atl1_adapter *adapter = netdev_priv(netdev);
struct atl1_hw *hw = &adapter->hw;
+   u16 speed, duplex;
u32 ctrl = 0;
u32 wufc = adapter->wol;
+   int retval;
 
netif_device_detach(netdev);
-   if (netif_running(netdev))
+   if (netif_running(netdev)) {
+   WARN_ON(test_bit(__ATL1_RESETTING, &adapter->flags));
atl1_down(adapter);
+   }
+
+   retval = pci_save_state(pdev);
+   if (retval)
+   return retval;
 
-   atl1_read_phy_reg(hw, MII_BMSR, (u16 *) & ctrl);
-   atl1_read_phy_reg(hw, MII_BMSR, (u16 *) & ctrl);
+   atl1_read_phy_reg(hw, MII_BMSR, (u16 *) &ctrl);
+   atl1_read_phy_reg(hw, MII_BMSR, (u16 *) &ctrl);
if (ctrl & BMSR_LSTATUS)
wufc &= ~ATLX_WUFC_LNKC;
 
-   /* reduce speed to 10/100M */
-   if (wufc) {
-   /* if resume, let driver to re- setup link */
-   hw->phy_configured = false;
-   atl1_set_mac_addr(hw);
-   atlx_set_multi(netdev);
+   if ((ctrl & BMSR_LSTATUS) && wufc) {
+   retval = atl1_get_speed_and_duplex(hw, &speed, &duplex);
+   if (retval) {
+   dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+   "speed/duplex error during suspend\n");
+   goto wol_dis;
+   }
 
ctrl = 0;
/* turn on magic packet wol */
if (wufc & ATLX_WUFC_MAG)
ctrl = WOL_MAGIC_EN | WOL_MAGIC_PME_EN;
 
-   /* turn on Link change WOL */
-   if (wufc & ATLX_WUFC_LNKC)
-   ctrl |= (WOL_LINK_CHG_EN | WOL_LINK_CHG_PME_EN);
iowrite32(ctrl, hw->hw_addr + REG_WOL_CTRL);
 
-   /* turn on all-multi mode if wake on multicast is enabled */
-   ctrl = ioread32(hw->hw_addr + REG_MAC_CTRL);
-   ctrl &= ~MAC_CTRL_DBG;
-   ctrl &= ~MAC_CTRL_PROMIS_EN;
-   if (wufc & ATLX_WUFC_MC)
-   ctrl |= MAC_CTRL_MC_ALL_EN;
-   else
-   ctrl &= ~MAC_CTRL_MC_ALL_EN;
+   ctrl = MAC_CTRL_RX_EN;
+   ctrl |= ((u32) ((speed == SPEED_1000) ? MAC_CTRL_SPEED_1000 :
+   MAC_CTRL_SPEED_10_100) << MAC_CTRL_SPEED_SHIFT);
+
+   if (duplex == FULL_DUPLEX)
+   ctrl |= (((u32) adapter->hw.preamble_len &
+   MAC_CTRL_PRMLEN_MASK) <<
+   MAC_CTRL_PRMLEN_SHIFT);
 
-   /* turn on broadcast mode if wake on-BC is enabled */
-   if (wufc & ATLX_WUFC_BC)
+   if (adapter->vlgrp)
+   ctrl |= MAC_CTRL_RMV_VLAN;
+
+   if (wufc & ATLX_WUFC_MAG)
ctrl |= MAC_CTRL_BC_EN;
-   else
-   ctrl &= ~MAC_CTRL_BC_EN;
 
-   /* enable RX */
-   ctrl |= MAC_CTRL_RX_EN;
iowrite32(ctrl, hw->hw_addr + REG_MAC_CTRL);
-   pci_enable_wake(pdev, PCI_D3hot, 1);
-   pci_enable_wake(pdev, PCI_D3cold, 1);
-   } else {
-   iowrite32(0, hw->hw_addr + REG_WOL_CTRL);
-   pci_enable_wake(pdev, PCI_D3hot, 0);
-   pci_enable_wake(pdev, PCI_D3cold, 0);
+
+   ctrl = ioread32(hw->hw_addr + REG_PCIE_PHY_MISC1);
+   ctrl |= PCIE_PHY_MISC1_FORCE_RCV_DET;
+   iowrite32(ctrl, hw->hw_addr + REG_PCIE_PHY_MISC1);
+   ioread32(hw->hw_addr + REG_PCIE_PHY_MISC1);
+

[PATCH 08/26] atl1: additional DMA engine configuration

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Add DMA engine configuration tweaks per current vendor atl1 driver version
1.2.40.2.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   10 ++
 drivers/net/atlx/atlx.h |6 ++
 2 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index c93cf19..fb0a0af 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -666,6 +666,7 @@ static u32 atl1_configure(struct atl1_adapter *adapter)
 {
struct atl1_hw *hw = &adapter->hw;
u32 value;
+   u16 x;
 
/* clear interrupt status */
iowrite32(0x, adapter->hw.hw_addr + REG_ISR);
@@ -797,6 +798,15 @@ static u32 atl1_configure(struct atl1_adapter *adapter)
iowrite32(value, hw->hw_addr + REG_RXQ_CTRL);
 
/* config DMA Engine */
+   value = ioread32(hw->hw_addr + REG_DEVICE_CTRL);
+   x = (value >> DEVICE_CTRL_MAX_PAYLOAD_SHIFT) &
+   DEVICE_CTRL_MAX_PAYLOAD_MASK;
+   if (x < hw->dmaw_block)
+   hw->dmaw_block = x;
+   x = (value >> DEVICE_CTRL_MAX_RREQ_SZ_SHIFT) &
+   DEVICE_CTRL_MAX_RREQ_SZ_MASK;
+   if (x < hw->dmar_block)
+   hw->dmar_block = x;
value = u32) hw->dmar_block) & DMA_CTRL_DMAR_BURST_LEN_MASK)
<< DMA_CTRL_DMAR_BURST_LEN_SHIFT) |
u32) hw->dmaw_block) & DMA_CTRL_DMAW_BURST_LEN_MASK)
diff --git a/drivers/net/atlx/atlx.h b/drivers/net/atlx/atlx.h
index 3be7c09..43b8531 100644
--- a/drivers/net/atlx/atlx.h
+++ b/drivers/net/atlx/atlx.h
@@ -53,6 +53,12 @@ MODULE_VERSION(ATLX_DRIVER_VERSION);
 
 #define REG_PCIE_CAP_LIST  0x58
 
+#define REG_DEVICE_CTRL0x60
+#define DEVICE_CTRL_MAX_PAYLOAD_MASK   0x7
+#define DEVICE_CTRL_MAX_PAYLOAD_SHIFT  5
+#define DEVICE_CTRL_MAX_RREQ_SZ_MASK   0x7
+#define DEVICE_CTRL_MAX_RREQ_SZ_SHIFT  12
+
 #define REG_VPD_CAP0x6C
 #define VPD_CAP_ID_MASK0xFF
 #define VPD_CAP_ID_SHIFT   0
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 00/26] atl1: divide and modernize

2007-12-31 Thread jacliburn

Hello Jeff,

Happy New Year to you and all.

In preparation for a future atl2 driver for the Atheros L2 10/100 chip,
we propose to move the existing atl1 driver to a new directory
(drivers/net/atlx), then split out functions and definitions that both
atl1 and atl2 can share.  The final structure will look like this:

directory or file   status
=== ==
drivers/net/atl1/   deleted
drivers/net/atlx/   new
drivers/net/atlx/atl1.c atl1-specific functions
drivers/net/atlx/atl1.h atl1-specific definitions
drivers/net/atlx/atlx.c atl1-atl2 shared functions
drivers/net/atlx/atlx.h atl1-atl2 shared definitions

The first two patches submitted in this patchset accomplish the relocation
by movng the atl1 driver -- lock, stock, and barrel -- over to
drivers/net/atlx, then splitting out shareable functions and definitions.
Some transitory hackery will be present until the atl2 merge.  Please
overlook it for now.

The remaining 24 patches bring the atl1 driver up to par with the current
vendor driver version 1.2.40.2.  NAPI support is included and it seems
to work, but it needs to be scrutinized by an experienced eye.  I had a
hard time finding much current NAPI documentation, so I just hacked at
it by looking at the e1000 driver.

Patch 02/26 is too large for LKML, so it's available at:

ftp://ftp.hogchain.net/pub/linux/attansic/atlx

Or, alternatively, the whole shebang can be pulled from:

git://git.hogchain.net/home/jcliburn/netdev-2.6.git atl1-for-jeff


Table of contents:
---
0001-atl1-relocate-atl1-driver-to-drivers-net-atlx.patch
0002-atl1-move-common-functions-to-atlx-files.patch
0003-atl1-fix-broken-TSO.patch
0004-atl1-add-ethtool-register-dump.patch
0005-atl1-print-debug-info-if-rrd-error.patch
0006-atl1-update-initialization-parameters.patch
0007-atl1-clarify-max-rx-frame-size.patch
0008-atl1-additional-DMA-engine-configuration.patch
0009-atl1-refactor-tx-processing.patch
0010-atl1-use-csum_start.patch
0011-atl1-refactor-initialization-and-startup.patch
0012-atl1-refactor-atl1_probe.patch
0013-atl1-refactor-interrupt-handling.patch
0014-atl1-move-stray-defines-to-header-file.patch
0015-atl1-tidy-up-ring-management.patch
0016-atl1-modernize-check-link-function.patch
0017-atl1-update-phy-config-function.patch
0018-atl1-make-function-static.patch
0019-atl1-modernize-down-up-functions.patch
0020-atl1-update-change-mtu.patch
0021-atl1-update-atl1_close.patch
0022-atl1-update-netpoll.patch
0023-atl1-update-shutdown-and-remove-functions.patch
0024-atl1-update-wake-on-lan.patch
0025-atl1-add-NAPI-support.patch
0026-atl1-remove-experimental-tag-and-clean-up-comments.patch


Summary diffstat:
---
 drivers/net/Kconfig |   18 +-
 drivers/net/Makefile|2 +-
 drivers/net/atl1/Makefile   |2 -
 drivers/net/atl1/atl1.h |  286 ---
 drivers/net/atl1/atl1_ethtool.c |  505 --
 drivers/net/atl1/atl1_hw.c  |  720 
 drivers/net/atl1/atl1_hw.h  |  946 --
 drivers/net/atl1/atl1_main.c| 2453 --
 drivers/net/atl1/atl1_param.c   |  203 ---
 drivers/net/atlx/Makefile   |1 +
 drivers/net/atlx/atl1.c | 3648 +++
 drivers/net/atlx/atl1.h |  849 +
 drivers/net/atlx/atlx.c |  433 +
 drivers/net/atlx/atlx.h |  533 ++
 14 files changed, 5481 insertions(+), 5118 deletions(-)
 delete mode 100644 drivers/net/atl1/Makefile
 delete mode 100644 drivers/net/atl1/atl1.h
 delete mode 100644 drivers/net/atl1/atl1_ethtool.c
 delete mode 100644 drivers/net/atl1/atl1_hw.c
 delete mode 100644 drivers/net/atl1/atl1_hw.h
 delete mode 100644 drivers/net/atl1/atl1_main.c
 delete mode 100644 drivers/net/atl1/atl1_param.c
 create mode 100644 drivers/net/atlx/Makefile
 create mode 100644 drivers/net/atlx/atl1.c
 create mode 100644 drivers/net/atlx/atl1.h
 create mode 100644 drivers/net/atlx/atlx.c
 create mode 100644 drivers/net/atlx/atlx.h

Best regards,
Jay Cliburn
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 23/26] atl1: update shutdown and remove functions

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Update shutdown and remove functions to conform with the current vendor
driver version 1.2.40.2.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   31 +++
 1 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index f09928d..b89201e 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -2591,6 +2591,16 @@ static int atl1_close(struct net_device *netdev)
return 0;
 }
 
+static void atl1_force_ps(struct atl1_hw *hw)
+{
+   atl1_write_phy_reg(hw, MII_DBG_ADDR, 0);
+   atl1_write_phy_reg(hw, MII_DBG_DATA, 0x124E);
+   atl1_write_phy_reg(hw, MII_DBG_ADDR, 2);
+   atl1_write_phy_reg(hw, MII_DBG_DATA, 0x3000);
+   atl1_write_phy_reg(hw, MII_DBG_ADDR, 3);
+   atl1_write_phy_reg(hw, MII_DBG_DATA, 0);
+}
+
 #ifdef CONFIG_PM
 static int atl1_suspend(struct pci_dev *pdev, pm_message_t state)
 {
@@ -2878,12 +2888,7 @@ err_request_regions:
 static void __devexit atl1_remove(struct pci_dev *pdev)
 {
struct net_device *netdev = pci_get_drvdata(pdev);
-   struct atl1_adapter *adapter;
-   /* Device not available. Return. */
-   if (!netdev)
-   return;
-
-   adapter = netdev_priv(netdev);
+   struct atl1_adapter *adapter = netdev_priv(netdev);
 
/*
 * Some atl1 boards lack persistent storage for their MAC, and get it
@@ -2896,21 +2901,31 @@ static void __devexit atl1_remove(struct pci_dev *pdev)
atl1_set_mac_addr(&adapter->hw);
}
 
-   iowrite16(0, adapter->hw.hw_addr + REG_PHY_ENABLE);
+   set_bit(__ATL1_DOWN, &adapter->flags);
+   del_timer_sync(&adapter->watchdog_timer);
+   del_timer_sync(&adapter->phy_config_timer);
+   flush_scheduled_work();
unregister_netdev(netdev);
+   atl1_force_ps(&adapter->hw);
pci_iounmap(pdev, adapter->hw.hw_addr);
pci_release_regions(pdev);
free_netdev(netdev);
pci_disable_device(pdev);
 }
 
+static void atl1_shutdown(struct pci_dev *pdev)
+{
+   atl1_suspend(pdev, PMSG_SUSPEND);
+}
+
 static struct pci_driver atl1_driver = {
.name = ATLX_DRIVER_NAME,
.id_table = atl1_pci_tbl,
.probe = atl1_probe,
.remove = __devexit_p(atl1_remove),
.suspend = atl1_suspend,
-   .resume = atl1_resume
+   .resume = atl1_resume,
+   .shutdown = atl1_shutdown
 };
 
 /*
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 11/26] atl1: refactor initialization and startup

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Refactor atl1 initialization and startup to conform with the current
vendor driver version 1.2.40.2.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |  507 ---
 drivers/net/atlx/atl1.h |   10 +-
 drivers/net/atlx/atlx.c |1 +
 drivers/net/atlx/atlx.h |   21 ++-
 4 files changed, 284 insertions(+), 255 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 31aad9f..e96f706 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -568,39 +568,6 @@ static u32 atl1_check_link(struct atl1_adapter *adapter)
return 0;
 }
 
-/*
- * atl1_change_mtu - Change the Maximum Transfer Unit
- * @netdev: network interface device structure
- * @new_mtu: new value for maximum frame size
- *
- * Returns 0 on success, negative on failure
- */
-static int atl1_change_mtu(struct net_device *netdev, int new_mtu)
-{
-   struct atl1_adapter *adapter = netdev_priv(netdev);
-   int old_mtu = netdev->mtu;
-   int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
-
-   if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
-   (max_frame > MAX_JUMBO_FRAME_SIZE)) {
-   dev_warn(&adapter->pdev->dev, "invalid MTU setting\n");
-   return -EINVAL;
-   }
-
-   adapter->hw.max_frame_size = max_frame;
-   adapter->hw.tx_jumbo_task_th = (max_frame + 7) >> 3;
-   adapter->rx_buffer_len = (max_frame + 7) & ~7;
-   adapter->hw.rx_jumbo_th = adapter->rx_buffer_len / 8;
-
-   netdev->mtu = new_mtu;
-   if ((old_mtu != new_mtu) && netif_running(netdev)) {
-   atl1_down(adapter);
-   atl1_up(adapter);
-   }
-
-   return 0;
-}
-
 static void set_flow_ctrl_old(struct atl1_adapter *adapter)
 {
u32 hi, lo, value;
@@ -1043,6 +1010,7 @@ static void atl1_rx_checksum(struct atl1_adapter *adapter,
 static u16 atl1_alloc_rx_buffers(struct atl1_adapter *adapter)
 {
struct atl1_rfd_ring *rfd_ring = &adapter->rfd_ring;
+   struct net_device *netdev = adapter->netdev;
struct pci_dev *pdev = adapter->pdev;
struct page *page;
unsigned long offset;
@@ -1052,7 +1020,7 @@ static u16 atl1_alloc_rx_buffers(struct atl1_adapter 
*adapter)
u16 rfd_next_to_use, next_next;
struct rx_free_desc *rfd_desc;
 
-   next_next = rfd_next_to_use = atomic_read(&rfd_ring->next_to_use);
+   next_next = rfd_next_to_use = (u16) atomic_read(&rfd_ring->next_to_use);
if (++next_next == rfd_ring->count)
next_next = 0;
buffer_info = &rfd_ring->buffer_info[rfd_next_to_use];
@@ -1079,7 +1047,7 @@ static u16 atl1_alloc_rx_buffers(struct atl1_adapter 
*adapter)
 * the 14 byte MAC header is removed
 */
skb_reserve(skb, NET_IP_ALIGN);
-
+   skb->dev = netdev;
buffer_info->alloced = 1;
buffer_info->skb = skb;
buffer_info->length = (u16) adapter->rx_buffer_len;
@@ -1767,28 +1735,6 @@ static void atl1_phy_config(unsigned long data)
spin_unlock_irqrestore(&adapter->lock, flags);
 }
 
-/*
- * Orphaned vendor comment left intact here:
- * 
- * If TPD Buffer size equal to 0, PCIE DMAR_TO_INT
- * will assert. We do soft reset <0x1400=1> according
- * with the SPEC. BUT, it seemes that PCIE or DMA
- * state-machine will not be reset. DMAR_TO_INT will
- * assert again and again.
- * 
- */
-static void atl1_tx_timeout_task(struct work_struct *work)
-{
-   struct atl1_adapter *adapter =
-   container_of(work, struct atl1_adapter, tx_timeout_task);
-   struct net_device *netdev = adapter->netdev;
-
-   netif_device_detach(netdev);
-   atl1_down(adapter);
-   atl1_up(adapter);
-   netif_device_attach(netdev);
-}
-
 int atl1_reset(struct atl1_adapter *adapter)
 {
int ret;
@@ -1798,48 +1744,40 @@ int atl1_reset(struct atl1_adapter *adapter)
return atl1_init_hw(&adapter->hw);
 }
 
-s32 atl1_up(struct atl1_adapter *adapter)
+static s32 atl1_up(struct atl1_adapter *adapter)
 {
struct net_device *netdev = adapter->netdev;
int err;
-   int irq_flags = IRQF_SAMPLE_RANDOM;
+   u32 retval;
 
/* hardware has been reset, we need to reload some things */
+   err = atl1_init_hw(&adapter->hw);
+   if (err) {
+   err = -EIO;
+   return err;
+   }
+
atlx_set_multi(netdev);
atl1_init_ring_ptrs(adapter);
atlx_restore_vlan(adapter);
err = atl1_alloc_rx_buffers(adapter);
if (unlikely(!err))
-   /* no RX BUFFER allocated */
+   /* no rx buffer allocated */
return -ENOMEM;
 
if (unlikely(atl1_configure(adapter))) {
err = -EIO;
-   goto err_up;
-   }
-
-   err = pci_enable_msi(adapter->pdev);
-   if (err) {
-   dev_info(

[PATCH 17/26] atl1: update phy config function

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Update atl1_phy_config() to conform with current vendor driver version
1.2.40.2.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index abed547..6432956 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -2344,11 +2344,11 @@ static void atl1_phy_config(unsigned long data)
unsigned long flags;
 
spin_lock_irqsave(&adapter->lock, flags);
-   adapter->phy_timer_pending = false;
atl1_write_phy_reg(hw, MII_ADVERTISE, hw->mii_autoneg_adv_reg);
atl1_write_phy_reg(hw, MII_ATLX_CR, hw->mii_1000t_ctrl_reg);
atl1_write_phy_reg(hw, MII_BMCR, MII_CR_RESET | MII_CR_AUTO_NEG_EN);
spin_unlock_irqrestore(&adapter->lock, flags);
+   clear_bit(0, &adapter->cfg_phy);
 }
 
 int atl1_reset(struct atl1_adapter *adapter)
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 09/26] atl1: refactor tx processing

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Refactor tx processing to use a less convoluted tx packet descriptor and
to conform generally with the vendor's current version 1.2.40.2.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |  265 +--
 drivers/net/atlx/atl1.h |  201 +++-
 2 files changed, 246 insertions(+), 220 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index fb0a0af..b0c3273 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -1288,8 +1288,6 @@ static void atl1_intr_tx(struct atl1_adapter *adapter)
dev_kfree_skb_irq(buffer_info->skb);
buffer_info->skb = NULL;
}
-   tpd->buffer_addr = 0;
-   tpd->desc.data = 0;
 
if (++sw_tpd_next_to_clean == tpd_ring->count)
sw_tpd_next_to_clean = 0;
@@ -1311,48 +1309,69 @@ static u16 atl1_tpd_avail(struct atl1_tpd_ring 
*tpd_ring)
 }
 
 static int atl1_tso(struct atl1_adapter *adapter, struct sk_buff *skb,
-struct tso_param *tso)
+   struct tx_packet_desc *ptpd)
 {
-   /* We enter this function holding a spinlock. */
-   u8 ipofst;
+   /* spinlock held */
+   u8 hdr_len, ip_off;
+   u32 real_len;
int err;
 
if (skb_shinfo(skb)->gso_size) {
if (skb_header_cloned(skb)) {
err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
if (unlikely(err))
-   return err;
+   return -1;
}
 
if (skb->protocol == ntohs(ETH_P_IP)) {
struct iphdr *iph = ip_hdr(skb);
 
-   iph->tot_len = 0;
+   real_len = (((unsigned char *)iph - skb->data) +
+   ntohs(iph->tot_len));
+   if (real_len < skb->len)
+   pskb_trim(skb, real_len);
+   hdr_len = (skb_transport_offset(skb) + tcp_hdrlen(skb));
+   if (skb->len == hdr_len) {
+   iph->check = 0;
+   tcp_hdr(skb)->check =
+   ~csum_tcpudp_magic(iph->saddr,
+   iph->daddr, tcp_hdrlen(skb),
+   IPPROTO_TCP, 0);
+   ptpd->word3 |= (iph->ihl & TPD_IPHL_MASK) <<
+   TPD_IPHL_SHIFT;
+   ptpd->word3 |= ((tcp_hdrlen(skb) >> 2) &
+   TPD_TCPHDRLEN_MASK) <<
+   TPD_TCPHDRLEN_SHIFT;
+   ptpd->word3 |= 1 << TPD_IP_CSUM_SHIFT;
+   ptpd->word3 |= 1 << TPD_TCP_CSUM_SHIFT;
+   return 1;
+   }
+
iph->check = 0;
tcp_hdr(skb)->check = ~csum_tcpudp_magic(iph->saddr,
-   iph->daddr, 0, IPPROTO_TCP, 0);
-   ipofst = skb_network_offset(skb);
-   if (ipofst != ETH_HLEN) /* 802.3 frame */
-   tso->tsopl |= 1 << TSO_PARAM_ETHTYPE_SHIFT;
-
-   tso->tsopl |= (iph->ihl &
-   TSO_PARAM_IPHL_MASK) << TSO_PARAM_IPHL_SHIFT;
-   tso->tsopl |= ((tcp_hdrlen(skb) >> 2) &
-   TSO_PARAM_TCPHDRLEN_MASK) <<
-   TSO_PARAM_TCPHDRLEN_SHIFT;
-   tso->tsopl |= (skb_shinfo(skb)->gso_size &
-   TSO_PARAM_MSS_MASK) << TSO_PARAM_MSS_SHIFT;
-   tso->tsopl |= 1 << TSO_PARAM_IPCKSUM_SHIFT;
-   tso->tsopl |= 1 << TSO_PARAM_TCPCKSUM_SHIFT;
-   tso->tsopl |= 1 << TSO_PARAM_SEGMENT_SHIFT;
-   return true;
+   iph->daddr, 0, IPPROTO_TCP, 0);
+   ip_off = (unsigned char *)iph -
+   (unsigned char *) skb_network_header(skb);
+   if (ip_off == 8) /* 802.3-SNAP frame */
+   ptpd->word3 |= 1 << TPD_ETHTYPE_SHIFT;
+   else if (ip_off != 0)
+   return -2;
+
+   ptpd->word3 |= (iph->ihl & TPD_IPHL_MASK) <<
+   TPD_IPHL_SHIFT;
+   ptpd->word3 |= ((tcp_hdrlen(skb) >> 2) &
+   TPD_TCPHDRLEN_MASK) << TPD_TCPHDRLEN_SHIFT;
+   ptpd->word3 |= (skb_shinfo(skb)->gso_size &
+   TPD_MSS_MASK) << TPD_MSS_SHIFT;
+   pt

[PATCH 07/26] atl1: clarify max rx frame size

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

When we initially set max rx frame size, we don't explicitly allow room for
the VLAN header; it's done later in a somewhat obscure fashion.  Let's make
it clear from the top that we've allowed enough room for the VLAN header.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 695dcbc..c93cf19 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -113,7 +113,7 @@ static int __devinit atl1_sw_init(struct atl1_adapter 
*adapter)
struct atl1_hw *hw = &adapter->hw;
struct net_device *netdev = adapter->netdev;
 
-   hw->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
+   hw->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
hw->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
 
adapter->wol = 0;
@@ -744,8 +744,8 @@ static u32 atl1_configure(struct atl1_adapter *adapter)
/* set Interrupt Clear Timer */
iowrite16(adapter->ict, hw->hw_addr + REG_CMBDISDMA_TIMER);
 
-   /* set MTU, 4 : VLAN */
-   iowrite32(hw->max_frame_size + 4, hw->hw_addr + REG_MTU);
+   /* set MTU size */
+   iowrite32(hw->max_frame_size, hw->hw_addr + REG_MTU);
 
/* jumbo size & rrd retirement timer */
value = (((u32) hw->rx_jumbo_th & RXQ_JMBOSZ_TH_MASK)
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 10/26] atl1: use csum_start

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Use skb->csum_start for tx checksum offload preparation.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   11 ++-
 1 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index b0c3273..31aad9f 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -1376,16 +1376,17 @@ static int atl1_tx_csum(struct atl1_adapter *adapter, 
struct sk_buff *skb,
u8 css, cso;
 
if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) {
-   cso = skb_transport_offset(skb);
-   css = cso + skb->csum_offset;
-   if (unlikely(cso & 0x1)) {
+   css = (u8) (skb->csum_start - skb_headroom(skb));
+   cso = css + (u8) skb->csum_offset;
+   if (unlikely(css & 0x1)) {
+   /* L1 hardware requires an even number here */
dev_printk(KERN_DEBUG, &adapter->pdev->dev,
"payload offset not an even number\n");
return -1;
}
-   ptpd->word3 |= (cso & TPD_PLOADOFFSET_MASK) <<
+   ptpd->word3 |= (css & TPD_PLOADOFFSET_MASK) <<
TPD_PLOADOFFSET_SHIFT;
-   ptpd->word3 |= (css & TPD_CCSUMOFFSET_MASK) <<
+   ptpd->word3 |= (cso & TPD_CCSUMOFFSET_MASK) <<
TPD_CCSUMOFFSET_SHIFT;
ptpd->word3 |= 1 << TPD_CUST_CSUM_EN_SHIFT;
return true;
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 04/26] atl1: add ethtool register dump

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Add the ethtool register dump option to the atl1 driver.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   53 +++
 drivers/net/atlx/atl1.h |1 +
 2 files changed, 54 insertions(+), 0 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 4e98c16..239641f 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -2513,6 +2513,57 @@ static int atl1_set_wol(struct net_device *netdev,
return 0;
 }
 
+static int atl1_get_regs_len(struct net_device *netdev)
+{
+   return ATL1_REG_COUNT * sizeof(u32);
+}
+
+static void atl1_get_regs(struct net_device *netdev, struct ethtool_regs *regs,
+   void *p)
+{
+   struct atl1_adapter *adapter = netdev_priv(netdev);
+   struct atl1_hw *hw = &adapter->hw;
+   unsigned int i;
+   u32 *regbuf = p;
+
+   for (i = 0; i < ATL1_REG_COUNT; i++) {
+   /*
+* This switch statement avoids reserved regions
+* of register space.
+*/
+   switch (i) {
+   case 6 ... 9:
+   case 14:
+   case 29 ... 31:
+   case 34 ... 63:
+   case 75 ... 127:
+   case 136 ... 1023:
+   case 1027 ... 1087:
+   case 1091 ... 1151:
+   case 1194 ... 1195:
+   case 1200 ... 1201:
+   case 1206 ... 1213:
+   case 1216 ... 1279:
+   case 1290 ... 1311:
+   case 1323 ... 1343:
+   case 1358 ... 1359:
+   case 1368 ... 1375:
+   case 1378 ... 1383:
+   case 1388 ... 1391:
+   case 1393 ... 1395:
+   case 1402 ... 1403:
+   case 1410 ... 1471:
+   case 1522 ... 1535:
+   /* reserved region; don't read it */
+   regbuf[i] = 0;
+   break;
+   default:
+   /* unreserved region */
+   regbuf[i] = ioread32(hw->hw_addr + (i * sizeof(u32)));
+   }
+   }
+}
+
 static void atl1_get_ringparam(struct net_device *netdev,
struct ethtool_ringparam *ring)
 {
@@ -2703,6 +2754,8 @@ const struct ethtool_ops atl1_ethtool_ops = {
.get_drvinfo= atl1_get_drvinfo,
.get_wol= atl1_get_wol,
.set_wol= atl1_set_wol,
+   .get_regs_len   = atl1_get_regs_len,
+   .get_regs   = atl1_get_regs,
.get_ringparam  = atl1_get_ringparam,
.set_ringparam  = atl1_set_ringparam,
.get_pauseparam = atl1_get_pauseparam,
diff --git a/drivers/net/atlx/atl1.h b/drivers/net/atlx/atl1.h
index 538948d..30c5a8d 100644
--- a/drivers/net/atlx/atl1.h
+++ b/drivers/net/atlx/atl1.h
@@ -584,6 +584,7 @@ enum atl1_dma_req_block {
 #define ATL1_DEFAULT_RFD   512
 #define ATL1_MIN_RFD   128
 #define ATL1_MAX_RFD   2048
+#define ATL1_REG_COUNT 1538
 
 #define ATL1_GET_DESC(R, i, type)  (&(((type *)((R)->desc))[i]))
 #define ATL1_RFD_DESC(R, i)ATL1_GET_DESC(R, i, struct rx_free_desc)
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 13/26] atl1: refactor interrupt handling

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Refactor interrupt handling to conform with the current vendor driver
version 1.2.40.2.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |  196 ++-
 drivers/net/atlx/atl1.h |   25 +-
 drivers/net/atlx/atlx.c |2 +-
 3 files changed, 114 insertions(+), 109 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index d38f26f..9c86ef4 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -1740,12 +1740,11 @@ next:
return num_alloc;
 }
 
-static void atl1_intr_rx(struct atl1_adapter *adapter)
+static void atl1_clean_rx_irq(struct atl1_adapter *adapter)
 {
+   struct net_device *netdev = adapter->netdev;
int i, count;
-   u16 length;
-   u16 rrd_next_to_clean;
-   u32 value;
+   u16 length, rrd_next_to_clean;
struct atl1_rfd_ring *rfd_ring = &adapter->rfd_ring;
struct atl1_rrd_ring *rrd_ring = &adapter->rrd_ring;
struct atl1_buffer *buffer_info;
@@ -1754,7 +1753,7 @@ static void atl1_intr_rx(struct atl1_adapter *adapter)
 
count = 0;
 
-   rrd_next_to_clean = atomic_read(&rrd_ring->next_to_clean);
+   rrd_next_to_clean = (u16) atomic_read(&rrd_ring->next_to_clean);
 
while (1) {
rrd = ATL1_RRD_DESC(rrd_ring, rrd_next_to_clean);
@@ -1795,6 +1794,7 @@ chk_rrd:
/* bad rrd */
dev_printk(KERN_DEBUG, &adapter->pdev->dev,
"bad RRD\n");
+
/* see if update RFD index */
if (rrd->num_buf > 1)
atl1_update_rfd_index(adapter, rrd);
@@ -1823,13 +1823,18 @@ rrd_ok:
count++;
 
if (unlikely(rrd->pkt_flg & PACKET_FLAG_ERR)) {
-   if (!(rrd->err_flg &
-   (ERR_FLAG_IP_CHKSUM | ERR_FLAG_L4_CHKSUM
-   | ERR_FLAG_LEN))) {
-   /* packet error, don't need upstream */
-   buffer_info->alloced = 0;
-   rrd->xsz.valid = 0;
-   continue;
+   if (rrd->err_flg & (ERR_FLAG_CRC | ERR_FLAG_TRUNC |
+   ERR_FLAG_CODE | ERR_FLAG_OV)) {
+   if (!(netdev->flags & IFF_PROMISC)) {
+   /* packet error, don't need upstream */
+   buffer_info->alloced = 0;
+   rrd->xsz.valid = 0;
+   dev_printk(KERN_DEBUG,
+   &adapter->pdev->dev,
+   "rrd error flag 0x%08X\n",
+   rrd->err_flg);
+   continue;
+   }
}
}
 
@@ -1862,33 +1867,13 @@ rrd_ok:
}
 
atomic_set(&rrd_ring->next_to_clean, rrd_next_to_clean);
-
atl1_alloc_rx_buffers(adapter);
 
-   /* update mailbox ? */
-   if (count) {
-   u32 tpd_next_to_use;
-   u32 rfd_next_to_use;
-
-   spin_lock(&adapter->mb_lock);
-
-   tpd_next_to_use = atomic_read(&adapter->tpd_ring.next_to_use);
-   rfd_next_to_use =
-   atomic_read(&adapter->rfd_ring.next_to_use);
-   rrd_next_to_clean =
-   atomic_read(&adapter->rrd_ring.next_to_clean);
-   value = ((rfd_next_to_use & MB_RFD_PROD_INDX_MASK) <<
-   MB_RFD_PROD_INDX_SHIFT) |
-((rrd_next_to_clean & MB_RRD_CONS_INDX_MASK) <<
-   MB_RRD_CONS_INDX_SHIFT) |
-((tpd_next_to_use & MB_TPD_PROD_INDX_MASK) <<
-   MB_TPD_PROD_INDX_SHIFT);
-   iowrite32(value, adapter->hw.hw_addr + REG_MAILBOX);
-   spin_unlock(&adapter->mb_lock);
-   }
+   if (count)
+   atl1_update_mailbox(adapter);
 }
 
-static void atl1_intr_tx(struct atl1_adapter *adapter)
+static bool atl1_clean_tx_irq(struct atl1_adapter *adapter)
 {
struct atl1_tpd_ring *tpd_ring = &adapter->tpd_ring;
struct atl1_buffer *buffer_info;
@@ -1905,7 +1890,7 @@ static void atl1_intr_tx(struct atl1_adapter *adapter)
buffer_info = &tpd_ring->buffer_info[sw_tpd_next_to_clean];
if (buffer_info->dma) {
pci_unmap_page(adapter->pdev, buffer_info->dma,
-  buffer_info->length, PCI_DMA_TODEVICE);
+   buffer_info->length, PCI_DMA_TODEVICE);
buffer_info->dma = 0;
}
 
@@ -1922,6 +1907,11 @@ static void atl1_i

[PATCH 19/26] atl1: modernize down/up functions

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Update atl1_down() and atl1_up() to conform with the current vendor driver
version 1.2.40.2.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   21 -
 drivers/net/atlx/atl1.h |1 -
 drivers/net/atlx/atlx.c |2 +-
 3 files changed, 9 insertions(+), 15 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 7697e80..972de34 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -2388,7 +2388,6 @@ static s32 atl1_up(struct atl1_adapter *adapter)
}
 
clear_bit(__ATL1_DOWN, &adapter->flags);
-   mod_timer(&adapter->watchdog_timer, jiffies + (4 * HZ));
retval = ioread32(&adapter->hw + REG_MASTER_CTRL);
retval |= MASTER_CTRL_MANUAL_INT;
iowrite32(retval, &adapter->hw + REG_MASTER_CTRL);
@@ -2401,21 +2400,18 @@ void atl1_down(struct atl1_adapter *adapter)
 {
struct net_device *netdev = adapter->netdev;
 
-   del_timer_sync(&adapter->watchdog_timer);
-   del_timer_sync(&adapter->phy_config_timer);
-   adapter->phy_timer_pending = false;
-
-   atlx_irq_disable(adapter);
-   free_irq(adapter->pdev->irq, netdev);
-   pci_disable_msi(adapter->pdev);
+   set_bit(__ATL1_DOWN, &adapter->flags);
+   netif_stop_queue(netdev);
atl1_reset_hw(&adapter->hw);
adapter->cmb.cmb->int_stats = 0;
-
+   msleep(1);
+   atlx_irq_disable(adapter);
+   del_timer_sync(&adapter->watchdog_timer);
+   del_timer_sync(&adapter->phy_config_timer);
+   clear_bit(0, &adapter->cfg_phy);
+   netif_carrier_off(netdev);
adapter->link_speed = SPEED_0;
adapter->link_duplex = -1;
-   netif_carrier_off(netdev);
-   netif_stop_queue(netdev);
-
atl1_clean_tx_ring(adapter);
atl1_clean_rx_ring(adapter);
 }
@@ -2821,7 +2817,6 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
init_timer(&adapter->phy_config_timer);
adapter->phy_config_timer.function = &atl1_phy_config;
adapter->phy_config_timer.data = (unsigned long)adapter;
-   adapter->phy_timer_pending = false;
 
INIT_WORK(&adapter->reset_task, atl1_reset_task);
INIT_WORK(&adapter->link_chg_task, atlx_link_chg_task);
diff --git a/drivers/net/atlx/atl1.h b/drivers/net/atlx/atl1.h
index 1f245e0..5187f74 100644
--- a/drivers/net/atlx/atl1.h
+++ b/drivers/net/atlx/atl1.h
@@ -790,7 +790,6 @@ struct atl1_adapter {
struct work_struct link_chg_task;
struct timer_list watchdog_timer;
struct timer_list phy_config_timer;
-   bool phy_timer_pending;
unsigned long cfg_phy;
 
/* all descriptor rings' memory */
diff --git a/drivers/net/atlx/atlx.c b/drivers/net/atlx/atlx.c
index 18c2d7e..9cc9441 100644
--- a/drivers/net/atlx/atlx.c
+++ b/drivers/net/atlx/atlx.c
@@ -91,7 +91,6 @@ static void atlx_check_for_link(struct atlx_adapter *adapter)
u16 phy_data = 0;
 
spin_lock(&adapter->lock);
-   adapter->phy_timer_pending = false;
atlx_read_phy_reg(&adapter->hw, MII_BMSR, &phy_data);
atlx_read_phy_reg(&adapter->hw, MII_BMSR, &phy_data);
spin_unlock(&adapter->lock);
@@ -104,6 +103,7 @@ static void atlx_check_for_link(struct atlx_adapter 
*adapter)
dev_info(&adapter->pdev->dev, "%s link is down\n",
netdev->name);
adapter->link_speed = SPEED_0;
+   clear_bit(0, &adapter->hw.force_ps);
netif_carrier_off(netdev);
netif_stop_queue(netdev);
}
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 01/26] atl1: relocate atl1 driver to /drivers/net/atlx

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

In preparation for a future Atheros L2 NIC driver (called atl2), relocate
the atl1 driver into a new /drivers/net/atlx directory that will ultimately
be shared with the future atl2 driver.

Signed-off-by: Chris Snook <[EMAIL PROTECTED]>
Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/Makefile  |2 +-
 drivers/net/{atl1 => atlx}/Makefile   |0 
 drivers/net/{atl1 => atlx}/atl1.h |0 
 drivers/net/{atl1 => atlx}/atl1_ethtool.c |0 
 drivers/net/{atl1 => atlx}/atl1_hw.c  |0 
 drivers/net/{atl1 => atlx}/atl1_hw.h  |0 
 drivers/net/{atl1 => atlx}/atl1_main.c|0 
 drivers/net/{atl1 => atlx}/atl1_param.c   |0 
 8 files changed, 1 insertions(+), 1 deletions(-)
 rename drivers/net/{atl1 => atlx}/Makefile (100%)
 rename drivers/net/{atl1 => atlx}/atl1.h (100%)
 rename drivers/net/{atl1 => atlx}/atl1_ethtool.c (100%)
 rename drivers/net/{atl1 => atlx}/atl1_hw.c (100%)
 rename drivers/net/{atl1 => atlx}/atl1_hw.h (100%)
 rename drivers/net/{atl1 => atlx}/atl1_main.c (100%)
 rename drivers/net/{atl1 => atlx}/atl1_param.c (100%)

diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 0e5fde4..14acf84 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -13,7 +13,7 @@ obj-$(CONFIG_CHELSIO_T1) += chelsio/
 obj-$(CONFIG_CHELSIO_T3) += cxgb3/
 obj-$(CONFIG_EHEA) += ehea/
 obj-$(CONFIG_BONDING) += bonding/
-obj-$(CONFIG_ATL1) += atl1/
+obj-$(CONFIG_ATL1) += atlx/
 obj-$(CONFIG_GIANFAR) += gianfar_driver.o
 obj-$(CONFIG_TEHUTI) += tehuti.o
 
diff --git a/drivers/net/atl1/Makefile b/drivers/net/atlx/Makefile
similarity index 100%
rename from drivers/net/atl1/Makefile
rename to drivers/net/atlx/Makefile
diff --git a/drivers/net/atl1/atl1.h b/drivers/net/atlx/atl1.h
similarity index 100%
rename from drivers/net/atl1/atl1.h
rename to drivers/net/atlx/atl1.h
diff --git a/drivers/net/atl1/atl1_ethtool.c b/drivers/net/atlx/atl1_ethtool.c
similarity index 100%
rename from drivers/net/atl1/atl1_ethtool.c
rename to drivers/net/atlx/atl1_ethtool.c
diff --git a/drivers/net/atl1/atl1_hw.c b/drivers/net/atlx/atl1_hw.c
similarity index 100%
rename from drivers/net/atl1/atl1_hw.c
rename to drivers/net/atlx/atl1_hw.c
diff --git a/drivers/net/atl1/atl1_hw.h b/drivers/net/atlx/atl1_hw.h
similarity index 100%
rename from drivers/net/atl1/atl1_hw.h
rename to drivers/net/atlx/atl1_hw.h
diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atlx/atl1_main.c
similarity index 100%
rename from drivers/net/atl1/atl1_main.c
rename to drivers/net/atlx/atl1_main.c
diff --git a/drivers/net/atl1/atl1_param.c b/drivers/net/atlx/atl1_param.c
similarity index 100%
rename from drivers/net/atl1/atl1_param.c
rename to drivers/net/atlx/atl1_param.c
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 06/26] atl1: update initialization parameters

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Update initialization parameters to match the current vendor driver
version 1.2.40.2.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   14 +++---
 1 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 262d3ca..695dcbc 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -136,20 +136,20 @@ static int __devinit atl1_sw_init(struct atl1_adapter 
*adapter)
hw->rfd_fetch_gap = 1;
hw->rx_jumbo_th = adapter->rx_buffer_len / 8;
hw->rx_jumbo_lkah = 1;
-   hw->rrd_ret_timer = 16;
-   hw->tpd_burst = 4;
+   hw->rrd_ret_timer = 4;  /* 8 us */
+   hw->tpd_burst = 8;
hw->tpd_fetch_th = 16;
-   hw->txf_burst = 0x100;
+   hw->txf_burst = 0x200;
hw->tx_jumbo_task_th = (hw->max_frame_size + 7) >> 3;
hw->tpd_fetch_gap = 1;
hw->rcb_value = atl1_rcb_64;
hw->dma_ord = atl1_dma_ord_enh;
-   hw->dmar_block = atl1_dma_req_256;
-   hw->dmaw_block = atl1_dma_req_256;
+   hw->dmar_block = atl1_dma_req_1024;
+   hw->dmaw_block = atl1_dma_req_1024;
hw->cmb_rrd = 4;
hw->cmb_tpd = 4;
-   hw->cmb_rx_timer = 1;   /* about 2us */
-   hw->cmb_tx_timer = 1;   /* about 2us */
+   hw->cmb_rx_timer = 2;   /* about 4us */
+   hw->cmb_tx_timer = 256; /* about 512us */
hw->smb_timer = 10; /* about 200ms */
 
spin_lock_init(&adapter->lock);
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 05/26] atl1: print debug info if rrd error

2007-12-31 Thread jacliburn
From: Jay Cliburn <[EMAIL PROTECTED]>

Add some debug dev_printks if we encounter a bad receive return descriptor.

Signed-off-by: Jay Cliburn <[EMAIL PROTECTED]>
---
 drivers/net/atlx/atl1.c |   21 -
 1 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
index 239641f..262d3ca 100644
--- a/drivers/net/atlx/atl1.c
+++ b/drivers/net/atlx/atl1.c
@@ -1127,7 +1127,26 @@ static void atl1_intr_rx(struct atl1_adapter *adapter)
if (likely(rrd->xsz.valid)) {   /* packet valid */
 chk_rrd:
/* check rrd status */
-   if (likely(rrd->num_buf == 1))
+   if (rrd->num_buf != 1) {
+   dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+   "rx_buf_len = %d\n",
+   adapter->rx_buffer_len);
+   dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+   "RRD num_buf = %d\n",
+   rrd->num_buf);
+   dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+   "RRD pkt_len = %d\n",
+   rrd->xsz.xsum_sz.pkt_size);
+   dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+   "RRD pkt_flg = 0x%08X\n",
+   rrd->pkt_flg);
+   dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+   "RRD err_flg = 0x%08X\n",
+   rrd->err_flg);
+   dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+   "RRD vlan_tag = 0x%08X\n",
+   rrd->vlan_tag);
+   } else
goto rrd_ok;
 
/* rrd seems to be bad */
-- 
1.5.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/