Re: [PATCH 9/9] Resending NetXen 1G/10G NIC driver patch
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
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
+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