提交 f9af8574 编写于 作者: M Matheos Worku 提交者: David S. Miller

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: NMatheos Worku <matheos.worku@sun.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 36ca34cc
...@@ -865,7 +865,6 @@ static int link_status_1g_serdes(struct niu *np, int *link_up_p) ...@@ -865,7 +865,6 @@ static int link_status_1g_serdes(struct niu *np, int *link_up_p)
return 0; return 0;
} }
static int link_status_10g_serdes(struct niu *np, int *link_up_p) static int link_status_10g_serdes(struct niu *np, int *link_up_p)
{ {
unsigned long flags; unsigned long flags;
...@@ -900,7 +899,6 @@ static int link_status_10g_serdes(struct niu *np, int *link_up_p) ...@@ -900,7 +899,6 @@ static int link_status_10g_serdes(struct niu *np, int *link_up_p)
return 0; return 0;
} }
static int link_status_1g_rgmii(struct niu *np, int *link_up_p) static int link_status_1g_rgmii(struct niu *np, int *link_up_p)
{ {
struct niu_link_config *lp = &np->link_config; 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) ...@@ -957,7 +955,6 @@ static int link_status_1g_rgmii(struct niu *np, int *link_up_p)
return err; return err;
} }
static int bcm8704_reset(struct niu *np) static int bcm8704_reset(struct niu *np)
{ {
int err, limit; int err, limit;
...@@ -1357,8 +1354,6 @@ static int mii_reset(struct niu *np) ...@@ -1357,8 +1354,6 @@ static int mii_reset(struct niu *np)
return 0; return 0;
} }
static int xcvr_init_1g_rgmii(struct niu *np) static int xcvr_init_1g_rgmii(struct niu *np)
{ {
int err; int err;
...@@ -1419,7 +1414,6 @@ static int xcvr_init_1g_rgmii(struct niu *np) ...@@ -1419,7 +1414,6 @@ static int xcvr_init_1g_rgmii(struct niu *np)
return 0; return 0;
} }
static int mii_init_common(struct niu *np) static int mii_init_common(struct niu *np)
{ {
struct niu_link_config *lp = &np->link_config; struct niu_link_config *lp = &np->link_config;
...@@ -7008,31 +7002,20 @@ static int __devinit niu_phy_type_prop_decode(struct niu *np, ...@@ -7008,31 +7002,20 @@ static int __devinit niu_phy_type_prop_decode(struct niu *np,
return 0; 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) static int niu_pci_vpd_get_nports(struct niu *np)
{ {
int ports = 0; int ports = 0;
if ((niu_board_model_match(np, NIU_QGC_LP_BM_STR)) || if ((!strcmp(np->vpd.model, NIU_QGC_LP_MDL_STR)) ||
(niu_board_model_match(np, NIU_QGC_PEM_BM_STR)) || (!strcmp(np->vpd.model, NIU_QGC_PEM_MDL_STR)) ||
(niu_board_model_match(np, NIU_ALONSO_BM_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; ports = 4;
} else if ((niu_board_model_match(np, NIU_2XGF_LP_BM_STR)) || } else if ((!strcmp(np->vpd.model, NIU_2XGF_LP_MDL_STR)) ||
(niu_board_model_match(np, NIU_2XGF_PEM_BM_STR)) || (!strcmp(np->vpd.model, NIU_2XGF_PEM_MDL_STR)) ||
(niu_board_model_match(np, NIU_FOXXY_BM_STR)) || (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) ||
(niu_board_model_match(np, NIU_2XGF_MRVL_BM_STR))) { (!strcmp(np->vpd.model, NIU_2XGF_MRVL_MDL_STR))) {
ports = 2; ports = 2;
} }
...@@ -7053,8 +7036,8 @@ static void __devinit niu_pci_vpd_validate(struct niu *np) ...@@ -7053,8 +7036,8 @@ static void __devinit niu_pci_vpd_validate(struct niu *np)
return; return;
} }
if (!strcmp(np->vpd.model, "SUNW,CP3220") || if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) ||
!strcmp(np->vpd.model, "SUNW,CP3260")) { !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) {
np->flags |= NIU_FLAGS_10G; np->flags |= NIU_FLAGS_10G;
np->flags &= ~NIU_FLAGS_FIBER; np->flags &= ~NIU_FLAGS_FIBER;
np->flags |= NIU_FLAGS_XCVR_SERDES; np->flags |= NIU_FLAGS_XCVR_SERDES;
...@@ -7065,7 +7048,7 @@ static void __devinit niu_pci_vpd_validate(struct niu *np) ...@@ -7065,7 +7048,7 @@ static void __devinit niu_pci_vpd_validate(struct niu *np)
} }
if (np->flags & NIU_FLAGS_10G) if (np->flags & NIU_FLAGS_10G)
np->mac_xcvr = MAC_XCVR_XPCS; 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 | np->flags |= (NIU_FLAGS_10G | NIU_FLAGS_FIBER |
NIU_FLAGS_HOTPLUG_PHY); NIU_FLAGS_HOTPLUG_PHY);
} else if (niu_phy_type_prop_decode(np, np->vpd.phy_type)) { } 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) ...@@ -7541,8 +7524,8 @@ static int __devinit walk_phys(struct niu *np, struct niu_parent *parent)
u32 val; u32 val;
int err; int err;
if (!strcmp(np->vpd.model, "SUNW,CP3220") || if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) ||
!strcmp(np->vpd.model, "SUNW,CP3260")) { !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) {
num_10g = 0; num_10g = 0;
num_1g = 2; num_1g = 2;
parent->plat_type = PLAT_TYPE_ATCA_CP3220; parent->plat_type = PLAT_TYPE_ATCA_CP3220;
...@@ -7551,7 +7534,7 @@ static int __devinit walk_phys(struct niu *np, struct niu_parent *parent) ...@@ -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, 1) |
phy_encode(PORT_TYPE_1G, 2) | phy_encode(PORT_TYPE_1G, 2) |
phy_encode(PORT_TYPE_1G, 3)); 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_10g = 2;
num_1g = 0; num_1g = 0;
parent->num_ports = 2; parent->num_ports = 2;
...@@ -7946,6 +7929,7 @@ static int __devinit niu_get_of_props(struct niu *np) ...@@ -7946,6 +7929,7 @@ static int __devinit niu_get_of_props(struct niu *np)
struct device_node *dp; struct device_node *dp;
const char *phy_type; const char *phy_type;
const u8 *mac_addr; const u8 *mac_addr;
const char *model;
int prop_len; int prop_len;
if (np->parent->plat_type == PLAT_TYPE_NIU) if (np->parent->plat_type == PLAT_TYPE_NIU)
...@@ -8000,6 +7984,11 @@ static int __devinit niu_get_of_props(struct niu *np) ...@@ -8000,6 +7984,11 @@ static int __devinit niu_get_of_props(struct niu *np)
memcpy(dev->dev_addr, dev->perm_addr, dev->addr_len); 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; return 0;
#else #else
return -EINVAL; return -EINVAL;
......
...@@ -2946,6 +2946,15 @@ struct rx_ring_info { ...@@ -2946,6 +2946,15 @@ struct rx_ring_info {
#define NIU_ALONSO_BM_STR "373-0202" #define NIU_ALONSO_BM_STR "373-0202"
#define NIU_FOXXY_BM_STR "501-7961" #define NIU_FOXXY_BM_STR "501-7961"
#define NIU_2XGF_MRVL_BM_STR "SK-6E82" #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_MAJOR 3
#define NIU_VPD_MIN_MINOR 4 #define NIU_VPD_MIN_MINOR 4
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册