Hey Roland,

I'm testing the Ammasso rnic on linus's latest (2.6.19-rc3+) and I'm
having problems with dma_map_single().  The systems are Intel Dempsey
processors (x86_64).  

The adapter seems to be dma'ing into the wrong memory.  The patch below
backs the usage of dma_map_single() back to using __pa() for converting
kernel virtual addresses (from kmalloc) into bus addresses, and things
work ok.  

So I'm wondering if the Ammasso driver is misusing dma_map_single()??

Or maybe the driver needs to do something at init time to request dma
mappings?

Any thoughts?


Steve.


---- hack to use __pa() instead of dma_map_single() ----


diff --git a/drivers/infiniband/hw/amso1100/c2_alloc.c 
b/drivers/infiniband/hw/amso1100/c2_alloc.c
index 028a60b..adf7fb3 100644
--- a/drivers/infiniband/hw/amso1100/c2_alloc.c
+++ b/drivers/infiniband/hw/amso1100/c2_alloc.c
@@ -47,8 +47,12 @@ static int c2_alloc_mqsp_chunk(struct c2
        if (new_head == NULL)
                return -ENOMEM;
 
+#if 0
        new_head->dma_addr = dma_map_single(c2dev->ibdev.dma_device, new_head,
                                            PAGE_SIZE, DMA_FROM_DEVICE);
+#else
+       new_head->dma_addr = __pa(new_head);
+#endif
        pci_unmap_addr_set(new_head, mapping, new_head->dma_addr);
 
        new_head->next = NULL;
diff --git a/drivers/infiniband/hw/amso1100/c2_cq.c 
b/drivers/infiniband/hw/amso1100/c2_cq.c
index 9d7bcc5..f3452f1 100644
--- a/drivers/infiniband/hw/amso1100/c2_cq.c
+++ b/drivers/infiniband/hw/amso1100/c2_cq.c
@@ -270,10 +270,13 @@ static int c2_alloc_cq_buf(struct c2_dev
                       (u8 *) pool_start,
                       NULL,    /* peer (currently unknown) */
                       C2_MQ_HOST_TARGET);
-
+#if 0
        mq->host_dma = dma_map_single(c2dev->ibdev.dma_device,
                                      (void *)pool_start,
                                      q_size * msg_size, DMA_FROM_DEVICE);
+#else
+       mq->host_dma = __pa(pool_start);
+#endif
        pci_unmap_addr_set(mq, mapping, mq->host_dma);
 
        return 0;
diff --git a/drivers/infiniband/hw/amso1100/c2_rnic.c 
b/drivers/infiniband/hw/amso1100/c2_rnic.c
index 30409e1..d2f9344 100644
--- a/drivers/infiniband/hw/amso1100/c2_rnic.c
+++ b/drivers/infiniband/hw/amso1100/c2_rnic.c
@@ -522,9 +522,13 @@ int c2_rnic_init(struct c2_dev *c2dev)
                err = -ENOMEM;
                goto bail1;
        }
+#if 0
        c2dev->rep_vq.host_dma = dma_map_single(c2dev->ibdev.dma_device,
                                                (void *)q1_pages, qsize * 
msgsize,
                                                DMA_FROM_DEVICE);
+#else
+       c2dev->rep_vq.host_dma = __pa(q1_pages);
+#endif
        pci_unmap_addr_set(&c2dev->rep_vq, mapping, c2dev->rep_vq.host_dma);
        pr_debug("%s rep_vq va %p dma %llx\n", __FUNCTION__, q1_pages,
                 (unsigned long long) c2dev->rep_vq.host_dma);
@@ -545,9 +549,13 @@ int c2_rnic_init(struct c2_dev *c2dev)
                err = -ENOMEM;
                goto bail2;
        }
+#if 0
        c2dev->aeq.host_dma = dma_map_single(c2dev->ibdev.dma_device,
                                                (void *)q2_pages, qsize * 
msgsize,
                                                DMA_FROM_DEVICE);
+#else
+       c2dev->aeq.host_dma = __pa(q2_pages);
+#endif
        pci_unmap_addr_set(&c2dev->aeq, mapping, c2dev->aeq.host_dma);
        pr_debug("%s aeq va %p dma %llx\n", __FUNCTION__, q1_pages,
                 (unsigned long long) c2dev->rep_vq.host_dma);



_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to