Commit b1e247ad authored by Al Viro's avatar Al Viro Committed by Jeff Garzik
Browse files

3c574 and 3c589 endianness fixes (.24?)



Both store MAC address in CIS; there's no decoder for that
type (0x88) so the drivers work with raw data.  It is
byteswapped, so ntohs() works for little-endian, but for
big-endian it's wrong.  ntohs(le16_to_cpu()) does the
right thing on both (and always expands to swab16()).

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent cf962378
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -337,15 +337,15 @@ static int tc574_config(struct pcmcia_device *link)
	struct net_device *dev = link->priv;
	struct el3_private *lp = netdev_priv(dev);
	tuple_t tuple;
	unsigned short buf[32];
	__le16 buf[32];
	int last_fn, last_ret, i, j;
	kio_addr_t ioaddr;
	u16 *phys_addr;
	__be16 *phys_addr;
	char *cardname;
	union wn3_config config;
	DECLARE_MAC_BUF(mac);

	phys_addr = (u16 *)dev->dev_addr;
	phys_addr = (__be16 *)dev->dev_addr;

	DEBUG(0, "3c574_config(0x%p)\n", link);

@@ -378,12 +378,12 @@ static int tc574_config(struct pcmcia_device *link)
	if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) {
		pcmcia_get_tuple_data(link, &tuple);
		for (i = 0; i < 3; i++)
			phys_addr[i] = htons(buf[i]);
			phys_addr[i] = htons(le16_to_cpu(buf[i]));
	} else {
		EL3WINDOW(0);
		for (i = 0; i < 3; i++)
			phys_addr[i] = htons(read_eeprom(ioaddr, i + 10));
		if (phys_addr[0] == 0x6060) {
		if (phys_addr[0] == htons(0x6060)) {
			printk(KERN_NOTICE "3c574_cs: IO port conflict at 0x%03lx"
				   "-0x%03lx\n", dev->base_addr, dev->base_addr+15);
			goto failed;
+5 −4
Original line number Diff line number Diff line
@@ -251,7 +251,8 @@ static int tc589_config(struct pcmcia_device *link)
    struct net_device *dev = link->priv;
    struct el3_private *lp = netdev_priv(dev);
    tuple_t tuple;
    u16 buf[32], *phys_addr;
    __le16 buf[32];
    __be16 *phys_addr;
    int last_fn, last_ret, i, j, multi = 0, fifo;
    kio_addr_t ioaddr;
    char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};
@@ -259,7 +260,7 @@ static int tc589_config(struct pcmcia_device *link)
    
    DEBUG(0, "3c589_config(0x%p)\n", link);

    phys_addr = (u16 *)dev->dev_addr;
    phys_addr = (__be16 *)dev->dev_addr;
    tuple.Attributes = 0;
    tuple.TupleData = (cisdata_t *)buf;
    tuple.TupleDataMax = sizeof(buf);
@@ -298,11 +299,11 @@ static int tc589_config(struct pcmcia_device *link)
    if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) {
	pcmcia_get_tuple_data(link, &tuple);
	for (i = 0; i < 3; i++)
	    phys_addr[i] = htons(buf[i]);
	    phys_addr[i] = htons(le16_to_cpu(buf[i]));
    } else {
	for (i = 0; i < 3; i++)
	    phys_addr[i] = htons(read_eeprom(ioaddr, i));
	if (phys_addr[0] == 0x6060) {
	if (phys_addr[0] == htons(0x6060)) {
	    printk(KERN_ERR "3c589_cs: IO port conflict at 0x%03lx"
		   "-0x%03lx\n", dev->base_addr, dev->base_addr+15);
	    goto failed;