[oi-dev] Broadcom BCM4312 wireless on OpenIndiana 64-bit

Jean-Pierre jean-pierre.andre at wanadoo.fr
Sun Mar 17 11:46:53 UTC 2013


Hi again,

Jim Klimov wrote:
> On 2013-03-17 08:54, Jean-Pierre wrote:
>> Hi again,
>>
>> Jim Klimov wrote:
>>> On 2013-03-17 01:06, Jim Klimov wrote:
>>>> Hello Jean-Pierre,
>>>>
>>>> I tried your fix and it seems mostly correct - I applied the patch to
>>>> a freshly untarred source that you published a couple of days ago, and
>>>> the resulting ndiscvt binary built under OI 151a7 succeeded to make a
>>>> driver.s file. However, it doesn't work fully, so the compilation of
>>>> "ndis" target failed. Build log attached.
>>>
>>>
>>> Apparently, the code which created the assembly text forgot to add
>>> newlines before leaq instructions. I added them manually, and the
>>
>> Good point.
>>
>>> overall build fails at a bit later step now:
>>>
>>> /opt/onbld/bin/i386/ctfconvert -g -l NDISWRAPPER driver.o
>>> ERROR: ctfconvert: file does not contain dwarf type data (try compiling
>>> with -g)
>>> Removing driver.o
>>
>> I do no know what this ctfconvert is about (probably related
>> to debugging), but I am quite sure this is useless (I do not
>> even have this tool). Likewise the -g dumps symbols into the
>> object file, only used for debugging, but this is probably
>> meaningless for an assembler source. Maybe ctfconvert extracts
>> the symbols created by -g and puts them in a specific file.
>>
>> I cannot help you on such matters.
>
>
> Ok, this helped move forward - I commented away the line for ctfconvert
> in the Makefile for driver.o, and added "-gdwarf-2" to the CFLAGS for
> ndiscvt, because ctfconvert of its component objects also complained
> without it:
>
> $(NDISCVT) : CFLAGS = -I../include -O -m64 -DLINKEDIMAGE -gdwarf-2
>
> Now the single gmake command (with an interruption to add manually the
> line-breaks before leaq, which I hope you'd automate by release time)
> builds the project from scratch with Makefile, ndis.inf and ndis.sys
> being the only files in the build-dir (amd64), up to ndisapi (the "all"
> target) with a few warnings repeated for a number of files - probably
> stemming from some same header file:

For cleaning this, you should patch as :

--- include/ntoskrnl_var.h	2013-03-16 22:17:59.872772000 +0100
+++ include/ntoskrnl_var.h.new	2013-03-17 09:23:21.842697000 +0100
@@ -350,6 +350,9 @@
  /* Kernel defered procedure call (i.e. timer callback) */

  struct kdpc;
+struct device_object;
+struct irp;
+struct ndis_softc;

  typedef MSTYPE4(void (*dpc_timer_function), struct kdpc *dpc, \
  			struct device_object *dobj, \



>
> ...
> /usr/sfw/bin/gcc -fident -finline -fno-inline-functions -fno-builtin
> -fno-asm -nodefaultlibs -D__sun -O2 -gdwarf-2 -fno-strict-aliasing
> -fno-unit-at-a-time -fno-optimize-sibling-calls -m64 -mtune=opteron
> -Wall -Wno-unknown-pragmas -Wno-missing-braces -Wno-sign-compare
> -Wno-parentheses -Wno-uninitialized -Wno-implicit-function-declaration
> -Wno-unused -Wno-trigraphs -Wno-char-subscripts -Wno-switch
> -ffreestanding -mcmodel=kernel -mno-red-zone -D_KERNEL -DLINKEDIMAGE
> -D__amd64__ -D__amd64 -I../include -I. -c ../kern_ndis.c -o kern_ndis.o
> In file included from ../kern_ndis.c:74:
> ../include/ntoskrnl_var.h:354: warning: "struct ndis_softc" declared
> inside parameter list
> ../include/ntoskrnl_var.h:354: warning: its scope is only this
> definition or declaration, which is probably not what you want
> ../include/ntoskrnl_var.h:354: warning: "struct irp" declared inside
> parameter list
> ../include/ntoskrnl_var.h:354: warning: "struct device_object" declared
> inside parameter list
> ../kern_ndis.c:651: warning: static declaration of 'strdup' follows
> non-static declaration
> /usr/include/sys/sunddi.h:426: warning: previous declaration of 'strdup'
> was here
> /usr/sfw/bin/gcc -fident -finline -fno-inline-functions -fno-builtin
> -fno-asm -nodefaultlibs -D__sun -O2 -gdwarf-2 -fno-strict-aliasing
> -fno-unit-at-a-time -fno-optimize-sibling-calls -m64 -mtune=opteron
> -Wall -Wno-unknown-pragmas -Wno-missing-braces -Wno-sign-compare
> -Wno-parentheses -Wno-uninitialized -Wno-implicit-function-declaration
> -Wno-unused -Wno-trigraphs -Wno-char-subscripts -Wno-switch
> -ffreestanding -mcmodel=kernel -mno-red-zone -D_KERNEL -DLINKEDIMAGE
> -D__amd64__ -D__amd64 -I../include -I. -c ../kern_windrv.c -o kern_windrv.o
> In file included from ../kern_windrv.c:73:
> ../include/ntoskrnl_var.h:354: warning: "struct ndis_softc" declared
> inside parameter list
> ../include/ntoskrnl_var.h:354: warning: its scope is only this
> definition or declaration, which is probably not what you want
> ../include/ntoskrnl_var.h:354: warning: "struct irp" declared inside
> parameter list
> ../include/ntoskrnl_var.h:354: warning: "struct device_object" declared
> inside parameter list
> /usr/sfw/bin/gcc -c -O2 -fno-inline -Wall -ffreestanding -U_NO_LONGLONG
> -D_KERNEL -mcmodel=kernel -mno-red-zone -fno-strict-aliasing -m64
> -mtune=opteron -I../ ../winx64_wrap.S -o winx64_wrap.o
> /opt/onbld/bin/i386/ctfconvert -g -l NDISWRAPPER subr_ndis.o
> /opt/onbld/bin/i386/ctfconvert -g -l NDISWRAPPER subr_ntoskrnl.o
> /opt/onbld/bin/i386/ctfconvert -g -l NDISWRAPPER subr_pe.o
> /opt/onbld/bin/i386/ctfconvert -g -l NDISWRAPPER subr_hal.o
> /opt/onbld/bin/i386/ctfconvert -g -l NDISWRAPPER kern_ndis.o
> /opt/onbld/bin/i386/ctfconvert -g -l NDISWRAPPER kern_windrv.o
> /usr/ccs/bin/ld -r -o ndisapi subr_ndis.o subr_ntoskrnl.o subr_pe.o
> subr_hal.o kern_ndis.o kern_windrv.o winx64_wrap.o
> /opt/onbld/bin/i386/ctfmerge -l NDISWRAPPER -o ndisapi subr_ndis.o
> subr_ntoskrnl.o subr_pe.o subr_hal.o kern_ndis.o kern_windrv.o
> winx64_wrap.o
>
> It has nominally succeeded for 64-bit variants of ndis5 and ndis6
> drivers from varied vendors of laptops with broadcom wifi chips.

Well, ndis6 is said to be much different from ndis5,
and I did not try.

>
> Unfortunately, this was built on another host than my laptop and I must
> run now, so I won't test the resulting driver with the hardware until
> some time later. Intrigue and suspense grows ;)

Great.

In the meantime, I have merged my changes into ndis.1.2.6
I am hoping there will be newer features (not tested yet).

>
> PS: I automated the "leaq" problem with sed/tr in the Makefile like
> this, so the whole build from scratch happens by one command:

There is a single "leaq" in ndislink.c, and it should be :

#else
          fprintf(out," pushq %%rdx\n");
          fprintf(out," leaq %s(%%rip),%%rdx\n",patch->back);
#endif


>
> ndis.h driver.s : ndiscvt
> ./ndiscvt -i ndis.inf -s ndis.sys -o ndis.h -a driver.s
> rm -f driver.sx; mv -f driver.s driver.sx
> cat driver.sx | sed 's/^\( .*\)\( leaq .*\)$/\1=\2/' | tr '=' '\n' >
> driver.s
> rm -f driver.sx
>
> HTH,
> //Jim Klimov






More information about the oi-dev mailing list