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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).