blob: 3d39181c5e91b661f2a59ffd6af6a88fbc3bc26f [file] [log] [blame] [edit]
/**
* Copyright (c) 2012-2012 Quantenna Communications, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
#ifndef __QDPC_INIT_H_
#define __QDPC_INIT_H_
#include <asm/io.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
#include "topaz_vnet.h"
#define QDPC_MODULE_NAME "qdpc_ruby"
#define QDPC_DEV_NAME "qdpc_ruby"
#define QDPC_MODULE_VERSION "1.0"
/* PCIe device information declarations */
#define QDPC_VENDOR_ID 0x1bb5
#define QDPC_DEVICE_ID 0x0008
#define QDPC_PCIE_NUM_BARS 6
/* PCIe Configuration Space Defines */
#define QDPC_LINK_DOWN 0xffffffff /* Used to indicate link went down */
#define QDPC_VENDOR_ID_OFFSET 0x00
#define QDPC_INT_LINE_OFFSET 0x3C
#define QDPC_ROW_INCR_OFFSET 0x04
#undef QDPC_CS_DEBUG
extern unsigned int (*qdpc_pci_readl)(void *addr);
extern void (*qdpc_pci_writel)(unsigned int val, void *addr);
/*
* End-point(EP) is little-Endian.
* These two macros are used for host side outbound window memory access.
* Outbound here is host side view-point. So memory accessed by these two macros
* should be on EP side.
* NOTE: On some platforms, outbound hardware swap(byte order swap) should be
* enabled for outbound memory access correctly. If enabled, Endian translation
* will be done by hardware, and software Endian translation should be disabled.
* */
#ifdef OUTBOUND_HW_SWAP
#define le32_readl(x) readl(x)
#define le32_writel(x, addr) writel(x, addr)
#else
#define le32_readl(x) le32_to_cpu(readl((x)))
#define le32_writel(x, addr) writel(cpu_to_le32((x)), addr)
#endif
static inline unsigned int qdpc_readl(void *addr)
{
return readl(addr);
}
static inline void qdpc_writel(unsigned int val, void *addr)
{
writel(val, addr);
}
static inline unsigned int qdpc_le32_readl(void *addr)
{
return le32_to_cpu(readl((addr)));
}
static inline void qdpc_le32_writel(unsigned int val, void *addr)
{
writel(cpu_to_le32((val)), addr);
}
static inline void qdpc_pcie_posted_write(uint32_t val, __iomem void *basereg)
{
qdpc_pci_writel(val,basereg);
/* flush posted write */
qdpc_pci_readl(basereg);
}
static inline int qdpc_isbootstate(struct vmac_priv *p, uint32_t state) {
__iomem uint32_t *status = &p->bda->bda_bootstate;
uint32_t s = qdpc_pci_readl(status);
return (s == state);
}
static inline int qdpc_booterror(struct vmac_priv *p) {
__iomem uint32_t *status = &p->bda->bda_flags;
uint32_t s = qdpc_pci_readl(status);
return (s & PCIE_BDA_ERROR_MASK);
}
static inline void qdpc_setbootstate(struct vmac_priv *p, uint32_t state) {
__iomem qdpc_pcie_bda_t *bda = p->bda;
qdpc_pcie_posted_write(state, &bda->bda_bootstate);
}
/* Function prototypes */
int qdpc_pcie_init_intr_and_mem(struct vmac_priv *priv);
void qdpc_interrupt_target(struct vmac_priv *priv, uint32_t intr);
void qdpc_disable_irqs(struct vmac_priv *priv);
void qdpc_enable_irqs(struct vmac_priv *priv);
void qdpc_free_interrupt(struct pci_dev *pdev);
void qdpc_pcie_free_mem(struct pci_dev *pdev);
void qdpc_init_target_buffers(void *data);
int qdpc_send_packet(struct sk_buff *skb, struct net_device *ndev);
void *qdpc_map_pciemem(unsigned long busaddr, size_t len);
void qdpc_unmap_pciemem(unsigned long busaddr, void *vaddr, size_t len);
int qdpc_unmap_iomem(struct vmac_priv *priv);
int32_t qdpc_set_dma_mask(struct vmac_priv *priv);
#endif