1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31#define DRV_NAME "fmvj18x_cs"
32#define DRV_VERSION "2.9"
33
34#include <linux/module.h>
35#include <linux/kernel.h>
36#include <linux/init.h>
37#include <linux/ptrace.h>
38#include <linux/slab.h>
39#include <linux/string.h>
40#include <linux/timer.h>
41#include <linux/interrupt.h>
42#include <linux/in.h>
43#include <linux/delay.h>
44#include <linux/ethtool.h>
45#include <linux/netdevice.h>
46#include <linux/etherdevice.h>
47#include <linux/skbuff.h>
48#include <linux/if_arp.h>
49#include <linux/ioport.h>
50#include <linux/crc32.h>
51
52#include <pcmcia/cs_types.h>
53#include <pcmcia/cs.h>
54#include <pcmcia/cistpl.h>
55#include <pcmcia/ciscode.h>
56#include <pcmcia/ds.h>
57
58#include <asm/uaccess.h>
59#include <asm/io.h>
60#include <asm/system.h>
61
62
63
64
65
66MODULE_DESCRIPTION("fmvj18x and compatible PCMCIA ethernet driver");
67MODULE_LICENSE("GPL");
68
69#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
70
71
72
73INT_MODULE_PARM(sram_config, 0);
74
75#ifdef PCMCIA_DEBUG
76INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
77#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
78static char *version = DRV_NAME ".c " DRV_VERSION " 2002/03/23";
79#else
80#define DEBUG(n, args...)
81#endif
82
83
84
85
86
87static int fmvj18x_config(struct pcmcia_device *link);
88static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id);
89static int fmvj18x_setup_mfc(struct pcmcia_device *link);
90static void fmvj18x_release(struct pcmcia_device *link);
91static void fmvj18x_detach(struct pcmcia_device *p_dev);
92
93
94
95
96static int fjn_config(struct net_device *dev, struct ifmap *map);
97static int fjn_open(struct net_device *dev);
98static int fjn_close(struct net_device *dev);
99static int fjn_start_xmit(struct sk_buff *skb, struct net_device *dev);
100static irqreturn_t fjn_interrupt(int irq, void *dev_id);
101static void fjn_rx(struct net_device *dev);
102static void fjn_reset(struct net_device *dev);
103static struct net_device_stats *fjn_get_stats(struct net_device *dev);
104static void set_rx_mode(struct net_device *dev);
105static void fjn_tx_timeout(struct net_device *dev);
106static const struct ethtool_ops netdev_ethtool_ops;
107
108
109
110
111typedef enum { MBH10302, MBH10304, TDK, CONTEC, LA501, UNGERMANN,
112 XXX10304, NEC, KME
113} cardtype_t;
114
115
116
117
118typedef struct local_info_t {
119 struct pcmcia_device *p_dev;
120 dev_node_t node;
121 struct net_device_stats stats;
122 long open_time;
123 uint tx_started:1;
124 uint tx_queue;
125 u_short tx_queue_len;
126 cardtype_t cardtype;
127 u_short sent;
128} local_info_t;
129
130#define MC_FILTERBREAK 64
131
132
133
134
135
136#define TX_STATUS 0
137#define RX_STATUS 1
138#define TX_INTR 2
139#define RX_INTR 3
140#define TX_MODE 4
141#define RX_MODE 5
142#define CONFIG_0 6
143#define CONFIG_1 7
144
145#define NODE_ID 8
146#define MAR_ADR 8
147
148#define DATAPORT 8
149#define TX_START 10
150#define COL_CTRL 11
151#define BMPR12 12
152#define BMPR13 13
153#define RX_SKIP 14
154
155#define LAN_CTRL 16
156
157#define MAC_ID 0x1a
158#define UNGERMANN_MAC_ID 0x18
159
160
161
162
163#define ENA_TMT_OK 0x80
164#define ENA_TMT_REC 0x20
165#define ENA_COL 0x04
166#define ENA_16_COL 0x02
167#define ENA_TBUS_ERR 0x01
168
169#define ENA_PKT_RDY 0x80
170#define ENA_BUS_ERR 0x40
171#define ENA_LEN_ERR 0x08
172#define ENA_ALG_ERR 0x04
173#define ENA_CRC_ERR 0x02
174#define ENA_OVR_FLO 0x01
175
176
177#define F_TMT_RDY 0x80
178#define F_NET_BSY 0x40
179#define F_TMT_OK 0x20
180#define F_SRT_PKT 0x10
181#define F_COL_ERR 0x04
182#define F_16_COL 0x02
183#define F_TBUS_ERR 0x01
184
185#define F_PKT_RDY 0x80
186#define F_BUS_ERR 0x40
187#define F_LEN_ERR 0x08
188#define F_ALG_ERR 0x04
189#define F_CRC_ERR 0x02
190#define F_OVR_FLO 0x01
191
192#define F_BUF_EMP 0x40
193
194#define F_SKP_PKT 0x05
195
196
197#define D_TX_INTR ( ENA_TMT_OK )
198#define D_RX_INTR ( ENA_PKT_RDY | ENA_LEN_ERR \
199 | ENA_ALG_ERR | ENA_CRC_ERR | ENA_OVR_FLO )
200#define TX_STAT_M ( F_TMT_RDY )
201#define RX_STAT_M ( F_PKT_RDY | F_LEN_ERR \
202 | F_ALG_ERR | F_CRC_ERR | F_OVR_FLO )
203
204
205#define D_TX_MODE 0x06
206#define ID_MATCHED 0x02
207#define RECV_ALL 0x03
208#define CONFIG0_DFL 0x5a
209#define CONFIG0_DFL_1 0x5e
210#define CONFIG0_RST 0xda
211#define CONFIG0_RST_1 0xde
212#define BANK_0 0xa0
213#define BANK_1 0xa4
214#define BANK_2 0xa8
215#define CHIP_OFF 0x80
216#define DO_TX 0x80
217#define SEND_PKT 0x81
218#define AUTO_MODE 0x07
219#define MANU_MODE 0x03
220#define TDK_AUTO_MODE 0x47
221#define TDK_MANU_MODE 0x43
222#define INTR_OFF 0x0d
223#define INTR_ON 0x1d
224
225#define TX_TIMEOUT ((400*HZ)/1000)
226
227#define BANK_0U 0x20
228#define BANK_1U 0x24
229#define BANK_2U 0x28
230
231static int fmvj18x_probe(struct pcmcia_device *link)
232{
233 local_info_t *lp;
234 struct net_device *dev;
235
236 DEBUG(0, "fmvj18x_attach()\n");
237
238
239 dev = alloc_etherdev(sizeof(local_info_t));
240 if (!dev)
241 return -ENOMEM;
242 lp = netdev_priv(dev);
243 link->priv = dev;
244 lp->p_dev = link;
245
246
247 link->io.NumPorts1 = 32;
248 link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
249 link->io.IOAddrLines = 5;
250
251
252 link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING|IRQ_HANDLE_PRESENT;
253 link->irq.IRQInfo1 = IRQ_LEVEL_ID;
254 link->irq.Handler = &fjn_interrupt;
255 link->irq.Instance = dev;
256
257
258 link->conf.Attributes = CONF_ENABLE_IRQ;
259 link->conf.IntType = INT_MEMORY_AND_IO;
260
261
262 dev->hard_start_xmit = &fjn_start_xmit;
263 dev->set_config = &fjn_config;
264 dev->get_stats = &fjn_get_stats;
265 dev->set_multicast_list = &set_rx_mode;
266 dev->open = &fjn_open;
267 dev->stop = &fjn_close;
268#ifdef HAVE_TX_TIMEOUT
269 dev->tx_timeout = fjn_tx_timeout;
270 dev->watchdog_timeo = TX_TIMEOUT;
271#endif
272 SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
273
274 return fmvj18x_config(link);
275}
276
277
278
279static void fmvj18x_detach(struct pcmcia_device *link)
280{
281 struct net_device *dev = link->priv;
282
283 DEBUG(0, "fmvj18x_detach(0x%p)\n", link);
284
285 if (link->dev_node)
286 unregister_netdev(dev);
287
288 fmvj18x_release(link);
289
290 free_netdev(dev);
291}
292
293
294
295#define CS_CHECK(fn, ret) \
296do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
297
298static int mfc_try_io_port(struct pcmcia_device *link)
299{
300 int i, ret;
301 static const kio_addr_t serial_base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
302
303 for (i = 0; i < 5; i++) {
304 link->io.BasePort2 = serial_base[i];
305 link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
306 if (link->io.BasePort2 == 0) {
307 link->io.NumPorts2 = 0;
308 printk(KERN_NOTICE "fmvj18x_cs: out of resource for serial\n");
309 }
310 ret = pcmcia_request_io(link, &link->io);
311 if (ret == CS_SUCCESS) return ret;
312 }
313 return ret;
314}
315
316static int ungermann_try_io_port(struct pcmcia_device *link)
317{
318 int ret;
319 kio_addr_t ioaddr;
320
321
322
323
324 for (ioaddr = 0x300; ioaddr < 0x3e0; ioaddr += 0x20) {
325 link->io.BasePort1 = ioaddr;
326 ret = pcmcia_request_io(link, &link->io);
327 if (ret == CS_SUCCESS) {
328
329 link->conf.ConfigIndex =
330 ((link->io.BasePort1 & 0x0f0) >> 3) | 0x22;
331 return ret;
332 }
333 }
334 return ret;
335}
336
337static int fmvj18x_config(struct pcmcia_device *link)
338{
339 struct net_device *dev = link->priv;
340 local_info_t *lp = netdev_priv(dev);
341 tuple_t tuple;
342 cisparse_t parse;
343 u_short buf[32];
344 int i, last_fn = 0, last_ret = 0, ret;
345 kio_addr_t ioaddr;
346 cardtype_t cardtype;
347 char *card_name = "unknown";
348 u_char *node_id;
349 DECLARE_MAC_BUF(mac);
350
351 DEBUG(0, "fmvj18x_config(0x%p)\n", link);
352
353 tuple.TupleData = (u_char *)buf;
354 tuple.TupleDataMax = 64;
355 tuple.TupleOffset = 0;
356 tuple.DesiredTuple = CISTPL_FUNCE;
357 tuple.TupleOffset = 0;
358 if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) {
359
360 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
361 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
362 CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
363 CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse));
364 link->conf.ConfigIndex = parse.cftable_entry.index;
365 switch (link->manf_id) {
366 case MANFID_TDK:
367 cardtype = TDK;
368 if (link->card_id == PRODID_TDK_GN3410
369 || link->card_id == PRODID_TDK_NP9610
370 || link->card_id == PRODID_TDK_MN3200) {
371
372 link->conf.ConfigBase = 0x800;
373 link->conf.ConfigIndex = 0x47;
374 link->io.NumPorts2 = 8;
375 }
376 break;
377 case MANFID_NEC:
378 cardtype = NEC;
379 link->conf.ConfigBase = 0x800;
380 link->conf.ConfigIndex = 0x47;
381 link->io.NumPorts2 = 8;
382 break;
383 case MANFID_KME:
384 cardtype = KME;
385 link->conf.ConfigBase = 0x800;
386 link->conf.ConfigIndex = 0x47;
387 link->io.NumPorts2 = 8;
388 break;
389 case MANFID_CONTEC:
390 cardtype = CONTEC;
391 break;
392 case MANFID_FUJITSU:
393 if (link->card_id == PRODID_FUJITSU_MBH10302)
394
395
396 cardtype = MBH10304;
397 else if (link->card_id == PRODID_FUJITSU_MBH10304)
398 cardtype = MBH10304;
399 else
400 cardtype = LA501;
401 break;
402 default:
403 cardtype = MBH10304;
404 }
405 } else {
406
407 switch (link->manf_id) {
408 case MANFID_FUJITSU:
409 if (link->card_id == PRODID_FUJITSU_MBH10304) {
410 cardtype = XXX10304;
411 link->conf.ConfigIndex = 0x20;
412 } else {
413 cardtype = MBH10302;
414 link->conf.ConfigIndex = 1;
415 }
416 break;
417 case MANFID_UNGERMANN:
418 cardtype = UNGERMANN;
419 break;
420 default:
421 cardtype = MBH10302;
422 link->conf.ConfigIndex = 1;
423 }
424 }
425
426 if (link->io.NumPorts2 != 0) {
427 link->irq.Attributes =
428 IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED|IRQ_HANDLE_PRESENT;
429 ret = mfc_try_io_port(link);
430 if (ret != CS_SUCCESS) goto cs_failed;
431 } else if (cardtype == UNGERMANN) {
432 ret = ungermann_try_io_port(link);
433 if (ret != CS_SUCCESS) goto cs_failed;
434 } else {
435 CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io));
436 }
437 CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
438 CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
439 dev->irq = link->irq.AssignedIRQ;
440 dev->base_addr = link->io.BasePort1;
441
442 if (link->io.BasePort2 != 0)
443 fmvj18x_setup_mfc(link);
444
445 ioaddr = dev->base_addr;
446
447
448 if (sram_config == 0)
449 outb(CONFIG0_RST, ioaddr + CONFIG_0);
450 else
451 outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
452
453
454 if (cardtype == MBH10302)
455 outb(BANK_0, ioaddr + CONFIG_1);
456 else
457 outb(BANK_0U, ioaddr + CONFIG_1);
458
459
460 switch (cardtype) {
461 case MBH10304:
462 case TDK:
463 case LA501:
464 case CONTEC:
465 case NEC:
466 case KME:
467 tuple.DesiredTuple = CISTPL_FUNCE;
468 tuple.TupleOffset = 0;
469 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
470 tuple.TupleOffset = 0;
471 CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
472 if (cardtype == MBH10304) {
473
474 node_id = &(tuple.TupleData[5]);
475 card_name = "FMV-J182";
476 } else {
477 while (tuple.TupleData[0] != CISTPL_FUNCE_LAN_NODE_ID ) {
478 CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple));
479 CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
480 }
481 node_id = &(tuple.TupleData[2]);
482 if( cardtype == TDK ) {
483 card_name = "TDK LAK-CD021";
484 } else if( cardtype == LA501 ) {
485 card_name = "LA501";
486 } else if( cardtype == NEC ) {
487 card_name = "PK-UG-J001";
488 } else if( cardtype == KME ) {
489 card_name = "Panasonic";
490 } else {
491 card_name = "C-NET(PC)C";
492 }
493 }
494
495 for (i = 0; i < 6; i++)
496 dev->dev_addr[i] = node_id[i];
497 break;
498 case UNGERMANN:
499
500 for (i = 0; i < 6; i++)
501 dev->dev_addr[i] = inb(ioaddr + UNGERMANN_MAC_ID + i);
502 card_name = "Access/CARD";
503 break;
504 case XXX10304:
505
506 if (fmvj18x_get_hwinfo(link, tuple.TupleData) == -1) {
507 printk(KERN_NOTICE "fmvj18x_cs: unable to read hardware net address.\n");
508 goto failed;
509 }
510 for (i = 0 ; i < 6; i++) {
511 dev->dev_addr[i] = tuple.TupleData[i];
512 }
513 card_name = "FMV-J182";
514 break;
515 case MBH10302:
516 default:
517
518 for (i = 0; i < 6; i++)
519 dev->dev_addr[i] = inb(ioaddr + MAC_ID + i);
520 card_name = "FMV-J181";
521 break;
522 }
523
524 lp->cardtype = cardtype;
525 link->dev_node = &lp->node;
526 SET_NETDEV_DEV(dev, &handle_to_dev(link));
527
528 if (register_netdev(dev) != 0) {
529 printk(KERN_NOTICE "fmvj18x_cs: register_netdev() failed\n");
530 link->dev_node = NULL;
531 goto failed;
532 }
533
534 strcpy(lp->node.dev_name, dev->name);
535
536
537 printk(KERN_INFO "%s: %s, sram %s, port %#3lx, irq %d, "
538 "hw_addr %s\n",
539 dev->name, card_name, sram_config == 0 ? "4K TX*2" : "8K TX*2",
540 dev->base_addr, dev->irq, print_mac(mac, dev->dev_addr));
541
542 return 0;
543
544cs_failed:
545
546 cs_error(link, last_fn, last_ret);
547failed:
548 fmvj18x_release(link);
549 return -ENODEV;
550}
551
552
553static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id)
554{
555 win_req_t req;
556 memreq_t mem;
557 u_char __iomem *base;
558 int i, j;
559
560
561 req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
562 req.Base = 0; req.Size = 0;
563 req.AccessSpeed = 0;
564 i = pcmcia_request_window(&link, &req, &link->win);
565 if (i != CS_SUCCESS) {
566 cs_error(link, RequestWindow, i);
567 return -1;
568 }
569
570 base = ioremap(req.Base, req.Size);
571 mem.Page = 0;
572 mem.CardOffset = 0;
573 pcmcia_map_mem_page(link->win, &mem);
574
575
576
577
578
579
580
581 for (i = 0; i < 0x200; i++) {
582 if (readb(base+i*2) == 0x22) {
583 if (readb(base+(i-1)*2) == 0xff
584 && readb(base+(i+5)*2) == 0x04
585 && readb(base+(i+6)*2) == 0x06
586 && readb(base+(i+13)*2) == 0xff)
587 break;
588 }
589 }
590
591 if (i != 0x200) {
592 for (j = 0 ; j < 6; j++,i++) {
593 node_id[j] = readb(base+(i+7)*2);
594 }
595 }
596
597 iounmap(base);
598 j = pcmcia_release_window(link->win);
599 if (j != CS_SUCCESS)
600 cs_error(link, ReleaseWindow, j);
601 return (i != 0x200) ? 0 : -1;
602
603}
604
605
606static int fmvj18x_setup_mfc(struct pcmcia_device *link)
607{
608 win_req_t req;
609 memreq_t mem;
610 u_char __iomem *base;
611 int i, j;
612 struct net_device *dev = link->priv;
613 kio_addr_t ioaddr;
614
615
616 req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE;
617 req.Base = 0; req.Size = 0;
618 req.AccessSpeed = 0;
619 i = pcmcia_request_window(&link, &req, &link->win);
620 if (i != CS_SUCCESS) {
621 cs_error(link, RequestWindow, i);
622 return -1;
623 }
624
625 base = ioremap(req.Base, req.Size);
626 mem.Page = 0;
627 mem.CardOffset = 0;
628 pcmcia_map_mem_page(link->win, &mem);
629
630 ioaddr = dev->base_addr;
631 writeb(0x47, base+0x800);
632 writeb(0x0, base+0x802);
633
634 writeb(ioaddr & 0xff, base+0x80a);
635 writeb((ioaddr >> 8) & 0xff, base+0x80c);
636
637 writeb(0x45, base+0x820);
638 writeb(0x8, base+0x822);
639
640 iounmap(base);
641 j = pcmcia_release_window(link->win);
642 if (j != CS_SUCCESS)
643 cs_error(link, ReleaseWindow, j);
644 return 0;
645
646}
647
648
649static void fmvj18x_release(struct pcmcia_device *link)
650{
651 DEBUG(0, "fmvj18x_release(0x%p)\n", link);
652 pcmcia_disable_device(link);
653}
654
655static int fmvj18x_suspend(struct pcmcia_device *link)
656{
657 struct net_device *dev = link->priv;
658
659 if (link->open)
660 netif_device_detach(dev);
661
662 return 0;
663}
664
665static int fmvj18x_resume(struct pcmcia_device *link)
666{
667 struct net_device *dev = link->priv;
668
669 if (link->open) {
670 fjn_reset(dev);
671 netif_device_attach(dev);
672 }
673
674 return 0;
675}
676
677
678
679static struct pcmcia_device_id fmvj18x_ids[] = {
680 PCMCIA_DEVICE_MANF_CARD(0x0004, 0x0004),
681 PCMCIA_DEVICE_PROD_ID12("EAGLE Technology", "NE200 ETHERNET LAN MBH10302 04", 0x528c88c4, 0x74f91e59),
682 PCMCIA_DEVICE_PROD_ID12("Eiger Labs,Inc", "EPX-10BT PC Card Ethernet 10BT", 0x53af556e, 0x877f9922),
683 PCMCIA_DEVICE_PROD_ID12("Eiger labs,Inc.", "EPX-10BT PC Card Ethernet 10BT", 0xf47e6c66, 0x877f9922),
684 PCMCIA_DEVICE_PROD_ID12("FUJITSU", "LAN Card(FMV-J182)", 0x6ee5a3d8, 0x5baf31db),
685 PCMCIA_DEVICE_PROD_ID12("FUJITSU", "MBH10308", 0x6ee5a3d8, 0x3f04875e),
686 PCMCIA_DEVICE_PROD_ID12("FUJITSU TOWA", "LA501", 0xb8451188, 0x12939ba2),
687 PCMCIA_DEVICE_PROD_ID12("HITACHI", "HT-4840-11", 0xf4f43949, 0x773910f4),
688 PCMCIA_DEVICE_PROD_ID12("NextComK.K.", "NC5310B Ver1.0 ", 0x8cef4d3a, 0x075fc7b6),
689 PCMCIA_DEVICE_PROD_ID12("NextComK.K.", "NC5310 Ver1.0 ", 0x8cef4d3a, 0xbccf43e6),
690 PCMCIA_DEVICE_PROD_ID12("RATOC System Inc.", "10BASE_T CARD R280", 0x85c10e17, 0xd9413666),
691 PCMCIA_DEVICE_PROD_ID12("TDK", "LAC-CD02x", 0x1eae9475, 0x8fa0ee70),
692 PCMCIA_DEVICE_PROD_ID12("TDK", "LAC-CF010", 0x1eae9475, 0x7683bc9a),
693 PCMCIA_DEVICE_PROD_ID1("CONTEC Co.,Ltd.", 0x58d8fee2),
694 PCMCIA_DEVICE_PROD_ID1("PCMCIA LAN MBH10304 ES", 0x2599f454),
695 PCMCIA_DEVICE_PROD_ID1("PCMCIA MBH10302", 0x8f4005da),
696 PCMCIA_DEVICE_PROD_ID1("UBKK,V2.0", 0x90888080),
697 PCMCIA_PFC_DEVICE_PROD_ID12(0, "TDK", "GlobalNetworker 3410/3412", 0x1eae9475, 0xd9a93bed),
698 PCMCIA_PFC_DEVICE_PROD_ID12(0, "NEC", "PK-UG-J001" ,0x18df0ba0 ,0x831b1064),
699 PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0d0a),
700 PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0x0e0a),
701 PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x0a05),
702 PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0032, 0x1101),
703 PCMCIA_DEVICE_NULL,
704};
705MODULE_DEVICE_TABLE(pcmcia, fmvj18x_ids);
706
707static struct pcmcia_driver fmvj18x_cs_driver = {
708 .owner = THIS_MODULE,
709 .drv = {
710 .name = "fmvj18x_cs",
711 },
712 .probe = fmvj18x_probe,
713 .remove = fmvj18x_detach,
714 .id_table = fmvj18x_ids,
715 .suspend = fmvj18x_suspend,
716 .resume = fmvj18x_resume,
717};
718
719static int __init init_fmvj18x_cs(void)
720{
721 return pcmcia_register_driver(&fmvj18x_cs_driver);
722}
723
724static void __exit exit_fmvj18x_cs(void)
725{
726 pcmcia_unregister_driver(&fmvj18x_cs_driver);
727}
728
729module_init(init_fmvj18x_cs);
730module_exit(exit_fmvj18x_cs);
731
732
733
734static irqreturn_t fjn_interrupt(int irq, void *dev_id)
735{
736 struct net_device *dev = dev_id;
737 local_info_t *lp = netdev_priv(dev);
738 kio_addr_t ioaddr;
739 unsigned short tx_stat, rx_stat;
740
741 if (lp == NULL) {
742 printk(KERN_NOTICE "fjn_interrupt(): irq %d for "
743 "unknown device.\n", irq);
744 return IRQ_NONE;
745 }
746 ioaddr = dev->base_addr;
747
748
749 outw(0x0000, ioaddr + TX_INTR);
750
751
752 udelay(1);
753
754
755 tx_stat = inb(ioaddr + TX_STATUS);
756 rx_stat = inb(ioaddr + RX_STATUS);
757
758
759 outb(tx_stat, ioaddr + TX_STATUS);
760 outb(rx_stat, ioaddr + RX_STATUS);
761
762 DEBUG(4, "%s: interrupt, rx_status %02x.\n", dev->name, rx_stat);
763 DEBUG(4, " tx_status %02x.\n", tx_stat);
764
765 if (rx_stat || (inb(ioaddr + RX_MODE) & F_BUF_EMP) == 0) {
766
767 fjn_rx(dev);
768 }
769 if (tx_stat & F_TMT_RDY) {
770 lp->stats.tx_packets += lp->sent ;
771 lp->sent = 0 ;
772 if (lp->tx_queue) {
773 outb(DO_TX | lp->tx_queue, ioaddr + TX_START);
774 lp->sent = lp->tx_queue ;
775 lp->tx_queue = 0;
776 lp->tx_queue_len = 0;
777 dev->trans_start = jiffies;
778 } else {
779 lp->tx_started = 0;
780 }
781 netif_wake_queue(dev);
782 }
783 DEBUG(4, "%s: exiting interrupt,\n", dev->name);
784 DEBUG(4, " tx_status %02x, rx_status %02x.\n", tx_stat, rx_stat);
785
786 outb(D_TX_INTR, ioaddr + TX_INTR);
787 outb(D_RX_INTR, ioaddr + RX_INTR);
788 return IRQ_HANDLED;
789
790}
791
792
793
794static void fjn_tx_timeout(struct net_device *dev)
795{
796 struct local_info_t *lp = netdev_priv(dev);
797 kio_addr_t ioaddr = dev->base_addr;
798
799 printk(KERN_NOTICE "%s: transmit timed out with status %04x, %s?\n",
800 dev->name, htons(inw(ioaddr + TX_STATUS)),
801 inb(ioaddr + TX_STATUS) & F_TMT_RDY
802 ? "IRQ conflict" : "network cable problem");
803 printk(KERN_NOTICE "%s: timeout registers: %04x %04x %04x "
804 "%04x %04x %04x %04x %04x.\n",
805 dev->name, htons(inw(ioaddr + 0)),
806 htons(inw(ioaddr + 2)), htons(inw(ioaddr + 4)),
807 htons(inw(ioaddr + 6)), htons(inw(ioaddr + 8)),
808 htons(inw(ioaddr +10)), htons(inw(ioaddr +12)),
809 htons(inw(ioaddr +14)));
810 lp->stats.tx_errors++;
811
812 local_irq_disable();
813 fjn_reset(dev);
814
815 lp->tx_started = 0;
816 lp->tx_queue = 0;
817 lp->tx_queue_len = 0;
818 lp->sent = 0;
819 lp->open_time = jiffies;
820 local_irq_enable();
821 netif_wake_queue(dev);
822}
823
824static int fjn_start_xmit(struct sk_buff *skb, struct net_device *dev)
825{
826 struct local_info_t *lp = netdev_priv(dev);
827 kio_addr_t ioaddr = dev->base_addr;
828 short length = skb->len;
829
830 if (length < ETH_ZLEN)
831 {
832 if (skb_padto(skb, ETH_ZLEN))
833 return 0;
834 length = ETH_ZLEN;
835 }
836
837 netif_stop_queue(dev);
838
839 {
840 unsigned char *buf = skb->data;
841
842 if (length > ETH_FRAME_LEN) {
843 printk(KERN_NOTICE "%s: Attempting to send a large packet"
844 " (%d bytes).\n", dev->name, length);
845 return 1;
846 }
847
848 DEBUG(4, "%s: Transmitting a packet of length %lu.\n",
849 dev->name, (unsigned long)skb->len);
850 lp->stats.tx_bytes += skb->len;
851
852
853 outw(0x0000, ioaddr + TX_INTR);
854
855
856 udelay(1);
857
858 outw(length, ioaddr + DATAPORT);
859 outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
860
861 lp->tx_queue++;
862 lp->tx_queue_len += ((length+3) & ~1);
863
864 if (lp->tx_started == 0) {
865
866 outb(DO_TX | lp->tx_queue, ioaddr + TX_START);
867 lp->sent = lp->tx_queue ;
868 lp->tx_queue = 0;
869 lp->tx_queue_len = 0;
870 dev->trans_start = jiffies;
871 lp->tx_started = 1;
872 netif_start_queue(dev);
873 } else {
874 if( sram_config == 0 ) {
875 if (lp->tx_queue_len < (4096 - (ETH_FRAME_LEN +2)) )
876
877 netif_start_queue(dev);
878 } else {
879 if (lp->tx_queue_len < (8192 - (ETH_FRAME_LEN +2)) &&
880 lp->tx_queue < 127 )
881
882 netif_start_queue(dev);
883 }
884 }
885
886
887 outb(D_TX_INTR, ioaddr + TX_INTR);
888 outb(D_RX_INTR, ioaddr + RX_INTR);
889 }
890 dev_kfree_skb (skb);
891
892 return 0;
893}
894
895
896
897static void fjn_reset(struct net_device *dev)
898{
899 struct local_info_t *lp = netdev_priv(dev);
900 kio_addr_t ioaddr = dev->base_addr;
901 int i;
902
903 DEBUG(4, "fjn_reset(%s) called.\n",dev->name);
904
905
906 if( sram_config == 0 )
907 outb(CONFIG0_RST, ioaddr + CONFIG_0);
908 else
909 outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
910
911
912 if (lp->cardtype == MBH10302)
913 outb(BANK_0, ioaddr + CONFIG_1);
914 else
915 outb(BANK_0U, ioaddr + CONFIG_1);
916
917
918 outb(D_TX_MODE, ioaddr + TX_MODE);
919
920 outb(ID_MATCHED, ioaddr + RX_MODE);
921
922
923 for (i = 0; i < 6; i++)
924 outb(dev->dev_addr[i], ioaddr + NODE_ID + i);
925
926
927 set_rx_mode(dev);
928
929
930 if (lp->cardtype == MBH10302)
931 outb(BANK_2, ioaddr + CONFIG_1);
932 else
933 outb(BANK_2U, ioaddr + CONFIG_1);
934
935
936 if( lp->cardtype == TDK || lp->cardtype == CONTEC)
937 outb(TDK_AUTO_MODE, ioaddr + COL_CTRL);
938 else
939 outb(AUTO_MODE, ioaddr + COL_CTRL);
940
941
942 outb(0x00, ioaddr + BMPR12);
943 outb(0x00, ioaddr + BMPR13);
944
945
946 outb(0x01, ioaddr + RX_SKIP);
947
948
949 if( sram_config == 0 )
950 outb(CONFIG0_DFL, ioaddr + CONFIG_0);
951 else
952 outb(CONFIG0_DFL_1, ioaddr + CONFIG_0);
953
954
955 inw(ioaddr + DATAPORT);
956 inw(ioaddr + DATAPORT);
957
958
959 outb(0xff, ioaddr + TX_STATUS);
960 outb(0xff, ioaddr + RX_STATUS);
961
962 if (lp->cardtype == MBH10302)
963 outb(INTR_OFF, ioaddr + LAN_CTRL);
964
965
966 outb(D_TX_INTR, ioaddr + TX_INTR);
967 outb(D_RX_INTR, ioaddr + RX_INTR);
968
969
970 if (lp->cardtype == MBH10302)
971 outb(INTR_ON, ioaddr + LAN_CTRL);
972}
973
974
975
976static void fjn_rx(struct net_device *dev)
977{
978 struct local_info_t *lp = netdev_priv(dev);
979 kio_addr_t ioaddr = dev->base_addr;
980 int boguscount = 10;
981
982 DEBUG(4, "%s: in rx_packet(), rx_status %02x.\n",
983 dev->name, inb(ioaddr + RX_STATUS));
984
985 while ((inb(ioaddr + RX_MODE) & F_BUF_EMP) == 0) {
986 u_short status = inw(ioaddr + DATAPORT);
987
988 DEBUG(4, "%s: Rxing packet mode %02x status %04x.\n",
989 dev->name, inb(ioaddr + RX_MODE), status);
990#ifndef final_version
991 if (status == 0) {
992 outb(F_SKP_PKT, ioaddr + RX_SKIP);
993 break;
994 }
995#endif
996 if ((status & 0xF0) != 0x20) {
997 lp->stats.rx_errors++;
998 if (status & F_LEN_ERR) lp->stats.rx_length_errors++;
999 if (status & F_ALG_ERR) lp->stats.rx_frame_errors++;
1000 if (status & F_CRC_ERR) lp->stats.rx_crc_errors++;
1001 if (status & F_OVR_FLO) lp->stats.rx_over_errors++;
1002 } else {
1003 u_short pkt_len = inw(ioaddr + DATAPORT);
1004
1005 struct sk_buff *skb;
1006
1007 if (pkt_len > 1550) {
1008 printk(KERN_NOTICE "%s: The FMV-18x claimed a very "
1009 "large packet, size %d.\n", dev->name, pkt_len);
1010 outb(F_SKP_PKT, ioaddr + RX_SKIP);
1011 lp->stats.rx_errors++;
1012 break;
1013 }
1014 skb = dev_alloc_skb(pkt_len+2);
1015 if (skb == NULL) {
1016 printk(KERN_NOTICE "%s: Memory squeeze, dropping "
1017 "packet (len %d).\n", dev->name, pkt_len);
1018 outb(F_SKP_PKT, ioaddr + RX_SKIP);
1019 lp->stats.rx_dropped++;
1020 break;
1021 }
1022
1023 skb_reserve(skb, 2);
1024 insw(ioaddr + DATAPORT, skb_put(skb, pkt_len),
1025 (pkt_len + 1) >> 1);
1026 skb->protocol = eth_type_trans(skb, dev);
1027
1028#ifdef PCMCIA_DEBUG
1029 if (pc_debug > 5) {
1030 int i;
1031 printk(KERN_DEBUG "%s: Rxed packet of length %d: ",
1032 dev->name, pkt_len);
1033 for (i = 0; i < 14; i++)
1034 printk(" %02x", skb->data[i]);
1035 printk(".\n");
1036 }
1037#endif
1038
1039 netif_rx(skb);
1040 dev->last_rx = jiffies;
1041 lp->stats.rx_packets++;
1042 lp->stats.rx_bytes += pkt_len;
1043 }
1044 if (--boguscount <= 0)
1045 break;
1046 }
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067 return;
1068}
1069
1070
1071
1072static void netdev_get_drvinfo(struct net_device *dev,
1073 struct ethtool_drvinfo *info)
1074{
1075 strcpy(info->driver, DRV_NAME);
1076 strcpy(info->version, DRV_VERSION);
1077 sprintf(info->bus_info, "PCMCIA 0x%lx", dev->base_addr);
1078}
1079
1080#ifdef PCMCIA_DEBUG
1081static u32 netdev_get_msglevel(struct net_device *dev)
1082{
1083 return pc_debug;
1084}
1085
1086static void netdev_set_msglevel(struct net_device *dev, u32 level)
1087{
1088 pc_debug = level;
1089}
1090#endif
1091
1092static const struct ethtool_ops netdev_ethtool_ops = {
1093 .get_drvinfo = netdev_get_drvinfo,
1094#ifdef PCMCIA_DEBUG
1095 .get_msglevel = netdev_get_msglevel,
1096 .set_msglevel = netdev_set_msglevel,
1097#endif
1098};
1099
1100static int fjn_config(struct net_device *dev, struct ifmap *map){
1101 return 0;
1102}
1103
1104static int fjn_open(struct net_device *dev)
1105{
1106 struct local_info_t *lp = netdev_priv(dev);
1107 struct pcmcia_device *link = lp->p_dev;
1108
1109 DEBUG(4, "fjn_open('%s').\n", dev->name);
1110
1111 if (!pcmcia_dev_present(link))
1112 return -ENODEV;
1113
1114 link->open++;
1115
1116 fjn_reset(dev);
1117
1118 lp->tx_started = 0;
1119 lp->tx_queue = 0;
1120 lp->tx_queue_len = 0;
1121 lp->open_time = jiffies;
1122 netif_start_queue(dev);
1123
1124 return 0;
1125}
1126
1127
1128
1129static int fjn_close(struct net_device *dev)
1130{
1131 struct local_info_t *lp = netdev_priv(dev);
1132 struct pcmcia_device *link = lp->p_dev;
1133 kio_addr_t ioaddr = dev->base_addr;
1134
1135 DEBUG(4, "fjn_close('%s').\n", dev->name);
1136
1137 lp->open_time = 0;
1138 netif_stop_queue(dev);
1139
1140
1141 if( sram_config == 0 )
1142 outb(CONFIG0_RST ,ioaddr + CONFIG_0);
1143 else
1144 outb(CONFIG0_RST_1 ,ioaddr + CONFIG_0);
1145
1146
1147
1148
1149 outb(CHIP_OFF ,ioaddr + CONFIG_1);
1150
1151
1152 if (lp->cardtype == MBH10302)
1153 outb(INTR_OFF, ioaddr + LAN_CTRL);
1154
1155 link->open--;
1156
1157 return 0;
1158}
1159
1160
1161
1162static struct net_device_stats *fjn_get_stats(struct net_device *dev)
1163{
1164 local_info_t *lp = netdev_priv(dev);
1165 return &lp->stats;
1166}
1167
1168
1169
1170
1171
1172
1173
1174static void set_rx_mode(struct net_device *dev)
1175{
1176 kio_addr_t ioaddr = dev->base_addr;
1177 u_char mc_filter[8];
1178 u_long flags;
1179 int i;
1180
1181 int saved_bank;
1182 int saved_config_0 = inb(ioaddr + CONFIG_0);
1183
1184 local_irq_save(flags);
1185
1186
1187 if (sram_config == 0)
1188 outb(CONFIG0_RST, ioaddr + CONFIG_0);
1189 else
1190 outb(CONFIG0_RST_1, ioaddr + CONFIG_0);
1191
1192 if (dev->flags & IFF_PROMISC) {
1193 memset(mc_filter, 0xff, sizeof(mc_filter));
1194 outb(3, ioaddr + RX_MODE);
1195 } else if (dev->mc_count > MC_FILTERBREAK
1196 || (dev->flags & IFF_ALLMULTI)) {
1197
1198 memset(mc_filter, 0xff, sizeof(mc_filter));
1199 outb(2, ioaddr + RX_MODE);
1200 } else if (dev->mc_count == 0) {
1201 memset(mc_filter, 0x00, sizeof(mc_filter));
1202 outb(1, ioaddr + RX_MODE);
1203 } else {
1204 struct dev_mc_list *mclist;
1205 int i;
1206
1207 memset(mc_filter, 0, sizeof(mc_filter));
1208 for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
1209 i++, mclist = mclist->next) {
1210 unsigned int bit =
1211 ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 26;
1212 mc_filter[bit >> 3] |= (1 << (bit & 7));
1213 }
1214 outb(2, ioaddr + RX_MODE);
1215 }
1216
1217
1218 saved_bank = inb(ioaddr + CONFIG_1);
1219 outb(0xe4, ioaddr + CONFIG_1);
1220
1221 for (i = 0; i < 8; i++)
1222 outb(mc_filter[i], ioaddr + MAR_ADR + i);
1223 outb(saved_bank, ioaddr + CONFIG_1);
1224
1225 outb(saved_config_0, ioaddr + CONFIG_0);
1226
1227 local_irq_restore(flags);
1228}
1229