Subject: Build problem with drivers/net/au1000_eth.c

From: Josh Green <[email-masked]>
Date: Sat, 18 Dec 2004 15:36:33 -0800

I'm using latest linux-mips CVS kernel (2.6.10rc3) and GCC 3.4.2 on a
AMD Alchemy DBau1100 development board (mipsel/MIPS32).  I wasn't able
to find any other location to post bugs, so please let me know if there
is a bug system or more appropriate place to post this.  The kernel
build dies with:

  CC      drivers/net/au1000_eth.o
drivers/net/au1000_eth.c: In function `au1000_init_module':
drivers/net/au1000_eth.c:100: sorry, unimplemented: inlining failed in
call to 'str2eaddr': function body not available
drivers/net/au1000_eth.c:1506: sorry, unimplemented: called from here
drivers/net/au1000_eth.c: At top level:
drivers/net/au1000_eth.c:152: warning: 'phy_link' defined but not used
make[2]: *** [drivers/net/au1000_eth.o] Error 1
make[1]: *** [drivers/net] Error 2
make: *** [drivers] Error 2

I was able to get things to build with the following patch, although I'm
sure this is not the proper way to do things:
$ cvs diff drivers/net/au1000_eth.c

Index: drivers/net/au1000_eth.c
===================================================================
RCS file: /home/cvs/linux/drivers/net/au1000_eth.c,v
retrieving revision 1.39
diff -r1.39 au1000_eth.c
100c100
< extern inline void str2eaddr(unsigned char *ea, unsigned char *str);
---
> extern void str2eaddr(unsigned char *ea, unsigned char *str);

I'm noticing another problem now though (a kernel oops), which could be
related to my little patch above.  I changed the definition of str2eaddr
in arch/mips/au1000/common/prom.c to also not be inline just to make
sure they matched.  I now get this oops which seems to appear/disappear
after enabling/disabling kernel options (although I have not been able
to trace it down to one particular feature).  This leads me to believe
it is some sort of alignment bug, which is what the exception refers to.
I have yet been able to build a ksymoops that will work properly, but
I'm still working on that.  If any one has any tips on how I can resolve
this issue I could use the help.  Raw oops output (not ksymoops yet) is
attached.

Best regards,
	Josh Green

---

From: Josh Green <[email-masked]>
Date: Sun, 19 Dec 2004 18:54:28 -0800

On Sat, 2004-12-18 at 15:36 -0800, Josh Green wrote:
> is a bug system or more appropriate place to post this.

I'm replying to my own post, since I discovered what was causing the
kernel oops with the au1000_eth.c driver.  The attached patch fixes 3
problems:

- The build problem with extern inline str2eaddr.  I just made it
non-inline, although I'm not sure if this is the best way to resolve the
issue.

- At the end of mii_probe(): aup->mii is checked to indicate whether an
ethernet device was found or not, this variable will actually always be
set, which leads to a crash when aup->mii->chip_info->name is accessed
in code following it (in the case where no device is detected).
aup->mii->chip_info seems like a better test, although I'm not positive
on that one.

- In au1000_probe() 'sizeof(dev->dev_addr)' was being used in memcpy
when copying ethernet MAC addresses.  This size is currently 32 which is
larger than the 6 byte buffers being used in the copies, leading to
kernel oopses.

If I should be sending this to the author of the driver or some other
location, please let me know. Best regards,
	Josh Green

Index: arch/mips/au1000/common/prom.c
===================================================================
RCS file: /home/cvs/linux/arch/mips/au1000/common/prom.c,v
retrieving revision 1.12
diff -r1.12 prom.c
115c115
< inline void str2eaddr(unsigned char *ea, unsigned char *str)
---
> void str2eaddr(unsigned char *ea, unsigned char *str)
100,101c100
< extern inline unsigned char str2hexnum(unsigned char c);
---
> extern void str2eaddr(unsigned char *ea, unsigned char *str);
1045c1044
< 	if (aup->mii == NULL) {
---
> 	if (aup->mii->chip_info == NULL) {
1497c1496
< 			memcpy(au1000_mac_addr, ethaddr, sizeof(dev->dev_addr));
---
> 			memcpy(au1000_mac_addr, ethaddr, sizeof(au1000_mac_addr));
1508c1507
< 						sizeof(dev->dev_addr));
---
> 						sizeof(au1000_mac_addr));
1513c1512
< 		memcpy(dev->dev_addr, au1000_mac_addr, sizeof(dev->dev_addr));
---
> 		memcpy(dev->dev_addr, au1000_mac_addr, sizeof(au1000_mac_addr));
1523c1522
< 		memcpy(dev->dev_addr, au1000_mac_addr, sizeof(dev->dev_addr));
---
> 		memcpy(dev->dev_addr, au1000_mac_addr, sizeof(au1000_mac_addr));

---

From: Pete Popov <[email-masked]>
Date: Mon, 20 Dec 2004 09:06:14 -0800

Thanks, I'll take care of the patches.

Pete

Josh Green wrote:
> ------------------------------------------------------------------------
>