Re: [PATCH 9/9] Resending NetXen 1G/10G NIC driver patch

2006-05-26 Thread Pradeep Dalvi
diff -u linux-2.6.16.18/drivers/net/netxen/netxen_nic_niu.c
linux-2.6.16.18/drivers/net/netxen/netxen_nic_niu.c
--- linux-2.6.16.18/drivers/net/netxen/netxen_nic_niu.c 2006-05-25
02:43:22.0 -0700
+++ linux-2.6.16.18/drivers/net/netxen/netxen_nic_niu.c 2006-05-26
04:05:34.0 -0700
@@ -34,22 +34,6 @@
 #include netxen_nic.h
 #include linux/delay.h

-void netxen_delay(int value)
-{
-   unsigned long remainder;
-
-   remainder = value / 5;
-   do {
-   if (remainder  1000) {
-   udelay(1000);
-   remainder -= 1000;
-   } else {
-   udelay(remainder + 1);
-   remainder = 0;
-   }
-   } while (remainder  0);
-}
-
 /**
  * netxen_niu_gbe_phy_read - read a register from the GbE PHY via
  * mii management interface.
@@ -78,7 +62,7 @@
/* MII mgmt all goes through port 0 MAC interface, so it cannot
be in reset */
if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0
(0),
  mac_cfg0, 4))
-   return -1;
+   return -EIO;
if (mac_cfg0.soft_reset) {
struct netxen_niu_gb_mac_config_0_t temp;
*(netxen_crbword_t *)  temp = 0;
@@ -89,7 +73,7 @@
if (netxen_nic_hw_write_wx(adapter,
   NETXEN_NIU_GB_MAC_CONFIG_0
(0),
   temp, 4))
-   return -1;
+   return -EIO;
restore = 1;
}

@@ -99,34 +83,34 @@
mii_cfg.reset = 1;
if (netxen_nic_hw_write_wx(adapter,
NETXEN_NIU_GB_MII_MGMT_CONFIG(0),
   mii_cfg, 4))
-   return -1;
+   return -EIO;
mii_cfg.reset = 0;
if (netxen_nic_hw_write_wx(adapter,
NETXEN_NIU_GB_MII_MGMT_CONFIG(0),
   mii_cfg, 4))
-   return -1;
+   return -EIO;

*(netxen_crbword_t *)  address = 0;
address.reg_addr = reg;
address.phy_addr = phy;
if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_ADDR
(0),
   address, 4))
-   return -1;
+   return -EIO;
*(netxen_crbword_t *)  command = 0;/* turn off any prior
activity */
if (netxen_nic_hw_write_wx(adapter,
NETXEN_NIU_GB_MII_MGMT_COMMAND(0),
   command, 4))
-   return -1;
+   return -EIO;
/* send read command */
command.read_cycle = 1;
if (netxen_nic_hw_write_wx(adapter,
NETXEN_NIU_GB_MII_MGMT_COMMAND(0),
   command, 4))
-   return -1;
+   return -EIO;

*(netxen_crbword_t *)  status = 0;
do {
if (netxen_nic_hw_read_wx(adapter,

NETXEN_NIU_GB_MII_MGMT_INDICATE(0),
  status, 4))
-   return -1;
+   return -EIO;
timeout++;
} while ((status.busy || status.notvalid)
  (timeout++  NETXEN_NIU_PHY_WAITMAX));
@@ -135,7 +119,7 @@
if (netxen_nic_hw_read_wx(adapter,
  NETXEN_NIU_GB_MII_MGMT_STATUS
(0),
  readval, 4))
-   return -1;
+   return -EIO;
result = 0;
} else
result = -1;
@@ -144,7 +128,7 @@
if (netxen_nic_hw_write_wx(adapter,
   NETXEN_NIU_GB_MAC_CONFIG_0
(0),
   mac_cfg0, 4))
-   return -1;
+   return -EIO;

return result;
 }
@@ -176,7 +160,7 @@
/* MII mgmt all goes through port 0 MAC interface, so it cannot
be in reset */
if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0
(0),
  mac_cfg0, 4))
-   return -1;
+   return -EIO;
if (mac_cfg0.soft_reset) {
struct netxen_niu_gb_mac_config_0_t temp;
*(netxen_crbword_t *)  temp = 0;
@@ -187,46 +171,46 @@
if (netxen_nic_hw_write_wx(adapter,
   NETXEN_NIU_GB_MAC_CONFIG_0
(0),
   temp, 4))
-   return -1;
+   return -EIO;
restore = 1;
}

*(netxen_crbword_t *)  command = 0;/* turn off any prior
activity */
if (netxen_nic_hw_write_wx(adapter,
NETXEN_NIU_GB_MII_MGMT_COMMAND(0),
   command, 4))
-   return -1;
+   return -EIO;

*(netxen_crbword_t *)  address = 0;
address.reg_addr = reg;

[PATCH 9/9] Resending NetXen 1G/10G NIC driver patch

2006-05-25 Thread Linsys Contractor Amit S. Kale
diff -Naru linux-2.6.16.18.orig/drivers/net/netxen/netxen_nic_niu.c 
linux-2.6.16.18/drivers/net/netxen/netxen_nic_niu.c
--- linux-2.6.16.18.orig/drivers/net/netxen/netxen_nic_niu.c1969-12-31 
16:00:00.0 -0800
+++ linux-2.6.16.18/drivers/net/netxen/netxen_nic_niu.c 2006-05-25 
02:43:22.0 -0700
@@ -0,0 +1,770 @@
+/*
+ * Copyright (C) 2003 - 2006 NetXen, Inc.
+ * All rights reserved.
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *   
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA  02111-1307, USA.
+ * 
+ * The full GNU General Public License is included in this distribution
+ * in the file called LICENSE.
+ * 
+ * Contact Information:
+ *[EMAIL PROTECTED]
+ * NetXen,
+ * 3965 Freedom Circle, Fourth floor,
+ * Santa Clara, CA 95054
+ *
+ *
+ * Provides access to the Network Interface Unit h/w block.
+ *
+ */
+
+#include netxen_nic.h
+#include linux/delay.h
+
+void netxen_delay(int value)
+{
+   unsigned long remainder;
+
+   remainder = value / 5;
+   do {
+   if (remainder  1000) {
+   udelay(1000);
+   remainder -= 1000;
+   } else {
+   udelay(remainder + 1);
+   remainder = 0;
+   }
+   } while (remainder  0);
+}
+
+/** 
+ * netxen_niu_gbe_phy_read - read a register from the GbE PHY via
+ * mii management interface.
+ *
+ * Note: The MII management interface goes through port 0.
+ *   Individual phys are addressed as follows:
+ * @param phy  [15:8]  phy id
+ * @param reg  [7:0]   register number
+ *
+ * @returns  0 on success
+ *  -1 on error
+ *
+ **/
+long netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long phy,
+long reg, netxen_crbword_t * readval)
+{
+   long timeout = 0;
+   long result = 0;
+   long restore = 0;
+   struct netxen_niu_gb_mii_mgmt_address address;
+   struct netxen_niu_gb_mii_mgmt_command command;
+   struct netxen_niu_gb_mii_mgmt_indicators status;
+   struct netxen_niu_gb_mii_mgmt_config mii_cfg;
+   struct netxen_niu_gb_mac_config_0_t mac_cfg0;
+
+   /* MII mgmt all goes through port 0 MAC interface, so it cannot be in 
reset */
+   if (netxen_nic_hw_read_wx(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(0),
+ mac_cfg0, 4))
+   return -1;
+   if (mac_cfg0.soft_reset) {
+   struct netxen_niu_gb_mac_config_0_t temp;
+   *(netxen_crbword_t *)  temp = 0;
+   temp.tx_reset_pb = 1;
+   temp.rx_reset_pb = 1;
+   temp.tx_reset_mac = 1;
+   temp.rx_reset_mac = 1;
+   if (netxen_nic_hw_write_wx(adapter,
+  NETXEN_NIU_GB_MAC_CONFIG_0(0),
+  temp, 4))
+   return -1;
+   restore = 1;
+   }
+
+   /* reset MII management interface */
+   *(netxen_crbword_t *)  mii_cfg = 0;
+   mii_cfg.clockselect = 7;
+   mii_cfg.reset = 1;
+   if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_CONFIG(0),
+  mii_cfg, 4))
+   return -1;
+   mii_cfg.reset = 0;
+   if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_CONFIG(0),
+  mii_cfg, 4))
+   return -1;
+
+   *(netxen_crbword_t *)  address = 0;
+   address.reg_addr = reg;
+   address.phy_addr = phy;
+   if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_ADDR(0),
+  address, 4))
+   return -1;
+   *(netxen_crbword_t *)  command = 0;/* turn off any prior activity 
*/
+   if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0),
+  command, 4))
+   return -1;
+   /* send read command */
+   command.read_cycle = 1;
+   if (netxen_nic_hw_write_wx(adapter, NETXEN_NIU_GB_MII_MGMT_COMMAND(0),
+  command, 4))
+   return -1;
+
+   *(netxen_crbword_t *)  status = 0;
+   do {
+   if (netxen_nic_hw_read_wx(adapter,
+ 

Re: [PATCH 9/9] Resending NetXen 1G/10G NIC driver patch

2006-05-25 Thread Stephen Hemminger

 +void netxen_delay(int value)
 +{
 + unsigned long remainder;
 +
 + remainder = value / 5;
 + do {
 + if (remainder  1000) {
 + udelay(1000);
 + remainder -= 1000;
 + } else {
 + udelay(remainder + 1);
 + remainder = 0;
 + }
 + } while (remainder  0);
 +}
 +


Defined, but never used.  Why not just use mdelay if you
really are waiting that long?

+
+
+/** 
+ * netxen_niu_gbe_set_mii_mode- Set 10/100 Mbit Mode for GbE MAC
+ *
+ **/
+void netxen_niu_gbe_set_mii_mode(struct netxen_adapter *adapter,
+long port, long enable)
+{
+   netxen_crb_writelit_adapter(adapter, NETXEN_NIU_MODE, 0x2);
+   netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port),
+   0x8000);
+   netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB_MAC_CONFIG_0(port),
+   0xf0025);
+   netxen_crb_writelit_adapter(adapter, NETXEN_NIU_GB_MAC_CONFIG_1(port),
+   0xf1ff);
+   netxen_crb_writelit_adapter(adapter,
+   NETXEN_NIU_GB0_GMII_MODE + (port  3), 0);
+   netxen_crb_writelit_adapter(adapter,
+   NETXEN_NIU_GB0_MII_MODE + (port  3), 1);
+   netxen_crb_writelit_adapter(adapter,
+   (NETXEN_NIU_GB0_HALF_DUPLEX + port * 4), 0);
+   netxen_crb_writelit_adapter(adapter,
+   NETXEN_NIU_GB_MII_MGMT_CONFIG(port), 0x7);
+
+   if (enable) {
+   /* 
+* Do NOT enable flow control until a suitable solution for 
+*  shutting down pause frames is found. 
+*/
+   netxen_crb_writelit_adapter(adapter,
+   NETXEN_NIU_GB_MAC_CONFIG_0(port),
+   0x5);
+   }
+

 + if (netxen_niu_gbe_enable_phy_interrupts(adapter, port))
 + printk(1ERROR enabling PHY interrupts\n);

Please use KERN_ERR not 1

 + if (netxen_niu_gbe_clear_phy_interrupts(adapter, port))
 + printk(1ERROR clearing PHY interrupts\n);
 +}
 +
 +long netxen_niu_gbe_init_port(struct netxen_adapter *adapter, long port)
 +{
 + long result = 0;
 + struct netxen_niu_phy_status status;
 +
 + if (0 ==
 + netxen_niu_gbe_phy_read(adapter, port,
 + NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
 + (netxen_crbword_t *)  status)) {

You seem to like the style:
if (0 == foo())
It is not the current kernel fashion, but I'm okay with it.

 + if (status.link) {
 + if (status.speed == 2) {
 + netxen_niu_gbe_set_gmii_mode(adapter, port, 1);
 + } else if ((status.speed == 1) || (status.speed == 0)) {
 + netxen_niu_gbe_set_mii_mode(adapter, port, 1);
 + } else {
 + result = -1;
 + }
 +
 + } else {
 + /* We don't have link. Cable  must be unconnected. */
 + /* Enable phy interrupts so we take action when plugged 
 in */
 + netxen_crb_writelit_adapter(adapter,
 + NETXEN_NIU_GB_MAC_CONFIG_0
 + (port), 0x8000);
 + netxen_crb_writelit_adapter(adapter,
 + NETXEN_NIU_GB_MAC_CONFIG_0
 + (port), 0xf0025);
 + if (netxen_niu_gbe_clear_phy_interrupts(adapter, port))
 + printk(1ERROR clearing PHY interrupts\n);
 + if (netxen_niu_gbe_enable_phy_interrupts(adapter, port))
 + printk(1ERROR enabling PHY interrupts\n);
 + if (netxen_niu_gbe_clear_phy_interrupts(adapter, port))
 + printk(1ERROR clearing PHY interrupts\n);
 + result = -1;
 + }
 + } else {
 + result = -1;
 + }
 + return result;
 +}

Wouldn't this just be clearer with:

long netxen_niu_gbe_init_port(struct netxen_adapter *adapter, long port)
{
int err;
struct netxen_niu_phy_status status;

err = netxen_niu_gbe_phy_read(adapter, port,
  NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
  (netxen_crbword_t *)  status);
if (err)
return err;

if (status.link) {
if (status.speed == 2)
netxen_niu_gbe_set_gmii_mode(adapter, port, 1);
else if