From: Matheos Worku <Matheos.Worku@Sun.COM>
To: netdev@vger.kernel.org, David Miller <davem@davemloft.net>,
Matheos Worku <Matheos.Worku@Sun.COM>
Subject: [PATCH 1/2] [NIU] Determine the # of ports from the card's VPD data.
Date: Wed, 23 Apr 2008 11:15:03 -0700 [thread overview]
Message-ID: <480F7CA7.4000602@sun.com> (raw)
Signed-off-by: Matheos Worku <matheos.worku@sun.com>
---
drivers/net/niu.c | 57
++++++++++++++++++++++++++++++++++++++++++----------
drivers/net/niu.h | 11 +++++++++-
2 files changed, 56 insertions(+), 12 deletions(-)
diff --git a/drivers/net/niu.c b/drivers/net/niu.c
index 7565c2d..c1fcd07 100644
--- a/drivers/net/niu.c
+++ b/drivers/net/niu.c
@@ -6773,6 +6773,28 @@ static int __devinit
niu_phy_type_prop_decode(struct niu *np,
return 0;
}
+#define NIU_BMD_MATCHES(np, md_str) \
+ (!strncmp(np->vpd.board_model, md_str, strlen(md_str)))
+
+static int niu_pci_vpd_get_nports(struct niu *np)
+{
+ int ports = 0;
+
+ if ((NIU_BMD_MATCHES(np, NIU_QGC_LP_BM_STR)) ||
+ (NIU_BMD_MATCHES(np, NIU_QGC_PEM_BM_STR)) ||
+ (NIU_BMD_MATCHES(np, NIU_ALONSO_BM_STR))) {
+ ports = 4;
+ } else if ((NIU_BMD_MATCHES(np, NIU_2XGF_LP_BM_STR)) ||
+ (NIU_BMD_MATCHES(np, NIU_2XGF_PEM_BM_STR)) ||
+ (NIU_BMD_MATCHES(np, NIU_FOXXY_BM_STR)) ||
+ (NIU_BMD_MATCHES(np, NIU_2XGF_MRVL_BM_STR))) {
+ ports = 2;
+ }
+
+ return (ports);
+}
+
+
static void __devinit niu_pci_vpd_validate(struct niu *np)
{
struct net_device *dev = np->dev;
@@ -6976,6 +6998,7 @@ static int __devinit niu_pci_probe_sprom(struct
niu *np)
return 0;
}
+
static int __devinit niu_get_and_validate_port(struct niu *np)
{
struct niu_parent *parent = np->parent;
@@ -6987,11 +7010,15 @@ static int __devinit
niu_get_and_validate_port(struct niu *np)
if (parent->plat_type == PLAT_TYPE_NIU) {
parent->num_ports = 2;
} else {
- parent->num_ports = nr64(ESPC_NUM_PORTS_MACS) &
- ESPC_NUM_PORTS_MACS_VAL;
-
- if (!parent->num_ports)
- parent->num_ports = 4;
+ parent->num_ports = niu_pci_vpd_get_nports(np);
+ if (!parent->num_ports) {
+ /* fall back to SPROM as last resort. will fail on most cards*/
+ parent->num_ports = nr64(ESPC_NUM_PORTS_MACS) &
+ ESPC_NUM_PORTS_MACS_VAL;
+
+ if (!parent->num_ports)
+ return -ENODEV;
+ }
}
}
@@ -7733,15 +7760,16 @@ static int __devinit niu_get_invariants(struct
niu *np)
have_props = !err;
- err = niu_get_and_validate_port(np);
- if (err)
- return err;
-
err = niu_init_mac_ipp_pcs_base(np);
if (err)
return err;
- if (!have_props) {
+ if (have_props) {
+ err = niu_get_and_validate_port(np);
+ if (err)
+ return err;
+
+ } else {
if (np->parent->plat_type == PLAT_TYPE_NIU)
return -EINVAL;
@@ -7753,10 +7781,17 @@ static int __devinit niu_get_invariants(struct
niu *np)
niu_pci_vpd_fetch(np, offset);
nw64(ESPC_PIO_EN, 0);
- if (np->flags & NIU_FLAGS_VPD_VALID)
+ if (np->flags & NIU_FLAGS_VPD_VALID) {
niu_pci_vpd_validate(np);
+ err = niu_get_and_validate_port(np);
+ if (err)
+ return err;
+ }
if (!(np->flags & NIU_FLAGS_VPD_VALID)) {
+ err = niu_get_and_validate_port(np);
+ if (err)
+ return err;
err = niu_pci_probe_sprom(np);
if (err)
return err;
diff --git a/drivers/net/niu.h b/drivers/net/niu.h
index 336aed0..0343c08 100644
--- a/drivers/net/niu.h
+++ b/drivers/net/niu.h
@@ -2936,6 +2936,16 @@ struct rx_ring_info {
#define MAC_NUM_HASH 16
#define NIU_MAX_MTU 9216
+/* vpd strings */
+
+#define NIU_QGC_LP_BM_STR "501-7606"
+#define NIU_2XGF_LP_BM_STR "501-7283"
+#define NIU_QGC_PEM_BM_STR "501-7765"
+#define NIU_2XGF_PEM_BM_STR "501-7626"
+#define NIU_ALONSO_BM_STR "373-0202"
+#define NIU_ALONSO_MODEL_STR "SUNW,CP3220"
+#define NIU_FOXXY_BM_STR "501-7961"
+#define NIU_2XGF_MRVL_BM_STR "SK-6E82"
#define NIU_VPD_MIN_MAJOR 3
#define NIU_VPD_MIN_MINOR 4
@@ -3233,7 +3243,6 @@ struct niu {
struct timer_list timer;
const struct niu_phy_ops *phy_ops;
int phy_addr;
-
struct niu_link_config link_config;
struct work_struct reset_task;
-- 1.5.2
next reply other threads:[~2008-04-23 18:16 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-23 18:15 Matheos Worku [this message]
[not found] <200804231811.m3NIBhQl043628@sr1-umpk-33.sfbay.sun.com>
2008-04-24 1:28 ` [PATCH 1/2] [NIU] Determine the # of ports from the card's VPD data David Miller
2008-04-24 19:44 ` Matheos Worku
2008-04-25 4:03 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=480F7CA7.4000602@sun.com \
--to=matheos.worku@sun.com \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.