Re: [PATCH 19/19] e1000: major part of the new API changes

2007-03-30 Thread Stephen Hemminger


 
+s32

+e1000_alloc_zeroed_dev_spec_struct(struct e1000_hw *hw, u32 size)
+{
+   hw-dev_spec = kmalloc(size, GFP_KERNEL);
+
+   if (!hw-dev_spec)
+   return -ENOMEM;
+
+   memset(hw-dev_spec, 0, size);
+
+   return E1000_SUCCESS;
+}
  


This is what is wrong with a lot of the new code. It is written as
verbose as possible.

What is wrong with open coded
   hw-dev_spec = kzalloc(size, GFP_KERNEL).

+
+void
+e1000_free_dev_spec_struct(struct e1000_hw *hw)
+{
+   if (!hw-dev_spec)
+   return;
+
+   kfree(hw-dev_spec);
+}
+
  

Almost looks like you contracted this out to someone paid by the LOC.


-
To unsubscribe from this list: send the line unsubscribe netdev in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 19/19] e1000: major part of the new API changes

2007-03-29 Thread Auke Kok
From: Jeb Cramer [EMAIL PROTECTED]

The new hardware initialization code requires us to follow a slightly
different approach to setup the device. First the function pointers
have to be initialized for the proper hardware type, after which the
general initialization calls those in turn to do per-device specific
initialization.

Signed-off-by: Jeb Cramer [EMAIL PROTECTED]
Signed-off-by: Auke Kok [EMAIL PROTECTED]
---

 drivers/net/e1000/e1000_ethtool.c |   97 ++-
 drivers/net/e1000/e1000_main.c|  155 -
 2 files changed, 160 insertions(+), 92 deletions(-)

diff --git a/drivers/net/e1000/e1000_ethtool.c 
b/drivers/net/e1000/e1000_ethtool.c
index 033cdb6..c26fdac 100644
--- a/drivers/net/e1000/e1000_ethtool.c
+++ b/drivers/net/e1000/e1000_ethtool.c
@@ -29,6 +29,7 @@
 /* ethtool support for e1000 */
 
 #include e1000.h
+#include e1000_82541.h
 
 #include asm/uaccess.h
 
@@ -1334,6 +1335,43 @@ e1000_integrated_phy_loopback(struct e1000_adapter 
*adapter)
 }
 
 static int
+e1000_set_82571_fiber_loopback(struct e1000_adapter *adapter)
+{
+   struct e1000_hw *hw = adapter-hw;
+   u32 ctrl = E1000_READ_REG(hw, E1000_CTRL);
+   int link = 0;
+
+   /* special requirements for 82571/82572 fiber adapters */
+
+   /* jump through hoops to make sure link is up because serdes
+* link is hardwired up */
+   ctrl |= E1000_CTRL_SLU;
+   E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
+
+   /* disable autoneg */
+   ctrl = E1000_READ_REG(hw, E1000_TXCW);
+   ctrl = ~(1  31);
+   E1000_WRITE_REG(hw, E1000_TXCW, ctrl);
+
+   link = (E1000_READ_REG(hw, E1000_STATUS)  E1000_STATUS_LU);
+
+   if (!link) {
+   /* set invert loss of signal */
+   ctrl = E1000_READ_REG(hw, E1000_CTRL);
+   ctrl |= E1000_CTRL_ILOS;
+   E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
+   }
+
+   /* special write to serdes control register to enable SerDes analog
+* loopback */
+#define E1000_SERDES_LB_ON 0x410
+   E1000_WRITE_REG(hw, E1000_SCTL, E1000_SERDES_LB_ON);
+   msleep(10);
+
+   return 0;
+}
+
+static int
 e1000_set_phy_loopback(struct e1000_adapter *adapter)
 {
uint16_t phy_reg = 0;
@@ -1385,6 +1423,42 @@ e1000_set_phy_loopback(struct e1000_adapter *adapter)
return 8;
 }
 
+/* only call this for fiber/serdes connections to es2lan */
+static int
+e1000_set_es2lan_mac_loopback(struct e1000_adapter *adapter)
+{
+   struct e1000_hw *hw = adapter-hw;
+   u32 ctrlext = E1000_READ_REG(hw, E1000_CTRL_EXT);
+   u32 ctrl = E1000_READ_REG(hw, E1000_CTRL);
+
+   /* save CTRL_EXT to restore later, reuse an empty variable (unused
+  on mac_type 80003es2lan) */
+   adapter-tx_fifo_head = ctrlext;
+
+   /* clear the serdes mode bits, putting the device into mac loopback */
+   ctrlext = ~E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES;
+   E1000_WRITE_REG(hw, E1000_CTRL_EXT, ctrlext);
+
+   /* force speed to 1000/FD, link up */
+   ctrl = ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100);
+   ctrl |= (E1000_CTRL_SLU | E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX |
+E1000_CTRL_SPD_1000 | E1000_CTRL_FD);
+   E1000_WRITE_REG(hw, E1000_CTRL, ctrl);
+
+   /* set mac loopback */
+   ctrl = E1000_READ_REG(hw, E1000_RCTL);
+   ctrl |= E1000_RCTL_LBM_MAC;
+   E1000_WRITE_REG(hw, E1000_RCTL, ctrl);
+
+   /* set testing mode parameters (no need to reset later) */
+#define KMRNCTRLSTA_OPMODE (0x1F  16)
+#define KMRNCTRLSTA_OPMODE_1GB_FD_GMII 0x0582
+   E1000_WRITE_REG(hw, E1000_KMRNCTRLSTA,
+   (KMRNCTRLSTA_OPMODE | KMRNCTRLSTA_OPMODE_1GB_FD_GMII));
+
+   return 0;
+}
+
 static int
 e1000_setup_loopback_test(struct e1000_adapter *adapter)
 {
@@ -1394,6 +1468,9 @@ e1000_setup_loopback_test(struct e1000_adapter *adapter)
if (hw-media_type == e1000_media_type_fiber ||
hw-media_type == e1000_media_type_internal_serdes) {
switch (hw-mac.type) {
+   case e1000_80003es2lan:
+   return e1000_set_es2lan_mac_loopback(adapter);
+   break;
case e1000_82545:
case e1000_82546:
case e1000_82545_rev_3:
@@ -1402,11 +1479,7 @@ e1000_setup_loopback_test(struct e1000_adapter *adapter)
break;
case e1000_82571:
case e1000_82572:
-#define E1000_SERDES_LB_ON 0x410
-   e1000_set_phy_loopback(adapter);
-   E1000_WRITE_REG(hw, E1000_SCTL, E1000_SERDES_LB_ON);
-   msleep(10);
-   return 0;
+   return e1000_set_82571_fiber_loopback(adapter);
break;
default:
rctl = E1000_READ_REG(hw, E1000_RCTL);
@@ -1432,6 +1505,14 @@ e1000_loopback_cleanup(struct e1000_adapter *adapter)