int rvu_cgx_probe(struct rvu *rvu) { int i, err; /* find available cgx ports */ rvu->cgx_cnt = cgx_get_cgx_cnt(); if (!rvu->cgx_cnt) { dev_info(rvu->dev, "No CGX devices found!\n"); return -ENODEV; } rvu->cgx_idmap = devm_kzalloc(rvu->dev, rvu->cgx_cnt * sizeof(void *), GFP_KERNEL); if (!rvu->cgx_idmap) return -ENOMEM; /* Initialize the cgxdata table */ for (i = 0; i < rvu->cgx_cnt; i++) rvu->cgx_idmap[i] = cgx_get_pdata(i); /* Map CGX LMAC interfaces to RVU PFs */ err = rvu_map_cgx_lmac_pf(rvu); if (err) return err; /* Register for CGX events */ cgx_lmac_event_handler_init(rvu); return 0; }
int rvu_cgx_init(struct rvu *rvu) { int cgx, err; void *cgxd; /* CGX port id starts from 0 and are not necessarily contiguous * Hence we allocate resources based on the maximum port id value. */ rvu->cgx_cnt_max = cgx_get_cgxcnt_max(); if (!rvu->cgx_cnt_max) { dev_info(rvu->dev, "No CGX devices found!\n"); return -ENODEV; } rvu->cgx_idmap = devm_kzalloc(rvu->dev, rvu->cgx_cnt_max * sizeof(void *), GFP_KERNEL); if (!rvu->cgx_idmap) return -ENOMEM; /* Initialize the cgxdata table */ for (cgx = 0; cgx < rvu->cgx_cnt_max; cgx++) rvu->cgx_idmap[cgx] = cgx_get_pdata(cgx); /* Map CGX LMAC interfaces to RVU PFs */ err = rvu_map_cgx_lmac_pf(rvu); if (err) return err; /* Register for CGX events */ err = cgx_lmac_event_handler_init(rvu); if (err) return err; /* Ensure event handler registration is completed, before * we turn on the links */ mb(); /* Do link up for all CGX ports */ for (cgx = 0; cgx <= rvu->cgx_cnt_max; cgx++) { cgxd = rvu_cgx_pdata(cgx, rvu); if (!cgxd) continue; err = cgx_lmac_linkup_start(cgxd); if (err) dev_err(rvu->dev, "Link up process failed to start on cgx %d\n", cgx); } return 0; }