root/drivers/net/ethernet/8390/etherh.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. etherh_clr_ctrl
  2. etherh_get_stat
  3. etherh_irq_enable
  4. etherh_irq_disable
  5. etherh_setif
  6. etherh_getifstat
  7. etherh_set_config
  8. etherh_reset
  9. etherh_block_output
  10. etherh_block_input
  11. etherh_get_header
  12. etherh_open
  13. etherh_close
  14. etherh_addr
  15. etherm_addr
  16. etherh_get_drvinfo
  17. etherh_get_link_ksettings
  18. etherh_set_link_ksettings
  19. etherh_get_msglevel
  20. etherh_set_msglevel
  21. etherh_probe
  22. etherh_remove
  23. etherh_init
  24. etherh_exit

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  *  linux/drivers/acorn/net/etherh.c
   4  *
   5  *  Copyright (C) 2000-2002 Russell King
   6  *
   7  * NS8390 I-cubed EtherH and ANT EtherM specific driver
   8  * Thanks to I-Cubed for information on their cards.
   9  * EtherM conversion (C) 1999 Chris Kemp and Tim Watterton
  10  * EtherM integration (C) 2000 Aleph One Ltd (Tak-Shing Chan)
  11  * EtherM integration re-engineered by Russell King.
  12  *
  13  * Changelog:
  14  *  08-12-1996  RMK     1.00    Created
  15  *              RMK     1.03    Added support for EtherLan500 cards
  16  *  23-11-1997  RMK     1.04    Added media autodetection
  17  *  16-04-1998  RMK     1.05    Improved media autodetection
  18  *  10-02-2000  RMK     1.06    Updated for 2.3.43
  19  *  13-05-2000  RMK     1.07    Updated for 2.3.99-pre8
  20  *  12-10-1999  CK/TEW          EtherM driver first release
  21  *  21-12-2000  TTC             EtherH/EtherM integration
  22  *  25-12-2000  RMK     1.08    Clean integration of EtherM into this driver.
  23  *  03-01-2002  RMK     1.09    Always enable IRQs if we're in the nic slot.
  24  */
  25 
  26 #include <linux/module.h>
  27 #include <linux/kernel.h>
  28 #include <linux/types.h>
  29 #include <linux/fcntl.h>
  30 #include <linux/interrupt.h>
  31 #include <linux/ioport.h>
  32 #include <linux/in.h>
  33 #include <linux/string.h>
  34 #include <linux/errno.h>
  35 #include <linux/netdevice.h>
  36 #include <linux/etherdevice.h>
  37 #include <linux/ethtool.h>
  38 #include <linux/skbuff.h>
  39 #include <linux/delay.h>
  40 #include <linux/device.h>
  41 #include <linux/init.h>
  42 #include <linux/bitops.h>
  43 #include <linux/jiffies.h>
  44 
  45 #include <asm/ecard.h>
  46 #include <asm/io.h>
  47 #include <asm/system_info.h>
  48 
  49 #define EI_SHIFT(x)     (ei_local->reg_offset[x])
  50 
  51 #define ei_inb(_p)       readb((void __iomem *)_p)
  52 #define ei_outb(_v,_p)   writeb(_v,(void __iomem *)_p)
  53 #define ei_inb_p(_p)     readb((void __iomem *)_p)
  54 #define ei_outb_p(_v,_p) writeb(_v,(void __iomem *)_p)
  55 
  56 #define DRV_NAME        "etherh"
  57 #define DRV_VERSION     "1.11"
  58 
  59 static char version[] =
  60         "EtherH/EtherM Driver (c) 2002-2004 Russell King " DRV_VERSION "\n";
  61 
  62 #include "lib8390.c"
  63 
  64 struct etherh_priv {
  65         void __iomem    *ioc_fast;
  66         void __iomem    *memc;
  67         void __iomem    *dma_base;
  68         unsigned int    id;
  69         void __iomem    *ctrl_port;
  70         unsigned char   ctrl;
  71         u32             supported;
  72 };
  73 
  74 struct etherh_data {
  75         unsigned long   ns8390_offset;
  76         unsigned long   dataport_offset;
  77         unsigned long   ctrlport_offset;
  78         int             ctrl_ioc;
  79         const char      name[16];
  80         u32             supported;
  81         unsigned char   tx_start_page;
  82         unsigned char   stop_page;
  83 };
  84 
  85 MODULE_AUTHOR("Russell King");
  86 MODULE_DESCRIPTION("EtherH/EtherM driver");
  87 MODULE_LICENSE("GPL");
  88 
  89 #define ETHERH500_DATAPORT      0x800   /* MEMC */
  90 #define ETHERH500_NS8390        0x000   /* MEMC */
  91 #define ETHERH500_CTRLPORT      0x800   /* IOC  */
  92 
  93 #define ETHERH600_DATAPORT      0x040   /* MEMC */
  94 #define ETHERH600_NS8390        0x800   /* MEMC */
  95 #define ETHERH600_CTRLPORT      0x200   /* MEMC */
  96 
  97 #define ETHERH_CP_IE            1
  98 #define ETHERH_CP_IF            2
  99 #define ETHERH_CP_HEARTBEAT     2
 100 
 101 #define ETHERH_TX_START_PAGE    1
 102 #define ETHERH_STOP_PAGE        127
 103 
 104 /*
 105  * These came from CK/TEW
 106  */
 107 #define ETHERM_DATAPORT         0x200   /* MEMC */
 108 #define ETHERM_NS8390           0x800   /* MEMC */
 109 #define ETHERM_CTRLPORT         0x23c   /* MEMC */
 110 
 111 #define ETHERM_TX_START_PAGE    64
 112 #define ETHERM_STOP_PAGE        127
 113 
 114 /* ------------------------------------------------------------------------ */
 115 
 116 #define etherh_priv(dev) \
 117  ((struct etherh_priv *)(((char *)netdev_priv(dev)) + sizeof(struct ei_device)))
 118 
 119 static inline void etherh_set_ctrl(struct etherh_priv *eh, unsigned char mask)
 120 {
 121         unsigned char ctrl = eh->ctrl | mask;
 122         eh->ctrl = ctrl;
 123         writeb(ctrl, eh->ctrl_port);
 124 }
 125 
 126 static inline void etherh_clr_ctrl(struct etherh_priv *eh, unsigned char mask)
 127 {
 128         unsigned char ctrl = eh->ctrl & ~mask;
 129         eh->ctrl = ctrl;
 130         writeb(ctrl, eh->ctrl_port);
 131 }
 132 
 133 static inline unsigned int etherh_get_stat(struct etherh_priv *eh)
 134 {
 135         return readb(eh->ctrl_port);
 136 }
 137 
 138 
 139 
 140 
 141 static void etherh_irq_enable(ecard_t *ec, int irqnr)
 142 {
 143         struct etherh_priv *eh = ec->irq_data;
 144 
 145         etherh_set_ctrl(eh, ETHERH_CP_IE);
 146 }
 147 
 148 static void etherh_irq_disable(ecard_t *ec, int irqnr)
 149 {
 150         struct etherh_priv *eh = ec->irq_data;
 151 
 152         etherh_clr_ctrl(eh, ETHERH_CP_IE);
 153 }
 154 
 155 static expansioncard_ops_t etherh_ops = {
 156         .irqenable      = etherh_irq_enable,
 157         .irqdisable     = etherh_irq_disable,
 158 };
 159 
 160 
 161 
 162 
 163 static void
 164 etherh_setif(struct net_device *dev)
 165 {
 166         struct ei_device *ei_local = netdev_priv(dev);
 167         unsigned long flags;
 168         void __iomem *addr;
 169 
 170         local_irq_save(flags);
 171 
 172         /* set the interface type */
 173         switch (etherh_priv(dev)->id) {
 174         case PROD_I3_ETHERLAN600:
 175         case PROD_I3_ETHERLAN600A:
 176                 addr = (void __iomem *)dev->base_addr + EN0_RCNTHI;
 177 
 178                 switch (dev->if_port) {
 179                 case IF_PORT_10BASE2:
 180                         writeb((readb(addr) & 0xf8) | 1, addr);
 181                         break;
 182                 case IF_PORT_10BASET:
 183                         writeb((readb(addr) & 0xf8), addr);
 184                         break;
 185                 }
 186                 break;
 187 
 188         case PROD_I3_ETHERLAN500:
 189                 switch (dev->if_port) {
 190                 case IF_PORT_10BASE2:
 191                         etherh_clr_ctrl(etherh_priv(dev), ETHERH_CP_IF);
 192                         break;
 193 
 194                 case IF_PORT_10BASET:
 195                         etherh_set_ctrl(etherh_priv(dev), ETHERH_CP_IF);
 196                         break;
 197                 }
 198                 break;
 199 
 200         default:
 201                 break;
 202         }
 203 
 204         local_irq_restore(flags);
 205 }
 206 
 207 static int
 208 etherh_getifstat(struct net_device *dev)
 209 {
 210         struct ei_device *ei_local = netdev_priv(dev);
 211         void __iomem *addr;
 212         int stat = 0;
 213 
 214         switch (etherh_priv(dev)->id) {
 215         case PROD_I3_ETHERLAN600:
 216         case PROD_I3_ETHERLAN600A:
 217                 addr = (void __iomem *)dev->base_addr + EN0_RCNTHI;
 218                 switch (dev->if_port) {
 219                 case IF_PORT_10BASE2:
 220                         stat = 1;
 221                         break;
 222                 case IF_PORT_10BASET:
 223                         stat = readb(addr) & 4;
 224                         break;
 225                 }
 226                 break;
 227 
 228         case PROD_I3_ETHERLAN500:
 229                 switch (dev->if_port) {
 230                 case IF_PORT_10BASE2:
 231                         stat = 1;
 232                         break;
 233                 case IF_PORT_10BASET:
 234                         stat = etherh_get_stat(etherh_priv(dev)) & ETHERH_CP_HEARTBEAT;
 235                         break;
 236                 }
 237                 break;
 238 
 239         default:
 240                 stat = 0;
 241                 break;
 242         }
 243 
 244         return stat != 0;
 245 }
 246 
 247 /*
 248  * Configure the interface.  Note that we ignore the other
 249  * parts of ifmap, since its mostly meaningless for this driver.
 250  */
 251 static int etherh_set_config(struct net_device *dev, struct ifmap *map)
 252 {
 253         switch (map->port) {
 254         case IF_PORT_10BASE2:
 255         case IF_PORT_10BASET:
 256                 /*
 257                  * If the user explicitly sets the interface
 258                  * media type, turn off automedia detection.
 259                  */
 260                 dev->flags &= ~IFF_AUTOMEDIA;
 261                 dev->if_port = map->port;
 262                 break;
 263 
 264         default:
 265                 return -EINVAL;
 266         }
 267 
 268         etherh_setif(dev);
 269 
 270         return 0;
 271 }
 272 
 273 /*
 274  * Reset the 8390 (hard reset).  Note that we can't actually do this.
 275  */
 276 static void
 277 etherh_reset(struct net_device *dev)
 278 {
 279         struct ei_device *ei_local = netdev_priv(dev);
 280         void __iomem *addr = (void __iomem *)dev->base_addr;
 281 
 282         writeb(E8390_NODMA+E8390_PAGE0+E8390_STOP, addr);
 283 
 284         /*
 285          * See if we need to change the interface type.
 286          * Note that we use 'interface_num' as a flag
 287          * to indicate that we need to change the media.
 288          */
 289         if (dev->flags & IFF_AUTOMEDIA && ei_local->interface_num) {
 290                 ei_local->interface_num = 0;
 291 
 292                 if (dev->if_port == IF_PORT_10BASET)
 293                         dev->if_port = IF_PORT_10BASE2;
 294                 else
 295                         dev->if_port = IF_PORT_10BASET;
 296 
 297                 etherh_setif(dev);
 298         }
 299 }
 300 
 301 /*
 302  * Write a block of data out to the 8390
 303  */
 304 static void
 305 etherh_block_output (struct net_device *dev, int count, const unsigned char *buf, int start_page)
 306 {
 307         struct ei_device *ei_local = netdev_priv(dev);
 308         unsigned long dma_start;
 309         void __iomem *dma_base, *addr;
 310 
 311         if (ei_local->dmaing) {
 312                 netdev_err(dev, "DMAing conflict in etherh_block_input: "
 313                            " DMAstat %d irqlock %d\n",
 314                            ei_local->dmaing, ei_local->irqlock);
 315                 return;
 316         }
 317 
 318         /*
 319          * Make sure we have a round number of bytes if we're in word mode.
 320          */
 321         if (count & 1 && ei_local->word16)
 322                 count++;
 323 
 324         ei_local->dmaing = 1;
 325 
 326         addr = (void __iomem *)dev->base_addr;
 327         dma_base = etherh_priv(dev)->dma_base;
 328 
 329         count = (count + 1) & ~1;
 330         writeb (E8390_NODMA | E8390_PAGE0 | E8390_START, addr + E8390_CMD);
 331 
 332         writeb (0x42, addr + EN0_RCNTLO);
 333         writeb (0x00, addr + EN0_RCNTHI);
 334         writeb (0x42, addr + EN0_RSARLO);
 335         writeb (0x00, addr + EN0_RSARHI);
 336         writeb (E8390_RREAD | E8390_START, addr + E8390_CMD);
 337 
 338         udelay (1);
 339 
 340         writeb (ENISR_RDC, addr + EN0_ISR);
 341         writeb (count, addr + EN0_RCNTLO);
 342         writeb (count >> 8, addr + EN0_RCNTHI);
 343         writeb (0, addr + EN0_RSARLO);
 344         writeb (start_page, addr + EN0_RSARHI);
 345         writeb (E8390_RWRITE | E8390_START, addr + E8390_CMD);
 346 
 347         if (ei_local->word16)
 348                 writesw (dma_base, buf, count >> 1);
 349         else
 350                 writesb (dma_base, buf, count);
 351 
 352         dma_start = jiffies;
 353 
 354         while ((readb (addr + EN0_ISR) & ENISR_RDC) == 0)
 355                 if (time_after(jiffies, dma_start + 2*HZ/100)) { /* 20ms */
 356                         netdev_warn(dev, "timeout waiting for TX RDC\n");
 357                         etherh_reset (dev);
 358                         __NS8390_init (dev, 1);
 359                         break;
 360                 }
 361 
 362         writeb (ENISR_RDC, addr + EN0_ISR);
 363         ei_local->dmaing = 0;
 364 }
 365 
 366 /*
 367  * Read a block of data from the 8390
 368  */
 369 static void
 370 etherh_block_input (struct net_device *dev, int count, struct sk_buff *skb, int ring_offset)
 371 {
 372         struct ei_device *ei_local = netdev_priv(dev);
 373         unsigned char *buf;
 374         void __iomem *dma_base, *addr;
 375 
 376         if (ei_local->dmaing) {
 377                 netdev_err(dev, "DMAing conflict in etherh_block_input: "
 378                            " DMAstat %d irqlock %d\n",
 379                            ei_local->dmaing, ei_local->irqlock);
 380                 return;
 381         }
 382 
 383         ei_local->dmaing = 1;
 384 
 385         addr = (void __iomem *)dev->base_addr;
 386         dma_base = etherh_priv(dev)->dma_base;
 387 
 388         buf = skb->data;
 389         writeb (E8390_NODMA | E8390_PAGE0 | E8390_START, addr + E8390_CMD);
 390         writeb (count, addr + EN0_RCNTLO);
 391         writeb (count >> 8, addr + EN0_RCNTHI);
 392         writeb (ring_offset, addr + EN0_RSARLO);
 393         writeb (ring_offset >> 8, addr + EN0_RSARHI);
 394         writeb (E8390_RREAD | E8390_START, addr + E8390_CMD);
 395 
 396         if (ei_local->word16) {
 397                 readsw (dma_base, buf, count >> 1);
 398                 if (count & 1)
 399                         buf[count - 1] = readb (dma_base);
 400         } else
 401                 readsb (dma_base, buf, count);
 402 
 403         writeb (ENISR_RDC, addr + EN0_ISR);
 404         ei_local->dmaing = 0;
 405 }
 406 
 407 /*
 408  * Read a header from the 8390
 409  */
 410 static void
 411 etherh_get_header (struct net_device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
 412 {
 413         struct ei_device *ei_local = netdev_priv(dev);
 414         void __iomem *dma_base, *addr;
 415 
 416         if (ei_local->dmaing) {
 417                 netdev_err(dev, "DMAing conflict in etherh_get_header: "
 418                            " DMAstat %d irqlock %d\n",
 419                            ei_local->dmaing, ei_local->irqlock);
 420                 return;
 421         }
 422 
 423         ei_local->dmaing = 1;
 424 
 425         addr = (void __iomem *)dev->base_addr;
 426         dma_base = etherh_priv(dev)->dma_base;
 427 
 428         writeb (E8390_NODMA | E8390_PAGE0 | E8390_START, addr + E8390_CMD);
 429         writeb (sizeof (*hdr), addr + EN0_RCNTLO);
 430         writeb (0, addr + EN0_RCNTHI);
 431         writeb (0, addr + EN0_RSARLO);
 432         writeb (ring_page, addr + EN0_RSARHI);
 433         writeb (E8390_RREAD | E8390_START, addr + E8390_CMD);
 434 
 435         if (ei_local->word16)
 436                 readsw (dma_base, hdr, sizeof (*hdr) >> 1);
 437         else
 438                 readsb (dma_base, hdr, sizeof (*hdr));
 439 
 440         writeb (ENISR_RDC, addr + EN0_ISR);
 441         ei_local->dmaing = 0;
 442 }
 443 
 444 /*
 445  * Open/initialize the board.  This is called (in the current kernel)
 446  * sometime after booting when the 'ifconfig' program is run.
 447  *
 448  * This routine should set everything up anew at each open, even
 449  * registers that "should" only need to be set once at boot, so that
 450  * there is non-reboot way to recover if something goes wrong.
 451  */
 452 static int
 453 etherh_open(struct net_device *dev)
 454 {
 455         struct ei_device *ei_local = netdev_priv(dev);
 456 
 457         if (request_irq(dev->irq, __ei_interrupt, 0, dev->name, dev))
 458                 return -EAGAIN;
 459 
 460         /*
 461          * Make sure that we aren't going to change the
 462          * media type on the next reset - we are about to
 463          * do automedia manually now.
 464          */
 465         ei_local->interface_num = 0;
 466 
 467         /*
 468          * If we are doing automedia detection, do it now.
 469          * This is more reliable than the 8390's detection.
 470          */
 471         if (dev->flags & IFF_AUTOMEDIA) {
 472                 dev->if_port = IF_PORT_10BASET;
 473                 etherh_setif(dev);
 474                 mdelay(1);
 475                 if (!etherh_getifstat(dev)) {
 476                         dev->if_port = IF_PORT_10BASE2;
 477                         etherh_setif(dev);
 478                 }
 479         } else
 480                 etherh_setif(dev);
 481 
 482         etherh_reset(dev);
 483         __ei_open(dev);
 484 
 485         return 0;
 486 }
 487 
 488 /*
 489  * The inverse routine to etherh_open().
 490  */
 491 static int
 492 etherh_close(struct net_device *dev)
 493 {
 494         __ei_close (dev);
 495         free_irq (dev->irq, dev);
 496         return 0;
 497 }
 498 
 499 /*
 500  * Read the ethernet address string from the on board rom.
 501  * This is an ascii string...
 502  */
 503 static int etherh_addr(char *addr, struct expansion_card *ec)
 504 {
 505         struct in_chunk_dir cd;
 506         char *s;
 507         
 508         if (!ecard_readchunk(&cd, ec, 0xf5, 0)) {
 509                 printk(KERN_ERR "%s: unable to read module description string\n",
 510                        dev_name(&ec->dev));
 511                 goto no_addr;
 512         }
 513 
 514         s = strchr(cd.d.string, '(');
 515         if (s) {
 516                 int i;
 517 
 518                 for (i = 0; i < 6; i++) {
 519                         addr[i] = simple_strtoul(s + 1, &s, 0x10);
 520                         if (*s != (i == 5? ')' : ':'))
 521                                 break;
 522                 }
 523 
 524                 if (i == 6)
 525                         return 0;
 526         }
 527 
 528         printk(KERN_ERR "%s: unable to parse MAC address: %s\n",
 529                dev_name(&ec->dev), cd.d.string);
 530 
 531  no_addr:
 532         return -ENODEV;
 533 }
 534 
 535 /*
 536  * Create an ethernet address from the system serial number.
 537  */
 538 static int __init etherm_addr(char *addr)
 539 {
 540         unsigned int serial;
 541 
 542         if (system_serial_low == 0 && system_serial_high == 0)
 543                 return -ENODEV;
 544 
 545         serial = system_serial_low | system_serial_high;
 546 
 547         addr[0] = 0;
 548         addr[1] = 0;
 549         addr[2] = 0xa4;
 550         addr[3] = 0x10 + (serial >> 24);
 551         addr[4] = serial >> 16;
 552         addr[5] = serial >> 8;
 553         return 0;
 554 }
 555 
 556 static void etherh_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 557 {
 558         strlcpy(info->driver, DRV_NAME, sizeof(info->driver));
 559         strlcpy(info->version, DRV_VERSION, sizeof(info->version));
 560         strlcpy(info->bus_info, dev_name(dev->dev.parent),
 561                 sizeof(info->bus_info));
 562 }
 563 
 564 static int etherh_get_link_ksettings(struct net_device *dev,
 565                                      struct ethtool_link_ksettings *cmd)
 566 {
 567         ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
 568                                                 etherh_priv(dev)->supported);
 569         cmd->base.speed = SPEED_10;
 570         cmd->base.duplex = DUPLEX_HALF;
 571         cmd->base.port = dev->if_port == IF_PORT_10BASET ? PORT_TP : PORT_BNC;
 572         cmd->base.autoneg = (dev->flags & IFF_AUTOMEDIA ? AUTONEG_ENABLE :
 573                                                           AUTONEG_DISABLE);
 574         return 0;
 575 }
 576 
 577 static int etherh_set_link_ksettings(struct net_device *dev,
 578                                      const struct ethtool_link_ksettings *cmd)
 579 {
 580         switch (cmd->base.autoneg) {
 581         case AUTONEG_ENABLE:
 582                 dev->flags |= IFF_AUTOMEDIA;
 583                 break;
 584 
 585         case AUTONEG_DISABLE:
 586                 switch (cmd->base.port) {
 587                 case PORT_TP:
 588                         dev->if_port = IF_PORT_10BASET;
 589                         break;
 590 
 591                 case PORT_BNC:
 592                         dev->if_port = IF_PORT_10BASE2;
 593                         break;
 594 
 595                 default:
 596                         return -EINVAL;
 597                 }
 598                 dev->flags &= ~IFF_AUTOMEDIA;
 599                 break;
 600 
 601         default:
 602                 return -EINVAL;
 603         }
 604 
 605         etherh_setif(dev);
 606 
 607         return 0;
 608 }
 609 
 610 static u32 etherh_get_msglevel(struct net_device *dev)
 611 {
 612         struct ei_device *ei_local = netdev_priv(dev);
 613 
 614         return ei_local->msg_enable;
 615 }
 616 
 617 static void etherh_set_msglevel(struct net_device *dev, u32 v)
 618 {
 619         struct ei_device *ei_local = netdev_priv(dev);
 620 
 621         ei_local->msg_enable = v;
 622 }
 623 
 624 static const struct ethtool_ops etherh_ethtool_ops = {
 625         .get_drvinfo            = etherh_get_drvinfo,
 626         .get_ts_info            = ethtool_op_get_ts_info,
 627         .get_msglevel           = etherh_get_msglevel,
 628         .set_msglevel           = etherh_set_msglevel,
 629         .get_link_ksettings     = etherh_get_link_ksettings,
 630         .set_link_ksettings     = etherh_set_link_ksettings,
 631 };
 632 
 633 static const struct net_device_ops etherh_netdev_ops = {
 634         .ndo_open               = etherh_open,
 635         .ndo_stop               = etherh_close,
 636         .ndo_set_config         = etherh_set_config,
 637         .ndo_start_xmit         = __ei_start_xmit,
 638         .ndo_tx_timeout         = __ei_tx_timeout,
 639         .ndo_get_stats          = __ei_get_stats,
 640         .ndo_set_rx_mode        = __ei_set_multicast_list,
 641         .ndo_validate_addr      = eth_validate_addr,
 642         .ndo_set_mac_address    = eth_mac_addr,
 643 #ifdef CONFIG_NET_POLL_CONTROLLER
 644         .ndo_poll_controller    = __ei_poll,
 645 #endif
 646 };
 647 
 648 static u32 etherh_regoffsets[16];
 649 static u32 etherm_regoffsets[16];
 650 
 651 static int
 652 etherh_probe(struct expansion_card *ec, const struct ecard_id *id)
 653 {
 654         const struct etherh_data *data = id->data;
 655         struct ei_device *ei_local;
 656         struct net_device *dev;
 657         struct etherh_priv *eh;
 658         int ret;
 659 
 660         ret = ecard_request_resources(ec);
 661         if (ret)
 662                 goto out;
 663 
 664         dev = ____alloc_ei_netdev(sizeof(struct etherh_priv));
 665         if (!dev) {
 666                 ret = -ENOMEM;
 667                 goto release;
 668         }
 669 
 670         SET_NETDEV_DEV(dev, &ec->dev);
 671 
 672         dev->netdev_ops         = &etherh_netdev_ops;
 673         dev->irq                = ec->irq;
 674         dev->ethtool_ops        = &etherh_ethtool_ops;
 675 
 676         if (data->supported & SUPPORTED_Autoneg)
 677                 dev->flags |= IFF_AUTOMEDIA;
 678         if (data->supported & SUPPORTED_TP) {
 679                 dev->flags |= IFF_PORTSEL;
 680                 dev->if_port = IF_PORT_10BASET;
 681         } else if (data->supported & SUPPORTED_BNC) {
 682                 dev->flags |= IFF_PORTSEL;
 683                 dev->if_port = IF_PORT_10BASE2;
 684         } else
 685                 dev->if_port = IF_PORT_UNKNOWN;
 686 
 687         eh = etherh_priv(dev);
 688         eh->supported           = data->supported;
 689         eh->ctrl                = 0;
 690         eh->id                  = ec->cid.product;
 691         eh->memc                = ecardm_iomap(ec, ECARD_RES_MEMC, 0, PAGE_SIZE);
 692         if (!eh->memc) {
 693                 ret = -ENOMEM;
 694                 goto free;
 695         }
 696 
 697         eh->ctrl_port = eh->memc;
 698         if (data->ctrl_ioc) {
 699                 eh->ioc_fast = ecardm_iomap(ec, ECARD_RES_IOCFAST, 0, PAGE_SIZE);
 700                 if (!eh->ioc_fast) {
 701                         ret = -ENOMEM;
 702                         goto free;
 703                 }
 704                 eh->ctrl_port = eh->ioc_fast;
 705         }
 706 
 707         dev->base_addr = (unsigned long)eh->memc + data->ns8390_offset;
 708         eh->dma_base = eh->memc + data->dataport_offset;
 709         eh->ctrl_port += data->ctrlport_offset;
 710 
 711         /*
 712          * IRQ and control port handling - only for non-NIC slot cards.
 713          */
 714         if (ec->slot_no != 8) {
 715                 ecard_setirq(ec, &etherh_ops, eh);
 716         } else {
 717                 /*
 718                  * If we're in the NIC slot, make sure the IRQ is enabled
 719                  */
 720                 etherh_set_ctrl(eh, ETHERH_CP_IE);
 721         }
 722 
 723         ei_local = netdev_priv(dev);
 724         spin_lock_init(&ei_local->page_lock);
 725 
 726         if (ec->cid.product == PROD_ANT_ETHERM) {
 727                 etherm_addr(dev->dev_addr);
 728                 ei_local->reg_offset = etherm_regoffsets;
 729         } else {
 730                 etherh_addr(dev->dev_addr, ec);
 731                 ei_local->reg_offset = etherh_regoffsets;
 732         }
 733 
 734         ei_local->name          = dev->name;
 735         ei_local->word16        = 1;
 736         ei_local->tx_start_page = data->tx_start_page;
 737         ei_local->rx_start_page = ei_local->tx_start_page + TX_PAGES;
 738         ei_local->stop_page     = data->stop_page;
 739         ei_local->reset_8390    = etherh_reset;
 740         ei_local->block_input   = etherh_block_input;
 741         ei_local->block_output  = etherh_block_output;
 742         ei_local->get_8390_hdr  = etherh_get_header;
 743         ei_local->interface_num = 0;
 744 
 745         etherh_reset(dev);
 746         __NS8390_init(dev, 0);
 747 
 748         ret = register_netdev(dev);
 749         if (ret)
 750                 goto free;
 751 
 752         netdev_info(dev, "%s in slot %d, %pM\n",
 753                     data->name, ec->slot_no, dev->dev_addr);
 754 
 755         ecard_set_drvdata(ec, dev);
 756 
 757         return 0;
 758 
 759  free:
 760         free_netdev(dev);
 761  release:
 762         ecard_release_resources(ec);
 763  out:
 764         return ret;
 765 }
 766 
 767 static void etherh_remove(struct expansion_card *ec)
 768 {
 769         struct net_device *dev = ecard_get_drvdata(ec);
 770 
 771         ecard_set_drvdata(ec, NULL);
 772 
 773         unregister_netdev(dev);
 774 
 775         free_netdev(dev);
 776 
 777         ecard_release_resources(ec);
 778 }
 779 
 780 static struct etherh_data etherm_data = {
 781         .ns8390_offset          = ETHERM_NS8390,
 782         .dataport_offset        = ETHERM_NS8390 + ETHERM_DATAPORT,
 783         .ctrlport_offset        = ETHERM_NS8390 + ETHERM_CTRLPORT,
 784         .name                   = "ANT EtherM",
 785         .supported              = SUPPORTED_10baseT_Half,
 786         .tx_start_page          = ETHERM_TX_START_PAGE,
 787         .stop_page              = ETHERM_STOP_PAGE,
 788 };
 789 
 790 static struct etherh_data etherlan500_data = {
 791         .ns8390_offset          = ETHERH500_NS8390,
 792         .dataport_offset        = ETHERH500_NS8390 + ETHERH500_DATAPORT,
 793         .ctrlport_offset        = ETHERH500_CTRLPORT,
 794         .ctrl_ioc               = 1,
 795         .name                   = "i3 EtherH 500",
 796         .supported              = SUPPORTED_10baseT_Half,
 797         .tx_start_page          = ETHERH_TX_START_PAGE,
 798         .stop_page              = ETHERH_STOP_PAGE,
 799 };
 800 
 801 static struct etherh_data etherlan600_data = {
 802         .ns8390_offset          = ETHERH600_NS8390,
 803         .dataport_offset        = ETHERH600_NS8390 + ETHERH600_DATAPORT,
 804         .ctrlport_offset        = ETHERH600_NS8390 + ETHERH600_CTRLPORT,
 805         .name                   = "i3 EtherH 600",
 806         .supported              = SUPPORTED_10baseT_Half | SUPPORTED_TP | SUPPORTED_BNC | SUPPORTED_Autoneg,
 807         .tx_start_page          = ETHERH_TX_START_PAGE,
 808         .stop_page              = ETHERH_STOP_PAGE,
 809 };
 810 
 811 static struct etherh_data etherlan600a_data = {
 812         .ns8390_offset          = ETHERH600_NS8390,
 813         .dataport_offset        = ETHERH600_NS8390 + ETHERH600_DATAPORT,
 814         .ctrlport_offset        = ETHERH600_NS8390 + ETHERH600_CTRLPORT,
 815         .name                   = "i3 EtherH 600A",
 816         .supported              = SUPPORTED_10baseT_Half | SUPPORTED_TP | SUPPORTED_BNC | SUPPORTED_Autoneg,
 817         .tx_start_page          = ETHERH_TX_START_PAGE,
 818         .stop_page              = ETHERH_STOP_PAGE,
 819 };
 820 
 821 static const struct ecard_id etherh_ids[] = {
 822         { MANU_ANT, PROD_ANT_ETHERM,      &etherm_data       },
 823         { MANU_I3,  PROD_I3_ETHERLAN500,  &etherlan500_data  },
 824         { MANU_I3,  PROD_I3_ETHERLAN600,  &etherlan600_data  },
 825         { MANU_I3,  PROD_I3_ETHERLAN600A, &etherlan600a_data },
 826         { 0xffff,   0xffff }
 827 };
 828 
 829 static struct ecard_driver etherh_driver = {
 830         .probe          = etherh_probe,
 831         .remove         = etherh_remove,
 832         .id_table       = etherh_ids,
 833         .drv = {
 834                 .name   = DRV_NAME,
 835         },
 836 };
 837 
 838 static int __init etherh_init(void)
 839 {
 840         int i;
 841 
 842         for (i = 0; i < 16; i++) {
 843                 etherh_regoffsets[i] = i << 2;
 844                 etherm_regoffsets[i] = i << 5;
 845         }
 846 
 847         return ecard_register_driver(&etherh_driver);
 848 }
 849 
 850 static void __exit etherh_exit(void)
 851 {
 852         ecard_remove_driver(&etherh_driver);
 853 }
 854 
 855 module_init(etherh_init);
 856 module_exit(etherh_exit);

/* [<][>][^][v][top][bottom][index][help] */