Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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;