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