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

Commit f9af8574 authored by Matheos Worku's avatar Matheos Worku Committed by David S. Miller
Browse files

niu: Determine the # of ports from the card's VPD data



Determine the number of physical ports from the card's VPD data.
Previous fix failed on Maramba platform which doesn't have the
"board-model" property. This fix uses the "model" property which
exists on all cards and Neptune based motherboards.

cstyle cleanup included.

Signed-off-by: default avatarMatheos Worku <matheos.worku@sun.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 36ca34cc
Loading
Loading
Loading
Loading
+21 −32
Original line number Diff line number Diff line
@@ -865,7 +865,6 @@ static int link_status_1g_serdes(struct niu *np, int *link_up_p)
	return 0;
}


static int link_status_10g_serdes(struct niu *np, int *link_up_p)
{
	unsigned long flags;
@@ -900,7 +899,6 @@ static int link_status_10g_serdes(struct niu *np, int *link_up_p)
	return 0;
}


static int link_status_1g_rgmii(struct niu *np, int *link_up_p)
{
	struct niu_link_config *lp = &np->link_config;
@@ -957,7 +955,6 @@ static int link_status_1g_rgmii(struct niu *np, int *link_up_p)
	return err;
}


static int bcm8704_reset(struct niu *np)
{
	int err, limit;
@@ -1357,8 +1354,6 @@ static int mii_reset(struct niu *np)
	return 0;
}



static int xcvr_init_1g_rgmii(struct niu *np)
{
	int err;
@@ -1419,7 +1414,6 @@ static int xcvr_init_1g_rgmii(struct niu *np)
	return 0;
}


static int mii_init_common(struct niu *np)
{
	struct niu_link_config *lp = &np->link_config;
@@ -7008,31 +7002,20 @@ static int __devinit niu_phy_type_prop_decode(struct niu *np,
	return 0;
}

/* niu board models have a trailing dash version incremented
 * with HW rev change. Need to ingnore the  dash version while
 * checking for match
 *
 * for example, for the 10G card the current vpd.board_model
 * is 501-5283-04, of which -04 is the  dash version and have
 * to be ignored
 */
static int niu_board_model_match(struct niu *np, const char *model)
{
	return !strncmp(np->vpd.board_model, model, strlen(model));
}

static int niu_pci_vpd_get_nports(struct niu *np)
{
	int ports = 0;

	if ((niu_board_model_match(np, NIU_QGC_LP_BM_STR)) ||
	    (niu_board_model_match(np, NIU_QGC_PEM_BM_STR)) ||
	    (niu_board_model_match(np, NIU_ALONSO_BM_STR))) {
	if ((!strcmp(np->vpd.model, NIU_QGC_LP_MDL_STR)) ||
	    (!strcmp(np->vpd.model, NIU_QGC_PEM_MDL_STR)) ||
	    (!strcmp(np->vpd.model, NIU_MARAMBA_MDL_STR)) ||
	    (!strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) ||
	    (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR))) {
		ports = 4;
	} else if ((niu_board_model_match(np, NIU_2XGF_LP_BM_STR)) ||
		   (niu_board_model_match(np, NIU_2XGF_PEM_BM_STR)) ||
		   (niu_board_model_match(np, NIU_FOXXY_BM_STR)) ||
		   (niu_board_model_match(np, NIU_2XGF_MRVL_BM_STR))) {
	} else if ((!strcmp(np->vpd.model, NIU_2XGF_LP_MDL_STR)) ||
		   (!strcmp(np->vpd.model, NIU_2XGF_PEM_MDL_STR)) ||
		   (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) ||
		   (!strcmp(np->vpd.model, NIU_2XGF_MRVL_MDL_STR))) {
		ports = 2;
	}

@@ -7053,8 +7036,8 @@ static void __devinit niu_pci_vpd_validate(struct niu *np)
		return;
	}

	if (!strcmp(np->vpd.model, "SUNW,CP3220") ||
	    !strcmp(np->vpd.model, "SUNW,CP3260")) {
	if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) ||
	    !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) {
		np->flags |= NIU_FLAGS_10G;
		np->flags &= ~NIU_FLAGS_FIBER;
		np->flags |= NIU_FLAGS_XCVR_SERDES;
@@ -7065,7 +7048,7 @@ static void __devinit niu_pci_vpd_validate(struct niu *np)
		}
		if (np->flags & NIU_FLAGS_10G)
			 np->mac_xcvr = MAC_XCVR_XPCS;
	} else if (niu_board_model_match(np, NIU_FOXXY_BM_STR)) {
	} else if (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) {
		np->flags |= (NIU_FLAGS_10G | NIU_FLAGS_FIBER |
			      NIU_FLAGS_HOTPLUG_PHY);
	} else if (niu_phy_type_prop_decode(np, np->vpd.phy_type)) {
@@ -7541,8 +7524,8 @@ static int __devinit walk_phys(struct niu *np, struct niu_parent *parent)
	u32 val;
	int err;

	if (!strcmp(np->vpd.model, "SUNW,CP3220") ||
	    !strcmp(np->vpd.model, "SUNW,CP3260")) {
	if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) ||
	    !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) {
		num_10g = 0;
		num_1g = 2;
		parent->plat_type = PLAT_TYPE_ATCA_CP3220;
@@ -7551,7 +7534,7 @@ static int __devinit walk_phys(struct niu *np, struct niu_parent *parent)
		       phy_encode(PORT_TYPE_1G, 1) |
		       phy_encode(PORT_TYPE_1G, 2) |
		       phy_encode(PORT_TYPE_1G, 3));
	} else if (niu_board_model_match(np, NIU_FOXXY_BM_STR)) {
	} else if (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) {
		num_10g = 2;
		num_1g = 0;
		parent->num_ports = 2;
@@ -7946,6 +7929,7 @@ static int __devinit niu_get_of_props(struct niu *np)
	struct device_node *dp;
	const char *phy_type;
	const u8 *mac_addr;
	const char *model;
	int prop_len;

	if (np->parent->plat_type == PLAT_TYPE_NIU)
@@ -8000,6 +7984,11 @@ static int __devinit niu_get_of_props(struct niu *np)

	memcpy(dev->dev_addr, dev->perm_addr, dev->addr_len);

	model = of_get_property(dp, "model", &prop_len);

	if (model)
		strcpy(np->vpd.model, model);

	return 0;
#else
	return -EINVAL;
+9 −0
Original line number Diff line number Diff line
@@ -2946,6 +2946,15 @@ struct rx_ring_info {
#define	NIU_ALONSO_BM_STR	"373-0202"
#define	NIU_FOXXY_BM_STR	"501-7961"
#define	NIU_2XGF_MRVL_BM_STR	"SK-6E82"
#define	NIU_QGC_LP_MDL_STR	"SUNW,pcie-qgc"
#define	NIU_2XGF_LP_MDL_STR	"SUNW,pcie-2xgf"
#define	NIU_QGC_PEM_MDL_STR	"SUNW,pcie-qgc-pem"
#define	NIU_2XGF_PEM_MDL_STR	"SUNW,pcie-2xgf-pem"
#define	NIU_ALONSO_MDL_STR	"SUNW,CP3220"
#define	NIU_KIMI_MDL_STR	"SUNW,CP3260"
#define	NIU_MARAMBA_MDL_STR	"SUNW,pcie-neptune"
#define	NIU_FOXXY_MDL_STR	"SUNW,pcie-rfem"
#define	NIU_2XGF_MRVL_MDL_STR	"SysKonnect,pcie-2xgf"

#define NIU_VPD_MIN_MAJOR	3
#define NIU_VPD_MIN_MINOR	4