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