IOCTL Interfaces

This chapter explains how to use driver provided private IOCTL for configuring hardware in Linux OS.

How to Use IOCTL Interfaces

/* include */
#include "ether_export.h"

static int open_socket(char *ifname)
{
        int sockfd;

        sockfd = socket(PF_INET, SOCK_STREAM, 0);
        return sockfd;
}

static void close_socket(int sockfd)
{
        close(sockfd);
}

int main(int argc, char *argv[])
{

int sockfd;
static char *if_name;
struct ifreq ifr;
struct ifr_data_struct data;
struct osi_est_config cfg;

sockfd = open_socket(argv[1]);
if_name = strdup(argv[1]);

/* Update all fields of osi_est_config from user input  for example..*/
cfg.en_dis = atoi(argv1);
            cfg.btr[0] = atoi(argv2);
            cfg.btr[1] = atoi(argv3);
            cfg.btr_offset[0] = atoi(argv4);
            cfg.btr_offset[1] = atoi(argv5);
            cfg.ctr[0] = strtol(argv6, NULL, 16);
            cfg.ctr[1] = strtol(argv7, NULL, 16);

data.cmd = ETHER_EST_CFG;
data.ptr = &cfg;
strcpy(ifr.ifr_ifrn.ifrn_name, ifname);
ifr.ifr_ifru.ifru_data = &data;

 ret = ioctl(sockfd, DWC_ETH_QOS_PRV_IOCTL, &ifr);
if (ret < 0)
                printf("IOCTL Error in %s()\n",__func__);
        else
                printf("Configured successfully\n");
close_socket(sockfd);
Return ret;
}

Supported IOCTL Commands

/**
 * @addtogroup private IOCTL related info
 *
 * @brief MACRO are defined for driver supported
 * private IOCTLs. These IOCTLs can be called using
 * SIOCDEVPRIVATE custom ioctl command.
 * @{
 */
/** Line speed */
#define EQOS_GET_CONNECTED_SPEED        25
/** To set HW AVB configuration from user application */
#define ETHER_AVB_ALGORITHM             27
/** To get current configuration in HW */
#define ETHER_GET_AVB_ALGORITHM         46
/** To configure EST(802.1 bv) in HW */
#define ETHER_CONFIG_EST                49
/** For configure FPE (802.1 bu + 803.2 br) in HW */
#define ETHER_CONFIG_FPE                50
/** @} */

Data Structures

Data structure is part of the drive-linux/include/ folder.