Skip to content

Commit fd3c448

Browse files
dberlinjannau
authored andcommitted
[brcmfmac] Let feature attachment fail, and fail if we can't
handle the interface versions we find. Signed-off-by: Daniel Berlin <dberlin@dberlin.org>
1 parent d65c704 commit fd3c448

3 files changed

Lines changed: 34 additions & 13 deletions

File tree

drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1227,7 +1227,9 @@ static int brcmf_bus_started(struct brcmf_pub *drvr, struct cfg80211_ops *ops)
12271227
if (ret < 0)
12281228
goto fail;
12291229

1230-
brcmf_feat_attach(drvr);
1230+
ret = brcmf_feat_attach(drvr);
1231+
if (ret)
1232+
goto fail;
12311233

12321234
/* Setup event_msgs, enable E_IF */
12331235
ret = brcmf_fweh_init_events(ifp);

drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ static int brcmf_feat_fwcap_debugfs_read(struct seq_file *seq, void *data)
302302
return 0;
303303
}
304304

305-
void brcmf_feat_attach(struct brcmf_pub *drvr)
305+
int brcmf_feat_attach(struct brcmf_pub *drvr)
306306
{
307307
struct brcmf_if *ifp = brcmf_get_ifp(drvr, 0);
308308
struct brcmf_join_version_le join_ver;
@@ -363,13 +363,14 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
363363
err = brcmf_fil_iovar_data_get(ifp, "join_ver", &join_ver, sizeof(join_ver));
364364
if (!err) {
365365
u16 ver = le16_to_cpu(join_ver.join_ver_major);
366-
brcmf_join_param_setup_for_version(drvr, ver);
366+
err = brcmf_join_param_setup_for_version(drvr, ver);
367367
} else {
368368
/* Default to version 0, unless it is one of the firmware branches
369369
* that doesn't have a join_ver iovar but are still version 1 */
370370
u8 version = 0;
371371
struct brcmf_wlc_version_le ver;
372-
err = brcmf_fil_iovar_data_get(ifp, "wlc_ver", &ver, sizeof(ver));
372+
err = brcmf_fil_iovar_data_get(ifp, "wlc_ver", &ver,
373+
sizeof(ver));
373374
if (!err) {
374375
u16 major = le16_to_cpu(ver.wlc_ver_major);
375376
u16 minor = le16_to_cpu(ver.wlc_ver_minor);
@@ -382,32 +383,47 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
382383
version = 1;
383384
}
384385
}
385-
brcmf_join_param_setup_for_version(drvr, version);
386+
err = brcmf_join_param_setup_for_version(drvr, version);
386387
}
387-
err = brcmf_fil_iovar_data_get(ifp, "scan_ver", &scan_ver, sizeof(scan_ver));
388+
if (err) {
389+
bphy_err(drvr, "Error setting up join structure handler: %d\n",
390+
err);
391+
return err;
392+
}
393+
err = brcmf_fil_iovar_data_get(ifp, "scan_ver", &scan_ver,
394+
sizeof(scan_ver));
388395
if (!err) {
389396
u16 ver = le16_to_cpu(scan_ver.scan_ver_major);
390-
brcmf_scan_param_setup_for_version(drvr, ver);
397+
err = brcmf_scan_param_setup_for_version(drvr, ver);
391398
} else {
392399
/* Default to version 1. */
393-
brcmf_scan_param_setup_for_version(drvr, 1);
400+
err = brcmf_scan_param_setup_for_version(drvr, 1);
401+
}
402+
if (err) {
403+
bphy_err(drvr, "Error setting up scan structure handler: %d\n",
404+
err);
405+
return err;
394406
}
395-
396407
/* See what version of PFN scan is supported*/
397408
err = brcmf_fil_iovar_data_get(ifp, "pno_set", &pno_params,
398409
sizeof(pno_params));
399410
if (!err) {
400-
brcmf_pno_setup_for_version(drvr, le16_to_cpu(pno_params.version));
411+
err = brcmf_pno_setup_for_version(
412+
drvr, le16_to_cpu(pno_params.version));
401413
} else {
402414
/* Default to version 2, supported by all chips we support. */
403-
brcmf_pno_setup_for_version(drvr, 2);
415+
err = brcmf_pno_setup_for_version(drvr, 2);
416+
}
417+
if (err) {
418+
bphy_err(drvr, "Error setting up escan structure handler: %d\n",
419+
err);
420+
return err;
404421
}
405422

406423
brcmf_feat_wlc_version_overrides(drvr);
407424
brcmf_feat_firmware_overrides(drvr);
408425

409426
brcmf_fwvid_feat_attach(ifp);
410-
411427
if (drvr->settings->feature_disable) {
412428
brcmf_dbg(INFO, "Features: 0x%02x, disable: 0x%02x\n",
413429
ifp->drvr->feat_flags,
@@ -427,6 +443,7 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
427443
/* no quirks */
428444
break;
429445
}
446+
return 0;
430447
}
431448

432449
void brcmf_feat_debugfs_create(struct brcmf_pub *drvr)

drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,10 @@ enum brcmf_feat_quirk {
102102
* brcmf_feat_attach() - determine features and quirks.
103103
*
104104
* @drvr: driver instance.
105+
*
106+
* Return: 0 in case of success, error code otherwise.
105107
*/
106-
void brcmf_feat_attach(struct brcmf_pub *drvr);
108+
int brcmf_feat_attach(struct brcmf_pub *drvr);
107109

108110
/**
109111
* brcmf_feat_debugfs_create() - create debugfs entries.

0 commit comments

Comments
 (0)