return NULL;
 }
 
+static void ipoib_cm_free_rx_ring(struct net_device *dev,
+                                 struct ipoib_cm_rx_buf *rx_ring)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       int i;
+
+       for (i = 0; i < ipoib_recvq_size; ++i)
+               if (rx_ring[i].skb) {
+                       ipoib_cm_dma_unmap_rx(priv, IPOIB_CM_RX_SG - 1,
+                                             rx_ring[i].mapping);
+                       dev_kfree_skb_any(rx_ring[i].skb);
+               }
+
+       kfree(rx_ring);
+}
+
 static void ipoib_cm_start_rx_drain(struct ipoib_dev_priv *priv)
 {
        struct ib_send_wr *bad_wr;
 void ipoib_cm_dev_cleanup(struct net_device *dev)
 {
        struct ipoib_dev_priv *priv = netdev_priv(dev);
-       int i, ret;
+       int ret;
 
        if (!priv->cm.srq)
                return;
        priv->cm.srq = NULL;
        if (!priv->cm.srq_ring)
                return;
-       for (i = 0; i < ipoib_recvq_size; ++i)
-               if (priv->cm.srq_ring[i].skb) {
-                       ipoib_cm_dma_unmap_rx(priv, IPOIB_CM_RX_SG - 1,
-                                             priv->cm.srq_ring[i].mapping);
-                       dev_kfree_skb_any(priv->cm.srq_ring[i].skb);
-                       priv->cm.srq_ring[i].skb = NULL;
-               }
-       kfree(priv->cm.srq_ring);
+
+       ipoib_cm_free_rx_ring(dev, priv->cm.srq_ring);
        priv->cm.srq_ring = NULL;
 }