blob: 0ec20a3e45ff0a405102b4d5d126cd83868c02a3 [file] [log] [blame]
/*
* aQuantia Corporation Network Driver
* Copyright (C) 2017 aQuantia Corporation. All rights reserved
*
* Portions Copyright (C) various contributors (see specific commit references)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*/
#ifndef _ATL_COMPAT_H_
#define _ATL_COMPAT_H_
#include <linux/version.h>
#include <linux/pci.h>
#include <linux/msi.h>
struct atl_queue_vec;
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,14,0)
/* introduced in commit 686fef928bba6be13cabe639f154af7d72b63120 */
static inline void timer_setup(struct timer_list *timer,
void (*callback)(struct timer_list *), unsigned int flags)
{
setup_timer(timer, (void (*)(unsigned long))callback,
(unsigned long)timer);
}
#endif /* 4.14.0 */
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,11,0)
/* ->ndo_get_stats64 return type was changed to void in commit
* bc1f44709cf27fb2a5766cadafe7e2ad5e9cb221. It's safe to just cast
* the pointer to avoid the warning because the only place
* ->ndo_get_stats64 was invoked before the change ignored the return
* value. */
#define ATL_COMPAT_CAST_NDO_GET_STATS64
#endif /* 4.11.0 */
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,10,0)
/* introduced in commit 94842b4fc4d6b1691cfc86c6f5251f299d27f4ba */
#define ETHTOOL_LINK_MODE_2500baseT_Full_BIT 47
#define ETHTOOL_LINK_MODE_5000baseT_Full_BIT 48
/* from commit 20e407e195b29a4f5a18d713a61f54a75f992bd5 */
struct irq_affinity {
int pre_vectors;
int post_vectors;
};
#define ATL_COMPAT_PCI_ALLOC_IRQ_VECTORS_AFFINITY
struct atl_nic;
int atl_compat_pci_alloc_irq_vectors_affinity(struct pci_dev *dev,
unsigned int min_vecs, unsigned int max_vecs, unsigned int flags,
const struct irq_affinity *affd);
static inline int pci_alloc_irq_vectors_affinity(struct pci_dev *dev,
unsigned int min_vecs, unsigned int max_vecs, unsigned int flags,
const struct irq_affinity *affd)
{
return atl_compat_pci_alloc_irq_vectors_affinity(dev, min_vecs,
max_vecs, flags, affd);
}
#else /* 4.10.0 */
#define ATL_HAVE_MINMAX_MTU
#endif /* 4.10.0 */
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,8,0)
/* from commit be9d2e8927cef02076bb7b5b2637cd9f4be2e8df */
static inline int
pci_request_mem_regions(struct pci_dev *pdev, const char *name)
{
return pci_request_selected_regions(pdev,
pci_select_bars(pdev, IORESOURCE_MEM), name);
}
#define ATL_COMPAT_PCI_IRQ_VECTOR
int atl_compat_pci_irq_vector(struct pci_dev *dev, unsigned int nr);
static inline int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
{
return atl_compat_pci_irq_vector(dev, nr);
}
static inline void pci_free_irq_vectors(struct pci_dev *dev)
{
pci_disable_msix(dev);
pci_disable_msi(dev);
}
static inline int
pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,
unsigned int max_vecs, unsigned int flags)
{
return pci_alloc_irq_vectors_affinity(dev, min_vecs, max_vecs, flags,
NULL);
}
/* from commit 4fe0d154880bb6eb833cbe84fa6f385f400f0b9c */
#define PCI_IRQ_LEGACY (1 << 0) /* allow legacy interrupts */
#define PCI_IRQ_MSI (1 << 1) /* allow MSI interrupts */
#define PCI_IRQ_MSIX (1 << 2) /* allow MSI-X interrupts */
#define PCI_IRQ_AFFINITY (1 << 3) /* auto-assign affinity */
#endif /* 4.8.0 */
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
/* from commit 1dff8083a024650c75a9c961c38082473ceae8cf */
#define page_to_virt(x) __va(PFN_PHYS(page_to_pfn(x)))
#endif /* 4.7.0 */
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,6,0)
/* from commit fe896d1878949ea92ba547587bc3075cc688fb8f */
static inline void page_ref_inc(struct page *page)
{
atomic_inc(&page->_count);
}
/* introduced in commit 795bb1c00dd338aa0d12f9a7f1f4776fb3160416 */
#define napi_consume_skb(__skb, __budget) dev_consume_skb_any(__skb)
/* from commit 3f1ac7a700d039c61d8d8b99f28d605d489a60cf */
#define ETHTOOL_LINK_MODE_100baseT_Full_BIT 3
#define ETHTOOL_LINK_MODE_1000baseT_Full_BIT 5
#define ETHTOOL_LINK_MODE_10000baseT_Full_BIT 12
/* IPv6 NFC API introduced in commit
* 72bb68721f80a1441e871b6afc9ab0b3793d5031 */
/* Define the IPv6 constants for kernels not supporting IPv6 in the
* NFC API to reduce the number of #ifdefs in the code. The constants
* themselves may already be defined for RSS hash management API, so
* #undef them first */
#undef TCP_V6_FLOW
#define TCP_V6_FLOW 0x05
#undef UDP_V6_FLOW
#define UDP_V6_FLOW 0x06
#undef SCTP_V6_FLOW
#define SCTP_V6_FLOW 0x07
#undef IPV6_USER_FLOW
#define IPV6_USER_FLOW 0x0e
#define IPV4_USER_FLOW IP_USER_FLOW
#else
/* introduced in commit 3f1ac7a700d039c61d8d8b99f28d605d489a60cf */
#define ATL_HAVE_ETHTOOL_KSETTINGS
/* introduced in commit 72bb68721f80a1441e871b6afc9ab0b3793d5031 */
#define ATL_HAVE_IPV6_NTUPLE
#endif /* 4.6.0 */
#ifdef ATL_COMPAT_PCI_ALLOC_IRQ_VECTORS_AFFINITY
void atl_compat_set_affinity(int vector, struct atl_queue_vec *qvec);
void atl_compat_calc_affinities(struct atl_nic *nic);
#else /* ATL_COMPAT_PCI_ALLOC_IRQ_VECTORS_AFFINITY */
static inline void atl_compat_set_affinity(int vector, struct atl_queue_vec *qvec)
{}
static inline void atl_compat_calc_affinities(struct atl_nic *nic)
{}
#endif /* ATL_COMPAT_PCI_ALLOC_IRQ_VECTORS_AFFINITY */
#endif