]> err.no Git - linux-2.6/blob - drivers/net/pcmcia/smc91c92_cs.c
[PATCH] pcmcia: remove manf_id and card_id indirection
[linux-2.6] / drivers / net / pcmcia / smc91c92_cs.c
1 /*======================================================================
2
3     A PCMCIA ethernet driver for SMC91c92-based cards.
4
5     This driver supports Megahertz PCMCIA ethernet cards; and
6     Megahertz, Motorola, Ositech, and Psion Dacom ethernet/modem
7     multifunction cards.
8
9     Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net
10
11     smc91c92_cs.c 1.122 2002/10/25 06:26:39
12
13     This driver contains code written by Donald Becker
14     (becker@scyld.com), Rowan Hughes (x-csrdh@jcu.edu.au),
15     David Hinds (dahinds@users.sourceforge.net), and Erik Stahlman
16     (erik@vt.edu).  Donald wrote the SMC 91c92 code using parts of
17     Erik's SMC 91c94 driver.  Rowan wrote a similar driver, and I've
18     incorporated some parts of his driver here.  I (Dave) wrote most
19     of the PCMCIA glue code, and the Ositech support code.  Kelly
20     Stephens (kstephen@holli.com) added support for the Motorola
21     Mariner, with help from Allen Brost.
22
23     This software may be used and distributed according to the terms of
24     the GNU General Public License, incorporated herein by reference.
25
26 ======================================================================*/
27
28 #include <linux/module.h>
29 #include <linux/kernel.h>
30 #include <linux/init.h>
31 #include <linux/slab.h>
32 #include <linux/string.h>
33 #include <linux/timer.h>
34 #include <linux/interrupt.h>
35 #include <linux/delay.h>
36 #include <linux/crc32.h>
37 #include <linux/netdevice.h>
38 #include <linux/etherdevice.h>
39 #include <linux/skbuff.h>
40 #include <linux/if_arp.h>
41 #include <linux/ioport.h>
42 #include <linux/ethtool.h>
43 #include <linux/mii.h>
44 #include <linux/jiffies.h>
45
46 #include <pcmcia/cs_types.h>
47 #include <pcmcia/cs.h>
48 #include <pcmcia/cistpl.h>
49 #include <pcmcia/cisreg.h>
50 #include <pcmcia/ciscode.h>
51 #include <pcmcia/ds.h>
52 #include <pcmcia/ss.h>
53
54 #include <asm/io.h>
55 #include <asm/system.h>
56 #include <asm/uaccess.h>
57
58 /* Ositech Seven of Diamonds firmware */
59 #include "ositech.h"
60
61 /*====================================================================*/
62
63 static const char *if_names[] = { "auto", "10baseT", "10base2"};
64
65 /* Module parameters */
66
67 MODULE_DESCRIPTION("SMC 91c92 series PCMCIA ethernet driver");
68 MODULE_LICENSE("GPL");
69
70 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
71
72 /*
73   Transceiver/media type.
74    0 = auto
75    1 = 10baseT (and autoselect if #define AUTOSELECT),
76    2 = AUI/10base2,
77 */
78 INT_MODULE_PARM(if_port, 0);
79
80 #ifdef PCMCIA_DEBUG
81 INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
82 static const char *version =
83 "smc91c92_cs.c 1.123 2006/11/09 Donald Becker, becker@scyld.com.\n";
84 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
85 #else
86 #define DEBUG(n, args...)
87 #endif
88
89 #define DRV_NAME        "smc91c92_cs"
90 #define DRV_VERSION     "1.123"
91
92 /*====================================================================*/
93
94 /* Operational parameter that usually are not changed. */
95
96 /* Time in jiffies before concluding Tx hung */
97 #define TX_TIMEOUT              ((400*HZ)/1000)
98
99 /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
100 #define INTR_WORK               4
101
102 /* Times to check the check the chip before concluding that it doesn't
103    currently have room for another Tx packet. */
104 #define MEMORY_WAIT_TIME        8
105
106 struct smc_private {
107         struct pcmcia_device    *p_dev;
108     spinlock_t                  lock;
109     u_short                     manfid;
110     u_short                     cardid;
111     struct net_device_stats     stats;
112     dev_node_t                  node;
113     struct sk_buff              *saved_skb;
114     int                         packets_waiting;
115     void                        __iomem *base;
116     u_short                     cfg;
117     struct timer_list           media;
118     int                         watchdog, tx_err;
119     u_short                     media_status;
120     u_short                     fast_poll;
121     u_short                     link_status;
122     struct mii_if_info          mii_if;
123     int                         duplex;
124     int                         rx_ovrn;
125 };
126
127 struct smc_cfg_mem {
128     tuple_t tuple;
129     cisparse_t parse;
130     u_char buf[255];
131 };
132
133 /* Special definitions for Megahertz multifunction cards */
134 #define MEGAHERTZ_ISR           0x0380
135
136 /* Special function registers for Motorola Mariner */
137 #define MOT_LAN                 0x0000
138 #define MOT_UART                0x0020
139 #define MOT_EEPROM              0x20
140
141 #define MOT_NORMAL \
142 (COR_LEVEL_REQ | COR_FUNC_ENA | COR_ADDR_DECODE | COR_IREQ_ENA)
143
144 /* Special function registers for Ositech cards */
145 #define OSITECH_AUI_CTL         0x0c
146 #define OSITECH_PWRDOWN         0x0d
147 #define OSITECH_RESET           0x0e
148 #define OSITECH_ISR             0x0f
149 #define OSITECH_AUI_PWR         0x0c
150 #define OSITECH_RESET_ISR       0x0e
151
152 #define OSI_AUI_PWR             0x40
153 #define OSI_LAN_PWRDOWN         0x02
154 #define OSI_MODEM_PWRDOWN       0x01
155 #define OSI_LAN_RESET           0x02
156 #define OSI_MODEM_RESET         0x01
157
158 /* Symbolic constants for the SMC91c9* series chips, from Erik Stahlman. */
159 #define BANK_SELECT             14              /* Window select register. */
160 #define SMC_SELECT_BANK(x)  { outw(x, ioaddr + BANK_SELECT); }
161
162 /* Bank 0 registers. */
163 #define TCR             0       /* transmit control register */
164 #define  TCR_CLEAR      0       /* do NOTHING */
165 #define  TCR_ENABLE     0x0001  /* if this is 1, we can transmit */
166 #define  TCR_PAD_EN     0x0080  /* pads short packets to 64 bytes */
167 #define  TCR_MONCSN     0x0400  /* Monitor Carrier. */
168 #define  TCR_FDUPLX     0x0800  /* Full duplex mode. */
169 #define  TCR_NORMAL TCR_ENABLE | TCR_PAD_EN
170
171 #define EPH             2       /* Ethernet Protocol Handler report. */
172 #define  EPH_TX_SUC     0x0001
173 #define  EPH_SNGLCOL    0x0002
174 #define  EPH_MULCOL     0x0004
175 #define  EPH_LTX_MULT   0x0008
176 #define  EPH_16COL      0x0010
177 #define  EPH_SQET       0x0020
178 #define  EPH_LTX_BRD    0x0040
179 #define  EPH_TX_DEFR    0x0080
180 #define  EPH_LAT_COL    0x0200
181 #define  EPH_LOST_CAR   0x0400
182 #define  EPH_EXC_DEF    0x0800
183 #define  EPH_CTR_ROL    0x1000
184 #define  EPH_RX_OVRN    0x2000
185 #define  EPH_LINK_OK    0x4000
186 #define  EPH_TX_UNRN    0x8000
187 #define MEMINFO         8       /* Memory Information Register */
188 #define MEMCFG          10      /* Memory Configuration Register */
189
190 /* Bank 1 registers. */
191 #define CONFIG                  0
192 #define  CFG_MII_SELECT         0x8000  /* 91C100 only */
193 #define  CFG_NO_WAIT            0x1000
194 #define  CFG_FULL_STEP          0x0400
195 #define  CFG_SET_SQLCH          0x0200
196 #define  CFG_AUI_SELECT         0x0100
197 #define  CFG_16BIT              0x0080
198 #define  CFG_DIS_LINK           0x0040
199 #define  CFG_STATIC             0x0030
200 #define  CFG_IRQ_SEL_1          0x0004
201 #define  CFG_IRQ_SEL_0          0x0002
202 #define BASE_ADDR               2
203 #define ADDR0                   4
204 #define GENERAL                 10
205 #define CONTROL                 12
206 #define  CTL_STORE              0x0001
207 #define  CTL_RELOAD             0x0002
208 #define  CTL_EE_SELECT          0x0004
209 #define  CTL_TE_ENABLE          0x0020
210 #define  CTL_CR_ENABLE          0x0040
211 #define  CTL_LE_ENABLE          0x0080
212 #define  CTL_AUTO_RELEASE       0x0800
213 #define  CTL_POWERDOWN          0x2000
214
215 /* Bank 2 registers. */
216 #define MMU_CMD         0
217 #define  MC_ALLOC       0x20    /* or with number of 256 byte packets */
218 #define  MC_RESET       0x40
219 #define  MC_RELEASE     0x80    /* remove and release the current rx packet */
220 #define  MC_FREEPKT     0xA0    /* Release packet in PNR register */
221 #define  MC_ENQUEUE     0xC0    /* Enqueue the packet for transmit */
222 #define PNR_ARR         2
223 #define FIFO_PORTS      4
224 #define  FP_RXEMPTY     0x8000
225 #define POINTER         6
226 #define  PTR_AUTO_INC   0x0040
227 #define  PTR_READ       0x2000
228 #define  PTR_AUTOINC    0x4000
229 #define  PTR_RCV        0x8000
230 #define DATA_1          8
231 #define INTERRUPT       12
232 #define  IM_RCV_INT             0x1
233 #define  IM_TX_INT              0x2
234 #define  IM_TX_EMPTY_INT        0x4
235 #define  IM_ALLOC_INT           0x8
236 #define  IM_RX_OVRN_INT         0x10
237 #define  IM_EPH_INT             0x20
238
239 #define RCR             4
240 enum RxCfg { RxAllMulti = 0x0004, RxPromisc = 0x0002,
241              RxEnable = 0x0100, RxStripCRC = 0x0200};
242 #define  RCR_SOFTRESET  0x8000  /* resets the chip */
243 #define  RCR_STRIP_CRC  0x200   /* strips CRC */
244 #define  RCR_ENABLE     0x100   /* IFF this is set, we can receive packets */
245 #define  RCR_ALMUL      0x4     /* receive all multicast packets */
246 #define  RCR_PROMISC    0x2     /* enable promiscuous mode */
247
248 /* the normal settings for the RCR register : */
249 #define  RCR_NORMAL     (RCR_STRIP_CRC | RCR_ENABLE)
250 #define  RCR_CLEAR      0x0             /* set it to a base state */
251 #define COUNTER         6
252
253 /* BANK 3 -- not the same values as in smc9194! */
254 #define MULTICAST0      0
255 #define MULTICAST2      2
256 #define MULTICAST4      4
257 #define MULTICAST6      6
258 #define MGMT            8
259 #define REVISION        0x0a
260
261 /* Transmit status bits. */
262 #define TS_SUCCESS 0x0001
263 #define TS_16COL   0x0010
264 #define TS_LATCOL  0x0200
265 #define TS_LOSTCAR 0x0400
266
267 /* Receive status bits. */
268 #define RS_ALGNERR      0x8000
269 #define RS_BADCRC       0x2000
270 #define RS_ODDFRAME     0x1000
271 #define RS_TOOLONG      0x0800
272 #define RS_TOOSHORT     0x0400
273 #define RS_MULTICAST    0x0001
274 #define RS_ERRORS       (RS_ALGNERR | RS_BADCRC | RS_TOOLONG | RS_TOOSHORT)
275
276 #define set_bits(v, p) outw(inw(p)|(v), (p))
277 #define mask_bits(v, p) outw(inw(p)&(v), (p))
278
279 /*====================================================================*/
280
281 static void smc91c92_detach(struct pcmcia_device *p_dev);
282 static int smc91c92_config(struct pcmcia_device *link);
283 static void smc91c92_release(struct pcmcia_device *link);
284
285 static int smc_open(struct net_device *dev);
286 static int smc_close(struct net_device *dev);
287 static int smc_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
288 static void smc_tx_timeout(struct net_device *dev);
289 static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev);
290 static irqreturn_t smc_interrupt(int irq, void *dev_id);
291 static void smc_rx(struct net_device *dev);
292 static struct net_device_stats *smc_get_stats(struct net_device *dev);
293 static void set_rx_mode(struct net_device *dev);
294 static int s9k_config(struct net_device *dev, struct ifmap *map);
295 static void smc_set_xcvr(struct net_device *dev, int if_port);
296 static void smc_reset(struct net_device *dev);
297 static void media_check(u_long arg);
298 static void mdio_sync(kio_addr_t addr);
299 static int mdio_read(struct net_device *dev, int phy_id, int loc);
300 static void mdio_write(struct net_device *dev, int phy_id, int loc, int value);
301 static int smc_link_ok(struct net_device *dev);
302 static const struct ethtool_ops ethtool_ops;
303
304 /*======================================================================
305
306   smc91c92_attach() creates an "instance" of the driver, allocating
307   local data structures for one device.  The device is registered
308   with Card Services.
309
310 ======================================================================*/
311
312 static int smc91c92_probe(struct pcmcia_device *link)
313 {
314     struct smc_private *smc;
315     struct net_device *dev;
316
317     DEBUG(0, "smc91c92_attach()\n");
318
319     /* Create new ethernet device */
320     dev = alloc_etherdev(sizeof(struct smc_private));
321     if (!dev)
322         return -ENOMEM;
323     smc = netdev_priv(dev);
324     smc->p_dev = link;
325     link->priv = dev;
326
327     spin_lock_init(&smc->lock);
328     link->io.NumPorts1 = 16;
329     link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
330     link->io.IOAddrLines = 4;
331     link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
332     link->irq.IRQInfo1 = IRQ_LEVEL_ID;
333     link->irq.Handler = &smc_interrupt;
334     link->irq.Instance = dev;
335     link->conf.Attributes = CONF_ENABLE_IRQ;
336     link->conf.IntType = INT_MEMORY_AND_IO;
337
338     /* The SMC91c92-specific entries in the device structure. */
339     SET_MODULE_OWNER(dev);
340     dev->hard_start_xmit = &smc_start_xmit;
341     dev->get_stats = &smc_get_stats;
342     dev->set_config = &s9k_config;
343     dev->set_multicast_list = &set_rx_mode;
344     dev->open = &smc_open;
345     dev->stop = &smc_close;
346     dev->do_ioctl = &smc_ioctl;
347     SET_ETHTOOL_OPS(dev, &ethtool_ops);
348 #ifdef HAVE_TX_TIMEOUT
349     dev->tx_timeout = smc_tx_timeout;
350     dev->watchdog_timeo = TX_TIMEOUT;
351 #endif
352
353     smc->mii_if.dev = dev;
354     smc->mii_if.mdio_read = mdio_read;
355     smc->mii_if.mdio_write = mdio_write;
356     smc->mii_if.phy_id_mask = 0x1f;
357     smc->mii_if.reg_num_mask = 0x1f;
358
359     return smc91c92_config(link);
360 } /* smc91c92_attach */
361
362 /*======================================================================
363
364     This deletes a driver "instance".  The device is de-registered
365     with Card Services.  If it has been released, all local data
366     structures are freed.  Otherwise, the structures will be freed
367     when the device is released.
368
369 ======================================================================*/
370
371 static void smc91c92_detach(struct pcmcia_device *link)
372 {
373     struct net_device *dev = link->priv;
374
375     DEBUG(0, "smc91c92_detach(0x%p)\n", link);
376
377     if (link->dev_node)
378         unregister_netdev(dev);
379
380     smc91c92_release(link);
381
382     free_netdev(dev);
383 } /* smc91c92_detach */
384
385 /*====================================================================*/
386
387 static int cvt_ascii_address(struct net_device *dev, char *s)
388 {
389     int i, j, da, c;
390
391     if (strlen(s) != 12)
392         return -1;
393     for (i = 0; i < 6; i++) {
394         da = 0;
395         for (j = 0; j < 2; j++) {
396             c = *s++;
397             da <<= 4;
398             da += ((c >= '0') && (c <= '9')) ?
399                 (c - '0') : ((c & 0x0f) + 9);
400         }
401         dev->dev_addr[i] = da;
402     }
403     return 0;
404 }
405
406 /*====================================================================*/
407
408 static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple,
409                 cisparse_t *parse)
410 {
411         int i;
412
413         if ((i = pcmcia_get_first_tuple(handle, tuple)) != CS_SUCCESS ||
414                         (i = pcmcia_get_tuple_data(handle, tuple)) != CS_SUCCESS)
415                 return i;
416         return pcmcia_parse_tuple(handle, tuple, parse);
417 }
418
419 static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple,
420                 cisparse_t *parse)
421 {
422         int i;
423
424         if ((i = pcmcia_get_next_tuple(handle, tuple)) != CS_SUCCESS ||
425                         (i = pcmcia_get_tuple_data(handle, tuple)) != CS_SUCCESS)
426                 return i;
427         return pcmcia_parse_tuple(handle, tuple, parse);
428 }
429
430 /*======================================================================
431
432     Configuration stuff for Megahertz cards
433
434     mhz_3288_power() is used to power up a 3288's ethernet chip.
435     mhz_mfc_config() handles socket setup for multifunction (1144
436     and 3288) cards.  mhz_setup() gets a card's hardware ethernet
437     address.
438
439 ======================================================================*/
440
441 static int mhz_3288_power(struct pcmcia_device *link)
442 {
443     struct net_device *dev = link->priv;
444     struct smc_private *smc = netdev_priv(dev);
445     u_char tmp;
446
447     /* Read the ISR twice... */
448     readb(smc->base+MEGAHERTZ_ISR);
449     udelay(5);
450     readb(smc->base+MEGAHERTZ_ISR);
451
452     /* Pause 200ms... */
453     mdelay(200);
454
455     /* Now read and write the COR... */
456     tmp = readb(smc->base + link->conf.ConfigBase + CISREG_COR);
457     udelay(5);
458     writeb(tmp, smc->base + link->conf.ConfigBase + CISREG_COR);
459
460     return 0;
461 }
462
463 static int mhz_mfc_config(struct pcmcia_device *link)
464 {
465     struct net_device *dev = link->priv;
466     struct smc_private *smc = netdev_priv(dev);
467     struct smc_cfg_mem *cfg_mem;
468     tuple_t *tuple;
469     cisparse_t *parse;
470     cistpl_cftable_entry_t *cf;
471     u_char *buf;
472     win_req_t req;
473     memreq_t mem;
474     int i, k;
475
476     cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
477     if (!cfg_mem)
478         return CS_OUT_OF_RESOURCE;
479
480     tuple = &cfg_mem->tuple;
481     parse = &cfg_mem->parse;
482     cf = &parse->cftable_entry;
483     buf = cfg_mem->buf;
484
485     link->conf.Attributes |= CONF_ENABLE_SPKR;
486     link->conf.Status = CCSR_AUDIO_ENA;
487     link->irq.Attributes =
488         IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
489     link->io.IOAddrLines = 16;
490     link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
491     link->io.NumPorts2 = 8;
492
493     tuple->Attributes = tuple->TupleOffset = 0;
494     tuple->TupleData = (cisdata_t *)buf;
495     tuple->TupleDataMax = 255;
496     tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
497
498     i = first_tuple(link, tuple, parse);
499     /* The Megahertz combo cards have modem-like CIS entries, so
500        we have to explicitly try a bunch of port combinations. */
501     while (i == CS_SUCCESS) {
502         link->conf.ConfigIndex = cf->index;
503         link->io.BasePort2 = cf->io.win[0].base;
504         for (k = 0; k < 0x400; k += 0x10) {
505             if (k & 0x80) continue;
506             link->io.BasePort1 = k ^ 0x300;
507             i = pcmcia_request_io(link, &link->io);
508             if (i == CS_SUCCESS) break;
509         }
510         if (i == CS_SUCCESS) break;
511         i = next_tuple(link, tuple, parse);
512     }
513     if (i != CS_SUCCESS)
514         goto free_cfg_mem;
515     dev->base_addr = link->io.BasePort1;
516
517     /* Allocate a memory window, for accessing the ISR */
518     req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
519     req.Base = req.Size = 0;
520     req.AccessSpeed = 0;
521     i = pcmcia_request_window(&link, &req, &link->win);
522     if (i != CS_SUCCESS)
523         goto free_cfg_mem;
524     smc->base = ioremap(req.Base, req.Size);
525     mem.CardOffset = mem.Page = 0;
526     if (smc->manfid == MANFID_MOTOROLA)
527         mem.CardOffset = link->conf.ConfigBase;
528     i = pcmcia_map_mem_page(link->win, &mem);
529
530     if ((i == CS_SUCCESS)
531         && (smc->manfid == MANFID_MEGAHERTZ)
532         && (smc->cardid == PRODID_MEGAHERTZ_EM3288))
533         mhz_3288_power(link);
534
535 free_cfg_mem:
536     kfree(cfg_mem);
537     return i;
538 }
539
540 static int mhz_setup(struct pcmcia_device *link)
541 {
542     struct net_device *dev = link->priv;
543     struct smc_cfg_mem *cfg_mem;
544     tuple_t *tuple;
545     cisparse_t *parse;
546     u_char *buf, *station_addr;
547     int rc;
548
549     cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
550     if (!cfg_mem)
551         return -1;
552
553     tuple = &cfg_mem->tuple;
554     parse = &cfg_mem->parse;
555     buf = cfg_mem->buf;
556
557     tuple->Attributes = tuple->TupleOffset = 0;
558     tuple->TupleData = (cisdata_t *)buf;
559     tuple->TupleDataMax = 255;
560
561     /* Read the station address from the CIS.  It is stored as the last
562        (fourth) string in the Version 1 Version/ID tuple. */
563     tuple->DesiredTuple = CISTPL_VERS_1;
564     if (first_tuple(link, tuple, parse) != CS_SUCCESS) {
565         rc = -1;
566         goto free_cfg_mem;
567     }
568     /* Ugh -- the EM1144 card has two VERS_1 tuples!?! */
569     if (next_tuple(link, tuple, parse) != CS_SUCCESS)
570         first_tuple(link, tuple, parse);
571     if (parse->version_1.ns > 3) {
572         station_addr = parse->version_1.str + parse->version_1.ofs[3];
573         if (cvt_ascii_address(dev, station_addr) == 0) {
574                 rc = 0;
575                 goto free_cfg_mem;
576         }
577     }
578
579     /* Another possibility: for the EM3288, in a special tuple */
580     tuple->DesiredTuple = 0x81;
581     if (pcmcia_get_first_tuple(link, tuple) != CS_SUCCESS) {
582         rc = -1;
583         goto free_cfg_mem;
584     }
585     if (pcmcia_get_tuple_data(link, tuple) != CS_SUCCESS) {
586         rc = -1;
587         goto free_cfg_mem;
588     }
589     buf[12] = '\0';
590     if (cvt_ascii_address(dev, buf) == 0) {
591         rc = 0;
592         goto free_cfg_mem;
593    }
594     rc = -1;
595 free_cfg_mem:
596    kfree(cfg_mem);
597    return rc;
598 }
599
600 /*======================================================================
601
602     Configuration stuff for the Motorola Mariner
603
604     mot_config() writes directly to the Mariner configuration
605     registers because the CIS is just bogus.
606
607 ======================================================================*/
608
609 static void mot_config(struct pcmcia_device *link)
610 {
611     struct net_device *dev = link->priv;
612     struct smc_private *smc = netdev_priv(dev);
613     kio_addr_t ioaddr = dev->base_addr;
614     kio_addr_t iouart = link->io.BasePort2;
615
616     /* Set UART base address and force map with COR bit 1 */
617     writeb(iouart & 0xff,        smc->base + MOT_UART + CISREG_IOBASE_0);
618     writeb((iouart >> 8) & 0xff, smc->base + MOT_UART + CISREG_IOBASE_1);
619     writeb(MOT_NORMAL,           smc->base + MOT_UART + CISREG_COR);
620
621     /* Set SMC base address and force map with COR bit 1 */
622     writeb(ioaddr & 0xff,        smc->base + MOT_LAN + CISREG_IOBASE_0);
623     writeb((ioaddr >> 8) & 0xff, smc->base + MOT_LAN + CISREG_IOBASE_1);
624     writeb(MOT_NORMAL,           smc->base + MOT_LAN + CISREG_COR);
625
626     /* Wait for things to settle down */
627     mdelay(100);
628 }
629
630 static int mot_setup(struct pcmcia_device *link)
631 {
632     struct net_device *dev = link->priv;
633     kio_addr_t ioaddr = dev->base_addr;
634     int i, wait, loop;
635     u_int addr;
636
637     /* Read Ethernet address from Serial EEPROM */
638
639     for (i = 0; i < 3; i++) {
640         SMC_SELECT_BANK(2);
641         outw(MOT_EEPROM + i, ioaddr + POINTER);
642         SMC_SELECT_BANK(1);
643         outw((CTL_RELOAD | CTL_EE_SELECT), ioaddr + CONTROL);
644
645         for (loop = wait = 0; loop < 200; loop++) {
646             udelay(10);
647             wait = ((CTL_RELOAD | CTL_STORE) & inw(ioaddr + CONTROL));
648             if (wait == 0) break;
649         }
650         
651         if (wait)
652             return -1;
653         
654         addr = inw(ioaddr + GENERAL);
655         dev->dev_addr[2*i]   = addr & 0xff;
656         dev->dev_addr[2*i+1] = (addr >> 8) & 0xff;
657     }
658
659     return 0;
660 }
661
662 /*====================================================================*/
663
664 static int smc_config(struct pcmcia_device *link)
665 {
666     struct net_device *dev = link->priv;
667     struct smc_cfg_mem *cfg_mem;
668     tuple_t *tuple;
669     cisparse_t *parse;
670     cistpl_cftable_entry_t *cf;
671     u_char *buf;
672     int i;
673
674     cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
675     if (!cfg_mem)
676         return CS_OUT_OF_RESOURCE;
677
678     tuple = &cfg_mem->tuple;
679     parse = &cfg_mem->parse;
680     cf = &parse->cftable_entry;
681     buf = cfg_mem->buf;
682
683     tuple->Attributes = tuple->TupleOffset = 0;
684     tuple->TupleData = (cisdata_t *)buf;
685     tuple->TupleDataMax = 255;
686     tuple->DesiredTuple = CISTPL_CFTABLE_ENTRY;
687
688     link->io.NumPorts1 = 16;
689     i = first_tuple(link, tuple, parse);
690     while (i != CS_NO_MORE_ITEMS) {
691         if (i == CS_SUCCESS) {
692             link->conf.ConfigIndex = cf->index;
693             link->io.BasePort1 = cf->io.win[0].base;
694             link->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
695             i = pcmcia_request_io(link, &link->io);
696             if (i == CS_SUCCESS) break;
697         }
698         i = next_tuple(link, tuple, parse);
699     }
700     if (i == CS_SUCCESS)
701         dev->base_addr = link->io.BasePort1;
702
703     kfree(cfg_mem);
704     return i;
705 }
706
707 static int smc_setup(struct pcmcia_device *link)
708 {
709     struct net_device *dev = link->priv;
710     struct smc_cfg_mem *cfg_mem;
711     tuple_t *tuple;
712     cisparse_t *parse;
713     cistpl_lan_node_id_t *node_id;
714     u_char *buf, *station_addr;
715     int i, rc;
716
717     cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
718     if (!cfg_mem)
719         return CS_OUT_OF_RESOURCE;
720
721     tuple = &cfg_mem->tuple;
722     parse = &cfg_mem->parse;
723     buf = cfg_mem->buf;
724
725     tuple->Attributes = tuple->TupleOffset = 0;
726     tuple->TupleData = (cisdata_t *)buf;
727     tuple->TupleDataMax = 255;
728
729     /* Check for a LAN function extension tuple */
730     tuple->DesiredTuple = CISTPL_FUNCE;
731     i = first_tuple(link, tuple, parse);
732     while (i == CS_SUCCESS) {
733         if (parse->funce.type == CISTPL_FUNCE_LAN_NODE_ID)
734             break;
735         i = next_tuple(link, tuple, parse);
736     }
737     if (i == CS_SUCCESS) {
738         node_id = (cistpl_lan_node_id_t *)parse->funce.data;
739         if (node_id->nb == 6) {
740             for (i = 0; i < 6; i++)
741                 dev->dev_addr[i] = node_id->id[i];
742             rc = 0;
743             goto free_cfg_mem;
744         }
745     }
746     /* Try the third string in the Version 1 Version/ID tuple. */
747     tuple->DesiredTuple = CISTPL_VERS_1;
748     if (first_tuple(link, tuple, parse) != CS_SUCCESS) {
749         rc = -1;
750         goto free_cfg_mem;
751     }
752     station_addr = parse->version_1.str + parse->version_1.ofs[2];
753     if (cvt_ascii_address(dev, station_addr) == 0) {
754         rc = 0;
755         goto free_cfg_mem;
756     }
757
758     rc = -1;
759 free_cfg_mem:
760     kfree(cfg_mem);
761     return rc;
762 }
763
764 /*====================================================================*/
765
766 static int osi_config(struct pcmcia_device *link)
767 {
768     struct net_device *dev = link->priv;
769     static const kio_addr_t com[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
770     int i, j;
771
772     link->conf.Attributes |= CONF_ENABLE_SPKR;
773     link->conf.Status = CCSR_AUDIO_ENA;
774     link->irq.Attributes =
775         IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
776     link->io.NumPorts1 = 64;
777     link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
778     link->io.NumPorts2 = 8;
779     link->io.IOAddrLines = 16;
780
781     /* Enable Hard Decode, LAN, Modem */
782     link->conf.ConfigIndex = 0x23;
783
784     for (i = j = 0; j < 4; j++) {
785         link->io.BasePort2 = com[j];
786         i = pcmcia_request_io(link, &link->io);
787         if (i == CS_SUCCESS) break;
788     }
789     if (i != CS_SUCCESS) {
790         /* Fallback: turn off hard decode */
791         link->conf.ConfigIndex = 0x03;
792         link->io.NumPorts2 = 0;
793         i = pcmcia_request_io(link, &link->io);
794     }
795     dev->base_addr = link->io.BasePort1 + 0x10;
796     return i;
797 }
798
799 static int osi_setup(struct pcmcia_device *link, u_short manfid, u_short cardid)
800 {
801     struct net_device *dev = link->priv;
802     struct smc_cfg_mem *cfg_mem;
803     tuple_t *tuple;
804     u_char *buf;
805     int i, rc;
806
807     cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
808     if (!cfg_mem)
809         return -1;
810
811     tuple = &cfg_mem->tuple;
812     buf = cfg_mem->buf;
813
814     tuple->Attributes = TUPLE_RETURN_COMMON;
815     tuple->TupleData = (cisdata_t *)buf;
816     tuple->TupleDataMax = 255;
817     tuple->TupleOffset = 0;
818
819     /* Read the station address from tuple 0x90, subtuple 0x04 */
820     tuple->DesiredTuple = 0x90;
821     i = pcmcia_get_first_tuple(link, tuple);
822     while (i == CS_SUCCESS) {
823         i = pcmcia_get_tuple_data(link, tuple);
824         if ((i != CS_SUCCESS) || (buf[0] == 0x04))
825             break;
826         i = pcmcia_get_next_tuple(link, tuple);
827     }
828     if (i != CS_SUCCESS) {
829         rc = -1;
830         goto free_cfg_mem;
831     }
832     for (i = 0; i < 6; i++)
833         dev->dev_addr[i] = buf[i+2];
834
835     if (((manfid == MANFID_OSITECH) &&
836          (cardid == PRODID_OSITECH_SEVEN)) ||
837         ((manfid == MANFID_PSION) &&
838          (cardid == PRODID_PSION_NET100))) {
839         /* Download the Seven of Diamonds firmware */
840         for (i = 0; i < sizeof(__Xilinx7OD); i++) {
841             outb(__Xilinx7OD[i], link->io.BasePort1+2);
842             udelay(50);
843         }
844     } else if (manfid == MANFID_OSITECH) {
845         /* Make sure both functions are powered up */
846         set_bits(0x300, link->io.BasePort1 + OSITECH_AUI_PWR);
847         /* Now, turn on the interrupt for both card functions */
848         set_bits(0x300, link->io.BasePort1 + OSITECH_RESET_ISR);
849         DEBUG(2, "AUI/PWR: %4.4x RESET/ISR: %4.4x\n",
850               inw(link->io.BasePort1 + OSITECH_AUI_PWR),
851               inw(link->io.BasePort1 + OSITECH_RESET_ISR));
852     }
853     rc = 0;
854 free_cfg_mem:
855    kfree(cfg_mem);
856    return rc;
857 }
858
859 static int smc91c92_suspend(struct pcmcia_device *link)
860 {
861         struct net_device *dev = link->priv;
862
863         if (link->open)
864                 netif_device_detach(dev);
865
866         return 0;
867 }
868
869 static int smc91c92_resume(struct pcmcia_device *link)
870 {
871         struct net_device *dev = link->priv;
872         struct smc_private *smc = netdev_priv(dev);
873         int i;
874
875         if ((smc->manfid == MANFID_MEGAHERTZ) &&
876             (smc->cardid == PRODID_MEGAHERTZ_EM3288))
877                 mhz_3288_power(link);
878         if (smc->manfid == MANFID_MOTOROLA)
879                 mot_config(link);
880         if ((smc->manfid == MANFID_OSITECH) &&
881             (smc->cardid != PRODID_OSITECH_SEVEN)) {
882                 /* Power up the card and enable interrupts */
883                 set_bits(0x0300, dev->base_addr-0x10+OSITECH_AUI_PWR);
884                 set_bits(0x0300, dev->base_addr-0x10+OSITECH_RESET_ISR);
885         }
886         if (((smc->manfid == MANFID_OSITECH) &&
887              (smc->cardid == PRODID_OSITECH_SEVEN)) ||
888             ((smc->manfid == MANFID_PSION) &&
889              (smc->cardid == PRODID_PSION_NET100))) {
890                 /* Download the Seven of Diamonds firmware */
891                 for (i = 0; i < sizeof(__Xilinx7OD); i++) {
892                         outb(__Xilinx7OD[i], link->io.BasePort1+2);
893                         udelay(50);
894                 }
895         }
896         if (link->open) {
897                 smc_reset(dev);
898                 netif_device_attach(dev);
899         }
900
901         return 0;
902 }
903
904
905 /*======================================================================
906
907     This verifies that the chip is some SMC91cXX variant, and returns
908     the revision code if successful.  Otherwise, it returns -ENODEV.
909
910 ======================================================================*/
911
912 static int check_sig(struct pcmcia_device *link)
913 {
914     struct net_device *dev = link->priv;
915     kio_addr_t ioaddr = dev->base_addr;
916     int width;
917     u_short s;
918
919     SMC_SELECT_BANK(1);
920     if (inw(ioaddr + BANK_SELECT) >> 8 != 0x33) {
921         /* Try powering up the chip */
922         outw(0, ioaddr + CONTROL);
923         mdelay(55);
924     }
925
926     /* Try setting bus width */
927     width = (link->io.Attributes1 == IO_DATA_PATH_WIDTH_AUTO);
928     s = inb(ioaddr + CONFIG);
929     if (width)
930         s |= CFG_16BIT;
931     else
932         s &= ~CFG_16BIT;
933     outb(s, ioaddr + CONFIG);
934
935     /* Check Base Address Register to make sure bus width is OK */
936     s = inw(ioaddr + BASE_ADDR);
937     if ((inw(ioaddr + BANK_SELECT) >> 8 == 0x33) &&
938         ((s >> 8) != (s & 0xff))) {
939         SMC_SELECT_BANK(3);
940         s = inw(ioaddr + REVISION);
941         return (s & 0xff);
942     }
943
944     if (width) {
945             modconf_t mod = {
946                     .Attributes = CONF_IO_CHANGE_WIDTH,
947             };
948             printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n");
949
950             smc91c92_suspend(link);
951             pcmcia_modify_configuration(link, &mod);
952             smc91c92_resume(link);
953             return check_sig(link);
954     }
955     return -ENODEV;
956 }
957
958 /*======================================================================
959
960     smc91c92_config() is scheduled to run after a CARD_INSERTION event
961     is received, to configure the PCMCIA socket, and to make the
962     ethernet device available to the system.
963
964 ======================================================================*/
965
966 #define CS_EXIT_TEST(ret, svc, label) \
967 if (ret != CS_SUCCESS) { cs_error(link, svc, ret); goto label; }
968
969 static int smc91c92_config(struct pcmcia_device *link)
970 {
971     struct net_device *dev = link->priv;
972     struct smc_private *smc = netdev_priv(dev);
973     struct smc_cfg_mem *cfg_mem;
974     tuple_t *tuple;
975     cisparse_t *parse;
976     u_char *buf;
977     char *name;
978     int i, j, rev;
979     kio_addr_t ioaddr;
980     u_long mir;
981
982     DEBUG(0, "smc91c92_config(0x%p)\n", link);
983
984     cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
985     if (!cfg_mem)
986         goto config_failed;
987
988     tuple = &cfg_mem->tuple;
989     parse = &cfg_mem->parse;
990     buf = cfg_mem->buf;
991
992     tuple->Attributes = tuple->TupleOffset = 0;
993     tuple->TupleData = (cisdata_t *)buf;
994     tuple->TupleDataMax = 64;
995
996     tuple->DesiredTuple = CISTPL_CONFIG;
997     i = first_tuple(link, tuple, parse);
998     CS_EXIT_TEST(i, ParseTuple, config_failed);
999     link->conf.ConfigBase = parse->config.base;
1000     link->conf.Present = parse->config.rmask[0];
1001
1002     smc->manfid = link->manf_id;
1003     smc->cardid = link->card_id;
1004
1005     if ((smc->manfid == MANFID_OSITECH) &&
1006         (smc->cardid != PRODID_OSITECH_SEVEN)) {
1007         i = osi_config(link);
1008     } else if ((smc->manfid == MANFID_MOTOROLA) ||
1009                ((smc->manfid == MANFID_MEGAHERTZ) &&
1010                 ((smc->cardid == PRODID_MEGAHERTZ_VARIOUS) ||
1011                  (smc->cardid == PRODID_MEGAHERTZ_EM3288)))) {
1012         i = mhz_mfc_config(link);
1013     } else {
1014         i = smc_config(link);
1015     }
1016     CS_EXIT_TEST(i, RequestIO, config_failed);
1017
1018     i = pcmcia_request_irq(link, &link->irq);
1019     CS_EXIT_TEST(i, RequestIRQ, config_failed);
1020     i = pcmcia_request_configuration(link, &link->conf);
1021     CS_EXIT_TEST(i, RequestConfiguration, config_failed);
1022
1023     if (smc->manfid == MANFID_MOTOROLA)
1024         mot_config(link);
1025
1026     dev->irq = link->irq.AssignedIRQ;
1027
1028     if ((if_port >= 0) && (if_port <= 2))
1029         dev->if_port = if_port;
1030     else
1031         printk(KERN_NOTICE "smc91c92_cs: invalid if_port requested\n");
1032
1033     switch (smc->manfid) {
1034     case MANFID_OSITECH:
1035     case MANFID_PSION:
1036         i = osi_setup(link, smc->manfid, smc->cardid); break;
1037     case MANFID_SMC:
1038     case MANFID_NEW_MEDIA:
1039         i = smc_setup(link); break;
1040     case 0x128: /* For broken Megahertz cards */
1041     case MANFID_MEGAHERTZ:
1042         i = mhz_setup(link); break;
1043     case MANFID_MOTOROLA:
1044     default: /* get the hw address from EEPROM */
1045         i = mot_setup(link); break;
1046     }
1047
1048     if (i != 0) {
1049         printk(KERN_NOTICE "smc91c92_cs: Unable to find hardware address.\n");
1050         goto config_undo;
1051     }
1052
1053     smc->duplex = 0;
1054     smc->rx_ovrn = 0;
1055
1056     rev = check_sig(link);
1057     name = "???";
1058     if (rev > 0)
1059         switch (rev >> 4) {
1060         case 3: name = "92"; break;
1061         case 4: name = ((rev & 15) >= 6) ? "96" : "94"; break;
1062         case 5: name = "95"; break;
1063         case 7: name = "100"; break;
1064         case 8: name = "100-FD"; break;
1065         case 9: name = "110"; break;
1066         }
1067
1068     ioaddr = dev->base_addr;
1069     if (rev > 0) {
1070         u_long mcr;
1071         SMC_SELECT_BANK(0);
1072         mir = inw(ioaddr + MEMINFO) & 0xff;
1073         if (mir == 0xff) mir++;
1074         /* Get scale factor for memory size */
1075         mcr = ((rev >> 4) > 3) ? inw(ioaddr + MEMCFG) : 0x0200;
1076         mir *= 128 * (1<<((mcr >> 9) & 7));
1077         SMC_SELECT_BANK(1);
1078         smc->cfg = inw(ioaddr + CONFIG) & ~CFG_AUI_SELECT;
1079         smc->cfg |= CFG_NO_WAIT | CFG_16BIT | CFG_STATIC;
1080         if (smc->manfid == MANFID_OSITECH)
1081             smc->cfg |= CFG_IRQ_SEL_1 | CFG_IRQ_SEL_0;
1082         if ((rev >> 4) >= 7)
1083             smc->cfg |= CFG_MII_SELECT;
1084     } else
1085         mir = 0;
1086
1087     if (smc->cfg & CFG_MII_SELECT) {
1088         SMC_SELECT_BANK(3);
1089
1090         for (i = 0; i < 32; i++) {
1091             j = mdio_read(dev, i, 1);
1092             if ((j != 0) && (j != 0xffff)) break;
1093         }
1094         smc->mii_if.phy_id = (i < 32) ? i : -1;
1095
1096         SMC_SELECT_BANK(0);
1097     }
1098
1099     link->dev_node = &smc->node;
1100     SET_NETDEV_DEV(dev, &handle_to_dev(link));
1101
1102     if (register_netdev(dev) != 0) {
1103         printk(KERN_ERR "smc91c92_cs: register_netdev() failed\n");
1104         link->dev_node = NULL;
1105         goto config_undo;
1106     }
1107
1108     strcpy(smc->node.dev_name, dev->name);
1109
1110     printk(KERN_INFO "%s: smc91c%s rev %d: io %#3lx, irq %d, "
1111            "hw_addr ", dev->name, name, (rev & 0x0f), dev->base_addr,
1112            dev->irq);
1113     for (i = 0; i < 6; i++)
1114         printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "\n"));
1115
1116     if (rev > 0) {
1117         if (mir & 0x3ff)
1118             printk(KERN_INFO "  %lu byte", mir);
1119         else
1120             printk(KERN_INFO "  %lu kb", mir>>10);
1121         printk(" buffer, %s xcvr\n", (smc->cfg & CFG_MII_SELECT) ?
1122                "MII" : if_names[dev->if_port]);
1123     }
1124
1125     if (smc->cfg & CFG_MII_SELECT) {
1126         if (smc->mii_if.phy_id != -1) {
1127             DEBUG(0, "  MII transceiver at index %d, status %x.\n",
1128                   smc->mii_if.phy_id, j);
1129         } else {
1130             printk(KERN_NOTICE "  No MII transceivers found!\n");
1131         }
1132     }
1133     kfree(cfg_mem);
1134     return 0;
1135
1136 config_undo:
1137     unregister_netdev(dev);
1138 config_failed:                  /* CS_EXIT_TEST() calls jump to here... */
1139     smc91c92_release(link);
1140     kfree(cfg_mem);
1141     return -ENODEV;
1142 } /* smc91c92_config */
1143
1144 /*======================================================================
1145
1146     After a card is removed, smc91c92_release() will unregister the net
1147     device, and release the PCMCIA configuration.  If the device is
1148     still open, this will be postponed until it is closed.
1149
1150 ======================================================================*/
1151
1152 static void smc91c92_release(struct pcmcia_device *link)
1153 {
1154         DEBUG(0, "smc91c92_release(0x%p)\n", link);
1155         if (link->win) {
1156                 struct net_device *dev = link->priv;
1157                 struct smc_private *smc = netdev_priv(dev);
1158                 iounmap(smc->base);
1159         }
1160         pcmcia_disable_device(link);
1161 }
1162
1163 /*======================================================================
1164
1165     MII interface support for SMC91cXX based cards
1166 ======================================================================*/
1167
1168 #define MDIO_SHIFT_CLK          0x04
1169 #define MDIO_DATA_OUT           0x01
1170 #define MDIO_DIR_WRITE          0x08
1171 #define MDIO_DATA_WRITE0        (MDIO_DIR_WRITE)
1172 #define MDIO_DATA_WRITE1        (MDIO_DIR_WRITE | MDIO_DATA_OUT)
1173 #define MDIO_DATA_READ          0x02
1174
1175 static void mdio_sync(kio_addr_t addr)
1176 {
1177     int bits;
1178     for (bits = 0; bits < 32; bits++) {
1179         outb(MDIO_DATA_WRITE1, addr);
1180         outb(MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, addr);
1181     }
1182 }
1183
1184 static int mdio_read(struct net_device *dev, int phy_id, int loc)
1185 {
1186     kio_addr_t addr = dev->base_addr + MGMT;
1187     u_int cmd = (0x06<<10)|(phy_id<<5)|loc;
1188     int i, retval = 0;
1189
1190     mdio_sync(addr);
1191     for (i = 13; i >= 0; i--) {
1192         int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
1193         outb(dat, addr);
1194         outb(dat | MDIO_SHIFT_CLK, addr);
1195     }
1196     for (i = 19; i > 0; i--) {
1197         outb(0, addr);
1198         retval = (retval << 1) | ((inb(addr) & MDIO_DATA_READ) != 0);
1199         outb(MDIO_SHIFT_CLK, addr);
1200     }
1201     return (retval>>1) & 0xffff;
1202 }
1203
1204 static void mdio_write(struct net_device *dev, int phy_id, int loc, int value)
1205 {
1206     kio_addr_t addr = dev->base_addr + MGMT;
1207     u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value;
1208     int i;
1209
1210     mdio_sync(addr);
1211     for (i = 31; i >= 0; i--) {
1212         int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
1213         outb(dat, addr);
1214         outb(dat | MDIO_SHIFT_CLK, addr);
1215     }
1216     for (i = 1; i >= 0; i--) {
1217         outb(0, addr);
1218         outb(MDIO_SHIFT_CLK, addr);
1219     }
1220 }
1221
1222 /*======================================================================
1223
1224     The driver core code, most of which should be common with a
1225     non-PCMCIA implementation.
1226
1227 ======================================================================*/
1228
1229 #ifdef PCMCIA_DEBUG
1230 static void smc_dump(struct net_device *dev)
1231 {
1232     kio_addr_t ioaddr = dev->base_addr;
1233     u_short i, w, save;
1234     save = inw(ioaddr + BANK_SELECT);
1235     for (w = 0; w < 4; w++) {
1236         SMC_SELECT_BANK(w);
1237         printk(KERN_DEBUG "bank %d: ", w);
1238         for (i = 0; i < 14; i += 2)
1239             printk(" %04x", inw(ioaddr + i));
1240         printk("\n");
1241     }
1242     outw(save, ioaddr + BANK_SELECT);
1243 }
1244 #endif
1245
1246 static int smc_open(struct net_device *dev)
1247 {
1248     struct smc_private *smc = netdev_priv(dev);
1249     struct pcmcia_device *link = smc->p_dev;
1250
1251 #ifdef PCMCIA_DEBUG
1252     DEBUG(0, "%s: smc_open(%p), ID/Window %4.4x.\n",
1253           dev->name, dev, inw(dev->base_addr + BANK_SELECT));
1254     if (pc_debug > 1) smc_dump(dev);
1255 #endif
1256
1257     /* Check that the PCMCIA card is still here. */
1258     if (!pcmcia_dev_present(link))
1259         return -ENODEV;
1260     /* Physical device present signature. */
1261     if (check_sig(link) < 0) {
1262         printk("smc91c92_cs: Yikes!  Bad chip signature!\n");
1263         return -ENODEV;
1264     }
1265     link->open++;
1266
1267     netif_start_queue(dev);
1268     smc->saved_skb = NULL;
1269     smc->packets_waiting = 0;
1270
1271     smc_reset(dev);
1272     init_timer(&smc->media);
1273     smc->media.function = &media_check;
1274     smc->media.data = (u_long) dev;
1275     smc->media.expires = jiffies + HZ;
1276     add_timer(&smc->media);
1277
1278     return 0;
1279 } /* smc_open */
1280
1281 /*====================================================================*/
1282
1283 static int smc_close(struct net_device *dev)
1284 {
1285     struct smc_private *smc = netdev_priv(dev);
1286     struct pcmcia_device *link = smc->p_dev;
1287     kio_addr_t ioaddr = dev->base_addr;
1288
1289     DEBUG(0, "%s: smc_close(), status %4.4x.\n",
1290           dev->name, inw(ioaddr + BANK_SELECT));
1291
1292     netif_stop_queue(dev);
1293
1294     /* Shut off all interrupts, and turn off the Tx and Rx sections.
1295        Don't bother to check for chip present. */
1296     SMC_SELECT_BANK(2); /* Nominally paranoia, but do no assume... */
1297     outw(0, ioaddr + INTERRUPT);
1298     SMC_SELECT_BANK(0);
1299     mask_bits(0xff00, ioaddr + RCR);
1300     mask_bits(0xff00, ioaddr + TCR);
1301
1302     /* Put the chip into power-down mode. */
1303     SMC_SELECT_BANK(1);
1304     outw(CTL_POWERDOWN, ioaddr + CONTROL );
1305
1306     link->open--;
1307     del_timer_sync(&smc->media);
1308
1309     return 0;
1310 } /* smc_close */
1311
1312 /*======================================================================
1313
1314    Transfer a packet to the hardware and trigger the packet send.
1315    This may be called at either from either the Tx queue code
1316    or the interrupt handler.
1317
1318 ======================================================================*/
1319
1320 static void smc_hardware_send_packet(struct net_device * dev)
1321 {
1322     struct smc_private *smc = netdev_priv(dev);
1323     struct sk_buff *skb = smc->saved_skb;
1324     kio_addr_t ioaddr = dev->base_addr;
1325     u_char packet_no;
1326
1327     if (!skb) {
1328         printk(KERN_ERR "%s: In XMIT with no packet to send.\n", dev->name);
1329         return;
1330     }
1331
1332     /* There should be a packet slot waiting. */
1333     packet_no = inw(ioaddr + PNR_ARR) >> 8;
1334     if (packet_no & 0x80) {
1335         /* If not, there is a hardware problem!  Likely an ejected card. */
1336         printk(KERN_WARNING "%s: 91c92 hardware Tx buffer allocation"
1337                " failed, status %#2.2x.\n", dev->name, packet_no);
1338         dev_kfree_skb_irq(skb);
1339         smc->saved_skb = NULL;
1340         netif_start_queue(dev);
1341         return;
1342     }
1343
1344     smc->stats.tx_bytes += skb->len;
1345     /* The card should use the just-allocated buffer. */
1346     outw(packet_no, ioaddr + PNR_ARR);
1347     /* point to the beginning of the packet */
1348     outw(PTR_AUTOINC , ioaddr + POINTER);
1349
1350     /* Send the packet length (+6 for status, length and ctl byte)
1351        and the status word (set to zeros). */
1352     {
1353         u_char *buf = skb->data;
1354         u_int length = skb->len; /* The chip will pad to ethernet min. */
1355
1356         DEBUG(2, "%s: Trying to xmit packet of length %d.\n",
1357               dev->name, length);
1358         
1359         /* send the packet length: +6 for status word, length, and ctl */
1360         outw(0, ioaddr + DATA_1);
1361         outw(length + 6, ioaddr + DATA_1);
1362         outsw(ioaddr + DATA_1, buf, length >> 1);
1363         
1364         /* The odd last byte, if there is one, goes in the control word. */
1365         outw((length & 1) ? 0x2000 | buf[length-1] : 0, ioaddr + DATA_1);
1366     }
1367
1368     /* Enable the Tx interrupts, both Tx (TxErr) and TxEmpty. */
1369     outw(((IM_TX_INT|IM_TX_EMPTY_INT)<<8) |
1370          (inw(ioaddr + INTERRUPT) & 0xff00),
1371          ioaddr + INTERRUPT);
1372
1373     /* The chip does the rest of the work. */
1374     outw(MC_ENQUEUE , ioaddr + MMU_CMD);
1375
1376     smc->saved_skb = NULL;
1377     dev_kfree_skb_irq(skb);
1378     dev->trans_start = jiffies;
1379     netif_start_queue(dev);
1380     return;
1381 }
1382
1383 /*====================================================================*/
1384
1385 static void smc_tx_timeout(struct net_device *dev)
1386 {
1387     struct smc_private *smc = netdev_priv(dev);
1388     kio_addr_t ioaddr = dev->base_addr;
1389
1390     printk(KERN_NOTICE "%s: SMC91c92 transmit timed out, "
1391            "Tx_status %2.2x status %4.4x.\n",
1392            dev->name, inw(ioaddr)&0xff, inw(ioaddr + 2));
1393     smc->stats.tx_errors++;
1394     smc_reset(dev);
1395     dev->trans_start = jiffies;
1396     smc->saved_skb = NULL;
1397     netif_wake_queue(dev);
1398 }
1399
1400 static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev)
1401 {
1402     struct smc_private *smc = netdev_priv(dev);
1403     kio_addr_t ioaddr = dev->base_addr;
1404     u_short num_pages;
1405     short time_out, ir;
1406
1407     netif_stop_queue(dev);
1408
1409     DEBUG(2, "%s: smc_start_xmit(length = %d) called,"
1410           " status %4.4x.\n", dev->name, skb->len, inw(ioaddr + 2));
1411
1412     if (smc->saved_skb) {
1413         /* THIS SHOULD NEVER HAPPEN. */
1414         smc->stats.tx_aborted_errors++;
1415         printk(KERN_DEBUG "%s: Internal error -- sent packet while busy.\n",
1416                dev->name);
1417         return 1;
1418     }
1419     smc->saved_skb = skb;
1420
1421     num_pages = skb->len >> 8;
1422
1423     if (num_pages > 7) {
1424         printk(KERN_ERR "%s: Far too big packet error.\n", dev->name);
1425         dev_kfree_skb (skb);
1426         smc->saved_skb = NULL;
1427         smc->stats.tx_dropped++;
1428         return 0;               /* Do not re-queue this packet. */
1429     }
1430     /* A packet is now waiting. */
1431     smc->packets_waiting++;
1432
1433     SMC_SELECT_BANK(2); /* Paranoia, we should always be in window 2 */
1434
1435     /* need MC_RESET to keep the memory consistent. errata? */
1436     if (smc->rx_ovrn) {
1437         outw(MC_RESET, ioaddr + MMU_CMD);
1438         smc->rx_ovrn = 0;
1439     }
1440
1441     /* Allocate the memory; send the packet now if we win. */
1442     outw(MC_ALLOC | num_pages, ioaddr + MMU_CMD);
1443     for (time_out = MEMORY_WAIT_TIME; time_out >= 0; time_out--) {
1444         ir = inw(ioaddr+INTERRUPT);
1445         if (ir & IM_ALLOC_INT) {
1446             /* Acknowledge the interrupt, send the packet. */
1447             outw((ir&0xff00) | IM_ALLOC_INT, ioaddr + INTERRUPT);
1448             smc_hardware_send_packet(dev);      /* Send the packet now.. */
1449             return 0;
1450         }
1451     }
1452
1453     /* Otherwise defer until the Tx-space-allocated interrupt. */
1454     DEBUG(2, "%s: memory allocation deferred.\n", dev->name);
1455     outw((IM_ALLOC_INT << 8) | (ir & 0xff00), ioaddr + INTERRUPT);
1456
1457     return 0;
1458 }
1459
1460 /*======================================================================
1461
1462     Handle a Tx anomolous event.  Entered while in Window 2.
1463
1464 ======================================================================*/
1465
1466 static void smc_tx_err(struct net_device * dev)
1467 {
1468     struct smc_private *smc = netdev_priv(dev);
1469     kio_addr_t ioaddr = dev->base_addr;
1470     int saved_packet = inw(ioaddr + PNR_ARR) & 0xff;
1471     int packet_no = inw(ioaddr + FIFO_PORTS) & 0x7f;
1472     int tx_status;
1473
1474     /* select this as the packet to read from */
1475     outw(packet_no, ioaddr + PNR_ARR);
1476
1477     /* read the first word from this packet */
1478     outw(PTR_AUTOINC | PTR_READ | 0, ioaddr + POINTER);
1479
1480     tx_status = inw(ioaddr + DATA_1);
1481
1482     smc->stats.tx_errors++;
1483     if (tx_status & TS_LOSTCAR) smc->stats.tx_carrier_errors++;
1484     if (tx_status & TS_LATCOL)  smc->stats.tx_window_errors++;
1485     if (tx_status & TS_16COL) {
1486         smc->stats.tx_aborted_errors++;
1487         smc->tx_err++;
1488     }
1489
1490     if (tx_status & TS_SUCCESS) {
1491         printk(KERN_NOTICE "%s: Successful packet caused error "
1492                "interrupt?\n", dev->name);
1493     }
1494     /* re-enable transmit */
1495     SMC_SELECT_BANK(0);
1496     outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR);
1497     SMC_SELECT_BANK(2);
1498
1499     outw(MC_FREEPKT, ioaddr + MMU_CMD);         /* Free the packet memory. */
1500
1501     /* one less packet waiting for me */
1502     smc->packets_waiting--;
1503
1504     outw(saved_packet, ioaddr + PNR_ARR);
1505     return;
1506 }
1507
1508 /*====================================================================*/
1509
1510 static void smc_eph_irq(struct net_device *dev)
1511 {
1512     struct smc_private *smc = netdev_priv(dev);
1513     kio_addr_t ioaddr = dev->base_addr;
1514     u_short card_stats, ephs;
1515
1516     SMC_SELECT_BANK(0);
1517     ephs = inw(ioaddr + EPH);
1518     DEBUG(2, "%s: Ethernet protocol handler interrupt, status"
1519           " %4.4x.\n", dev->name, ephs);
1520     /* Could be a counter roll-over warning: update stats. */
1521     card_stats = inw(ioaddr + COUNTER);
1522     /* single collisions */
1523     smc->stats.collisions += card_stats & 0xF;
1524     card_stats >>= 4;
1525     /* multiple collisions */
1526     smc->stats.collisions += card_stats & 0xF;
1527 #if 0           /* These are for when linux supports these statistics */
1528     card_stats >>= 4;                   /* deferred */
1529     card_stats >>= 4;                   /* excess deferred */
1530 #endif
1531     /* If we had a transmit error we must re-enable the transmitter. */
1532     outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR);
1533
1534     /* Clear a link error interrupt. */
1535     SMC_SELECT_BANK(1);
1536     outw(CTL_AUTO_RELEASE | 0x0000, ioaddr + CONTROL);
1537     outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE,
1538          ioaddr + CONTROL);
1539     SMC_SELECT_BANK(2);
1540 }
1541
1542 /*====================================================================*/
1543
1544 static irqreturn_t smc_interrupt(int irq, void *dev_id)
1545 {
1546     struct net_device *dev = dev_id;
1547     struct smc_private *smc = netdev_priv(dev);
1548     kio_addr_t ioaddr;
1549     u_short saved_bank, saved_pointer, mask, status;
1550     unsigned int handled = 1;
1551     char bogus_cnt = INTR_WORK;         /* Work we are willing to do. */
1552
1553     if (!netif_device_present(dev))
1554         return IRQ_NONE;
1555
1556     ioaddr = dev->base_addr;
1557
1558     DEBUG(3, "%s: SMC91c92 interrupt %d at %#x.\n", dev->name,
1559           irq, ioaddr);
1560
1561     smc->watchdog = 0;
1562     saved_bank = inw(ioaddr + BANK_SELECT);
1563     if ((saved_bank & 0xff00) != 0x3300) {
1564         /* The device does not exist -- the card could be off-line, or
1565            maybe it has been ejected. */
1566         DEBUG(1, "%s: SMC91c92 interrupt %d for non-existent"
1567               "/ejected device.\n", dev->name, irq);
1568         handled = 0;
1569         goto irq_done;
1570     }
1571
1572     SMC_SELECT_BANK(2);
1573     saved_pointer = inw(ioaddr + POINTER);
1574     mask = inw(ioaddr + INTERRUPT) >> 8;
1575     /* clear all interrupts */
1576     outw(0, ioaddr + INTERRUPT);
1577
1578     do { /* read the status flag, and mask it */
1579         status = inw(ioaddr + INTERRUPT) & 0xff;
1580         DEBUG(3, "%s: Status is %#2.2x (mask %#2.2x).\n", dev->name,
1581               status, mask);
1582         if ((status & mask) == 0) {
1583             if (bogus_cnt == INTR_WORK)
1584                 handled = 0;
1585             break;
1586         }
1587         if (status & IM_RCV_INT) {
1588             /* Got a packet(s). */
1589             smc_rx(dev);
1590         }
1591         if (status & IM_TX_INT) {
1592             smc_tx_err(dev);
1593             outw(IM_TX_INT, ioaddr + INTERRUPT);
1594         }
1595         status &= mask;
1596         if (status & IM_TX_EMPTY_INT) {
1597             outw(IM_TX_EMPTY_INT, ioaddr + INTERRUPT);
1598             mask &= ~IM_TX_EMPTY_INT;
1599             smc->stats.tx_packets += smc->packets_waiting;
1600             smc->packets_waiting = 0;
1601         }
1602         if (status & IM_ALLOC_INT) {
1603             /* Clear this interrupt so it doesn't happen again */
1604             mask &= ~IM_ALLOC_INT;
1605         
1606             smc_hardware_send_packet(dev);
1607         
1608             /* enable xmit interrupts based on this */
1609             mask |= (IM_TX_EMPTY_INT | IM_TX_INT);
1610         
1611             /* and let the card send more packets to me */
1612             netif_wake_queue(dev);
1613         }
1614         if (status & IM_RX_OVRN_INT) {
1615             smc->stats.rx_errors++;
1616             smc->stats.rx_fifo_errors++;
1617             if (smc->duplex)
1618                 smc->rx_ovrn = 1; /* need MC_RESET outside smc_interrupt */
1619             outw(IM_RX_OVRN_INT, ioaddr + INTERRUPT);
1620         }
1621         if (status & IM_EPH_INT)
1622             smc_eph_irq(dev);
1623     } while (--bogus_cnt);
1624
1625     DEBUG(3, "  Restoring saved registers mask %2.2x bank %4.4x"
1626           " pointer %4.4x.\n", mask, saved_bank, saved_pointer);
1627
1628     /* restore state register */
1629     outw((mask<<8), ioaddr + INTERRUPT);
1630     outw(saved_pointer, ioaddr + POINTER);
1631     SMC_SELECT_BANK(saved_bank);
1632
1633     DEBUG(3, "%s: Exiting interrupt IRQ%d.\n", dev->name, irq);
1634
1635 irq_done:
1636
1637     if ((smc->manfid == MANFID_OSITECH) &&
1638         (smc->cardid != PRODID_OSITECH_SEVEN)) {
1639         /* Retrigger interrupt if needed */
1640         mask_bits(0x00ff, ioaddr-0x10+OSITECH_RESET_ISR);
1641         set_bits(0x0300, ioaddr-0x10+OSITECH_RESET_ISR);
1642     }
1643     if (smc->manfid == MANFID_MOTOROLA) {
1644         u_char cor;
1645         cor = readb(smc->base + MOT_UART + CISREG_COR);
1646         writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_UART + CISREG_COR);
1647         writeb(cor, smc->base + MOT_UART + CISREG_COR);
1648         cor = readb(smc->base + MOT_LAN + CISREG_COR);
1649         writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_LAN + CISREG_COR);
1650         writeb(cor, smc->base + MOT_LAN + CISREG_COR);
1651     }
1652 #ifdef DOES_NOT_WORK
1653     if (smc->base != NULL) { /* Megahertz MFC's */
1654         readb(smc->base+MEGAHERTZ_ISR);
1655         readb(smc->base+MEGAHERTZ_ISR);
1656     }
1657 #endif
1658     return IRQ_RETVAL(handled);
1659 }
1660
1661 /*====================================================================*/
1662
1663 static void smc_rx(struct net_device *dev)
1664 {
1665     struct smc_private *smc = netdev_priv(dev);
1666     kio_addr_t ioaddr = dev->base_addr;
1667     int rx_status;
1668     int packet_length;  /* Caution: not frame length, rather words
1669                            to transfer from the chip. */
1670
1671     /* Assertion: we are in Window 2. */
1672
1673     if (inw(ioaddr + FIFO_PORTS) & FP_RXEMPTY) {
1674         printk(KERN_ERR "%s: smc_rx() with nothing on Rx FIFO.\n",
1675                dev->name);
1676         return;
1677     }
1678
1679     /*  Reset the read pointer, and read the status and packet length. */
1680     outw(PTR_READ | PTR_RCV | PTR_AUTOINC, ioaddr + POINTER);
1681     rx_status = inw(ioaddr + DATA_1);
1682     packet_length = inw(ioaddr + DATA_1) & 0x07ff;
1683
1684     DEBUG(2, "%s: Receive status %4.4x length %d.\n",
1685           dev->name, rx_status, packet_length);
1686
1687     if (!(rx_status & RS_ERRORS)) {             
1688         /* do stuff to make a new packet */
1689         struct sk_buff *skb;
1690         
1691         /* Note: packet_length adds 5 or 6 extra bytes here! */
1692         skb = dev_alloc_skb(packet_length+2);
1693         
1694         if (skb == NULL) {
1695             DEBUG(1, "%s: Low memory, packet dropped.\n", dev->name);
1696             smc->stats.rx_dropped++;
1697             outw(MC_RELEASE, ioaddr + MMU_CMD);
1698             return;
1699         }
1700         
1701         packet_length -= (rx_status & RS_ODDFRAME ? 5 : 6);
1702         skb_reserve(skb, 2);
1703         insw(ioaddr+DATA_1, skb_put(skb, packet_length),
1704              (packet_length+1)>>1);
1705         skb->protocol = eth_type_trans(skb, dev);
1706         
1707         skb->dev = dev;
1708         netif_rx(skb);
1709         dev->last_rx = jiffies;
1710         smc->stats.rx_packets++;
1711         smc->stats.rx_bytes += packet_length;
1712         if (rx_status & RS_MULTICAST)
1713             smc->stats.multicast++;
1714     } else {
1715         /* error ... */
1716         smc->stats.rx_errors++;
1717         
1718         if (rx_status & RS_ALGNERR)  smc->stats.rx_frame_errors++;
1719         if (rx_status & (RS_TOOSHORT | RS_TOOLONG))
1720             smc->stats.rx_length_errors++;
1721         if (rx_status & RS_BADCRC)      smc->stats.rx_crc_errors++;
1722     }
1723     /* Let the MMU free the memory of this packet. */
1724     outw(MC_RELEASE, ioaddr + MMU_CMD);
1725
1726     return;
1727 }
1728
1729 /*====================================================================*/
1730
1731 static struct net_device_stats *smc_get_stats(struct net_device *dev)
1732 {
1733     struct smc_private *smc = netdev_priv(dev);
1734     /* Nothing to update - the 91c92 is a pretty primative chip. */
1735     return &smc->stats;
1736 }
1737
1738 /*======================================================================
1739
1740     Calculate values for the hardware multicast filter hash table.
1741
1742 ======================================================================*/
1743
1744 static void fill_multicast_tbl(int count, struct dev_mc_list *addrs,
1745                                u_char *multicast_table)
1746 {
1747     struct dev_mc_list  *mc_addr;
1748
1749     for (mc_addr = addrs;  mc_addr && count-- > 0;  mc_addr = mc_addr->next) {
1750         u_int position = ether_crc(6, mc_addr->dmi_addr);
1751 #ifndef final_version           /* Verify multicast address. */
1752         if ((mc_addr->dmi_addr[0] & 1) == 0)
1753             continue;
1754 #endif
1755         multicast_table[position >> 29] |= 1 << ((position >> 26) & 7);
1756     }
1757 }
1758
1759 /*======================================================================
1760
1761     Set the receive mode.
1762
1763     This routine is used by both the protocol level to notify us of
1764     promiscuous/multicast mode changes, and by the open/reset code to
1765     initialize the Rx registers.  We always set the multicast list and
1766     leave the receiver running.
1767
1768 ======================================================================*/
1769
1770 static void set_rx_mode(struct net_device *dev)
1771 {
1772     kio_addr_t ioaddr = dev->base_addr;
1773     struct smc_private *smc = netdev_priv(dev);
1774     u_int multicast_table[ 2 ] = { 0, };
1775     unsigned long flags;
1776     u_short rx_cfg_setting;
1777
1778     if (dev->flags & IFF_PROMISC) {
1779         rx_cfg_setting = RxStripCRC | RxEnable | RxPromisc | RxAllMulti;
1780     } else if (dev->flags & IFF_ALLMULTI)
1781         rx_cfg_setting = RxStripCRC | RxEnable | RxAllMulti;
1782     else {
1783         if (dev->mc_count)  {
1784             fill_multicast_tbl(dev->mc_count, dev->mc_list,
1785                                (u_char *)multicast_table);
1786         }
1787         rx_cfg_setting = RxStripCRC | RxEnable;
1788     }
1789
1790     /* Load MC table and Rx setting into the chip without interrupts. */
1791     spin_lock_irqsave(&smc->lock, flags);
1792     SMC_SELECT_BANK(3);
1793     outl(multicast_table[0], ioaddr + MULTICAST0);
1794     outl(multicast_table[1], ioaddr + MULTICAST4);
1795     SMC_SELECT_BANK(0);
1796     outw(rx_cfg_setting, ioaddr + RCR);
1797     SMC_SELECT_BANK(2);
1798     spin_unlock_irqrestore(&smc->lock, flags);
1799
1800     return;
1801 }
1802
1803 /*======================================================================
1804
1805     Senses when a card's config changes. Here, it's coax or TP.
1806
1807 ======================================================================*/
1808
1809 static int s9k_config(struct net_device *dev, struct ifmap *map)
1810 {
1811     struct smc_private *smc = netdev_priv(dev);
1812     if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
1813         if (smc->cfg & CFG_MII_SELECT)
1814             return -EOPNOTSUPP;
1815         else if (map->port > 2)
1816             return -EINVAL;
1817         dev->if_port = map->port;
1818         printk(KERN_INFO "%s: switched to %s port\n",
1819                dev->name, if_names[dev->if_port]);
1820         smc_reset(dev);
1821     }
1822     return 0;
1823 }
1824
1825 /*======================================================================
1826
1827     Reset the chip, reloading every register that might be corrupted.
1828
1829 ======================================================================*/
1830
1831 /*
1832   Set transceiver type, perhaps to something other than what the user
1833   specified in dev->if_port.
1834 */
1835 static void smc_set_xcvr(struct net_device *dev, int if_port)
1836 {
1837     struct smc_private *smc = netdev_priv(dev);
1838     kio_addr_t ioaddr = dev->base_addr;
1839     u_short saved_bank;
1840
1841     saved_bank = inw(ioaddr + BANK_SELECT);
1842     SMC_SELECT_BANK(1);
1843     if (if_port == 2) {
1844         outw(smc->cfg | CFG_AUI_SELECT, ioaddr + CONFIG);
1845         if ((smc->manfid == MANFID_OSITECH) &&
1846             (smc->cardid != PRODID_OSITECH_SEVEN))
1847             set_bits(OSI_AUI_PWR, ioaddr - 0x10 + OSITECH_AUI_PWR);
1848         smc->media_status = ((dev->if_port == 0) ? 0x0001 : 0x0002);
1849     } else {
1850         outw(smc->cfg, ioaddr + CONFIG);
1851         if ((smc->manfid == MANFID_OSITECH) &&
1852             (smc->cardid != PRODID_OSITECH_SEVEN))
1853             mask_bits(~OSI_AUI_PWR, ioaddr - 0x10 + OSITECH_AUI_PWR);
1854         smc->media_status = ((dev->if_port == 0) ? 0x0012 : 0x4001);
1855     }
1856     SMC_SELECT_BANK(saved_bank);
1857 }
1858
1859 static void smc_reset(struct net_device *dev)
1860 {
1861     kio_addr_t ioaddr = dev->base_addr;
1862     struct smc_private *smc = netdev_priv(dev);
1863     int i;
1864
1865     DEBUG(0, "%s: smc91c92 reset called.\n", dev->name);
1866
1867     /* The first interaction must be a write to bring the chip out
1868        of sleep mode. */
1869     SMC_SELECT_BANK(0);
1870     /* Reset the chip. */
1871     outw(RCR_SOFTRESET, ioaddr + RCR);
1872     udelay(10);
1873
1874     /* Clear the transmit and receive configuration registers. */
1875     outw(RCR_CLEAR, ioaddr + RCR);
1876     outw(TCR_CLEAR, ioaddr + TCR);
1877
1878     /* Set the Window 1 control, configuration and station addr registers.
1879        No point in writing the I/O base register ;-> */
1880     SMC_SELECT_BANK(1);
1881     /* Automatically release successfully transmitted packets,
1882        Accept link errors, counter and Tx error interrupts. */
1883     outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE,
1884          ioaddr + CONTROL);
1885     smc_set_xcvr(dev, dev->if_port);
1886     if ((smc->manfid == MANFID_OSITECH) &&
1887         (smc->cardid != PRODID_OSITECH_SEVEN))
1888         outw((dev->if_port == 2 ? OSI_AUI_PWR : 0) |
1889              (inw(ioaddr-0x10+OSITECH_AUI_PWR) & 0xff00),
1890              ioaddr - 0x10 + OSITECH_AUI_PWR);
1891
1892     /* Fill in the physical address.  The databook is wrong about the order! */
1893     for (i = 0; i < 6; i += 2)
1894         outw((dev->dev_addr[i+1]<<8)+dev->dev_addr[i],
1895              ioaddr + ADDR0 + i);
1896
1897     /* Reset the MMU */
1898     SMC_SELECT_BANK(2);
1899     outw(MC_RESET, ioaddr + MMU_CMD);
1900     outw(0, ioaddr + INTERRUPT);
1901
1902     /* Re-enable the chip. */
1903     SMC_SELECT_BANK(0);
1904     outw(((smc->cfg & CFG_MII_SELECT) ? 0 : TCR_MONCSN) |
1905          TCR_ENABLE | TCR_PAD_EN | smc->duplex, ioaddr + TCR);
1906     set_rx_mode(dev);
1907
1908     if (smc->cfg & CFG_MII_SELECT) {
1909         SMC_SELECT_BANK(3);
1910
1911         /* Reset MII */
1912         mdio_write(dev, smc->mii_if.phy_id, 0, 0x8000);
1913
1914         /* Advertise 100F, 100H, 10F, 10H */
1915         mdio_write(dev, smc->mii_if.phy_id, 4, 0x01e1);
1916
1917         /* Restart MII autonegotiation */
1918         mdio_write(dev, smc->mii_if.phy_id, 0, 0x0000);
1919         mdio_write(dev, smc->mii_if.phy_id, 0, 0x1200);
1920     }
1921
1922     /* Enable interrupts. */
1923     SMC_SELECT_BANK(2);
1924     outw((IM_EPH_INT | IM_RX_OVRN_INT | IM_RCV_INT) << 8,
1925          ioaddr + INTERRUPT);
1926 }
1927
1928 /*======================================================================
1929
1930     Media selection timer routine
1931
1932 ======================================================================*/
1933
1934 static void media_check(u_long arg)
1935 {
1936     struct net_device *dev = (struct net_device *) arg;
1937     struct smc_private *smc = netdev_priv(dev);
1938     kio_addr_t ioaddr = dev->base_addr;
1939     u_short i, media, saved_bank;
1940     u_short link;
1941
1942     saved_bank = inw(ioaddr + BANK_SELECT);
1943
1944     if (!netif_device_present(dev))
1945         goto reschedule;
1946
1947     SMC_SELECT_BANK(2);
1948
1949     /* need MC_RESET to keep the memory consistent. errata? */
1950     if (smc->rx_ovrn) {
1951         outw(MC_RESET, ioaddr + MMU_CMD);
1952         smc->rx_ovrn = 0;
1953     }
1954     i = inw(ioaddr + INTERRUPT);
1955     SMC_SELECT_BANK(0);
1956     media = inw(ioaddr + EPH) & EPH_LINK_OK;
1957     SMC_SELECT_BANK(1);
1958     media |= (inw(ioaddr + CONFIG) & CFG_AUI_SELECT) ? 2 : 1;
1959
1960     /* Check for pending interrupt with watchdog flag set: with
1961        this, we can limp along even if the interrupt is blocked */
1962     if (smc->watchdog++ && ((i>>8) & i)) {
1963         if (!smc->fast_poll)
1964             printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
1965         smc_interrupt(dev->irq, smc);
1966         smc->fast_poll = HZ;
1967     }
1968     if (smc->fast_poll) {
1969         smc->fast_poll--;
1970         smc->media.expires = jiffies + HZ/100;
1971         add_timer(&smc->media);
1972         SMC_SELECT_BANK(saved_bank);
1973         return;
1974     }
1975
1976     if (smc->cfg & CFG_MII_SELECT) {
1977         if (smc->mii_if.phy_id < 0)
1978             goto reschedule;
1979
1980         SMC_SELECT_BANK(3);
1981         link = mdio_read(dev, smc->mii_if.phy_id, 1);
1982         if (!link || (link == 0xffff)) {
1983             printk(KERN_INFO "%s: MII is missing!\n", dev->name);
1984             smc->mii_if.phy_id = -1;
1985             goto reschedule;
1986         }
1987
1988         link &= 0x0004;
1989         if (link != smc->link_status) {
1990             u_short p = mdio_read(dev, smc->mii_if.phy_id, 5);
1991             printk(KERN_INFO "%s: %s link beat\n", dev->name,
1992                 (link) ? "found" : "lost");
1993             smc->duplex = (((p & 0x0100) || ((p & 0x1c0) == 0x40))
1994                            ? TCR_FDUPLX : 0);
1995             if (link) {
1996                 printk(KERN_INFO "%s: autonegotiation complete: "
1997                        "%sbaseT-%cD selected\n", dev->name,
1998                        ((p & 0x0180) ? "100" : "10"),
1999                        (smc->duplex ? 'F' : 'H'));
2000             }
2001             SMC_SELECT_BANK(0);
2002             outw(inw(ioaddr + TCR) | smc->duplex, ioaddr + TCR);
2003             smc->link_status = link;
2004         }
2005         goto reschedule;
2006     }
2007
2008     /* Ignore collisions unless we've had no rx's recently */
2009     if (time_after(jiffies, dev->last_rx + HZ)) {
2010         if (smc->tx_err || (smc->media_status & EPH_16COL))
2011             media |= EPH_16COL;
2012     }
2013     smc->tx_err = 0;
2014
2015     if (media != smc->media_status) {
2016         if ((media & smc->media_status & 1) &&
2017             ((smc->media_status ^ media) & EPH_LINK_OK))
2018             printk(KERN_INFO "%s: %s link beat\n", dev->name,
2019                    (smc->media_status & EPH_LINK_OK ? "lost" : "found"));
2020         else if ((media & smc->media_status & 2) &&
2021                  ((smc->media_status ^ media) & EPH_16COL))
2022             printk(KERN_INFO "%s: coax cable %s\n", dev->name,
2023                    (media & EPH_16COL ? "problem" : "ok"));
2024         if (dev->if_port == 0) {
2025             if (media & 1) {
2026                 if (media & EPH_LINK_OK)
2027                     printk(KERN_INFO "%s: flipped to 10baseT\n",
2028                            dev->name);
2029                 else
2030                     smc_set_xcvr(dev, 2);
2031             } else {
2032                 if (media & EPH_16COL)
2033                     smc_set_xcvr(dev, 1);
2034                 else
2035                     printk(KERN_INFO "%s: flipped to 10base2\n",
2036                            dev->name);
2037             }
2038         }
2039         smc->media_status = media;
2040     }
2041
2042 reschedule:
2043     smc->media.expires = jiffies + HZ;
2044     add_timer(&smc->media);
2045     SMC_SELECT_BANK(saved_bank);
2046 }
2047
2048 static int smc_link_ok(struct net_device *dev)
2049 {
2050     kio_addr_t ioaddr = dev->base_addr;
2051     struct smc_private *smc = netdev_priv(dev);
2052
2053     if (smc->cfg & CFG_MII_SELECT) {
2054         return mii_link_ok(&smc->mii_if);
2055     } else {
2056         SMC_SELECT_BANK(0);
2057         return inw(ioaddr + EPH) & EPH_LINK_OK;
2058     }
2059 }
2060
2061 static int smc_netdev_get_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
2062 {
2063     u16 tmp;
2064     kio_addr_t ioaddr = dev->base_addr;
2065
2066     ecmd->supported = (SUPPORTED_TP | SUPPORTED_AUI |
2067         SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full);
2068                 
2069     SMC_SELECT_BANK(1);
2070     tmp = inw(ioaddr + CONFIG);
2071     ecmd->port = (tmp & CFG_AUI_SELECT) ? PORT_AUI : PORT_TP;
2072     ecmd->transceiver = XCVR_INTERNAL;
2073     ecmd->speed = SPEED_10;
2074     ecmd->phy_address = ioaddr + MGMT;
2075
2076     SMC_SELECT_BANK(0);
2077     tmp = inw(ioaddr + TCR);
2078     ecmd->duplex = (tmp & TCR_FDUPLX) ? DUPLEX_FULL : DUPLEX_HALF;
2079
2080     return 0;
2081 }
2082
2083 static int smc_netdev_set_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
2084 {
2085     u16 tmp;
2086     kio_addr_t ioaddr = dev->base_addr;
2087
2088     if (ecmd->speed != SPEED_10)
2089         return -EINVAL;
2090     if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL)
2091         return -EINVAL;
2092     if (ecmd->port != PORT_TP && ecmd->port != PORT_AUI)
2093         return -EINVAL;
2094     if (ecmd->transceiver != XCVR_INTERNAL)
2095         return -EINVAL;
2096
2097     if (ecmd->port == PORT_AUI)
2098         smc_set_xcvr(dev, 1);
2099     else
2100         smc_set_xcvr(dev, 0);
2101
2102     SMC_SELECT_BANK(0);
2103     tmp = inw(ioaddr + TCR);
2104     if (ecmd->duplex == DUPLEX_FULL)
2105         tmp |= TCR_FDUPLX;
2106     else
2107         tmp &= ~TCR_FDUPLX;
2108     outw(tmp, ioaddr + TCR);
2109         
2110     return 0;
2111 }
2112
2113 static int check_if_running(struct net_device *dev)
2114 {
2115         if (!netif_running(dev))
2116                 return -EINVAL;
2117         return 0;
2118 }
2119
2120 static void smc_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
2121 {
2122         strcpy(info->driver, DRV_NAME);
2123         strcpy(info->version, DRV_VERSION);
2124 }
2125
2126 static int smc_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
2127 {
2128         struct smc_private *smc = netdev_priv(dev);
2129         kio_addr_t ioaddr = dev->base_addr;
2130         u16 saved_bank = inw(ioaddr + BANK_SELECT);
2131         int ret;
2132
2133         SMC_SELECT_BANK(3);
2134         spin_lock_irq(&smc->lock);
2135         if (smc->cfg & CFG_MII_SELECT)
2136                 ret = mii_ethtool_gset(&smc->mii_if, ecmd);
2137         else
2138                 ret = smc_netdev_get_ecmd(dev, ecmd);
2139         spin_unlock_irq(&smc->lock);
2140         SMC_SELECT_BANK(saved_bank);
2141         return ret;
2142 }
2143
2144 static int smc_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
2145 {
2146         struct smc_private *smc = netdev_priv(dev);
2147         kio_addr_t ioaddr = dev->base_addr;
2148         u16 saved_bank = inw(ioaddr + BANK_SELECT);
2149         int ret;
2150
2151         SMC_SELECT_BANK(3);
2152         spin_lock_irq(&smc->lock);
2153         if (smc->cfg & CFG_MII_SELECT)
2154                 ret = mii_ethtool_sset(&smc->mii_if, ecmd);
2155         else
2156                 ret = smc_netdev_set_ecmd(dev, ecmd);
2157         spin_unlock_irq(&smc->lock);
2158         SMC_SELECT_BANK(saved_bank);
2159         return ret;
2160 }
2161
2162 static u32 smc_get_link(struct net_device *dev)
2163 {
2164         struct smc_private *smc = netdev_priv(dev);
2165         kio_addr_t ioaddr = dev->base_addr;
2166         u16 saved_bank = inw(ioaddr + BANK_SELECT);
2167         u32 ret;
2168
2169         SMC_SELECT_BANK(3);
2170         spin_lock_irq(&smc->lock);
2171         ret = smc_link_ok(dev);
2172         spin_unlock_irq(&smc->lock);
2173         SMC_SELECT_BANK(saved_bank);
2174         return ret;
2175 }
2176
2177 #ifdef PCMCIA_DEBUG
2178 static u32 smc_get_msglevel(struct net_device *dev)
2179 {
2180         return pc_debug;
2181 }
2182
2183 static void smc_set_msglevel(struct net_device *dev, u32 val)
2184 {
2185         pc_debug = val;
2186 }
2187 #endif
2188
2189 static int smc_nway_reset(struct net_device *dev)
2190 {
2191         struct smc_private *smc = netdev_priv(dev);
2192         if (smc->cfg & CFG_MII_SELECT) {
2193                 kio_addr_t ioaddr = dev->base_addr;
2194                 u16 saved_bank = inw(ioaddr + BANK_SELECT);
2195                 int res;
2196
2197                 SMC_SELECT_BANK(3);
2198                 res = mii_nway_restart(&smc->mii_if);
2199                 SMC_SELECT_BANK(saved_bank);
2200
2201                 return res;
2202         } else
2203                 return -EOPNOTSUPP;
2204 }
2205
2206 static const struct ethtool_ops ethtool_ops = {
2207         .begin = check_if_running,
2208         .get_drvinfo = smc_get_drvinfo,
2209         .get_settings = smc_get_settings,
2210         .set_settings = smc_set_settings,
2211         .get_link = smc_get_link,
2212 #ifdef PCMCIA_DEBUG
2213         .get_msglevel = smc_get_msglevel,
2214         .set_msglevel = smc_set_msglevel,
2215 #endif
2216         .nway_reset = smc_nway_reset,
2217 };
2218
2219 static int smc_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
2220 {
2221         struct smc_private *smc = netdev_priv(dev);
2222         struct mii_ioctl_data *mii = if_mii(rq);
2223         int rc = 0;
2224         u16 saved_bank;
2225         kio_addr_t ioaddr = dev->base_addr;
2226
2227         if (!netif_running(dev))
2228                 return -EINVAL;
2229
2230         spin_lock_irq(&smc->lock);
2231         saved_bank = inw(ioaddr + BANK_SELECT);
2232         SMC_SELECT_BANK(3);
2233         rc = generic_mii_ioctl(&smc->mii_if, mii, cmd, NULL);
2234         SMC_SELECT_BANK(saved_bank);
2235         spin_unlock_irq(&smc->lock);
2236         return rc;
2237 }
2238
2239 static struct pcmcia_device_id smc91c92_ids[] = {
2240         PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0109, 0x0501),
2241         PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0140, 0x000a),
2242         PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "CC/XJEM3288", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x04cd2988, 0x46a52d63),
2243         PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "CC/XJEM3336", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x0143b773, 0x46a52d63),
2244         PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "EM1144T", "PCMCIA MODEM", 0xf510db04, 0x856d66c8, 0xbd6c43ef),
2245         PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "XJEM1144/CCEM1144", "PCMCIA MODEM", 0xf510db04, 0x52d21e1e, 0xbd6c43ef),
2246         PCMCIA_PFC_DEVICE_PROD_ID12(0, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c),
2247         PCMCIA_PFC_DEVICE_PROD_ID12(0, "MEGAHERTZ", "XJEM1144/CCEM1144", 0xf510db04, 0x52d21e1e),
2248         PCMCIA_PFC_DEVICE_PROD_ID12(0, "Ositech", "Trumpcard:Jack of Diamonds Modem+Ethernet", 0xc2f80cd, 0x656947b9),
2249         PCMCIA_PFC_DEVICE_PROD_ID12(0, "Ositech", "Trumpcard:Jack of Hearts Modem+Ethernet", 0xc2f80cd, 0xdc9ba5ed),
2250         PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x016c, 0x0020),
2251         PCMCIA_DEVICE_MANF_CARD(0x016c, 0x0023),
2252         PCMCIA_DEVICE_PROD_ID123("BASICS by New Media Corporation", "Ethernet", "SMC91C94", 0x23c78a9d, 0x00b2e941, 0xcef397fb),
2253         PCMCIA_DEVICE_PROD_ID12("ARGOSY", "Fast Ethernet PCCard", 0x78f308dc, 0xdcea68bc),
2254         PCMCIA_DEVICE_PROD_ID12("dit Co., Ltd.", "PC Card-10/100BTX", 0xe59365c8, 0x6a2161d1),
2255         PCMCIA_DEVICE_PROD_ID12("DYNALINK", "L100C", 0x6a26d1cf, 0xc16ce9c5),
2256         PCMCIA_DEVICE_PROD_ID12("Farallon", "Farallon Enet", 0x58d93fc4, 0x244734e9),
2257         PCMCIA_DEVICE_PROD_ID12("Megahertz", "CC10BT/2", 0x33234748, 0x3c95b953),
2258         PCMCIA_DEVICE_PROD_ID12("MELCO/SMC", "LPC-TX", 0xa2cd8e6d, 0x42da662a),
2259         PCMCIA_DEVICE_PROD_ID12("Ositech", "Trumpcard:Four of Diamonds Ethernet", 0xc2f80cd, 0xb3466314),
2260         PCMCIA_DEVICE_PROD_ID12("Ositech", "Trumpcard:Seven of Diamonds Ethernet", 0xc2f80cd, 0x194b650a),
2261         PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Fast Ethernet PCCard", 0x281f1c5d, 0xdcea68bc),
2262         PCMCIA_DEVICE_PROD_ID12("Psion", "10Mb Ethernet", 0x4ef00b21, 0x844be9e9),
2263         PCMCIA_DEVICE_PROD_ID12("SMC", "EtherEZ Ethernet 8020", 0xc4f8b18b, 0x4a0eeb2d),
2264         /* These conflict with other cards! */
2265         /* PCMCIA_DEVICE_MANF_CARD(0x0186, 0x0100), */
2266         /* PCMCIA_DEVICE_MANF_CARD(0x8a01, 0xc1ab), */
2267         PCMCIA_DEVICE_NULL,
2268 };
2269 MODULE_DEVICE_TABLE(pcmcia, smc91c92_ids);
2270
2271 static struct pcmcia_driver smc91c92_cs_driver = {
2272         .owner          = THIS_MODULE,
2273         .drv            = {
2274                 .name   = "smc91c92_cs",
2275         },
2276         .probe          = smc91c92_probe,
2277         .remove         = smc91c92_detach,
2278         .id_table       = smc91c92_ids,
2279         .suspend        = smc91c92_suspend,
2280         .resume         = smc91c92_resume,
2281 };
2282
2283 static int __init init_smc91c92_cs(void)
2284 {
2285         return pcmcia_register_driver(&smc91c92_cs_driver);
2286 }
2287
2288 static void __exit exit_smc91c92_cs(void)
2289 {
2290         pcmcia_unregister_driver(&smc91c92_cs_driver);
2291 }
2292
2293 module_init(init_smc91c92_cs);
2294 module_exit(exit_smc91c92_cs);