Lines Matching +full:rpm +full:- +full:stats
1 // SPDX-License-Identifier: GPL-2.0
24 #define DRV_NAME "Marvell-CGX/RPM"
25 #define DRV_STRING "Marvell CGX/RPM Driver"
78 return (cgx->pdev->device == PCI_DEVID_CN10K_RPM) || in is_dev_rpm()
79 (cgx->pdev->device == PCI_DEVID_CN10KB_RPM); in is_dev_rpm()
84 if (!cgx || lmac_id < 0 || lmac_id >= cgx->max_lmac_per_mac) in is_lmac_valid()
86 return test_bit(lmac_id, &cgx->lmac_bmap); in is_lmac_valid()
96 for_each_set_bit(tmp, &cgx->lmac_bmap, cgx->max_lmac_per_mac) { in get_sequence_id_of_lmac()
110 return ((struct cgx *)cgxd)->mac_ops; in get_mac_ops()
115 writeq(val, cgx->reg_base + (lmac << cgx->mac_ops->lmac_offset) + in cgx_write()
121 return readq(cgx->reg_base + (lmac << cgx->mac_ops->lmac_offset) + in cgx_read()
127 if (!cgx || lmac_id >= cgx->max_lmac_per_mac) in lmac_pdata()
130 return cgx->lmac_idmap[lmac_id]; in lmac_pdata()
136 int idmax = -ENODEV; in cgx_get_cgxcnt_max()
139 if (cgx_dev->cgx_id > idmax) in cgx_get_cgxcnt_max()
140 idmax = cgx_dev->cgx_id; in cgx_get_cgxcnt_max()
153 return -ENODEV; in cgx_get_lmac_cnt()
155 return cgx->lmac_count; in cgx_get_lmac_cnt()
163 if (cgx_dev->cgx_id == cgx_id) in cgx_get_pdata()
195 return -EINVAL; in cgx_get_cgxid()
197 return cgx->cgx_id; in cgx_get_cgxid()
221 return -ENODEV; in cgx_get_link_info()
223 *linfo = lmac->link_info; in cgx_get_link_info()
236 return -ENODEV; in cgx_lmac_addr_set()
239 mac_ops = cgx_dev->mac_ops; in cgx_lmac_addr_set()
248 index = id * lmac->mac_to_index_bmap.max; in cgx_lmac_addr_set()
271 mac_ops = cgx->mac_ops; in cgx_read_dmac_ctrl()
285 mac_ops = cgx->mac_ops; in cgx_read_dmac_entry()
299 return -ENODEV; in cgx_lmac_addr_add()
301 mac_ops = cgx_dev->mac_ops; in cgx_lmac_addr_add()
303 idx = rvu_alloc_rsrc(&lmac->mac_to_index_bmap); in cgx_lmac_addr_add()
309 index = id * lmac->mac_to_index_bmap.max + idx; in cgx_lmac_addr_add()
322 lmac->mcast_filters_count++; in cgx_lmac_addr_add()
323 } else if (!lmac->mcast_filters_count) { in cgx_lmac_addr_add()
341 return -ENODEV; in cgx_lmac_addr_reset()
343 mac_ops = cgx_dev->mac_ops; in cgx_lmac_addr_reset()
347 set_bit(0, lmac->mac_to_index_bmap.bmap); in cgx_lmac_addr_reset()
351 index = id * lmac->mac_to_index_bmap.max + index; in cgx_lmac_addr_reset()
377 return -ENODEV; in cgx_lmac_addr_update()
379 mac_ops = cgx_dev->mac_ops; in cgx_lmac_addr_update()
381 if (index >= lmac->mac_to_index_bmap.max) in cgx_lmac_addr_update()
382 return -EINVAL; in cgx_lmac_addr_update()
385 if (!test_bit(index, lmac->mac_to_index_bmap.bmap)) in cgx_lmac_addr_update()
386 return -EINVAL; in cgx_lmac_addr_update()
390 index = id * lmac->mac_to_index_bmap.max + index; in cgx_lmac_addr_update()
410 return -ENODEV; in cgx_lmac_addr_del()
412 mac_ops = cgx_dev->mac_ops; in cgx_lmac_addr_del()
414 if (index >= lmac->mac_to_index_bmap.max) in cgx_lmac_addr_del()
415 return -EINVAL; in cgx_lmac_addr_del()
421 rvu_free_rsrc(&lmac->mac_to_index_bmap, index); in cgx_lmac_addr_del()
425 index = id * lmac->mac_to_index_bmap.max + index; in cgx_lmac_addr_del()
432 lmac->mcast_filters_count--; in cgx_lmac_addr_del()
434 if (!lmac->mcast_filters_count) { in cgx_lmac_addr_del()
452 return lmac->mac_to_index_bmap.max; in cgx_lmac_addr_max_entries_get()
466 mac_ops = cgx_dev->mac_ops; in cgx_lmac_addr_get()
470 index = id * lmac->mac_to_index_bmap.max; in cgx_lmac_addr_get()
481 return -ENODEV; in cgx_set_pkind()
483 cgx_write(cgx, lmac_id, cgx->mac_ops->rxid_map_offset, (pkind & 0x3F)); in cgx_set_pkind()
502 fifo_len = cgx->mac_ops->fifo_len; in cgx_get_lmac_fifo_len()
503 num_lmacs = cgx->mac_ops->get_nr_lmacs(cgx); in cgx_get_lmac_fifo_len()
530 return -ENODEV; in cgx_lmac_internal_loopback()
533 if (lmac->lmac_type == LMAC_MODE_SGMII || in cgx_lmac_internal_loopback()
534 lmac->lmac_type == LMAC_MODE_QSGMII) { in cgx_lmac_internal_loopback()
565 max_dmac = lmac->mac_to_index_bmap.max; in cgx_lmac_promisc_config()
568 mac_ops = cgx->mac_ops; in cgx_lmac_promisc_config()
614 return -ENODEV; in cgx_lmac_get_pause_frm_status()
641 if (!bitmap_weight(lmac->rx_fc_pfvf_bmap.bmap, lmac->rx_fc_pfvf_bmap.max)) in cgx_lmac_enadis_rx_pause_fwding()
684 return -ENODEV; in cgx_get_rx_stats()
694 return -ENODEV; in cgx_get_tx_stats()
701 return ((struct cgx *)cgxd)->hw_features; in cgx_features_get()
706 if (!linfo->fec) in cgx_set_fec_stats_count()
709 switch (linfo->lmac_type_id) { in cgx_set_fec_stats_count()
723 if (linfo->fec == OTX2_FEC_BASER) in cgx_set_fec_stats_count()
734 int stats, fec_stats_count = 0; in cgx_get_fec_stats() local
739 return -ENODEV; in cgx_get_fec_stats()
741 if (cgx->lmac_idmap[lmac_id]->link_info.fec == OTX2_FEC_NONE) in cgx_get_fec_stats()
745 cgx_set_fec_stats_count(&cgx->lmac_idmap[lmac_id]->link_info); in cgx_get_fec_stats()
746 if (cgx->lmac_idmap[lmac_id]->link_info.fec == OTX2_FEC_BASER) { in cgx_get_fec_stats()
753 for (stats = 0; stats < fec_stats_count; stats++) { in cgx_get_fec_stats()
754 rsp->fec_corr_blks += in cgx_get_fec_stats()
755 cgx_read(cgx, lmac_id, corr_reg + (stats * 8)); in cgx_get_fec_stats()
756 rsp->fec_uncorr_blks += in cgx_get_fec_stats()
757 cgx_read(cgx, lmac_id, uncorr_reg + (stats * 8)); in cgx_get_fec_stats()
768 return -ENODEV; in cgx_lmac_rx_tx_enable()
785 return -ENODEV; in cgx_lmac_tx_enable()
809 return -ENODEV; in cgx_lmac_enadis_pause_frm()
892 return -ENODEV; in verify_lmac_fc_cfg()
895 clear_bit(pfvf_idx, lmac->rx_fc_pfvf_bmap.bmap); in verify_lmac_fc_cfg()
897 set_bit(pfvf_idx, lmac->rx_fc_pfvf_bmap.bmap); in verify_lmac_fc_cfg()
900 clear_bit(pfvf_idx, lmac->tx_fc_pfvf_bmap.bmap); in verify_lmac_fc_cfg()
902 set_bit(pfvf_idx, lmac->tx_fc_pfvf_bmap.bmap); in verify_lmac_fc_cfg()
905 if (!rx_pause && bitmap_weight(lmac->rx_fc_pfvf_bmap.bmap, lmac->rx_fc_pfvf_bmap.max)) { in verify_lmac_fc_cfg()
906 dev_warn(&cgx->pdev->dev, in verify_lmac_fc_cfg()
908 return -EPERM; in verify_lmac_fc_cfg()
911 if (!tx_pause && bitmap_weight(lmac->tx_fc_pfvf_bmap.bmap, lmac->tx_fc_pfvf_bmap.max)) { in verify_lmac_fc_cfg()
912 dev_warn(&cgx->pdev->dev, in verify_lmac_fc_cfg()
914 return -EPERM; in verify_lmac_fc_cfg()
927 return -ENODEV; in cgx_lmac_pfc_config()
957 cfg = cgx_lmac_addr_get(cgx->cgx_id, lmac_id); in cgx_lmac_pfc_config()
970 return -ENODEV; in cgx_lmac_get_pfc_frm_cfg()
1012 struct cgx *cgx = lmac->cgx; in cgx_fwi_cmd_send()
1018 err = mutex_lock_interruptible(&lmac->cmd_lock); in cgx_fwi_cmd_send()
1023 cmd = cgx_read(cgx, lmac->lmac_id, CGX_COMMAND_REG); in cgx_fwi_cmd_send()
1025 err = -EBUSY; in cgx_fwi_cmd_send()
1033 lmac->cmd_pend = true; in cgx_fwi_cmd_send()
1036 cgx_write(cgx, lmac->lmac_id, CGX_COMMAND_REG, req); in cgx_fwi_cmd_send()
1039 if (!wait_event_timeout(lmac->wq_cmd_cmplt, !lmac->cmd_pend, in cgx_fwi_cmd_send()
1041 dev = &cgx->pdev->dev; in cgx_fwi_cmd_send()
1043 cgx->cgx_id, lmac->lmac_id, FIELD_GET(CMDREG_ID, req)); in cgx_fwi_cmd_send()
1050 *resp = lmac->resp; in cgx_fwi_cmd_send()
1053 mutex_unlock(&lmac->cmd_lock); in cgx_fwi_cmd_send()
1065 return -ENODEV; in cgx_fwi_cmd_generic()
1072 return -EIO; in cgx_fwi_cmd_generic()
1119 if (args->duplex == DUPLEX_UNKNOWN) in set_mod_args()
1120 args->duplex = duplex; in set_mod_args()
1121 if (args->speed == SPEED_UNKNOWN) in set_mod_args()
1122 args->speed = speed; in set_mod_args()
1123 if (args->an == AUTONEG_UNKNOWN) in set_mod_args()
1124 args->an = autoneg; in set_mod_args()
1125 args->mode = mode; in set_mod_args()
1126 args->ports = 0; in set_mod_args()
1221 linfo->link_up = FIELD_GET(RESP_LINKSTAT_UP, lstat); in link_status_user_format()
1222 linfo->full_duplex = FIELD_GET(RESP_LINKSTAT_FDUPLEX, lstat); in link_status_user_format()
1223 linfo->speed = cgx_speed_mbps[FIELD_GET(RESP_LINKSTAT_SPEED, lstat)]; in link_status_user_format()
1224 linfo->an = FIELD_GET(RESP_LINKSTAT_AN, lstat); in link_status_user_format()
1225 linfo->fec = FIELD_GET(RESP_LINKSTAT_FEC, lstat); in link_status_user_format()
1226 linfo->lmac_type_id = FIELD_GET(RESP_LINKSTAT_LMAC_TYPE, lstat); in link_status_user_format()
1228 if (linfo->lmac_type_id >= LMAC_MODE_MAX) { in link_status_user_format()
1229 dev_err(&cgx->pdev->dev, "Unknown lmac_type_id %d reported by firmware on cgx port%d:%d", in link_status_user_format()
1230 linfo->lmac_type_id, cgx->cgx_id, lmac_id); in link_status_user_format()
1231 strscpy(linfo->lmac_type, "Unknown", sizeof(linfo->lmac_type)); in link_status_user_format()
1235 strscpy(linfo->lmac_type, cgx_lmactype_string[linfo->lmac_type_id], in link_status_user_format()
1236 sizeof(linfo->lmac_type)); in link_status_user_format()
1244 struct cgx *cgx = lmac->cgx; in cgx_link_change_handler()
1249 dev = &cgx->pdev->dev; in cgx_link_change_handler()
1251 link_status_user_format(lstat, &event.link_uinfo, cgx, lmac->lmac_id); in cgx_link_change_handler()
1254 event.cgx_id = cgx->cgx_id; in cgx_link_change_handler()
1255 event.lmac_id = lmac->lmac_id; in cgx_link_change_handler()
1258 lmac->link_info = event.link_uinfo; in cgx_link_change_handler()
1259 linfo = &lmac->link_info; in cgx_link_change_handler()
1265 spin_lock(&lmac->event_cb_lock); in cgx_link_change_handler()
1267 if (!lmac->event_cb.notify_link_chg) { in cgx_link_change_handler()
1269 cgx->cgx_id, lmac->lmac_id); in cgx_link_change_handler()
1272 cgx->cgx_id, lmac->lmac_id, err_type); in cgx_link_change_handler()
1275 cgx->cgx_id, lmac->lmac_id, in cgx_link_change_handler()
1276 linfo->link_up ? "UP" : "DOWN", linfo->speed); in cgx_link_change_handler()
1280 if (lmac->event_cb.notify_link_chg(&event, lmac->event_cb.data)) in cgx_link_change_handler()
1283 spin_unlock(&lmac->event_cb_lock); in cgx_link_change_handler()
1313 cgx = lmac->cgx; in cgx_fwi_event_handler()
1315 /* Clear SW_INT for RPM and CMR_INT for CGX */ in cgx_fwi_event_handler()
1316 offset = cgx->mac_ops->int_register; in cgx_fwi_event_handler()
1317 clear_bit = cgx->mac_ops->int_ena_bit; in cgx_fwi_event_handler()
1319 event = cgx_read(cgx, lmac->lmac_id, CGX_EVENT_REG); in cgx_fwi_event_handler()
1329 lmac->resp = event; in cgx_fwi_event_handler()
1340 lmac->cmd_pend = false; in cgx_fwi_event_handler()
1341 wake_up_interruptible(&lmac->wq_cmd_cmplt); in cgx_fwi_event_handler()
1353 cgx_write(lmac->cgx, lmac->lmac_id, CGX_EVENT_REG, 0); in cgx_fwi_event_handler()
1354 cgx_write(lmac->cgx, lmac->lmac_id, offset, clear_bit); in cgx_fwi_event_handler()
1369 return -ENODEV; in cgx_lmac_evh_register()
1371 lmac->event_cb = *cb; in cgx_lmac_evh_register()
1384 return -ENODEV; in cgx_lmac_evh_unregister()
1386 spin_lock_irqsave(&lmac->event_cb_lock, flags); in cgx_lmac_evh_unregister()
1387 lmac->event_cb.notify_link_chg = NULL; in cgx_lmac_evh_unregister()
1388 lmac->event_cb.data = NULL; in cgx_lmac_evh_unregister()
1389 spin_unlock_irqrestore(&lmac->event_cb_lock, flags); in cgx_lmac_evh_unregister()
1403 return -ENXIO; in cgx_get_fwdata_base()
1405 first_lmac = find_first_bit(&cgx->lmac_bmap, cgx->max_lmac_per_mac); in cgx_get_fwdata_base()
1421 return -ENODEV; in cgx_set_link_mode()
1426 return -EINVAL; in cgx_set_link_mode()
1446 return -ENXIO; in cgx_set_fec()
1454 cgx->lmac_idmap[lmac_id]->link_info.fec = in cgx_set_fec()
1456 return cgx->lmac_idmap[lmac_id]->link_info.fec; in cgx_set_fec()
1465 return -ENODEV; in cgx_get_phy_fec_stats()
1494 int first_lmac = find_first_bit(&cgx->lmac_bmap, cgx->max_lmac_per_mac); in cgx_fwi_read_version()
1503 struct device *dev = &cgx->pdev->dev; in cgx_lmac_verify_fwi_version()
1508 if (!cgx->lmac_count) in cgx_lmac_verify_fwi_version()
1520 return -EIO; in cgx_lmac_verify_fwi_version()
1528 struct device *dev = &cgx->pdev->dev; in cgx_lmac_linkup_work()
1532 for_each_set_bit(i, &cgx->lmac_bmap, cgx->max_lmac_per_mac) { in cgx_lmac_linkup_work()
1536 cgx->cgx_id, i); in cgx_lmac_linkup_work()
1545 return -ENODEV; in cgx_lmac_linkup_start()
1547 queue_work(cgx->cgx_cmd_workq, &cgx->cgx_cmd_work); in cgx_lmac_linkup_start()
1558 return -ENODEV; in cgx_lmac_reset()
1572 struct mac_ops *mac_ops = cgx->mac_ops; in cgx_configure_interrupt()
1577 irq = pci_irq_vector(cgx->pdev, mac_ops->lmac_fwi + in cgx_configure_interrupt()
1578 cnt * mac_ops->irq_offset); in cgx_configure_interrupt()
1579 offset = mac_ops->int_set_reg; in cgx_configure_interrupt()
1580 ena_bit = mac_ops->int_ena_bit; in cgx_configure_interrupt()
1587 err = request_irq(irq, cgx_fwi_event_handler, 0, lmac->name, lmac); in cgx_configure_interrupt()
1592 cgx_write(cgx, lmac->lmac_id, offset, ena_bit); in cgx_configure_interrupt()
1607 return cgx->lmac_idmap[lmac_index]->lmac_id; in cgx_get_lmacid()
1614 return cgx->lmac_bmap; in cgx_get_lmac_bmap()
1626 if (cgx->mac_ops->non_contiguous_serdes_lane) { in cgx_lmac_init()
1635 if (cgx->lmac_count > cgx->max_lmac_per_mac) in cgx_lmac_init()
1636 cgx->lmac_count = cgx->max_lmac_per_mac; in cgx_lmac_init()
1638 for (i = 0; i < cgx->lmac_count; i++) { in cgx_lmac_init()
1641 return -ENOMEM; in cgx_lmac_init()
1642 lmac->name = kcalloc(1, sizeof("cgx_fwi_xxx_yyy"), GFP_KERNEL); in cgx_lmac_init()
1643 if (!lmac->name) { in cgx_lmac_init()
1644 err = -ENOMEM; in cgx_lmac_init()
1647 sprintf(lmac->name, "cgx_fwi_%d_%d", cgx->cgx_id, i); in cgx_lmac_init()
1648 if (cgx->mac_ops->non_contiguous_serdes_lane) { in cgx_lmac_init()
1649 lmac->lmac_id = __ffs64(lmac_list); in cgx_lmac_init()
1650 lmac_list &= ~BIT_ULL(lmac->lmac_id); in cgx_lmac_init()
1652 lmac->lmac_id = i; in cgx_lmac_init()
1655 lmac->cgx = cgx; in cgx_lmac_init()
1656 lmac->mac_to_index_bmap.max = in cgx_lmac_init()
1657 cgx->mac_ops->dmac_filter_count / in cgx_lmac_init()
1658 cgx->lmac_count; in cgx_lmac_init()
1660 err = rvu_alloc_bitmap(&lmac->mac_to_index_bmap); in cgx_lmac_init()
1665 set_bit(0, lmac->mac_to_index_bmap.bmap); in cgx_lmac_init()
1667 lmac->rx_fc_pfvf_bmap.max = 128; in cgx_lmac_init()
1668 err = rvu_alloc_bitmap(&lmac->rx_fc_pfvf_bmap); in cgx_lmac_init()
1672 lmac->tx_fc_pfvf_bmap.max = 128; in cgx_lmac_init()
1673 err = rvu_alloc_bitmap(&lmac->tx_fc_pfvf_bmap); in cgx_lmac_init()
1677 init_waitqueue_head(&lmac->wq_cmd_cmplt); in cgx_lmac_init()
1678 mutex_init(&lmac->cmd_lock); in cgx_lmac_init()
1679 spin_lock_init(&lmac->event_cb_lock); in cgx_lmac_init()
1680 err = cgx_configure_interrupt(cgx, lmac, lmac->lmac_id, false); in cgx_lmac_init()
1685 cgx->lmac_idmap[lmac->lmac_id] = lmac; in cgx_lmac_init()
1686 set_bit(lmac->lmac_id, &cgx->lmac_bmap); in cgx_lmac_init()
1687 cgx->mac_ops->mac_pause_frm_config(cgx, lmac->lmac_id, true); in cgx_lmac_init()
1688 lmac->lmac_type = cgx->mac_ops->get_lmac_type(cgx, lmac->lmac_id); in cgx_lmac_init()
1694 rvu_free_bitmap(&lmac->tx_fc_pfvf_bmap); in cgx_lmac_init()
1696 rvu_free_bitmap(&lmac->rx_fc_pfvf_bmap); in cgx_lmac_init()
1698 rvu_free_bitmap(&lmac->mac_to_index_bmap); in cgx_lmac_init()
1700 kfree(lmac->name); in cgx_lmac_init()
1711 if (cgx->cgx_cmd_workq) { in cgx_lmac_exit()
1712 destroy_workqueue(cgx->cgx_cmd_workq); in cgx_lmac_exit()
1713 cgx->cgx_cmd_workq = NULL; in cgx_lmac_exit()
1717 for_each_set_bit(i, &cgx->lmac_bmap, cgx->max_lmac_per_mac) { in cgx_lmac_exit()
1718 lmac = cgx->lmac_idmap[i]; in cgx_lmac_exit()
1721 cgx->mac_ops->mac_pause_frm_config(cgx, lmac->lmac_id, false); in cgx_lmac_exit()
1722 cgx_configure_interrupt(cgx, lmac, lmac->lmac_id, true); in cgx_lmac_exit()
1723 kfree(lmac->mac_to_index_bmap.bmap); in cgx_lmac_exit()
1724 kfree(lmac->name); in cgx_lmac_exit()
1736 cgx->mac_ops->fifo_len = FIELD_GET(CGX_CONST_RXFIFO_SIZE, cfg); in cgx_populate_features()
1737 cgx->max_lmac_per_mac = FIELD_GET(CGX_CONST_MAX_LMACS, cfg); in cgx_populate_features()
1740 cgx->hw_features = (RVU_LMAC_FEAT_DMACF | RVU_MAC_RPM | in cgx_populate_features()
1743 cgx->hw_features = (RVU_LMAC_FEAT_FC | RVU_LMAC_FEAT_HIGIG2 | in cgx_populate_features()
1749 if (cgx->pdev->subsystem_device == PCI_SUBSYS_DEVID_CNF10KB_RPM || in cgx_get_rxid_mapoffset()
1790 struct device *dev = &pdev->dev; in cgx_probe()
1796 return -ENOMEM; in cgx_probe()
1797 cgx->pdev = pdev; in cgx_probe()
1803 cgx->mac_ops = rpm_get_mac_ops(cgx); in cgx_probe()
1805 cgx->mac_ops = &cgx_mac_ops; in cgx_probe()
1807 cgx->mac_ops->rxid_map_offset = cgx_get_rxid_mapoffset(cgx); in cgx_probe()
1823 cgx->reg_base = pcim_iomap(pdev, PCI_CFG_REG_BAR_NUM, 0); in cgx_probe()
1824 if (!cgx->reg_base) { in cgx_probe()
1826 err = -ENOMEM; in cgx_probe()
1830 cgx->lmac_count = cgx->mac_ops->get_nr_lmacs(cgx); in cgx_probe()
1831 if (!cgx->lmac_count) { in cgx_probe()
1832 dev_notice(dev, "CGX %d LMAC count is zero, skipping probe\n", cgx->cgx_id); in cgx_probe()
1833 err = -EOPNOTSUPP; in cgx_probe()
1837 nvec = pci_msix_vec_count(cgx->pdev); in cgx_probe()
1845 cgx->cgx_id = (pci_resource_start(pdev, PCI_CFG_REG_BAR_NUM) >> 24) in cgx_probe()
1849 INIT_WORK(&cgx->cgx_cmd_work, cgx_lmac_linkup_work); in cgx_probe()
1850 cgx->cgx_cmd_workq = alloc_workqueue("cgx_cmd_workq", 0, 0); in cgx_probe()
1851 if (!cgx->cgx_cmd_workq) { in cgx_probe()
1853 err = -ENOMEM; in cgx_probe()
1857 list_add(&cgx->cgx_list, &cgx_list); in cgx_probe()
1862 mutex_init(&cgx->lock); in cgx_probe()
1872 list_del(&cgx->cgx_list); in cgx_probe()
1889 list_del(&cgx->cgx_list); in cgx_remove()