From: David Kershner <david.kersh...@unisys.com>

When s-Par is in polling mode it checks every 2 ms to see if there is
a response from the IO service partition in the queue. Currently it
just reads one entry per 2 ms, this needs to be changed so it drains
the queue on each check.

Signed-off-by: David Kershner <david.kersh...@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.ro...@unisys.com>
---
 drivers/staging/unisys/visornic/visornic_main.c | 164 ++++++++++++------------
 1 file changed, 83 insertions(+), 81 deletions(-)

diff --git a/drivers/staging/unisys/visornic/visornic_main.c 
b/drivers/staging/unisys/visornic/visornic_main.c
index 6ce3fc2..8d600fa 100644
--- a/drivers/staging/unisys/visornic/visornic_main.c
+++ b/drivers/staging/unisys/visornic/visornic_main.c
@@ -1617,93 +1617,95 @@ service_resp_queue(struct uiscmdrsp *cmdrsp, struct 
visornic_devdata *devdata)
 
        /* TODO: CLIENT ACQUIRE -- Don't really need this at the
         * moment */
-       if (!visorchannel_signalremove(devdata->dev->visorchannel,
-                                      IOCHAN_FROM_IOPART,
-                                      cmdrsp))
-               return; /* queue empty */
-
-       switch (cmdrsp->net.type) {
-       case NET_RCV:
-               devdata->chstat.got_rcv++;
-               /* process incoming packet */
-               visornic_rx(cmdrsp);
-               break;
-       case NET_XMIT_DONE:
-               spin_lock_irqsave(&devdata->priv_lock, flags);
-               devdata->chstat.got_xmit_done++;
-               if (cmdrsp->net.xmtdone.xmt_done_result)
-                       devdata->chstat.xmit_fail++;
-               /* only call queue wake if we stopped it */
-               netdev = ((struct sk_buff *)cmdrsp->net.buf)->dev;
-               /* ASSERT netdev == vnicinfo->netdev; */
-               if ((netdev == devdata->netdev) &&
-                   netif_queue_stopped(netdev)) {
-                       /* check to see if we have crossed
-                        * the lower watermark for
-                        * netif_wake_queue()
-                        */
-                       if (((devdata->chstat.sent_xmit >=
-                           devdata->chstat.got_xmit_done) &&
-                           (devdata->chstat.sent_xmit -
-                           devdata->chstat.got_xmit_done <=
-                           devdata->lower_threshold_net_xmits)) ||
-                           ((devdata->chstat.sent_xmit <
-                           devdata->chstat.got_xmit_done) &&
-                           (ULONG_MAX - devdata->chstat.got_xmit_done
-                           + devdata->chstat.sent_xmit <=
-                           devdata->lower_threshold_net_xmits))) {
-                               /* enough NET_XMITs completed
-                                * so can restart netif queue
+       for (;;) {
+               if (!visorchannel_signalremove(devdata->dev->visorchannel,
+                                              IOCHAN_FROM_IOPART,
+                                              cmdrsp))
+                       break; /* queue empty */
+
+               switch (cmdrsp->net.type) {
+               case NET_RCV:
+                       devdata->chstat.got_rcv++;
+                       /* process incoming packet */
+                       visornic_rx(cmdrsp);
+                       break;
+               case NET_XMIT_DONE:
+                       spin_lock_irqsave(&devdata->priv_lock, flags);
+                       devdata->chstat.got_xmit_done++;
+                       if (cmdrsp->net.xmtdone.xmt_done_result)
+                               devdata->chstat.xmit_fail++;
+                       /* only call queue wake if we stopped it */
+                       netdev = ((struct sk_buff *)cmdrsp->net.buf)->dev;
+                       /* ASSERT netdev == vnicinfo->netdev; */
+                       if ((netdev == devdata->netdev) &&
+                           netif_queue_stopped(netdev)) {
+                               /* check to see if we have crossed
+                                * the lower watermark for
+                                * netif_wake_queue()
                                 */
-                               netif_wake_queue(netdev);
-                               devdata->flow_control_lower_hits++;
+                               if (((devdata->chstat.sent_xmit >=
+                                   devdata->chstat.got_xmit_done) &&
+                                   (devdata->chstat.sent_xmit -
+                                   devdata->chstat.got_xmit_done <=
+                                   devdata->lower_threshold_net_xmits)) ||
+                                   ((devdata->chstat.sent_xmit <
+                                   devdata->chstat.got_xmit_done) &&
+                                   (ULONG_MAX - devdata->chstat.got_xmit_done
+                                   + devdata->chstat.sent_xmit <=
+                                   devdata->lower_threshold_net_xmits))) {
+                                       /* enough NET_XMITs completed
+                                        * so can restart netif queue
+                                        */
+                                       netif_wake_queue(netdev);
+                                       devdata->flow_control_lower_hits++;
+                               }
                        }
-               }
-               skb_unlink(cmdrsp->net.buf, &devdata->xmitbufhead);
-               spin_unlock_irqrestore(&devdata->priv_lock, flags);
-               kfree_skb(cmdrsp->net.buf);
-               break;
-       case NET_RCV_ENBDIS_ACK:
-               devdata->chstat.got_enbdisack++;
-               netdev = (struct net_device *)
-               cmdrsp->net.enbdis.context;
-               spin_lock_irqsave(&devdata->priv_lock, flags);
-               devdata->enab_dis_acked = 1;
-               spin_unlock_irqrestore(&devdata->priv_lock, flags);
-
-               if (kthread_should_stop())
+                       skb_unlink(cmdrsp->net.buf, &devdata->xmitbufhead);
+                       spin_unlock_irqrestore(&devdata->priv_lock, flags);
+                       kfree_skb(cmdrsp->net.buf);
                        break;
-               if (devdata->server_down &&
-                   devdata->server_change_state) {
-                       /* Inform Linux that the link is up */
-                       devdata->server_down = false;
-                       devdata->server_change_state = false;
-                       netif_wake_queue(netdev);
-                       netif_carrier_on(netdev);
-               }
-               break;
-       case NET_CONNECT_STATUS:
-               netdev = devdata->netdev;
-               if (cmdrsp->net.enbdis.enable == 1) {
-                       spin_lock_irqsave(&devdata->priv_lock, flags);
-                       devdata->enabled = cmdrsp->net.enbdis.enable;
-                       spin_unlock_irqrestore(&devdata->priv_lock,
-                                              flags);
-                       netif_wake_queue(netdev);
-                       netif_carrier_on(netdev);
-               } else {
-                       netif_stop_queue(netdev);
-                       netif_carrier_off(netdev);
+               case NET_RCV_ENBDIS_ACK:
+                       devdata->chstat.got_enbdisack++;
+                       netdev = (struct net_device *)
+                       cmdrsp->net.enbdis.context;
                        spin_lock_irqsave(&devdata->priv_lock, flags);
-                       devdata->enabled = cmdrsp->net.enbdis.enable;
-                       spin_unlock_irqrestore(&devdata->priv_lock,
-                                              flags);
+                       devdata->enab_dis_acked = 1;
+                       spin_unlock_irqrestore(&devdata->priv_lock, flags);
+
+                       if (kthread_should_stop())
+                               break;
+                       if (devdata->server_down &&
+                           devdata->server_change_state) {
+                               /* Inform Linux that the link is up */
+                               devdata->server_down = false;
+                               devdata->server_change_state = false;
+                               netif_wake_queue(netdev);
+                               netif_carrier_on(netdev);
+                       }
+                       break;
+               case NET_CONNECT_STATUS:
+                       netdev = devdata->netdev;
+                       if (cmdrsp->net.enbdis.enable == 1) {
+                               spin_lock_irqsave(&devdata->priv_lock, flags);
+                               devdata->enabled = cmdrsp->net.enbdis.enable;
+                               spin_unlock_irqrestore(&devdata->priv_lock,
+                                                      flags);
+                               netif_wake_queue(netdev);
+                               netif_carrier_on(netdev);
+                       } else {
+                               netif_stop_queue(netdev);
+                               netif_carrier_off(netdev);
+                               spin_lock_irqsave(&devdata->priv_lock, flags);
+                               devdata->enabled = cmdrsp->net.enbdis.enable;
+                               spin_unlock_irqrestore(&devdata->priv_lock,
+                                                      flags);
+                       }
+                       break;
+               default:
+                       break;
                }
-               break;
-       default:
-               break;
+               /* cmdrsp is now available for reuse  */
        }
-       /* cmdrsp is now available for reuse  */
 }
 
 /**
-- 
2.1.4

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to