netxen: fix link speed reporting for some boards
o Read negotiated link speed when link state changes. o Fix link speed reporting for hybrid nic boards, which have both 1Gbps and 10Gbps ports. Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
391587c344
commit
c7860a2aec
@@ -499,7 +499,8 @@ typedef enum {
|
|||||||
NETXEN_BRDTYPE_P3_10G_SFP_CT = 0x002a,
|
NETXEN_BRDTYPE_P3_10G_SFP_CT = 0x002a,
|
||||||
NETXEN_BRDTYPE_P3_10G_SFP_QT = 0x002b,
|
NETXEN_BRDTYPE_P3_10G_SFP_QT = 0x002b,
|
||||||
NETXEN_BRDTYPE_P3_10G_CX4 = 0x0031,
|
NETXEN_BRDTYPE_P3_10G_CX4 = 0x0031,
|
||||||
NETXEN_BRDTYPE_P3_10G_XFP = 0x0032
|
NETXEN_BRDTYPE_P3_10G_XFP = 0x0032,
|
||||||
|
NETXEN_BRDTYPE_P3_10G_TP = 0x0080
|
||||||
|
|
||||||
} netxen_brdtype_t;
|
} netxen_brdtype_t;
|
||||||
|
|
||||||
|
@@ -136,11 +136,9 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
|
|||||||
|
|
||||||
ecmd->port = PORT_TP;
|
ecmd->port = PORT_TP;
|
||||||
|
|
||||||
if (netif_running(dev)) {
|
|
||||||
ecmd->speed = adapter->link_speed;
|
ecmd->speed = adapter->link_speed;
|
||||||
ecmd->duplex = adapter->link_duplex;
|
ecmd->duplex = adapter->link_duplex;
|
||||||
ecmd->autoneg = adapter->link_autoneg;
|
ecmd->autoneg = adapter->link_autoneg;
|
||||||
}
|
|
||||||
|
|
||||||
} else if (adapter->ahw.board_type == NETXEN_NIC_XGBE) {
|
} else if (adapter->ahw.board_type == NETXEN_NIC_XGBE) {
|
||||||
u32 val;
|
u32 val;
|
||||||
@@ -171,7 +169,7 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
|
|||||||
} else
|
} else
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
ecmd->phy_address = adapter->portnum;
|
ecmd->phy_address = adapter->physical_port;
|
||||||
ecmd->transceiver = XCVR_EXTERNAL;
|
ecmd->transceiver = XCVR_EXTERNAL;
|
||||||
|
|
||||||
switch ((netxen_brdtype_t) boardinfo->board_type) {
|
switch ((netxen_brdtype_t) boardinfo->board_type) {
|
||||||
@@ -180,13 +178,13 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
|
|||||||
case NETXEN_BRDTYPE_P3_REF_QG:
|
case NETXEN_BRDTYPE_P3_REF_QG:
|
||||||
case NETXEN_BRDTYPE_P3_4_GB:
|
case NETXEN_BRDTYPE_P3_4_GB:
|
||||||
case NETXEN_BRDTYPE_P3_4_GB_MM:
|
case NETXEN_BRDTYPE_P3_4_GB_MM:
|
||||||
case NETXEN_BRDTYPE_P3_10000_BASE_T:
|
|
||||||
|
|
||||||
ecmd->supported |= SUPPORTED_Autoneg;
|
ecmd->supported |= SUPPORTED_Autoneg;
|
||||||
ecmd->advertising |= ADVERTISED_Autoneg;
|
ecmd->advertising |= ADVERTISED_Autoneg;
|
||||||
case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
|
case NETXEN_BRDTYPE_P2_SB31_10G_CX4:
|
||||||
case NETXEN_BRDTYPE_P3_10G_CX4:
|
case NETXEN_BRDTYPE_P3_10G_CX4:
|
||||||
case NETXEN_BRDTYPE_P3_10G_CX4_LP:
|
case NETXEN_BRDTYPE_P3_10G_CX4_LP:
|
||||||
|
case NETXEN_BRDTYPE_P3_10000_BASE_T:
|
||||||
ecmd->supported |= SUPPORTED_TP;
|
ecmd->supported |= SUPPORTED_TP;
|
||||||
ecmd->advertising |= ADVERTISED_TP;
|
ecmd->advertising |= ADVERTISED_TP;
|
||||||
ecmd->port = PORT_TP;
|
ecmd->port = PORT_TP;
|
||||||
@@ -204,16 +202,33 @@ netxen_nic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
|
|||||||
ecmd->port = PORT_FIBRE;
|
ecmd->port = PORT_FIBRE;
|
||||||
ecmd->autoneg = AUTONEG_DISABLE;
|
ecmd->autoneg = AUTONEG_DISABLE;
|
||||||
break;
|
break;
|
||||||
case NETXEN_BRDTYPE_P2_SB31_10G:
|
|
||||||
case NETXEN_BRDTYPE_P3_10G_SFP_PLUS:
|
case NETXEN_BRDTYPE_P3_10G_SFP_PLUS:
|
||||||
case NETXEN_BRDTYPE_P3_10G_SFP_CT:
|
case NETXEN_BRDTYPE_P3_10G_SFP_CT:
|
||||||
case NETXEN_BRDTYPE_P3_10G_SFP_QT:
|
case NETXEN_BRDTYPE_P3_10G_SFP_QT:
|
||||||
|
ecmd->advertising |= ADVERTISED_TP;
|
||||||
|
ecmd->supported |= SUPPORTED_TP;
|
||||||
|
case NETXEN_BRDTYPE_P2_SB31_10G:
|
||||||
case NETXEN_BRDTYPE_P3_10G_XFP:
|
case NETXEN_BRDTYPE_P3_10G_XFP:
|
||||||
ecmd->supported |= SUPPORTED_FIBRE;
|
ecmd->supported |= SUPPORTED_FIBRE;
|
||||||
ecmd->advertising |= ADVERTISED_FIBRE;
|
ecmd->advertising |= ADVERTISED_FIBRE;
|
||||||
ecmd->port = PORT_FIBRE;
|
ecmd->port = PORT_FIBRE;
|
||||||
ecmd->autoneg = AUTONEG_DISABLE;
|
ecmd->autoneg = AUTONEG_DISABLE;
|
||||||
break;
|
break;
|
||||||
|
case NETXEN_BRDTYPE_P3_10G_TP:
|
||||||
|
if (adapter->ahw.board_type == NETXEN_NIC_XGBE) {
|
||||||
|
ecmd->autoneg = AUTONEG_DISABLE;
|
||||||
|
ecmd->supported |= (SUPPORTED_FIBRE | SUPPORTED_TP);
|
||||||
|
ecmd->advertising |=
|
||||||
|
(ADVERTISED_FIBRE | ADVERTISED_TP);
|
||||||
|
ecmd->port = PORT_FIBRE;
|
||||||
|
} else {
|
||||||
|
ecmd->autoneg = AUTONEG_ENABLE;
|
||||||
|
ecmd->supported |= (SUPPORTED_TP |SUPPORTED_Autoneg);
|
||||||
|
ecmd->advertising |=
|
||||||
|
(ADVERTISED_TP | ADVERTISED_Autoneg);
|
||||||
|
ecmd->port = PORT_TP;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
printk(KERN_ERR "netxen-nic: Unsupported board model %d\n",
|
printk(KERN_ERR "netxen-nic: Unsupported board model %d\n",
|
||||||
(netxen_brdtype_t) boardinfo->board_type);
|
(netxen_brdtype_t) boardinfo->board_type);
|
||||||
|
@@ -2036,7 +2036,13 @@ int netxen_nic_get_board_info(struct netxen_adapter *adapter)
|
|||||||
rv = -1;
|
rv = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINTK(INFO, "Discovered board type:0x%x ", boardinfo->board_type);
|
if (boardinfo->board_type == NETXEN_BRDTYPE_P3_4_GB_MM) {
|
||||||
|
u32 gpio = netxen_nic_reg_read(adapter,
|
||||||
|
NETXEN_ROMUSB_GLB_PAD_GPIO_I);
|
||||||
|
if ((gpio & 0x8000) == 0)
|
||||||
|
boardinfo->board_type = NETXEN_BRDTYPE_P3_10G_TP;
|
||||||
|
}
|
||||||
|
|
||||||
switch ((netxen_brdtype_t) boardinfo->board_type) {
|
switch ((netxen_brdtype_t) boardinfo->board_type) {
|
||||||
case NETXEN_BRDTYPE_P2_SB35_4G:
|
case NETXEN_BRDTYPE_P2_SB35_4G:
|
||||||
adapter->ahw.board_type = NETXEN_NIC_GBE;
|
adapter->ahw.board_type = NETXEN_NIC_GBE;
|
||||||
@@ -2055,7 +2061,6 @@ int netxen_nic_get_board_info(struct netxen_adapter *adapter)
|
|||||||
case NETXEN_BRDTYPE_P3_10G_SFP_QT:
|
case NETXEN_BRDTYPE_P3_10G_SFP_QT:
|
||||||
case NETXEN_BRDTYPE_P3_10G_XFP:
|
case NETXEN_BRDTYPE_P3_10G_XFP:
|
||||||
case NETXEN_BRDTYPE_P3_10000_BASE_T:
|
case NETXEN_BRDTYPE_P3_10000_BASE_T:
|
||||||
|
|
||||||
adapter->ahw.board_type = NETXEN_NIC_XGBE;
|
adapter->ahw.board_type = NETXEN_NIC_XGBE;
|
||||||
break;
|
break;
|
||||||
case NETXEN_BRDTYPE_P1_BD:
|
case NETXEN_BRDTYPE_P1_BD:
|
||||||
@@ -2065,9 +2070,12 @@ int netxen_nic_get_board_info(struct netxen_adapter *adapter)
|
|||||||
case NETXEN_BRDTYPE_P3_REF_QG:
|
case NETXEN_BRDTYPE_P3_REF_QG:
|
||||||
case NETXEN_BRDTYPE_P3_4_GB:
|
case NETXEN_BRDTYPE_P3_4_GB:
|
||||||
case NETXEN_BRDTYPE_P3_4_GB_MM:
|
case NETXEN_BRDTYPE_P3_4_GB_MM:
|
||||||
|
|
||||||
adapter->ahw.board_type = NETXEN_NIC_GBE;
|
adapter->ahw.board_type = NETXEN_NIC_GBE;
|
||||||
break;
|
break;
|
||||||
|
case NETXEN_BRDTYPE_P3_10G_TP:
|
||||||
|
adapter->ahw.board_type = (adapter->portnum < 2) ?
|
||||||
|
NETXEN_NIC_XGBE : NETXEN_NIC_GBE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
printk("%s: Unknown(%x)\n", netxen_nic_driver_name,
|
printk("%s: Unknown(%x)\n", netxen_nic_driver_name,
|
||||||
boardinfo->board_type);
|
boardinfo->board_type);
|
||||||
@@ -2112,12 +2120,16 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter)
|
|||||||
{
|
{
|
||||||
__u32 status;
|
__u32 status;
|
||||||
__u32 autoneg;
|
__u32 autoneg;
|
||||||
__u32 mode;
|
|
||||||
__u32 port_mode;
|
__u32 port_mode;
|
||||||
|
|
||||||
netxen_nic_read_w0(adapter, NETXEN_NIU_MODE, &mode);
|
if (!netif_carrier_ok(adapter->netdev)) {
|
||||||
if (netxen_get_niu_enable_ge(mode)) { /* Gb 10/100/1000 Mbps mode */
|
adapter->link_speed = 0;
|
||||||
|
adapter->link_duplex = -1;
|
||||||
|
adapter->link_autoneg = AUTONEG_ENABLE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (adapter->ahw.board_type == NETXEN_NIC_GBE) {
|
||||||
adapter->hw_read_wx(adapter,
|
adapter->hw_read_wx(adapter,
|
||||||
NETXEN_PORT_MODE_ADDR, &port_mode, 4);
|
NETXEN_PORT_MODE_ADDR, &port_mode, 4);
|
||||||
if (port_mode == NETXEN_PORT_MODE_802_3_AP) {
|
if (port_mode == NETXEN_PORT_MODE_802_3_AP) {
|
||||||
@@ -2143,7 +2155,7 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter)
|
|||||||
adapter->link_speed = SPEED_1000;
|
adapter->link_speed = SPEED_1000;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
adapter->link_speed = -1;
|
adapter->link_speed = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
switch (netxen_get_phy_duplex(status)) {
|
switch (netxen_get_phy_duplex(status)) {
|
||||||
@@ -2166,7 +2178,7 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter)
|
|||||||
goto link_down;
|
goto link_down;
|
||||||
} else {
|
} else {
|
||||||
link_down:
|
link_down:
|
||||||
adapter->link_speed = -1;
|
adapter->link_speed = 0;
|
||||||
adapter->link_duplex = -1;
|
adapter->link_duplex = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -243,7 +243,7 @@ static void netxen_check_options(struct netxen_adapter *adapter)
|
|||||||
case NETXEN_BRDTYPE_P3_4_GB:
|
case NETXEN_BRDTYPE_P3_4_GB:
|
||||||
case NETXEN_BRDTYPE_P3_4_GB_MM:
|
case NETXEN_BRDTYPE_P3_4_GB_MM:
|
||||||
adapter->msix_supported = !!use_msi_x;
|
adapter->msix_supported = !!use_msi_x;
|
||||||
adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G;
|
adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NETXEN_BRDTYPE_P2_SB35_4G:
|
case NETXEN_BRDTYPE_P2_SB35_4G:
|
||||||
@@ -252,6 +252,14 @@ static void netxen_check_options(struct netxen_adapter *adapter)
|
|||||||
adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
|
adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case NETXEN_BRDTYPE_P3_10G_TP:
|
||||||
|
adapter->msix_supported = !!use_msi_x;
|
||||||
|
if (adapter->ahw.board_type == NETXEN_NIC_XGBE)
|
||||||
|
adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G;
|
||||||
|
else
|
||||||
|
adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
adapter->msix_supported = 0;
|
adapter->msix_supported = 0;
|
||||||
adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
|
adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_1G;
|
||||||
@@ -1396,6 +1404,8 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter)
|
|||||||
netif_carrier_off(netdev);
|
netif_carrier_off(netdev);
|
||||||
netif_stop_queue(netdev);
|
netif_stop_queue(netdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
netxen_nic_set_link_parameters(adapter);
|
||||||
} else if (!adapter->ahw.linkup && linkup) {
|
} else if (!adapter->ahw.linkup && linkup) {
|
||||||
printk(KERN_INFO "%s: %s NIC Link is up\n",
|
printk(KERN_INFO "%s: %s NIC Link is up\n",
|
||||||
netxen_nic_driver_name, netdev->name);
|
netxen_nic_driver_name, netdev->name);
|
||||||
@@ -1404,6 +1414,8 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter)
|
|||||||
netif_carrier_on(netdev);
|
netif_carrier_on(netdev);
|
||||||
netif_wake_queue(netdev);
|
netif_wake_queue(netdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
netxen_nic_set_link_parameters(adapter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user