root/drivers/scsi/snic/vnic_cq_fw.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. vnic_cq_fw_service

   1 /*
   2  * Copyright 2014 Cisco Systems, Inc.  All rights reserved.
   3  *
   4  * This program is free software; you may redistribute it and/or modify
   5  * it under the terms of the GNU General Public License as published by
   6  * the Free Software Foundation; version 2 of the License.
   7  *
   8  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
   9  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  10  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  11  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  12  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  13  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  14  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  15  * SOFTWARE.
  16  */
  17 
  18 #ifndef _VNIC_CQ_FW_H_
  19 #define _VNIC_CQ_FW_H_
  20 
  21 #include "snic_fwint.h"
  22 
  23 static inline unsigned int
  24 vnic_cq_fw_service(struct vnic_cq *cq,
  25                    int (*q_service)(struct vnic_dev *vdev,
  26                                     unsigned int index,
  27                                     struct snic_fw_req *desc),
  28                    unsigned int work_to_do)
  29 
  30 {
  31         struct snic_fw_req *desc;
  32         unsigned int work_done = 0;
  33         u8 color;
  34 
  35         desc = (struct snic_fw_req *)((u8 *)cq->ring.descs +
  36                 cq->ring.desc_size * cq->to_clean);
  37         snic_color_dec(desc, &color);
  38 
  39         while (color != cq->last_color) {
  40 
  41                 if ((*q_service)(cq->vdev, cq->index, desc))
  42                         break;
  43 
  44                 cq->to_clean++;
  45                 if (cq->to_clean == cq->ring.desc_count) {
  46                         cq->to_clean = 0;
  47                         cq->last_color = cq->last_color ? 0 : 1;
  48                 }
  49 
  50                 desc = (struct snic_fw_req *)((u8 *)cq->ring.descs +
  51                         cq->ring.desc_size * cq->to_clean);
  52                 snic_color_dec(desc, &color);
  53 
  54                 work_done++;
  55                 if (work_done >= work_to_do)
  56                         break;
  57         }
  58 
  59         return work_done;
  60 }
  61 
  62 #endif /* _VNIC_CQ_FW_H_ */

/* [<][>][^][v][top][bottom][index][help] */