> -----Original Message-----
> From: Willy Tarreau [mailto:[email protected]]
> Sent: Monday, October 01, 2012 3:52 PM
> To: linux-kernel; [email protected]
> Cc: Sony Chacko; zz-930768; David Miller; Jonathan Nieder; Willy Tarreau
> Subject: [ 001/180] netxen: support for GbE port settings
> 
> 2.6.32-longterm review patch.  If anyone has any objections, please let me
> know.
> 
> ------------------
> 
> From: Sony Chacko <[email protected]>
> 
> commit bfd823bd74333615783d8108889814c6d82f2ab0 upstream.
> 
> 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.
> 
> [jn: backported for 2.6.32.y by Ana Guerrero]
> 
> Signed-off-by: Sony Chacko <[email protected]>
> Signed-off-by: Amit Kumar Salecha <[email protected]>
> Signed-off-by: David S. Miller <[email protected]>
> Tested-by: Ana Guerrero <[email protected]> # HP NC375i
> Signed-off-by: Jonathan Nieder <[email protected]>
> Signed-off-by: Willy Tarreau <[email protected]>
> ---
>  drivers/net/netxen/netxen_nic.h         |    7 +++-
>  drivers/net/netxen/netxen_nic_ctx.c     |   15 +++++++
>  drivers/net/netxen/netxen_nic_ethtool.c |   62 ++++++++----------------------
> -
>  3 files changed, 37 insertions(+), 47 deletions(-)
> 
> diff --git a/drivers/net/netxen/netxen_nic.h
> b/drivers/net/netxen/netxen_nic.h index e52af5b..50d2af8 100644
> --- a/drivers/net/netxen/netxen_nic.h
> +++ b/drivers/net/netxen/netxen_nic.h
> @@ -700,7 +700,8 @@ struct netxen_recv_context {
>  #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
> @@ -1015,6 +1016,7 @@ typedef struct {
>  #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
> @@ -1323,6 +1325,9 @@ int netxen_config_ipaddr(struct netxen_adapter
> *adapter, u32 ip, int cmd);  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); diff --
> git a/drivers/net/netxen/netxen_nic_ctx.c
> b/drivers/net/netxen/netxen_nic_ctx.c
> index 9cb8f68..f48cdb2 100644
> --- a/drivers/net/netxen/netxen_nic_ctx.c
> +++ b/drivers/net/netxen/netxen_nic_ctx.c
> @@ -112,6 +112,21 @@ nx_fw_cmd_set_mtu(struct netxen_adapter
> *adapter, int mtu)
>       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 --git
> a/drivers/net/netxen/netxen_nic_ethtool.c
> b/drivers/net/netxen/netxen_nic_ethtool.c
> index 714f387..7e34840 100644
> --- a/drivers/net/netxen/netxen_nic_ethtool.c
> +++ b/drivers/net/netxen/netxen_nic_ethtool.c
> @@ -216,7 +216,6 @@ skip:
>                       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,53 +253,24 @@ static int  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->ahw.port_type != NETXEN_NIC_GBE)
> +             return -EOPNOTSUPP;
> 
> -             if (adapter->phy_read
> -                 && adapter->phy_read(adapter,
> -
> NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS,
> -                                      &status) != 0)
> -                     return -EIO;
> +     if (!(adapter->capabilities & NX_FW_CAPABILITY_GBE_LINK_CFG))
> +             return -EOPNOTSUPP;
> 
> -             /* 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
> +     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;
> --
> 1.7.2.1.45.g54fbc

Acked-by: Sony Chacko <[email protected]>

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

Reply via email to