mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 03:27:44 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Pull networking changes from David Miller:
"Noteworthy changes this time around:
1) Multicast rejoin support for team driver, from Jiri Pirko.
2) Centralize and simplify TCP RTT measurement handling in order to
reduce the impact of bad RTO seeding from SYN/ACKs. Also, when
both timestamps and local RTT measurements are available prefer
the later because there are broken middleware devices which
scramble the timestamp.
From Yuchung Cheng.
3) Add TCP_NOTSENT_LOWAT socket option to limit the amount of kernel
memory consumed to queue up unsend user data. From Eric Dumazet.
4) Add a "physical port ID" abstraction for network devices, from
Jiri Pirko.
5) Add a "suppress" operation to influence fib_rules lookups, from
Stefan Tomanek.
6) Add a networking development FAQ, from Paul Gortmaker.
7) Extend the information provided by tcp_probe and add ipv6 support,
from Daniel Borkmann.
8) Use RCU locking more extensively in openvswitch data paths, from
Pravin B Shelar.
9) Add SCTP support to openvswitch, from Joe Stringer.
10) Add EF10 chip support to SFC driver, from Ben Hutchings.
11) Add new SYNPROXY netfilter target, from Patrick McHardy.
12) Compute a rate approximation for sending in TCP sockets, and use
this to more intelligently coalesce TSO frames. Furthermore, add
a new packet scheduler which takes advantage of this estimate when
available. From Eric Dumazet.
13) Allow AF_PACKET fanouts with random selection, from Daniel
Borkmann.
14) Add ipv6 support to vxlan driver, from Cong Wang"
Resolved conflicts as per discussion.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1218 commits)
openvswitch: Fix alignment of struct sw_flow_key.
netfilter: Fix build errors with xt_socket.c
tcp: Add missing braces to do_tcp_setsockopt
caif: Add missing braces to multiline if in cfctrl_linkup_request
bnx2x: Add missing braces in bnx2x:bnx2x_link_initialize
vxlan: Fix kernel panic on device delete.
net: mvneta: implement ->ndo_do_ioctl() to support PHY ioctls
net: mvneta: properly disable HW PHY polling and ensure adjust_link() works
icplus: Use netif_running to determine device state
ethernet/arc/arc_emac: Fix huge delays in large file copies
tuntap: orphan frags before trying to set tx timestamp
tuntap: purge socket error queue on detach
qlcnic: use standard NAPI weights
ipv6:introduce function to find route for redirect
bnx2x: VF RSS support - VF side
bnx2x: VF RSS support - PF side
vxlan: Notify drivers for listening UDP port changes
net: usbnet: update addr_assign_type if appropriate
driver/net: enic: update enic maintainers and driver
driver/net: enic: Exposing symbols for Cisco's low latency driver
...
This commit is contained in:
commit
cc998ff881
974 changed files with 56740 additions and 23930 deletions
|
|
@ -387,6 +387,27 @@ int gxio_mpipe_link_close_aux(gxio_mpipe_context_t * context, int mac)
|
|||
|
||||
EXPORT_SYMBOL(gxio_mpipe_link_close_aux);
|
||||
|
||||
struct link_set_attr_aux_param {
|
||||
int mac;
|
||||
uint32_t attr;
|
||||
int64_t val;
|
||||
};
|
||||
|
||||
int gxio_mpipe_link_set_attr_aux(gxio_mpipe_context_t * context, int mac,
|
||||
uint32_t attr, int64_t val)
|
||||
{
|
||||
struct link_set_attr_aux_param temp;
|
||||
struct link_set_attr_aux_param *params = &temp;
|
||||
|
||||
params->mac = mac;
|
||||
params->attr = attr;
|
||||
params->val = val;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params), GXIO_MPIPE_OP_LINK_SET_ATTR_AUX);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_mpipe_link_set_attr_aux);
|
||||
|
||||
struct get_timestamp_aux_param {
|
||||
uint64_t sec;
|
||||
|
|
@ -454,6 +475,51 @@ int gxio_mpipe_adjust_timestamp_aux(gxio_mpipe_context_t * context,
|
|||
|
||||
EXPORT_SYMBOL(gxio_mpipe_adjust_timestamp_aux);
|
||||
|
||||
struct adjust_timestamp_freq_param {
|
||||
int32_t ppb;
|
||||
};
|
||||
|
||||
int gxio_mpipe_adjust_timestamp_freq(gxio_mpipe_context_t * context,
|
||||
int32_t ppb)
|
||||
{
|
||||
struct adjust_timestamp_freq_param temp;
|
||||
struct adjust_timestamp_freq_param *params = &temp;
|
||||
|
||||
params->ppb = ppb;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params),
|
||||
GXIO_MPIPE_OP_ADJUST_TIMESTAMP_FREQ);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_mpipe_adjust_timestamp_freq);
|
||||
|
||||
struct config_edma_ring_blks_param {
|
||||
unsigned int ering;
|
||||
unsigned int max_blks;
|
||||
unsigned int min_snf_blks;
|
||||
unsigned int db;
|
||||
};
|
||||
|
||||
int gxio_mpipe_config_edma_ring_blks(gxio_mpipe_context_t * context,
|
||||
unsigned int ering, unsigned int max_blks,
|
||||
unsigned int min_snf_blks, unsigned int db)
|
||||
{
|
||||
struct config_edma_ring_blks_param temp;
|
||||
struct config_edma_ring_blks_param *params = &temp;
|
||||
|
||||
params->ering = ering;
|
||||
params->max_blks = max_blks;
|
||||
params->min_snf_blks = min_snf_blks;
|
||||
params->db = db;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params),
|
||||
GXIO_MPIPE_OP_CONFIG_EDMA_RING_BLKS);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_mpipe_config_edma_ring_blks);
|
||||
|
||||
struct arm_pollfd_param {
|
||||
union iorpc_pollfd pollfd;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -16,6 +16,24 @@
|
|||
#include "gxio/iorpc_mpipe_info.h"
|
||||
|
||||
|
||||
struct instance_aux_param {
|
||||
_gxio_mpipe_link_name_t name;
|
||||
};
|
||||
|
||||
int gxio_mpipe_info_instance_aux(gxio_mpipe_info_context_t * context,
|
||||
_gxio_mpipe_link_name_t name)
|
||||
{
|
||||
struct instance_aux_param temp;
|
||||
struct instance_aux_param *params = &temp;
|
||||
|
||||
params->name = name;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params), GXIO_MPIPE_INFO_OP_INSTANCE_AUX);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_mpipe_info_instance_aux);
|
||||
|
||||
struct enumerate_aux_param {
|
||||
_gxio_mpipe_link_name_t name;
|
||||
_gxio_mpipe_link_mac_t mac;
|
||||
|
|
|
|||
|
|
@ -36,8 +36,14 @@ int gxio_mpipe_init(gxio_mpipe_context_t *context, unsigned int mpipe_index)
|
|||
int fd;
|
||||
int i;
|
||||
|
||||
if (mpipe_index >= GXIO_MPIPE_INSTANCE_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
snprintf(file, sizeof(file), "mpipe/%d/iorpc", mpipe_index);
|
||||
fd = hv_dev_open((HV_VirtAddr) file, 0);
|
||||
|
||||
context->fd = fd;
|
||||
|
||||
if (fd < 0) {
|
||||
if (fd >= GXIO_ERR_MIN && fd <= GXIO_ERR_MAX)
|
||||
return fd;
|
||||
|
|
@ -45,8 +51,6 @@ int gxio_mpipe_init(gxio_mpipe_context_t *context, unsigned int mpipe_index)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
context->fd = fd;
|
||||
|
||||
/* Map in the MMIO space. */
|
||||
context->mmio_cfg_base = (void __force *)
|
||||
iorpc_ioremap(fd, HV_MPIPE_CONFIG_MMIO_OFFSET,
|
||||
|
|
@ -64,12 +68,15 @@ int gxio_mpipe_init(gxio_mpipe_context_t *context, unsigned int mpipe_index)
|
|||
for (i = 0; i < 8; i++)
|
||||
context->__stacks.stacks[i] = 255;
|
||||
|
||||
context->instance = mpipe_index;
|
||||
|
||||
return 0;
|
||||
|
||||
fast_failed:
|
||||
iounmap((void __force __iomem *)(context->mmio_cfg_base));
|
||||
cfg_failed:
|
||||
hv_dev_close(context->fd);
|
||||
context->fd = -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
|
@ -383,7 +390,7 @@ EXPORT_SYMBOL_GPL(gxio_mpipe_iqueue_init);
|
|||
|
||||
int gxio_mpipe_equeue_init(gxio_mpipe_equeue_t *equeue,
|
||||
gxio_mpipe_context_t *context,
|
||||
unsigned int edma_ring_id,
|
||||
unsigned int ering,
|
||||
unsigned int channel,
|
||||
void *mem, unsigned int mem_size,
|
||||
unsigned int mem_flags)
|
||||
|
|
@ -394,7 +401,7 @@ int gxio_mpipe_equeue_init(gxio_mpipe_equeue_t *equeue,
|
|||
/* Offset used to read number of completed commands. */
|
||||
MPIPE_EDMA_POST_REGION_ADDR_t offset;
|
||||
|
||||
int result = gxio_mpipe_init_edma_ring(context, edma_ring_id, channel,
|
||||
int result = gxio_mpipe_init_edma_ring(context, ering, channel,
|
||||
mem, mem_size, mem_flags);
|
||||
if (result < 0)
|
||||
return result;
|
||||
|
|
@ -405,7 +412,7 @@ int gxio_mpipe_equeue_init(gxio_mpipe_equeue_t *equeue,
|
|||
offset.region =
|
||||
MPIPE_MMIO_ADDR__REGION_VAL_EDMA -
|
||||
MPIPE_MMIO_ADDR__REGION_VAL_IDMA;
|
||||
offset.ring = edma_ring_id;
|
||||
offset.ring = ering;
|
||||
|
||||
__gxio_dma_queue_init(&equeue->dma_queue,
|
||||
context->mmio_fast_base + offset.word,
|
||||
|
|
@ -413,6 +420,9 @@ int gxio_mpipe_equeue_init(gxio_mpipe_equeue_t *equeue,
|
|||
equeue->edescs = mem;
|
||||
equeue->mask_num_entries = num_entries - 1;
|
||||
equeue->log2_num_entries = __builtin_ctz(num_entries);
|
||||
equeue->context = context;
|
||||
equeue->ering = ering;
|
||||
equeue->channel = channel;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -493,6 +503,20 @@ static gxio_mpipe_context_t *_gxio_get_link_context(void)
|
|||
return contextp;
|
||||
}
|
||||
|
||||
int gxio_mpipe_link_instance(const char *link_name)
|
||||
{
|
||||
_gxio_mpipe_link_name_t name;
|
||||
gxio_mpipe_context_t *context = _gxio_get_link_context();
|
||||
|
||||
if (!context)
|
||||
return GXIO_ERR_NO_DEVICE;
|
||||
|
||||
strncpy(name.name, link_name, sizeof(name.name));
|
||||
name.name[GXIO_MPIPE_LINK_NAME_LEN - 1] = '\0';
|
||||
|
||||
return gxio_mpipe_info_instance_aux(context, name);
|
||||
}
|
||||
|
||||
int gxio_mpipe_link_enumerate_mac(int idx, char *link_name, uint8_t *link_mac)
|
||||
{
|
||||
int rv;
|
||||
|
|
@ -543,3 +567,12 @@ int gxio_mpipe_link_close(gxio_mpipe_link_t *link)
|
|||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(gxio_mpipe_link_close);
|
||||
|
||||
int gxio_mpipe_link_set_attr(gxio_mpipe_link_t *link, uint32_t attr,
|
||||
int64_t val)
|
||||
{
|
||||
return gxio_mpipe_link_set_attr_aux(link->context, link->mac, attr,
|
||||
val);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(gxio_mpipe_link_set_attr);
|
||||
|
|
|
|||
|
|
@ -44,10 +44,13 @@
|
|||
#define GXIO_MPIPE_OP_REGISTER_CLIENT_MEMORY IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x1210)
|
||||
#define GXIO_MPIPE_OP_LINK_OPEN_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1211)
|
||||
#define GXIO_MPIPE_OP_LINK_CLOSE_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1212)
|
||||
#define GXIO_MPIPE_OP_LINK_SET_ATTR_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1213)
|
||||
|
||||
#define GXIO_MPIPE_OP_GET_TIMESTAMP_AUX IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x121e)
|
||||
#define GXIO_MPIPE_OP_SET_TIMESTAMP_AUX IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x121f)
|
||||
#define GXIO_MPIPE_OP_ADJUST_TIMESTAMP_AUX IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x1220)
|
||||
#define GXIO_MPIPE_OP_GET_TIMESTAMP_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x121e)
|
||||
#define GXIO_MPIPE_OP_SET_TIMESTAMP_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x121f)
|
||||
#define GXIO_MPIPE_OP_ADJUST_TIMESTAMP_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1220)
|
||||
#define GXIO_MPIPE_OP_CONFIG_EDMA_RING_BLKS IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1221)
|
||||
#define GXIO_MPIPE_OP_ADJUST_TIMESTAMP_FREQ IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1222)
|
||||
#define GXIO_MPIPE_OP_ARM_POLLFD IORPC_OPCODE(IORPC_FORMAT_KERNEL_POLLFD, 0x9000)
|
||||
#define GXIO_MPIPE_OP_CLOSE_POLLFD IORPC_OPCODE(IORPC_FORMAT_KERNEL_POLLFD, 0x9001)
|
||||
#define GXIO_MPIPE_OP_GET_MMIO_BASE IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8000)
|
||||
|
|
@ -114,6 +117,8 @@ int gxio_mpipe_link_open_aux(gxio_mpipe_context_t * context,
|
|||
|
||||
int gxio_mpipe_link_close_aux(gxio_mpipe_context_t * context, int mac);
|
||||
|
||||
int gxio_mpipe_link_set_attr_aux(gxio_mpipe_context_t * context, int mac,
|
||||
uint32_t attr, int64_t val);
|
||||
|
||||
int gxio_mpipe_get_timestamp_aux(gxio_mpipe_context_t * context, uint64_t * sec,
|
||||
uint64_t * nsec, uint64_t * cycles);
|
||||
|
|
@ -124,6 +129,9 @@ int gxio_mpipe_set_timestamp_aux(gxio_mpipe_context_t * context, uint64_t sec,
|
|||
int gxio_mpipe_adjust_timestamp_aux(gxio_mpipe_context_t * context,
|
||||
int64_t nsec);
|
||||
|
||||
int gxio_mpipe_adjust_timestamp_freq(gxio_mpipe_context_t * context,
|
||||
int32_t ppb);
|
||||
|
||||
int gxio_mpipe_arm_pollfd(gxio_mpipe_context_t * context, int pollfd_cookie);
|
||||
|
||||
int gxio_mpipe_close_pollfd(gxio_mpipe_context_t * context, int pollfd_cookie);
|
||||
|
|
|
|||
|
|
@ -27,11 +27,15 @@
|
|||
#include <asm/pgtable.h>
|
||||
|
||||
|
||||
#define GXIO_MPIPE_INFO_OP_INSTANCE_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1250)
|
||||
#define GXIO_MPIPE_INFO_OP_ENUMERATE_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1251)
|
||||
#define GXIO_MPIPE_INFO_OP_GET_MMIO_BASE IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8000)
|
||||
#define GXIO_MPIPE_INFO_OP_CHECK_MMIO_OFFSET IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8001)
|
||||
|
||||
|
||||
int gxio_mpipe_info_instance_aux(gxio_mpipe_info_context_t * context,
|
||||
_gxio_mpipe_link_name_t name);
|
||||
|
||||
int gxio_mpipe_info_enumerate_aux(gxio_mpipe_info_context_t * context,
|
||||
unsigned int idx,
|
||||
_gxio_mpipe_link_name_t * name,
|
||||
|
|
|
|||
|
|
@ -220,6 +220,13 @@ typedef MPIPE_PDESC_t gxio_mpipe_idesc_t;
|
|||
*/
|
||||
typedef MPIPE_EDMA_DESC_t gxio_mpipe_edesc_t;
|
||||
|
||||
/*
|
||||
* Max # of mpipe instances. 2 currently.
|
||||
*/
|
||||
#define GXIO_MPIPE_INSTANCE_MAX HV_MPIPE_INSTANCE_MAX
|
||||
|
||||
#define NR_MPIPE_MAX GXIO_MPIPE_INSTANCE_MAX
|
||||
|
||||
/* Get the "va" field from an "idesc".
|
||||
*
|
||||
* This is the address at which the ingress hardware copied the first
|
||||
|
|
@ -311,6 +318,9 @@ typedef struct {
|
|||
/* File descriptor for calling up to Linux (and thus the HV). */
|
||||
int fd;
|
||||
|
||||
/* Corresponding mpipe instance #. */
|
||||
int instance;
|
||||
|
||||
/* The VA at which configuration registers are mapped. */
|
||||
char *mmio_cfg_base;
|
||||
|
||||
|
|
@ -810,7 +820,7 @@ extern int gxio_mpipe_alloc_edma_rings(gxio_mpipe_context_t *context,
|
|||
/* Initialize an eDMA ring, using the given memory and size.
|
||||
*
|
||||
* @param context An initialized mPIPE context.
|
||||
* @param ring The eDMA ring index.
|
||||
* @param ering The eDMA ring index.
|
||||
* @param channel The channel to use. This must be one of the channels
|
||||
* associated with the context's set of open links.
|
||||
* @param mem A physically contiguous region of memory to be filled
|
||||
|
|
@ -823,10 +833,37 @@ extern int gxio_mpipe_alloc_edma_rings(gxio_mpipe_context_t *context,
|
|||
* ::GXIO_ERR_INVAL_MEMORY_SIZE on failure.
|
||||
*/
|
||||
extern int gxio_mpipe_init_edma_ring(gxio_mpipe_context_t *context,
|
||||
unsigned int ring, unsigned int channel,
|
||||
unsigned int ering, unsigned int channel,
|
||||
void *mem, size_t mem_size,
|
||||
unsigned int mem_flags);
|
||||
|
||||
/* Set the "max_blks", "min_snf_blks", and "db" fields of
|
||||
* ::MPIPE_EDMA_RG_INIT_DAT_THRESH_t for a given edma ring.
|
||||
*
|
||||
* The global pool of dynamic blocks will be automatically adjusted.
|
||||
*
|
||||
* This function should not be called after any egress has been done
|
||||
* on the edma ring.
|
||||
*
|
||||
* Most applications should just use gxio_mpipe_equeue_set_snf_size().
|
||||
*
|
||||
* @param context An initialized mPIPE context.
|
||||
* @param ering The eDMA ring index.
|
||||
* @param max_blks The number of blocks to dedicate to the ring
|
||||
* (normally min_snf_blks + 1). Must be greater than min_snf_blocks.
|
||||
* @param min_snf_blks The number of blocks which must be stored
|
||||
* prior to starting to send the packet (normally 12).
|
||||
* @param db Whether to allow use of dynamic blocks by the ring
|
||||
* (normally 1).
|
||||
*
|
||||
* @return 0 on success, negative on error.
|
||||
*/
|
||||
extern int gxio_mpipe_config_edma_ring_blks(gxio_mpipe_context_t *context,
|
||||
unsigned int ering,
|
||||
unsigned int max_blks,
|
||||
unsigned int min_snf_blks,
|
||||
unsigned int db);
|
||||
|
||||
/*****************************************************************
|
||||
* Classifier Program *
|
||||
******************************************************************/
|
||||
|
|
@ -1288,15 +1325,39 @@ typedef struct {
|
|||
/* The log2() of the number of entries. */
|
||||
unsigned long log2_num_entries;
|
||||
|
||||
/* The context. */
|
||||
gxio_mpipe_context_t *context;
|
||||
|
||||
/* The ering. */
|
||||
unsigned int ering;
|
||||
|
||||
/* The channel. */
|
||||
unsigned int channel;
|
||||
|
||||
} gxio_mpipe_equeue_t;
|
||||
|
||||
/* Initialize an "equeue".
|
||||
*
|
||||
* Takes the equeue plus the same args as gxio_mpipe_init_edma_ring().
|
||||
* This function uses gxio_mpipe_init_edma_ring() to initialize the
|
||||
* underlying edma_ring using the provided arguments.
|
||||
*
|
||||
* @param equeue An egress queue to be initialized.
|
||||
* @param context An initialized mPIPE context.
|
||||
* @param ering The eDMA ring index.
|
||||
* @param channel The channel to use. This must be one of the channels
|
||||
* associated with the context's set of open links.
|
||||
* @param mem A physically contiguous region of memory to be filled
|
||||
* with a ring of ::gxio_mpipe_edesc_t structures.
|
||||
* @param mem_size Number of bytes in the ring. Must be 512, 2048,
|
||||
* 8192 or 65536, times 16 (i.e. sizeof(gxio_mpipe_edesc_t)).
|
||||
* @param mem_flags ::gxio_mpipe_mem_flags_e memory flags.
|
||||
*
|
||||
* @return 0 on success, ::GXIO_MPIPE_ERR_BAD_EDMA_RING or
|
||||
* ::GXIO_ERR_INVAL_MEMORY_SIZE on failure.
|
||||
*/
|
||||
extern int gxio_mpipe_equeue_init(gxio_mpipe_equeue_t *equeue,
|
||||
gxio_mpipe_context_t *context,
|
||||
unsigned int edma_ring_id,
|
||||
unsigned int ering,
|
||||
unsigned int channel,
|
||||
void *mem, unsigned int mem_size,
|
||||
unsigned int mem_flags);
|
||||
|
|
@ -1494,6 +1555,37 @@ static inline int gxio_mpipe_equeue_is_complete(gxio_mpipe_equeue_t *equeue,
|
|||
completion_slot, update);
|
||||
}
|
||||
|
||||
/* Set the snf (store and forward) size for an equeue.
|
||||
*
|
||||
* The snf size for an equeue defaults to 1536, and encodes the size
|
||||
* of the largest packet for which egress is guaranteed to avoid
|
||||
* transmission underruns and/or corrupt checksums under heavy load.
|
||||
*
|
||||
* The snf size affects a global resource pool which cannot support,
|
||||
* for example, all 24 equeues each requesting an snf size of 8K.
|
||||
*
|
||||
* To ensure that jumbo packets can be egressed properly, the snf size
|
||||
* should be set to the size of the largest possible packet, which
|
||||
* will usually be limited by the size of the app's largest buffer.
|
||||
*
|
||||
* This is a convenience wrapper around
|
||||
* gxio_mpipe_config_edma_ring_blks().
|
||||
*
|
||||
* This function should not be called after any egress has been done
|
||||
* on the equeue.
|
||||
*
|
||||
* @param equeue An egress queue initialized via gxio_mpipe_equeue_init().
|
||||
* @param size The snf size, in bytes.
|
||||
* @return Zero on success, negative error otherwise.
|
||||
*/
|
||||
static inline int gxio_mpipe_equeue_set_snf_size(gxio_mpipe_equeue_t *equeue,
|
||||
size_t size)
|
||||
{
|
||||
int blks = (size + 127) / 128;
|
||||
return gxio_mpipe_config_edma_ring_blks(equeue->context, equeue->ering,
|
||||
blks + 1, blks, 1);
|
||||
}
|
||||
|
||||
/*****************************************************************
|
||||
* Link Management *
|
||||
******************************************************************/
|
||||
|
|
@ -1634,6 +1726,24 @@ typedef struct {
|
|||
uint8_t mac;
|
||||
} gxio_mpipe_link_t;
|
||||
|
||||
/* Translate a link name to the instance number of the mPIPE shim which is
|
||||
* connected to that link. This call does not verify whether the link is
|
||||
* currently available, and does not reserve any link resources;
|
||||
* gxio_mpipe_link_open() must be called to perform those functions.
|
||||
*
|
||||
* Typically applications will call this function to translate a link name
|
||||
* to an mPIPE instance number; call gxio_mpipe_init(), passing it that
|
||||
* instance number, to initialize the mPIPE shim; and then call
|
||||
* gxio_mpipe_link_open(), passing it the same link name plus the mPIPE
|
||||
* context, to configure the link.
|
||||
*
|
||||
* @param link_name Name of the link; see @ref gxio_mpipe_link_names.
|
||||
* @return The mPIPE instance number which is associated with the named
|
||||
* link, or a negative error code (::GXIO_ERR_NO_DEVICE) if the link does
|
||||
* not exist.
|
||||
*/
|
||||
extern int gxio_mpipe_link_instance(const char *link_name);
|
||||
|
||||
/* Retrieve one of this system's legal link names, and its MAC address.
|
||||
*
|
||||
* @param index Link name index. If a system supports N legal link names,
|
||||
|
|
@ -1697,6 +1807,17 @@ static inline int gxio_mpipe_link_channel(gxio_mpipe_link_t *link)
|
|||
return link->channel;
|
||||
}
|
||||
|
||||
/* Set a link attribute.
|
||||
*
|
||||
* @param link A properly initialized link state object.
|
||||
* @param attr An attribute from the set of @ref gxio_mpipe_link_attrs.
|
||||
* @param val New value of the attribute.
|
||||
* @return 0 if the attribute was successfully set, or a negative error
|
||||
* code.
|
||||
*/
|
||||
extern int gxio_mpipe_link_set_attr(gxio_mpipe_link_t *link, uint32_t attr,
|
||||
int64_t val);
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Timestamp //
|
||||
///////////////////////////////////////////////////////////////////
|
||||
|
|
@ -1733,4 +1854,18 @@ extern int gxio_mpipe_set_timestamp(gxio_mpipe_context_t *context,
|
|||
extern int gxio_mpipe_adjust_timestamp(gxio_mpipe_context_t *context,
|
||||
int64_t delta);
|
||||
|
||||
/** Adjust the mPIPE timestamp clock frequency.
|
||||
*
|
||||
* @param context An initialized mPIPE context.
|
||||
* @param ppb A 32-bit signed PPB (Parts Per Billion) value to adjust.
|
||||
* The absolute value of ppb must be less than or equal to 1000000000.
|
||||
* Values less than about 30000 will generally cause a GXIO_ERR_INVAL
|
||||
* return due to the granularity of the hardware that converts reference
|
||||
* clock cycles into seconds and nanoseconds.
|
||||
* @return If the call was successful, zero; otherwise, a negative error
|
||||
* code.
|
||||
*/
|
||||
extern int gxio_mpipe_adjust_timestamp_freq(gxio_mpipe_context_t* context,
|
||||
int32_t ppb);
|
||||
|
||||
#endif /* !_GXIO_MPIPE_H_ */
|
||||
|
|
|
|||
|
|
@ -23,6 +23,9 @@
|
|||
#include <arch/mpipe_constants.h>
|
||||
|
||||
|
||||
/** Number of mPIPE instances supported */
|
||||
#define HV_MPIPE_INSTANCE_MAX (2)
|
||||
|
||||
/** Number of buffer stacks (32). */
|
||||
#define HV_MPIPE_NUM_BUFFER_STACKS \
|
||||
(MPIPE_MMIO_INIT_DAT_GX36_1__BUFFER_STACK_MASK_WIDTH)
|
||||
|
|
|
|||
Loading…
Reference in a new issue