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