]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Octeontx2-af: Add proper checks for fwdata
authorHariprasad Kelam <hkelam@marvell.com>
Wed, 21 Jan 2026 09:48:19 +0000 (15:18 +0530)
committerJakub Kicinski <kuba@kernel.org>
Thu, 22 Jan 2026 16:09:00 +0000 (08:09 -0800)
firmware populates MAC address, link modes (supported, advertised)
and EEPROM data in shared firmware structure which kernel access
via MAC block(CGX/RPM).

Accessing fwdata, on boards booted with out MAC block leading to
kernel panics.

Internal error: Oops: 0000000096000005 [#1]  SMP
[   10.460721] Modules linked in:
[   10.463779] CPU: 0 UID: 0 PID: 174 Comm: kworker/0:3 Not tainted 6.19.0-rc5-00154-g76ec646abdf7-dirty #3 PREEMPT
[   10.474045] Hardware name: Marvell OcteonTX CN98XX board (DT)
[   10.479793] Workqueue: events work_for_cpu_fn
[   10.484159] pstate: 80400009 (Nzcv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[   10.491124] pc : rvu_sdp_init+0x18/0x114
[   10.495051] lr : rvu_probe+0xe58/0x1d18

Fixes: 997814491cee ("Octeontx2-af: Fetch MAC channel info from firmware")
Fixes: 5f21226b79fd ("Octeontx2-pf: ethtool: support multi advertise mode")
Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
Link: https://patch.msgid.link/20260121094819.2566786-1-hkelam@marvell.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/marvell/octeontx2/af/rvu_cgx.c
drivers/net/ethernet/marvell/octeontx2/af/rvu_sdp.c

index 3abd750a4bd741fe97b044d45b100eba6debf163..3d91a34f8b57bea3341b6d712e8999d4f157f1ad 100644 (file)
@@ -1222,6 +1222,9 @@ int rvu_mbox_handler_cgx_set_link_mode(struct rvu *rvu,
        u8 cgx_idx, lmac;
        void *cgxd;
 
+       if (!rvu->fwdata)
+               return LMAC_AF_ERR_FIRMWARE_DATA_NOT_MAPPED;
+
        if (!is_cgx_config_permitted(rvu, req->hdr.pcifunc))
                return -EPERM;
 
index e4a5f9fa6fd46dcdc17ae1a781b82ed365f14be0..bbfd8231aed5ceeb6ca87767405354efbf278264 100644 (file)
@@ -56,7 +56,7 @@ int rvu_sdp_init(struct rvu *rvu)
        struct rvu_pfvf *pfvf;
        u32 i = 0;
 
-       if (rvu->fwdata->channel_data.valid) {
+       if (rvu->fwdata && rvu->fwdata->channel_data.valid) {
                sdp_pf_num[0] = 0;
                pfvf = &rvu->pf[sdp_pf_num[0]];
                pfvf->sdp_info = &rvu->fwdata->channel_data.info;