mlx4en: Add support for netdump.
Implement the needed callback functions and support for polling the driver. Differential Revision: https://reviews.freebsd.org/D15259 Approved by: hselasky (mentor) MFC after: 1 week Sponsored by: Mellanox Technologies
This commit is contained in:
parent
b7d573c5a4
commit
63d7a8d9a8
@ -101,4 +101,7 @@ static inline u64 mlx4_mac_to_u64(const u8 *addr)
|
||||
return mac;
|
||||
}
|
||||
|
||||
void mlx4_disable_interrupts(struct mlx4_dev *);
|
||||
void mlx4_poll_interrupts(struct mlx4_dev *);
|
||||
|
||||
#endif /* MLX4_DRIVER_H */
|
||||
|
@ -1535,3 +1535,34 @@ void mlx4_release_eq(struct mlx4_dev *dev, int vec)
|
||||
}
|
||||
EXPORT_SYMBOL(mlx4_release_eq);
|
||||
|
||||
void
|
||||
mlx4_disable_interrupts(struct mlx4_dev *dev)
|
||||
{
|
||||
struct mlx4_priv *priv = container_of(dev, struct mlx4_priv, dev);
|
||||
int i;
|
||||
|
||||
if (dev->flags & MLX4_FLAG_MSI_X) {
|
||||
for (i = 0; i < (dev->caps.num_comp_vectors + 1); ++i)
|
||||
disable_irq(priv->eq_table.eq[i].irq);
|
||||
} else {
|
||||
disable_irq(dev->persist->pdev->irq);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mlx4_disable_interrupts);
|
||||
|
||||
void
|
||||
mlx4_poll_interrupts(struct mlx4_dev *dev)
|
||||
{
|
||||
struct mlx4_priv *priv = container_of(dev, struct mlx4_priv, dev);
|
||||
int i;
|
||||
|
||||
if (dev->flags & MLX4_FLAG_MSI_X) {
|
||||
for (i = 0; i < (dev->caps.num_comp_vectors + 1); ++i) {
|
||||
mlx4_msi_x_interrupt(priv->eq_table.eq[i].irq,
|
||||
priv->eq_table.eq + i);
|
||||
}
|
||||
} else {
|
||||
mlx4_interrupt(dev->persist->pdev->irq, dev);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mlx4_poll_interrupts);
|
||||
|
@ -54,6 +54,7 @@
|
||||
#include <dev/mlx4/cmd.h>
|
||||
|
||||
#include <netinet/tcp_lro.h>
|
||||
#include <netinet/netdump/netdump.h>
|
||||
|
||||
#include "en_port.h"
|
||||
#include <dev/mlx4/stats.h>
|
||||
@ -784,6 +785,7 @@ int mlx4_en_arm_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq);
|
||||
void mlx4_en_tx_irq(struct mlx4_cq *mcq);
|
||||
u16 mlx4_en_select_queue(struct net_device *dev, struct mbuf *mb);
|
||||
|
||||
int mlx4_en_xmit(struct mlx4_en_priv *priv, int tx_ind, struct mbuf **mbp);
|
||||
int mlx4_en_transmit(struct ifnet *dev, struct mbuf *m);
|
||||
int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
|
||||
struct mlx4_en_tx_ring **pring,
|
||||
|
@ -53,6 +53,8 @@
|
||||
#include "en.h"
|
||||
#include "en_port.h"
|
||||
|
||||
NETDUMP_DEFINE(mlx4_en);
|
||||
|
||||
static void mlx4_en_sysctl_stat(struct mlx4_en_priv *priv);
|
||||
static void mlx4_en_sysctl_conf(struct mlx4_en_priv *priv);
|
||||
|
||||
@ -2311,6 +2313,8 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,
|
||||
ifmedia_add(&priv->media, IFM_ETHER | IFM_AUTO, 0, NULL);
|
||||
ifmedia_set(&priv->media, IFM_ETHER | IFM_AUTO);
|
||||
|
||||
NETDUMP_SET(dev, mlx4_en);
|
||||
|
||||
en_warn(priv, "Using %d TX rings\n", prof->tx_ring_num);
|
||||
en_warn(priv, "Using %d RX rings\n", prof->rx_ring_num);
|
||||
|
||||
@ -2892,3 +2896,54 @@ static void mlx4_en_sysctl_stat(struct mlx4_en_priv *priv)
|
||||
CTLFLAG_RD, &rx_ring->errors, 0, "RX soft errors");
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NETDUMP
|
||||
static void
|
||||
mlx4_en_netdump_init(struct ifnet *dev, int *nrxr, int *ncl, int *clsize)
|
||||
{
|
||||
struct mlx4_en_priv *priv;
|
||||
|
||||
priv = if_getsoftc(dev);
|
||||
mutex_lock(&priv->mdev->state_lock);
|
||||
*nrxr = priv->rx_ring_num;
|
||||
*ncl = NETDUMP_MAX_IN_FLIGHT;
|
||||
*clsize = priv->rx_mb_size;
|
||||
mutex_unlock(&priv->mdev->state_lock);
|
||||
}
|
||||
|
||||
static void
|
||||
mlx4_en_netdump_event(struct ifnet *dev, enum netdump_ev event)
|
||||
{
|
||||
}
|
||||
|
||||
static int
|
||||
mlx4_en_netdump_transmit(struct ifnet *dev, struct mbuf *m)
|
||||
{
|
||||
struct mlx4_en_priv *priv;
|
||||
int err;
|
||||
|
||||
priv = if_getsoftc(dev);
|
||||
if ((if_getdrvflags(dev) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
|
||||
IFF_DRV_RUNNING || !priv->link_state)
|
||||
return (ENOENT);
|
||||
|
||||
err = mlx4_en_xmit(priv, 0, &m);
|
||||
if (err != 0 && m != NULL)
|
||||
m_freem(m);
|
||||
return (err);
|
||||
}
|
||||
|
||||
static int
|
||||
mlx4_en_netdump_poll(struct ifnet *dev, int count)
|
||||
{
|
||||
struct mlx4_en_priv *priv;
|
||||
|
||||
priv = if_getsoftc(dev);
|
||||
if ((if_getdrvflags(dev) & IFF_DRV_RUNNING) == 0 || !priv->link_state)
|
||||
return (ENOENT);
|
||||
|
||||
mlx4_poll_interrupts(priv->mdev->dev);
|
||||
|
||||
return (0);
|
||||
}
|
||||
#endif /* NETDUMP */
|
||||
|
@ -628,7 +628,7 @@ static void mlx4_bf_copy(void __iomem *dst, volatile unsigned long *src, unsigne
|
||||
__iowrite64_copy(dst, __DEVOLATILE(void *, src), bytecnt / 8);
|
||||
}
|
||||
|
||||
static int mlx4_en_xmit(struct mlx4_en_priv *priv, int tx_ind, struct mbuf **mbp)
|
||||
int mlx4_en_xmit(struct mlx4_en_priv *priv, int tx_ind, struct mbuf **mbp)
|
||||
{
|
||||
enum {
|
||||
DS_FACT = TXBB_SIZE / DS_SIZE_ALIGNMENT,
|
||||
|
Loading…
x
Reference in New Issue
Block a user