diff options
Diffstat (limited to 'drivers/net/cs89x0.c')
-rw-r--r-- | drivers/net/cs89x0.c | 59 |
1 files changed, 43 insertions, 16 deletions
diff --git a/drivers/net/cs89x0.c b/drivers/net/cs89x0.c index 5c5f540da26a..b96d6fb1929e 100644 --- a/drivers/net/cs89x0.c +++ b/drivers/net/cs89x0.c | |||
@@ -174,6 +174,13 @@ static unsigned int cs8900_irq_map[] = {1,0,0,0}; | |||
174 | #include <asm/irq.h> | 174 | #include <asm/irq.h> |
175 | static unsigned int netcard_portlist[] __initdata = {IXDP2X01_CS8900_VIRT_BASE, 0}; | 175 | static unsigned int netcard_portlist[] __initdata = {IXDP2X01_CS8900_VIRT_BASE, 0}; |
176 | static unsigned int cs8900_irq_map[] = {IRQ_IXDP2X01_CS8900, 0, 0, 0}; | 176 | static unsigned int cs8900_irq_map[] = {IRQ_IXDP2X01_CS8900, 0, 0, 0}; |
177 | #elif defined(CONFIG_ARCH_PNX0105) | ||
178 | #include <asm/irq.h> | ||
179 | #include <asm/arch/gpio.h> | ||
180 | #define CIRRUS_DEFAULT_BASE IO_ADDRESS(EXT_STATIC2_s0_BASE + 0x200000) /* = Physical address 0x48200000 */ | ||
181 | #define CIRRUS_DEFAULT_IRQ VH_INTC_INT_NUM_CASCADED_INTERRUPT_1 /* Event inputs bank 1 - ID 35/bit 3 */ | ||
182 | static unsigned int netcard_portlist[] __initdata = {CIRRUS_DEFAULT_BASE, 0}; | ||
183 | static unsigned int cs8900_irq_map[] = {CIRRUS_DEFAULT_IRQ, 0, 0, 0}; | ||
177 | #else | 184 | #else |
178 | static unsigned int netcard_portlist[] __initdata = | 185 | static unsigned int netcard_portlist[] __initdata = |
179 | { 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0}; | 186 | { 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0}; |
@@ -319,13 +326,7 @@ struct net_device * __init cs89x0_probe(int unit) | |||
319 | } | 326 | } |
320 | if (err) | 327 | if (err) |
321 | goto out; | 328 | goto out; |
322 | err = register_netdev(dev); | ||
323 | if (err) | ||
324 | goto out1; | ||
325 | return dev; | 329 | return dev; |
326 | out1: | ||
327 | outw(PP_ChipID, dev->base_addr + ADD_PORT); | ||
328 | release_region(dev->base_addr, NETCARD_IO_EXTENT); | ||
329 | out: | 330 | out: |
330 | free_netdev(dev); | 331 | free_netdev(dev); |
331 | printk(KERN_WARNING "cs89x0: no cs8900 or cs8920 detected. Be sure to disable PnP with SETUP\n"); | 332 | printk(KERN_WARNING "cs89x0: no cs8900 or cs8920 detected. Be sure to disable PnP with SETUP\n"); |
@@ -437,6 +438,30 @@ cs89x0_probe1(struct net_device *dev, int ioaddr, int modular) | |||
437 | #endif | 438 | #endif |
438 | } | 439 | } |
439 | 440 | ||
441 | #ifdef CONFIG_ARCH_PNX0105 | ||
442 | initialize_ebi(); | ||
443 | |||
444 | /* Map GPIO registers for the pins connected to the CS8900a. */ | ||
445 | if (map_cirrus_gpio() < 0) | ||
446 | return -ENODEV; | ||
447 | |||
448 | reset_cirrus(); | ||
449 | |||
450 | /* Map event-router registers. */ | ||
451 | if (map_event_router() < 0) | ||
452 | return -ENODEV; | ||
453 | |||
454 | enable_cirrus_irq(); | ||
455 | |||
456 | unmap_cirrus_gpio(); | ||
457 | unmap_event_router(); | ||
458 | |||
459 | dev->base_addr = ioaddr; | ||
460 | |||
461 | for (i = 0 ; i < 3 ; i++) | ||
462 | readreg(dev, 0); | ||
463 | #endif | ||
464 | |||
440 | /* Grab the region so we can find another board if autoIRQ fails. */ | 465 | /* Grab the region so we can find another board if autoIRQ fails. */ |
441 | /* WTF is going on here? */ | 466 | /* WTF is going on here? */ |
442 | if (!request_region(ioaddr & ~3, NETCARD_IO_EXTENT, DRV_NAME)) { | 467 | if (!request_region(ioaddr & ~3, NETCARD_IO_EXTENT, DRV_NAME)) { |
@@ -678,7 +703,7 @@ printk("PP_addr=0x%x\n", inw(ioaddr + ADD_PORT)); | |||
678 | } else { | 703 | } else { |
679 | i = lp->isa_config & INT_NO_MASK; | 704 | i = lp->isa_config & INT_NO_MASK; |
680 | if (lp->chip_type == CS8900) { | 705 | if (lp->chip_type == CS8900) { |
681 | #ifdef CONFIG_ARCH_IXDP2X01 | 706 | #if defined(CONFIG_ARCH_IXDP2X01) || defined(CONFIG_ARCH_PNX0105) |
682 | i = cs8900_irq_map[0]; | 707 | i = cs8900_irq_map[0]; |
683 | #else | 708 | #else |
684 | /* Translate the IRQ using the IRQ mapping table. */ | 709 | /* Translate the IRQ using the IRQ mapping table. */ |
@@ -735,7 +760,13 @@ printk("PP_addr=0x%x\n", inw(ioaddr + ADD_PORT)); | |||
735 | printk("\n"); | 760 | printk("\n"); |
736 | if (net_debug) | 761 | if (net_debug) |
737 | printk("cs89x0_probe1() successful\n"); | 762 | printk("cs89x0_probe1() successful\n"); |
763 | |||
764 | retval = register_netdev(dev); | ||
765 | if (retval) | ||
766 | goto out3; | ||
738 | return 0; | 767 | return 0; |
768 | out3: | ||
769 | outw(PP_ChipID, dev->base_addr + ADD_PORT); | ||
739 | out2: | 770 | out2: |
740 | release_region(ioaddr & ~3, NETCARD_IO_EXTENT); | 771 | release_region(ioaddr & ~3, NETCARD_IO_EXTENT); |
741 | out1: | 772 | out1: |
@@ -1145,7 +1176,7 @@ net_open(struct net_device *dev) | |||
1145 | int i; | 1176 | int i; |
1146 | int ret; | 1177 | int ret; |
1147 | 1178 | ||
1148 | #ifndef CONFIG_SH_HICOSH4 /* uses irq#1, so this won't work */ | 1179 | #if !defined(CONFIG_SH_HICOSH4) && !defined(CONFIG_ARCH_PNX0105) /* uses irq#1, so this won't work */ |
1149 | if (dev->irq < 2) { | 1180 | if (dev->irq < 2) { |
1150 | /* Allow interrupts to be generated by the chip */ | 1181 | /* Allow interrupts to be generated by the chip */ |
1151 | /* Cirrus' release had this: */ | 1182 | /* Cirrus' release had this: */ |
@@ -1176,7 +1207,7 @@ net_open(struct net_device *dev) | |||
1176 | else | 1207 | else |
1177 | #endif | 1208 | #endif |
1178 | { | 1209 | { |
1179 | #ifndef CONFIG_ARCH_IXDP2X01 | 1210 | #if !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX0105) |
1180 | if (((1 << dev->irq) & lp->irq_map) == 0) { | 1211 | if (((1 << dev->irq) & lp->irq_map) == 0) { |
1181 | printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n", | 1212 | printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n", |
1182 | dev->name, dev->irq, lp->irq_map); | 1213 | dev->name, dev->irq, lp->irq_map); |
@@ -1261,6 +1292,9 @@ net_open(struct net_device *dev) | |||
1261 | case A_CNF_MEDIA_10B_2: result = lp->adapter_cnf & A_CNF_10B_2; break; | 1292 | case A_CNF_MEDIA_10B_2: result = lp->adapter_cnf & A_CNF_10B_2; break; |
1262 | default: result = lp->adapter_cnf & (A_CNF_10B_T | A_CNF_AUI | A_CNF_10B_2); | 1293 | default: result = lp->adapter_cnf & (A_CNF_10B_T | A_CNF_AUI | A_CNF_10B_2); |
1263 | } | 1294 | } |
1295 | #ifdef CONFIG_ARCH_PNX0105 | ||
1296 | result = A_CNF_10B_T; | ||
1297 | #endif | ||
1264 | if (!result) { | 1298 | if (!result) { |
1265 | printk(KERN_ERR "%s: EEPROM is configured for unavailable media\n", dev->name); | 1299 | printk(KERN_ERR "%s: EEPROM is configured for unavailable media\n", dev->name); |
1266 | release_irq: | 1300 | release_irq: |
@@ -1831,13 +1865,6 @@ init_module(void) | |||
1831 | if (ret) | 1865 | if (ret) |
1832 | goto out; | 1866 | goto out; |
1833 | 1867 | ||
1834 | if (register_netdev(dev) != 0) { | ||
1835 | printk(KERN_ERR "cs89x0.c: No card found at 0x%x\n", io); | ||
1836 | ret = -ENXIO; | ||
1837 | outw(PP_ChipID, dev->base_addr + ADD_PORT); | ||
1838 | release_region(dev->base_addr, NETCARD_IO_EXTENT); | ||
1839 | goto out; | ||
1840 | } | ||
1841 | dev_cs89x0 = dev; | 1868 | dev_cs89x0 = dev; |
1842 | return 0; | 1869 | return 0; |
1843 | out: | 1870 | out: |