sonic-buildimage/platform/broadcom/saibcm-modules/sdklt/linux/knet/ngknet_linux.h
Saikrishna Arcot 4f9569132f Update saibcm-modules to compile with 5.10 kernel
Update the build rules in saibcm-modules to use the 5.10 kernel instead
of searching for the 4.19 kernel. In addition, some code changes were
done to get it to compile. The main categories of such changes are as
follows:

* For /proc files, `struct file_operations` has been replaced with
`struct proc_ops`.
* Y2038 changes to use the new APIs, since `do_gettimeofday()` is no
longer available.
* Minor changes in how external kernel module symbols are read by
modpost.

Signed-off-by: Saikrishna Arcot <sarcot@microsoft.com>
2021-11-10 15:27:22 -08:00

247 lines
5.2 KiB
C

/*! \file ngknet_linux.h
*
* Data structure and macro definitions for Linux kernel APIs abstraction.
*
*/
/*
* $Copyright: Copyright 2018-2021 Broadcom. All rights reserved.
* The term 'Broadcom' refers to Broadcom Inc. and/or its subsidiaries.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation.
*
* 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.
*
* A copy of the GNU General Public License version 2 (GPLv2) can
* be found in the LICENSES folder.$
*/
#ifndef NGKNET_LINUX_H
#define NGKNET_LINUX_H
#include <linux/version.h>
#include <linux/skbuff.h>
#include <linux/kthread.h>
#include <linux/netdevice.h>
/*!
* Kernel abstraction
*/
#define MODULE_PARAM(n, t, p) module_param(n, t, p)
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
#define kal_vlan_hwaccel_put_tag(skb, proto, tci) \
__vlan_hwaccel_put_tag(skb, tci)
#define NETIF_F_HW_VLAN_CTAG_RX NETIF_F_HW_VLAN_RX
#define NETIF_F_HW_VLAN_CTAG_TX NETIF_F_HW_VLAN_TX
#else
#define kal_vlan_hwaccel_put_tag(skb, proto, tci) \
__vlan_hwaccel_put_tag(skb, htons(proto), tci)
#endif /* KERNEL_VERSION(3,10,0) */
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)
static inline int
kal_support_paged_skb(void)
{
return false;
}
#else
static inline int
kal_support_paged_skb(void)
{
return true;
}
#endif /* KERNEL_VERSION(3,6,0) */
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)
static inline struct page *
kal_dev_alloc_page(void)
{
return NULL;
}
#elif LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0)
static inline struct page *
kal_dev_alloc_page(void)
{
return alloc_pages(GFP_ATOMIC | __GFP_ZERO | __GFP_COLD |
__GFP_COMP | __GFP_MEMALLOC, 0);
}
#else
static inline struct page *
kal_dev_alloc_page(void)
{
return dev_alloc_page();
}
#endif /* KERNEL_VERSION(3,6,0) */
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,6,0)
static inline struct sk_buff *
kal_build_skb(void *data, unsigned int frag_size)
{
return NULL;
}
#else
static inline struct sk_buff *
kal_build_skb(void *data, unsigned int frag_size)
{
return build_skb(data, frag_size);
}
#endif /* KERNEL_VERSION(3,6,0) */
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0)
static inline void
kal_netif_trans_update(struct net_device *dev)
{
dev->trans_start = jiffies;
}
#else
static inline void
kal_netif_trans_update(struct net_device *dev)
{
netif_trans_update(dev);
}
#endif /* KERNEL_VERSION(4,7,0) */
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,17,0)
static inline void
kal_time_val_get(struct timeval *tv)
{
do_gettimeofday(tv);
}
#elif LINUX_VERSION_CODE < KERNEL_VERSION(5,6,0)
static inline void
kal_time_val_get(struct timeval *tv)
{
struct timespec64 ts;
ktime_get_real_ts64(&ts);
tv->tv_sec = ts.tv_sec;
tv->tv_usec = ts.tv_nsec / 1000;
}
#else
static inline void
kal_time_val_get(struct timespec64 *tv)
{
ktime_get_real_ts64(tv);
}
#endif /* KERNEL_VERSION(3,17,0) */
static inline unsigned long
kal_copy_from_user(void *to, const void __user *from,
unsigned int dl, unsigned int sl)
{
unsigned int len = dl;
if (unlikely(len != sl)) {
printk(KERN_WARNING "Unmatched linux_ngknet.ko, please use the latest.\n");
len = min(dl, sl);
}
return copy_from_user(to, from, len);
}
static inline unsigned long
kal_copy_to_user(void __user *to, const void *from,
unsigned int dl, unsigned int sl)
{
unsigned int len = dl;
if (unlikely(len != sl)) {
printk(KERN_WARNING "Unmatched linux_ngknet.ko, please use the latest.\n");
len = min(dl, sl);
}
return copy_to_user(to, from, len);
}
/*!
* System abstraction
*/
static inline void *
sal_alloc(unsigned int sz, char *s)
{
return kmalloc(sz, GFP_KERNEL);
}
static inline void
sal_free(void *addr)
{
kfree(addr);
}
static inline void *
sal_memset(void *dest, int c, size_t cnt)
{
return memset(dest, c, cnt);
}
static inline void *
sal_memcpy(void *dest, const void *src, size_t cnt)
{
return memcpy(dest, src, cnt);
}
static inline char *
sal_strncpy(char *dest, const char *src, size_t cnt)
{
return strncpy(dest, src, cnt);
}
/*!
* Time
*/
extern unsigned long
sal_time_usecs(void);
extern void
sal_usleep(unsigned long usec);
/*!
* Synchronization
*/
typedef struct sal_sem_s {
char semaphore_opaque_type;
} *sal_sem_t;
typedef struct sal_spinlock_s {
char spinlock_opaque_type;
} *sal_spinlock_t;
#define SAL_SEM_FOREVER -1
#define SAL_SEM_BINARY 1
#define SAL_SEM_COUNTING 0
extern sal_sem_t
sal_sem_create(char *desc, int binary, int count);
extern void
sal_sem_destroy(sal_sem_t sem);
extern int
sal_sem_take(sal_sem_t sem, int usec);
extern int
sal_sem_give(sal_sem_t sem);
extern sal_spinlock_t
sal_spinlock_create(char *desc);
extern void
sal_spinlock_destroy(sal_spinlock_t lock);
extern int
sal_spinlock_lock(sal_spinlock_t lock);
extern int
sal_spinlock_unlock(sal_spinlock_t lock);
#endif /* NGKNET_LINUX_H */