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_ */ 63