uli526x: fix endianness issues in the setup frame
Subsystems (2)
PATCH 2/3 uli526x: fix endianness issues in the setup frame
This patch fixes uli526x driver's issues on a PowerPC boards: uli chip is unable to receive the packets.
It appears that send_frame_filter prepares the setup frame in the endianness unsafe manner. On a big endian machines we should shift the address nibble by two bytes.
Signed-off-by Anton Vorontsov <[email protected]>
--- drivers/net/tulip/uli526x.c | 30 ++++++++++++++++++------------ 1 files changed, 18 insertions(+), 12 deletions(-)
drivers/net/tulip/uli526x.c +18 -12
@@ -1368,6 +1368,12 @@ static void update_cr6(u32 cr6_data, unsigned long ioaddr)* This setup frame initialize ULI526X address filter mode */ +#ifdef __BIG_ENDIAN +#define FLT_SHIFT 16 +#else +#define FLT_SHIFT 0 +#endif +static void send_filter_frame (struct net_device *dev,int mc_cnt) {struct uli526x_board_info *db =netdev_priv (dev);
@@ -1384,27 +1390,27 @@ static void send_filter_frame(struct net_device *dev, int mc_cnt)/* Node address */ addrptr = (u16 *) dev->dev_addr; - *suptr++ = addrptr[0 ]; - *suptr++ = addrptr[1 ]; - *suptr++ = addrptr[2 ]; + *suptr++ = addrptr[0 ] <<FLT_SHIFT ; + *suptr++ = addrptr[1 ] <<FLT_SHIFT ; + *suptr++ = addrptr[2 ] <<FLT_SHIFT ;/* broadcast address */ - *suptr++ =0xffff ; - *suptr++ =0xffff ; - *suptr++ =0xffff ; + *suptr++ =0xffff <<FLT_SHIFT ; + *suptr++ =0xffff <<FLT_SHIFT ; + *suptr++ =0xffff <<FLT_SHIFT ;/* fit the multicast address */ for (mcptr = dev->mc_list, i =0 ; i < mc_cnt; i++, mcptr = mcptr->next) { addrptr = (u16 *) mcptr->dmi_addr; - *suptr++ = addrptr[0 ]; - *suptr++ = addrptr[1 ]; - *suptr++ = addrptr[2 ]; + *suptr++ = addrptr[0 ] <<FLT_SHIFT ; + *suptr++ = addrptr[1 ] <<FLT_SHIFT ; + *suptr++ = addrptr[2 ] <<FLT_SHIFT ; }for (; i<14 ; i++) { - *suptr++ =0xffff ; - *suptr++ =0xffff ; - *suptr++ =0xffff ; + *suptr++ =0xffff <<FLT_SHIFT ; + *suptr++ =0xffff <<FLT_SHIFT ; + *suptr++ =0xffff <<FLT_SHIFT ; }/* prepare the setup frame */
Signature · 1 line
1.5.5.1