These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / scsi / snic / vnic_cq_fw.h
diff --git a/kernel/drivers/scsi/snic/vnic_cq_fw.h b/kernel/drivers/scsi/snic/vnic_cq_fw.h
new file mode 100644 (file)
index 0000000..c2d1bbd
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2014 Cisco Systems, Inc.  All rights reserved.
+ *
+ * This program is free software; you may redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef _VNIC_CQ_FW_H_
+#define _VNIC_CQ_FW_H_
+
+#include "snic_fwint.h"
+
+static inline unsigned int
+vnic_cq_fw_service(struct vnic_cq *cq,
+                  int (*q_service)(struct vnic_dev *vdev,
+                                   unsigned int index,
+                                   struct snic_fw_req *desc),
+                  unsigned int work_to_do)
+
+{
+       struct snic_fw_req *desc;
+       unsigned int work_done = 0;
+       u8 color;
+
+       desc = (struct snic_fw_req *)((u8 *)cq->ring.descs +
+               cq->ring.desc_size * cq->to_clean);
+       snic_color_dec(desc, &color);
+
+       while (color != cq->last_color) {
+
+               if ((*q_service)(cq->vdev, cq->index, desc))
+                       break;
+
+               cq->to_clean++;
+               if (cq->to_clean == cq->ring.desc_count) {
+                       cq->to_clean = 0;
+                       cq->last_color = cq->last_color ? 0 : 1;
+               }
+
+               desc = (struct snic_fw_req *)((u8 *)cq->ring.descs +
+                       cq->ring.desc_size * cq->to_clean);
+               snic_color_dec(desc, &color);
+
+               work_done++;
+               if (work_done >= work_to_do)
+                       break;
+       }
+
+       return work_done;
+}
+
+#endif /* _VNIC_CQ_FW_H_ */