1d81734caSHemant Agrawal /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
223df3960SShreyansh Jain *
323df3960SShreyansh Jain * Copyright 2011-2016 Freescale Semiconductor Inc.
4*0ca2093fSRohit Raj * Copyright 2017,2020,2022,2024 NXP
523df3960SShreyansh Jain *
623df3960SShreyansh Jain */
723df3960SShreyansh Jain #include <assert.h>
823df3960SShreyansh Jain #include <fcntl.h>
923df3960SShreyansh Jain #include <unistd.h>
1023df3960SShreyansh Jain #include <sys/ioctl.h>
117a292619SRohit Raj #include <rte_ethdev.h>
1223df3960SShreyansh Jain
1323df3960SShreyansh Jain #include "process.h"
1423df3960SShreyansh Jain
1523df3960SShreyansh Jain #include <fsl_usd.h>
160fcdbde0SHemant Agrawal #include "rte_dpaa_logs.h"
1723df3960SShreyansh Jain
1823df3960SShreyansh Jain /* As higher-level drivers will be built on top of this (dma_mem, qbman, ...),
1923df3960SShreyansh Jain * it's preferable that the process driver itself not provide any exported API.
2023df3960SShreyansh Jain * As such, combined with the fact that none of these operations are
2123df3960SShreyansh Jain * performance critical, it is justified to use lazy initialisation, so that's
2223df3960SShreyansh Jain * what the lock is for.
2323df3960SShreyansh Jain */
2423df3960SShreyansh Jain static int fd = -1;
2523df3960SShreyansh Jain static pthread_mutex_t fd_init_lock = PTHREAD_MUTEX_INITIALIZER;
2623df3960SShreyansh Jain
check_fd(void)2723df3960SShreyansh Jain static int check_fd(void)
2823df3960SShreyansh Jain {
2923df3960SShreyansh Jain int ret;
3023df3960SShreyansh Jain
3123df3960SShreyansh Jain ret = pthread_mutex_lock(&fd_init_lock);
3223df3960SShreyansh Jain assert(!ret);
33*0ca2093fSRohit Raj
3423df3960SShreyansh Jain /* check again with the lock held */
3523df3960SShreyansh Jain if (fd < 0)
3623df3960SShreyansh Jain fd = open(PROCESS_PATH, O_RDWR);
37*0ca2093fSRohit Raj
3823df3960SShreyansh Jain ret = pthread_mutex_unlock(&fd_init_lock);
3923df3960SShreyansh Jain assert(!ret);
40*0ca2093fSRohit Raj
4123df3960SShreyansh Jain return (fd >= 0) ? 0 : -ENODEV;
4223df3960SShreyansh Jain }
4323df3960SShreyansh Jain
4423df3960SShreyansh Jain #define DPAA_IOCTL_MAGIC 'u'
4523df3960SShreyansh Jain struct dpaa_ioctl_id_alloc {
4623df3960SShreyansh Jain uint32_t base; /* Return value, the start of the allocated range */
4723df3960SShreyansh Jain enum dpaa_id_type id_type; /* what kind of resource(s) to allocate */
4823df3960SShreyansh Jain uint32_t num; /* how many IDs to allocate (and return value) */
4923df3960SShreyansh Jain uint32_t align; /* must be a power of 2, 0 is treated like 1 */
5023df3960SShreyansh Jain int partial; /* whether to allow less than 'num' */
5123df3960SShreyansh Jain };
5223df3960SShreyansh Jain
5323df3960SShreyansh Jain struct dpaa_ioctl_id_release {
5423df3960SShreyansh Jain /* Input; */
5523df3960SShreyansh Jain enum dpaa_id_type id_type;
5623df3960SShreyansh Jain uint32_t base;
5723df3960SShreyansh Jain uint32_t num;
5823df3960SShreyansh Jain };
5923df3960SShreyansh Jain
6023df3960SShreyansh Jain struct dpaa_ioctl_id_reserve {
6123df3960SShreyansh Jain enum dpaa_id_type id_type;
6223df3960SShreyansh Jain uint32_t base;
6323df3960SShreyansh Jain uint32_t num;
6423df3960SShreyansh Jain };
6523df3960SShreyansh Jain
6623df3960SShreyansh Jain #define DPAA_IOCTL_ID_ALLOC \
6723df3960SShreyansh Jain _IOWR(DPAA_IOCTL_MAGIC, 0x01, struct dpaa_ioctl_id_alloc)
6823df3960SShreyansh Jain #define DPAA_IOCTL_ID_RELEASE \
6923df3960SShreyansh Jain _IOW(DPAA_IOCTL_MAGIC, 0x02, struct dpaa_ioctl_id_release)
7023df3960SShreyansh Jain #define DPAA_IOCTL_ID_RESERVE \
7123df3960SShreyansh Jain _IOW(DPAA_IOCTL_MAGIC, 0x0A, struct dpaa_ioctl_id_reserve)
7223df3960SShreyansh Jain
process_alloc(enum dpaa_id_type id_type,uint32_t * base,uint32_t num,uint32_t align,int partial)7323df3960SShreyansh Jain int process_alloc(enum dpaa_id_type id_type, uint32_t *base, uint32_t num,
7423df3960SShreyansh Jain uint32_t align, int partial)
7523df3960SShreyansh Jain {
7623df3960SShreyansh Jain struct dpaa_ioctl_id_alloc id = {
7723df3960SShreyansh Jain .id_type = id_type,
7823df3960SShreyansh Jain .num = num,
7923df3960SShreyansh Jain .align = align,
8023df3960SShreyansh Jain .partial = partial
8123df3960SShreyansh Jain };
8223df3960SShreyansh Jain int ret = check_fd();
8323df3960SShreyansh Jain
8423df3960SShreyansh Jain if (ret)
8523df3960SShreyansh Jain return ret;
8623df3960SShreyansh Jain ret = ioctl(fd, DPAA_IOCTL_ID_ALLOC, &id);
8723df3960SShreyansh Jain if (ret)
8823df3960SShreyansh Jain return ret;
8923df3960SShreyansh Jain for (ret = 0; ret < (int)id.num; ret++)
9023df3960SShreyansh Jain base[ret] = id.base + ret;
9123df3960SShreyansh Jain return id.num;
9223df3960SShreyansh Jain }
9323df3960SShreyansh Jain
process_release(enum dpaa_id_type id_type,uint32_t base,uint32_t num)9423df3960SShreyansh Jain void process_release(enum dpaa_id_type id_type, uint32_t base, uint32_t num)
9523df3960SShreyansh Jain {
9623df3960SShreyansh Jain struct dpaa_ioctl_id_release id = {
9723df3960SShreyansh Jain .id_type = id_type,
9823df3960SShreyansh Jain .base = base,
9923df3960SShreyansh Jain .num = num
10023df3960SShreyansh Jain };
10123df3960SShreyansh Jain int ret = check_fd();
10223df3960SShreyansh Jain
10323df3960SShreyansh Jain if (ret) {
1040fcdbde0SHemant Agrawal DPAA_BUS_ERR("Process FD failure");
10523df3960SShreyansh Jain return;
10623df3960SShreyansh Jain }
10723df3960SShreyansh Jain ret = ioctl(fd, DPAA_IOCTL_ID_RELEASE, &id);
10823df3960SShreyansh Jain if (ret)
1090fcdbde0SHemant Agrawal DPAA_BUS_ERR("Process FD ioctl failure type %d base 0x%x num %d",
11023df3960SShreyansh Jain id_type, base, num);
11123df3960SShreyansh Jain }
11223df3960SShreyansh Jain
process_reserve(enum dpaa_id_type id_type,uint32_t base,uint32_t num)11323df3960SShreyansh Jain int process_reserve(enum dpaa_id_type id_type, uint32_t base, uint32_t num)
11423df3960SShreyansh Jain {
11523df3960SShreyansh Jain struct dpaa_ioctl_id_reserve id = {
11623df3960SShreyansh Jain .id_type = id_type,
11723df3960SShreyansh Jain .base = base,
11823df3960SShreyansh Jain .num = num
11923df3960SShreyansh Jain };
12023df3960SShreyansh Jain int ret = check_fd();
12123df3960SShreyansh Jain
12223df3960SShreyansh Jain if (ret)
12323df3960SShreyansh Jain return ret;
12423df3960SShreyansh Jain return ioctl(fd, DPAA_IOCTL_ID_RESERVE, &id);
12523df3960SShreyansh Jain }
12623df3960SShreyansh Jain
12723df3960SShreyansh Jain /***************************************/
12823df3960SShreyansh Jain /* Mapping and using QMan/BMan portals */
12923df3960SShreyansh Jain /***************************************/
13023df3960SShreyansh Jain
13123df3960SShreyansh Jain #define DPAA_IOCTL_PORTAL_MAP \
13223df3960SShreyansh Jain _IOWR(DPAA_IOCTL_MAGIC, 0x07, struct dpaa_ioctl_portal_map)
13323df3960SShreyansh Jain #define DPAA_IOCTL_PORTAL_UNMAP \
13423df3960SShreyansh Jain _IOW(DPAA_IOCTL_MAGIC, 0x08, struct dpaa_portal_map)
13523df3960SShreyansh Jain
process_portal_map(struct dpaa_ioctl_portal_map * params)13623df3960SShreyansh Jain int process_portal_map(struct dpaa_ioctl_portal_map *params)
13723df3960SShreyansh Jain {
13823df3960SShreyansh Jain int ret = check_fd();
13923df3960SShreyansh Jain
14023df3960SShreyansh Jain if (ret)
14123df3960SShreyansh Jain return ret;
14223df3960SShreyansh Jain
14323df3960SShreyansh Jain ret = ioctl(fd, DPAA_IOCTL_PORTAL_MAP, params);
14423df3960SShreyansh Jain if (ret) {
14523df3960SShreyansh Jain perror("ioctl(DPAA_IOCTL_PORTAL_MAP)");
14623df3960SShreyansh Jain return ret;
14723df3960SShreyansh Jain }
14823df3960SShreyansh Jain return 0;
14923df3960SShreyansh Jain }
15023df3960SShreyansh Jain
process_portal_unmap(struct dpaa_portal_map * map)15123df3960SShreyansh Jain int process_portal_unmap(struct dpaa_portal_map *map)
15223df3960SShreyansh Jain {
15323df3960SShreyansh Jain int ret = check_fd();
15423df3960SShreyansh Jain
15523df3960SShreyansh Jain if (ret)
15623df3960SShreyansh Jain return ret;
15723df3960SShreyansh Jain
15823df3960SShreyansh Jain ret = ioctl(fd, DPAA_IOCTL_PORTAL_UNMAP, map);
15923df3960SShreyansh Jain if (ret) {
16023df3960SShreyansh Jain perror("ioctl(DPAA_IOCTL_PORTAL_UNMAP)");
16123df3960SShreyansh Jain return ret;
16223df3960SShreyansh Jain }
16323df3960SShreyansh Jain return 0;
16423df3960SShreyansh Jain }
16523df3960SShreyansh Jain
16623df3960SShreyansh Jain #define DPAA_IOCTL_PORTAL_IRQ_MAP \
16723df3960SShreyansh Jain _IOW(DPAA_IOCTL_MAGIC, 0x09, struct dpaa_ioctl_irq_map)
16823df3960SShreyansh Jain
process_portal_irq_map(int ifd,struct dpaa_ioctl_irq_map * map)16923df3960SShreyansh Jain int process_portal_irq_map(int ifd, struct dpaa_ioctl_irq_map *map)
17023df3960SShreyansh Jain {
17123df3960SShreyansh Jain map->fd = fd;
17223df3960SShreyansh Jain return ioctl(ifd, DPAA_IOCTL_PORTAL_IRQ_MAP, map);
17323df3960SShreyansh Jain }
17423df3960SShreyansh Jain
process_portal_irq_unmap(int ifd)17523df3960SShreyansh Jain int process_portal_irq_unmap(int ifd)
17623df3960SShreyansh Jain {
17723df3960SShreyansh Jain return close(ifd);
17823df3960SShreyansh Jain }
17923df3960SShreyansh Jain
18023df3960SShreyansh Jain struct dpaa_ioctl_raw_portal {
18123df3960SShreyansh Jain /* inputs */
18223df3960SShreyansh Jain enum dpaa_portal_type type; /* Type of portal to allocate */
18323df3960SShreyansh Jain
18423df3960SShreyansh Jain uint8_t enable_stash; /* set to non zero to turn on stashing */
18523df3960SShreyansh Jain /* Stashing attributes for the portal */
18623df3960SShreyansh Jain uint32_t cpu;
18723df3960SShreyansh Jain uint32_t cache;
18823df3960SShreyansh Jain uint32_t window;
18923df3960SShreyansh Jain /* Specifies the stash request queue this portal should use */
19023df3960SShreyansh Jain uint8_t sdest;
19123df3960SShreyansh Jain
19223df3960SShreyansh Jain /* Specifes a specific portal index to map or QBMAN_ANY_PORTAL_IDX
19323df3960SShreyansh Jain * for don't care. The portal index will be populated by the
19423df3960SShreyansh Jain * driver when the ioctl() successfully completes.
19523df3960SShreyansh Jain */
19623df3960SShreyansh Jain uint32_t index;
19723df3960SShreyansh Jain
19823df3960SShreyansh Jain /* outputs */
19923df3960SShreyansh Jain uint64_t cinh;
20023df3960SShreyansh Jain uint64_t cena;
20123df3960SShreyansh Jain };
20223df3960SShreyansh Jain
20323df3960SShreyansh Jain #define DPAA_IOCTL_ALLOC_RAW_PORTAL \
20423df3960SShreyansh Jain _IOWR(DPAA_IOCTL_MAGIC, 0x0C, struct dpaa_ioctl_raw_portal)
20523df3960SShreyansh Jain
20623df3960SShreyansh Jain #define DPAA_IOCTL_FREE_RAW_PORTAL \
20723df3960SShreyansh Jain _IOR(DPAA_IOCTL_MAGIC, 0x0D, struct dpaa_ioctl_raw_portal)
20823df3960SShreyansh Jain
process_portal_allocate(struct dpaa_ioctl_raw_portal * portal)20923df3960SShreyansh Jain static int process_portal_allocate(struct dpaa_ioctl_raw_portal *portal)
21023df3960SShreyansh Jain {
21123df3960SShreyansh Jain int ret = check_fd();
21223df3960SShreyansh Jain
21323df3960SShreyansh Jain if (ret)
21423df3960SShreyansh Jain return ret;
21523df3960SShreyansh Jain
21623df3960SShreyansh Jain ret = ioctl(fd, DPAA_IOCTL_ALLOC_RAW_PORTAL, portal);
21723df3960SShreyansh Jain if (ret) {
21823df3960SShreyansh Jain perror("ioctl(DPAA_IOCTL_ALLOC_RAW_PORTAL)");
21923df3960SShreyansh Jain return ret;
22023df3960SShreyansh Jain }
22123df3960SShreyansh Jain return 0;
22223df3960SShreyansh Jain }
22323df3960SShreyansh Jain
process_portal_free(struct dpaa_ioctl_raw_portal * portal)22423df3960SShreyansh Jain static int process_portal_free(struct dpaa_ioctl_raw_portal *portal)
22523df3960SShreyansh Jain {
22623df3960SShreyansh Jain int ret = check_fd();
22723df3960SShreyansh Jain
22823df3960SShreyansh Jain if (ret)
22923df3960SShreyansh Jain return ret;
23023df3960SShreyansh Jain
23123df3960SShreyansh Jain ret = ioctl(fd, DPAA_IOCTL_FREE_RAW_PORTAL, portal);
23223df3960SShreyansh Jain if (ret) {
23323df3960SShreyansh Jain perror("ioctl(DPAA_IOCTL_FREE_RAW_PORTAL)");
23423df3960SShreyansh Jain return ret;
23523df3960SShreyansh Jain }
23623df3960SShreyansh Jain return 0;
23723df3960SShreyansh Jain }
23823df3960SShreyansh Jain
qman_allocate_raw_portal(struct dpaa_raw_portal * portal)23923df3960SShreyansh Jain int qman_allocate_raw_portal(struct dpaa_raw_portal *portal)
24023df3960SShreyansh Jain {
24123df3960SShreyansh Jain struct dpaa_ioctl_raw_portal input;
24223df3960SShreyansh Jain int ret;
24323df3960SShreyansh Jain
24423df3960SShreyansh Jain input.type = dpaa_portal_qman;
24523df3960SShreyansh Jain input.index = portal->index;
24623df3960SShreyansh Jain input.enable_stash = portal->enable_stash;
24723df3960SShreyansh Jain input.cpu = portal->cpu;
24823df3960SShreyansh Jain input.cache = portal->cache;
24923df3960SShreyansh Jain input.window = portal->window;
25023df3960SShreyansh Jain input.sdest = portal->sdest;
25123df3960SShreyansh Jain
25223df3960SShreyansh Jain ret = process_portal_allocate(&input);
25323df3960SShreyansh Jain if (ret)
25423df3960SShreyansh Jain return ret;
25523df3960SShreyansh Jain portal->index = input.index;
25623df3960SShreyansh Jain portal->cinh = input.cinh;
25723df3960SShreyansh Jain portal->cena = input.cena;
25823df3960SShreyansh Jain return 0;
25923df3960SShreyansh Jain }
26023df3960SShreyansh Jain
qman_free_raw_portal(struct dpaa_raw_portal * portal)26123df3960SShreyansh Jain int qman_free_raw_portal(struct dpaa_raw_portal *portal)
26223df3960SShreyansh Jain {
26323df3960SShreyansh Jain struct dpaa_ioctl_raw_portal input;
26423df3960SShreyansh Jain
26523df3960SShreyansh Jain input.type = dpaa_portal_qman;
26623df3960SShreyansh Jain input.index = portal->index;
26723df3960SShreyansh Jain input.cinh = portal->cinh;
26823df3960SShreyansh Jain input.cena = portal->cena;
26923df3960SShreyansh Jain
27023df3960SShreyansh Jain return process_portal_free(&input);
27123df3960SShreyansh Jain }
27223df3960SShreyansh Jain
bman_allocate_raw_portal(struct dpaa_raw_portal * portal)27323df3960SShreyansh Jain int bman_allocate_raw_portal(struct dpaa_raw_portal *portal)
27423df3960SShreyansh Jain {
27523df3960SShreyansh Jain struct dpaa_ioctl_raw_portal input;
27623df3960SShreyansh Jain int ret;
27723df3960SShreyansh Jain
27823df3960SShreyansh Jain input.type = dpaa_portal_bman;
27923df3960SShreyansh Jain input.index = portal->index;
28023df3960SShreyansh Jain input.enable_stash = 0;
28123df3960SShreyansh Jain
28223df3960SShreyansh Jain ret = process_portal_allocate(&input);
28323df3960SShreyansh Jain if (ret)
28423df3960SShreyansh Jain return ret;
28523df3960SShreyansh Jain portal->index = input.index;
28623df3960SShreyansh Jain portal->cinh = input.cinh;
28723df3960SShreyansh Jain portal->cena = input.cena;
28823df3960SShreyansh Jain return 0;
28923df3960SShreyansh Jain }
29023df3960SShreyansh Jain
bman_free_raw_portal(struct dpaa_raw_portal * portal)29123df3960SShreyansh Jain int bman_free_raw_portal(struct dpaa_raw_portal *portal)
29223df3960SShreyansh Jain {
29323df3960SShreyansh Jain struct dpaa_ioctl_raw_portal input;
29423df3960SShreyansh Jain
29523df3960SShreyansh Jain input.type = dpaa_portal_bman;
29623df3960SShreyansh Jain input.index = portal->index;
29723df3960SShreyansh Jain input.cinh = portal->cinh;
29823df3960SShreyansh Jain input.cena = portal->cena;
29923df3960SShreyansh Jain
30023df3960SShreyansh Jain return process_portal_free(&input);
30123df3960SShreyansh Jain }
3022aa10990SRohit Raj
3032aa10990SRohit Raj #define DPAA_IOCTL_ENABLE_LINK_STATUS_INTERRUPT \
3042aa10990SRohit Raj _IOW(DPAA_IOCTL_MAGIC, 0x0E, struct usdpaa_ioctl_link_status)
3052aa10990SRohit Raj
3062aa10990SRohit Raj #define DPAA_IOCTL_DISABLE_LINK_STATUS_INTERRUPT \
307b585ecb5SRohit Raj _IOW(DPAA_IOCTL_MAGIC, 0x0F, char[IF_NAME_MAX_LEN])
3082aa10990SRohit Raj
dpaa_intr_enable(char * if_name,int efd)3092aa10990SRohit Raj int dpaa_intr_enable(char *if_name, int efd)
3102aa10990SRohit Raj {
3112aa10990SRohit Raj struct usdpaa_ioctl_link_status args;
3122aa10990SRohit Raj
3132aa10990SRohit Raj int ret = check_fd();
3142aa10990SRohit Raj
3152aa10990SRohit Raj if (ret)
3162aa10990SRohit Raj return ret;
3172aa10990SRohit Raj
3182aa10990SRohit Raj args.efd = (uint32_t)efd;
3192aa10990SRohit Raj strcpy(args.if_name, if_name);
3202aa10990SRohit Raj
3212aa10990SRohit Raj ret = ioctl(fd, DPAA_IOCTL_ENABLE_LINK_STATUS_INTERRUPT, &args);
3222aa10990SRohit Raj if (ret)
3232aa10990SRohit Raj return errno;
3242aa10990SRohit Raj
3252aa10990SRohit Raj return 0;
3262aa10990SRohit Raj }
3272aa10990SRohit Raj
dpaa_intr_disable(char * if_name)3282aa10990SRohit Raj int dpaa_intr_disable(char *if_name)
3292aa10990SRohit Raj {
3302aa10990SRohit Raj int ret = check_fd();
3312aa10990SRohit Raj
3322aa10990SRohit Raj if (ret)
3332aa10990SRohit Raj return ret;
3342aa10990SRohit Raj
335b585ecb5SRohit Raj ret = ioctl(fd, DPAA_IOCTL_DISABLE_LINK_STATUS_INTERRUPT, if_name);
3362aa10990SRohit Raj if (ret) {
3372aa10990SRohit Raj if (errno == EINVAL)
3380fcdbde0SHemant Agrawal DPAA_BUS_ERR("Failed to disable interrupt: Not Supported");
3392aa10990SRohit Raj else
3400fcdbde0SHemant Agrawal DPAA_BUS_ERR("Failed to disable interrupt");
3412aa10990SRohit Raj return ret;
3422aa10990SRohit Raj }
3432aa10990SRohit Raj
3442aa10990SRohit Raj return 0;
3452aa10990SRohit Raj }
3462aa10990SRohit Raj
3477a292619SRohit Raj #define DPAA_IOCTL_GET_IOCTL_VERSION \
3487a292619SRohit Raj _IOR(DPAA_IOCTL_MAGIC, 0x14, int)
3492aa10990SRohit Raj
dpaa_get_ioctl_version_number(void)3507a292619SRohit Raj int dpaa_get_ioctl_version_number(void)
3512aa10990SRohit Raj {
3527a292619SRohit Raj int version_num, ret = check_fd();
3532aa10990SRohit Raj
3542aa10990SRohit Raj if (ret)
3552aa10990SRohit Raj return ret;
3562aa10990SRohit Raj
3577a292619SRohit Raj ret = ioctl(fd, DPAA_IOCTL_GET_IOCTL_VERSION, &version_num);
3587a292619SRohit Raj if (ret) {
3597a292619SRohit Raj if (errno == EINVAL) {
3607a292619SRohit Raj version_num = 1;
3617a292619SRohit Raj } else {
3620fcdbde0SHemant Agrawal DPAA_BUS_ERR("Failed to get ioctl version number");
3637a292619SRohit Raj version_num = -1;
3647a292619SRohit Raj }
3657a292619SRohit Raj }
3667a292619SRohit Raj
3677a292619SRohit Raj return version_num;
3687a292619SRohit Raj }
3697a292619SRohit Raj
3707a292619SRohit Raj #define DPAA_IOCTL_GET_LINK_STATUS \
3717a292619SRohit Raj _IOWR(DPAA_IOCTL_MAGIC, 0x10, struct usdpaa_ioctl_link_status_args)
3727a292619SRohit Raj
3737a292619SRohit Raj #define DPAA_IOCTL_GET_LINK_STATUS_OLD \
3747a292619SRohit Raj _IOWR(DPAA_IOCTL_MAGIC, 0x10, struct usdpaa_ioctl_link_status_args_old)
3757a292619SRohit Raj
3767a292619SRohit Raj
dpaa_get_link_status(char * if_name,struct rte_eth_link * link)3777a292619SRohit Raj int dpaa_get_link_status(char *if_name, struct rte_eth_link *link)
3787a292619SRohit Raj {
3797a292619SRohit Raj int ioctl_version, ret = check_fd();
3807a292619SRohit Raj
3817a292619SRohit Raj if (ret)
3827a292619SRohit Raj return ret;
3837a292619SRohit Raj
3847a292619SRohit Raj ioctl_version = dpaa_get_ioctl_version_number();
3857a292619SRohit Raj
3867a292619SRohit Raj if (ioctl_version == 2) {
3877a292619SRohit Raj struct usdpaa_ioctl_link_status_args args;
3887a292619SRohit Raj
3892aa10990SRohit Raj strcpy(args.if_name, if_name);
3902aa10990SRohit Raj
3912aa10990SRohit Raj ret = ioctl(fd, DPAA_IOCTL_GET_LINK_STATUS, &args);
3922aa10990SRohit Raj if (ret) {
3930fcdbde0SHemant Agrawal DPAA_BUS_ERR("Failed to get link status");
3947a292619SRohit Raj return ret;
3957a292619SRohit Raj }
3967a292619SRohit Raj
3977a292619SRohit Raj link->link_status = args.link_status;
3987a292619SRohit Raj link->link_speed = args.link_speed;
3997a292619SRohit Raj link->link_duplex = args.link_duplex;
4007a292619SRohit Raj link->link_autoneg = args.link_autoneg;
4017a292619SRohit Raj } else {
4027a292619SRohit Raj struct usdpaa_ioctl_link_status_args_old args;
4037a292619SRohit Raj
4047a292619SRohit Raj strcpy(args.if_name, if_name);
4057a292619SRohit Raj
4067a292619SRohit Raj ret = ioctl(fd, DPAA_IOCTL_GET_LINK_STATUS_OLD, &args);
4077a292619SRohit Raj if (ret) {
4082aa10990SRohit Raj if (errno == EINVAL)
4090fcdbde0SHemant Agrawal DPAA_BUS_ERR("Get link status: Not Supported");
4102aa10990SRohit Raj else
4110fcdbde0SHemant Agrawal DPAA_BUS_ERR("Failed to get link status");
4122aa10990SRohit Raj return ret;
4132aa10990SRohit Raj }
4142aa10990SRohit Raj
4157a292619SRohit Raj link->link_status = args.link_status;
4167a292619SRohit Raj }
4177a292619SRohit Raj
4187a292619SRohit Raj return 0;
4192aa10990SRohit Raj }
420f231d48dSRohit Raj
421f231d48dSRohit Raj #define DPAA_IOCTL_UPDATE_LINK_STATUS \
422f231d48dSRohit Raj _IOW(DPAA_IOCTL_MAGIC, 0x11, struct usdpaa_ioctl_update_link_status_args)
423f231d48dSRohit Raj
dpaa_update_link_status(char * if_name,int link_status)424f231d48dSRohit Raj int dpaa_update_link_status(char *if_name, int link_status)
425f231d48dSRohit Raj {
426f231d48dSRohit Raj struct usdpaa_ioctl_update_link_status_args args;
427f231d48dSRohit Raj int ret;
428f231d48dSRohit Raj
429f231d48dSRohit Raj ret = check_fd();
430f231d48dSRohit Raj if (ret)
431f231d48dSRohit Raj return ret;
432f231d48dSRohit Raj
433f231d48dSRohit Raj strcpy(args.if_name, if_name);
434f231d48dSRohit Raj args.link_status = link_status;
435f231d48dSRohit Raj
436f231d48dSRohit Raj ret = ioctl(fd, DPAA_IOCTL_UPDATE_LINK_STATUS, &args);
437f231d48dSRohit Raj if (ret) {
438f231d48dSRohit Raj if (errno == EINVAL)
4390fcdbde0SHemant Agrawal DPAA_BUS_ERR("Failed to set link status: Not Supported");
440f231d48dSRohit Raj else
4410fcdbde0SHemant Agrawal DPAA_BUS_ERR("Failed to set link status");
442f231d48dSRohit Raj return ret;
443f231d48dSRohit Raj }
444f231d48dSRohit Raj
445f231d48dSRohit Raj return 0;
446f231d48dSRohit Raj }
4477a292619SRohit Raj
4487a292619SRohit Raj #define DPAA_IOCTL_UPDATE_LINK_SPEED \
4497a292619SRohit Raj _IOW(DPAA_IOCTL_MAGIC, 0x12, struct usdpaa_ioctl_update_link_speed)
4507a292619SRohit Raj
dpaa_update_link_speed(char * if_name,int link_speed,int link_duplex)4517a292619SRohit Raj int dpaa_update_link_speed(char *if_name, int link_speed, int link_duplex)
4527a292619SRohit Raj {
4537a292619SRohit Raj struct usdpaa_ioctl_update_link_speed args;
4547a292619SRohit Raj int ret;
4557a292619SRohit Raj
4567a292619SRohit Raj ret = check_fd();
4577a292619SRohit Raj if (ret)
4587a292619SRohit Raj return ret;
4597a292619SRohit Raj
4607a292619SRohit Raj strcpy(args.if_name, if_name);
4617a292619SRohit Raj args.link_speed = link_speed;
4627a292619SRohit Raj args.link_duplex = link_duplex;
4637a292619SRohit Raj
4647a292619SRohit Raj ret = ioctl(fd, DPAA_IOCTL_UPDATE_LINK_SPEED, &args);
4657a292619SRohit Raj if (ret) {
4667a292619SRohit Raj if (errno == EINVAL)
4670fcdbde0SHemant Agrawal DPAA_BUS_ERR("Failed to set link speed: Not Supported");
4687a292619SRohit Raj else
4690fcdbde0SHemant Agrawal DPAA_BUS_ERR("Failed to set link speed");
4707a292619SRohit Raj return ret;
4717a292619SRohit Raj }
4727a292619SRohit Raj
4737a292619SRohit Raj return ret;
4747a292619SRohit Raj }
4757a292619SRohit Raj
4767a292619SRohit Raj #define DPAA_IOCTL_RESTART_LINK_AUTONEG \
477b585ecb5SRohit Raj _IOW(DPAA_IOCTL_MAGIC, 0x13, char[IF_NAME_MAX_LEN])
4787a292619SRohit Raj
dpaa_restart_link_autoneg(char * if_name)4797a292619SRohit Raj int dpaa_restart_link_autoneg(char *if_name)
4807a292619SRohit Raj {
4817a292619SRohit Raj int ret = check_fd();
4827a292619SRohit Raj
4837a292619SRohit Raj if (ret)
4847a292619SRohit Raj return ret;
4857a292619SRohit Raj
486b585ecb5SRohit Raj ret = ioctl(fd, DPAA_IOCTL_RESTART_LINK_AUTONEG, if_name);
4877a292619SRohit Raj if (ret) {
4887a292619SRohit Raj if (errno == EINVAL)
4890fcdbde0SHemant Agrawal DPAA_BUS_ERR("Failed to restart autoneg: Not Supported");
4907a292619SRohit Raj else
4910fcdbde0SHemant Agrawal DPAA_BUS_ERR("Failed to restart autoneg");
4927a292619SRohit Raj return ret;
4937a292619SRohit Raj }
4947a292619SRohit Raj
4957a292619SRohit Raj return ret;
4967a292619SRohit Raj }
497