summaryrefslogtreecommitdiffstats
path: root/sys/ofed
diff options
context:
space:
mode:
Diffstat (limited to 'sys/ofed')
-rw-r--r--sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c9
-rw-r--r--sys/ofed/drivers/net/mlx4/en_netdev.c4
-rw-r--r--sys/ofed/drivers/net/mlx4/en_rx.c18
-rw-r--r--sys/ofed/drivers/net/mlx4/en_tx.c19
-rw-r--r--sys/ofed/drivers/net/mlx4/mlx4_en.h7
5 files changed, 36 insertions, 21 deletions
diff --git a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c
index 2a93269..7ba90d1 100644
--- a/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+++ b/sys/ofed/drivers/infiniband/ulp/ipoib/ipoib_cm.c
@@ -481,6 +481,8 @@ void ipoib_cm_handle_rx_wc(struct ipoib_dev_priv *priv, struct ib_wc *wc)
int has_srq;
u_short proto;
+ CURVNET_SET_QUIET(dev->if_vnet);
+
ipoib_dbg_data(priv, "cm recv completion: id %d, status: %d\n",
wr_id, wc->status);
@@ -496,7 +498,7 @@ void ipoib_cm_handle_rx_wc(struct ipoib_dev_priv *priv, struct ib_wc *wc)
} else
ipoib_warn(priv, "cm recv completion event with wrid %d (> %d)\n",
wr_id, ipoib_recvq_size);
- return;
+ goto done;
}
p = wc->qp->qp_context;
@@ -520,7 +522,7 @@ void ipoib_cm_handle_rx_wc(struct ipoib_dev_priv *priv, struct ib_wc *wc)
queue_work(ipoib_workqueue, &priv->cm.rx_reap_task);
spin_unlock(&priv->lock);
}
- return;
+ goto done;
}
}
@@ -579,6 +581,9 @@ repost:
"for buf %d\n", wr_id);
}
}
+done:
+ CURVNET_RESTORE();
+ return;
}
static inline int post_send(struct ipoib_dev_priv *priv,
diff --git a/sys/ofed/drivers/net/mlx4/en_netdev.c b/sys/ofed/drivers/net/mlx4/en_netdev.c
index a9d87bb..8a49a36 100644
--- a/sys/ofed/drivers/net/mlx4/en_netdev.c
+++ b/sys/ofed/drivers/net/mlx4/en_netdev.c
@@ -1244,10 +1244,6 @@ int mlx4_en_start_port(struct net_device *dev)
/* Calculate Rx buf size */
dev->if_mtu = min(dev->if_mtu, priv->max_mtu);
mlx4_en_calc_rx_buf(dev);
- priv->rx_alloc_size = max_t(int, 2 * roundup_pow_of_two(priv->rx_mb_size),
- PAGE_SIZE);
- priv->rx_alloc_order = get_order(priv->rx_alloc_size);
- priv->rx_buf_size = roundup_pow_of_two(priv->rx_mb_size);
en_dbg(DRV, priv, "Rx buf size:%d\n", priv->rx_mb_size);
/* Configure rx cq's and rings */
diff --git a/sys/ofed/drivers/net/mlx4/en_rx.c b/sys/ofed/drivers/net/mlx4/en_rx.c
index 3691662..7d734f4 100644
--- a/sys/ofed/drivers/net/mlx4/en_rx.c
+++ b/sys/ofed/drivers/net/mlx4/en_rx.c
@@ -55,7 +55,7 @@ static void mlx4_en_init_rx_desc(struct mlx4_en_priv *priv,
int i;
/* Set size and memtype fields */
- rx_desc->data[0].byte_count = cpu_to_be32(priv->rx_mb_size);
+ rx_desc->data[0].byte_count = cpu_to_be32(priv->rx_mb_size - MLX4_NET_IP_ALIGN);
rx_desc->data[0].lkey = cpu_to_be32(priv->mdev->mr.key);
/*
@@ -87,7 +87,10 @@ mlx4_en_alloc_buf(struct mlx4_en_rx_ring *ring,
if (unlikely(mb == NULL))
return (-ENOMEM);
/* setup correct length */
- mb->m_len = ring->rx_mb_size;
+ mb->m_pkthdr.len = mb->m_len = ring->rx_mb_size;
+
+ /* make sure IP header gets aligned */
+ m_adj(mb, MLX4_NET_IP_ALIGN);
/* load spare mbuf into BUSDMA */
err = -bus_dmamap_load_mbuf_sg(ring->dma_tag, ring->spare.dma_map,
@@ -117,7 +120,10 @@ mlx4_en_alloc_buf(struct mlx4_en_rx_ring *ring,
goto use_spare;
/* setup correct length */
- mb->m_len = ring->rx_mb_size;
+ mb->m_pkthdr.len = mb->m_len = ring->rx_mb_size;
+
+ /* make sure IP header gets aligned */
+ m_adj(mb, MLX4_NET_IP_ALIGN);
err = -bus_dmamap_load_mbuf_sg(ring->dma_tag, mb_list->dma_map,
mb, segs, &nsegs, BUS_DMA_NOWAIT);
@@ -249,7 +255,8 @@ static void mlx4_en_free_rx_buf(struct mlx4_en_priv *priv,
void mlx4_en_calc_rx_buf(struct net_device *dev)
{
struct mlx4_en_priv *priv = netdev_priv(dev);
- int eff_mtu = dev->if_mtu + ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN;
+ int eff_mtu = dev->if_mtu + ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN +
+ MLX4_NET_IP_ALIGN;
if (eff_mtu > MJUM16BYTES) {
en_err(priv, "MTU(%d) is too big\n", (int)dev->if_mtu);
@@ -384,9 +391,6 @@ int mlx4_en_activate_rx_rings(struct mlx4_en_priv *priv)
ring->cons = 0;
ring->actual_size = 0;
ring->cqn = priv->rx_cq[ring_ind]->mcq.cqn;
- ring->rx_alloc_order = priv->rx_alloc_order;
- ring->rx_alloc_size = priv->rx_alloc_size;
- ring->rx_buf_size = priv->rx_buf_size;
ring->rx_mb_size = priv->rx_mb_size;
ring->stride = stride;
diff --git a/sys/ofed/drivers/net/mlx4/en_tx.c b/sys/ofed/drivers/net/mlx4/en_tx.c
index 3614b0d..e9526c4 100644
--- a/sys/ofed/drivers/net/mlx4/en_tx.c
+++ b/sys/ofed/drivers/net/mlx4/en_tx.c
@@ -458,7 +458,7 @@ void mlx4_en_tx_irq(struct mlx4_cq *mcq)
struct mlx4_en_priv *priv = netdev_priv(cq->dev);
struct mlx4_en_tx_ring *ring = priv->tx_ring[cq->ring];
- if (!spin_trylock(&ring->comp_lock))
+ if (priv->port_up == 0 || !spin_trylock(&ring->comp_lock))
return;
mlx4_en_process_tx_cq(cq->dev, cq);
mod_timer(&cq->timer, jiffies + 1);
@@ -474,6 +474,8 @@ void mlx4_en_poll_tx_cq(unsigned long data)
INC_PERF_COUNTER(priv->pstats.tx_poll);
+ if (priv->port_up == 0)
+ return;
if (!spin_trylock(&ring->comp_lock)) {
mod_timer(&cq->timer, jiffies + MLX4_EN_TX_POLL_TIMEOUT);
return;
@@ -495,6 +497,9 @@ static inline void mlx4_en_xmit_poll(struct mlx4_en_priv *priv, int tx_ind)
struct mlx4_en_cq *cq = priv->tx_cq[tx_ind];
struct mlx4_en_tx_ring *ring = priv->tx_ring[tx_ind];
+ if (priv->port_up == 0)
+ return;
+
/* If we don't have a pending timer, set one up to catch our recent
post in case the interface becomes idle */
if (!timer_pending(&cq->timer))
@@ -1038,7 +1043,9 @@ mlx4_en_tx_que(void *context, int pending)
priv = dev->if_softc;
tx_ind = cq->ring;
ring = priv->tx_ring[tx_ind];
- if (dev->if_drv_flags & IFF_DRV_RUNNING) {
+
+ if (priv->port_up != 0 &&
+ (dev->if_drv_flags & IFF_DRV_RUNNING) != 0) {
mlx4_en_xmit_poll(priv, tx_ind);
spin_lock(&ring->tx_lock);
if (!drbr_empty(dev, ring->br))
@@ -1055,6 +1062,11 @@ mlx4_en_transmit(struct ifnet *dev, struct mbuf *m)
struct mlx4_en_cq *cq;
int i, err = 0;
+ if (priv->port_up == 0) {
+ m_freem(m);
+ return (ENETDOWN);
+ }
+
/* Compute which queue to use */
if (M_HASHTYPE_GET(m) != M_HASHTYPE_NONE) {
i = (m->m_pkthdr.flowid % 128) % priv->tx_ring_num;
@@ -1088,6 +1100,9 @@ mlx4_en_qflush(struct ifnet *dev)
struct mlx4_en_tx_ring *ring;
struct mbuf *m;
+ if (priv->port_up == 0)
+ return;
+
for (int i = 0; i < priv->tx_ring_num; i++) {
ring = priv->tx_ring[i];
spin_lock(&ring->tx_lock);
diff --git a/sys/ofed/drivers/net/mlx4/mlx4_en.h b/sys/ofed/drivers/net/mlx4/mlx4_en.h
index c776b0e..35829e4 100644
--- a/sys/ofed/drivers/net/mlx4/mlx4_en.h
+++ b/sys/ofed/drivers/net/mlx4/mlx4_en.h
@@ -69,6 +69,7 @@
#define MLX4_EN_PAGE_SHIFT 12
#define MLX4_EN_PAGE_SIZE (1 << MLX4_EN_PAGE_SHIFT)
+#define MLX4_NET_IP_ALIGN 2 /* bytes */
#define DEF_RX_RINGS 16
#define MAX_RX_RINGS 128
#define MIN_RX_RINGS 4
@@ -315,9 +316,6 @@ struct mlx4_en_rx_ring {
u32 cons;
u32 buf_size;
u8 fcs_del;
- u16 rx_alloc_order;
- u32 rx_alloc_size;
- u32 rx_buf_size;
u32 rx_mb_size;
int qpn;
u8 *buf;
@@ -556,9 +554,6 @@ struct mlx4_en_priv {
u32 tx_ring_num;
u32 rx_ring_num;
u32 rx_mb_size;
- u16 rx_alloc_order;
- u32 rx_alloc_size;
- u32 rx_buf_size;
struct mlx4_en_tx_ring **tx_ring;
struct mlx4_en_rx_ring *rx_ring[MAX_RX_RINGS];
OpenPOWER on IntegriCloud