X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=kernel%2Flinux%2Fkni%2Fkni_misc.c;h=2b464c438113f0379073373ecea13a2c7bb32551;hb=56bb5841fd0608989101d933f091852a3126b4fe;hp=84ef03b5f8b06cfa49ed40f9476194dba4c4ab56;hpb=49e7e2dee3f05bb3ba2e14cea5318915a3b47f59;p=dpdk.git diff --git a/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c index 84ef03b5f8..2b464c4381 100644 --- a/kernel/linux/kni/kni_misc.c +++ b/kernel/linux/kni/kni_misc.c @@ -39,7 +39,7 @@ static uint32_t multiple_kthread_on; /* Default carrier state for created KNI network interfaces */ static char *carrier; -uint32_t dflt_carrier; +uint32_t kni_dflt_carrier; #define KNI_DEV_IN_USE_BIT_NUM 0 /* Bit number for device in use */ @@ -348,15 +348,36 @@ kni_ioctl_create(struct net *net, uint32_t ioctl_num, strncpy(kni->name, dev_info.name, RTE_KNI_NAMESIZE); /* Translate user space info into kernel space info */ - kni->tx_q = phys_to_virt(dev_info.tx_phys); - kni->rx_q = phys_to_virt(dev_info.rx_phys); - kni->alloc_q = phys_to_virt(dev_info.alloc_phys); - kni->free_q = phys_to_virt(dev_info.free_phys); + if (dev_info.iova_mode) { +#ifdef HAVE_IOVA_TO_KVA_MAPPING_SUPPORT + kni->tx_q = iova_to_kva(current, dev_info.tx_phys); + kni->rx_q = iova_to_kva(current, dev_info.rx_phys); + kni->alloc_q = iova_to_kva(current, dev_info.alloc_phys); + kni->free_q = iova_to_kva(current, dev_info.free_phys); + + kni->req_q = iova_to_kva(current, dev_info.req_phys); + kni->resp_q = iova_to_kva(current, dev_info.resp_phys); + kni->sync_va = dev_info.sync_va; + kni->sync_kva = iova_to_kva(current, dev_info.sync_phys); + kni->usr_tsk = current; + kni->iova_mode = 1; +#else + pr_err("KNI module does not support IOVA to VA translation\n"); + return -EINVAL; +#endif + } else { + + kni->tx_q = phys_to_virt(dev_info.tx_phys); + kni->rx_q = phys_to_virt(dev_info.rx_phys); + kni->alloc_q = phys_to_virt(dev_info.alloc_phys); + kni->free_q = phys_to_virt(dev_info.free_phys); - kni->req_q = phys_to_virt(dev_info.req_phys); - kni->resp_q = phys_to_virt(dev_info.resp_phys); - kni->sync_va = dev_info.sync_va; - kni->sync_kva = phys_to_virt(dev_info.sync_phys); + kni->req_q = phys_to_virt(dev_info.req_phys); + kni->resp_q = phys_to_virt(dev_info.resp_phys); + kni->sync_va = dev_info.sync_va; + kni->sync_kva = phys_to_virt(dev_info.sync_phys); + kni->iova_mode = 0; + } kni->mbuf_size = dev_info.mbuf_size; @@ -533,14 +554,14 @@ static int __init kni_parse_carrier_state(void) { if (!carrier) { - dflt_carrier = 0; + kni_dflt_carrier = 0; return 0; } if (strcmp(carrier, "off") == 0) - dflt_carrier = 0; + kni_dflt_carrier = 0; else if (strcmp(carrier, "on") == 0) - dflt_carrier = 1; + kni_dflt_carrier = 1; else return -1; @@ -567,7 +588,7 @@ kni_init(void) return -EINVAL; } - if (dflt_carrier == 0) + if (kni_dflt_carrier == 0) pr_debug("Default carrier state set to off.\n"); else pr_debug("Default carrier state set to on.\n");