101f2e4eaSScott Feldman /* 229046f9bSVasanthy Kolluri * Copyright 2008-2010 Cisco Systems, Inc. All rights reserved. 301f2e4eaSScott Feldman * Copyright 2007 Nuova Systems, Inc. All rights reserved. 401f2e4eaSScott Feldman * 501f2e4eaSScott Feldman * This program is free software; you may redistribute it and/or modify 601f2e4eaSScott Feldman * it under the terms of the GNU General Public License as published by 701f2e4eaSScott Feldman * the Free Software Foundation; version 2 of the License. 801f2e4eaSScott Feldman * 901f2e4eaSScott Feldman * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 1001f2e4eaSScott Feldman * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1101f2e4eaSScott Feldman * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 1201f2e4eaSScott Feldman * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 1301f2e4eaSScott Feldman * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 1401f2e4eaSScott Feldman * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 1501f2e4eaSScott Feldman * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 1601f2e4eaSScott Feldman * SOFTWARE. 1701f2e4eaSScott Feldman * 1801f2e4eaSScott Feldman */ 1901f2e4eaSScott Feldman 2001f2e4eaSScott Feldman #ifndef _VNIC_DEV_H_ 2101f2e4eaSScott Feldman #define _VNIC_DEV_H_ 2201f2e4eaSScott Feldman 2301f2e4eaSScott Feldman #include "vnic_resource.h" 2401f2e4eaSScott Feldman #include "vnic_devcmd.h" 2501f2e4eaSScott Feldman 2601f2e4eaSScott Feldman #ifndef VNIC_PADDR_TARGET 2701f2e4eaSScott Feldman #define VNIC_PADDR_TARGET 0x0000000000000000ULL 2801f2e4eaSScott Feldman #endif 2901f2e4eaSScott Feldman 3055ed31e6SDavid S. Miller #ifndef readq 3155ed31e6SDavid S. Miller static inline u64 readq(void __iomem *reg) 3255ed31e6SDavid S. Miller { 3355ed31e6SDavid S. Miller return (((u64)readl(reg + 0x4UL) << 32) | 3455ed31e6SDavid S. Miller (u64)readl(reg)); 3555ed31e6SDavid S. Miller } 3655ed31e6SDavid S. Miller 3755ed31e6SDavid S. Miller static inline void writeq(u64 val, void __iomem *reg) 3855ed31e6SDavid S. Miller { 3955ed31e6SDavid S. Miller writel(val & 0xffffffff, reg); 4055ed31e6SDavid S. Miller writel(val >> 32, reg + 0x4UL); 4155ed31e6SDavid S. Miller } 4255ed31e6SDavid S. Miller #endif 4355ed31e6SDavid S. Miller 44a7a79debSVasanthy Kolluri #undef pr_fmt 45a7a79debSVasanthy Kolluri #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 46a7a79debSVasanthy Kolluri 4701f2e4eaSScott Feldman enum vnic_dev_intr_mode { 4801f2e4eaSScott Feldman VNIC_DEV_INTR_MODE_UNKNOWN, 4901f2e4eaSScott Feldman VNIC_DEV_INTR_MODE_INTX, 5001f2e4eaSScott Feldman VNIC_DEV_INTR_MODE_MSI, 5101f2e4eaSScott Feldman VNIC_DEV_INTR_MODE_MSIX, 5201f2e4eaSScott Feldman }; 5301f2e4eaSScott Feldman 5401f2e4eaSScott Feldman struct vnic_dev_bar { 5501f2e4eaSScott Feldman void __iomem *vaddr; 5601f2e4eaSScott Feldman dma_addr_t bus_addr; 5701f2e4eaSScott Feldman unsigned long len; 5801f2e4eaSScott Feldman }; 5901f2e4eaSScott Feldman 6001f2e4eaSScott Feldman struct vnic_dev_ring { 6101f2e4eaSScott Feldman void *descs; 6201f2e4eaSScott Feldman size_t size; 6301f2e4eaSScott Feldman dma_addr_t base_addr; 6401f2e4eaSScott Feldman size_t base_align; 6501f2e4eaSScott Feldman void *descs_unaligned; 6601f2e4eaSScott Feldman size_t size_unaligned; 6701f2e4eaSScott Feldman dma_addr_t base_addr_unaligned; 6801f2e4eaSScott Feldman unsigned int desc_size; 6901f2e4eaSScott Feldman unsigned int desc_count; 7001f2e4eaSScott Feldman unsigned int desc_avail; 7101f2e4eaSScott Feldman }; 7201f2e4eaSScott Feldman 738b89f3a1SGovindarajulu Varadarajan enum vnic_proxy_type { 748b89f3a1SGovindarajulu Varadarajan PROXY_NONE, 758b89f3a1SGovindarajulu Varadarajan PROXY_BY_BDF, 768b89f3a1SGovindarajulu Varadarajan PROXY_BY_INDEX, 778b89f3a1SGovindarajulu Varadarajan }; 788b89f3a1SGovindarajulu Varadarajan 798b89f3a1SGovindarajulu Varadarajan struct vnic_res { 808b89f3a1SGovindarajulu Varadarajan void __iomem *vaddr; 818b89f3a1SGovindarajulu Varadarajan dma_addr_t bus_addr; 828b89f3a1SGovindarajulu Varadarajan unsigned int count; 838b89f3a1SGovindarajulu Varadarajan }; 848b89f3a1SGovindarajulu Varadarajan 858b89f3a1SGovindarajulu Varadarajan struct vnic_intr_coal_timer_info { 868b89f3a1SGovindarajulu Varadarajan u32 mul; 878b89f3a1SGovindarajulu Varadarajan u32 div; 888b89f3a1SGovindarajulu Varadarajan u32 max_usec; 898b89f3a1SGovindarajulu Varadarajan }; 908b89f3a1SGovindarajulu Varadarajan 918b89f3a1SGovindarajulu Varadarajan struct vnic_dev { 928b89f3a1SGovindarajulu Varadarajan void *priv; 938b89f3a1SGovindarajulu Varadarajan struct pci_dev *pdev; 948b89f3a1SGovindarajulu Varadarajan struct vnic_res res[RES_TYPE_MAX]; 958b89f3a1SGovindarajulu Varadarajan enum vnic_dev_intr_mode intr_mode; 968b89f3a1SGovindarajulu Varadarajan struct vnic_devcmd __iomem *devcmd; 978b89f3a1SGovindarajulu Varadarajan struct vnic_devcmd_notify *notify; 988b89f3a1SGovindarajulu Varadarajan struct vnic_devcmd_notify notify_copy; 998b89f3a1SGovindarajulu Varadarajan dma_addr_t notify_pa; 1008b89f3a1SGovindarajulu Varadarajan u32 notify_sz; 1018b89f3a1SGovindarajulu Varadarajan dma_addr_t linkstatus_pa; 1028b89f3a1SGovindarajulu Varadarajan struct vnic_stats *stats; 1038b89f3a1SGovindarajulu Varadarajan dma_addr_t stats_pa; 1048b89f3a1SGovindarajulu Varadarajan struct vnic_devcmd_fw_info *fw_info; 1058b89f3a1SGovindarajulu Varadarajan dma_addr_t fw_info_pa; 1068b89f3a1SGovindarajulu Varadarajan enum vnic_proxy_type proxy; 1078b89f3a1SGovindarajulu Varadarajan u32 proxy_index; 1088b89f3a1SGovindarajulu Varadarajan u64 args[VNIC_DEVCMD_NARGS]; 1098b89f3a1SGovindarajulu Varadarajan struct vnic_intr_coal_timer_info intr_coal_timer_info; 110fda3f52bSGovindarajulu Varadarajan struct devcmd2_controller *devcmd2; 111373fb087SGovindarajulu Varadarajan int (*devcmd_rtn)(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd, 112373fb087SGovindarajulu Varadarajan int wait); 1138b89f3a1SGovindarajulu Varadarajan }; 1148b89f3a1SGovindarajulu Varadarajan 11501f2e4eaSScott Feldman struct vnic_stats; 11601f2e4eaSScott Feldman 11701f2e4eaSScott Feldman void *vnic_dev_priv(struct vnic_dev *vdev); 11801f2e4eaSScott Feldman unsigned int vnic_dev_get_res_count(struct vnic_dev *vdev, 11901f2e4eaSScott Feldman enum vnic_res_type type); 12001f2e4eaSScott Feldman void __iomem *vnic_dev_get_res(struct vnic_dev *vdev, enum vnic_res_type type, 12101f2e4eaSScott Feldman unsigned int index); 12201f2e4eaSScott Feldman void vnic_dev_clear_desc_ring(struct vnic_dev_ring *ring); 12301f2e4eaSScott Feldman int vnic_dev_alloc_desc_ring(struct vnic_dev *vdev, struct vnic_dev_ring *ring, 12401f2e4eaSScott Feldman unsigned int desc_count, unsigned int desc_size); 12501f2e4eaSScott Feldman void vnic_dev_free_desc_ring(struct vnic_dev *vdev, 12601f2e4eaSScott Feldman struct vnic_dev_ring *ring); 12701f2e4eaSScott Feldman int vnic_dev_cmd(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd, 12801f2e4eaSScott Feldman u64 *a0, u64 *a1, int wait); 129889d13f5SRoopa Prabhu void vnic_dev_cmd_proxy_by_index_start(struct vnic_dev *vdev, u16 index); 130889d13f5SRoopa Prabhu void vnic_dev_cmd_proxy_end(struct vnic_dev *vdev); 13101f2e4eaSScott Feldman int vnic_dev_fw_info(struct vnic_dev *vdev, 13201f2e4eaSScott Feldman struct vnic_devcmd_fw_info **fw_info); 13301f2e4eaSScott Feldman int vnic_dev_spec(struct vnic_dev *vdev, unsigned int offset, unsigned int size, 13401f2e4eaSScott Feldman void *value); 13501f2e4eaSScott Feldman int vnic_dev_stats_dump(struct vnic_dev *vdev, struct vnic_stats **stats); 13601f2e4eaSScott Feldman int vnic_dev_hang_notify(struct vnic_dev *vdev); 137383ab92fSVasanthy Kolluri int vnic_dev_packet_filter(struct vnic_dev *vdev, int directed, int multicast, 13801f2e4eaSScott Feldman int broadcast, int promisc, int allmulti); 139f009618aSAlexander Duyck int vnic_dev_add_addr(struct vnic_dev *vdev, const u8 *addr); 140f009618aSAlexander Duyck int vnic_dev_del_addr(struct vnic_dev *vdev, const u8 *addr); 141b13423eeSRoopa Prabhu int vnic_dev_get_mac_addr(struct vnic_dev *vdev, u8 *mac_addr); 14201f2e4eaSScott Feldman int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr); 143383ab92fSVasanthy Kolluri int vnic_dev_notify_unset(struct vnic_dev *vdev); 14401f2e4eaSScott Feldman int vnic_dev_link_status(struct vnic_dev *vdev); 14501f2e4eaSScott Feldman u32 vnic_dev_port_speed(struct vnic_dev *vdev); 14601f2e4eaSScott Feldman u32 vnic_dev_msg_lvl(struct vnic_dev *vdev); 14701f2e4eaSScott Feldman u32 vnic_dev_mtu(struct vnic_dev *vdev); 14801f2e4eaSScott Feldman int vnic_dev_close(struct vnic_dev *vdev); 1492db77e0fSVasanthy Kolluri int vnic_dev_enable_wait(struct vnic_dev *vdev); 15001f2e4eaSScott Feldman int vnic_dev_disable(struct vnic_dev *vdev); 15101f2e4eaSScott Feldman int vnic_dev_open(struct vnic_dev *vdev, int arg); 15201f2e4eaSScott Feldman int vnic_dev_open_done(struct vnic_dev *vdev, int *done); 15301f2e4eaSScott Feldman int vnic_dev_init(struct vnic_dev *vdev, int arg); 154f8bd9091SScott Feldman int vnic_dev_deinit(struct vnic_dev *vdev); 155ea7ea65aSVasanthy Kolluri void vnic_dev_intr_coal_timer_info_default(struct vnic_dev *vdev); 156ea7ea65aSVasanthy Kolluri int vnic_dev_intr_coal_timer_info(struct vnic_dev *vdev); 15799ef5639SVasanthy Kolluri int vnic_dev_hang_reset(struct vnic_dev *vdev, int arg); 158937317c7SGovindarajulu Varadarajan int vnic_dev_soft_reset(struct vnic_dev *vdev, int arg); 15999ef5639SVasanthy Kolluri int vnic_dev_hang_reset_done(struct vnic_dev *vdev, int *done); 160937317c7SGovindarajulu Varadarajan int vnic_dev_soft_reset_done(struct vnic_dev *vdev, int *done); 16101f2e4eaSScott Feldman void vnic_dev_set_intr_mode(struct vnic_dev *vdev, 16201f2e4eaSScott Feldman enum vnic_dev_intr_mode intr_mode); 16301f2e4eaSScott Feldman enum vnic_dev_intr_mode vnic_dev_get_intr_mode(struct vnic_dev *vdev); 164ea7ea65aSVasanthy Kolluri u32 vnic_dev_intr_coal_timer_usec_to_hw(struct vnic_dev *vdev, u32 usec); 165ea7ea65aSVasanthy Kolluri u32 vnic_dev_intr_coal_timer_hw_to_usec(struct vnic_dev *vdev, u32 hw_cycles); 166ea7ea65aSVasanthy Kolluri u32 vnic_dev_get_intr_coal_timer_max(struct vnic_dev *vdev); 16701f2e4eaSScott Feldman void vnic_dev_unregister(struct vnic_dev *vdev); 168f8cac14aSVasanthy Kolluri int vnic_dev_set_ig_vlan_rewrite_mode(struct vnic_dev *vdev, 169f8cac14aSVasanthy Kolluri u8 ig_vlan_rewrite_mode); 17001f2e4eaSScott Feldman struct vnic_dev *vnic_dev_register(struct vnic_dev *vdev, 17127e6c7d3SScott Feldman void *priv, struct pci_dev *pdev, struct vnic_dev_bar *bar, 17227e6c7d3SScott Feldman unsigned int num_bars); 1734a50ddfdSgovindarajulu.v struct pci_dev *vnic_dev_get_pdev(struct vnic_dev *vdev); 1749085fd09SRoopa Prabhu int vnic_dev_init_prov2(struct vnic_dev *vdev, u8 *buf, u32 len); 1759085fd09SRoopa Prabhu int vnic_dev_enable2(struct vnic_dev *vdev, int active); 1769085fd09SRoopa Prabhu int vnic_dev_enable2_done(struct vnic_dev *vdev, int *status); 1779085fd09SRoopa Prabhu int vnic_dev_deinit_done(struct vnic_dev *vdev, int *status); 178d6c81bc6SRoopa Prabhu int vnic_dev_set_mac_addr(struct vnic_dev *vdev, u8 *mac_addr); 17963118527SGovindarajulu Varadarajan int vnic_dev_classifier(struct vnic_dev *vdev, u8 cmd, u16 *entry, 18063118527SGovindarajulu Varadarajan struct filter *data); 181373fb087SGovindarajulu Varadarajan int vnic_devcmd_init(struct vnic_dev *vdev); 182ca029179SGovindarajulu Varadarajan int vnic_dev_overlay_offload_ctrl(struct vnic_dev *vdev, u8 overlay, u8 config); 183ca029179SGovindarajulu Varadarajan int vnic_dev_overlay_offload_cfg(struct vnic_dev *vdev, u8 overlay, 184ca029179SGovindarajulu Varadarajan u16 vxlan_udp_port_number); 185ca029179SGovindarajulu Varadarajan int vnic_dev_get_supported_feature_ver(struct vnic_dev *vdev, u8 feature, 186d1179094SGovindarajulu Varadarajan u64 *supported_versions, u64 *a1); 187*4016a7f1SGovindarajulu Varadarajan int vnic_dev_capable_rss_hash_type(struct vnic_dev *vdev, u8 *rss_hash_type); 18801f2e4eaSScott Feldman 18901f2e4eaSScott Feldman #endif /* _VNIC_DEV_H_ */ 190