* Create device representing Ethernet port. * * @param name * Pointer to the port's name. * * @return * 0 on success, negative error value otherwise. */
| 3119 | * 0 on success, negative error value otherwise. |
| 3120 | */ |
| 3121 | static int |
| 3122 | mrvl_eth_dev_create(struct rte_vdev_device *vdev, const char *name) |
| 3123 | { |
| 3124 | int ret, fd = socket(AF_INET, SOCK_DGRAM, 0); |
| 3125 | struct rte_eth_dev *eth_dev; |
| 3126 | struct mrvl_priv *priv; |
| 3127 | struct ifreq req; |
| 3128 | |
| 3129 | eth_dev = rte_eth_dev_allocate(name); |
| 3130 | if (!eth_dev) |
| 3131 | return -ENOMEM; |
| 3132 | |
| 3133 | priv = mrvl_priv_create(name); |
| 3134 | if (!priv) { |
| 3135 | ret = -ENOMEM; |
| 3136 | goto out_free; |
| 3137 | } |
| 3138 | eth_dev->data->dev_private = priv; |
| 3139 | |
| 3140 | eth_dev->data->mac_addrs = |
| 3141 | rte_zmalloc("mac_addrs", |
| 3142 | RTE_ETHER_ADDR_LEN * MRVL_MAC_ADDRS_MAX, 0); |
| 3143 | if (!eth_dev->data->mac_addrs) { |
| 3144 | MRVL_LOG(ERR, "Failed to allocate space for eth addrs"); |
| 3145 | ret = -ENOMEM; |
| 3146 | goto out_free; |
| 3147 | } |
| 3148 | |
| 3149 | memset(&req, 0, sizeof(req)); |
| 3150 | strcpy(req.ifr_name, name); |
| 3151 | ret = ioctl(fd, SIOCGIFHWADDR, &req); |
| 3152 | if (ret) |
| 3153 | goto out_free; |
| 3154 | |
| 3155 | memcpy(eth_dev->data->mac_addrs[0].addr_bytes, |
| 3156 | req.ifr_addr.sa_data, RTE_ETHER_ADDR_LEN); |
| 3157 | |
| 3158 | eth_dev->device = &vdev->device; |
| 3159 | eth_dev->rx_pkt_burst = mrvl_rx_pkt_burst; |
| 3160 | mrvl_set_tx_function(eth_dev); |
| 3161 | eth_dev->dev_ops = &mrvl_ops; |
| 3162 | eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS; |
| 3163 | |
| 3164 | eth_dev->data->dev_link.link_status = RTE_ETH_LINK_UP; |
| 3165 | |
| 3166 | rte_eth_dev_probing_finish(eth_dev); |
| 3167 | return 0; |
| 3168 | out_free: |
| 3169 | rte_eth_dev_release_port(eth_dev); |
| 3170 | |
| 3171 | return ret; |
| 3172 | } |
| 3173 | |
| 3174 | /** |
| 3175 | * Callback used by rte_kvargs_process() during argument parsing. |
no test coverage detected