Commit 00748b0c authored by Tim Sell's avatar Tim Sell Committed by Greg Kroah-Hartman

staging: unisys: add error messages to visornic

Add error message to genuine rare error paths, and debug messages
to enable relatively non-verbose tracing of code paths

You can enable debug messages by including this on the kernel command line:

    visornic.dyndbg=+p

or by this from the command line:

    echo "module visornic +p" > <debugfs>/dynamic_debug/control

Refer to Documentation/dynamic-debug-howto.txt for more details.

In addition to the new debug and error messages, a message like the
following will be logged every time a visornic device is probed, which
will enable you to map back-and-forth between visorbus device names
(e.g., "vbus2:dev0") and netdev names (e.g., "eth0"):

    visornic vbus2:dev0: visornic_probe success netdev=eth0

With this patch and visornic debugging enabled, you should expect to see
messages like the following in the most-common scenarios:

* driver loaded:

      visornic_init

* device probed:

      visornic vbus2:dev0: visornic_probe
      visor_thread_start
      visor_thread_start success

* network interface configured (ifconfig):

      net eth0: visornic_open
      net eth0: visornic_enable_with_timeout
      net eth0: visornic_enable_with_timeout success
      net eth0: visornic_open success
Signed-off-by: default avatarTim Sell <Timothy.Sell@unisys.com>
Signed-off-by: default avatarBenjamin Romer <benjamin.romer@unisys.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 46dfa3d8
...@@ -299,6 +299,8 @@ static int visor_thread_start(struct visor_thread_info *thrinfo, ...@@ -299,6 +299,8 @@ static int visor_thread_start(struct visor_thread_info *thrinfo,
init_completion(&thrinfo->has_stopped); init_completion(&thrinfo->has_stopped);
thrinfo->task = kthread_run(threadfn, thrcontext, name); thrinfo->task = kthread_run(threadfn, thrcontext, name);
if (IS_ERR(thrinfo->task)) { if (IS_ERR(thrinfo->task)) {
pr_debug("%s failed (%ld)\n",
__func__, PTR_ERR(thrinfo->task));
thrinfo->id = 0; thrinfo->id = 0;
return -EINVAL; return -EINVAL;
} }
...@@ -572,6 +574,8 @@ visornic_serverdown(struct visornic_devdata *devdata, ...@@ -572,6 +574,8 @@ visornic_serverdown(struct visornic_devdata *devdata,
queue_work(visornic_serverdown_workqueue, queue_work(visornic_serverdown_workqueue,
&devdata->serverdown_completion); &devdata->serverdown_completion);
} else if (devdata->server_change_state) { } else if (devdata->server_change_state) {
dev_dbg(&devdata->dev->device, "%s changing state\n",
__func__);
return -EINVAL; return -EINVAL;
} }
return 0; return 0;
...@@ -708,6 +712,8 @@ visornic_disable_with_timeout(struct net_device *netdev, const int timeout) ...@@ -708,6 +712,8 @@ visornic_disable_with_timeout(struct net_device *netdev, const int timeout)
break; break;
if (devdata->server_down || devdata->server_change_state) { if (devdata->server_down || devdata->server_change_state) {
spin_unlock_irqrestore(&devdata->priv_lock, flags); spin_unlock_irqrestore(&devdata->priv_lock, flags);
dev_dbg(&netdev->dev, "%s server went away\n",
__func__);
return -EIO; return -EIO;
} }
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
...@@ -821,8 +827,11 @@ visornic_enable_with_timeout(struct net_device *netdev, const int timeout) ...@@ -821,8 +827,11 @@ visornic_enable_with_timeout(struct net_device *netdev, const int timeout)
* gets a disable. * gets a disable.
*/ */
i = init_rcv_bufs(netdev, devdata); i = init_rcv_bufs(netdev, devdata);
if (i < 0) if (i < 0) {
dev_err(&netdev->dev,
"%s failed to init rcv bufs (%d)\n", __func__, i);
return i; return i;
}
spin_lock_irqsave(&devdata->priv_lock, flags); spin_lock_irqsave(&devdata->priv_lock, flags);
devdata->enabled = 1; devdata->enabled = 1;
...@@ -845,6 +854,8 @@ visornic_enable_with_timeout(struct net_device *netdev, const int timeout) ...@@ -845,6 +854,8 @@ visornic_enable_with_timeout(struct net_device *netdev, const int timeout)
break; break;
if (devdata->server_down || devdata->server_change_state) { if (devdata->server_down || devdata->server_change_state) {
spin_unlock_irqrestore(&devdata->priv_lock, flags); spin_unlock_irqrestore(&devdata->priv_lock, flags);
dev_dbg(&netdev->dev, "%s server went away\n",
__func__);
return -EIO; return -EIO;
} }
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
...@@ -855,8 +866,10 @@ visornic_enable_with_timeout(struct net_device *netdev, const int timeout) ...@@ -855,8 +866,10 @@ visornic_enable_with_timeout(struct net_device *netdev, const int timeout)
spin_unlock_irqrestore(&devdata->priv_lock, flags); spin_unlock_irqrestore(&devdata->priv_lock, flags);
if (!devdata->enab_dis_acked) if (!devdata->enab_dis_acked) {
dev_err(&netdev->dev, "%s missing ACK\n", __func__);
return -EIO; return -EIO;
}
/* find an open slot in the array to save off VisorNic references /* find an open slot in the array to save off VisorNic references
* for debug * for debug
...@@ -968,6 +981,8 @@ visornic_xmit(struct sk_buff *skb, struct net_device *netdev) ...@@ -968,6 +981,8 @@ visornic_xmit(struct sk_buff *skb, struct net_device *netdev)
devdata->server_change_state) { devdata->server_change_state) {
spin_unlock_irqrestore(&devdata->priv_lock, flags); spin_unlock_irqrestore(&devdata->priv_lock, flags);
devdata->busy_cnt++; devdata->busy_cnt++;
dev_dbg(&netdev->dev,
"%s busy - queue stopped\n", __func__);
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;
} }
...@@ -986,6 +1001,9 @@ visornic_xmit(struct sk_buff *skb, struct net_device *netdev) ...@@ -986,6 +1001,9 @@ visornic_xmit(struct sk_buff *skb, struct net_device *netdev)
if (firstfraglen < ETH_HEADER_SIZE) { if (firstfraglen < ETH_HEADER_SIZE) {
spin_unlock_irqrestore(&devdata->priv_lock, flags); spin_unlock_irqrestore(&devdata->priv_lock, flags);
devdata->busy_cnt++; devdata->busy_cnt++;
dev_err(&netdev->dev,
"%s busy - first frag too small (%d)\n",
__func__, firstfraglen);
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;
} }
...@@ -1025,6 +1043,9 @@ visornic_xmit(struct sk_buff *skb, struct net_device *netdev) ...@@ -1025,6 +1043,9 @@ visornic_xmit(struct sk_buff *skb, struct net_device *netdev)
netif_stop_queue(netdev); netif_stop_queue(netdev);
spin_unlock_irqrestore(&devdata->priv_lock, flags); spin_unlock_irqrestore(&devdata->priv_lock, flags);
devdata->busy_cnt++; devdata->busy_cnt++;
dev_dbg(&netdev->dev,
"%s busy - waiting for iovm to catch up\n",
__func__);
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;
} }
if (devdata->queuefullmsg_logged) if (devdata->queuefullmsg_logged)
...@@ -1065,6 +1086,8 @@ visornic_xmit(struct sk_buff *skb, struct net_device *netdev) ...@@ -1065,6 +1086,8 @@ visornic_xmit(struct sk_buff *skb, struct net_device *netdev)
if (cmdrsp->net.xmt.num_frags == -1) { if (cmdrsp->net.xmt.num_frags == -1) {
spin_unlock_irqrestore(&devdata->priv_lock, flags); spin_unlock_irqrestore(&devdata->priv_lock, flags);
devdata->busy_cnt++; devdata->busy_cnt++;
dev_err(&netdev->dev,
"%s busy - copy frags failed\n", __func__);
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;
} }
...@@ -1073,6 +1096,8 @@ visornic_xmit(struct sk_buff *skb, struct net_device *netdev) ...@@ -1073,6 +1096,8 @@ visornic_xmit(struct sk_buff *skb, struct net_device *netdev)
netif_stop_queue(netdev); netif_stop_queue(netdev);
spin_unlock_irqrestore(&devdata->priv_lock, flags); spin_unlock_irqrestore(&devdata->priv_lock, flags);
devdata->busy_cnt++; devdata->busy_cnt++;
dev_dbg(&netdev->dev,
"%s busy - signalinsert failed\n", __func__);
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;
} }
...@@ -1105,6 +1130,9 @@ visornic_xmit(struct sk_buff *skb, struct net_device *netdev) ...@@ -1105,6 +1130,9 @@ visornic_xmit(struct sk_buff *skb, struct net_device *netdev)
* netif_wake_queue() after lower * netif_wake_queue() after lower
* threshold * threshold
*/ */
dev_dbg(&netdev->dev,
"%s busy - invoking iovm flow control\n",
__func__);
devdata->flow_control_upper_hits++; devdata->flow_control_upper_hits++;
} }
spin_unlock_irqrestore(&devdata->priv_lock, flags); spin_unlock_irqrestore(&devdata->priv_lock, flags);
...@@ -1211,6 +1239,8 @@ visornic_xmit_timeout(struct net_device *netdev) ...@@ -1211,6 +1239,8 @@ visornic_xmit_timeout(struct net_device *netdev)
/* Ensure that a ServerDown message hasn't been received */ /* Ensure that a ServerDown message hasn't been received */
if (!devdata->enabled || if (!devdata->enabled ||
(devdata->server_down && !devdata->server_change_state)) { (devdata->server_down && !devdata->server_change_state)) {
dev_dbg(&netdev->dev, "%s no processing\n",
__func__);
spin_unlock_irqrestore(&devdata->priv_lock, flags); spin_unlock_irqrestore(&devdata->priv_lock, flags);
return; return;
} }
...@@ -1808,8 +1838,11 @@ static int visornic_probe(struct visor_device *dev) ...@@ -1808,8 +1838,11 @@ static int visornic_probe(struct visor_device *dev)
u64 features; u64 features;
netdev = alloc_etherdev(sizeof(struct visornic_devdata)); netdev = alloc_etherdev(sizeof(struct visornic_devdata));
if (!netdev) if (!netdev) {
dev_err(&dev->device,
"%s alloc_etherdev failed\n", __func__);
return -ENOMEM; return -ENOMEM;
}
netdev->netdev_ops = &visornic_dev_ops; netdev->netdev_ops = &visornic_dev_ops;
netdev->watchdog_timeo = (5 * HZ); netdev->watchdog_timeo = (5 * HZ);
...@@ -1821,11 +1854,17 @@ static int visornic_probe(struct visor_device *dev) ...@@ -1821,11 +1854,17 @@ static int visornic_probe(struct visor_device *dev)
vnic.macaddr); vnic.macaddr);
err = visorbus_read_channel(dev, channel_offset, netdev->dev_addr, err = visorbus_read_channel(dev, channel_offset, netdev->dev_addr,
ETH_ALEN); ETH_ALEN);
if (err < 0) if (err < 0) {
dev_err(&dev->device,
"%s failed to get mac addr from chan (%d)\n",
__func__, err);
goto cleanup_netdev; goto cleanup_netdev;
}
devdata = devdata_initialize(netdev_priv(netdev), dev); devdata = devdata_initialize(netdev_priv(netdev), dev);
if (!devdata) { if (!devdata) {
dev_err(&dev->device,
"%s devdata_initialize failed\n", __func__);
err = -ENOMEM; err = -ENOMEM;
goto cleanup_netdev; goto cleanup_netdev;
} }
...@@ -1842,8 +1881,12 @@ static int visornic_probe(struct visor_device *dev) ...@@ -1842,8 +1881,12 @@ static int visornic_probe(struct visor_device *dev)
vnic.num_rcv_bufs); vnic.num_rcv_bufs);
err = visorbus_read_channel(dev, channel_offset, err = visorbus_read_channel(dev, channel_offset,
&devdata->num_rcv_bufs, 4); &devdata->num_rcv_bufs, 4);
if (err) if (err) {
dev_err(&dev->device,
"%s failed to get #rcv bufs from chan (%d)\n",
__func__, err);
goto cleanup_netdev; goto cleanup_netdev;
}
devdata->rcvbuf = kzalloc(sizeof(struct sk_buff *) * devdata->rcvbuf = kzalloc(sizeof(struct sk_buff *) *
devdata->num_rcv_bufs, GFP_KERNEL); devdata->num_rcv_bufs, GFP_KERNEL);
...@@ -1884,38 +1927,58 @@ static int visornic_probe(struct visor_device *dev) ...@@ -1884,38 +1927,58 @@ static int visornic_probe(struct visor_device *dev)
channel_offset = offsetof(struct spar_io_channel_protocol, channel_offset = offsetof(struct spar_io_channel_protocol,
vnic.mtu); vnic.mtu);
err = visorbus_read_channel(dev, channel_offset, &netdev->mtu, 4); err = visorbus_read_channel(dev, channel_offset, &netdev->mtu, 4);
if (err) if (err) {
dev_err(&dev->device,
"%s failed to get mtu from chan (%d)\n",
__func__, err);
goto cleanup_xmit_cmdrsp; goto cleanup_xmit_cmdrsp;
}
/* TODO: Setup Interrupt information */ /* TODO: Setup Interrupt information */
/* Let's start our threads to get responses */ /* Let's start our threads to get responses */
channel_offset = offsetof(struct spar_io_channel_protocol, channel_offset = offsetof(struct spar_io_channel_protocol,
channel_header.features); channel_header.features);
err = visorbus_read_channel(dev, channel_offset, &features, 8); err = visorbus_read_channel(dev, channel_offset, &features, 8);
if (err) if (err) {
dev_err(&dev->device,
"%s failed to get features from chan (%d)\n",
__func__, err);
goto cleanup_xmit_cmdrsp; goto cleanup_xmit_cmdrsp;
}
features |= ULTRA_IO_CHANNEL_IS_POLLING; features |= ULTRA_IO_CHANNEL_IS_POLLING;
err = visorbus_write_channel(dev, channel_offset, &features, 8); err = visorbus_write_channel(dev, channel_offset, &features, 8);
if (err) if (err) {
dev_err(&dev->device,
"%s failed to set features in chan (%d)\n",
__func__, err);
goto cleanup_xmit_cmdrsp; goto cleanup_xmit_cmdrsp;
}
devdata->thread_wait_ms = 2; devdata->thread_wait_ms = 2;
visor_thread_start(&devdata->threadinfo, process_incoming_rsps, visor_thread_start(&devdata->threadinfo, process_incoming_rsps,
devdata, "vnic_incoming"); devdata, "vnic_incoming");
err = register_netdev(netdev); err = register_netdev(netdev);
if (err) if (err) {
dev_err(&dev->device,
"%s register_netdev failed (%d)\n", __func__, err);
goto cleanup_thread_stop; goto cleanup_thread_stop;
}
/* create debgug/sysfs directories */ /* create debgug/sysfs directories */
devdata->eth_debugfs_dir = debugfs_create_dir(netdev->name, devdata->eth_debugfs_dir = debugfs_create_dir(netdev->name,
visornic_debugfs_dir); visornic_debugfs_dir);
if (!devdata->eth_debugfs_dir) { if (!devdata->eth_debugfs_dir) {
dev_err(&dev->device,
"%s debugfs_create_dir %s failed\n",
__func__, netdev->name);
err = -ENOMEM; err = -ENOMEM;
goto cleanup_thread_stop; goto cleanup_thread_stop;
} }
dev_info(&dev->device, "%s success netdev=%s\n",
__func__, netdev->name);
return 0; return 0;
cleanup_thread_stop: cleanup_thread_stop:
...@@ -1963,8 +2026,10 @@ static void visornic_remove(struct visor_device *dev) ...@@ -1963,8 +2026,10 @@ static void visornic_remove(struct visor_device *dev)
{ {
struct visornic_devdata *devdata = dev_get_drvdata(&dev->device); struct visornic_devdata *devdata = dev_get_drvdata(&dev->device);
if (!devdata) if (!devdata) {
dev_err(&dev->device, "%s no devdata\n", __func__);
return; return;
}
dev_set_drvdata(&dev->device, NULL); dev_set_drvdata(&dev->device, NULL);
host_side_disappeared(devdata); host_side_disappeared(devdata);
kref_put(&devdata->kref, devdata_release); kref_put(&devdata->kref, devdata_release);
...@@ -2010,8 +2075,10 @@ static int visornic_resume(struct visor_device *dev, ...@@ -2010,8 +2075,10 @@ static int visornic_resume(struct visor_device *dev,
unsigned long flags; unsigned long flags;
devdata = dev_get_drvdata(&dev->device); devdata = dev_get_drvdata(&dev->device);
if (!devdata) if (!devdata) {
dev_err(&dev->device, "%s no devdata\n", __func__);
return -EINVAL; return -EINVAL;
}
netdev = devdata->netdev; netdev = devdata->netdev;
...@@ -2039,6 +2106,8 @@ static int visornic_resume(struct visor_device *dev, ...@@ -2039,6 +2106,8 @@ static int visornic_resume(struct visor_device *dev,
*/ */
send_enbdis(netdev, 1, devdata); send_enbdis(netdev, 1, devdata);
} else if (devdata->server_change_state) { } else if (devdata->server_change_state) {
dev_err(&dev->device, "%s server_change_state\n",
__func__);
return -EIO; return -EIO;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment