|
@@ -191,6 +191,9 @@ static void *__frame_ptr;
|
|
static u32 *frame_ptr;
|
|
static u32 *frame_ptr;
|
|
static dma_addr_t frame_dma;
|
|
static dma_addr_t frame_dma;
|
|
|
|
|
|
|
|
+/* needed for dma_map*() */
|
|
|
|
+static const struct qm_portal_config *pcfg;
|
|
|
|
+
|
|
/* the main function waits on this */
|
|
/* the main function waits on this */
|
|
static DECLARE_WAIT_QUEUE_HEAD(queue);
|
|
static DECLARE_WAIT_QUEUE_HEAD(queue);
|
|
|
|
|
|
@@ -210,16 +213,14 @@ static int allocate_frame_data(void)
|
|
{
|
|
{
|
|
u32 lfsr = HP_FIRST_WORD;
|
|
u32 lfsr = HP_FIRST_WORD;
|
|
int loop;
|
|
int loop;
|
|
- struct platform_device *pdev = platform_device_alloc("foobar", -1);
|
|
|
|
|
|
|
|
- if (!pdev) {
|
|
|
|
- pr_crit("platform_device_alloc() failed");
|
|
|
|
- return -EIO;
|
|
|
|
- }
|
|
|
|
- if (platform_device_add(pdev)) {
|
|
|
|
- pr_crit("platform_device_add() failed");
|
|
|
|
|
|
+ if (!qman_dma_portal) {
|
|
|
|
+ pr_crit("portal not available\n");
|
|
return -EIO;
|
|
return -EIO;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ pcfg = qman_get_qm_portal_config(qman_dma_portal);
|
|
|
|
+
|
|
__frame_ptr = kmalloc(4 * HP_NUM_WORDS, GFP_KERNEL);
|
|
__frame_ptr = kmalloc(4 * HP_NUM_WORDS, GFP_KERNEL);
|
|
if (!__frame_ptr)
|
|
if (!__frame_ptr)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
@@ -229,15 +230,22 @@ static int allocate_frame_data(void)
|
|
frame_ptr[loop] = lfsr;
|
|
frame_ptr[loop] = lfsr;
|
|
lfsr = do_lfsr(lfsr);
|
|
lfsr = do_lfsr(lfsr);
|
|
}
|
|
}
|
|
- frame_dma = dma_map_single(&pdev->dev, frame_ptr, 4 * HP_NUM_WORDS,
|
|
|
|
|
|
+
|
|
|
|
+ frame_dma = dma_map_single(pcfg->dev, frame_ptr, 4 * HP_NUM_WORDS,
|
|
DMA_BIDIRECTIONAL);
|
|
DMA_BIDIRECTIONAL);
|
|
- platform_device_del(pdev);
|
|
|
|
- platform_device_put(pdev);
|
|
|
|
|
|
+ if (dma_mapping_error(pcfg->dev, frame_dma)) {
|
|
|
|
+ pr_crit("dma mapping failure\n");
|
|
|
|
+ kfree(__frame_ptr);
|
|
|
|
+ return -EIO;
|
|
|
|
+ }
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
static void deallocate_frame_data(void)
|
|
static void deallocate_frame_data(void)
|
|
{
|
|
{
|
|
|
|
+ dma_unmap_single(pcfg->dev, frame_dma, 4 * HP_NUM_WORDS,
|
|
|
|
+ DMA_BIDIRECTIONAL);
|
|
kfree(__frame_ptr);
|
|
kfree(__frame_ptr);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -249,7 +257,8 @@ static inline int process_frame_data(struct hp_handler *handler,
|
|
int loop;
|
|
int loop;
|
|
|
|
|
|
if (qm_fd_addr_get64(fd) != handler->addr) {
|
|
if (qm_fd_addr_get64(fd) != handler->addr) {
|
|
- pr_crit("bad frame address");
|
|
|
|
|
|
+ pr_crit("bad frame address, [%llX != %llX]\n",
|
|
|
|
+ qm_fd_addr_get64(fd), handler->addr);
|
|
return -EIO;
|
|
return -EIO;
|
|
}
|
|
}
|
|
for (loop = 0; loop < HP_NUM_WORDS; loop++, p++) {
|
|
for (loop = 0; loop < HP_NUM_WORDS; loop++, p++) {
|