15df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar/* 25df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * Copyright 2008 Cisco Systems, Inc. All rights reserved. 35df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * Copyright 2007 Nuova Systems, Inc. All rights reserved. 45df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * 55df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * This program is free software; you may redistribute it and/or modify 65df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * it under the terms of the GNU General Public License as published by 75df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * the Free Software Foundation; version 2 of the License. 85df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * 95df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 105df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 115df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 125df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 135df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 145df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 155df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 165df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar * SOFTWARE. 175df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar */ 185df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar 195df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar#include <linux/kernel.h> 205df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar#include <linux/errno.h> 215df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar#include <linux/types.h> 225df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar#include <linux/pci.h> 235df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar#include <linux/delay.h> 245df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar#include "vnic_dev.h" 255df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar#include "vnic_intr.h" 265df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar 275df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekarvoid vnic_intr_free(struct vnic_intr *intr) 285df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar{ 295df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar intr->ctrl = NULL; 305df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar} 315df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar 325df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekarint vnic_intr_alloc(struct vnic_dev *vdev, struct vnic_intr *intr, 335df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar unsigned int index) 345df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar{ 355df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar intr->index = index; 365df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar intr->vdev = vdev; 375df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar 385df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar intr->ctrl = vnic_dev_get_res(vdev, RES_TYPE_INTR_CTRL, index); 395df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar if (!intr->ctrl) { 405df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar printk(KERN_ERR "Failed to hook INTR[%d].ctrl resource\n", 415df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar index); 425df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar return -EINVAL; 435df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar } 445df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar 455df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar return 0; 465df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar} 475df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar 485df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekarvoid vnic_intr_init(struct vnic_intr *intr, unsigned int coalescing_timer, 495df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar unsigned int coalescing_type, unsigned int mask_on_assertion) 505df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar{ 515df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar iowrite32(coalescing_timer, &intr->ctrl->coalescing_timer); 525df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar iowrite32(coalescing_type, &intr->ctrl->coalescing_type); 535df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar iowrite32(mask_on_assertion, &intr->ctrl->mask_on_assertion); 545df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar iowrite32(0, &intr->ctrl->int_credits); 555df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar} 565df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar 575df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekarvoid vnic_intr_clean(struct vnic_intr *intr) 585df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar{ 595df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar iowrite32(0, &intr->ctrl->int_credits); 605df6d737dd4b0fe9eccf943abb3677cfea05a6c4Abhijeet Joglekar} 61