1 /* 2 * Copyright 2008 Cisco Systems, Inc. All rights reserved. 3 * Copyright 2007 Nuova Systems, Inc. All rights reserved. 4 * 5 * This program is free software; you may redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; version 2 of the License. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 10 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 11 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 12 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 13 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 14 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 15 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 16 * SOFTWARE. 17 */ 18 #ifndef _VNIC_CQ_COPY_H_ 19 #define _VNIC_CQ_COPY_H_ 20 21 #include "fcpio.h" 22 23 static inline unsigned int vnic_cq_copy_service( 24 struct vnic_cq *cq, 25 int (*q_service)(struct vnic_dev *vdev, 26 unsigned int index, 27 struct fcpio_fw_req *desc), 28 unsigned int work_to_do) 29 30 { 31 struct fcpio_fw_req *desc; 32 unsigned int work_done = 0; 33 u8 color; 34 35 desc = (struct fcpio_fw_req *)((u8 *)cq->ring.descs + 36 cq->ring.desc_size * cq->to_clean); 37 fcpio_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 fcpio_fw_req *)((u8 *)cq->ring.descs + 51 cq->ring.desc_size * cq->to_clean); 52 fcpio_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_COPY_H_ */ 63