* [PATCH v2 0/2] Improve NCSI driver logging
@ 2017-11-08 0:35 Samuel Mendoza-Jonas
2017-11-08 0:35 ` [PATCH v2 1/2] net/ncsi: General state debugging Samuel Mendoza-Jonas
2017-11-08 0:35 ` [PATCH v2 2/2] net/ncsi: Query channel parameters during configuration Samuel Mendoza-Jonas
0 siblings, 2 replies; 3+ messages in thread
From: Samuel Mendoza-Jonas @ 2017-11-08 0:35 UTC (permalink / raw)
To: openbmc; +Cc: Samuel Mendoza-Jonas
The NCSI driver has next to no logging at all, with some of the only useful
logs actually coming from the ftgmac100 driver as link up/down messages.
Add a great deal more logging to the NCSI driver, tracking channel state and
selection, link events, and so on. Patch 1 has no functional changes, and
Patch 2 sends a Get-Parameters command during configuration to sanity check the
current channel.
A form of this will go upstream (the log levels probably need some tweaking),
but this iteration is being sent to OpenBMC to assist people currently
debugging a few network issues in the ftgmac100/NCSI/Broadcom area.
v2:
Adjusted log levels (many down to KERN_DEBUG). Patch 2 is the source of most
of the noise, and can probably be skipped - for upstream I'd intend to include
it with a way to manually request that information rather than retrieve it on
every configuration.
Samuel Mendoza-Jonas (2):
net/ncsi: General state debugging
net/ncsi: Query channel parameters during configuration
net/ncsi/internal.h | 1 +
net/ncsi/ncsi-aen.c | 15 +++++++++++++-
net/ncsi/ncsi-manage.c | 56 +++++++++++++++++++++++++++++++++++++++++++-------
net/ncsi/ncsi-rsp.c | 33 ++++++++++++++++++++++++++++-
4 files changed, 96 insertions(+), 9 deletions(-)
--
2.14.3
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v2 1/2] net/ncsi: General state debugging
2017-11-08 0:35 [PATCH v2 0/2] Improve NCSI driver logging Samuel Mendoza-Jonas
@ 2017-11-08 0:35 ` Samuel Mendoza-Jonas
2017-11-08 0:35 ` [PATCH v2 2/2] net/ncsi: Query channel parameters during configuration Samuel Mendoza-Jonas
1 sibling, 0 replies; 3+ messages in thread
From: Samuel Mendoza-Jonas @ 2017-11-08 0:35 UTC (permalink / raw)
To: openbmc; +Cc: Samuel Mendoza-Jonas
While relatively noisy this helps to debug NCSI state transitions and
the state of channels beyond the existing "down" or "up" messages that
the driver currently has.
Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
---
net/ncsi/ncsi-aen.c | 15 ++++++++++++++-
net/ncsi/ncsi-manage.c | 52 +++++++++++++++++++++++++++++++++++++++++++-------
net/ncsi/ncsi-rsp.c | 10 +++++++++-
3 files changed, 68 insertions(+), 9 deletions(-)
diff --git a/net/ncsi/ncsi-aen.c b/net/ncsi/ncsi-aen.c
index f135938bf781..67e708e98ccf 100644
--- a/net/ncsi/ncsi-aen.c
+++ b/net/ncsi/ncsi-aen.c
@@ -73,6 +73,9 @@ static int ncsi_aen_handler_lsc(struct ncsi_dev_priv *ndp,
ncm->data[2] = data;
ncm->data[4] = ntohl(lsc->oem_status);
+ netdev_info(ndp->ndev.dev, "NCSI: LSC AEN - channel %u state %s\n",
+ nc->id, data & 0x1 ? "up" : "down");
+
chained = !list_empty(&nc->link);
state = nc->state;
spin_unlock_irqrestore(&nc->lock, flags);
@@ -145,6 +148,8 @@ static int ncsi_aen_handler_hncdsc(struct ncsi_dev_priv *ndp,
ncm = &nc->modes[NCSI_MODE_LINK];
hncdsc = (struct ncsi_aen_hncdsc_pkt *)h;
ncm->data[3] = ntohl(hncdsc->status);
+ netdev_info(ndp->ndev.dev, "NCSI: HNCDSC AEN - channel %u state %s\n",
+ nc->id, ncm->data[3] & 0x3 ? "up" : "down");
if (!list_empty(&nc->link) ||
nc->state != NCSI_CHANNEL_ACTIVE) {
spin_unlock_irqrestore(&nc->lock, flags);
@@ -212,10 +217,18 @@ int ncsi_aen_handler(struct ncsi_dev_priv *ndp, struct sk_buff *skb)
}
ret = ncsi_validate_aen_pkt(h, nah->payload);
- if (ret)
+ if (ret) {
+ netdev_warn(ndp->ndev.dev,
+ "NCSI: 'bad' packet ignored for AEN type 0x%x\n",
+ h->type);
goto out;
+ }
ret = nah->handler(ndp, h);
+ if (ret)
+ netdev_err(ndp->ndev.dev,
+ "NCSI: Handler for AEN type 0x%x returned %d\n",
+ h->type, ret);
out:
consume_skb(skb);
return ret;
diff --git a/net/ncsi/ncsi-manage.c b/net/ncsi/ncsi-manage.c
index 8cae2f233272..97b76f26bde7 100644
--- a/net/ncsi/ncsi-manage.c
+++ b/net/ncsi/ncsi-manage.c
@@ -226,6 +226,8 @@ static void ncsi_channel_monitor(unsigned long data)
case NCSI_CHANNEL_MONITOR_WAIT ... NCSI_CHANNEL_MONITOR_WAIT_MAX:
break;
default:
+ netdev_err(ndp->ndev.dev, "NCSI Channel %d timed out!\n",
+ nc->id);
if (!(ndp->flags & NCSI_DEV_HWA)) {
ncsi_report_link(ndp, true);
ndp->flags |= NCSI_DEV_RESHUFFLE;
@@ -769,8 +771,11 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp)
nca.package = np->id;
nca.channel = NCSI_RESERVED_CHANNEL;
ret = ncsi_xmit_cmd(&nca);
- if (ret)
+ if (ret) {
+ netdev_err(ndp->ndev.dev,
+ "NCSI: Failed to transmit CMD_SP\n");
goto error;
+ }
nd->state = ncsi_dev_state_config_cis;
break;
@@ -782,8 +787,11 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp)
nca.package = np->id;
nca.channel = nc->id;
ret = ncsi_xmit_cmd(&nca);
- if (ret)
+ if (ret) {
+ netdev_err(ndp->ndev.dev,
+ "NCSI: Failed to transmit CMD_CIS\n");
goto error;
+ }
nd->state = ncsi_dev_state_config_clear_vids;
break;
@@ -880,10 +888,16 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp)
}
ret = ncsi_xmit_cmd(&nca);
- if (ret)
+ if (ret) {
+ netdev_err(ndp->ndev.dev,
+ "NCSI: Failed to transmit CMD %x\n",
+ nca.type);
goto error;
+ }
break;
case ncsi_dev_state_config_done:
+ netdev_printk(KERN_DEBUG, ndp->ndev.dev,
+ "NCSI: channel %u config done\n", nc->id);
spin_lock_irqsave(&nc->lock, flags);
if (nc->reconfigure_needed) {
/* This channel's configuration has been updated
@@ -911,6 +925,9 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp)
} else {
hot_nc = NULL;
nc->state = NCSI_CHANNEL_INACTIVE;
+ netdev_warn(ndp->ndev.dev,
+ "NCSI: channel %u link down after config\n",
+ nc->id);
}
spin_unlock_irqrestore(&nc->lock, flags);
@@ -923,8 +940,8 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp)
ncsi_process_next_channel(ndp);
break;
default:
- netdev_warn(dev, "Wrong NCSI state 0x%x in config\n",
- nd->state);
+ netdev_alert(dev, "Wrong NCSI state 0x%x in config\n",
+ nd->state);
}
return;
@@ -976,10 +993,17 @@ static int ncsi_choose_active_channel(struct ncsi_dev_priv *ndp)
}
if (!found) {
+ netdev_warn(ndp->ndev.dev,
+ "NCSI: No channel found with link\n");
ncsi_report_link(ndp, true);
return -ENODEV;
}
+ ncm = &found->modes[NCSI_MODE_LINK];
+ netdev_printk(KERN_DEBUG, ndp->ndev.dev,
+ "NCSI: Channel %u added to queue (link %s)\n",
+ found->id, ncm->data[2] & 0x1 ? "up" : "down");
+
out:
spin_lock_irqsave(&ndp->lock, flags);
list_add_tail_rcu(&found->link, &ndp->channel_queue);
@@ -1041,6 +1065,8 @@ static int ncsi_enable_hwa(struct ncsi_dev_priv *ndp)
/* We can have no channels in extremely case */
if (list_empty(&ndp->channel_queue)) {
+ netdev_err(ndp->ndev.dev,
+ "NCSI: No available channels for HWA\n");
ncsi_report_link(ndp, false);
return -ENOENT;
}
@@ -1209,6 +1235,9 @@ static void ncsi_probe_channel(struct ncsi_dev_priv *ndp)
return;
error:
+ netdev_err(ndp->ndev.dev,
+ "NCSI: Failed to transmit cmd 0x%x during probe\n",
+ nca.type);
ncsi_report_link(ndp, true);
}
@@ -1262,10 +1291,14 @@ int ncsi_process_next_channel(struct ncsi_dev_priv *ndp)
switch (old_state) {
case NCSI_CHANNEL_INACTIVE:
ndp->ndev.state = ncsi_dev_state_config;
+ netdev_info(ndp->ndev.dev, "NCSI: configuring channel %u\n",
+ nc->id);
ncsi_configure_channel(ndp);
break;
case NCSI_CHANNEL_ACTIVE:
ndp->ndev.state = ncsi_dev_state_suspend;
+ netdev_info(ndp->ndev.dev, "NCSI: suspending channel %u\n",
+ nc->id);
ncsi_suspend_channel(ndp);
break;
default:
@@ -1285,6 +1318,8 @@ int ncsi_process_next_channel(struct ncsi_dev_priv *ndp)
return ncsi_choose_active_channel(ndp);
}
+ netdev_printk(KERN_DEBUG, ndp->ndev.dev,
+ "NCSI: No more channels to process\n");
ncsi_report_link(ndp, false);
return -ENODEV;
}
@@ -1566,10 +1601,12 @@ int ncsi_start_dev(struct ncsi_dev *nd)
return 0;
}
- if (ndp->flags & NCSI_DEV_HWA)
+ if (ndp->flags & NCSI_DEV_HWA) {
+ netdev_info(ndp->ndev.dev, "NCSI: Enabling HWA mode\n");
ret = ncsi_enable_hwa(ndp);
- else
+ } else {
ret = ncsi_choose_active_channel(ndp);
+ }
return ret;
}
@@ -1600,6 +1637,7 @@ void ncsi_stop_dev(struct ncsi_dev *nd)
}
}
+ netdev_printk(KERN_DEBUG, ndp->ndev.dev, "NCSI: Stopping device\n");
ncsi_report_link(ndp, true);
}
EXPORT_SYMBOL_GPL(ncsi_stop_dev);
diff --git a/net/ncsi/ncsi-rsp.c b/net/ncsi/ncsi-rsp.c
index 927dad4759d1..58186c4102f0 100644
--- a/net/ncsi/ncsi-rsp.c
+++ b/net/ncsi/ncsi-rsp.c
@@ -1032,11 +1032,19 @@ int ncsi_rcv_rsp(struct sk_buff *skb, struct net_device *dev,
if (payload < 0)
payload = ntohs(hdr->length);
ret = ncsi_validate_rsp_pkt(nr, payload);
- if (ret)
+ if (ret) {
+ netdev_warn(ndp->ndev.dev,
+ "NCSI: 'bad' packet ignored for type 0x%x\n",
+ hdr->type);
goto out;
+ }
/* Process the packet */
ret = nrh->handler(nr);
+ if (ret)
+ netdev_err(ndp->ndev.dev,
+ "NCSI: Handler for packet type 0x%x returned %d\n",
+ hdr->type, ret);
out:
ncsi_free_request(nr);
return ret;
--
2.14.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH v2 2/2] net/ncsi: Query channel parameters during configuration
2017-11-08 0:35 [PATCH v2 0/2] Improve NCSI driver logging Samuel Mendoza-Jonas
2017-11-08 0:35 ` [PATCH v2 1/2] net/ncsi: General state debugging Samuel Mendoza-Jonas
@ 2017-11-08 0:35 ` Samuel Mendoza-Jonas
1 sibling, 0 replies; 3+ messages in thread
From: Samuel Mendoza-Jonas @ 2017-11-08 0:35 UTC (permalink / raw)
To: openbmc; +Cc: Samuel Mendoza-Jonas
Send a Get-Parameters command during configuration to ensure the remote
channel configuration reflects what we expect.
Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
---
net/ncsi/internal.h | 1 +
net/ncsi/ncsi-manage.c | 4 ++++
net/ncsi/ncsi-rsp.c | 23 +++++++++++++++++++++++
3 files changed, 28 insertions(+)
diff --git a/net/ncsi/internal.h b/net/ncsi/internal.h
index d30f7bd741d0..d2ccc9a6ced1 100644
--- a/net/ncsi/internal.h
+++ b/net/ncsi/internal.h
@@ -248,6 +248,7 @@ enum {
ncsi_dev_state_config_ec,
ncsi_dev_state_config_ae,
ncsi_dev_state_config_gls,
+ ncsi_dev_state_config_gp,
ncsi_dev_state_config_done,
ncsi_dev_state_suspend_select = 0x0401,
ncsi_dev_state_suspend_gls,
diff --git a/net/ncsi/ncsi-manage.c b/net/ncsi/ncsi-manage.c
index 97b76f26bde7..faab04625ccb 100644
--- a/net/ncsi/ncsi-manage.c
+++ b/net/ncsi/ncsi-manage.c
@@ -807,6 +807,7 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp)
case ncsi_dev_state_config_ec:
case ncsi_dev_state_config_ae:
case ncsi_dev_state_config_gls:
+ case ncsi_dev_state_config_gp:
ndp->pending_req_num = 1;
nca.package = np->id;
@@ -884,6 +885,9 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp)
nd->state = ncsi_dev_state_config_gls;
} else if (nd->state == ncsi_dev_state_config_gls) {
nca.type = NCSI_PKT_CMD_GLS;
+ nd->state = ncsi_dev_state_config_gp;
+ } else if (nd->state == ncsi_dev_state_config_gp) {
+ nca.type = NCSI_PKT_CMD_GP;
nd->state = ncsi_dev_state_config_done;
}
diff --git a/net/ncsi/ncsi-rsp.c b/net/ncsi/ncsi-rsp.c
index 58186c4102f0..a7289c2d3870 100644
--- a/net/ncsi/ncsi-rsp.c
+++ b/net/ncsi/ncsi-rsp.c
@@ -724,6 +724,17 @@ static int ncsi_rsp_handler_gp(struct ncsi_request *nr)
if (!nc)
return -ENODEV;
+ netdev_printk(KERN_DEBUG, ndp->ndev.dev,
+ "NCSI: Channel %u Parameters:\n", nc->id);
+ netdev_printk(KERN_DEBUG, ndp->ndev.dev, "NCSI: Channel %s\n",
+ ntohl(rsp->valid_modes) & 0x2 ? "enabled" : "disabled");
+ netdev_printk(KERN_DEBUG, ndp->ndev.dev, "NCSI: BPF %s\n",
+ ntohl(rsp->valid_modes) & 0x1 ? "enabled" : "disabled");
+ netdev_printk(KERN_DEBUG, ndp->ndev.dev, "NCSI: TX %s\n",
+ ntohl(rsp->valid_modes) & 0x4 ? "enabled" : "disabled");
+ netdev_printk(KERN_DEBUG, ndp->ndev.dev, "NCSI: MPF %s\n",
+ ntohl(rsp->valid_modes) & 0x8 ? "enabled" : "disabled");
+
/* Modes with explicit enabled indications */
if (ntohl(rsp->valid_modes) & 0x1) { /* BC filter mode */
nc->modes[NCSI_MODE_BC].enable = 1;
@@ -746,6 +757,18 @@ static int ncsi_rsp_handler_gp(struct ncsi_request *nr)
nc->modes[NCSI_MODE_AEN].enable = 1;
nc->modes[NCSI_MODE_AEN].data[0] = ntohl(rsp->aen_mode);
+ netdev_printk(KERN_DEBUG, ndp->ndev.dev, "NCSI: link settings %08x\n",
+ ntohl(rsp->link_mode));
+ netdev_printk(KERN_DEBUG, ndp->ndev.dev,
+ "NCSI: MAC address count %08x\n",
+ rsp->mac_cnt);
+ netdev_printk(KERN_DEBUG, ndp->ndev.dev, "NCSI: MAC address 1 %s\n",
+ rsp->mac_enable & 0x1 ? "enabled" : "disabled");
+ netdev_printk(KERN_DEBUG, ndp->ndev.dev,
+ "NCSI: MAC address 1 %02x:%02x:%02x:%02x:%02x:%02x\n",
+ rsp->mac[0], rsp->mac[1], rsp->mac[2],
+ rsp->mac[3], rsp->mac[4], rsp->mac[5]);
+
/* MAC addresses filter table */
pdata = (unsigned char *)rsp + 48;
enable = rsp->mac_enable;
--
2.14.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-11-08 0:35 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-08 0:35 [PATCH v2 0/2] Improve NCSI driver logging Samuel Mendoza-Jonas
2017-11-08 0:35 ` [PATCH v2 1/2] net/ncsi: General state debugging Samuel Mendoza-Jonas
2017-11-08 0:35 ` [PATCH v2 2/2] net/ncsi: Query channel parameters during configuration Samuel Mendoza-Jonas
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.