Skip to content

Commit 5ae1ec2

Browse files
committed
Fix Broadcom Wi-Fi policy and kext selection
1 parent 1e64714 commit 5ae1ec2

13 files changed

Lines changed: 334 additions & 17 deletions

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
Project note: the app is now branded as `OpCore-OneClick`. Legacy repo/update coordinates and the persisted app-data path remain unchanged for continuity.
44

5+
## 3.2.8 - 2026-04-03
6+
7+
### Fix Broadcom Wi-Fi planning/generation drift
8+
- Stop auto-injecting `itlwm.kext` into modern laptops unless the detected Wi-Fi chipset is actually Intel. Broadcom laptops were incorrectly inheriting the Intel Wi-Fi path before.
9+
- Add a conservative Broadcom Wi-Fi policy: supported BCM4352/BCM43602 paths now pull in `AirportBrcmFixup.kext` on Ventura and older, while BCM4360 stays on the native-style pre-Sonoma path.
10+
- Sonoma and newer now report Broadcom Wi-Fi honestly in compatibility analysis instead of implying a clean native route where OCLP/root patches or a card swap are the real next step.
11+
- Add `AirportBrcmFixup.kext` to the app kext registries so the generated Broadcom Wi-Fi path is fetchable and visible in resource planning.
12+
513
## 2.7.20 - 2026-03-23
614

715
### Global Network Auto-Retry and Auto-Resume

electron/compatibility.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
hasUnsupportedDiscreteGpu,
1212
parseMacOSVersion,
1313
} from './hackintoshRules.js';
14+
import { getBroadcomWifiPolicy } from './wifiPolicy.js';
1415

1516
export type CompatibilityLevel =
1617
| 'supported'
@@ -280,6 +281,17 @@ function buildCompatibilityNextActions(
280281
});
281282
}
282283

284+
if (report.warnings.some((warning) => /broadcom wi-fi/i.test(warning))) {
285+
addAction({
286+
title: 'Validate the Broadcom wireless path separately',
287+
detail: report.warnings.some((warning) => /sonoma|sequoia|tahoe|root patches|oclp/i.test(warning))
288+
? 'This Broadcom Wi-Fi path is no longer a clean native route on newer macOS targets. Expect OCLP/root patches or a replacement card if wireless matters.'
289+
: 'Broadcom Wi-Fi support on this card family is conditional. Confirm the exact card model, verify whether AirportBrcmFixup is enough, and treat Bluetooth as a separate check.',
290+
source: 'rule',
291+
confidence: 'medium',
292+
});
293+
}
294+
283295
if (report.warnings.some((warning) => /discrete gpu/i.test(warning))) {
284296
addAction({
285297
title: 'Force the laptop onto the iGPU path',
@@ -429,6 +441,17 @@ function buildMostLikelyFailurePoints(
429441
});
430442
}
431443

444+
if (report.warnings.some((warning) => /broadcom wi-fi/i.test(warning))) {
445+
addCandidate('broadcom-wireless', {
446+
title: 'Broadcom Wi-Fi support path may still need manual validation',
447+
detail: report.warnings.some((warning) => /sonoma|sequoia|tahoe|root patches|oclp/i.test(warning))
448+
? 'Newer macOS targets dropped this Broadcom path as a clean native route. Wireless may need OCLP/root patches or a replacement card even if the rest of the machine is bootable.'
449+
: 'This Broadcom Wi-Fi family is only conditionally supported. Expect card-model-specific validation before you trust wireless or Bluetooth behavior.',
450+
source: 'rule',
451+
weight: report.warnings.some((warning) => /sonoma|sequoia|tahoe|root patches|oclp/i.test(warning)) ? 8 : 5,
452+
});
453+
}
454+
432455
if (report.communityEvidence?.whatDidNotWork.some((item) => /thunderbolt/i.test(item))) {
433456
addCandidate('thunderbolt', {
434457
title: 'Thunderbolt or advanced I/O features',
@@ -515,6 +538,32 @@ export function checkCompatibility(
515538

516539
report.communityEvidence = hasCommunityEvidence ? communityEvidence : null;
517540

541+
const broadcomWifiPolicy = getBroadcomWifiPolicy(profile.wifiChipset, profile.targetOS);
542+
if (broadcomWifiPolicy?.supportClass === 'sonoma_root_patch') {
543+
applyAdvisoryLevel(
544+
report,
545+
'risky',
546+
'Broadcom Wi-Fi path detected. Sonoma and newer removed this as a clean native wireless route, so EFI planning can continue but wireless now depends on OCLP/root patches or a replacement card.',
547+
`Broadcom Wi-Fi detected (${broadcomWifiPolicy.chipset}). Sonoma and newer are not a clean native path for this card family.`,
548+
);
549+
} else if (broadcomWifiPolicy?.supportClass === 'legacy_unsupported_on_target') {
550+
applyAdvisoryLevel(
551+
report,
552+
'risky',
553+
'Legacy Broadcom Wi-Fi path detected. The rest of the machine may still boot, but this wireless card family tops out around Catalina and should not be treated as a normal modern macOS path.',
554+
`Broadcom Wi-Fi detected (${broadcomWifiPolicy.chipset}). This older card family tops out around Catalina and is not a normal ${profile.targetOS} wireless path.`,
555+
);
556+
} else if (broadcomWifiPolicy?.supportClass === 'unknown_broadcom') {
557+
applyAdvisoryLevel(
558+
report,
559+
'experimental',
560+
'Broadcom Wi-Fi path detected, but the exact chipset support is not modeled cleanly in the generator yet. Planning can continue, but wireless should stay an explicit manual-validation item.',
561+
`Broadcom Wi-Fi detected (${broadcomWifiPolicy.chipset}), but the exact support path is not modeled yet.`,
562+
);
563+
} else if (broadcomWifiPolicy) {
564+
pushUnique(report.warnings, broadcomWifiPolicy.summary);
565+
}
566+
518567
if (report.confidence === 'low') {
519568
applyAdvisoryLevel(
520569
report,

electron/configGenerator.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
parseMacOSVersion,
1010
type HardwareGpuDeviceSummary,
1111
} from './hackintoshRules.js';
12+
import { classifyWifiChipsetFamily, getBroadcomWifiPolicy } from './wifiPolicy.js';
1213

1314
// ── SIP Policy ──────────────────────────────────────────────────────────────
1415
// csr-active-config values, least-permissive first.
@@ -755,13 +756,14 @@ export function getRequiredResources(profile: HardwareProfile) {
755756
pushSsdt('SSDT-RHUB.aml');
756757
}
757758

758-
// Intel Wi-Fi: most laptops Skylake+ have Intel Wi-Fi cards.
759-
// AirportItlwm provides native-like Wi-Fi including Recovery support,
760-
// but requires SecureBootModel to be non-Disabled.
761-
// Since we set SecureBootModel=Disabled for broad compat, use itlwm.
762-
// itlwm uses the Heliport companion app and works without SecureBootModel.
759+
// Intel Wi-Fi: only auto-select when hardware scan actually resolved an Intel card.
760+
// The older blanket "modern laptop => itlwm" heuristic was wrong for Broadcom paths.
761+
// Since we set SecureBootModel=Disabled for broad compat, use itlwm instead of AirportItlwm.
763762
// Source: Dortania ktext.html, OpenIntelWireless docs
764-
if (['Skylake', 'Kaby Lake', 'Coffee Lake', 'Comet Lake', 'Ice Lake'].includes(profile.generation)) {
763+
if (
764+
['Skylake', 'Kaby Lake', 'Coffee Lake', 'Comet Lake', 'Ice Lake'].includes(profile.generation)
765+
&& classifyWifiChipsetFamily(profile.wifiChipset) === 'intel'
766+
) {
765767
pushUnique('itlwm.kext');
766768
}
767769

@@ -782,11 +784,11 @@ export function getRequiredResources(profile: HardwareProfile) {
782784
// Intel Bluetooth on Tahoe — Source: tahoe.html
783785
// (boot-arg -ibtcompatbeta handled in config generator boot-args section)
784786

785-
// Broadcom WiFi on Sonoma+ — Source: tahoe.html
786-
// AppleBCMWLANCompanion brings back support without root patching (requires VT-d)
787-
// Only for Intel systems since AMD doesn't have VT-d
788-
if (osVer >= 14 && profile.architecture === 'Intel') {
789-
// Will be conditionally added if Broadcom card detected
787+
const broadcomWifiPolicy = getBroadcomWifiPolicy(profile.wifiChipset, profile.targetOS);
788+
if (broadcomWifiPolicy) {
789+
for (const kext of broadcomWifiPolicy.autoKexts) {
790+
pushUnique(kext);
791+
}
790792
}
791793

792794
const needsAmdCpuSsdt = /\b(a520|b550|a620|b650|x670|x670e|b850|x870|x870e)\b/.test(motherboard);

electron/main.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1761,6 +1761,7 @@ const KEXT_REGISTRY: Record<string, KextRegistryEntry> = {
17611761
'IntelMausi.kext': { repo: 'acidanthera/IntelMausi', assetFilter: 'RELEASE' },
17621762
'RealtekRTL8111.kext': { repo: 'Mieze/RTL8111_driver_for_OS_X', assetFilter: 'RealtekRTL8111' },
17631763
'itlwm.kext': { repo: 'OpenIntelWireless/itlwm', assetFilter: 'itlwm' },
1764+
'AirportBrcmFixup.kext': { repo: 'acidanthera/AirportBrcmFixup', assetFilter: 'RELEASE' },
17641765
'USBInjectAll.kext': { repo: 'Sniki/OS-X-USB-Inject-All', assetFilter: 'RELEASE' },
17651766
};
17661767

electron/wifiPolicy.ts

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import { parseMacOSVersion } from './hackintoshRules.js';
2+
3+
export type WifiChipsetFamily = 'intel' | 'broadcom' | 'other' | 'unknown';
4+
5+
export type BroadcomWifiSupportClass =
6+
| 'native_pre_sonoma'
7+
| 'fixup_pre_sonoma'
8+
| 'legacy_fixup'
9+
| 'legacy_unsupported_on_target'
10+
| 'sonoma_root_patch'
11+
| 'unknown_broadcom';
12+
13+
export interface BroadcomWifiPolicy {
14+
chipset: string;
15+
supportClass: BroadcomWifiSupportClass;
16+
autoKexts: string[];
17+
summary: string;
18+
}
19+
20+
function normalizeChipset(chipset?: string): string {
21+
return (chipset ?? '').trim().toLowerCase();
22+
}
23+
24+
export function classifyWifiChipsetFamily(chipset?: string): WifiChipsetFamily {
25+
const normalized = normalizeChipset(chipset);
26+
if (!normalized) return 'unknown';
27+
if (normalized.includes('intel')) return 'intel';
28+
if (normalized.includes('broadcom')) return 'broadcom';
29+
return 'other';
30+
}
31+
32+
export function getBroadcomWifiPolicy(chipset: string | undefined, targetOS: string): BroadcomWifiPolicy | null {
33+
const normalized = normalizeChipset(chipset);
34+
if (!normalized.includes('broadcom')) return null;
35+
36+
const osVer = parseMacOSVersion(targetOS);
37+
const policyBase = { chipset: chipset?.trim() || 'Broadcom Wi-Fi' };
38+
39+
if (normalized.includes('bcm4352') || normalized.includes('bcm43602')) {
40+
if (osVer >= 14) {
41+
return {
42+
...policyBase,
43+
supportClass: 'sonoma_root_patch',
44+
autoKexts: [],
45+
summary: 'Broadcom BCM4352/BCM43602-class Wi-Fi loses clean native support on Sonoma and newer, so it now needs OCLP/root patches or a card swap.',
46+
};
47+
}
48+
return {
49+
...policyBase,
50+
supportClass: 'fixup_pre_sonoma',
51+
autoKexts: ['AirportBrcmFixup.kext'],
52+
summary: 'Broadcom BCM4352/BCM43602-class Wi-Fi is supported on Ventura and older with AirportBrcmFixup.',
53+
};
54+
}
55+
56+
if (normalized.includes('bcm4360')) {
57+
if (osVer >= 14) {
58+
return {
59+
...policyBase,
60+
supportClass: 'sonoma_root_patch',
61+
autoKexts: [],
62+
summary: 'Broadcom BCM4360-class Wi-Fi loses clean native support on Sonoma and newer, so it now needs OCLP/root patches or a card swap.',
63+
};
64+
}
65+
return {
66+
...policyBase,
67+
supportClass: 'native_pre_sonoma',
68+
autoKexts: [],
69+
summary: 'Broadcom BCM4360-class Wi-Fi is a native-style path on Ventura and older and does not need an injected Wi-Fi kext by default.',
70+
};
71+
}
72+
73+
if (normalized.includes('bcm4331') || normalized.includes('bcm43224')) {
74+
if (osVer <= 10.15) {
75+
return {
76+
...policyBase,
77+
supportClass: 'legacy_fixup',
78+
autoKexts: ['AirportBrcmFixup.kext'],
79+
summary: 'Broadcom BCM4331/BCM43224-class Wi-Fi is a Catalina-and-older legacy path that still needs AirportBrcmFixup.',
80+
};
81+
}
82+
return {
83+
...policyBase,
84+
supportClass: 'legacy_unsupported_on_target',
85+
autoKexts: [],
86+
summary: 'Broadcom BCM4331/BCM43224-class Wi-Fi tops out around Catalina and should not be treated as a normal Big Sur-or-newer path.',
87+
};
88+
}
89+
90+
return {
91+
...policyBase,
92+
supportClass: 'unknown_broadcom',
93+
autoKexts: [],
94+
summary: 'Detected a Broadcom Wi-Fi chipset that this generator does not classify cleanly yet. Do not assume a working native wireless path without manual verification.',
95+
};
96+
}

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "opcore-oneclick",
33
"private": true,
4-
"version": "3.2.7",
4+
"version": "3.2.8",
55
"description": "OpCore-OneClick deployment utility",
66
"author": "OpCore-OneClick contributors",
77
"main": "dist-electron/electron/main.js",

src/data/kextRegistry.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,18 @@ export const KEXT_REGISTRY: KextEntry[] = [
222222
minOS: '10.13',
223223
canonicality: 'canonical_with_caveats',
224224
},
225+
{
226+
name: 'AirportBrcmFixup',
227+
repo: 'acidanthera/AirportBrcmFixup',
228+
required: 'conditional',
229+
category: 'wifi',
230+
description: 'Broadcom Wi-Fi patch set for supported non-native card families.',
231+
conditions: ['Broadcom BCM4352/BCM43602 or legacy Broadcom Wi-Fi path'],
232+
minOS: '10.10',
233+
dependsOn: ['Lilu'],
234+
orderingAfter: ['Lilu'],
235+
canonicality: 'canonical_with_caveats',
236+
},
225237
{
226238
name: 'BrcmPatchRAM',
227239
repo: 'acidanthera/BrcmPatchRAM',

test/compatibility.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,35 @@ describe('checkCompatibility — warnings', () => {
164164
});
165165
});
166166

167+
describe('checkCompatibility — Broadcom Wi-Fi policy', () => {
168+
it('marks Sonoma-era Broadcom Wi-Fi as risky instead of pretending it is a clean native path', () => {
169+
const report = checkCompatibility(fakeProfile({
170+
generation: 'Coffee Lake',
171+
isLaptop: true,
172+
targetOS: 'macOS Sonoma',
173+
wifiChipset: 'Broadcom BCM4352',
174+
gpu: 'Intel UHD Graphics 630',
175+
}));
176+
177+
expect(['experimental', 'risky']).toContain(report.level);
178+
expect(report.warnings.some((warning) => /broadcom wi-fi/i.test(warning))).toBe(true);
179+
expect(report.warnings.some((warning) => /sonoma/i.test(warning))).toBe(true);
180+
});
181+
182+
it('marks legacy Broadcom Wi-Fi as risky on Big Sur and newer', () => {
183+
const report = checkCompatibility(fakeProfile({
184+
generation: 'Haswell',
185+
isLaptop: true,
186+
targetOS: 'macOS Big Sur 11',
187+
wifiChipset: 'Broadcom BCM4331',
188+
gpu: 'Intel HD Graphics 4600',
189+
}));
190+
191+
expect(report.level).toBe('risky');
192+
expect(report.warnings.some((warning) => /catalina/i.test(warning))).toBe(true);
193+
});
194+
});
195+
167196
// ─── Next actions ───────────────────────────────────────────────────────────
168197

169198
describe('checkCompatibility — next actions', () => {

test/configGenerator.test.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,55 @@ describe('getRequiredResources', () => {
309309
expect(r.kexts).toContain('VoodooPS2Controller.kext');
310310
});
311311

312+
it('adds itlwm only when the detected Wi-Fi chipset is Intel', () => {
313+
const intel = getRequiredResources(fakeProfile({
314+
isLaptop: true,
315+
generation: 'Coffee Lake',
316+
wifiChipset: 'Intel Wi-Fi 6 AX200',
317+
}));
318+
const broadcom = getRequiredResources(fakeProfile({
319+
isLaptop: true,
320+
generation: 'Coffee Lake',
321+
wifiChipset: 'Broadcom BCM4352',
322+
}));
323+
324+
expect(intel.kexts).toContain('itlwm.kext');
325+
expect(broadcom.kexts).not.toContain('itlwm.kext');
326+
});
327+
328+
it('adds AirportBrcmFixup for BCM4352-class Broadcom Wi-Fi on Ventura and older', () => {
329+
const r = getRequiredResources(fakeProfile({
330+
isLaptop: true,
331+
generation: 'Haswell',
332+
targetOS: 'macOS Ventura',
333+
wifiChipset: 'Broadcom BCM4352',
334+
}));
335+
expect(r.kexts).toContain('AirportBrcmFixup.kext');
336+
expect(r.kexts).not.toContain('itlwm.kext');
337+
});
338+
339+
it('does not inject AirportBrcmFixup for BCM4360-class Broadcom Wi-Fi on Ventura and older', () => {
340+
const r = getRequiredResources(fakeProfile({
341+
isLaptop: true,
342+
generation: 'Haswell',
343+
targetOS: 'macOS Ventura',
344+
wifiChipset: 'Broadcom BCM4360',
345+
}));
346+
expect(r.kexts).not.toContain('AirportBrcmFixup.kext');
347+
expect(r.kexts).not.toContain('itlwm.kext');
348+
});
349+
350+
it('does not treat Sonoma Broadcom Wi-Fi as a normal injected AirportBrcmFixup path', () => {
351+
const r = getRequiredResources(fakeProfile({
352+
isLaptop: true,
353+
generation: 'Haswell',
354+
targetOS: 'macOS Sonoma',
355+
wifiChipset: 'Broadcom BCM4352',
356+
}));
357+
expect(r.kexts).not.toContain('AirportBrcmFixup.kext');
358+
expect(r.kexts).not.toContain('itlwm.kext');
359+
});
360+
312361
it('uses SSDT-AWAC for Coffee Lake desktops', () => {
313362
const r = getRequiredResources(fakeProfile({
314363
architecture: 'Intel',

0 commit comments

Comments
 (0)