Lines Matching refs:lif

30 static int ionic_lif_addr_add(struct ionic_lif *lif, const uint8_t *addr);
31 static int ionic_lif_addr_del(struct ionic_lif *lif, const uint8_t *addr);
37 struct ionic_lif *lif = qcq->lif; in ionic_qcq_enable() local
48 return ionic_adminq_post_wait(lif, &ctx); in ionic_qcq_enable()
55 struct ionic_lif *lif = qcq->lif; in ionic_qcq_disable() local
66 return ionic_adminq_post_wait(lif, &ctx); in ionic_qcq_disable()
70 ionic_lif_stop(struct ionic_lif *lif) in ionic_lif_stop() argument
76 lif->state &= ~IONIC_LIF_F_UP; in ionic_lif_stop()
78 for (i = 0; i < lif->nrxqcqs; i++) { in ionic_lif_stop()
79 struct ionic_rx_qcq *rxq = lif->rxqcqs[i]; in ionic_lif_stop()
81 (void)ionic_dev_rx_queue_stop(lif->eth_dev, i); in ionic_lif_stop()
84 for (i = 0; i < lif->ntxqcqs; i++) { in ionic_lif_stop()
85 struct ionic_tx_qcq *txq = lif->txqcqs[i]; in ionic_lif_stop()
87 (void)ionic_dev_tx_queue_stop(lif->eth_dev, i); in ionic_lif_stop()
92 ionic_lif_reset(struct ionic_lif *lif) in ionic_lif_reset() argument
94 struct ionic_dev *idev = &lif->adapter->idev; in ionic_lif_reset()
102 IONIC_PRINT(WARNING, "Failed to reset %s", lif->name); in ionic_lif_reset()
106 ionic_lif_get_abs_stats(const struct ionic_lif *lif, struct rte_eth_stats *stats) in ionic_lif_get_abs_stats() argument
108 struct ionic_lif_stats *ls = &lif->info->stats; in ionic_lif_get_abs_stats()
110 uint32_t num_rx_q_counters = RTE_MIN(lif->nrxqcqs, (uint32_t) in ionic_lif_get_abs_stats()
112 uint32_t num_tx_q_counters = RTE_MIN(lif->ntxqcqs, (uint32_t) in ionic_lif_get_abs_stats()
119 lif->port_id); in ionic_lif_get_abs_stats()
133 for (i = 0; i < lif->nrxqcqs; i++) { in ionic_lif_get_abs_stats()
134 struct ionic_rx_stats *rx_stats = &lif->rxqcqs[i]->stats; in ionic_lif_get_abs_stats()
155 struct ionic_rx_stats *rx_stats = &lif->rxqcqs[i]->stats; in ionic_lif_get_abs_stats()
175 for (i = 0; i < lif->ntxqcqs; i++) { in ionic_lif_get_abs_stats()
176 struct ionic_tx_stats *tx_stats = &lif->txqcqs[i]->stats; in ionic_lif_get_abs_stats()
192 struct ionic_tx_stats *tx_stats = &lif->txqcqs[i]->stats; in ionic_lif_get_abs_stats()
199 ionic_lif_get_stats(const struct ionic_lif *lif, in ionic_lif_get_stats() argument
202 ionic_lif_get_abs_stats(lif, stats); in ionic_lif_get_stats()
204 stats->ipackets -= lif->stats_base.ipackets; in ionic_lif_get_stats()
205 stats->opackets -= lif->stats_base.opackets; in ionic_lif_get_stats()
206 stats->ibytes -= lif->stats_base.ibytes; in ionic_lif_get_stats()
207 stats->obytes -= lif->stats_base.obytes; in ionic_lif_get_stats()
208 stats->imissed -= lif->stats_base.imissed; in ionic_lif_get_stats()
209 stats->ierrors -= lif->stats_base.ierrors; in ionic_lif_get_stats()
210 stats->oerrors -= lif->stats_base.oerrors; in ionic_lif_get_stats()
211 stats->rx_nombuf -= lif->stats_base.rx_nombuf; in ionic_lif_get_stats()
215 ionic_lif_reset_stats(struct ionic_lif *lif) in ionic_lif_reset_stats() argument
219 for (i = 0; i < lif->nrxqcqs; i++) { in ionic_lif_reset_stats()
220 memset(&lif->rxqcqs[i]->stats, 0, in ionic_lif_reset_stats()
222 memset(&lif->txqcqs[i]->stats, 0, in ionic_lif_reset_stats()
226 ionic_lif_get_abs_stats(lif, &lif->stats_base); in ionic_lif_reset_stats()
230 ionic_lif_get_hw_stats(struct ionic_lif *lif, struct ionic_lif_stats *stats) in ionic_lif_get_hw_stats() argument
234 uint64_t *lif_stats64 = (uint64_t *)&lif->info->stats; in ionic_lif_get_hw_stats()
235 uint64_t *lif_stats64_base = (uint64_t *)&lif->lif_stats_base; in ionic_lif_get_hw_stats()
242 ionic_lif_reset_hw_stats(struct ionic_lif *lif) in ionic_lif_reset_hw_stats() argument
245 uint64_t *lif_stats64 = (uint64_t *)&lif->info->stats; in ionic_lif_reset_hw_stats()
246 uint64_t *lif_stats64_base = (uint64_t *)&lif->lif_stats_base; in ionic_lif_reset_hw_stats()
253 ionic_lif_addr_add(struct ionic_lif *lif, const uint8_t *addr) in ionic_lif_addr_add() argument
266 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_addr_add()
273 return ionic_rx_filter_save(lif, 0, IONIC_RXQ_INDEX_ANY, &ctx); in ionic_lif_addr_add()
277 ionic_lif_addr_del(struct ionic_lif *lif, const uint8_t *addr) in ionic_lif_addr_del() argument
290 rte_spinlock_lock(&lif->rx_filters.lock); in ionic_lif_addr_del()
292 f = ionic_rx_filter_by_addr(lif, addr); in ionic_lif_addr_del()
294 rte_spinlock_unlock(&lif->rx_filters.lock); in ionic_lif_addr_del()
301 rte_spinlock_unlock(&lif->rx_filters.lock); in ionic_lif_addr_del()
303 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_addr_del()
318 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); in ionic_dev_add_mac() local
322 return ionic_lif_addr_add(lif, (const uint8_t *)mac_addr); in ionic_dev_add_mac()
328 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); in ionic_dev_remove_mac() local
329 struct ionic_adapter *adapter = lif->adapter; in ionic_dev_remove_mac()
346 ionic_lif_addr_del(lif, (const uint8_t *)mac_addr); in ionic_dev_remove_mac()
352 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); in ionic_dev_set_mac() local
361 if (!rte_is_zero_ether_addr((struct rte_ether_addr *)lif->mac_addr)) { in ionic_dev_set_mac()
363 lif->mac_addr); in ionic_dev_set_mac()
364 ionic_lif_addr_del(lif, lif->mac_addr); in ionic_dev_set_mac()
365 memset(lif->mac_addr, 0, RTE_ETHER_ADDR_LEN); in ionic_dev_set_mac()
370 rte_ether_addr_copy(mac_addr, (struct rte_ether_addr *)lif->mac_addr); in ionic_dev_set_mac()
372 return ionic_lif_addr_add(lif, (const uint8_t *)mac_addr); in ionic_dev_set_mac()
376 ionic_vlan_rx_add_vid(struct ionic_lif *lif, uint16_t vid) in ionic_vlan_rx_add_vid() argument
388 err = ionic_adminq_post_wait(lif, &ctx); in ionic_vlan_rx_add_vid()
395 return ionic_rx_filter_save(lif, 0, IONIC_RXQ_INDEX_ANY, &ctx); in ionic_vlan_rx_add_vid()
399 ionic_vlan_rx_kill_vid(struct ionic_lif *lif, uint16_t vid) in ionic_vlan_rx_kill_vid() argument
412 rte_spinlock_lock(&lif->rx_filters.lock); in ionic_vlan_rx_kill_vid()
414 f = ionic_rx_filter_by_vlan(lif, vid); in ionic_vlan_rx_kill_vid()
416 rte_spinlock_unlock(&lif->rx_filters.lock); in ionic_vlan_rx_kill_vid()
422 rte_spinlock_unlock(&lif->rx_filters.lock); in ionic_vlan_rx_kill_vid()
424 err = ionic_adminq_post_wait(lif, &ctx); in ionic_vlan_rx_kill_vid()
438 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); in ionic_dev_vlan_filter_set() local
442 err = ionic_vlan_rx_add_vid(lif, vlan_id); in ionic_dev_vlan_filter_set()
444 err = ionic_vlan_rx_kill_vid(lif, vlan_id); in ionic_dev_vlan_filter_set()
450 ionic_lif_rx_mode(struct ionic_lif *lif, uint32_t rx_mode) in ionic_lif_rx_mode() argument
472 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_rx_mode()
478 ionic_set_rx_mode(struct ionic_lif *lif, uint32_t rx_mode) in ionic_set_rx_mode() argument
480 if (lif->rx_mode != rx_mode) { in ionic_set_rx_mode()
481 lif->rx_mode = rx_mode; in ionic_set_rx_mode()
482 ionic_lif_rx_mode(lif, rx_mode); in ionic_set_rx_mode()
489 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); in ionic_dev_promiscuous_enable() local
490 uint32_t rx_mode = lif->rx_mode; in ionic_dev_promiscuous_enable()
496 ionic_set_rx_mode(lif, rx_mode); in ionic_dev_promiscuous_enable()
504 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); in ionic_dev_promiscuous_disable() local
505 uint32_t rx_mode = lif->rx_mode; in ionic_dev_promiscuous_disable()
509 ionic_set_rx_mode(lif, rx_mode); in ionic_dev_promiscuous_disable()
517 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); in ionic_dev_allmulticast_enable() local
518 uint32_t rx_mode = lif->rx_mode; in ionic_dev_allmulticast_enable()
522 ionic_set_rx_mode(lif, rx_mode); in ionic_dev_allmulticast_enable()
530 struct ionic_lif *lif = IONIC_ETH_DEV_TO_LIF(eth_dev); in ionic_dev_allmulticast_disable() local
531 uint32_t rx_mode = lif->rx_mode; in ionic_dev_allmulticast_disable()
535 ionic_set_rx_mode(lif, rx_mode); in ionic_dev_allmulticast_disable()
541 ionic_lif_change_mtu(struct ionic_lif *lif, int new_mtu) in ionic_lif_change_mtu() argument
553 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_change_mtu()
561 ionic_intr_alloc(struct ionic_lif *lif, struct ionic_intr_info *intr) in ionic_intr_alloc() argument
563 struct ionic_adapter *adapter = lif->adapter; in ionic_intr_alloc()
588 ionic_qcq_alloc(struct ionic_lif *lif, in ionic_qcq_alloc() argument
635 new->lif = lif; in ionic_qcq_alloc()
660 new->base_z = rte_eth_dma_zone_reserve(lif->eth_dev, in ionic_qcq_alloc()
727 ionic_rx_qcq_alloc(struct ionic_lif *lif, uint32_t socket_id, uint32_t index, in ionic_rx_qcq_alloc() argument
735 err = ionic_qcq_alloc(lif, in ionic_rx_qcq_alloc()
752 lif->rxqcqs[index] = rxq; in ionic_rx_qcq_alloc()
759 ionic_tx_qcq_alloc(struct ionic_lif *lif, uint32_t socket_id, uint32_t index, in ionic_tx_qcq_alloc() argument
770 err = ionic_qcq_alloc(lif, in ionic_tx_qcq_alloc()
788 lif->txqcqs[index] = txq; in ionic_tx_qcq_alloc()
795 ionic_admin_qcq_alloc(struct ionic_lif *lif) in ionic_admin_qcq_alloc() argument
800 err = ionic_qcq_alloc(lif, in ionic_admin_qcq_alloc()
811 (struct ionic_qcq **)&lif->adminqcq); in ionic_admin_qcq_alloc()
819 ionic_notify_qcq_alloc(struct ionic_lif *lif) in ionic_notify_qcq_alloc() argument
822 struct ionic_dev *idev = &lif->adapter->idev; in ionic_notify_qcq_alloc()
826 err = ionic_qcq_alloc(lif, in ionic_notify_qcq_alloc()
841 err = ionic_intr_alloc(lif, &nqcq->intr); in ionic_notify_qcq_alloc()
850 lif->notifyqcq = nqcq; in ionic_notify_qcq_alloc()
867 ionic_lif_queue_identify(struct ionic_lif *lif) in ionic_lif_queue_identify() argument
869 struct ionic_adapter *adapter = lif->adapter; in ionic_lif_queue_identify()
878 struct ionic_qtype_info *qti = &lif->qtype_info[qtype]; in ionic_lif_queue_identify()
942 ionic_lif_alloc(struct ionic_lif *lif) in ionic_lif_alloc() argument
944 struct ionic_adapter *adapter = lif->adapter; in ionic_lif_alloc()
952 memcpy(lif->name, lif->eth_dev->data->name, sizeof(lif->name) - 1); in ionic_lif_alloc()
954 IONIC_PRINT(DEBUG, "LIF: %s", lif->name); in ionic_lif_alloc()
956 ionic_lif_queue_identify(lif); in ionic_lif_alloc()
958 if (lif->qtype_info[IONIC_QTYPE_TXQ].version < 1) { in ionic_lif_alloc()
965 rte_spinlock_init(&lif->adminq_lock); in ionic_lif_alloc()
966 rte_spinlock_init(&lif->adminq_service_lock); in ionic_lif_alloc()
968 lif->kern_dbpage = ionic_bus_map_dbpage(adapter, 0); in ionic_lif_alloc()
969 if (!lif->kern_dbpage) { in ionic_lif_alloc()
974 lif->txqcqs = rte_zmalloc("ionic", sizeof(*lif->txqcqs) * in ionic_lif_alloc()
977 if (!lif->txqcqs) { in ionic_lif_alloc()
982 lif->rxqcqs = rte_zmalloc("ionic", sizeof(*lif->rxqcqs) * in ionic_lif_alloc()
985 if (!lif->rxqcqs) { in ionic_lif_alloc()
992 err = ionic_notify_qcq_alloc(lif); in ionic_lif_alloc()
1000 err = ionic_admin_qcq_alloc(lif); in ionic_lif_alloc()
1008 lif->info_sz = RTE_ALIGN(sizeof(*lif->info), rte_mem_page_size()); in ionic_lif_alloc()
1010 lif->info_z = rte_eth_dma_zone_reserve(lif->eth_dev, in ionic_lif_alloc()
1012 lif->info_sz, IONIC_ALIGN, socket_id); in ionic_lif_alloc()
1013 if (!lif->info_z) { in ionic_lif_alloc()
1018 lif->info = lif->info_z->addr; in ionic_lif_alloc()
1019 lif->info_pa = lif->info_z->iova; in ionic_lif_alloc()
1025 ionic_lif_free(struct ionic_lif *lif) in ionic_lif_free() argument
1027 if (lif->notifyqcq) { in ionic_lif_free()
1028 ionic_qcq_free(&lif->notifyqcq->qcq); in ionic_lif_free()
1029 lif->notifyqcq = NULL; in ionic_lif_free()
1032 if (lif->adminqcq) { in ionic_lif_free()
1033 ionic_qcq_free(&lif->adminqcq->qcq); in ionic_lif_free()
1034 lif->adminqcq = NULL; in ionic_lif_free()
1037 if (lif->txqcqs) { in ionic_lif_free()
1038 rte_free(lif->txqcqs); in ionic_lif_free()
1039 lif->txqcqs = NULL; in ionic_lif_free()
1042 if (lif->rxqcqs) { in ionic_lif_free()
1043 rte_free(lif->rxqcqs); in ionic_lif_free()
1044 lif->rxqcqs = NULL; in ionic_lif_free()
1047 if (lif->info) { in ionic_lif_free()
1048 rte_memzone_free(lif->info_z); in ionic_lif_free()
1049 lif->info = NULL; in ionic_lif_free()
1054 ionic_lif_free_queues(struct ionic_lif *lif) in ionic_lif_free_queues() argument
1058 for (i = 0; i < lif->ntxqcqs; i++) { in ionic_lif_free_queues()
1059 ionic_dev_tx_queue_release(lif->eth_dev, i); in ionic_lif_free_queues()
1060 lif->eth_dev->data->tx_queues[i] = NULL; in ionic_lif_free_queues()
1062 for (i = 0; i < lif->nrxqcqs; i++) { in ionic_lif_free_queues()
1063 ionic_dev_rx_queue_release(lif->eth_dev, i); in ionic_lif_free_queues()
1064 lif->eth_dev->data->rx_queues[i] = NULL; in ionic_lif_free_queues()
1069 ionic_lif_rss_config(struct ionic_lif *lif, in ionic_lif_rss_config() argument
1072 struct ionic_adapter *adapter = lif->adapter; in ionic_lif_rss_config()
1079 .rss.addr = rte_cpu_to_le_64(lif->rss_ind_tbl_pa), in ionic_lif_rss_config()
1084 rte_le_to_cpu_16(adapter->ident.lif.eth.rss_ind_tbl_sz); in ionic_lif_rss_config()
1088 lif->rss_types = types; in ionic_lif_rss_config()
1091 memcpy(lif->rss_hash_key, key, IONIC_RSS_HASH_KEY_SIZE); in ionic_lif_rss_config()
1095 lif->rss_ind_tbl[i] = indir[i]; in ionic_lif_rss_config()
1097 memcpy(ctx.cmd.lif_setattr.rss.key, lif->rss_hash_key, in ionic_lif_rss_config()
1100 return ionic_adminq_post_wait(lif, &ctx); in ionic_lif_rss_config()
1104 ionic_lif_rss_setup(struct ionic_lif *lif) in ionic_lif_rss_setup() argument
1106 struct ionic_adapter *adapter = lif->adapter; in ionic_lif_rss_setup()
1116 rte_le_to_cpu_16(adapter->ident.lif.eth.rss_ind_tbl_sz); in ionic_lif_rss_setup()
1120 if (!lif->rss_ind_tbl_z) { in ionic_lif_rss_setup()
1121 lif->rss_ind_tbl_z = rte_eth_dma_zone_reserve(lif->eth_dev, in ionic_lif_rss_setup()
1123 sizeof(*lif->rss_ind_tbl) * tbl_sz, in ionic_lif_rss_setup()
1125 if (!lif->rss_ind_tbl_z) { in ionic_lif_rss_setup()
1130 lif->rss_ind_tbl = lif->rss_ind_tbl_z->addr; in ionic_lif_rss_setup()
1131 lif->rss_ind_tbl_pa = lif->rss_ind_tbl_z->iova; in ionic_lif_rss_setup()
1134 if (lif->rss_ind_tbl_nrxqcqs != lif->nrxqcqs) { in ionic_lif_rss_setup()
1135 lif->rss_ind_tbl_nrxqcqs = lif->nrxqcqs; in ionic_lif_rss_setup()
1139 lif->rss_ind_tbl[i] = i % lif->nrxqcqs; in ionic_lif_rss_setup()
1142 return ionic_lif_rss_config(lif, IONIC_RSS_OFFLOAD_ALL, in ionic_lif_rss_setup()
1147 ionic_lif_rss_teardown(struct ionic_lif *lif) in ionic_lif_rss_teardown() argument
1149 if (!lif->rss_ind_tbl) in ionic_lif_rss_teardown()
1152 if (lif->rss_ind_tbl_z) { in ionic_lif_rss_teardown()
1154 ionic_lif_rss_config(lif, 0x0, NULL, NULL); in ionic_lif_rss_teardown()
1156 lif->rss_ind_tbl = NULL; in ionic_lif_rss_teardown()
1157 lif->rss_ind_tbl_pa = 0; in ionic_lif_rss_teardown()
1158 rte_memzone_free(lif->rss_ind_tbl_z); in ionic_lif_rss_teardown()
1159 lif->rss_ind_tbl_z = NULL; in ionic_lif_rss_teardown()
1176 ionic_lif_adminq_deinit(struct ionic_lif *lif) in ionic_lif_adminq_deinit() argument
1178 lif->adminqcq->flags &= ~IONIC_QCQ_F_INITED; in ionic_lif_adminq_deinit()
1182 ionic_lif_notifyq_deinit(struct ionic_lif *lif) in ionic_lif_notifyq_deinit() argument
1184 struct ionic_notify_qcq *nqcq = lif->notifyqcq; in ionic_lif_notifyq_deinit()
1185 struct ionic_dev *idev = &lif->adapter->idev; in ionic_lif_notifyq_deinit()
1210 ionic_link_status_check(struct ionic_lif *lif) in ionic_link_status_check() argument
1212 struct ionic_adapter *adapter = lif->adapter; in ionic_link_status_check()
1215 lif->state &= ~IONIC_LIF_F_LINK_CHECK_NEEDED; in ionic_link_status_check()
1217 if (!lif->info) in ionic_link_status_check()
1220 link_up = (lif->info->status.link_status == IONIC_PORT_OPER_STATUS_UP); in ionic_link_status_check()
1228 rte_le_to_cpu_32(lif->info->status.link_speed); in ionic_link_status_check()
1236 ionic_dev_link_update(lif->eth_dev, 0); in ionic_link_status_check()
1240 ionic_lif_handle_fw_down(struct ionic_lif *lif) in ionic_lif_handle_fw_down() argument
1242 if (lif->state & IONIC_LIF_F_FW_RESET) in ionic_lif_handle_fw_down()
1245 lif->state |= IONIC_LIF_F_FW_RESET; in ionic_lif_handle_fw_down()
1247 if (lif->state & IONIC_LIF_F_UP) { in ionic_lif_handle_fw_down()
1249 "Surprise FW stop, stopping %s\n", lif->name); in ionic_lif_handle_fw_down()
1250 ionic_lif_stop(lif); in ionic_lif_handle_fw_down()
1253 IONIC_PRINT(NOTICE, "FW down, %s stopped", lif->name); in ionic_lif_handle_fw_down()
1261 struct ionic_lif *lif = cb_arg; in ionic_notifyq_cb() local
1267 if (!(cq_desc->event.eid > lif->last_eid)) in ionic_notifyq_cb()
1270 lif->last_eid = cq_desc->event.eid; in ionic_notifyq_cb()
1277 lif->name, in ionic_notifyq_cb()
1282 lif->state |= IONIC_LIF_F_LINK_CHECK_NEEDED; in ionic_notifyq_cb()
1289 lif->name, in ionic_notifyq_cb()
1293 ionic_lif_handle_fw_down(lif); in ionic_notifyq_cb()
1306 ionic_notifyq_handler(struct ionic_lif *lif, int budget) in ionic_notifyq_handler() argument
1308 struct ionic_dev *idev = &lif->adapter->idev; in ionic_notifyq_handler()
1309 struct ionic_notify_qcq *nqcq = lif->notifyqcq; in ionic_notifyq_handler()
1321 ionic_notifyq_cb, lif); in ionic_notifyq_handler()
1323 if (lif->state & IONIC_LIF_F_LINK_CHECK_NEEDED) in ionic_notifyq_handler()
1324 ionic_link_status_check(lif); in ionic_notifyq_handler()
1336 ionic_lif_adminq_init(struct ionic_lif *lif) in ionic_lif_adminq_init() argument
1338 struct ionic_dev *idev = &lif->adapter->idev; in ionic_lif_adminq_init()
1339 struct ionic_admin_qcq *aqcq = lif->adminqcq; in ionic_lif_adminq_init()
1353 q->db = ionic_db_map(lif, q); in ionic_lif_adminq_init()
1365 ionic_lif_notifyq_init(struct ionic_lif *lif) in ionic_lif_notifyq_init() argument
1367 struct ionic_dev *idev = &lif->adapter->idev; in ionic_lif_notifyq_init()
1368 struct ionic_notify_qcq *nqcq = lif->notifyqcq; in ionic_lif_notifyq_init()
1377 .ver = lif->qtype_info[q->type].version, in ionic_lif_notifyq_init()
1393 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_notifyq_init()
1414 ionic_lif_set_features(struct ionic_lif *lif) in ionic_lif_set_features() argument
1421 .features = rte_cpu_to_le_64(lif->features), in ionic_lif_set_features()
1426 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_set_features()
1430 lif->hw_features = rte_le_to_cpu_64(ctx.cmd.lif_setattr.features & in ionic_lif_set_features()
1433 if (lif->hw_features & IONIC_ETH_HW_VLAN_TX_TAG) in ionic_lif_set_features()
1435 if (lif->hw_features & IONIC_ETH_HW_VLAN_RX_STRIP) in ionic_lif_set_features()
1437 if (lif->hw_features & IONIC_ETH_HW_VLAN_RX_FILTER) in ionic_lif_set_features()
1439 if (lif->hw_features & IONIC_ETH_HW_RX_HASH) in ionic_lif_set_features()
1441 if (lif->hw_features & IONIC_ETH_HW_TX_SG) in ionic_lif_set_features()
1443 if (lif->hw_features & IONIC_ETH_HW_RX_SG) in ionic_lif_set_features()
1445 if (lif->hw_features & IONIC_ETH_HW_TX_CSUM) in ionic_lif_set_features()
1447 if (lif->hw_features & IONIC_ETH_HW_RX_CSUM) in ionic_lif_set_features()
1449 if (lif->hw_features & IONIC_ETH_HW_TSO) in ionic_lif_set_features()
1451 if (lif->hw_features & IONIC_ETH_HW_TSO_IPV6) in ionic_lif_set_features()
1453 if (lif->hw_features & IONIC_ETH_HW_TSO_ECN) in ionic_lif_set_features()
1455 if (lif->hw_features & IONIC_ETH_HW_TSO_GRE) in ionic_lif_set_features()
1457 if (lif->hw_features & IONIC_ETH_HW_TSO_GRE_CSUM) in ionic_lif_set_features()
1459 if (lif->hw_features & IONIC_ETH_HW_TSO_IPXIP4) in ionic_lif_set_features()
1461 if (lif->hw_features & IONIC_ETH_HW_TSO_IPXIP6) in ionic_lif_set_features()
1463 if (lif->hw_features & IONIC_ETH_HW_TSO_UDP) in ionic_lif_set_features()
1465 if (lif->hw_features & IONIC_ETH_HW_TSO_UDP_CSUM) in ionic_lif_set_features()
1476 struct ionic_lif *lif = qcq->lif; in ionic_lif_txq_init() local
1483 .ver = lif->qtype_info[q->type].version, in ionic_lif_txq_init()
1502 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_txq_init()
1508 q->db = ionic_db_map(lif, q); in ionic_lif_txq_init()
1524 struct ionic_lif *lif = qcq->lif; in ionic_lif_rxq_init() local
1531 .ver = lif->qtype_info[q->type].version, in ionic_lif_rxq_init()
1550 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_rxq_init()
1556 q->db = ionic_db_map(lif, q); in ionic_lif_rxq_init()
1568 ionic_station_set(struct ionic_lif *lif) in ionic_station_set() argument
1581 err = ionic_adminq_post_wait(lif, &ctx); in ionic_station_set()
1585 memcpy(lif->mac_addr, ctx.comp.lif_getattr.mac, RTE_ETHER_ADDR_LEN); in ionic_station_set()
1591 ionic_lif_set_name(struct ionic_lif *lif) in ionic_lif_set_name() argument
1601 memcpy(ctx.cmd.lif_setattr.name, lif->name, in ionic_lif_set_name()
1604 ionic_adminq_post_wait(lif, &ctx); in ionic_lif_set_name()
1608 ionic_lif_init(struct ionic_lif *lif) in ionic_lif_init() argument
1610 struct ionic_dev *idev = &lif->adapter->idev; in ionic_lif_init()
1614 memset(&lif->stats_base, 0, sizeof(lif->stats_base)); in ionic_lif_init()
1616 ionic_dev_cmd_lif_init(idev, lif->info_pa); in ionic_lif_init()
1623 lif->hw_index = rte_cpu_to_le_16(comp.hw_index); in ionic_lif_init()
1625 err = ionic_lif_adminq_init(lif); in ionic_lif_init()
1629 err = ionic_lif_notifyq_init(lif); in ionic_lif_init()
1637 lif->features = IONIC_ETH_HW_RX_HASH | IONIC_ETH_HW_VLAN_RX_FILTER; in ionic_lif_init()
1639 err = ionic_lif_set_features(lif); in ionic_lif_init()
1643 err = ionic_rx_filters_init(lif); in ionic_lif_init()
1647 err = ionic_station_set(lif); in ionic_lif_init()
1651 ionic_lif_set_name(lif); in ionic_lif_init()
1653 lif->state |= IONIC_LIF_F_INITED; in ionic_lif_init()
1658 ionic_rx_filters_deinit(lif); in ionic_lif_init()
1661 ionic_lif_notifyq_deinit(lif); in ionic_lif_init()
1664 ionic_lif_adminq_deinit(lif); in ionic_lif_init()
1670 ionic_lif_deinit(struct ionic_lif *lif) in ionic_lif_deinit() argument
1672 if (!(lif->state & IONIC_LIF_F_INITED)) in ionic_lif_deinit()
1675 ionic_rx_filters_deinit(lif); in ionic_lif_deinit()
1676 ionic_lif_rss_teardown(lif); in ionic_lif_deinit()
1677 ionic_lif_notifyq_deinit(lif); in ionic_lif_deinit()
1678 ionic_lif_adminq_deinit(lif); in ionic_lif_deinit()
1680 lif->state &= ~IONIC_LIF_F_INITED; in ionic_lif_deinit()
1684 ionic_lif_configure_vlan_offload(struct ionic_lif *lif, int mask) in ionic_lif_configure_vlan_offload() argument
1686 struct rte_eth_dev *eth_dev = lif->eth_dev; in ionic_lif_configure_vlan_offload()
1697 lif->features |= IONIC_ETH_HW_VLAN_RX_STRIP; in ionic_lif_configure_vlan_offload()
1699 lif->features &= ~IONIC_ETH_HW_VLAN_RX_STRIP; in ionic_lif_configure_vlan_offload()
1704 ionic_lif_configure(struct ionic_lif *lif) in ionic_lif_configure() argument
1706 struct rte_eth_rxmode *rxmode = &lif->eth_dev->data->dev_conf.rxmode; in ionic_lif_configure()
1707 struct rte_eth_txmode *txmode = &lif->eth_dev->data->dev_conf.txmode; in ionic_lif_configure()
1708 struct ionic_identity *ident = &lif->adapter->ident; in ionic_lif_configure()
1709 union ionic_lif_config *cfg = &ident->lif.eth.config; in ionic_lif_configure()
1714 uint32_t nrxqs = lif->eth_dev->data->nb_rx_queues; in ionic_lif_configure()
1715 uint32_t ntxqs = lif->eth_dev->data->nb_tx_queues; in ionic_lif_configure()
1717 lif->port_id = lif->eth_dev->data->port_id; in ionic_lif_configure()
1720 lif->port_id); in ionic_lif_configure()
1728 lif->nrxqcqs = nrxqs_per_lif; in ionic_lif_configure()
1729 lif->ntxqcqs = ntxqs_per_lif; in ionic_lif_configure()
1744 lif->features |= IONIC_ETH_HW_RX_CSUM; in ionic_lif_configure()
1746 lif->features &= ~IONIC_ETH_HW_RX_CSUM; in ionic_lif_configure()
1749 lif->features |= IONIC_ETH_HW_RX_SG; in ionic_lif_configure()
1750 lif->eth_dev->data->scattered_rx = 1; in ionic_lif_configure()
1752 lif->features &= ~IONIC_ETH_HW_RX_SG; in ionic_lif_configure()
1753 lif->eth_dev->data->scattered_rx = 0; in ionic_lif_configure()
1757 ionic_lif_configure_vlan_offload(lif, RTE_ETH_VLAN_STRIP_MASK); in ionic_lif_configure()
1766 lif->features |= IONIC_ETH_HW_TX_CSUM; in ionic_lif_configure()
1768 lif->features &= ~IONIC_ETH_HW_TX_CSUM; in ionic_lif_configure()
1771 lif->features |= IONIC_ETH_HW_VLAN_TX_TAG; in ionic_lif_configure()
1773 lif->features &= ~IONIC_ETH_HW_VLAN_TX_TAG; in ionic_lif_configure()
1776 lif->features |= IONIC_ETH_HW_TX_SG; in ionic_lif_configure()
1778 lif->features &= ~IONIC_ETH_HW_TX_SG; in ionic_lif_configure()
1781 lif->features |= IONIC_ETH_HW_TSO; in ionic_lif_configure()
1782 lif->features |= IONIC_ETH_HW_TSO_IPV6; in ionic_lif_configure()
1783 lif->features |= IONIC_ETH_HW_TSO_ECN; in ionic_lif_configure()
1785 lif->features &= ~IONIC_ETH_HW_TSO; in ionic_lif_configure()
1786 lif->features &= ~IONIC_ETH_HW_TSO_IPV6; in ionic_lif_configure()
1787 lif->features &= ~IONIC_ETH_HW_TSO_ECN; in ionic_lif_configure()
1792 ionic_lif_start(struct ionic_lif *lif) in ionic_lif_start() argument
1798 err = ionic_lif_rss_setup(lif); in ionic_lif_start()
1802 if (!lif->rx_mode) { in ionic_lif_start()
1804 lif->name); in ionic_lif_start()
1810 ionic_set_rx_mode(lif, rx_mode); in ionic_lif_start()
1815 lif->nrxqcqs, lif->ntxqcqs, lif->port_id); in ionic_lif_start()
1817 for (i = 0; i < lif->nrxqcqs; i++) { in ionic_lif_start()
1818 struct ionic_rx_qcq *rxq = lif->rxqcqs[i]; in ionic_lif_start()
1820 err = ionic_dev_rx_queue_start(lif->eth_dev, i); in ionic_lif_start()
1827 for (i = 0; i < lif->ntxqcqs; i++) { in ionic_lif_start()
1828 struct ionic_tx_qcq *txq = lif->txqcqs[i]; in ionic_lif_start()
1830 err = ionic_dev_tx_queue_start(lif->eth_dev, i); in ionic_lif_start()
1838 lif->state |= IONIC_LIF_F_UP; in ionic_lif_start()
1840 ionic_link_status_check(lif); in ionic_lif_start()
1850 union ionic_lif_config *cfg = &ident->lif.eth.config; in ionic_lif_identify()
1851 uint32_t lif_words = RTE_DIM(ident->lif.words); in ionic_lif_identify()
1864 ident->lif.words[i] = ioread32(&idev->dev_cmd->data[i]); in ionic_lif_identify()
1867 rte_le_to_cpu_64(ident->lif.capabilities)); in ionic_lif_identify()
1870 rte_le_to_cpu_32(ident->lif.eth.max_ucast_filters)); in ionic_lif_identify()
1872 rte_le_to_cpu_32(ident->lif.eth.max_mcast_filters)); in ionic_lif_identify()
1892 union ionic_lif_config *cfg = &ident->lif.eth.config; in ionic_lifs_size()