dev_info(dev, "replenish pools failure\n");
        pool->free_map[pool->next_free] = index;
        pool->rx_buff[index].skb = NULL;
-       if (!dma_mapping_error(dev, dma_addr))
-               dma_unmap_single(dev, dma_addr, pool->buff_size,
-                                DMA_FROM_DEVICE);
 
        dev_kfree_skb_any(skb);
        adapter->replenish_add_buff_failure++;
        union sub_crq *next;
        int index;
        int i, j;
-       u8 first;
+       u8 *first;
 
 restart_loop:
        while (pending_scrq(adapter, scrq)) {
                                txbuff->data_dma[j] = 0;
                        }
                        /* if sub_crq was sent indirectly */
-                       first = txbuff->indir_arr[0].generic.first;
-                       if (first == IBMVNIC_CRQ_CMD) {
+                       first = &txbuff->indir_arr[0].generic.first;
+                       if (*first == IBMVNIC_CRQ_CMD) {
                                dma_unmap_single(dev, txbuff->indir_dma,
                                                 sizeof(txbuff->indir_arr),
                                                 DMA_TO_DEVICE);
+                               *first = 0;
                        }
 
                        if (txbuff->last_frag) {
        int i;
 
        dma_unmap_single(dev, adapter->login_buf_token, adapter->login_buf_sz,
-                        DMA_BIDIRECTIONAL);
+                        DMA_TO_DEVICE);
        dma_unmap_single(dev, adapter->login_rsp_buf_token,
-                        adapter->login_rsp_buf_sz, DMA_BIDIRECTIONAL);
+                        adapter->login_rsp_buf_sz, DMA_FROM_DEVICE);
 
        /* If the number of queues requested can't be allocated by the
         * server, the login response will return with code 1. We will need