Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4303565d authored by Chien Tung's avatar Chien Tung Committed by Roland Dreier
Browse files

RDMA/nes: Add support for new SFP+ PHY



Add new register settings for new SFP+ PHY/firmware.
Add new PHY to to nes_netdev_get/set_settings.

Signed-off-by: default avatarChien Tung <chien.tin.tung@intel.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent a4849fc1
Loading
Loading
Loading
Loading
+14 −5
Original line number Original line Diff line number Diff line
@@ -766,6 +766,7 @@ static int nes_init_serdes(struct nes_device *nesdev, u8 hw_rev, u8 port_count,
		/* init serdes 1 */
		/* init serdes 1 */
		switch (nesadapter->phy_type[1]) {
		switch (nesadapter->phy_type[1]) {
		case NES_PHY_TYPE_ARGUS:
		case NES_PHY_TYPE_ARGUS:
		case NES_PHY_TYPE_SFP_D:
			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP0, 0x00000000);
			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP0, 0x00000000);
			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP1, 0x00000000);
			nes_write_indexed(nesdev, NES_IDX_ETH_SERDES_TX_EMP1, 0x00000000);
			break;
			break;
@@ -1337,14 +1338,16 @@ int nes_init_phy(struct nes_device *nesdev)
	}
	}


	if ((phy_type == NES_PHY_TYPE_IRIS) ||
	if ((phy_type == NES_PHY_TYPE_IRIS) ||
	    (phy_type == NES_PHY_TYPE_ARGUS)) {
	    (phy_type == NES_PHY_TYPE_ARGUS) ||
	    (phy_type == NES_PHY_TYPE_SFP_D)) {
		/* setup 10G MDIO operation */
		/* setup 10G MDIO operation */
		tx_config = nes_read_indexed(nesdev, NES_IDX_MAC_TX_CONFIG);
		tx_config = nes_read_indexed(nesdev, NES_IDX_MAC_TX_CONFIG);
		tx_config &= 0xFFFFFFE3;
		tx_config &= 0xFFFFFFE3;
		tx_config |= 0x15;
		tx_config |= 0x15;
		nes_write_indexed(nesdev, NES_IDX_MAC_TX_CONFIG, tx_config);
		nes_write_indexed(nesdev, NES_IDX_MAC_TX_CONFIG, tx_config);
	}
	}
	if ((phy_type == NES_PHY_TYPE_ARGUS)) {
	if ((phy_type == NES_PHY_TYPE_ARGUS) ||
	    (phy_type == NES_PHY_TYPE_SFP_D)) {
		/* Check firmware heartbeat */
		/* Check firmware heartbeat */
		nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7ee);
		nes_read_10G_phy_reg(nesdev, phy_index, 0x3, 0xd7ee);
		temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
		temp_phy_data = (u16)nes_read_indexed(nesdev, NES_IDX_MAC_MDIO_CONTROL);
@@ -1358,10 +1361,15 @@ int nes_init_phy(struct nes_device *nesdev)
		/* no heartbeat, configure the PHY */
		/* no heartbeat, configure the PHY */
		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0x0000, 0x8000);
		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0x0000, 0x8000);
		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc300, 0x0000);
		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc300, 0x0000);
		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc302, 0x000C);
		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc316, 0x000A);
		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc316, 0x000A);
		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc318, 0x0052);
		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc318, 0x0052);
		if (phy_type == NES_PHY_TYPE_ARGUS) {
			nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc302, 0x000C);
			nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc319, 0x0008);
			nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc319, 0x0008);
		} else {
			nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc302, 0x0004);
			nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc319, 0x0038);
		}
		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc31a, 0x0098);
		nes_write_10G_phy_reg(nesdev, phy_index, 0x1, 0xc31a, 0x0098);
		nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0026, 0x0E00);
		nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0026, 0x0E00);
		nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0027, 0x0001);
		nes_write_10G_phy_reg(nesdev, phy_index, 0x3, 0x0027, 0x0001);
@@ -2442,6 +2450,7 @@ static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number)
				break;
				break;


			case NES_PHY_TYPE_ARGUS:
			case NES_PHY_TYPE_ARGUS:
			case NES_PHY_TYPE_SFP_D:
				/* clear the alarms */
				/* clear the alarms */
				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0x0008);
				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0x0008);
				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0xc001);
				nes_read_10G_phy_reg(nesdev, nesadapter->phy_index[mac_index], 4, 0xc001);
+1 −0
Original line number Original line Diff line number Diff line
@@ -42,6 +42,7 @@
#define NES_PHY_TYPE_PUMA_1G   5
#define NES_PHY_TYPE_PUMA_1G   5
#define NES_PHY_TYPE_PUMA_10G  6
#define NES_PHY_TYPE_PUMA_10G  6
#define NES_PHY_TYPE_GLADIUS   7
#define NES_PHY_TYPE_GLADIUS   7
#define NES_PHY_TYPE_SFP_D     8


#define NES_MULTICAST_PF_MAX 8
#define NES_MULTICAST_PF_MAX 8


+29 −23
Original line number Original line Diff line number Diff line
@@ -1426,49 +1426,55 @@ static int nes_netdev_get_settings(struct net_device *netdev, struct ethtool_cmd
	struct nes_vnic *nesvnic = netdev_priv(netdev);
	struct nes_vnic *nesvnic = netdev_priv(netdev);
	struct nes_device *nesdev = nesvnic->nesdev;
	struct nes_device *nesdev = nesvnic->nesdev;
	struct nes_adapter *nesadapter = nesdev->nesadapter;
	struct nes_adapter *nesadapter = nesdev->nesadapter;
	u32 mac_index = nesdev->mac_index;
	u8 phy_type = nesadapter->phy_type[mac_index];
	u8 phy_index = nesadapter->phy_index[mac_index];
	u16 phy_data;
	u16 phy_data;


	et_cmd->duplex = DUPLEX_FULL;
	et_cmd->duplex = DUPLEX_FULL;
	et_cmd->port   = PORT_MII;
	et_cmd->port   = PORT_MII;
	et_cmd->maxtxpkt = 511;
	et_cmd->maxrxpkt = 511;


	if (nesadapter->OneG_Mode) {
	if (nesadapter->OneG_Mode) {
		et_cmd->speed = SPEED_1000;
		et_cmd->speed = SPEED_1000;
		if (nesadapter->phy_type[nesdev->mac_index] == NES_PHY_TYPE_PUMA_1G) {
		if (phy_type == NES_PHY_TYPE_PUMA_1G) {
			et_cmd->supported   = SUPPORTED_1000baseT_Full;
			et_cmd->supported   = SUPPORTED_1000baseT_Full;
			et_cmd->advertising = ADVERTISED_1000baseT_Full;
			et_cmd->advertising = ADVERTISED_1000baseT_Full;
			et_cmd->autoneg     = AUTONEG_DISABLE;
			et_cmd->autoneg     = AUTONEG_DISABLE;
			et_cmd->transceiver = XCVR_INTERNAL;
			et_cmd->transceiver = XCVR_INTERNAL;
			et_cmd->phy_address = nesdev->mac_index;
			et_cmd->phy_address = mac_index;
		} else {
		} else {
			et_cmd->supported   = SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg;
			et_cmd->supported   = SUPPORTED_1000baseT_Full
			et_cmd->advertising = ADVERTISED_1000baseT_Full | ADVERTISED_Autoneg;
					    | SUPPORTED_Autoneg;
			nes_read_1G_phy_reg(nesdev, 0, nesadapter->phy_index[nesdev->mac_index], &phy_data);
			et_cmd->advertising = ADVERTISED_1000baseT_Full
					    | ADVERTISED_Autoneg;
			nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
			if (phy_data & 0x1000)
			if (phy_data & 0x1000)
				et_cmd->autoneg = AUTONEG_ENABLE;
				et_cmd->autoneg = AUTONEG_ENABLE;
			else
			else
				et_cmd->autoneg = AUTONEG_DISABLE;
				et_cmd->autoneg = AUTONEG_DISABLE;
			et_cmd->transceiver = XCVR_EXTERNAL;
			et_cmd->transceiver = XCVR_EXTERNAL;
			et_cmd->phy_address = nesadapter->phy_index[nesdev->mac_index];
			et_cmd->phy_address = phy_index;
		}
		}
	} else {
		return 0;
		if ((nesadapter->phy_type[nesdev->mac_index] == NES_PHY_TYPE_IRIS) ||
	}
		    (nesadapter->phy_type[nesdev->mac_index] == NES_PHY_TYPE_ARGUS)) {
	if ((phy_type == NES_PHY_TYPE_IRIS) ||
	    (phy_type == NES_PHY_TYPE_ARGUS) ||
	    (phy_type == NES_PHY_TYPE_SFP_D)) {
		et_cmd->transceiver = XCVR_EXTERNAL;
		et_cmd->transceiver = XCVR_EXTERNAL;
		et_cmd->port        = PORT_FIBRE;
		et_cmd->port        = PORT_FIBRE;
		et_cmd->supported   = SUPPORTED_FIBRE;
		et_cmd->supported   = SUPPORTED_FIBRE;
		et_cmd->advertising = ADVERTISED_FIBRE;
		et_cmd->advertising = ADVERTISED_FIBRE;
			et_cmd->phy_address = nesadapter->phy_index[nesdev->mac_index];
		et_cmd->phy_address = phy_index;
	} else {
	} else {
		et_cmd->transceiver = XCVR_INTERNAL;
		et_cmd->transceiver = XCVR_INTERNAL;
		et_cmd->supported   = SUPPORTED_10000baseT_Full;
		et_cmd->supported   = SUPPORTED_10000baseT_Full;
		et_cmd->advertising = ADVERTISED_10000baseT_Full;
		et_cmd->advertising = ADVERTISED_10000baseT_Full;
			et_cmd->phy_address = nesdev->mac_index;
		et_cmd->phy_address = mac_index;
	}
	}
	et_cmd->speed = SPEED_10000;
	et_cmd->speed = SPEED_10000;
	et_cmd->autoneg = AUTONEG_DISABLE;
	et_cmd->autoneg = AUTONEG_DISABLE;
	}
	et_cmd->maxtxpkt = 511;
	et_cmd->maxrxpkt = 511;
	return 0;
	return 0;
}
}