diff options
Diffstat (limited to 'drivers/net/cs89x0.c')
-rw-r--r-- | drivers/net/cs89x0.c | 138 |
1 files changed, 97 insertions, 41 deletions
diff --git a/drivers/net/cs89x0.c b/drivers/net/cs89x0.c index a6078ad9b654..907c01009746 100644 --- a/drivers/net/cs89x0.c +++ b/drivers/net/cs89x0.c | |||
@@ -175,7 +175,7 @@ static unsigned int cs8900_irq_map[] = {1,0,0,0}; | |||
175 | #include <asm/irq.h> | 175 | #include <asm/irq.h> |
176 | static unsigned int netcard_portlist[] __initdata = {IXDP2X01_CS8900_VIRT_BASE, 0}; | 176 | static unsigned int netcard_portlist[] __initdata = {IXDP2X01_CS8900_VIRT_BASE, 0}; |
177 | static unsigned int cs8900_irq_map[] = {IRQ_IXDP2X01_CS8900, 0, 0, 0}; | 177 | static unsigned int cs8900_irq_map[] = {IRQ_IXDP2X01_CS8900, 0, 0, 0}; |
178 | #elif defined(CONFIG_ARCH_PNX0105) | 178 | #elif defined(CONFIG_ARCH_PNX010X) |
179 | #include <asm/irq.h> | 179 | #include <asm/irq.h> |
180 | #include <asm/arch/gpio.h> | 180 | #include <asm/arch/gpio.h> |
181 | #define CIRRUS_DEFAULT_BASE IO_ADDRESS(EXT_STATIC2_s0_BASE + 0x200000) /* = Physical address 0x48200000 */ | 181 | #define CIRRUS_DEFAULT_BASE IO_ADDRESS(EXT_STATIC2_s0_BASE + 0x200000) /* = Physical address 0x48200000 */ |
@@ -338,30 +338,86 @@ out: | |||
338 | } | 338 | } |
339 | #endif | 339 | #endif |
340 | 340 | ||
341 | #if defined(CONFIG_ARCH_IXDP2X01) | ||
341 | static int | 342 | static int |
342 | readreg(struct net_device *dev, int portno) | 343 | readword(unsigned long base_addr, int portno) |
343 | { | 344 | { |
344 | outw(portno, dev->base_addr + ADD_PORT); | 345 | return (u16)__raw_readl(base_addr + (portno << 1)); |
345 | return inw(dev->base_addr + DATA_PORT); | ||
346 | } | 346 | } |
347 | 347 | ||
348 | static void | 348 | static void |
349 | writereg(struct net_device *dev, int portno, int value) | 349 | writeword(unsigned long base_addr, int portno, int value) |
350 | { | 350 | { |
351 | outw(portno, dev->base_addr + ADD_PORT); | 351 | __raw_writel((u16)value, base_addr + (portno << 1)); |
352 | outw(value, dev->base_addr + DATA_PORT); | 352 | } |
353 | #else | ||
354 | #if defined(CONFIG_ARCH_PNX010X) | ||
355 | static int | ||
356 | readword(unsigned long base_addr, int portno) | ||
357 | { | ||
358 | return inw(base_addr + (portno << 1)); | ||
359 | } | ||
360 | |||
361 | static void | ||
362 | writeword(unsigned long base_addr, int portno, int value) | ||
363 | { | ||
364 | outw(value, base_addr + (portno << 1)); | ||
365 | } | ||
366 | #else | ||
367 | static int | ||
368 | readword(unsigned long base_addr, int portno) | ||
369 | { | ||
370 | return inw(base_addr + portno); | ||
371 | } | ||
372 | |||
373 | static void | ||
374 | writeword(unsigned long base_addr, int portno, int value) | ||
375 | { | ||
376 | outw(value, base_addr + portno); | ||
377 | } | ||
378 | #endif | ||
379 | #endif | ||
380 | |||
381 | static void | ||
382 | readwords(unsigned long base_addr, int portno, void *buf, int length) | ||
383 | { | ||
384 | u8 *buf8 = (u8 *)buf; | ||
385 | |||
386 | do { | ||
387 | u32 tmp32; | ||
388 | |||
389 | tmp32 = readword(base_addr, portno); | ||
390 | *buf8++ = (u8)tmp32; | ||
391 | *buf8++ = (u8)(tmp32 >> 8); | ||
392 | } while (--length); | ||
393 | } | ||
394 | |||
395 | static void | ||
396 | writewords(unsigned long base_addr, int portno, void *buf, int length) | ||
397 | { | ||
398 | u8 *buf8 = (u8 *)buf; | ||
399 | |||
400 | do { | ||
401 | u32 tmp32; | ||
402 | |||
403 | tmp32 = *buf8++; | ||
404 | tmp32 |= (*buf8++) << 8; | ||
405 | writeword(base_addr, portno, tmp32); | ||
406 | } while (--length); | ||
353 | } | 407 | } |
354 | 408 | ||
355 | static int | 409 | static int |
356 | readword(struct net_device *dev, int portno) | 410 | readreg(struct net_device *dev, int regno) |
357 | { | 411 | { |
358 | return inw(dev->base_addr + portno); | 412 | writeword(dev->base_addr, ADD_PORT, regno); |
413 | return readword(dev->base_addr, DATA_PORT); | ||
359 | } | 414 | } |
360 | 415 | ||
361 | static void | 416 | static void |
362 | writeword(struct net_device *dev, int portno, int value) | 417 | writereg(struct net_device *dev, int regno, int value) |
363 | { | 418 | { |
364 | outw(value, dev->base_addr + portno); | 419 | writeword(dev->base_addr, ADD_PORT, regno); |
420 | writeword(dev->base_addr, DATA_PORT, value); | ||
365 | } | 421 | } |
366 | 422 | ||
367 | static int __init | 423 | static int __init |
@@ -456,7 +512,7 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int modular) | |||
456 | #endif | 512 | #endif |
457 | } | 513 | } |
458 | 514 | ||
459 | #ifdef CONFIG_ARCH_PNX0105 | 515 | #ifdef CONFIG_ARCH_PNX010X |
460 | initialize_ebi(); | 516 | initialize_ebi(); |
461 | 517 | ||
462 | /* Map GPIO registers for the pins connected to the CS8900a. */ | 518 | /* Map GPIO registers for the pins connected to the CS8900a. */ |
@@ -491,8 +547,8 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int modular) | |||
491 | 547 | ||
492 | #ifdef CONFIG_SH_HICOSH4 | 548 | #ifdef CONFIG_SH_HICOSH4 |
493 | /* truely reset the chip */ | 549 | /* truely reset the chip */ |
494 | outw(0x0114, ioaddr + ADD_PORT); | 550 | writeword(ioaddr, ADD_PORT, 0x0114); |
495 | outw(0x0040, ioaddr + DATA_PORT); | 551 | writeword(ioaddr, DATA_PORT, 0x0040); |
496 | #endif | 552 | #endif |
497 | 553 | ||
498 | /* if they give us an odd I/O address, then do ONE write to | 554 | /* if they give us an odd I/O address, then do ONE write to |
@@ -503,24 +559,24 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int modular) | |||
503 | if (net_debug > 1) | 559 | if (net_debug > 1) |
504 | printk(KERN_INFO "%s: odd ioaddr 0x%x\n", dev->name, ioaddr); | 560 | printk(KERN_INFO "%s: odd ioaddr 0x%x\n", dev->name, ioaddr); |
505 | if ((ioaddr & 2) != 2) | 561 | if ((ioaddr & 2) != 2) |
506 | if ((inw((ioaddr & ~3)+ ADD_PORT) & ADD_MASK) != ADD_SIG) { | 562 | if ((readword(ioaddr & ~3, ADD_PORT) & ADD_MASK) != ADD_SIG) { |
507 | printk(KERN_ERR "%s: bad signature 0x%x\n", | 563 | printk(KERN_ERR "%s: bad signature 0x%x\n", |
508 | dev->name, inw((ioaddr & ~3)+ ADD_PORT)); | 564 | dev->name, readword(ioaddr & ~3, ADD_PORT)); |
509 | retval = -ENODEV; | 565 | retval = -ENODEV; |
510 | goto out2; | 566 | goto out2; |
511 | } | 567 | } |
512 | } | 568 | } |
513 | printk(KERN_DEBUG "PP_addr at %x: 0x%x\n", | 569 | printk(KERN_DEBUG "PP_addr at %x[%x]: 0x%x\n", |
514 | ioaddr + ADD_PORT, inw(ioaddr + ADD_PORT)); | 570 | ioaddr, ADD_PORT, readword(ioaddr, ADD_PORT)); |
515 | 571 | ||
516 | ioaddr &= ~3; | 572 | ioaddr &= ~3; |
517 | outw(PP_ChipID, ioaddr + ADD_PORT); | 573 | writeword(ioaddr, ADD_PORT, PP_ChipID); |
518 | 574 | ||
519 | tmp = inw(ioaddr + DATA_PORT); | 575 | tmp = readword(ioaddr, DATA_PORT); |
520 | if (tmp != CHIP_EISA_ID_SIG) { | 576 | if (tmp != CHIP_EISA_ID_SIG) { |
521 | printk(KERN_DEBUG "%s: incorrect signature at %x: 0x%x!=" | 577 | printk(KERN_DEBUG "%s: incorrect signature at %x[%x]: 0x%x!=" |
522 | CHIP_EISA_ID_SIG_STR "\n", | 578 | CHIP_EISA_ID_SIG_STR "\n", |
523 | dev->name, ioaddr + DATA_PORT, tmp); | 579 | dev->name, ioaddr, DATA_PORT, tmp); |
524 | retval = -ENODEV; | 580 | retval = -ENODEV; |
525 | goto out2; | 581 | goto out2; |
526 | } | 582 | } |
@@ -724,7 +780,7 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int modular) | |||
724 | } else { | 780 | } else { |
725 | i = lp->isa_config & INT_NO_MASK; | 781 | i = lp->isa_config & INT_NO_MASK; |
726 | if (lp->chip_type == CS8900) { | 782 | if (lp->chip_type == CS8900) { |
727 | #if defined(CONFIG_ARCH_IXDP2X01) || defined(CONFIG_ARCH_PNX0105) | 783 | #if defined(CONFIG_ARCH_IXDP2X01) || defined(CONFIG_ARCH_PNX010X) |
728 | i = cs8900_irq_map[0]; | 784 | i = cs8900_irq_map[0]; |
729 | #else | 785 | #else |
730 | /* Translate the IRQ using the IRQ mapping table. */ | 786 | /* Translate the IRQ using the IRQ mapping table. */ |
@@ -790,7 +846,7 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int modular) | |||
790 | goto out3; | 846 | goto out3; |
791 | return 0; | 847 | return 0; |
792 | out3: | 848 | out3: |
793 | outw(PP_ChipID, dev->base_addr + ADD_PORT); | 849 | writeword(dev->base_addr, ADD_PORT, PP_ChipID); |
794 | out2: | 850 | out2: |
795 | release_region(ioaddr & ~3, NETCARD_IO_EXTENT); | 851 | release_region(ioaddr & ~3, NETCARD_IO_EXTENT); |
796 | out1: | 852 | out1: |
@@ -970,11 +1026,11 @@ void __init reset_chip(struct net_device *dev) | |||
970 | #ifndef CONFIG_ARCH_IXDP2X01 | 1026 | #ifndef CONFIG_ARCH_IXDP2X01 |
971 | if (lp->chip_type != CS8900) { | 1027 | if (lp->chip_type != CS8900) { |
972 | /* Hardware problem requires PNP registers to be reconfigured after a reset */ | 1028 | /* Hardware problem requires PNP registers to be reconfigured after a reset */ |
973 | outw(PP_CS8920_ISAINT, ioaddr + ADD_PORT); | 1029 | writeword(ioaddr, ADD_PORT, PP_CS8920_ISAINT); |
974 | outb(dev->irq, ioaddr + DATA_PORT); | 1030 | outb(dev->irq, ioaddr + DATA_PORT); |
975 | outb(0, ioaddr + DATA_PORT + 1); | 1031 | outb(0, ioaddr + DATA_PORT + 1); |
976 | 1032 | ||
977 | outw(PP_CS8920_ISAMemB, ioaddr + ADD_PORT); | 1033 | writeword(ioaddr, ADD_PORT, PP_CS8920_ISAMemB); |
978 | outb((dev->mem_start >> 16) & 0xff, ioaddr + DATA_PORT); | 1034 | outb((dev->mem_start >> 16) & 0xff, ioaddr + DATA_PORT); |
979 | outb((dev->mem_start >> 8) & 0xff, ioaddr + DATA_PORT + 1); | 1035 | outb((dev->mem_start >> 8) & 0xff, ioaddr + DATA_PORT + 1); |
980 | } | 1036 | } |
@@ -1104,8 +1160,8 @@ send_test_pkt(struct net_device *dev) | |||
1104 | memcpy(test_packet, dev->dev_addr, ETH_ALEN); | 1160 | memcpy(test_packet, dev->dev_addr, ETH_ALEN); |
1105 | memcpy(test_packet+ETH_ALEN, dev->dev_addr, ETH_ALEN); | 1161 | memcpy(test_packet+ETH_ALEN, dev->dev_addr, ETH_ALEN); |
1106 | 1162 | ||
1107 | writeword(dev, TX_CMD_PORT, TX_AFTER_ALL); | 1163 | writeword(dev->base_addr, TX_CMD_PORT, TX_AFTER_ALL); |
1108 | writeword(dev, TX_LEN_PORT, ETH_ZLEN); | 1164 | writeword(dev->base_addr, TX_LEN_PORT, ETH_ZLEN); |
1109 | 1165 | ||
1110 | /* Test to see if the chip has allocated memory for the packet */ | 1166 | /* Test to see if the chip has allocated memory for the packet */ |
1111 | while (jiffies - timenow < 5) | 1167 | while (jiffies - timenow < 5) |
@@ -1115,7 +1171,7 @@ send_test_pkt(struct net_device *dev) | |||
1115 | return 0; /* this shouldn't happen */ | 1171 | return 0; /* this shouldn't happen */ |
1116 | 1172 | ||
1117 | /* Write the contents of the packet */ | 1173 | /* Write the contents of the packet */ |
1118 | outsw(dev->base_addr + TX_FRAME_PORT,test_packet,(ETH_ZLEN+1) >>1); | 1174 | writewords(dev->base_addr, TX_FRAME_PORT,test_packet,(ETH_ZLEN+1) >>1); |
1119 | 1175 | ||
1120 | if (net_debug > 1) printk("Sending test packet "); | 1176 | if (net_debug > 1) printk("Sending test packet "); |
1121 | /* wait a couple of jiffies for packet to be received */ | 1177 | /* wait a couple of jiffies for packet to be received */ |
@@ -1200,7 +1256,7 @@ net_open(struct net_device *dev) | |||
1200 | int i; | 1256 | int i; |
1201 | int ret; | 1257 | int ret; |
1202 | 1258 | ||
1203 | #if !defined(CONFIG_SH_HICOSH4) && !defined(CONFIG_ARCH_PNX0105) /* uses irq#1, so this won't work */ | 1259 | #if !defined(CONFIG_SH_HICOSH4) && !defined(CONFIG_ARCH_PNX010X) /* uses irq#1, so this won't work */ |
1204 | if (dev->irq < 2) { | 1260 | if (dev->irq < 2) { |
1205 | /* Allow interrupts to be generated by the chip */ | 1261 | /* Allow interrupts to be generated by the chip */ |
1206 | /* Cirrus' release had this: */ | 1262 | /* Cirrus' release had this: */ |
@@ -1231,7 +1287,7 @@ net_open(struct net_device *dev) | |||
1231 | else | 1287 | else |
1232 | #endif | 1288 | #endif |
1233 | { | 1289 | { |
1234 | #if !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX0105) | 1290 | #if !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X) |
1235 | if (((1 << dev->irq) & lp->irq_map) == 0) { | 1291 | if (((1 << dev->irq) & lp->irq_map) == 0) { |
1236 | printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n", | 1292 | printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n", |
1237 | dev->name, dev->irq, lp->irq_map); | 1293 | dev->name, dev->irq, lp->irq_map); |
@@ -1316,7 +1372,7 @@ net_open(struct net_device *dev) | |||
1316 | case A_CNF_MEDIA_10B_2: result = lp->adapter_cnf & A_CNF_10B_2; break; | 1372 | case A_CNF_MEDIA_10B_2: result = lp->adapter_cnf & A_CNF_10B_2; break; |
1317 | default: result = lp->adapter_cnf & (A_CNF_10B_T | A_CNF_AUI | A_CNF_10B_2); | 1373 | default: result = lp->adapter_cnf & (A_CNF_10B_T | A_CNF_AUI | A_CNF_10B_2); |
1318 | } | 1374 | } |
1319 | #ifdef CONFIG_ARCH_PNX0105 | 1375 | #ifdef CONFIG_ARCH_PNX010X |
1320 | result = A_CNF_10B_T; | 1376 | result = A_CNF_10B_T; |
1321 | #endif | 1377 | #endif |
1322 | if (!result) { | 1378 | if (!result) { |
@@ -1457,8 +1513,8 @@ static int net_send_packet(struct sk_buff *skb, struct net_device *dev) | |||
1457 | netif_stop_queue(dev); | 1513 | netif_stop_queue(dev); |
1458 | 1514 | ||
1459 | /* initiate a transmit sequence */ | 1515 | /* initiate a transmit sequence */ |
1460 | writeword(dev, TX_CMD_PORT, lp->send_cmd); | 1516 | writeword(dev->base_addr, TX_CMD_PORT, lp->send_cmd); |
1461 | writeword(dev, TX_LEN_PORT, skb->len); | 1517 | writeword(dev->base_addr, TX_LEN_PORT, skb->len); |
1462 | 1518 | ||
1463 | /* Test to see if the chip has allocated memory for the packet */ | 1519 | /* Test to see if the chip has allocated memory for the packet */ |
1464 | if ((readreg(dev, PP_BusST) & READY_FOR_TX_NOW) == 0) { | 1520 | if ((readreg(dev, PP_BusST) & READY_FOR_TX_NOW) == 0) { |
@@ -1472,7 +1528,7 @@ static int net_send_packet(struct sk_buff *skb, struct net_device *dev) | |||
1472 | return 1; | 1528 | return 1; |
1473 | } | 1529 | } |
1474 | /* Write the contents of the packet */ | 1530 | /* Write the contents of the packet */ |
1475 | outsw(dev->base_addr + TX_FRAME_PORT,skb->data,(skb->len+1) >>1); | 1531 | writewords(dev->base_addr, TX_FRAME_PORT,skb->data,(skb->len+1) >>1); |
1476 | spin_unlock_irq(&lp->lock); | 1532 | spin_unlock_irq(&lp->lock); |
1477 | lp->stats.tx_bytes += skb->len; | 1533 | lp->stats.tx_bytes += skb->len; |
1478 | dev->trans_start = jiffies; | 1534 | dev->trans_start = jiffies; |
@@ -1512,7 +1568,7 @@ static irqreturn_t net_interrupt(int irq, void *dev_id, struct pt_regs * regs) | |||
1512 | course, if you're on a slow machine, and packets are arriving | 1568 | course, if you're on a slow machine, and packets are arriving |
1513 | faster than you can read them off, you're screwed. Hasta la | 1569 | faster than you can read them off, you're screwed. Hasta la |
1514 | vista, baby! */ | 1570 | vista, baby! */ |
1515 | while ((status = readword(dev, ISQ_PORT))) { | 1571 | while ((status = readword(dev->base_addr, ISQ_PORT))) { |
1516 | if (net_debug > 4)printk("%s: event=%04x\n", dev->name, status); | 1572 | if (net_debug > 4)printk("%s: event=%04x\n", dev->name, status); |
1517 | handled = 1; | 1573 | handled = 1; |
1518 | switch(status & ISQ_EVENT_MASK) { | 1574 | switch(status & ISQ_EVENT_MASK) { |
@@ -1606,8 +1662,8 @@ net_rx(struct net_device *dev) | |||
1606 | int status, length; | 1662 | int status, length; |
1607 | 1663 | ||
1608 | int ioaddr = dev->base_addr; | 1664 | int ioaddr = dev->base_addr; |
1609 | status = inw(ioaddr + RX_FRAME_PORT); | 1665 | status = readword(ioaddr, RX_FRAME_PORT); |
1610 | length = inw(ioaddr + RX_FRAME_PORT); | 1666 | length = readword(ioaddr, RX_FRAME_PORT); |
1611 | 1667 | ||
1612 | if ((status & RX_OK) == 0) { | 1668 | if ((status & RX_OK) == 0) { |
1613 | count_rx_errors(status, lp); | 1669 | count_rx_errors(status, lp); |
@@ -1626,9 +1682,9 @@ net_rx(struct net_device *dev) | |||
1626 | skb_reserve(skb, 2); /* longword align L3 header */ | 1682 | skb_reserve(skb, 2); /* longword align L3 header */ |
1627 | skb->dev = dev; | 1683 | skb->dev = dev; |
1628 | 1684 | ||
1629 | insw(ioaddr + RX_FRAME_PORT, skb_put(skb, length), length >> 1); | 1685 | readwords(ioaddr, RX_FRAME_PORT, skb_put(skb, length), length >> 1); |
1630 | if (length & 1) | 1686 | if (length & 1) |
1631 | skb->data[length-1] = inw(ioaddr + RX_FRAME_PORT); | 1687 | skb->data[length-1] = readword(ioaddr, RX_FRAME_PORT); |
1632 | 1688 | ||
1633 | if (net_debug > 3) { | 1689 | if (net_debug > 3) { |
1634 | printk( "%s: received %d byte packet of type %x\n", | 1690 | printk( "%s: received %d byte packet of type %x\n", |
@@ -1901,7 +1957,7 @@ void | |||
1901 | cleanup_module(void) | 1957 | cleanup_module(void) |
1902 | { | 1958 | { |
1903 | unregister_netdev(dev_cs89x0); | 1959 | unregister_netdev(dev_cs89x0); |
1904 | outw(PP_ChipID, dev_cs89x0->base_addr + ADD_PORT); | 1960 | writeword(dev_cs89x0->base_addr, ADD_PORT, PP_ChipID); |
1905 | release_region(dev_cs89x0->base_addr, NETCARD_IO_EXTENT); | 1961 | release_region(dev_cs89x0->base_addr, NETCARD_IO_EXTENT); |
1906 | free_netdev(dev_cs89x0); | 1962 | free_netdev(dev_cs89x0); |
1907 | } | 1963 | } |