From: Matheos Worku <Matheos.Worku@Sun.COM>
To: David Miller <davem@davemloft.net>
Cc: netdev@vger.kernel.org
Subject: Re: [PATCH 1/2] [NIU] Determine the # of ports from the card's VPD data.
Date: Thu, 24 Apr 2008 12:44:21 -0700 [thread overview]
Message-ID: <4810E315.8080303@sun.com> (raw)
In-Reply-To: <20080423.182848.74720455.davem@davemloft.net>
[-- Attachment #1: Type: text/plain, Size: 1396 bytes --]
David Miller wrote:
> From: Matheos Worku <matheos.worku@sun.com>
> Date: Wed, 23 Apr 2008 10:10:52 -0700
>
>
>> +#define NIU_BMD_MATCHES(np, md_str) \
>> + (!strncmp(np->vpd.board_model, md_str, strlen(md_str)))
>>
>
> Why is this special construct necessary? How can anyone tell the
> reason this is needed by reading this code?
>
> Plain ole' strcmp() should suffice. If the string length is
> different, we should get a comparison failure. We've also made sure
> that the board_model[] field is a properly null terminated string.
>
> Is the issue that there could be some spurious trailing characters in
> the board_model[] string that we'd like to ignore?
>
> If that's the case this comparison deserves it's own small function,
> with some descriptive text, rather than an ugly and undescriptive
> macro.
>
Dave,
Thanks a lot for the feedback.
The board model contains a HW dash version number which changes with HW
change. Need to ignore the - version number.
A new patch, using a small function as you suggested is attached.
Matheos
> Something like:
>
> /* Board model strings can have trailing characters we wish
> * to ignore during comparison, for example:
> *
> * XXXX (add example(s) here) XXX
> */
> static int niu_board_model_compare(struct niu *np, const char *model)
> {
> return strncmp(np->vpd.board_model, model, strlen(model));
> }
>
> Thanks.
>
[-- Attachment #2: ncr.patch --]
[-- Type: text/x-patch, Size: 4058 bytes --]
From: Matheos Worku <matheos.worku@sun.com>
Date: Thu, 24 Apr 2008 10:23:22 -0700
Subject: [PATCH 1/1] [NIU] Determine the # of ports from the card's VPD data
Signed-off-by: Matheos Worku <matheos.worku@sun.com>
---
drivers/net/niu.c | 70 ++++++++++++++++++++++++++++++++++++++++++++--------
drivers/net/niu.h | 9 +++++++
2 files changed, 68 insertions(+), 11 deletions(-)
diff --git a/drivers/net/niu.c b/drivers/net/niu.c
index 7565c2d..431d490 100644
--- a/drivers/net/niu.c
+++ b/drivers/net/niu.c
@@ -6773,6 +6773,41 @@ 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))) {
+ 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))) {
+ ports = 2;
+ }
+
+ return (ports);
+}
+
+
static void __devinit niu_pci_vpd_validate(struct niu *np)
{
struct net_device *dev = np->dev;
@@ -6976,6 +7011,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 +7023,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 +7773,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 +7794,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..257dd16 100644
--- a/drivers/net/niu.h
+++ b/drivers/net/niu.h
@@ -2936,6 +2936,15 @@ 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_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
--
1.5.2
next prev parent reply other threads:[~2008-04-24 19:45 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[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 [this message]
2008-04-25 4:03 ` David Miller
2008-04-23 18:15 Matheos Worku
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=4810E315.8080303@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.