staging: unisys: Process more than one response per check
authorDavid Kershner <david.kershner@unisys.com>
Fri, 24 Jul 2015 16:00:21 +0000 (12:00 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 24 Jul 2015 20:39:57 +0000 (13:39 -0700)
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.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/unisys/visornic/visornic_main.c

index 4d49937d3856e3f82ed59dd55109a127fad0b780..9d10b85ac7eb27342508292ffdaf276e6877817e 100644 (file)
@@ -1629,93 +1629,95 @@ drain_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  */
 }
 
 /**