[oi-dev] Broadcom BCM4312 wireless on OpenIndiana 64-bit
Jean-Pierre
jean-pierre.andre at wanadoo.fr
Thu Mar 7 15:22:39 UTC 2013
Hi all
I have finally been able to activate a 64-bit WiFi driver for a Broadcom
BCM4312 wireless hardware on OpenIndiana (oi151a5).
pci bus 0x0004 cardnum 0x00 function 0x00: vendor 0x14e4 device 0x4315
Broadcom Corporation BCM4312 802.11b/g LP-PHY
CardVendor 0x103c card 0x137d (Hewlett-Packard Company, BCM4312
802.11b/g Wire$
I used an old Windows driver (bcmwl564.sys) which I knew compatible
with my hardware, because I used it a few years ago on Linux with
ndiswrapper (this driver is still available on the Internet as part of a
file named R174291.exe), and I used the NDIS emulator ndis-1.2.2 by Bill
Paul.
(the most recent one I found on the Internet).
I did not have to make fundamental changes, but below are the main issues
=*== MicroEMACS 3.10-LX (EXACT MAGIC ASAVE) == issues.txt == File:
issues.txt ==
[Saving issues.txt]
[linux at dimension devel]$ cat issues.txt
Hi all
I have finally been able to activate a 64-bit WiFi driver for a Broadcom
BCM4312 wireless hardware on OpenIndiana (oi151a5).
pci bus 0x0004 cardnum 0x00 function 0x00: vendor 0x14e4 device 0x4315
Broadcom Corporation BCM4312 802.11b/g LP-PHY
CardVendor 0x103c card 0x137d (Hewlett-Packard Company, BCM4312
802.11b/g Wireless LAN Controller)
I used an old Windows driver (bcmwl564.sys) which I knew compatible
with my hardware, because I used it a few years ago on Linux with
ndiswrapper (this driver is still available on the Internet as part of a
file named R174291.exe), and I used the NDIS emulator ndis-1.2.2 by Bill
Paul (the most recent one I found on the Internet).
I did not have to make fundamental changes, but below are the main
issues I had to face :
- issue 1 : the Windows driver is linked at run-time
The ndis emulator is linked at build-time with a binary image of the
Windows driver. In order to create the links, the driver image was
copied at run time to a zalloc'ed memory. As a consequence the copy
needed to be executable, which AFAIK is sometimes not possible (at
least for functions triggered by timers.)
Work around : dissociate the driver code from its variables and only
dynamically allocate the variables and the indirect pointers to
external code (ie the ndis emulator). By dissociating code and
variables, linking at build time became possible (along with type
type checking at compile time.)
- issue 2 : the Windows driver makes use of multimedia registers (xmm)
The multimedia instructions "movaps" and "movdqu" were used to
optimize memcpy().
Work around : patch the 71 multimedia instructions at build time.
- issue 3 : a few emulation functions were called directly with a
Windows ABI. This mostly happened for indirect calls, when a
pointer to a function was set in a structure within the Windows
driver.
Work around : make a strict typing of emulation functions, detect
the wrong ABIs at compile time, and fix them.
- issue 4 : a few generic Windows wrapper functions did not reserve 32
bytes on the stack.
When these 32 bytes are not needed to save arguments passed in
registers,
they can be used in the Windows driver for local variables. When the
space is not reserved, the return pointer is overwritten with obvious
consequences.
- issue 5 : the layout of a few structures did not match the Windows
driver ones.
This was somewhat expected because the alignment rules are compiler
specific. More surprisingly, in at least one case, the Windows driver
wanted a structure different from what is described on msdn. Maybe the
structure has been shortened since it was used to compile the driver.
March 7, 2013 03:18:43 PM CET
#ifconfig bcmndis0 plumb
March 7, 2013 03:19:03 PM CET
#wificonfig -i bcmndis0 setparam essid=(not shown)
March 7, 2013 03:19:23 PM CET
#wificonfig -i bcmndis0 setparam encryption=wep
March 7, 2013 03:19:43 PM CET
#wificonfig -i bcmndis0 setparam wepkey1=(not shown)
March 7, 2013 03:20:03 PM CET
#wificonfig -i bcmndis0 setparam authmode=shared_key
March 7, 2013 03:20:23 PM CET
#wificonfig -i bcmndis0 connect (not shown)
wificonfig: connecting to essid '(not shown)'
March 7, 2013 03:20:46 PM CET
#wificonfig -i bcmndis0 showstatus
linkstatus: connected
active profile: none
essid: (not shown)
bssid: 00:90:4b:18:93:ea
encryption: wep
signal strength: medium(11)
March 7, 2013 03:21:07 PM CET
#wificonfig -i bcmndis0 getparam
bssid: 00:90:4b:18:93:ea
essid: DW-B-200-2827b
bsstype: bss(ap, infrastructure)
createibss: no
channel: 3
powermode: fast
authmode: shared_key
encryption: wep
wepkeyindex: 1
signal: 11
radio: on
March 7, 2013 03:21:27 PM CET
# ifconfig bcmndis0 dhcp
# netstat -rn
Routing Table: IPv4
Destination Gateway Flags Ref Use Interface
-------------------- -------------------- ----- ----- ---------- ---------
default 10.0.0.1 UG 1 0 bcmndis0
10.0.0.0 10.130.123.16 U 2 0 bcmndis0
127.0.0.1 127.0.0.1 UH 4 160 lo0
Routing Table: IPv6
Destination/Mask Gateway Flags Ref Use
If
--------------------------- --------------------------- ----- ---
------- -----
::1 ::1 UH 2
16 lo0
fe80::/10 fe80::21e:ecff:fee5:b68a U 2
0 rge0
# ping 10.0.0.1
10.0.0.1 is alive
I can access the configuration page of the router, but for some reason
I cannot get the name service.
I will make the modified NDIS emulator source code available
when I have done the necessary cleaning.
Regards
Jean-Pierre
More information about the oi-dev
mailing list