1 /*======================================================================
3 A PCMCIA ethernet driver for SMC91c92-based cards.
5 This driver supports Megahertz PCMCIA ethernet cards; and
6 Megahertz, Motorola, Ositech, and Psion Dacom ethernet/modem
9 Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net
11 smc91c92_cs.c 1.122 2002/10/25 06:26:39
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.
23 This software may be used and distributed according to the terms of
24 the GNU General Public License, incorporated herein by reference.
26 ======================================================================*/
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>
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>
56 #include <asm/system.h>
57 #include <asm/uaccess.h>
59 /*====================================================================*/
61 static const char *if_names[] = { "auto", "10baseT", "10base2"};
64 #define FIRMWARE_NAME "ositech/Xilinx7OD.bin"
66 /* Module parameters */
68 MODULE_DESCRIPTION("SMC 91c92 series PCMCIA ethernet driver");
69 MODULE_LICENSE("GPL");
70 MODULE_FIRMWARE(FIRMWARE_NAME);
72 #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
75 Transceiver/media type.
77 1 = 10baseT (and autoselect if #define AUTOSELECT),
80 INT_MODULE_PARM(if_port, 0);
83 INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
84 static const char *version =
85 "smc91c92_cs.c 1.123 2006/11/09 Donald Becker, becker@scyld.com.\n";
86 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
88 #define DEBUG(n, args...)
91 #define DRV_NAME "smc91c92_cs"
92 #define DRV_VERSION "1.123"
94 /*====================================================================*/
96 /* Operational parameter that usually are not changed. */
98 /* Time in jiffies before concluding Tx hung */
99 #define TX_TIMEOUT ((400*HZ)/1000)
101 /* Maximum events (Rx packets, etc.) to handle at each interrupt. */
104 /* Times to check the check the chip before concluding that it doesn't
105 currently have room for another Tx packet. */
106 #define MEMORY_WAIT_TIME 8
109 struct pcmcia_device *p_dev;
115 struct sk_buff *saved_skb;
119 struct timer_list media;
120 int watchdog, tx_err;
121 u_short media_status;
124 struct mii_if_info mii_if;
135 /* Special definitions for Megahertz multifunction cards */
136 #define MEGAHERTZ_ISR 0x0380
138 /* Special function registers for Motorola Mariner */
139 #define MOT_LAN 0x0000
140 #define MOT_UART 0x0020
141 #define MOT_EEPROM 0x20
144 (COR_LEVEL_REQ | COR_FUNC_ENA | COR_ADDR_DECODE | COR_IREQ_ENA)
146 /* Special function registers for Ositech cards */
147 #define OSITECH_AUI_CTL 0x0c
148 #define OSITECH_PWRDOWN 0x0d
149 #define OSITECH_RESET 0x0e
150 #define OSITECH_ISR 0x0f
151 #define OSITECH_AUI_PWR 0x0c
152 #define OSITECH_RESET_ISR 0x0e
154 #define OSI_AUI_PWR 0x40
155 #define OSI_LAN_PWRDOWN 0x02
156 #define OSI_MODEM_PWRDOWN 0x01
157 #define OSI_LAN_RESET 0x02
158 #define OSI_MODEM_RESET 0x01
160 /* Symbolic constants for the SMC91c9* series chips, from Erik Stahlman. */
161 #define BANK_SELECT 14 /* Window select register. */
162 #define SMC_SELECT_BANK(x) { outw(x, ioaddr + BANK_SELECT); }
164 /* Bank 0 registers. */
165 #define TCR 0 /* transmit control register */
166 #define TCR_CLEAR 0 /* do NOTHING */
167 #define TCR_ENABLE 0x0001 /* if this is 1, we can transmit */
168 #define TCR_PAD_EN 0x0080 /* pads short packets to 64 bytes */
169 #define TCR_MONCSN 0x0400 /* Monitor Carrier. */
170 #define TCR_FDUPLX 0x0800 /* Full duplex mode. */
171 #define TCR_NORMAL TCR_ENABLE | TCR_PAD_EN
173 #define EPH 2 /* Ethernet Protocol Handler report. */
174 #define EPH_TX_SUC 0x0001
175 #define EPH_SNGLCOL 0x0002
176 #define EPH_MULCOL 0x0004
177 #define EPH_LTX_MULT 0x0008
178 #define EPH_16COL 0x0010
179 #define EPH_SQET 0x0020
180 #define EPH_LTX_BRD 0x0040
181 #define EPH_TX_DEFR 0x0080
182 #define EPH_LAT_COL 0x0200
183 #define EPH_LOST_CAR 0x0400
184 #define EPH_EXC_DEF 0x0800
185 #define EPH_CTR_ROL 0x1000
186 #define EPH_RX_OVRN 0x2000
187 #define EPH_LINK_OK 0x4000
188 #define EPH_TX_UNRN 0x8000
189 #define MEMINFO 8 /* Memory Information Register */
190 #define MEMCFG 10 /* Memory Configuration Register */
192 /* Bank 1 registers. */
194 #define CFG_MII_SELECT 0x8000 /* 91C100 only */
195 #define CFG_NO_WAIT 0x1000
196 #define CFG_FULL_STEP 0x0400
197 #define CFG_SET_SQLCH 0x0200
198 #define CFG_AUI_SELECT 0x0100
199 #define CFG_16BIT 0x0080
200 #define CFG_DIS_LINK 0x0040
201 #define CFG_STATIC 0x0030
202 #define CFG_IRQ_SEL_1 0x0004
203 #define CFG_IRQ_SEL_0 0x0002
208 #define CTL_STORE 0x0001
209 #define CTL_RELOAD 0x0002
210 #define CTL_EE_SELECT 0x0004
211 #define CTL_TE_ENABLE 0x0020
212 #define CTL_CR_ENABLE 0x0040
213 #define CTL_LE_ENABLE 0x0080
214 #define CTL_AUTO_RELEASE 0x0800
215 #define CTL_POWERDOWN 0x2000
217 /* Bank 2 registers. */
219 #define MC_ALLOC 0x20 /* or with number of 256 byte packets */
220 #define MC_RESET 0x40
221 #define MC_RELEASE 0x80 /* remove and release the current rx packet */
222 #define MC_FREEPKT 0xA0 /* Release packet in PNR register */
223 #define MC_ENQUEUE 0xC0 /* Enqueue the packet for transmit */
226 #define FP_RXEMPTY 0x8000
228 #define PTR_AUTO_INC 0x0040
229 #define PTR_READ 0x2000
230 #define PTR_AUTOINC 0x4000
231 #define PTR_RCV 0x8000
234 #define IM_RCV_INT 0x1
235 #define IM_TX_INT 0x2
236 #define IM_TX_EMPTY_INT 0x4
237 #define IM_ALLOC_INT 0x8
238 #define IM_RX_OVRN_INT 0x10
239 #define IM_EPH_INT 0x20
242 enum RxCfg { RxAllMulti = 0x0004, RxPromisc = 0x0002,
243 RxEnable = 0x0100, RxStripCRC = 0x0200};
244 #define RCR_SOFTRESET 0x8000 /* resets the chip */
245 #define RCR_STRIP_CRC 0x200 /* strips CRC */
246 #define RCR_ENABLE 0x100 /* IFF this is set, we can receive packets */
247 #define RCR_ALMUL 0x4 /* receive all multicast packets */
248 #define RCR_PROMISC 0x2 /* enable promiscuous mode */
250 /* the normal settings for the RCR register : */
251 #define RCR_NORMAL (RCR_STRIP_CRC | RCR_ENABLE)
252 #define RCR_CLEAR 0x0 /* set it to a base state */
255 /* BANK 3 -- not the same values as in smc9194! */
261 #define REVISION 0x0a
263 /* Transmit status bits. */
264 #define TS_SUCCESS 0x0001
265 #define TS_16COL 0x0010
266 #define TS_LATCOL 0x0200
267 #define TS_LOSTCAR 0x0400
269 /* Receive status bits. */
270 #define RS_ALGNERR 0x8000
271 #define RS_BADCRC 0x2000
272 #define RS_ODDFRAME 0x1000
273 #define RS_TOOLONG 0x0800
274 #define RS_TOOSHORT 0x0400
275 #define RS_MULTICAST 0x0001
276 #define RS_ERRORS (RS_ALGNERR | RS_BADCRC | RS_TOOLONG | RS_TOOSHORT)
278 #define set_bits(v, p) outw(inw(p)|(v), (p))
279 #define mask_bits(v, p) outw(inw(p)&(v), (p))
281 /*====================================================================*/
283 static void smc91c92_detach(struct pcmcia_device *p_dev);
284 static int smc91c92_config(struct pcmcia_device *link);
285 static void smc91c92_release(struct pcmcia_device *link);
287 static int smc_open(struct net_device *dev);
288 static int smc_close(struct net_device *dev);
289 static int smc_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
290 static void smc_tx_timeout(struct net_device *dev);
291 static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev);
292 static irqreturn_t smc_interrupt(int irq, void *dev_id);
293 static void smc_rx(struct net_device *dev);
294 static void set_rx_mode(struct net_device *dev);
295 static int s9k_config(struct net_device *dev, struct ifmap *map);
296 static void smc_set_xcvr(struct net_device *dev, int if_port);
297 static void smc_reset(struct net_device *dev);
298 static void media_check(u_long arg);
299 static void mdio_sync(unsigned int addr);
300 static int mdio_read(struct net_device *dev, int phy_id, int loc);
301 static void mdio_write(struct net_device *dev, int phy_id, int loc, int value);
302 static int smc_link_ok(struct net_device *dev);
303 static const struct ethtool_ops ethtool_ops;
305 static const struct net_device_ops smc_netdev_ops = {
306 .ndo_open = smc_open,
307 .ndo_stop = smc_close,
308 .ndo_start_xmit = smc_start_xmit,
309 .ndo_tx_timeout = smc_tx_timeout,
310 .ndo_set_config = s9k_config,
311 .ndo_set_multicast_list = set_rx_mode,
312 .ndo_do_ioctl = &smc_ioctl,
313 .ndo_change_mtu = eth_change_mtu,
314 .ndo_set_mac_address = eth_mac_addr,
315 .ndo_validate_addr = eth_validate_addr,
318 /*======================================================================
320 smc91c92_attach() creates an "instance" of the driver, allocating
321 local data structures for one device. The device is registered
324 ======================================================================*/
326 static int smc91c92_probe(struct pcmcia_device *link)
328 struct smc_private *smc;
329 struct net_device *dev;
331 DEBUG(0, "smc91c92_attach()\n");
333 /* Create new ethernet device */
334 dev = alloc_etherdev(sizeof(struct smc_private));
337 smc = netdev_priv(dev);
341 spin_lock_init(&smc->lock);
342 link->io.NumPorts1 = 16;
343 link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
344 link->io.IOAddrLines = 4;
345 link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_HANDLE_PRESENT;
346 link->irq.IRQInfo1 = IRQ_LEVEL_ID;
347 link->irq.Handler = &smc_interrupt;
348 link->irq.Instance = dev;
349 link->conf.Attributes = CONF_ENABLE_IRQ;
350 link->conf.IntType = INT_MEMORY_AND_IO;
352 /* The SMC91c92-specific entries in the device structure. */
353 dev->netdev_ops = &smc_netdev_ops;
354 SET_ETHTOOL_OPS(dev, ðtool_ops);
355 dev->watchdog_timeo = TX_TIMEOUT;
357 smc->mii_if.dev = dev;
358 smc->mii_if.mdio_read = mdio_read;
359 smc->mii_if.mdio_write = mdio_write;
360 smc->mii_if.phy_id_mask = 0x1f;
361 smc->mii_if.reg_num_mask = 0x1f;
363 return smc91c92_config(link);
364 } /* smc91c92_attach */
366 /*======================================================================
368 This deletes a driver "instance". The device is de-registered
369 with Card Services. If it has been released, all local data
370 structures are freed. Otherwise, the structures will be freed
371 when the device is released.
373 ======================================================================*/
375 static void smc91c92_detach(struct pcmcia_device *link)
377 struct net_device *dev = link->priv;
379 DEBUG(0, "smc91c92_detach(0x%p)\n", link);
382 unregister_netdev(dev);
384 smc91c92_release(link);
387 } /* smc91c92_detach */
389 /*====================================================================*/
391 static int cvt_ascii_address(struct net_device *dev, char *s)
397 for (i = 0; i < 6; i++) {
399 for (j = 0; j < 2; j++) {
402 da += ((c >= '0') && (c <= '9')) ?
403 (c - '0') : ((c & 0x0f) + 9);
405 dev->dev_addr[i] = da;
410 /*====================================================================*/
412 static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple,
417 i = pcmcia_get_first_tuple(handle, tuple);
420 i = pcmcia_get_tuple_data(handle, tuple);
423 return pcmcia_parse_tuple(tuple, parse);
426 static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple,
431 if ((i = pcmcia_get_next_tuple(handle, tuple)) != 0 ||
432 (i = pcmcia_get_tuple_data(handle, tuple)) != 0)
434 return pcmcia_parse_tuple(tuple, parse);
437 /*======================================================================
439 Configuration stuff for Megahertz cards
441 mhz_3288_power() is used to power up a 3288's ethernet chip.
442 mhz_mfc_config() handles socket setup for multifunction (1144
443 and 3288) cards. mhz_setup() gets a card's hardware ethernet
446 ======================================================================*/
448 static int mhz_3288_power(struct pcmcia_device *link)
450 struct net_device *dev = link->priv;
451 struct smc_private *smc = netdev_priv(dev);
454 /* Read the ISR twice... */
455 readb(smc->base+MEGAHERTZ_ISR);
457 readb(smc->base+MEGAHERTZ_ISR);
462 /* Now read and write the COR... */
463 tmp = readb(smc->base + link->conf.ConfigBase + CISREG_COR);
465 writeb(tmp, smc->base + link->conf.ConfigBase + CISREG_COR);
470 static int mhz_mfc_config_check(struct pcmcia_device *p_dev,
471 cistpl_cftable_entry_t *cf,
472 cistpl_cftable_entry_t *dflt,
477 p_dev->io.BasePort2 = cf->io.win[0].base;
478 for (k = 0; k < 0x400; k += 0x10) {
481 p_dev->io.BasePort1 = k ^ 0x300;
482 if (!pcmcia_request_io(p_dev, &p_dev->io))
488 static int mhz_mfc_config(struct pcmcia_device *link)
490 struct net_device *dev = link->priv;
491 struct smc_private *smc = netdev_priv(dev);
492 struct smc_cfg_mem *cfg_mem;
497 cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
501 link->conf.Attributes |= CONF_ENABLE_SPKR;
502 link->conf.Status = CCSR_AUDIO_ENA;
503 link->irq.Attributes =
504 IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
505 link->io.IOAddrLines = 16;
506 link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
507 link->io.NumPorts2 = 8;
509 /* The Megahertz combo cards have modem-like CIS entries, so
510 we have to explicitly try a bunch of port combinations. */
511 if (pcmcia_loop_config(link, mhz_mfc_config_check, NULL))
513 dev->base_addr = link->io.BasePort1;
515 /* Allocate a memory window, for accessing the ISR */
516 req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
517 req.Base = req.Size = 0;
519 i = pcmcia_request_window(&link, &req, &link->win);
522 smc->base = ioremap(req.Base, req.Size);
523 mem.CardOffset = mem.Page = 0;
524 if (smc->manfid == MANFID_MOTOROLA)
525 mem.CardOffset = link->conf.ConfigBase;
526 i = pcmcia_map_mem_page(link->win, &mem);
529 && (smc->manfid == MANFID_MEGAHERTZ)
530 && (smc->cardid == PRODID_MEGAHERTZ_EM3288))
531 mhz_3288_power(link);
538 static int mhz_setup(struct pcmcia_device *link)
540 struct net_device *dev = link->priv;
541 struct smc_cfg_mem *cfg_mem;
544 u_char *buf, *station_addr;
547 cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
551 tuple = &cfg_mem->tuple;
552 parse = &cfg_mem->parse;
555 tuple->Attributes = tuple->TupleOffset = 0;
556 tuple->TupleData = (cisdata_t *)buf;
557 tuple->TupleDataMax = 255;
559 /* Read the station address from the CIS. It is stored as the last
560 (fourth) string in the Version 1 Version/ID tuple. */
561 tuple->DesiredTuple = CISTPL_VERS_1;
562 if (first_tuple(link, tuple, parse) != 0) {
566 /* Ugh -- the EM1144 card has two VERS_1 tuples!?! */
567 if (next_tuple(link, tuple, parse) != 0)
568 first_tuple(link, tuple, parse);
569 if (parse->version_1.ns > 3) {
570 station_addr = parse->version_1.str + parse->version_1.ofs[3];
571 if (cvt_ascii_address(dev, station_addr) == 0) {
577 /* Another possibility: for the EM3288, in a special tuple */
578 tuple->DesiredTuple = 0x81;
579 if (pcmcia_get_first_tuple(link, tuple) != 0) {
583 if (pcmcia_get_tuple_data(link, tuple) != 0) {
588 if (cvt_ascii_address(dev, buf) == 0) {
598 /*======================================================================
600 Configuration stuff for the Motorola Mariner
602 mot_config() writes directly to the Mariner configuration
603 registers because the CIS is just bogus.
605 ======================================================================*/
607 static void mot_config(struct pcmcia_device *link)
609 struct net_device *dev = link->priv;
610 struct smc_private *smc = netdev_priv(dev);
611 unsigned int ioaddr = dev->base_addr;
612 unsigned int iouart = link->io.BasePort2;
614 /* Set UART base address and force map with COR bit 1 */
615 writeb(iouart & 0xff, smc->base + MOT_UART + CISREG_IOBASE_0);
616 writeb((iouart >> 8) & 0xff, smc->base + MOT_UART + CISREG_IOBASE_1);
617 writeb(MOT_NORMAL, smc->base + MOT_UART + CISREG_COR);
619 /* Set SMC base address and force map with COR bit 1 */
620 writeb(ioaddr & 0xff, smc->base + MOT_LAN + CISREG_IOBASE_0);
621 writeb((ioaddr >> 8) & 0xff, smc->base + MOT_LAN + CISREG_IOBASE_1);
622 writeb(MOT_NORMAL, smc->base + MOT_LAN + CISREG_COR);
624 /* Wait for things to settle down */
628 static int mot_setup(struct pcmcia_device *link)
630 struct net_device *dev = link->priv;
631 unsigned int ioaddr = dev->base_addr;
635 /* Read Ethernet address from Serial EEPROM */
637 for (i = 0; i < 3; i++) {
639 outw(MOT_EEPROM + i, ioaddr + POINTER);
641 outw((CTL_RELOAD | CTL_EE_SELECT), ioaddr + CONTROL);
643 for (loop = wait = 0; loop < 200; loop++) {
645 wait = ((CTL_RELOAD | CTL_STORE) & inw(ioaddr + CONTROL));
646 if (wait == 0) break;
652 addr = inw(ioaddr + GENERAL);
653 dev->dev_addr[2*i] = addr & 0xff;
654 dev->dev_addr[2*i+1] = (addr >> 8) & 0xff;
660 /*====================================================================*/
662 static int smc_configcheck(struct pcmcia_device *p_dev,
663 cistpl_cftable_entry_t *cf,
664 cistpl_cftable_entry_t *dflt,
668 p_dev->io.BasePort1 = cf->io.win[0].base;
669 p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK;
670 return pcmcia_request_io(p_dev, &p_dev->io);
673 static int smc_config(struct pcmcia_device *link)
675 struct net_device *dev = link->priv;
678 link->io.NumPorts1 = 16;
679 i = pcmcia_loop_config(link, smc_configcheck, NULL);
681 dev->base_addr = link->io.BasePort1;
686 static int smc_setup(struct pcmcia_device *link)
688 struct net_device *dev = link->priv;
689 struct smc_cfg_mem *cfg_mem;
692 cistpl_lan_node_id_t *node_id;
693 u_char *buf, *station_addr;
696 cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
700 tuple = &cfg_mem->tuple;
701 parse = &cfg_mem->parse;
704 tuple->Attributes = tuple->TupleOffset = 0;
705 tuple->TupleData = (cisdata_t *)buf;
706 tuple->TupleDataMax = 255;
708 /* Check for a LAN function extension tuple */
709 tuple->DesiredTuple = CISTPL_FUNCE;
710 i = first_tuple(link, tuple, parse);
712 if (parse->funce.type == CISTPL_FUNCE_LAN_NODE_ID)
714 i = next_tuple(link, tuple, parse);
717 node_id = (cistpl_lan_node_id_t *)parse->funce.data;
718 if (node_id->nb == 6) {
719 for (i = 0; i < 6; i++)
720 dev->dev_addr[i] = node_id->id[i];
725 /* Try the third string in the Version 1 Version/ID tuple. */
726 if (link->prod_id[2]) {
727 station_addr = link->prod_id[2];
728 if (cvt_ascii_address(dev, station_addr) == 0) {
740 /*====================================================================*/
742 static int osi_config(struct pcmcia_device *link)
744 struct net_device *dev = link->priv;
745 static const unsigned int com[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
748 link->conf.Attributes |= CONF_ENABLE_SPKR;
749 link->conf.Status = CCSR_AUDIO_ENA;
750 link->irq.Attributes =
751 IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
752 link->io.NumPorts1 = 64;
753 link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
754 link->io.NumPorts2 = 8;
755 link->io.IOAddrLines = 16;
757 /* Enable Hard Decode, LAN, Modem */
758 link->conf.ConfigIndex = 0x23;
760 for (i = j = 0; j < 4; j++) {
761 link->io.BasePort2 = com[j];
762 i = pcmcia_request_io(link, &link->io);
767 /* Fallback: turn off hard decode */
768 link->conf.ConfigIndex = 0x03;
769 link->io.NumPorts2 = 0;
770 i = pcmcia_request_io(link, &link->io);
772 dev->base_addr = link->io.BasePort1 + 0x10;
776 static int osi_load_firmware(struct pcmcia_device *link)
778 const struct firmware *fw;
781 err = request_firmware(&fw, FIRMWARE_NAME, &link->dev);
783 pr_err("Failed to load firmware \"%s\"\n", FIRMWARE_NAME);
787 /* Download the Seven of Diamonds firmware */
788 for (i = 0; i < fw->size; i++) {
789 outb(fw->data[i], link->io.BasePort1 + 2);
792 release_firmware(fw);
796 static int osi_setup(struct pcmcia_device *link, u_short manfid, u_short cardid)
798 struct net_device *dev = link->priv;
799 struct smc_cfg_mem *cfg_mem;
804 cfg_mem = kmalloc(sizeof(struct smc_cfg_mem), GFP_KERNEL);
808 tuple = &cfg_mem->tuple;
811 tuple->Attributes = TUPLE_RETURN_COMMON;
812 tuple->TupleData = (cisdata_t *)buf;
813 tuple->TupleDataMax = 255;
814 tuple->TupleOffset = 0;
816 /* Read the station address from tuple 0x90, subtuple 0x04 */
817 tuple->DesiredTuple = 0x90;
818 i = pcmcia_get_first_tuple(link, tuple);
820 i = pcmcia_get_tuple_data(link, tuple);
821 if ((i != 0) || (buf[0] == 0x04))
823 i = pcmcia_get_next_tuple(link, tuple);
829 for (i = 0; i < 6; i++)
830 dev->dev_addr[i] = buf[i+2];
832 if (((manfid == MANFID_OSITECH) &&
833 (cardid == PRODID_OSITECH_SEVEN)) ||
834 ((manfid == MANFID_PSION) &&
835 (cardid == PRODID_PSION_NET100))) {
836 rc = osi_load_firmware(link);
839 } else if (manfid == MANFID_OSITECH) {
840 /* Make sure both functions are powered up */
841 set_bits(0x300, link->io.BasePort1 + OSITECH_AUI_PWR);
842 /* Now, turn on the interrupt for both card functions */
843 set_bits(0x300, link->io.BasePort1 + OSITECH_RESET_ISR);
844 DEBUG(2, "AUI/PWR: %4.4x RESET/ISR: %4.4x\n",
845 inw(link->io.BasePort1 + OSITECH_AUI_PWR),
846 inw(link->io.BasePort1 + OSITECH_RESET_ISR));
854 static int smc91c92_suspend(struct pcmcia_device *link)
856 struct net_device *dev = link->priv;
859 netif_device_detach(dev);
864 static int smc91c92_resume(struct pcmcia_device *link)
866 struct net_device *dev = link->priv;
867 struct smc_private *smc = netdev_priv(dev);
870 if ((smc->manfid == MANFID_MEGAHERTZ) &&
871 (smc->cardid == PRODID_MEGAHERTZ_EM3288))
872 mhz_3288_power(link);
873 if (smc->manfid == MANFID_MOTOROLA)
875 if ((smc->manfid == MANFID_OSITECH) &&
876 (smc->cardid != PRODID_OSITECH_SEVEN)) {
877 /* Power up the card and enable interrupts */
878 set_bits(0x0300, dev->base_addr-0x10+OSITECH_AUI_PWR);
879 set_bits(0x0300, dev->base_addr-0x10+OSITECH_RESET_ISR);
881 if (((smc->manfid == MANFID_OSITECH) &&
882 (smc->cardid == PRODID_OSITECH_SEVEN)) ||
883 ((smc->manfid == MANFID_PSION) &&
884 (smc->cardid == PRODID_PSION_NET100))) {
885 i = osi_load_firmware(link);
887 pr_err("smc91c92_cs: Failed to load firmware\n");
893 netif_device_attach(dev);
900 /*======================================================================
902 This verifies that the chip is some SMC91cXX variant, and returns
903 the revision code if successful. Otherwise, it returns -ENODEV.
905 ======================================================================*/
907 static int check_sig(struct pcmcia_device *link)
909 struct net_device *dev = link->priv;
910 unsigned int ioaddr = dev->base_addr;
915 if (inw(ioaddr + BANK_SELECT) >> 8 != 0x33) {
916 /* Try powering up the chip */
917 outw(0, ioaddr + CONTROL);
921 /* Try setting bus width */
922 width = (link->io.Attributes1 == IO_DATA_PATH_WIDTH_AUTO);
923 s = inb(ioaddr + CONFIG);
928 outb(s, ioaddr + CONFIG);
930 /* Check Base Address Register to make sure bus width is OK */
931 s = inw(ioaddr + BASE_ADDR);
932 if ((inw(ioaddr + BANK_SELECT) >> 8 == 0x33) &&
933 ((s >> 8) != (s & 0xff))) {
935 s = inw(ioaddr + REVISION);
941 .Attributes = CONF_IO_CHANGE_WIDTH,
943 printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n");
945 smc91c92_suspend(link);
946 pcmcia_modify_configuration(link, &mod);
947 smc91c92_resume(link);
948 return check_sig(link);
953 /*======================================================================
955 smc91c92_config() is scheduled to run after a CARD_INSERTION event
956 is received, to configure the PCMCIA socket, and to make the
957 ethernet device available to the system.
959 ======================================================================*/
961 #define CS_EXIT_TEST(ret, svc, label) \
963 cs_error(link, svc, ret); \
967 static int smc91c92_config(struct pcmcia_device *link)
969 struct net_device *dev = link->priv;
970 struct smc_private *smc = netdev_priv(dev);
976 DEBUG(0, "smc91c92_config(0x%p)\n", link);
978 smc->manfid = link->manf_id;
979 smc->cardid = link->card_id;
981 if ((smc->manfid == MANFID_OSITECH) &&
982 (smc->cardid != PRODID_OSITECH_SEVEN)) {
983 i = osi_config(link);
984 } else if ((smc->manfid == MANFID_MOTOROLA) ||
985 ((smc->manfid == MANFID_MEGAHERTZ) &&
986 ((smc->cardid == PRODID_MEGAHERTZ_VARIOUS) ||
987 (smc->cardid == PRODID_MEGAHERTZ_EM3288)))) {
988 i = mhz_mfc_config(link);
990 i = smc_config(link);
992 CS_EXIT_TEST(i, RequestIO, config_failed);
994 i = pcmcia_request_irq(link, &link->irq);
995 CS_EXIT_TEST(i, RequestIRQ, config_failed);
996 i = pcmcia_request_configuration(link, &link->conf);
997 CS_EXIT_TEST(i, RequestConfiguration, config_failed);
999 if (smc->manfid == MANFID_MOTOROLA)
1002 dev->irq = link->irq.AssignedIRQ;
1004 if ((if_port >= 0) && (if_port <= 2))
1005 dev->if_port = if_port;
1007 printk(KERN_NOTICE "smc91c92_cs: invalid if_port requested\n");
1009 switch (smc->manfid) {
1010 case MANFID_OSITECH:
1012 i = osi_setup(link, smc->manfid, smc->cardid); break;
1014 case MANFID_NEW_MEDIA:
1015 i = smc_setup(link); break;
1016 case 0x128: /* For broken Megahertz cards */
1017 case MANFID_MEGAHERTZ:
1018 i = mhz_setup(link); break;
1019 case MANFID_MOTOROLA:
1020 default: /* get the hw address from EEPROM */
1021 i = mot_setup(link); break;
1025 printk(KERN_NOTICE "smc91c92_cs: Unable to find hardware address.\n");
1032 rev = check_sig(link);
1036 case 3: name = "92"; break;
1037 case 4: name = ((rev & 15) >= 6) ? "96" : "94"; break;
1038 case 5: name = "95"; break;
1039 case 7: name = "100"; break;
1040 case 8: name = "100-FD"; break;
1041 case 9: name = "110"; break;
1044 ioaddr = dev->base_addr;
1048 mir = inw(ioaddr + MEMINFO) & 0xff;
1049 if (mir == 0xff) mir++;
1050 /* Get scale factor for memory size */
1051 mcr = ((rev >> 4) > 3) ? inw(ioaddr + MEMCFG) : 0x0200;
1052 mir *= 128 * (1<<((mcr >> 9) & 7));
1054 smc->cfg = inw(ioaddr + CONFIG) & ~CFG_AUI_SELECT;
1055 smc->cfg |= CFG_NO_WAIT | CFG_16BIT | CFG_STATIC;
1056 if (smc->manfid == MANFID_OSITECH)
1057 smc->cfg |= CFG_IRQ_SEL_1 | CFG_IRQ_SEL_0;
1058 if ((rev >> 4) >= 7)
1059 smc->cfg |= CFG_MII_SELECT;
1063 if (smc->cfg & CFG_MII_SELECT) {
1066 for (i = 0; i < 32; i++) {
1067 j = mdio_read(dev, i, 1);
1068 if ((j != 0) && (j != 0xffff)) break;
1070 smc->mii_if.phy_id = (i < 32) ? i : -1;
1075 link->dev_node = &smc->node;
1076 SET_NETDEV_DEV(dev, &handle_to_dev(link));
1078 if (register_netdev(dev) != 0) {
1079 printk(KERN_ERR "smc91c92_cs: register_netdev() failed\n");
1080 link->dev_node = NULL;
1084 strcpy(smc->node.dev_name, dev->name);
1086 printk(KERN_INFO "%s: smc91c%s rev %d: io %#3lx, irq %d, "
1088 dev->name, name, (rev & 0x0f), dev->base_addr, dev->irq,
1093 printk(KERN_INFO " %lu byte", mir);
1095 printk(KERN_INFO " %lu kb", mir>>10);
1096 printk(" buffer, %s xcvr\n", (smc->cfg & CFG_MII_SELECT) ?
1097 "MII" : if_names[dev->if_port]);
1100 if (smc->cfg & CFG_MII_SELECT) {
1101 if (smc->mii_if.phy_id != -1) {
1102 DEBUG(0, " MII transceiver at index %d, status %x.\n",
1103 smc->mii_if.phy_id, j);
1105 printk(KERN_NOTICE " No MII transceivers found!\n");
1111 unregister_netdev(dev);
1112 config_failed: /* CS_EXIT_TEST() calls jump to here... */
1113 smc91c92_release(link);
1115 } /* smc91c92_config */
1117 /*======================================================================
1119 After a card is removed, smc91c92_release() will unregister the net
1120 device, and release the PCMCIA configuration. If the device is
1121 still open, this will be postponed until it is closed.
1123 ======================================================================*/
1125 static void smc91c92_release(struct pcmcia_device *link)
1127 DEBUG(0, "smc91c92_release(0x%p)\n", link);
1129 struct net_device *dev = link->priv;
1130 struct smc_private *smc = netdev_priv(dev);
1133 pcmcia_disable_device(link);
1136 /*======================================================================
1138 MII interface support for SMC91cXX based cards
1139 ======================================================================*/
1141 #define MDIO_SHIFT_CLK 0x04
1142 #define MDIO_DATA_OUT 0x01
1143 #define MDIO_DIR_WRITE 0x08
1144 #define MDIO_DATA_WRITE0 (MDIO_DIR_WRITE)
1145 #define MDIO_DATA_WRITE1 (MDIO_DIR_WRITE | MDIO_DATA_OUT)
1146 #define MDIO_DATA_READ 0x02
1148 static void mdio_sync(unsigned int addr)
1151 for (bits = 0; bits < 32; bits++) {
1152 outb(MDIO_DATA_WRITE1, addr);
1153 outb(MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, addr);
1157 static int mdio_read(struct net_device *dev, int phy_id, int loc)
1159 unsigned int addr = dev->base_addr + MGMT;
1160 u_int cmd = (0x06<<10)|(phy_id<<5)|loc;
1164 for (i = 13; i >= 0; i--) {
1165 int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
1167 outb(dat | MDIO_SHIFT_CLK, addr);
1169 for (i = 19; i > 0; i--) {
1171 retval = (retval << 1) | ((inb(addr) & MDIO_DATA_READ) != 0);
1172 outb(MDIO_SHIFT_CLK, addr);
1174 return (retval>>1) & 0xffff;
1177 static void mdio_write(struct net_device *dev, int phy_id, int loc, int value)
1179 unsigned int addr = dev->base_addr + MGMT;
1180 u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value;
1184 for (i = 31; i >= 0; i--) {
1185 int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0;
1187 outb(dat | MDIO_SHIFT_CLK, addr);
1189 for (i = 1; i >= 0; i--) {
1191 outb(MDIO_SHIFT_CLK, addr);
1195 /*======================================================================
1197 The driver core code, most of which should be common with a
1198 non-PCMCIA implementation.
1200 ======================================================================*/
1203 static void smc_dump(struct net_device *dev)
1205 unsigned int ioaddr = dev->base_addr;
1207 save = inw(ioaddr + BANK_SELECT);
1208 for (w = 0; w < 4; w++) {
1210 printk(KERN_DEBUG "bank %d: ", w);
1211 for (i = 0; i < 14; i += 2)
1212 printk(" %04x", inw(ioaddr + i));
1215 outw(save, ioaddr + BANK_SELECT);
1219 static int smc_open(struct net_device *dev)
1221 struct smc_private *smc = netdev_priv(dev);
1222 struct pcmcia_device *link = smc->p_dev;
1225 DEBUG(0, "%s: smc_open(%p), ID/Window %4.4x.\n",
1226 dev->name, dev, inw(dev->base_addr + BANK_SELECT));
1227 if (pc_debug > 1) smc_dump(dev);
1230 /* Check that the PCMCIA card is still here. */
1231 if (!pcmcia_dev_present(link))
1233 /* Physical device present signature. */
1234 if (check_sig(link) < 0) {
1235 printk("smc91c92_cs: Yikes! Bad chip signature!\n");
1240 netif_start_queue(dev);
1241 smc->saved_skb = NULL;
1242 smc->packets_waiting = 0;
1245 init_timer(&smc->media);
1246 smc->media.function = &media_check;
1247 smc->media.data = (u_long) dev;
1248 smc->media.expires = jiffies + HZ;
1249 add_timer(&smc->media);
1254 /*====================================================================*/
1256 static int smc_close(struct net_device *dev)
1258 struct smc_private *smc = netdev_priv(dev);
1259 struct pcmcia_device *link = smc->p_dev;
1260 unsigned int ioaddr = dev->base_addr;
1262 DEBUG(0, "%s: smc_close(), status %4.4x.\n",
1263 dev->name, inw(ioaddr + BANK_SELECT));
1265 netif_stop_queue(dev);
1267 /* Shut off all interrupts, and turn off the Tx and Rx sections.
1268 Don't bother to check for chip present. */
1269 SMC_SELECT_BANK(2); /* Nominally paranoia, but do no assume... */
1270 outw(0, ioaddr + INTERRUPT);
1272 mask_bits(0xff00, ioaddr + RCR);
1273 mask_bits(0xff00, ioaddr + TCR);
1275 /* Put the chip into power-down mode. */
1277 outw(CTL_POWERDOWN, ioaddr + CONTROL );
1280 del_timer_sync(&smc->media);
1285 /*======================================================================
1287 Transfer a packet to the hardware and trigger the packet send.
1288 This may be called at either from either the Tx queue code
1289 or the interrupt handler.
1291 ======================================================================*/
1293 static void smc_hardware_send_packet(struct net_device * dev)
1295 struct smc_private *smc = netdev_priv(dev);
1296 struct sk_buff *skb = smc->saved_skb;
1297 unsigned int ioaddr = dev->base_addr;
1301 printk(KERN_ERR "%s: In XMIT with no packet to send.\n", dev->name);
1305 /* There should be a packet slot waiting. */
1306 packet_no = inw(ioaddr + PNR_ARR) >> 8;
1307 if (packet_no & 0x80) {
1308 /* If not, there is a hardware problem! Likely an ejected card. */
1309 printk(KERN_WARNING "%s: 91c92 hardware Tx buffer allocation"
1310 " failed, status %#2.2x.\n", dev->name, packet_no);
1311 dev_kfree_skb_irq(skb);
1312 smc->saved_skb = NULL;
1313 netif_start_queue(dev);
1317 dev->stats.tx_bytes += skb->len;
1318 /* The card should use the just-allocated buffer. */
1319 outw(packet_no, ioaddr + PNR_ARR);
1320 /* point to the beginning of the packet */
1321 outw(PTR_AUTOINC , ioaddr + POINTER);
1323 /* Send the packet length (+6 for status, length and ctl byte)
1324 and the status word (set to zeros). */
1326 u_char *buf = skb->data;
1327 u_int length = skb->len; /* The chip will pad to ethernet min. */
1329 DEBUG(2, "%s: Trying to xmit packet of length %d.\n",
1332 /* send the packet length: +6 for status word, length, and ctl */
1333 outw(0, ioaddr + DATA_1);
1334 outw(length + 6, ioaddr + DATA_1);
1335 outsw(ioaddr + DATA_1, buf, length >> 1);
1337 /* The odd last byte, if there is one, goes in the control word. */
1338 outw((length & 1) ? 0x2000 | buf[length-1] : 0, ioaddr + DATA_1);
1341 /* Enable the Tx interrupts, both Tx (TxErr) and TxEmpty. */
1342 outw(((IM_TX_INT|IM_TX_EMPTY_INT)<<8) |
1343 (inw(ioaddr + INTERRUPT) & 0xff00),
1344 ioaddr + INTERRUPT);
1346 /* The chip does the rest of the work. */
1347 outw(MC_ENQUEUE , ioaddr + MMU_CMD);
1349 smc->saved_skb = NULL;
1350 dev_kfree_skb_irq(skb);
1351 dev->trans_start = jiffies;
1352 netif_start_queue(dev);
1356 /*====================================================================*/
1358 static void smc_tx_timeout(struct net_device *dev)
1360 struct smc_private *smc = netdev_priv(dev);
1361 unsigned int ioaddr = dev->base_addr;
1363 printk(KERN_NOTICE "%s: SMC91c92 transmit timed out, "
1364 "Tx_status %2.2x status %4.4x.\n",
1365 dev->name, inw(ioaddr)&0xff, inw(ioaddr + 2));
1366 dev->stats.tx_errors++;
1368 dev->trans_start = jiffies;
1369 smc->saved_skb = NULL;
1370 netif_wake_queue(dev);
1373 static int smc_start_xmit(struct sk_buff *skb, struct net_device *dev)
1375 struct smc_private *smc = netdev_priv(dev);
1376 unsigned int ioaddr = dev->base_addr;
1379 unsigned long flags;
1381 netif_stop_queue(dev);
1383 DEBUG(2, "%s: smc_start_xmit(length = %d) called,"
1384 " status %4.4x.\n", dev->name, skb->len, inw(ioaddr + 2));
1386 if (smc->saved_skb) {
1387 /* THIS SHOULD NEVER HAPPEN. */
1388 dev->stats.tx_aborted_errors++;
1389 printk(KERN_DEBUG "%s: Internal error -- sent packet while busy.\n",
1393 smc->saved_skb = skb;
1395 num_pages = skb->len >> 8;
1397 if (num_pages > 7) {
1398 printk(KERN_ERR "%s: Far too big packet error.\n", dev->name);
1399 dev_kfree_skb (skb);
1400 smc->saved_skb = NULL;
1401 dev->stats.tx_dropped++;
1402 return 0; /* Do not re-queue this packet. */
1404 /* A packet is now waiting. */
1405 smc->packets_waiting++;
1407 spin_lock_irqsave(&smc->lock, flags);
1408 SMC_SELECT_BANK(2); /* Paranoia, we should always be in window 2 */
1410 /* need MC_RESET to keep the memory consistent. errata? */
1412 outw(MC_RESET, ioaddr + MMU_CMD);
1416 /* Allocate the memory; send the packet now if we win. */
1417 outw(MC_ALLOC | num_pages, ioaddr + MMU_CMD);
1418 for (time_out = MEMORY_WAIT_TIME; time_out >= 0; time_out--) {
1419 ir = inw(ioaddr+INTERRUPT);
1420 if (ir & IM_ALLOC_INT) {
1421 /* Acknowledge the interrupt, send the packet. */
1422 outw((ir&0xff00) | IM_ALLOC_INT, ioaddr + INTERRUPT);
1423 smc_hardware_send_packet(dev); /* Send the packet now.. */
1424 spin_unlock_irqrestore(&smc->lock, flags);
1429 /* Otherwise defer until the Tx-space-allocated interrupt. */
1430 DEBUG(2, "%s: memory allocation deferred.\n", dev->name);
1431 outw((IM_ALLOC_INT << 8) | (ir & 0xff00), ioaddr + INTERRUPT);
1432 spin_unlock_irqrestore(&smc->lock, flags);
1437 /*======================================================================
1439 Handle a Tx anomolous event. Entered while in Window 2.
1441 ======================================================================*/
1443 static void smc_tx_err(struct net_device * dev)
1445 struct smc_private *smc = netdev_priv(dev);
1446 unsigned int ioaddr = dev->base_addr;
1447 int saved_packet = inw(ioaddr + PNR_ARR) & 0xff;
1448 int packet_no = inw(ioaddr + FIFO_PORTS) & 0x7f;
1451 /* select this as the packet to read from */
1452 outw(packet_no, ioaddr + PNR_ARR);
1454 /* read the first word from this packet */
1455 outw(PTR_AUTOINC | PTR_READ | 0, ioaddr + POINTER);
1457 tx_status = inw(ioaddr + DATA_1);
1459 dev->stats.tx_errors++;
1460 if (tx_status & TS_LOSTCAR) dev->stats.tx_carrier_errors++;
1461 if (tx_status & TS_LATCOL) dev->stats.tx_window_errors++;
1462 if (tx_status & TS_16COL) {
1463 dev->stats.tx_aborted_errors++;
1467 if (tx_status & TS_SUCCESS) {
1468 printk(KERN_NOTICE "%s: Successful packet caused error "
1469 "interrupt?\n", dev->name);
1471 /* re-enable transmit */
1473 outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR);
1476 outw(MC_FREEPKT, ioaddr + MMU_CMD); /* Free the packet memory. */
1478 /* one less packet waiting for me */
1479 smc->packets_waiting--;
1481 outw(saved_packet, ioaddr + PNR_ARR);
1485 /*====================================================================*/
1487 static void smc_eph_irq(struct net_device *dev)
1489 struct smc_private *smc = netdev_priv(dev);
1490 unsigned int ioaddr = dev->base_addr;
1491 u_short card_stats, ephs;
1494 ephs = inw(ioaddr + EPH);
1495 DEBUG(2, "%s: Ethernet protocol handler interrupt, status"
1496 " %4.4x.\n", dev->name, ephs);
1497 /* Could be a counter roll-over warning: update stats. */
1498 card_stats = inw(ioaddr + COUNTER);
1499 /* single collisions */
1500 dev->stats.collisions += card_stats & 0xF;
1502 /* multiple collisions */
1503 dev->stats.collisions += card_stats & 0xF;
1504 #if 0 /* These are for when linux supports these statistics */
1505 card_stats >>= 4; /* deferred */
1506 card_stats >>= 4; /* excess deferred */
1508 /* If we had a transmit error we must re-enable the transmitter. */
1509 outw(inw(ioaddr + TCR) | TCR_ENABLE | smc->duplex, ioaddr + TCR);
1511 /* Clear a link error interrupt. */
1513 outw(CTL_AUTO_RELEASE | 0x0000, ioaddr + CONTROL);
1514 outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE,
1519 /*====================================================================*/
1521 static irqreturn_t smc_interrupt(int irq, void *dev_id)
1523 struct net_device *dev = dev_id;
1524 struct smc_private *smc = netdev_priv(dev);
1525 unsigned int ioaddr;
1526 u_short saved_bank, saved_pointer, mask, status;
1527 unsigned int handled = 1;
1528 char bogus_cnt = INTR_WORK; /* Work we are willing to do. */
1530 if (!netif_device_present(dev))
1533 ioaddr = dev->base_addr;
1535 DEBUG(3, "%s: SMC91c92 interrupt %d at %#x.\n", dev->name,
1538 spin_lock(&smc->lock);
1540 saved_bank = inw(ioaddr + BANK_SELECT);
1541 if ((saved_bank & 0xff00) != 0x3300) {
1542 /* The device does not exist -- the card could be off-line, or
1543 maybe it has been ejected. */
1544 DEBUG(1, "%s: SMC91c92 interrupt %d for non-existent"
1545 "/ejected device.\n", dev->name, irq);
1551 saved_pointer = inw(ioaddr + POINTER);
1552 mask = inw(ioaddr + INTERRUPT) >> 8;
1553 /* clear all interrupts */
1554 outw(0, ioaddr + INTERRUPT);
1556 do { /* read the status flag, and mask it */
1557 status = inw(ioaddr + INTERRUPT) & 0xff;
1558 DEBUG(3, "%s: Status is %#2.2x (mask %#2.2x).\n", dev->name,
1560 if ((status & mask) == 0) {
1561 if (bogus_cnt == INTR_WORK)
1565 if (status & IM_RCV_INT) {
1566 /* Got a packet(s). */
1569 if (status & IM_TX_INT) {
1571 outw(IM_TX_INT, ioaddr + INTERRUPT);
1574 if (status & IM_TX_EMPTY_INT) {
1575 outw(IM_TX_EMPTY_INT, ioaddr + INTERRUPT);
1576 mask &= ~IM_TX_EMPTY_INT;
1577 dev->stats.tx_packets += smc->packets_waiting;
1578 smc->packets_waiting = 0;
1580 if (status & IM_ALLOC_INT) {
1581 /* Clear this interrupt so it doesn't happen again */
1582 mask &= ~IM_ALLOC_INT;
1584 smc_hardware_send_packet(dev);
1586 /* enable xmit interrupts based on this */
1587 mask |= (IM_TX_EMPTY_INT | IM_TX_INT);
1589 /* and let the card send more packets to me */
1590 netif_wake_queue(dev);
1592 if (status & IM_RX_OVRN_INT) {
1593 dev->stats.rx_errors++;
1594 dev->stats.rx_fifo_errors++;
1596 smc->rx_ovrn = 1; /* need MC_RESET outside smc_interrupt */
1597 outw(IM_RX_OVRN_INT, ioaddr + INTERRUPT);
1599 if (status & IM_EPH_INT)
1601 } while (--bogus_cnt);
1603 DEBUG(3, " Restoring saved registers mask %2.2x bank %4.4x"
1604 " pointer %4.4x.\n", mask, saved_bank, saved_pointer);
1606 /* restore state register */
1607 outw((mask<<8), ioaddr + INTERRUPT);
1608 outw(saved_pointer, ioaddr + POINTER);
1609 SMC_SELECT_BANK(saved_bank);
1611 DEBUG(3, "%s: Exiting interrupt IRQ%d.\n", dev->name, irq);
1615 if ((smc->manfid == MANFID_OSITECH) &&
1616 (smc->cardid != PRODID_OSITECH_SEVEN)) {
1617 /* Retrigger interrupt if needed */
1618 mask_bits(0x00ff, ioaddr-0x10+OSITECH_RESET_ISR);
1619 set_bits(0x0300, ioaddr-0x10+OSITECH_RESET_ISR);
1621 if (smc->manfid == MANFID_MOTOROLA) {
1623 cor = readb(smc->base + MOT_UART + CISREG_COR);
1624 writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_UART + CISREG_COR);
1625 writeb(cor, smc->base + MOT_UART + CISREG_COR);
1626 cor = readb(smc->base + MOT_LAN + CISREG_COR);
1627 writeb(cor & ~COR_IREQ_ENA, smc->base + MOT_LAN + CISREG_COR);
1628 writeb(cor, smc->base + MOT_LAN + CISREG_COR);
1630 #ifdef DOES_NOT_WORK
1631 if (smc->base != NULL) { /* Megahertz MFC's */
1632 readb(smc->base+MEGAHERTZ_ISR);
1633 readb(smc->base+MEGAHERTZ_ISR);
1636 spin_unlock(&smc->lock);
1637 return IRQ_RETVAL(handled);
1640 /*====================================================================*/
1642 static void smc_rx(struct net_device *dev)
1644 unsigned int ioaddr = dev->base_addr;
1646 int packet_length; /* Caution: not frame length, rather words
1647 to transfer from the chip. */
1649 /* Assertion: we are in Window 2. */
1651 if (inw(ioaddr + FIFO_PORTS) & FP_RXEMPTY) {
1652 printk(KERN_ERR "%s: smc_rx() with nothing on Rx FIFO.\n",
1657 /* Reset the read pointer, and read the status and packet length. */
1658 outw(PTR_READ | PTR_RCV | PTR_AUTOINC, ioaddr + POINTER);
1659 rx_status = inw(ioaddr + DATA_1);
1660 packet_length = inw(ioaddr + DATA_1) & 0x07ff;
1662 DEBUG(2, "%s: Receive status %4.4x length %d.\n",
1663 dev->name, rx_status, packet_length);
1665 if (!(rx_status & RS_ERRORS)) {
1666 /* do stuff to make a new packet */
1667 struct sk_buff *skb;
1669 /* Note: packet_length adds 5 or 6 extra bytes here! */
1670 skb = dev_alloc_skb(packet_length+2);
1673 DEBUG(1, "%s: Low memory, packet dropped.\n", dev->name);
1674 dev->stats.rx_dropped++;
1675 outw(MC_RELEASE, ioaddr + MMU_CMD);
1679 packet_length -= (rx_status & RS_ODDFRAME ? 5 : 6);
1680 skb_reserve(skb, 2);
1681 insw(ioaddr+DATA_1, skb_put(skb, packet_length),
1682 (packet_length+1)>>1);
1683 skb->protocol = eth_type_trans(skb, dev);
1686 dev->last_rx = jiffies;
1687 dev->stats.rx_packets++;
1688 dev->stats.rx_bytes += packet_length;
1689 if (rx_status & RS_MULTICAST)
1690 dev->stats.multicast++;
1693 dev->stats.rx_errors++;
1695 if (rx_status & RS_ALGNERR) dev->stats.rx_frame_errors++;
1696 if (rx_status & (RS_TOOSHORT | RS_TOOLONG))
1697 dev->stats.rx_length_errors++;
1698 if (rx_status & RS_BADCRC) dev->stats.rx_crc_errors++;
1700 /* Let the MMU free the memory of this packet. */
1701 outw(MC_RELEASE, ioaddr + MMU_CMD);
1706 /*======================================================================
1708 Calculate values for the hardware multicast filter hash table.
1710 ======================================================================*/
1712 static void fill_multicast_tbl(int count, struct dev_mc_list *addrs,
1713 u_char *multicast_table)
1715 struct dev_mc_list *mc_addr;
1717 for (mc_addr = addrs; mc_addr && count-- > 0; mc_addr = mc_addr->next) {
1718 u_int position = ether_crc(6, mc_addr->dmi_addr);
1719 #ifndef final_version /* Verify multicast address. */
1720 if ((mc_addr->dmi_addr[0] & 1) == 0)
1723 multicast_table[position >> 29] |= 1 << ((position >> 26) & 7);
1727 /*======================================================================
1729 Set the receive mode.
1731 This routine is used by both the protocol level to notify us of
1732 promiscuous/multicast mode changes, and by the open/reset code to
1733 initialize the Rx registers. We always set the multicast list and
1734 leave the receiver running.
1736 ======================================================================*/
1738 static void set_rx_mode(struct net_device *dev)
1740 unsigned int ioaddr = dev->base_addr;
1741 struct smc_private *smc = netdev_priv(dev);
1742 u_int multicast_table[ 2 ] = { 0, };
1743 unsigned long flags;
1744 u_short rx_cfg_setting;
1746 if (dev->flags & IFF_PROMISC) {
1747 rx_cfg_setting = RxStripCRC | RxEnable | RxPromisc | RxAllMulti;
1748 } else if (dev->flags & IFF_ALLMULTI)
1749 rx_cfg_setting = RxStripCRC | RxEnable | RxAllMulti;
1751 if (dev->mc_count) {
1752 fill_multicast_tbl(dev->mc_count, dev->mc_list,
1753 (u_char *)multicast_table);
1755 rx_cfg_setting = RxStripCRC | RxEnable;
1758 /* Load MC table and Rx setting into the chip without interrupts. */
1759 spin_lock_irqsave(&smc->lock, flags);
1761 outl(multicast_table[0], ioaddr + MULTICAST0);
1762 outl(multicast_table[1], ioaddr + MULTICAST4);
1764 outw(rx_cfg_setting, ioaddr + RCR);
1766 spin_unlock_irqrestore(&smc->lock, flags);
1771 /*======================================================================
1773 Senses when a card's config changes. Here, it's coax or TP.
1775 ======================================================================*/
1777 static int s9k_config(struct net_device *dev, struct ifmap *map)
1779 struct smc_private *smc = netdev_priv(dev);
1780 if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) {
1781 if (smc->cfg & CFG_MII_SELECT)
1783 else if (map->port > 2)
1785 dev->if_port = map->port;
1786 printk(KERN_INFO "%s: switched to %s port\n",
1787 dev->name, if_names[dev->if_port]);
1793 /*======================================================================
1795 Reset the chip, reloading every register that might be corrupted.
1797 ======================================================================*/
1800 Set transceiver type, perhaps to something other than what the user
1801 specified in dev->if_port.
1803 static void smc_set_xcvr(struct net_device *dev, int if_port)
1805 struct smc_private *smc = netdev_priv(dev);
1806 unsigned int ioaddr = dev->base_addr;
1809 saved_bank = inw(ioaddr + BANK_SELECT);
1812 outw(smc->cfg | CFG_AUI_SELECT, ioaddr + CONFIG);
1813 if ((smc->manfid == MANFID_OSITECH) &&
1814 (smc->cardid != PRODID_OSITECH_SEVEN))
1815 set_bits(OSI_AUI_PWR, ioaddr - 0x10 + OSITECH_AUI_PWR);
1816 smc->media_status = ((dev->if_port == 0) ? 0x0001 : 0x0002);
1818 outw(smc->cfg, ioaddr + CONFIG);
1819 if ((smc->manfid == MANFID_OSITECH) &&
1820 (smc->cardid != PRODID_OSITECH_SEVEN))
1821 mask_bits(~OSI_AUI_PWR, ioaddr - 0x10 + OSITECH_AUI_PWR);
1822 smc->media_status = ((dev->if_port == 0) ? 0x0012 : 0x4001);
1824 SMC_SELECT_BANK(saved_bank);
1827 static void smc_reset(struct net_device *dev)
1829 unsigned int ioaddr = dev->base_addr;
1830 struct smc_private *smc = netdev_priv(dev);
1833 DEBUG(0, "%s: smc91c92 reset called.\n", dev->name);
1835 /* The first interaction must be a write to bring the chip out
1838 /* Reset the chip. */
1839 outw(RCR_SOFTRESET, ioaddr + RCR);
1842 /* Clear the transmit and receive configuration registers. */
1843 outw(RCR_CLEAR, ioaddr + RCR);
1844 outw(TCR_CLEAR, ioaddr + TCR);
1846 /* Set the Window 1 control, configuration and station addr registers.
1847 No point in writing the I/O base register ;-> */
1849 /* Automatically release successfully transmitted packets,
1850 Accept link errors, counter and Tx error interrupts. */
1851 outw(CTL_AUTO_RELEASE | CTL_TE_ENABLE | CTL_CR_ENABLE,
1853 smc_set_xcvr(dev, dev->if_port);
1854 if ((smc->manfid == MANFID_OSITECH) &&
1855 (smc->cardid != PRODID_OSITECH_SEVEN))
1856 outw((dev->if_port == 2 ? OSI_AUI_PWR : 0) |
1857 (inw(ioaddr-0x10+OSITECH_AUI_PWR) & 0xff00),
1858 ioaddr - 0x10 + OSITECH_AUI_PWR);
1860 /* Fill in the physical address. The databook is wrong about the order! */
1861 for (i = 0; i < 6; i += 2)
1862 outw((dev->dev_addr[i+1]<<8)+dev->dev_addr[i],
1863 ioaddr + ADDR0 + i);
1867 outw(MC_RESET, ioaddr + MMU_CMD);
1868 outw(0, ioaddr + INTERRUPT);
1870 /* Re-enable the chip. */
1872 outw(((smc->cfg & CFG_MII_SELECT) ? 0 : TCR_MONCSN) |
1873 TCR_ENABLE | TCR_PAD_EN | smc->duplex, ioaddr + TCR);
1876 if (smc->cfg & CFG_MII_SELECT) {
1880 mdio_write(dev, smc->mii_if.phy_id, 0, 0x8000);
1882 /* Advertise 100F, 100H, 10F, 10H */
1883 mdio_write(dev, smc->mii_if.phy_id, 4, 0x01e1);
1885 /* Restart MII autonegotiation */
1886 mdio_write(dev, smc->mii_if.phy_id, 0, 0x0000);
1887 mdio_write(dev, smc->mii_if.phy_id, 0, 0x1200);
1890 /* Enable interrupts. */
1892 outw((IM_EPH_INT | IM_RX_OVRN_INT | IM_RCV_INT) << 8,
1893 ioaddr + INTERRUPT);
1896 /*======================================================================
1898 Media selection timer routine
1900 ======================================================================*/
1902 static void media_check(u_long arg)
1904 struct net_device *dev = (struct net_device *) arg;
1905 struct smc_private *smc = netdev_priv(dev);
1906 unsigned int ioaddr = dev->base_addr;
1907 u_short i, media, saved_bank;
1909 unsigned long flags;
1911 spin_lock_irqsave(&smc->lock, flags);
1913 saved_bank = inw(ioaddr + BANK_SELECT);
1915 if (!netif_device_present(dev))
1920 /* need MC_RESET to keep the memory consistent. errata? */
1922 outw(MC_RESET, ioaddr + MMU_CMD);
1925 i = inw(ioaddr + INTERRUPT);
1927 media = inw(ioaddr + EPH) & EPH_LINK_OK;
1929 media |= (inw(ioaddr + CONFIG) & CFG_AUI_SELECT) ? 2 : 1;
1931 /* Check for pending interrupt with watchdog flag set: with
1932 this, we can limp along even if the interrupt is blocked */
1933 if (smc->watchdog++ && ((i>>8) & i)) {
1934 if (!smc->fast_poll)
1935 printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name);
1936 smc_interrupt(dev->irq, dev);
1937 smc->fast_poll = HZ;
1939 if (smc->fast_poll) {
1941 smc->media.expires = jiffies + HZ/100;
1942 add_timer(&smc->media);
1943 SMC_SELECT_BANK(saved_bank);
1944 spin_unlock_irqrestore(&smc->lock, flags);
1948 if (smc->cfg & CFG_MII_SELECT) {
1949 if (smc->mii_if.phy_id < 0)
1953 link = mdio_read(dev, smc->mii_if.phy_id, 1);
1954 if (!link || (link == 0xffff)) {
1955 printk(KERN_INFO "%s: MII is missing!\n", dev->name);
1956 smc->mii_if.phy_id = -1;
1961 if (link != smc->link_status) {
1962 u_short p = mdio_read(dev, smc->mii_if.phy_id, 5);
1963 printk(KERN_INFO "%s: %s link beat\n", dev->name,
1964 (link) ? "found" : "lost");
1965 smc->duplex = (((p & 0x0100) || ((p & 0x1c0) == 0x40))
1968 printk(KERN_INFO "%s: autonegotiation complete: "
1969 "%sbaseT-%cD selected\n", dev->name,
1970 ((p & 0x0180) ? "100" : "10"),
1971 (smc->duplex ? 'F' : 'H'));
1974 outw(inw(ioaddr + TCR) | smc->duplex, ioaddr + TCR);
1975 smc->link_status = link;
1980 /* Ignore collisions unless we've had no rx's recently */
1981 if (time_after(jiffies, dev->last_rx + HZ)) {
1982 if (smc->tx_err || (smc->media_status & EPH_16COL))
1987 if (media != smc->media_status) {
1988 if ((media & smc->media_status & 1) &&
1989 ((smc->media_status ^ media) & EPH_LINK_OK))
1990 printk(KERN_INFO "%s: %s link beat\n", dev->name,
1991 (smc->media_status & EPH_LINK_OK ? "lost" : "found"));
1992 else if ((media & smc->media_status & 2) &&
1993 ((smc->media_status ^ media) & EPH_16COL))
1994 printk(KERN_INFO "%s: coax cable %s\n", dev->name,
1995 (media & EPH_16COL ? "problem" : "ok"));
1996 if (dev->if_port == 0) {
1998 if (media & EPH_LINK_OK)
1999 printk(KERN_INFO "%s: flipped to 10baseT\n",
2002 smc_set_xcvr(dev, 2);
2004 if (media & EPH_16COL)
2005 smc_set_xcvr(dev, 1);
2007 printk(KERN_INFO "%s: flipped to 10base2\n",
2011 smc->media_status = media;
2015 smc->media.expires = jiffies + HZ;
2016 add_timer(&smc->media);
2017 SMC_SELECT_BANK(saved_bank);
2018 spin_unlock_irqrestore(&smc->lock, flags);
2021 static int smc_link_ok(struct net_device *dev)
2023 unsigned int ioaddr = dev->base_addr;
2024 struct smc_private *smc = netdev_priv(dev);
2026 if (smc->cfg & CFG_MII_SELECT) {
2027 return mii_link_ok(&smc->mii_if);
2030 return inw(ioaddr + EPH) & EPH_LINK_OK;
2034 static int smc_netdev_get_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
2037 unsigned int ioaddr = dev->base_addr;
2039 ecmd->supported = (SUPPORTED_TP | SUPPORTED_AUI |
2040 SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full);
2043 tmp = inw(ioaddr + CONFIG);
2044 ecmd->port = (tmp & CFG_AUI_SELECT) ? PORT_AUI : PORT_TP;
2045 ecmd->transceiver = XCVR_INTERNAL;
2046 ecmd->speed = SPEED_10;
2047 ecmd->phy_address = ioaddr + MGMT;
2050 tmp = inw(ioaddr + TCR);
2051 ecmd->duplex = (tmp & TCR_FDUPLX) ? DUPLEX_FULL : DUPLEX_HALF;
2056 static int smc_netdev_set_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
2059 unsigned int ioaddr = dev->base_addr;
2061 if (ecmd->speed != SPEED_10)
2063 if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL)
2065 if (ecmd->port != PORT_TP && ecmd->port != PORT_AUI)
2067 if (ecmd->transceiver != XCVR_INTERNAL)
2070 if (ecmd->port == PORT_AUI)
2071 smc_set_xcvr(dev, 1);
2073 smc_set_xcvr(dev, 0);
2076 tmp = inw(ioaddr + TCR);
2077 if (ecmd->duplex == DUPLEX_FULL)
2081 outw(tmp, ioaddr + TCR);
2086 static int check_if_running(struct net_device *dev)
2088 if (!netif_running(dev))
2093 static void smc_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
2095 strcpy(info->driver, DRV_NAME);
2096 strcpy(info->version, DRV_VERSION);
2099 static int smc_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
2101 struct smc_private *smc = netdev_priv(dev);
2102 unsigned int ioaddr = dev->base_addr;
2103 u16 saved_bank = inw(ioaddr + BANK_SELECT);
2106 spin_lock_irq(&smc->lock);
2108 if (smc->cfg & CFG_MII_SELECT)
2109 ret = mii_ethtool_gset(&smc->mii_if, ecmd);
2111 ret = smc_netdev_get_ecmd(dev, ecmd);
2112 SMC_SELECT_BANK(saved_bank);
2113 spin_unlock_irq(&smc->lock);
2117 static int smc_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
2119 struct smc_private *smc = netdev_priv(dev);
2120 unsigned int ioaddr = dev->base_addr;
2121 u16 saved_bank = inw(ioaddr + BANK_SELECT);
2124 spin_lock_irq(&smc->lock);
2126 if (smc->cfg & CFG_MII_SELECT)
2127 ret = mii_ethtool_sset(&smc->mii_if, ecmd);
2129 ret = smc_netdev_set_ecmd(dev, ecmd);
2130 SMC_SELECT_BANK(saved_bank);
2131 spin_unlock_irq(&smc->lock);
2135 static u32 smc_get_link(struct net_device *dev)
2137 struct smc_private *smc = netdev_priv(dev);
2138 unsigned int ioaddr = dev->base_addr;
2139 u16 saved_bank = inw(ioaddr + BANK_SELECT);
2142 spin_lock_irq(&smc->lock);
2144 ret = smc_link_ok(dev);
2145 SMC_SELECT_BANK(saved_bank);
2146 spin_unlock_irq(&smc->lock);
2151 static u32 smc_get_msglevel(struct net_device *dev)
2156 static void smc_set_msglevel(struct net_device *dev, u32 val)
2162 static int smc_nway_reset(struct net_device *dev)
2164 struct smc_private *smc = netdev_priv(dev);
2165 if (smc->cfg & CFG_MII_SELECT) {
2166 unsigned int ioaddr = dev->base_addr;
2167 u16 saved_bank = inw(ioaddr + BANK_SELECT);
2171 res = mii_nway_restart(&smc->mii_if);
2172 SMC_SELECT_BANK(saved_bank);
2179 static const struct ethtool_ops ethtool_ops = {
2180 .begin = check_if_running,
2181 .get_drvinfo = smc_get_drvinfo,
2182 .get_settings = smc_get_settings,
2183 .set_settings = smc_set_settings,
2184 .get_link = smc_get_link,
2186 .get_msglevel = smc_get_msglevel,
2187 .set_msglevel = smc_set_msglevel,
2189 .nway_reset = smc_nway_reset,
2192 static int smc_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
2194 struct smc_private *smc = netdev_priv(dev);
2195 struct mii_ioctl_data *mii = if_mii(rq);
2198 unsigned int ioaddr = dev->base_addr;
2200 if (!netif_running(dev))
2203 spin_lock_irq(&smc->lock);
2204 saved_bank = inw(ioaddr + BANK_SELECT);
2206 rc = generic_mii_ioctl(&smc->mii_if, mii, cmd, NULL);
2207 SMC_SELECT_BANK(saved_bank);
2208 spin_unlock_irq(&smc->lock);
2212 static struct pcmcia_device_id smc91c92_ids[] = {
2213 PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0109, 0x0501),
2214 PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0140, 0x000a),
2215 PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "CC/XJEM3288", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x04cd2988, 0x46a52d63),
2216 PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "CC/XJEM3336", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x0143b773, 0x46a52d63),
2217 PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "EM1144T", "PCMCIA MODEM", 0xf510db04, 0x856d66c8, 0xbd6c43ef),
2218 PCMCIA_PFC_DEVICE_PROD_ID123(0, "MEGAHERTZ", "XJEM1144/CCEM1144", "PCMCIA MODEM", 0xf510db04, 0x52d21e1e, 0xbd6c43ef),
2219 PCMCIA_PFC_DEVICE_PROD_ID12(0, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c),
2220 PCMCIA_PFC_DEVICE_PROD_ID12(0, "MEGAHERTZ", "XJEM1144/CCEM1144", 0xf510db04, 0x52d21e1e),
2221 PCMCIA_PFC_DEVICE_PROD_ID12(0, "Ositech", "Trumpcard:Jack of Diamonds Modem+Ethernet", 0xc2f80cd, 0x656947b9),
2222 PCMCIA_PFC_DEVICE_PROD_ID12(0, "Ositech", "Trumpcard:Jack of Hearts Modem+Ethernet", 0xc2f80cd, 0xdc9ba5ed),
2223 PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x016c, 0x0020),
2224 PCMCIA_DEVICE_MANF_CARD(0x016c, 0x0023),
2225 PCMCIA_DEVICE_PROD_ID123("BASICS by New Media Corporation", "Ethernet", "SMC91C94", 0x23c78a9d, 0x00b2e941, 0xcef397fb),
2226 PCMCIA_DEVICE_PROD_ID12("ARGOSY", "Fast Ethernet PCCard", 0x78f308dc, 0xdcea68bc),
2227 PCMCIA_DEVICE_PROD_ID12("dit Co., Ltd.", "PC Card-10/100BTX", 0xe59365c8, 0x6a2161d1),
2228 PCMCIA_DEVICE_PROD_ID12("DYNALINK", "L100C", 0x6a26d1cf, 0xc16ce9c5),
2229 PCMCIA_DEVICE_PROD_ID12("Farallon", "Farallon Enet", 0x58d93fc4, 0x244734e9),
2230 PCMCIA_DEVICE_PROD_ID12("Megahertz", "CC10BT/2", 0x33234748, 0x3c95b953),
2231 PCMCIA_DEVICE_PROD_ID12("MELCO/SMC", "LPC-TX", 0xa2cd8e6d, 0x42da662a),
2232 PCMCIA_DEVICE_PROD_ID12("Ositech", "Trumpcard:Four of Diamonds Ethernet", 0xc2f80cd, 0xb3466314),
2233 PCMCIA_DEVICE_PROD_ID12("Ositech", "Trumpcard:Seven of Diamonds Ethernet", 0xc2f80cd, 0x194b650a),
2234 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Fast Ethernet PCCard", 0x281f1c5d, 0xdcea68bc),
2235 PCMCIA_DEVICE_PROD_ID12("Psion", "10Mb Ethernet", 0x4ef00b21, 0x844be9e9),
2236 PCMCIA_DEVICE_PROD_ID12("SMC", "EtherEZ Ethernet 8020", 0xc4f8b18b, 0x4a0eeb2d),
2237 /* These conflict with other cards! */
2238 /* PCMCIA_DEVICE_MANF_CARD(0x0186, 0x0100), */
2239 /* PCMCIA_DEVICE_MANF_CARD(0x8a01, 0xc1ab), */
2242 MODULE_DEVICE_TABLE(pcmcia, smc91c92_ids);
2244 static struct pcmcia_driver smc91c92_cs_driver = {
2245 .owner = THIS_MODULE,
2247 .name = "smc91c92_cs",
2249 .probe = smc91c92_probe,
2250 .remove = smc91c92_detach,
2251 .id_table = smc91c92_ids,
2252 .suspend = smc91c92_suspend,
2253 .resume = smc91c92_resume,
2256 static int __init init_smc91c92_cs(void)
2258 return pcmcia_register_driver(&smc91c92_cs_driver);
2261 static void __exit exit_smc91c92_cs(void)
2263 pcmcia_unregister_driver(&smc91c92_cs_driver);
2266 module_init(init_smc91c92_cs);
2267 module_exit(exit_smc91c92_cs);