[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