Re: [PATCH] tg3: fix big endian MAC address collection failure

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi James.  I'd like to think about this some more before we apply it.  I
investigated this problem using a 5703 on a SPARC Ultra 10, and all my
assumptions checked out.  I don't dispute that you and Robin are having
a problem.  I just don't understand where the root cause of the problem
is yet.  Stay tuned.

On Mon, Apr 13, 2009 at 08:21:50AM -0700, James Bottomley wrote:
> We noticed on parisc that our broadcoms all swapped MAC addresses going
> from 2.6.29 to 2.6.30-rc1:
> 
> Apr 11 07:48:24 ion kernel: eth0: Tigon3 [partno(BCM95700A6) rev 0105] (PCI:66MHz:64-bit) MAC address 00:30:6e:4b:15:59
> Apr 13 07:34:34 ion kernel: eth0: Tigon3 [partno(BCM95700A6) rev 0105] (PCI:66MHz:64-bit) MAC address 00:00:59:15:4b:6e
> 
> The problem patch is:
> 
> commit 6d348f2c1e0bb1cf7a494b51fc921095ead3f6ae
> Author: Matt Carlson <mcarlson@xxxxxxxxxxxx>
> Date:   Wed Feb 25 14:25:52 2009 +0000
> 
>     tg3: Eliminate tg3_nvram_read_swab()
> 
> With the root cause being the use of memcpy to set the mac address:
> 
>    memcpy(&dev->dev_addr[0], ((char *)&hi) + 2, 2);
>    memcpy(&dev->dev_addr[2], (char *)&lo, sizeof(lo));
> 
> This might work on little endian machines, but it can't on big endian
> ones.  You have to use the original setting mechanism to be correct on
> all architectures.
> 
> The attached patch fixes parisc.
> 
> Signed-off-by: James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx>
> 
> ---
> 
> diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
> index 6a736dd..7a837c4 100644
> --- a/drivers/net/tg3.c
> +++ b/drivers/net/tg3.c
> @@ -12443,8 +12443,13 @@ static int __devinit tg3_get_device_address(struct tg3 *tp)
>  		/* Next, try NVRAM. */
>  		if (!tg3_nvram_read_be32(tp, mac_offset + 0, &hi) &&
>  		    !tg3_nvram_read_be32(tp, mac_offset + 4, &lo)) {
> -			memcpy(&dev->dev_addr[0], ((char *)&hi) + 2, 2);
> -			memcpy(&dev->dev_addr[2], (char *)&lo, sizeof(lo));
> +			dev->dev_addr[0] = ((hi >> 16) & 0xff);
> +			dev->dev_addr[1] = ((hi >> 24) & 0xff);
> +			dev->dev_addr[2] = ((lo >>  0) & 0xff);
> +			dev->dev_addr[3] = ((lo >>  8) & 0xff);
> +			dev->dev_addr[4] = ((lo >> 16) & 0xff);
> +			dev->dev_addr[5] = ((lo >> 24) & 0xff);
> +
>  		}
>  		/* Finally just fetch it out of the MAC control regs. */
>  		else {
> 
> 
> 
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-parisc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux SoC]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux