On Fri, Feb 17, 2012 at 04:36:29PM +0100, Ana Guerrero wrote: > fixes this problem. I am attaching it already updated to work on top of > 2.6.32-41.
Now for real.
>From bfd823bd74333615783d8108889814c6d82f2ab0 Mon Sep 17 00:00:00 2001 From: Sony Chacko <sony.cha...@qlogic.com> Date: Tue, 15 Mar 2011 14:54:55 -0700 Subject: [PATCH] netxen: support for GbE port settings o Enable setting speed and auto negotiation parameters for GbE ports. o Hardware do not support half duplex setting currently. David Miller: Amit please update your patch to silently reject link setting attempts that are unsupported by the device. Updated to apply against Debian 2.6_2.6.32-41. Signed-off-by: Sony Chacko <sony.cha...@qlogic.com> Signed-off-by: Amit Kumar Salecha <amit.sale...@qlogic.com> Signed-off-by: David S. Miller <da...@davemloft.net> --- drivers/net/netxen/netxen_nic.h | 6 ++- drivers/net/netxen/netxen_nic_ctx.c | 15 +++++++ drivers/net/netxen/netxen_nic_ethtool.c | 62 ++++++++----------------------- 3 files changed, 36 insertions(+), 47 deletions(-) diff -Nrua linux-2.6-2.6.32.patched/drivers/net/netxen/netxen_nic_ctx.c linux-2.6-2.6.32/drivers/net/netxen/netxen_nic_ctx.c --- linux-2.6-2.6.32.patched/drivers/net/netxen/netxen_nic_ctx.c 2010-03-30 16:47:39.000000000 +0200 +++ linux-2.6-2.6.32/drivers/net/netxen/netxen_nic_ctx.c 2012-02-15 11:41:14.231151799 +0100 @@ -112,6 +112,21 @@ return 0; } +int +nx_fw_cmd_set_gbe_port(struct netxen_adapter *adapter, + u32 speed, u32 duplex, u32 autoneg) +{ + + return netxen_issue_cmd(adapter, + adapter->ahw.pci_func, + NXHAL_VERSION, + speed, + duplex, + autoneg, + NX_CDRP_CMD_CONFIG_GBE_PORT); + +} + static int nx_fw_cmd_create_rx_ctx(struct netxen_adapter *adapter) { diff -Nrua linux-2.6-2.6.32.patched/drivers/net/netxen/netxen_nic_ethtool.c linux-2.6-2.6.32/drivers/net/netxen/netxen_nic_ethtool.c --- linux-2.6-2.6.32.patched/drivers/net/netxen/netxen_nic_ethtool.c 2010-03-30 16:47:39.000000000 +0200 +++ linux-2.6-2.6.32/drivers/net/netxen/netxen_nic_ethtool.c 2012-02-15 11:46:53.902903873 +0100 @@ -216,7 +216,6 @@ check_sfp_module = netif_running(dev) && adapter->has_link_events; } else { - ecmd->autoneg = AUTONEG_ENABLE; ecmd->supported |= (SUPPORTED_TP |SUPPORTED_Autoneg); ecmd->advertising |= (ADVERTISED_TP | ADVERTISED_Autoneg); @@ -254,54 +253,25 @@ netxen_nic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) { struct netxen_adapter *adapter = netdev_priv(dev); - __u32 status; + int ret; - /* read which mode */ - if (adapter->ahw.port_type == NETXEN_NIC_GBE) { - /* autonegotiation */ - if (adapter->phy_write - && adapter->phy_write(adapter, - NETXEN_NIU_GB_MII_MGMT_ADDR_AUTONEG, - ecmd->autoneg) != 0) - return -EIO; - else - adapter->link_autoneg = ecmd->autoneg; - - if (adapter->phy_read - && adapter->phy_read(adapter, - NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, - &status) != 0) - return -EIO; - - /* speed */ - switch (ecmd->speed) { - case SPEED_10: - netxen_set_phy_speed(status, 0); - break; - case SPEED_100: - netxen_set_phy_speed(status, 1); - break; - case SPEED_1000: - netxen_set_phy_speed(status, 2); - break; - } - /* set duplex mode */ - if (ecmd->duplex == DUPLEX_HALF) - netxen_clear_phy_duplex(status); - if (ecmd->duplex == DUPLEX_FULL) - netxen_set_phy_duplex(status); - if (adapter->phy_write - && adapter->phy_write(adapter, - NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, - *((int *)&status)) != 0) - return -EIO; - else { - adapter->link_speed = ecmd->speed; - adapter->link_duplex = ecmd->duplex; - } - } else + if (adapter->ahw.port_type != NETXEN_NIC_GBE) return -EOPNOTSUPP; + if (!(adapter->capabilities & NX_FW_CAPABILITY_GBE_LINK_CFG)) + return -EOPNOTSUPP; + + ret = nx_fw_cmd_set_gbe_port(adapter, ecmd->speed, ecmd->duplex, + ecmd->autoneg); + if (ret == NX_RCODE_NOT_SUPPORTED) + return -EOPNOTSUPP; + else if (ret) + return -EIO; + + adapter->link_speed = ecmd->speed; + adapter->link_duplex = ecmd->duplex; + adapter->link_autoneg = ecmd->autoneg; + if (!netif_running(dev)) return 0; diff -Nrua linux-2.6-2.6.32.patched/drivers/net/netxen/netxen_nic.h linux-2.6-2.6.32/drivers/net/netxen/netxen_nic.h --- linux-2.6-2.6.32.patched/drivers/net/netxen/netxen_nic.h 2010-03-30 16:47:39.000000000 +0200 +++ linux-2.6-2.6.32/drivers/net/netxen/netxen_nic.h 2012-02-15 11:38:44.082837698 +0100 @@ -695,7 +695,8 @@ #define NX_CDRP_CMD_READ_PEXQ_PARAMETERS 0x0000001c #define NX_CDRP_CMD_GET_LIC_CAPABILITIES 0x0000001d #define NX_CDRP_CMD_READ_MAX_LRO_PER_BOARD 0x0000001e -#define NX_CDRP_CMD_MAX 0x0000001f +#define NX_CDRP_CMD_CONFIG_GBE_PORT 0x0000001f +#define NX_CDRP_CMD_MAX 0x00000020 #define NX_RCODE_SUCCESS 0 #define NX_RCODE_NO_HOST_MEM 1 @@ -1010,6 +1011,7 @@ #define NX_FW_CAPABILITY_BDG (1 << 8) #define NX_FW_CAPABILITY_FVLANTX (1 << 9) #define NX_FW_CAPABILITY_HW_LRO (1 << 10) +#define NX_FW_CAPABILITY_GBE_LINK_CFG (1 << 11) /* module types */ #define LINKEVENT_MODULE_NOT_PRESENT 1 @@ -1318,6 +1320,9 @@ int netxen_linkevent_request(struct netxen_adapter *adapter, int enable); void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup); +int nx_fw_cmd_set_gbe_port(struct netxen_adapter *adapter, + u32 speed, u32 duplex, u32 autoneg); + int nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, int mtu); int netxen_nic_change_mtu(struct net_device *netdev, int new_mtu); int netxen_config_hw_lro(struct netxen_adapter *adapter, int enable);