aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/mac8390.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/mac8390.c')
-rw-r--r--drivers/net/mac8390.c57
1 files changed, 29 insertions, 28 deletions
diff --git a/drivers/net/mac8390.c b/drivers/net/mac8390.c
index 1136c9a22b67..3832fa4961dd 100644
--- a/drivers/net/mac8390.c
+++ b/drivers/net/mac8390.c
@@ -157,6 +157,8 @@ static void dayna_block_output(struct net_device *dev, int count,
157#define memcpy_fromio(a, b, c) memcpy((a), (void *)(b), (c)) 157#define memcpy_fromio(a, b, c) memcpy((a), (void *)(b), (c))
158#define memcpy_toio(a, b, c) memcpy((void *)(a), (b), (c)) 158#define memcpy_toio(a, b, c) memcpy((void *)(a), (b), (c))
159 159
160#define memcmp_withio(a, b, c) memcmp((a), (void *)(b), (c))
161
160/* Slow Sane (16-bit chunk memory read/write) Cabletron uses this */ 162/* Slow Sane (16-bit chunk memory read/write) Cabletron uses this */
161static void slow_sane_get_8390_hdr(struct net_device *dev, 163static void slow_sane_get_8390_hdr(struct net_device *dev,
162 struct e8390_pkt_hdr *hdr, int ring_page); 164 struct e8390_pkt_hdr *hdr, int ring_page);
@@ -164,8 +166,8 @@ static void slow_sane_block_input(struct net_device *dev, int count,
164 struct sk_buff *skb, int ring_offset); 166 struct sk_buff *skb, int ring_offset);
165static void slow_sane_block_output(struct net_device *dev, int count, 167static void slow_sane_block_output(struct net_device *dev, int count,
166 const unsigned char *buf, int start_page); 168 const unsigned char *buf, int start_page);
167static void word_memcpy_tocard(void *tp, const void *fp, int count); 169static void word_memcpy_tocard(unsigned long tp, const void *fp, int count);
168static void word_memcpy_fromcard(void *tp, const void *fp, int count); 170static void word_memcpy_fromcard(void *tp, unsigned long fp, int count);
169 171
170static enum mac8390_type __init mac8390_ident(struct nubus_dev *dev) 172static enum mac8390_type __init mac8390_ident(struct nubus_dev *dev)
171{ 173{
@@ -245,9 +247,9 @@ static enum mac8390_access __init mac8390_testio(volatile unsigned long membase)
245 unsigned long outdata = 0xA5A0B5B0; 247 unsigned long outdata = 0xA5A0B5B0;
246 unsigned long indata = 0x00000000; 248 unsigned long indata = 0x00000000;
247 /* Try writing 32 bits */ 249 /* Try writing 32 bits */
248 memcpy(membase, &outdata, 4); 250 memcpy_toio(membase, &outdata, 4);
249 /* Now compare them */ 251 /* Now compare them */
250 if (memcmp((char *)&outdata, (char *)membase, 4) == 0) 252 if (memcmp_withio(&outdata, membase, 4) == 0)
251 return ACCESS_32; 253 return ACCESS_32;
252 /* Write 16 bit output */ 254 /* Write 16 bit output */
253 word_memcpy_tocard(membase, &outdata, 4); 255 word_memcpy_tocard(membase, &outdata, 4);
@@ -554,7 +556,7 @@ static int __init mac8390_initdev(struct net_device *dev,
554 case MAC8390_APPLE: 556 case MAC8390_APPLE:
555 switch (mac8390_testio(dev->mem_start)) { 557 switch (mac8390_testio(dev->mem_start)) {
556 case ACCESS_UNKNOWN: 558 case ACCESS_UNKNOWN:
557 pr_info("Don't know how to access card memory!\n"); 559 pr_err("Don't know how to access card memory!\n");
558 return -ENODEV; 560 return -ENODEV;
559 break; 561 break;
560 562
@@ -641,12 +643,13 @@ static int __init mac8390_initdev(struct net_device *dev,
641 643
642static int mac8390_open(struct net_device *dev) 644static int mac8390_open(struct net_device *dev)
643{ 645{
646 int err;
647
644 __ei_open(dev); 648 __ei_open(dev);
645 if (request_irq(dev->irq, __ei_interrupt, 0, "8390 Ethernet", dev)) { 649 err = request_irq(dev->irq, __ei_interrupt, 0, "8390 Ethernet", dev);
646 pr_info("%s: unable to get IRQ %d.\n", dev->name, dev->irq); 650 if (err)
647 return -EAGAIN; 651 pr_err("%s: unable to get IRQ %d\n", dev->name, dev->irq);
648 } 652 return err;
649 return 0;
650} 653}
651 654
652static int mac8390_close(struct net_device *dev) 655static int mac8390_close(struct net_device *dev)
@@ -731,7 +734,7 @@ static void sane_get_8390_hdr(struct net_device *dev,
731 struct e8390_pkt_hdr *hdr, int ring_page) 734 struct e8390_pkt_hdr *hdr, int ring_page)
732{ 735{
733 unsigned long hdr_start = (ring_page - WD_START_PG)<<8; 736 unsigned long hdr_start = (ring_page - WD_START_PG)<<8;
734 memcpy_fromio((void *)hdr, (char *)dev->mem_start + hdr_start, 4); 737 memcpy_fromio(hdr, dev->mem_start + hdr_start, 4);
735 /* Fix endianness */ 738 /* Fix endianness */
736 hdr->count = swab16(hdr->count); 739 hdr->count = swab16(hdr->count);
737} 740}
@@ -745,14 +748,13 @@ static void sane_block_input(struct net_device *dev, int count,
745 if (xfer_start + count > ei_status.rmem_end) { 748 if (xfer_start + count > ei_status.rmem_end) {
746 /* We must wrap the input move. */ 749 /* We must wrap the input move. */
747 int semi_count = ei_status.rmem_end - xfer_start; 750 int semi_count = ei_status.rmem_end - xfer_start;
748 memcpy_fromio(skb->data, (char *)dev->mem_start + xfer_base, 751 memcpy_fromio(skb->data, dev->mem_start + xfer_base,
749 semi_count); 752 semi_count);
750 count -= semi_count; 753 count -= semi_count;
751 memcpy_toio(skb->data + semi_count, 754 memcpy_fromio(skb->data + semi_count, ei_status.rmem_start,
752 (char *)ei_status.rmem_start, count);
753 } else {
754 memcpy_fromio(skb->data, (char *)dev->mem_start + xfer_base,
755 count); 755 count);
756 } else {
757 memcpy_fromio(skb->data, dev->mem_start + xfer_base, count);
756 } 758 }
757} 759}
758 760
@@ -761,7 +763,7 @@ static void sane_block_output(struct net_device *dev, int count,
761{ 763{
762 long shmem = (start_page - WD_START_PG)<<8; 764 long shmem = (start_page - WD_START_PG)<<8;
763 765
764 memcpy_toio((char *)dev->mem_start + shmem, buf, count); 766 memcpy_toio(dev->mem_start + shmem, buf, count);
765} 767}
766 768
767/* dayna block input/output */ 769/* dayna block input/output */
@@ -812,7 +814,7 @@ static void slow_sane_get_8390_hdr(struct net_device *dev,
812 int ring_page) 814 int ring_page)
813{ 815{
814 unsigned long hdr_start = (ring_page - WD_START_PG)<<8; 816 unsigned long hdr_start = (ring_page - WD_START_PG)<<8;
815 word_memcpy_fromcard(hdr, (char *)dev->mem_start + hdr_start, 4); 817 word_memcpy_fromcard(hdr, dev->mem_start + hdr_start, 4);
816 /* Register endianism - fix here rather than 8390.c */ 818 /* Register endianism - fix here rather than 8390.c */
817 hdr->count = (hdr->count&0xFF)<<8|(hdr->count>>8); 819 hdr->count = (hdr->count&0xFF)<<8|(hdr->count>>8);
818} 820}
@@ -826,15 +828,14 @@ static void slow_sane_block_input(struct net_device *dev, int count,
826 if (xfer_start + count > ei_status.rmem_end) { 828 if (xfer_start + count > ei_status.rmem_end) {
827 /* We must wrap the input move. */ 829 /* We must wrap the input move. */
828 int semi_count = ei_status.rmem_end - xfer_start; 830 int semi_count = ei_status.rmem_end - xfer_start;
829 word_memcpy_fromcard(skb->data, 831 word_memcpy_fromcard(skb->data, dev->mem_start + xfer_base,
830 (char *)dev->mem_start + xfer_base,
831 semi_count); 832 semi_count);
832 count -= semi_count; 833 count -= semi_count;
833 word_memcpy_fromcard(skb->data + semi_count, 834 word_memcpy_fromcard(skb->data + semi_count,
834 (char *)ei_status.rmem_start, count); 835 ei_status.rmem_start, count);
835 } else { 836 } else {
836 word_memcpy_fromcard(skb->data, 837 word_memcpy_fromcard(skb->data, dev->mem_start + xfer_base,
837 (char *)dev->mem_start + xfer_base, count); 838 count);
838 } 839 }
839} 840}
840 841
@@ -843,12 +844,12 @@ static void slow_sane_block_output(struct net_device *dev, int count,
843{ 844{
844 long shmem = (start_page - WD_START_PG)<<8; 845 long shmem = (start_page - WD_START_PG)<<8;
845 846
846 word_memcpy_tocard((char *)dev->mem_start + shmem, buf, count); 847 word_memcpy_tocard(dev->mem_start + shmem, buf, count);
847} 848}
848 849
849static void word_memcpy_tocard(void *tp, const void *fp, int count) 850static void word_memcpy_tocard(unsigned long tp, const void *fp, int count)
850{ 851{
851 volatile unsigned short *to = tp; 852 volatile unsigned short *to = (void *)tp;
852 const unsigned short *from = fp; 853 const unsigned short *from = fp;
853 854
854 count++; 855 count++;
@@ -858,10 +859,10 @@ static void word_memcpy_tocard(void *tp, const void *fp, int count)
858 *to++ = *from++; 859 *to++ = *from++;
859} 860}
860 861
861static void word_memcpy_fromcard(void *tp, const void *fp, int count) 862static void word_memcpy_fromcard(void *tp, unsigned long fp, int count)
862{ 863{
863 unsigned short *to = tp; 864 unsigned short *to = tp;
864 const volatile unsigned short *from = fp; 865 const volatile unsigned short *from = (const void *)fp;
865 866
866 count++; 867 count++;
867 count /= 2; 868 count /= 2;