Skip to content

Commit a358ebe

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 e2e3a80 commit a358ebe

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
@@ -1220,7 +1220,9 @@ static int brcmf_bus_started(struct brcmf_pub *drvr, struct cfg80211_ops *ops)
12201220
if (ret < 0)
12211221
goto fail;
12221222

1223-
brcmf_feat_attach(drvr);
1223+
ret = brcmf_feat_attach(drvr);
1224+
if (ret)
1225+
goto fail;
12241226

12251227
/* Setup event_msgs, enable E_IF */
12261228
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
@@ -301,7 +301,7 @@ static int brcmf_feat_fwcap_debugfs_read(struct seq_file *seq, void *data)
301301
return 0;
302302
}
303303

304-
void brcmf_feat_attach(struct brcmf_pub *drvr)
304+
int brcmf_feat_attach(struct brcmf_pub *drvr)
305305
{
306306
struct brcmf_if *ifp = brcmf_get_ifp(drvr, 0);
307307
struct brcmf_join_version_le join_ver;
@@ -362,13 +362,14 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
362362
err = brcmf_fil_iovar_data_get(ifp, "join_ver", &join_ver, sizeof(join_ver));
363363
if (!err) {
364364
u16 ver = le16_to_cpu(join_ver.join_ver_major);
365-
brcmf_join_param_setup_for_version(drvr, ver);
365+
err = brcmf_join_param_setup_for_version(drvr, ver);
366366
} else {
367367
/* Default to version 0, unless it is one of the firmware branches
368368
* that doesn't have a join_ver iovar but are still version 1 */
369369
u8 version = 0;
370370
struct brcmf_wlc_version_le ver;
371-
err = brcmf_fil_iovar_data_get(ifp, "wlc_ver", &ver, sizeof(ver));
371+
err = brcmf_fil_iovar_data_get(ifp, "wlc_ver", &ver,
372+
sizeof(ver));
372373
if (!err) {
373374
u16 major = le16_to_cpu(ver.wlc_ver_major);
374375
u16 minor = le16_to_cpu(ver.wlc_ver_minor);
@@ -381,32 +382,47 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
381382
version = 1;
382383
}
383384
}
384-
brcmf_join_param_setup_for_version(drvr, version);
385+
err = brcmf_join_param_setup_for_version(drvr, version);
385386
}
386-
err = brcmf_fil_iovar_data_get(ifp, "scan_ver", &scan_ver, sizeof(scan_ver));
387+
if (err) {
388+
bphy_err(drvr, "Error setting up join structure handler: %d\n",
389+
err);
390+
return err;
391+
}
392+
err = brcmf_fil_iovar_data_get(ifp, "scan_ver", &scan_ver,
393+
sizeof(scan_ver));
387394
if (!err) {
388395
u16 ver = le16_to_cpu(scan_ver.scan_ver_major);
389-
brcmf_scan_param_setup_for_version(drvr, ver);
396+
err = brcmf_scan_param_setup_for_version(drvr, ver);
390397
} else {
391398
/* Default to version 1. */
392-
brcmf_scan_param_setup_for_version(drvr, 1);
399+
err = brcmf_scan_param_setup_for_version(drvr, 1);
400+
}
401+
if (err) {
402+
bphy_err(drvr, "Error setting up scan structure handler: %d\n",
403+
err);
404+
return err;
393405
}
394-
395406
/* See what version of PFN scan is supported*/
396407
err = brcmf_fil_iovar_data_get(ifp, "pno_set", &pno_params,
397408
sizeof(pno_params));
398409
if (!err) {
399-
brcmf_pno_setup_for_version(drvr, le16_to_cpu(pno_params.version));
410+
err = brcmf_pno_setup_for_version(
411+
drvr, le16_to_cpu(pno_params.version));
400412
} else {
401413
/* Default to version 2, supported by all chips we support. */
402-
brcmf_pno_setup_for_version(drvr, 2);
414+
err = brcmf_pno_setup_for_version(drvr, 2);
415+
}
416+
if (err) {
417+
bphy_err(drvr, "Error setting up escan structure handler: %d\n",
418+
err);
419+
return err;
403420
}
404421

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

408425
brcmf_fwvid_feat_attach(ifp);
409-
410426
if (drvr->settings->feature_disable) {
411427
brcmf_dbg(INFO, "Features: 0x%02x, disable: 0x%02x\n",
412428
ifp->drvr->feat_flags,
@@ -426,6 +442,7 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
426442
/* no quirks */
427443
break;
428444
}
445+
return 0;
429446
}
430447

431448
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
@@ -100,8 +100,10 @@ enum brcmf_feat_quirk {
100100
* brcmf_feat_attach() - determine features and quirks.
101101
*
102102
* @drvr: driver instance.
103+
*
104+
* Return: 0 in case of success, error code otherwise.
103105
*/
104-
void brcmf_feat_attach(struct brcmf_pub *drvr);
106+
int brcmf_feat_attach(struct brcmf_pub *drvr);
105107

106108
/**
107109
* brcmf_feat_debugfs_create() - create debugfs entries.

0 commit comments

Comments
 (0)