aboutsummaryrefslogtreecommitdiff
path: root/sys/ofed
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2016-04-14 14:01:28 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2016-04-14 14:01:28 +0000
commit617e1ff301d5f426b3fea725d9f90cde2b1dc100 (patch)
tree270ae7d1c763f5674274e899c4ad4f3483080d77 /sys/ofed
parenta5de41c600f3cbf587ca87d44e96c8466e46302c (diff)
Notes
Diffstat (limited to 'sys/ofed')
-rw-r--r--sys/ofed/drivers/net/mlx4/en_tx.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/sys/ofed/drivers/net/mlx4/en_tx.c b/sys/ofed/drivers/net/mlx4/en_tx.c
index 4358aa631368..463efec9f125 100644
--- a/sys/ofed/drivers/net/mlx4/en_tx.c
+++ b/sys/ofed/drivers/net/mlx4/en_tx.c
@@ -457,7 +457,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);
@@ -473,6 +473,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;
@@ -494,6 +496,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))
@@ -1041,7 +1046,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))
@@ -1058,6 +1065,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;
@@ -1091,6 +1103,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);