Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
3c501.c
Go to the documentation of this file.
1 /* 3c501.c: A 3Com 3c501 Ethernet driver for Linux. */
2 /*
3  Written 1992,1993,1994 Donald Becker
4 
5  Copyright 1993 United States Government as represented by the
6  Director, National Security Agency. This software may be used and
7  distributed according to the terms of the GNU General Public License,
8  incorporated herein by reference.
9 
10  This is a device driver for the 3Com Etherlink 3c501.
11  Do not purchase this card, even as a joke. It's performance is horrible,
12  and it breaks in many ways.
13 
14  The original author may be reached as [email protected], or C/O
15  Scyld Computing Corporation
16  410 Severn Ave., Suite 210
17  Annapolis MD 21403
18 
19  Fixed (again!) the missing interrupt locking on TX/RX shifting.
20  Alan Cox <[email protected]>
21 
22  Removed calls to init_etherdev since they are no longer needed, and
23  cleaned up modularization just a bit. The driver still allows only
24  the default address for cards when loaded as a module, but that's
25  really less braindead than anyone using a 3c501 board. :)
26  19950208 ([email protected])
27 
28  Added traps for interrupts hitting the window as we clear and TX load
29  the board. Now getting 150K/second FTP with a 3c501 card. Still playing
30  with a TX-TX optimisation to see if we can touch 180-200K/second as seems
31  theoretically maximum.
32  19950402 Alan Cox <[email protected]>
33 
34  Cleaned up for 2.3.x because we broke SMP now.
35  20000208 Alan Cox <[email protected]>
36 
37  Check up pass for 2.5. Nothing significant changed
38  20021009 Alan Cox <[email protected]>
39 
40  Fixed zero fill corner case
41  20030104 Alan Cox <[email protected]>
42 
43 
44  For the avoidance of doubt the "preferred form" of this code is one which
45  is in an open non patent encumbered format. Where cryptographic key signing
46  forms part of the process of creating an executable the information
47  including keys needed to generate an equivalently functional executable
48  are deemed to be part of the source code.
49 
50 */
51 
52 
102 #define DRV_NAME "3c501"
103 #define DRV_VERSION "2002/10/09"
104 
105 
106 static const char version[] =
107  DRV_NAME ".c: " DRV_VERSION " Alan Cox ([email protected]).\n";
108 
109 /*
110  * Braindamage remaining:
111  * The 3c501 board.
112  */
113 
114 #include <linux/module.h>
115 
116 #include <linux/kernel.h>
117 #include <linux/fcntl.h>
118 #include <linux/ioport.h>
119 #include <linux/interrupt.h>
120 #include <linux/string.h>
121 #include <linux/errno.h>
122 #include <linux/spinlock.h>
123 #include <linux/ethtool.h>
124 #include <linux/delay.h>
125 #include <linux/bitops.h>
126 
127 #include <asm/uaccess.h>
128 #include <asm/io.h>
129 
130 #include <linux/netdevice.h>
131 #include <linux/etherdevice.h>
132 #include <linux/skbuff.h>
133 #include <linux/init.h>
134 
135 #include "3c501.h"
136 
137 /*
138  * The boilerplate probe code.
139  */
140 
141 static int io = 0x280;
142 static int irq = 5;
143 static int mem_start;
144 
159 {
160  struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
161  static const unsigned ports[] = { 0x280, 0x300, 0};
162  const unsigned *port;
163  int err = 0;
164 
165  if (!dev)
166  return ERR_PTR(-ENOMEM);
167 
168  if (unit >= 0) {
169  sprintf(dev->name, "eth%d", unit);
171  io = dev->base_addr;
172  irq = dev->irq;
173  mem_start = dev->mem_start & 7;
174  }
175 
176  if (io > 0x1ff) { /* Check a single specified location. */
177  err = el1_probe1(dev, io);
178  } else if (io != 0) {
179  err = -ENXIO; /* Don't probe at all. */
180  } else {
181  for (port = ports; *port && el1_probe1(dev, *port); port++)
182  ;
183  if (!*port)
184  err = -ENODEV;
185  }
186  if (err)
187  goto out;
188  err = register_netdev(dev);
189  if (err)
190  goto out1;
191  return dev;
192 out1:
194 out:
195  free_netdev(dev);
196  return ERR_PTR(err);
197 }
198 
199 static const struct net_device_ops el_netdev_ops = {
200  .ndo_open = el_open,
201  .ndo_stop = el1_close,
202  .ndo_start_xmit = el_start_xmit,
203  .ndo_tx_timeout = el_timeout,
204  .ndo_set_rx_mode = set_multicast_list,
205  .ndo_change_mtu = eth_change_mtu,
206  .ndo_set_mac_address = eth_mac_addr,
207  .ndo_validate_addr = eth_validate_addr,
208 };
209 
223 static int __init el1_probe1(struct net_device *dev, int ioaddr)
224 {
225  struct net_local *lp;
226  const char *mname; /* Vendor name */
227  unsigned char station_addr[6];
228  int autoirq = 0;
229  int i;
230 
231  /*
232  * Reserve I/O resource for exclusive use by this driver
233  */
234 
235  if (!request_region(ioaddr, EL1_IO_EXTENT, DRV_NAME))
236  return -ENODEV;
237 
238  /*
239  * Read the station address PROM data from the special port.
240  */
241 
242  for (i = 0; i < 6; i++) {
243  outw(i, ioaddr + EL1_DATAPTR);
244  station_addr[i] = inb(ioaddr + EL1_SAPROM);
245  }
246  /*
247  * Check the first three octets of the S.A. for 3Com's prefix, or
248  * for the Sager NP943 prefix.
249  */
250 
251  if (station_addr[0] == 0x02 && station_addr[1] == 0x60 &&
252  station_addr[2] == 0x8c)
253  mname = "3c501";
254  else if (station_addr[0] == 0x00 && station_addr[1] == 0x80 &&
255  station_addr[2] == 0xC8)
256  mname = "NP943";
257  else {
258  release_region(ioaddr, EL1_IO_EXTENT);
259  return -ENODEV;
260  }
261 
262  /*
263  * We auto-IRQ by shutting off the interrupt line and letting it
264  * float high.
265  */
266 
267  dev->irq = irq;
268 
269  if (dev->irq < 2) {
270  unsigned long irq_mask;
271 
272  irq_mask = probe_irq_on();
273  inb(RX_STATUS); /* Clear pending interrupts. */
274  inb(TX_STATUS);
275  outb(AX_LOOP + 1, AX_CMD);
276 
277  outb(0x00, AX_CMD);
278 
279  mdelay(20);
280  autoirq = probe_irq_off(irq_mask);
281 
282  if (autoirq == 0) {
283  pr_warning("%s probe at %#x failed to detect IRQ line.\n",
284  mname, ioaddr);
285  release_region(ioaddr, EL1_IO_EXTENT);
286  return -EAGAIN;
287  }
288  }
289 
290  outb(AX_RESET+AX_LOOP, AX_CMD); /* Loopback mode. */
291  dev->base_addr = ioaddr;
292  memcpy(dev->dev_addr, station_addr, ETH_ALEN);
293 
294  if (mem_start & 0xf)
295  el_debug = mem_start & 0x7;
296  if (autoirq)
297  dev->irq = autoirq;
298 
299  pr_info("%s: %s EtherLink at %#lx, using %sIRQ %d.\n",
300  dev->name, mname, dev->base_addr,
301  autoirq ? "auto":"assigned ", dev->irq);
302 
303 #ifdef CONFIG_IP_MULTICAST
304  pr_warning("WARNING: Use of the 3c501 in a multicast kernel is NOT recommended.\n");
305 #endif
306 
307  if (el_debug)
308  pr_debug("%s", version);
309 
310  lp = netdev_priv(dev);
311  memset(lp, 0, sizeof(struct net_local));
312  spin_lock_init(&lp->lock);
313 
314  /*
315  * The EL1-specific entries in the device structure.
316  */
317 
318  dev->netdev_ops = &el_netdev_ops;
319  dev->watchdog_timeo = HZ;
320  dev->ethtool_ops = &netdev_ethtool_ops;
321  return 0;
322 }
323 
337 static int el_open(struct net_device *dev)
338 {
339  int retval;
340  int ioaddr = dev->base_addr;
341  struct net_local *lp = netdev_priv(dev);
342  unsigned long flags;
343 
344  if (el_debug > 2)
345  pr_debug("%s: Doing el_open()...\n", dev->name);
346 
347  retval = request_irq(dev->irq, el_interrupt, 0, dev->name, dev);
348  if (retval)
349  return retval;
350 
351  spin_lock_irqsave(&lp->lock, flags);
352  el_reset(dev);
353  spin_unlock_irqrestore(&lp->lock, flags);
354 
355  lp->txing = 0; /* Board in RX mode */
356  outb(AX_RX, AX_CMD); /* Aux control, irq and receive enabled */
357  netif_start_queue(dev);
358  return 0;
359 }
360 
370 static void el_timeout(struct net_device *dev)
371 {
372  struct net_local *lp = netdev_priv(dev);
373  int ioaddr = dev->base_addr;
374 
375  if (el_debug)
376  pr_debug("%s: transmit timed out, txsr %#2x axsr=%02x rxsr=%02x.\n",
377  dev->name, inb(TX_STATUS),
379  dev->stats.tx_errors++;
380  outb(TX_NORM, TX_CMD);
381  outb(RX_NORM, RX_CMD);
382  outb(AX_OFF, AX_CMD); /* Just trigger a false interrupt. */
383  outb(AX_RX, AX_CMD); /* Aux control, irq and receive enabled */
384  lp->txing = 0; /* Ripped back in to RX */
385  netif_wake_queue(dev);
386 }
387 
388 
411 static netdev_tx_t el_start_xmit(struct sk_buff *skb, struct net_device *dev)
412 {
413  struct net_local *lp = netdev_priv(dev);
414  int ioaddr = dev->base_addr;
415  unsigned long flags;
416 
417  /*
418  * Avoid incoming interrupts between us flipping txing and flipping
419  * mode as the driver assumes txing is a faithful indicator of card
420  * state
421  */
422 
423  spin_lock_irqsave(&lp->lock, flags);
424 
425  /*
426  * Avoid timer-based retransmission conflicts.
427  */
428 
429  netif_stop_queue(dev);
430 
431  do {
432  int len = skb->len;
433  int pad = 0;
434  int gp_start;
435  unsigned char *buf = skb->data;
436 
437  if (len < ETH_ZLEN)
438  pad = ETH_ZLEN - len;
439 
440  gp_start = 0x800 - (len + pad);
441 
442  lp->tx_pkt_start = gp_start;
443  lp->collisions = 0;
444 
445  dev->stats.tx_bytes += skb->len;
446 
447  /*
448  * Command mode with status cleared should [in theory]
449  * mean no more interrupts can be pending on the card.
450  */
451 
452  outb_p(AX_SYS, AX_CMD);
453  inb_p(RX_STATUS);
454  inb_p(TX_STATUS);
455 
456  lp->loading = 1;
457  lp->txing = 1;
458 
459  /*
460  * Turn interrupts back on while we spend a pleasant
461  * afternoon loading bytes into the board
462  */
463 
464  spin_unlock_irqrestore(&lp->lock, flags);
465 
466  /* Set rx packet area to 0. */
467  outw(0x00, RX_BUF_CLR);
468  /* aim - packet will be loaded into buffer start */
469  outw(gp_start, GP_LOW);
470  /* load buffer (usual thing each byte increments the pointer) */
471  outsb(DATAPORT, buf, len);
472  if (pad) {
473  while (pad--) /* Zero fill buffer tail */
474  outb(0, DATAPORT);
475  }
476  /* the board reuses the same register */
477  outw(gp_start, GP_LOW);
478 
479  if (lp->loading != 2) {
480  /* fire ... Trigger xmit. */
481  outb(AX_XMIT, AX_CMD);
482  lp->loading = 0;
483  if (el_debug > 2)
484  pr_debug(" queued xmit.\n");
485  dev_kfree_skb(skb);
486  return NETDEV_TX_OK;
487  }
488  /* A receive upset our load, despite our best efforts */
489  if (el_debug > 2)
490  pr_debug("%s: burped during tx load.\n", dev->name);
491  spin_lock_irqsave(&lp->lock, flags);
492  } while (1);
493 }
494 
517 static irqreturn_t el_interrupt(int irq, void *dev_id)
518 {
519  struct net_device *dev = dev_id;
520  struct net_local *lp;
521  int ioaddr;
522  int axsr; /* Aux. status reg. */
523 
524  ioaddr = dev->base_addr;
525  lp = netdev_priv(dev);
526 
527  spin_lock(&lp->lock);
528 
529  /*
530  * What happened ?
531  */
532 
533  axsr = inb(AX_STATUS);
534 
535  /*
536  * Log it
537  */
538 
539  if (el_debug > 3)
540  pr_debug("%s: el_interrupt() aux=%#02x\n", dev->name, axsr);
541 
542  if (lp->loading == 1 && !lp->txing)
543  pr_warning("%s: Inconsistent state loading while not in tx\n",
544  dev->name);
545 
546  if (lp->txing) {
547  /*
548  * Board in transmit mode. May be loading. If we are
549  * loading we shouldn't have got this.
550  */
551  int txsr = inb(TX_STATUS);
552 
553  if (lp->loading == 1) {
554  if (el_debug > 2)
555  pr_debug("%s: Interrupt while loading [txsr=%02x gp=%04x rp=%04x]\n",
556  dev->name, txsr, inw(GP_LOW), inw(RX_LOW));
557 
558  /* Force a reload */
559  lp->loading = 2;
560  spin_unlock(&lp->lock);
561  goto out;
562  }
563  if (el_debug > 6)
564  pr_debug("%s: txsr=%02x gp=%04x rp=%04x\n", dev->name,
565  txsr, inw(GP_LOW), inw(RX_LOW));
566 
567  if ((axsr & 0x80) && (txsr & TX_READY) == 0) {
568  /*
569  * FIXME: is there a logic to whether to keep
570  * on trying or reset immediately ?
571  */
572  if (el_debug > 1)
573  pr_debug("%s: Unusual interrupt during Tx, txsr=%02x axsr=%02x gp=%03x rp=%03x.\n",
574  dev->name, txsr, axsr,
575  inw(ioaddr + EL1_DATAPTR),
576  inw(ioaddr + EL1_RXPTR));
577  lp->txing = 0;
578  netif_wake_queue(dev);
579  } else if (txsr & TX_16COLLISIONS) {
580  /*
581  * Timed out
582  */
583  if (el_debug)
584  pr_debug("%s: Transmit failed 16 times, Ethernet jammed?\n", dev->name);
585  outb(AX_SYS, AX_CMD);
586  lp->txing = 0;
587  dev->stats.tx_aborted_errors++;
588  netif_wake_queue(dev);
589  } else if (txsr & TX_COLLISION) {
590  /*
591  * Retrigger xmit.
592  */
593 
594  if (el_debug > 6)
595  pr_debug("%s: retransmitting after a collision.\n", dev->name);
596  /*
597  * Poor little chip can't reset its own start
598  * pointer
599  */
600 
601  outb(AX_SYS, AX_CMD);
602  outw(lp->tx_pkt_start, GP_LOW);
603  outb(AX_XMIT, AX_CMD);
604  dev->stats.collisions++;
605  spin_unlock(&lp->lock);
606  goto out;
607  } else {
608  /*
609  * It worked.. we will now fall through and receive
610  */
611  dev->stats.tx_packets++;
612  if (el_debug > 6)
613  pr_debug("%s: Tx succeeded %s\n", dev->name,
614  (txsr & TX_RDY) ? "." : "but tx is busy!");
615  /*
616  * This is safe the interrupt is atomic WRT itself.
617  */
618  lp->txing = 0;
619  /* In case more to transmit */
620  netif_wake_queue(dev);
621  }
622  } else {
623  /*
624  * In receive mode.
625  */
626 
627  int rxsr = inb(RX_STATUS);
628  if (el_debug > 5)
629  pr_debug("%s: rxsr=%02x txsr=%02x rp=%04x\n",
630  dev->name, rxsr, inb(TX_STATUS), inw(RX_LOW));
631  /*
632  * Just reading rx_status fixes most errors.
633  */
634  if (rxsr & RX_MISSED)
635  dev->stats.rx_missed_errors++;
636  else if (rxsr & RX_RUNT) {
637  /* Handled to avoid board lock-up. */
638  dev->stats.rx_length_errors++;
639  if (el_debug > 5)
640  pr_debug("%s: runt.\n", dev->name);
641  } else if (rxsr & RX_GOOD) {
642  /*
643  * Receive worked.
644  */
645  el_receive(dev);
646  } else {
647  /*
648  * Nothing? Something is broken!
649  */
650  if (el_debug > 2)
651  pr_debug("%s: No packet seen, rxsr=%02x **resetting 3c501***\n",
652  dev->name, rxsr);
653  el_reset(dev);
654  }
655  }
656 
657  /*
658  * Move into receive mode
659  */
660 
661  outb(AX_RX, AX_CMD);
662  outw(0x00, RX_BUF_CLR);
663  inb(RX_STATUS); /* Be certain that interrupts are cleared. */
664  inb(TX_STATUS);
665  spin_unlock(&lp->lock);
666 out:
667  return IRQ_HANDLED;
668 }
669 
670 
681 static void el_receive(struct net_device *dev)
682 {
683  int ioaddr = dev->base_addr;
684  int pkt_len;
685  struct sk_buff *skb;
686 
687  pkt_len = inw(RX_LOW);
688 
689  if (el_debug > 4)
690  pr_debug(" el_receive %d.\n", pkt_len);
691 
692  if (pkt_len < 60 || pkt_len > 1536) {
693  if (el_debug)
694  pr_debug("%s: bogus packet, length=%d\n",
695  dev->name, pkt_len);
696  dev->stats.rx_over_errors++;
697  return;
698  }
699 
700  /*
701  * Command mode so we can empty the buffer
702  */
703 
704  outb(AX_SYS, AX_CMD);
705  skb = netdev_alloc_skb(dev, pkt_len + 2);
706 
707  /*
708  * Start of frame
709  */
710 
711  outw(0x00, GP_LOW);
712  if (skb == NULL) {
713  pr_info("%s: Memory squeeze, dropping packet.\n", dev->name);
714  dev->stats.rx_dropped++;
715  return;
716  } else {
717  skb_reserve(skb, 2); /* Force 16 byte alignment */
718  /*
719  * The read increments through the bytes. The interrupt
720  * handler will fix the pointer when it returns to
721  * receive mode.
722  */
723  insb(DATAPORT, skb_put(skb, pkt_len), pkt_len);
724  skb->protocol = eth_type_trans(skb, dev);
725  netif_rx(skb);
726  dev->stats.rx_packets++;
727  dev->stats.rx_bytes += pkt_len;
728  }
729 }
730 
740 static void el_reset(struct net_device *dev)
741 {
742  struct net_local *lp = netdev_priv(dev);
743  int ioaddr = dev->base_addr;
744 
745  if (el_debug > 2)
746  pr_info("3c501 reset...\n");
747  outb(AX_RESET, AX_CMD); /* Reset the chip */
748  /* Aux control, irq and loopback enabled */
749  outb(AX_LOOP, AX_CMD);
750  {
751  int i;
752  for (i = 0; i < 6; i++) /* Set the station address. */
753  outb(dev->dev_addr[i], ioaddr + i);
754  }
755 
756  outw(0, RX_BUF_CLR); /* Set rx packet area to 0. */
757  outb(TX_NORM, TX_CMD); /* tx irq on done, collision */
758  outb(RX_NORM, RX_CMD); /* Set Rx commands. */
759  inb(RX_STATUS); /* Clear status. */
760  inb(TX_STATUS);
761  lp->txing = 0;
762 }
763 
775 static int el1_close(struct net_device *dev)
776 {
777  int ioaddr = dev->base_addr;
778 
779  if (el_debug > 2)
780  pr_info("%s: Shutting down Ethernet card at %#x.\n",
781  dev->name, ioaddr);
782 
783  netif_stop_queue(dev);
784 
785  /*
786  * Free and disable the IRQ.
787  */
788 
789  free_irq(dev->irq, dev);
790  outb(AX_RESET, AX_CMD); /* Reset the chip */
791 
792  return 0;
793 }
794 
805 static void set_multicast_list(struct net_device *dev)
806 {
807  int ioaddr = dev->base_addr;
808 
809  if (dev->flags & IFF_PROMISC) {
810  outb(RX_PROM, RX_CMD);
811  inb(RX_STATUS);
812  } else if (!netdev_mc_empty(dev) || dev->flags & IFF_ALLMULTI) {
813  /* Multicast or all multicast is the same */
814  outb(RX_MULT, RX_CMD);
815  inb(RX_STATUS); /* Clear status. */
816  } else {
817  outb(RX_NORM, RX_CMD);
818  inb(RX_STATUS);
819  }
820 }
821 
822 
823 static void netdev_get_drvinfo(struct net_device *dev,
824  struct ethtool_drvinfo *info)
825 {
826  strcpy(info->driver, DRV_NAME);
827  strcpy(info->version, DRV_VERSION);
828  sprintf(info->bus_info, "ISA 0x%lx", dev->base_addr);
829 }
830 
831 static u32 netdev_get_msglevel(struct net_device *dev)
832 {
833  return debug;
834 }
835 
836 static void netdev_set_msglevel(struct net_device *dev, u32 level)
837 {
838  debug = level;
839 }
840 
841 static const struct ethtool_ops netdev_ethtool_ops = {
842  .get_drvinfo = netdev_get_drvinfo,
843  .get_msglevel = netdev_get_msglevel,
844  .set_msglevel = netdev_set_msglevel,
845 };
846 
847 #ifdef MODULE
848 
849 static struct net_device *dev_3c501;
850 
851 module_param(io, int, 0);
852 module_param(irq, int, 0);
853 MODULE_PARM_DESC(io, "EtherLink I/O base address");
854 MODULE_PARM_DESC(irq, "EtherLink IRQ number");
855 
868 int __init init_module(void)
869 {
870  dev_3c501 = el1_probe(-1);
871  if (IS_ERR(dev_3c501))
872  return PTR_ERR(dev_3c501);
873  return 0;
874 }
875 
883 void __exit cleanup_module(void)
884 {
885  struct net_device *dev = dev_3c501;
886  unregister_netdev(dev);
888  free_netdev(dev);
889 }
890 
891 #endif /* MODULE */
892 
893 MODULE_AUTHOR("Donald Becker, Alan Cox");
894 MODULE_DESCRIPTION("Support for the ancient 3Com 3c501 ethernet card");
895 MODULE_LICENSE("GPL");
896