forked from Minki/linux
ea7ea65a3b
enic driver and the underlying hardware use different units for representing the interrupt coalesce timer. Driver converts the interrupt coalesce timer in usec to hardware cycles while setting the relevant hardware registers. The conversion factor can be different for each of the adapter hardware types. So it is dynamically learnt from the adapter firmware using the devcmd CMD_INTR_COAL_CONVERT. This allows the driver to configure the hardware interrupt coalesce timers in a platform independent way. Signed-off-by: Danny Guo <dannguo@cisco.com> Signed-off-by: Vasanthy Kolluri <vkolluri@cisco.com> Signed-off-by: Roopa Prabhu <roprabhu@cisco.com> Signed-off-by: David Wang <dwang2@cisco.com> Signed-off-by: David S. Miller <davem@conan.davemloft.net>
69 lines
2.0 KiB
C
69 lines
2.0 KiB
C
/*
|
|
* Copyright 2008-2010 Cisco Systems, Inc. All rights reserved.
|
|
* Copyright 2007 Nuova Systems, Inc. All rights reserved.
|
|
*
|
|
* This program is free software; you may redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; version 2 of the License.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/types.h>
|
|
#include <linux/pci.h>
|
|
#include <linux/delay.h>
|
|
|
|
#include "vnic_dev.h"
|
|
#include "vnic_intr.h"
|
|
|
|
void vnic_intr_free(struct vnic_intr *intr)
|
|
{
|
|
intr->ctrl = NULL;
|
|
}
|
|
|
|
int vnic_intr_alloc(struct vnic_dev *vdev, struct vnic_intr *intr,
|
|
unsigned int index)
|
|
{
|
|
intr->index = index;
|
|
intr->vdev = vdev;
|
|
|
|
intr->ctrl = vnic_dev_get_res(vdev, RES_TYPE_INTR_CTRL, index);
|
|
if (!intr->ctrl) {
|
|
pr_err("Failed to hook INTR[%d].ctrl resource\n", index);
|
|
return -EINVAL;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void vnic_intr_init(struct vnic_intr *intr, u32 coalescing_timer,
|
|
unsigned int coalescing_type, unsigned int mask_on_assertion)
|
|
{
|
|
vnic_intr_coalescing_timer_set(intr, coalescing_timer);
|
|
iowrite32(coalescing_type, &intr->ctrl->coalescing_type);
|
|
iowrite32(mask_on_assertion, &intr->ctrl->mask_on_assertion);
|
|
iowrite32(0, &intr->ctrl->int_credits);
|
|
}
|
|
|
|
void vnic_intr_coalescing_timer_set(struct vnic_intr *intr,
|
|
u32 coalescing_timer)
|
|
{
|
|
iowrite32(vnic_dev_intr_coal_timer_usec_to_hw(intr->vdev,
|
|
coalescing_timer), &intr->ctrl->coalescing_timer);
|
|
}
|
|
|
|
void vnic_intr_clean(struct vnic_intr *intr)
|
|
{
|
|
iowrite32(0, &intr->ctrl->int_credits);
|
|
}
|