101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman/*
229046f9b1e36f6e3332ce2d8e366005fd177b37aVasanthy Kolluri * Copyright 2008-2010 Cisco Systems, Inc.  All rights reserved.
301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman *
501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * This program is free software; you may redistribute it and/or modify
601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * it under the terms of the GNU General Public License as published by
701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * the Free Software Foundation; version 2 of the License.
801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman *
901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
1301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
1401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
1501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * SOFTWARE.
1701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman *
1801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman */
1901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
2001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include <linux/kernel.h>
2101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include <linux/errno.h>
2201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include <linux/types.h>
2301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include <linux/pci.h>
2401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include <linux/delay.h>
2501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
2601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include "vnic_dev.h"
2701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#include "vnic_intr.h"
2801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
2901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldmanvoid vnic_intr_free(struct vnic_intr *intr)
3001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman{
3101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	intr->ctrl = NULL;
3201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman}
3301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
3401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldmanint vnic_intr_alloc(struct vnic_dev *vdev, struct vnic_intr *intr,
3501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	unsigned int index)
3601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman{
3701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	intr->index = index;
3801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	intr->vdev = vdev;
3901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
4001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	intr->ctrl = vnic_dev_get_res(vdev, RES_TYPE_INTR_CTRL, index);
4101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	if (!intr->ctrl) {
42a7a79debcca02fbf908c0abed8d8fb25d0e51b48Vasanthy Kolluri		pr_err("Failed to hook INTR[%d].ctrl resource\n", index);
4301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman		return -EINVAL;
4401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	}
4501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
4601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	return 0;
4701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman}
4801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
49ea7ea65a3b37bf207d5c352ac6254506b3dc3901Vasanthy Kollurivoid vnic_intr_init(struct vnic_intr *intr, u32 coalescing_timer,
5001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	unsigned int coalescing_type, unsigned int mask_on_assertion)
5101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman{
527c8445991172cc17eaca9f7de0a300c02caaa49dScott Feldman	vnic_intr_coalescing_timer_set(intr, coalescing_timer);
5301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	iowrite32(coalescing_type, &intr->ctrl->coalescing_type);
5401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	iowrite32(mask_on_assertion, &intr->ctrl->mask_on_assertion);
5501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	iowrite32(0, &intr->ctrl->int_credits);
5601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman}
5701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman
587c8445991172cc17eaca9f7de0a300c02caaa49dScott Feldmanvoid vnic_intr_coalescing_timer_set(struct vnic_intr *intr,
59ea7ea65a3b37bf207d5c352ac6254506b3dc3901Vasanthy Kolluri	u32 coalescing_timer)
607c8445991172cc17eaca9f7de0a300c02caaa49dScott Feldman{
61ea7ea65a3b37bf207d5c352ac6254506b3dc3901Vasanthy Kolluri	iowrite32(vnic_dev_intr_coal_timer_usec_to_hw(intr->vdev,
62ea7ea65a3b37bf207d5c352ac6254506b3dc3901Vasanthy Kolluri		coalescing_timer), &intr->ctrl->coalescing_timer);
637c8445991172cc17eaca9f7de0a300c02caaa49dScott Feldman}
647c8445991172cc17eaca9f7de0a300c02caaa49dScott Feldman
6501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldmanvoid vnic_intr_clean(struct vnic_intr *intr)
6601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman{
6701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman	iowrite32(0, &intr->ctrl->int_credits);
6801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman}
69