lp486e.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:33k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* Intel Professional Workstation/panther ethernet driver */
  2. /* lp486e.c: A panther 82596 ethernet driver for linux. */
  3. /*
  4.     History and copyrights:
  5.     Driver skeleton
  6.         Written 1993 by Donald Becker.
  7.         Copyright 1993 United States Government as represented by the Director,
  8.         National Security Agency.  This software may only be used and
  9. distributed according to the terms of the GNU General Public License
  10. as modified by SRC, incorporated herein by reference.
  11.         The author may be reached as becker@scyld.com, or C/O
  12. Scyld Computing Corporation
  13. 410 Severn Ave., Suite 210
  14. Annapolis MD 21403
  15.     Apricot
  16.         Written 1994 by Mark Evans.
  17.         This driver is for the Apricot 82596 bus-master interface
  18.         Modularised 12/94 Mark Evans
  19.     Professional Workstation
  20. Derived from apricot.c by Ard van Breemen
  21. <ard@murphy.nl>|<ard@cstmel.hobby.nl>|<ard@cstmel.nl.eu.org>
  22. Credits:
  23. Thanks to Murphy Software BV for letting me write this in their time.
  24. Well, actually, I get payed doing this...
  25. (Also: see http://www.murphy.nl for murphy, and my homepage ~ard for
  26. more information on the Professional Workstation)
  27.     Present version
  28. aeb@cwi.nl
  29. */
  30. /*
  31.     There are currently two motherboards that I know of in the
  32.     professional workstation. The only one that I know is the
  33.     intel panther motherboard. -- ard
  34. */
  35. /*
  36. The pws is equipped with an intel 82596. This is a very intelligent controller
  37. which runs its own micro-code. Communication with the hostprocessor is done
  38. through linked lists of commands and buffers in the hostprocessors memory.
  39. A complete description of the 82596 is available from intel. Search for
  40. a file called "29021806.pdf". It is a complete description of the chip itself.
  41. To use it for the pws some additions are needed regarding generation of
  42. the PORT and CA signal, and the interrupt glue needed for a pc.
  43. I/O map:
  44. PORT  SIZE ACTION MEANING
  45. 0xCB0    2 WRITE  Lower 16 bits for PORT command
  46. 0xCB2    2 WRITE  Upper 16 bits for PORT command, and issue of PORT command
  47. 0xCB4    1 WRITE  Generation of CA signal
  48. 0xCB8    1 WRITE  Clear interrupt glue
  49. All other communication is through memory!
  50. */
  51. #define SLOW_DOWN_IO udelay(5);
  52. #include <linux/module.h>
  53. #include <linux/init.h>
  54. #include <linux/delay.h>
  55. #include <linux/kernel.h>
  56. #include <linux/sched.h>
  57. #include <linux/string.h>
  58. #include <linux/ptrace.h>
  59. #include <linux/errno.h>
  60. #include <linux/ioport.h>
  61. #include <linux/slab.h>
  62. #include <linux/interrupt.h>
  63. #include <linux/netdevice.h>
  64. #include <linux/etherdevice.h>
  65. #include <linux/skbuff.h>
  66. #include <asm/bitops.h>
  67. #include <asm/io.h>
  68. #include <asm/dma.h>
  69. /* debug print flags */
  70. #define LOG_SRCDST    0x80000000
  71. #define LOG_STATINT   0x40000000
  72. #define LOG_STARTINT  0x20000000
  73. #define i596_debug debug
  74. static int i596_debug = 0;
  75. static const char * const medianame[] = {
  76. "10baseT", "AUI",
  77. "10baseT-FD", "AUI-FD",
  78. };
  79. #define LP486E_TOTAL_SIZE 16
  80. #define I596_NULL (0xffffffff)
  81. #define CMD_EOL 0x8000 /* The last command of the list, stop. */
  82. #define CMD_SUSP 0x4000 /* Suspend after doing cmd. */
  83. #define CMD_INTR 0x2000 /* Interrupt after doing cmd. */
  84. #define CMD_FLEX 0x0008 /* Enable flexible memory model */
  85. enum commands {
  86. CmdNOP = 0,
  87. CmdIASetup = 1,
  88. CmdConfigure = 2,
  89. CmdMulticastList = 3,
  90. CmdTx = 4,
  91. CmdTDR = 5,
  92. CmdDump = 6,
  93. CmdDiagnose = 7
  94. };
  95. char *CUcmdnames[8] = { "NOP", "IASetup", "Configure", "MulticastList",
  96. "Tx", "TDR", "Dump", "Diagnose" };
  97. /* Status word bits */
  98. #define STAT_CX 0x8000 /* The CU finished executing a command
  99.    with the Interrupt bit set */
  100. #define STAT_FR 0x4000 /* The RU finished receiving a frame */
  101. #define STAT_CNA 0x2000 /* The CU left the active state */
  102. #define STAT_RNR 0x1000 /* The RU left the active state */
  103. #define STAT_ACK (STAT_CX | STAT_FR | STAT_CNA | STAT_RNR)
  104. #define STAT_CUS 0x0700 /* Status of CU: 0: idle, 1: suspended,
  105.    2: active, 3-7: unused */
  106. #define STAT_RUS 0x00f0 /* Status of RU: 0: idle, 1: suspended,
  107.    2: no resources, 4: ready,
  108.    10: no resources due to no more RBDs,
  109.    12: no more RBDs, other: unused */
  110. #define STAT_T 0x0008 /* Bus throttle timers loaded */
  111. #define STAT_ZERO 0x0807 /* Always zero */
  112. #if 0
  113. static char *CUstates[8] = {
  114. "idle", "suspended", "active", 0, 0, 0, 0, 0
  115. };
  116. static char *RUstates[16] = {
  117. "idle", "suspended", "no resources", 0, "ready", 0, 0, 0,
  118. 0, 0, "no RBDs", 0, "out of RBDs", 0, 0, 0
  119. };
  120. static void
  121. i596_out_status(int status) {
  122. int bad = 0;
  123. char *s;
  124. printk("status %4.4x:", status);
  125. if (status == 0xffff)
  126. printk(" strange..n");
  127. else {
  128. if (status & STAT_CX)
  129. printk("  CU done");
  130. if (status & STAT_CNA)
  131. printk("  CU stopped");
  132. if (status & STAT_FR)
  133. printk("  got a frame");
  134. if (status & STAT_RNR)
  135. printk("  RU stopped");
  136. if (status & STAT_T)
  137. printk("  throttled");
  138. if (status & STAT_ZERO)
  139. bad = 1;
  140. s = CUstates[(status & STAT_CUS) >> 8];
  141. if (!s)
  142. bad = 1;
  143. else
  144. printk("  CU(%s)", s);
  145. s = RUstates[(status & STAT_RUS) >> 4];
  146. if (!s)
  147. bad = 1;
  148. else
  149. printk("  RU(%s)", s);
  150. if (bad)
  151. printk("  bad status");
  152. printk("n");
  153. }
  154. }
  155. #endif
  156. /* Command word bits */
  157. #define ACK_CX 0x8000
  158. #define ACK_FR 0x4000
  159. #define ACK_CNA 0x2000
  160. #define ACK_RNR 0x1000
  161. #define CUC_START 0x0100
  162. #define CUC_RESUME 0x0200
  163. #define CUC_SUSPEND 0x0300
  164. #define CUC_ABORT 0x0400
  165. #define RX_START 0x0010
  166. #define RX_RESUME 0x0020
  167. #define RX_SUSPEND 0x0030
  168. #define RX_ABORT 0x0040
  169. typedef u32 phys_addr;
  170. static inline phys_addr
  171. va_to_pa(volatile void *x) {
  172. return x ? virt_to_bus(x) : I596_NULL;
  173. }
  174. static inline void *
  175. pa_to_va(phys_addr x) {
  176. return (x == I596_NULL) ? NULL : bus_to_virt(x);
  177. }
  178. /* status bits for cmd */
  179. #define CMD_STAT_C 0x8000 /* CU command complete */
  180. #define CMD_STAT_B 0x4000 /* CU command in progress */
  181. #define CMD_STAT_OK 0x2000 /* CU command completed without errors */
  182. #define CMD_STAT_A 0x1000 /* CU command abnormally terminated */
  183. struct i596_cmd { /* 8 bytes */
  184. unsigned short status;
  185. unsigned short command;
  186. phys_addr pa_next; /* va_to_pa(struct i596_cmd *next) */
  187. };
  188. #define EOF 0x8000
  189. #define SIZE_MASK 0x3fff
  190. struct i596_tbd {
  191. unsigned short size;
  192. unsigned short pad;
  193. phys_addr pa_next; /* va_to_pa(struct i596_tbd *next) */
  194. phys_addr pa_data; /* va_to_pa(char *data) */
  195. struct sk_buff *skb;
  196. };
  197. struct tx_cmd {
  198. struct i596_cmd cmd;
  199. phys_addr pa_tbd; /* va_to_pa(struct i596_tbd *tbd) */
  200. unsigned short size;
  201. unsigned short pad;
  202. };
  203. /* status bits for rfd */
  204. #define RFD_STAT_C 0x8000 /* Frame reception complete */
  205. #define RFD_STAT_B 0x4000 /* Frame reception in progress */
  206. #define RFD_STAT_OK 0x2000 /* Frame received without errors */
  207. #define RFD_STATUS 0x1fff
  208. #define RFD_LENGTH_ERR 0x1000
  209. #define RFD_CRC_ERR 0x0800
  210. #define RFD_ALIGN_ERR 0x0400
  211. #define RFD_NOBUFS_ERR 0x0200
  212. #define RFD_DMA_ERR 0x0100 /* DMA overrun failure to acquire system bus */
  213. #define RFD_SHORT_FRAME_ERR 0x0080
  214. #define RFD_NOEOP_ERR 0x0040
  215. #define RFD_TRUNC_ERR 0x0020
  216. #define RFD_MULTICAST  0x0002 /* 0: destination had our address
  217.    1: destination was broadcast/multicast */
  218. #define RFD_COLLISION  0x0001
  219. /* receive frame descriptor */
  220. struct i596_rfd {
  221. unsigned short stat;
  222. unsigned short cmd;
  223. phys_addr pa_next; /* va_to_pa(struct i596_rfd *next) */
  224. phys_addr pa_rbd; /* va_to_pa(struct i596_rbd *rbd) */
  225. unsigned short count;
  226. unsigned short size;
  227. char data[1532];
  228. };
  229. #define RBD_EL 0x8000
  230. #define RBD_P 0x4000
  231. #define RBD_SIZEMASK 0x3fff
  232. #define RBD_EOF 0x8000
  233. #define RBD_F 0x4000
  234. /* receive buffer descriptor */
  235. struct i596_rbd {
  236. unsigned short size;
  237. unsigned short pad;
  238. phys_addr pa_next; /* va_to_pa(struct i596_tbd *next) */
  239. phys_addr pa_data; /* va_to_pa(char *data) */
  240. phys_addr pa_prev; /* va_to_pa(struct i596_tbd *prev) */
  241. /* Driver private part */
  242. struct sk_buff *skb;
  243. };
  244. #define RX_RING_SIZE 64
  245. #define RX_SKBSIZE (ETH_FRAME_LEN+10)
  246. #define RX_RBD_SIZE 32
  247. /* System Control Block - 40 bytes */
  248. struct i596_scb {
  249. u16 status; /* 0 */
  250. u16 command; /* 2 */
  251. phys_addr pa_cmd; /* 4 - va_to_pa(struct i596_cmd *cmd) */
  252. phys_addr pa_rfd; /* 8 - va_to_pa(struct i596_rfd *rfd) */
  253. u32 crc_err; /* 12 */
  254. u32 align_err; /* 16 */
  255. u32 resource_err; /* 20 */
  256. u32 over_err; /* 24 */
  257. u32 rcvdt_err; /* 28 */
  258. u32 short_err; /* 32 */
  259. u16 t_on; /* 36 */
  260. u16 t_off; /* 38 */
  261. };
  262. /* Intermediate System Configuration Pointer - 8 bytes */
  263. struct i596_iscp {
  264. u32 busy; /* 0 */
  265. phys_addr pa_scb; /* 4 - va_to_pa(struct i596_scb *scb) */
  266. };
  267. /* System Configuration Pointer - 12 bytes */
  268. struct i596_scp {
  269. u32 sysbus; /* 0 */
  270. u32 pad; /* 4 */
  271. phys_addr pa_iscp; /* 8 - va_to_pa(struct i596_iscp *iscp) */
  272. };
  273. /* Selftest and dump results - needs 16-byte alignment */
  274. /*
  275.  * The size of the dump area is 304 bytes. When the dump is executed
  276.  * by the Port command an extra word will be appended to the dump area.
  277.  * The extra word is a copy of the Dump status word (containing the
  278.  * C, B, OK bits). [I find 0xa006, with a0 for C+OK and 6 for dump]
  279.  */
  280. struct i596_dump {
  281. u16 dump[153]; /* (304 = 130h) + 2 bytes */
  282. };
  283. struct i596_private { /* aligned to a 16-byte boundary */
  284. struct i596_scp scp; /* 0 - needs 16-byte alignment */
  285. struct i596_iscp iscp; /* 12 */
  286. struct i596_scb scb; /* 20 */
  287. u32 dummy; /* 60 */
  288. struct i596_dump dump; /* 64 - needs 16-byte alignment */
  289. struct i596_cmd set_add;
  290. char eth_addr[8]; /* directly follows set_add */
  291. struct i596_cmd set_conf;
  292. char i596_config[16]; /* directly follows set_conf */
  293. struct i596_cmd tdr;
  294. unsigned long tdr_stat; /* directly follows tdr */
  295. int last_restart;
  296. volatile struct i596_rbd *rbd_list;
  297. volatile struct i596_rbd *rbd_tail;
  298. volatile struct i596_rfd *rx_tail;
  299. volatile struct i596_cmd *cmd_tail;
  300. volatile struct i596_cmd *cmd_head;
  301. int cmd_backlog;
  302. unsigned long last_cmd;
  303. struct net_device_stats stats;
  304. };
  305. static char init_setup[14] = {
  306. 0x8E, /* length 14 bytes, prefetch on */
  307. 0xC8, /* default: fifo to 8, monitor off */
  308. 0x40, /* default: don't save bad frames (apricot.c had 0x80) */
  309. 0x2E, /* (default is 0x26)
  310.    No source address insertion, 8 byte preamble */
  311. 0x00, /* default priority and backoff */
  312. 0x60, /* default interframe spacing */
  313. 0x00, /* default slot time LSB */
  314. 0xf2, /* default slot time and nr of retries */
  315. 0x00, /* default various bits
  316.    (0: promiscuous mode, 1: broadcast disable,
  317.     2: encoding mode, 3: transmit on no CRS,
  318.     4: no CRC insertion, 5: CRC type,
  319.     6: bit stuffing, 7: padding) */
  320. 0x00, /* default carrier sense and collision detect */
  321. 0x40, /* default minimum frame length */
  322. 0xff, /* (default is 0xff, and that is what apricot.c has;
  323.    elp486.c has 0xfb: Enable crc append in memory.) */
  324. 0x00, /* default: not full duplex */
  325. 0x7f /* (default is 0x3f) multi IA */
  326. };
  327. static int i596_open(struct net_device *dev);
  328. static int i596_start_xmit(struct sk_buff *skb, struct net_device *dev);
  329. static void i596_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  330. static int i596_close(struct net_device *dev);
  331. static struct net_device_stats *i596_get_stats(struct net_device *dev);
  332. static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd);
  333. static void print_eth(char *);
  334. static void set_multicast_list(struct net_device *dev);
  335. static void i596_tx_timeout(struct net_device *dev);
  336. static int
  337. i596_timeout(struct net_device *dev, char *msg, int ct) {
  338. volatile struct i596_private *lp;
  339. int boguscnt = ct;
  340. lp = (struct i596_private *) dev->priv;
  341. while (lp->scb.command) {
  342. if (--boguscnt == 0) {
  343. printk("%s: %s timed out - stat %4.4x, cmd %4.4xn",
  344.        dev->name, msg,
  345.        lp->scb.status, lp->scb.command);
  346. return 1;
  347. }
  348. udelay(5);
  349. }
  350. return 0;
  351. }
  352. static inline int
  353. init_rx_bufs(struct net_device *dev, int num) {
  354. volatile struct i596_private *lp;
  355. struct i596_rfd *rfd;
  356. int i;
  357. // struct i596_rbd *rbd;
  358. lp = (struct i596_private *) dev->priv;
  359. lp->scb.pa_rfd = I596_NULL;
  360. for (i = 0; i < num; i++) {
  361. rfd = kmalloc(sizeof(struct i596_rfd), GFP_KERNEL);
  362. if (rfd == NULL)
  363. break;
  364. rfd->stat = 0;
  365. rfd->pa_rbd = I596_NULL;
  366. rfd->count = 0;
  367. rfd->size = 1532;
  368. if (i == 0) {
  369. rfd->cmd = CMD_EOL;
  370. lp->rx_tail = rfd;
  371. } else {
  372. rfd->cmd = 0;
  373. }
  374. rfd->pa_next = lp->scb.pa_rfd;
  375. lp->scb.pa_rfd = va_to_pa(rfd);
  376. lp->rx_tail->pa_next = lp->scb.pa_rfd;
  377. }
  378. #if 0
  379. for (i = 0; i<RX_RBD_SIZE; i++) {
  380. rbd = kmalloc(sizeof(struct i596_rbd), GFP_KERNEL);
  381. if (rbd) {
  382. rbd->pad = 0;
  383. rbd->count = 0;
  384. rbd->skb = dev_alloc_skb(RX_SKB_SIZE);
  385. if (!rbd->skb) {
  386. printk("dev_alloc_skb failed");
  387. }
  388. rbd->next = rfd->rbd;
  389. if (i) {
  390. rfd->rbd->prev = rbd;
  391. rbd->size = RX_SKB_SIZE;
  392. } else {
  393. rbd->size = (RX_SKB_SIZE | RBD_EL);
  394. lp->rbd_tail = rbd;
  395. }
  396. rfd->rbd = rbd;
  397. } else {
  398. printk("Could not kmalloc rbdn");
  399. }
  400. }
  401. lp->rbd_tail->next = rfd->rbd;
  402. #endif
  403. return (i);
  404. }
  405. static inline void
  406. remove_rx_bufs(struct net_device *dev) {
  407. struct i596_private *lp;
  408. struct i596_rfd *rfd;
  409. lp = (struct i596_private *) dev->priv;
  410. lp->rx_tail->pa_next = I596_NULL;
  411. do {
  412. rfd = pa_to_va(lp->scb.pa_rfd);
  413. lp->scb.pa_rfd = rfd->pa_next;
  414. kfree(rfd);
  415. } while (rfd != lp->rx_tail);
  416. lp->rx_tail = 0;
  417. #if 0
  418. for (lp->rbd_list) {
  419. }
  420. #endif
  421. }
  422. #define PORT_RESET              0x00    /* reset 82596 */
  423. #define PORT_SELFTEST           0x01    /* selftest */
  424. #define PORT_ALTSCP             0x02    /* alternate SCB address */
  425. #define PORT_DUMP               0x03    /* dump */
  426. #define IOADDR 0xcb0 /* real constant */
  427. #define IRQ 10 /* default IRQ - can be changed by ECU */
  428. /* The 82596 requires two 16-bit write cycles for a port command */
  429. static inline void
  430. PORT(phys_addr a, unsigned int cmd) {
  431. if (a & 0xf)
  432. printk("lp486e.c: PORT: address not alignedn");
  433. outw(((a & 0xffff) | cmd), IOADDR);
  434. outw(((a>>16) & 0xffff), IOADDR+2);
  435. }
  436. static inline void
  437. CA(void) {
  438. outb(0, IOADDR+4);
  439. udelay(8);
  440. }
  441. static inline void
  442. CLEAR_INT(void) {
  443. outb(0, IOADDR+8);
  444. }
  445. #define SIZE(x) (sizeof(x)/sizeof((x)[0]))
  446. #if 0
  447. /* selftest or dump */
  448. static void
  449. i596_port_do(struct net_device *dev, int portcmd, char *cmdname) {
  450. volatile struct i596_private *lp = dev->priv;
  451. volatile u16 *outp;
  452. int i, m;
  453. memset((void *)&(lp->dump), 0, sizeof(struct i596_dump));
  454. outp = &(lp->dump.dump[0]);
  455. PORT(va_to_pa(outp), portcmd);
  456. mdelay(30);             /* random, unmotivated */
  457. printk("lp486e i82596 %s result:n", cmdname);
  458. for (m = SIZE(lp->dump.dump); m && lp->dump.dump[m-1] == 0; m--)
  459. ;
  460. for (i = 0; i < m; i++) {
  461. printk(" %04x", lp->dump.dump[i]);
  462. if (i%8 == 7)
  463. printk("n");
  464. }
  465. printk("n");
  466. }
  467. #endif
  468. static int
  469. i596_scp_setup(struct net_device *dev) {
  470. volatile struct i596_private *lp = dev->priv;
  471. int boguscnt;
  472. /* Setup SCP, ISCP, SCB */
  473. /*
  474.  * sysbus bits:
  475.  *  only a single byte is significant - here 0x44
  476.  *  0x80: big endian mode (details depend on stepping)
  477.  *  0x40: 1
  478.  *  0x20: interrupt pin is active low
  479.  *  0x10: lock function disabled
  480.  *  0x08: external triggering of bus throttle timers
  481.  *  0x06: 00: 82586 compat mode, 01: segmented mode, 10: linear mode
  482.  *  0x01: unused
  483.  */
  484. lp->scp.sysbus = 0x00440000;  /* linear mode */
  485. lp->scp.pad = 0; /* must be zero */
  486. lp->scp.pa_iscp = va_to_pa(&(lp->iscp));
  487. /*
  488.  * The CPU sets the ISCP to 1 before it gives the first CA()
  489.  */
  490. lp->iscp.busy = 0x0001;
  491. lp->iscp.pa_scb = va_to_pa(&(lp->scb));
  492. lp->scb.command = 0;
  493. lp->scb.status = 0;
  494. lp->scb.pa_cmd = I596_NULL;
  495. /* lp->scb.pa_rfd has been initialised already */
  496. lp->last_cmd = jiffies;
  497. lp->cmd_backlog = 0;
  498. lp->cmd_head = NULL;
  499. /*
  500.  * Reset the 82596.
  501.  * We need to wait 10 systemclock cycles, and
  502.  * 5 serial clock cycles.
  503.  */
  504. PORT(0, PORT_RESET); /* address part ignored */
  505. udelay(100);
  506. /*
  507.  * Before the CA signal is asserted, the default SCP address
  508.  * (0x00fffff4) can be changed to a 16-byte aligned value
  509.  */
  510. PORT(va_to_pa(&lp->scp), PORT_ALTSCP); /* change the scp address */
  511. /*
  512.  * The initialization procedure begins when a
  513.  * Channel Attention signal is asserted after a reset.
  514.  */
  515. CA();
  516. /*
  517.  * The ISCP busy is cleared by the 82596 after the SCB address is read.
  518.  */
  519. boguscnt = 100;
  520. while (lp->iscp.busy) {
  521. if (--boguscnt == 0) {
  522. /* No i82596 present? */
  523. printk("%s: i82596 initialization timed outn",
  524.        dev->name);
  525. return 1;
  526. }
  527. udelay(5);
  528. }
  529. /* I find here boguscnt==100, so no delay was required. */
  530. return 0;
  531. }
  532. static int
  533. init_i596(struct net_device *dev) {
  534. volatile struct i596_private *lp;
  535. if (i596_scp_setup(dev))
  536. return 1;
  537. lp = (struct i596_private *) dev->priv;
  538. lp->scb.command = 0;
  539. memcpy ((void *)lp->i596_config, init_setup, 14);
  540. lp->set_conf.command = CmdConfigure;
  541. i596_add_cmd(dev, (void *)&lp->set_conf);
  542. memcpy ((void *)lp->eth_addr, dev->dev_addr, 6);
  543. lp->set_add.command = CmdIASetup;
  544. i596_add_cmd(dev, (struct i596_cmd *)&lp->set_add);
  545. lp->tdr.command = CmdTDR;
  546. i596_add_cmd(dev, (struct i596_cmd *)&lp->tdr);
  547. if (lp->scb.command && i596_timeout(dev, "i82596 init", 200))
  548. return 1;
  549. lp->scb.command = RX_START;
  550. CA();
  551. if (lp->scb.command && i596_timeout(dev, "Receive Unit start", 100))
  552. return 1;
  553. return 0;
  554. }
  555. /* Receive a single frame */
  556. static inline int
  557. i596_rx_one(struct net_device *dev, volatile struct i596_private *lp,
  558.     struct i596_rfd *rfd, int *frames) {
  559. if (rfd->stat & RFD_STAT_OK) {
  560. /* a good frame */
  561. int pkt_len = (rfd->count & 0x3fff);
  562. struct sk_buff *skb = dev_alloc_skb(pkt_len);
  563. (*frames)++;
  564. if (rfd->cmd & CMD_EOL)
  565. printk("Received on EOLn");
  566. if (skb == NULL) {
  567. printk ("%s: i596_rx Memory squeeze, "
  568. "dropping packet.n", dev->name);
  569. lp->stats.rx_dropped++;
  570. return 1;
  571. }
  572. skb->dev = dev;
  573. memcpy(skb_put(skb,pkt_len), rfd->data, pkt_len);
  574. skb->protocol = eth_type_trans(skb,dev);
  575. netif_rx(skb);
  576. lp->stats.rx_packets++;
  577. } else {
  578. #if 0
  579. printk("Frame reception error status %04xn",
  580.        rfd->stat);
  581. #endif
  582. lp->stats.rx_errors++;
  583. if (rfd->stat & RFD_COLLISION)
  584. lp->stats.collisions++;
  585. if (rfd->stat & RFD_SHORT_FRAME_ERR)
  586. lp->stats.rx_length_errors++;
  587. if (rfd->stat & RFD_DMA_ERR)
  588. lp->stats.rx_over_errors++;
  589. if (rfd->stat & RFD_NOBUFS_ERR)
  590. lp->stats.rx_fifo_errors++;
  591. if (rfd->stat & RFD_ALIGN_ERR)
  592. lp->stats.rx_frame_errors++;
  593. if (rfd->stat & RFD_CRC_ERR)
  594. lp->stats.rx_crc_errors++;
  595. if (rfd->stat & RFD_LENGTH_ERR)
  596. lp->stats.rx_length_errors++;
  597. }
  598. rfd->stat = rfd->count = 0;
  599. return 0;
  600. }
  601. static int
  602. i596_rx(struct net_device *dev) {
  603. volatile struct i596_private *lp = (struct i596_private *) dev->priv;
  604. struct i596_rfd *rfd;
  605. int frames = 0;
  606. while (1) {
  607. rfd = pa_to_va(lp->scb.pa_rfd);
  608. if (!rfd) {
  609. printk("i596_rx: NULL rfd?n");
  610. return 0;
  611. }
  612. #if 1
  613. if (rfd->stat && !(rfd->stat & (RFD_STAT_C | RFD_STAT_B)))
  614. printk("SF:%p-%04xn", rfd, rfd->stat);
  615. #endif
  616. if (!(rfd->stat & RFD_STAT_C))
  617. break; /* next one not ready */
  618. if (i596_rx_one(dev, lp, rfd, &frames))
  619. break; /* out of memory */
  620. rfd->cmd = CMD_EOL;
  621. lp->rx_tail->cmd = 0;
  622. lp->rx_tail = rfd;
  623. lp->scb.pa_rfd = rfd->pa_next;
  624. }
  625. return frames;
  626. }
  627. static void
  628. i596_cleanup_cmd(struct net_device *dev) {
  629. volatile struct i596_private *lp;
  630. struct i596_cmd *cmd;
  631. lp = (struct i596_private *) dev->priv;
  632. while (lp->cmd_head) {
  633. cmd = (struct i596_cmd *)lp->cmd_head;
  634. lp->cmd_head = pa_to_va(lp->cmd_head->pa_next);
  635. lp->cmd_backlog--;
  636. switch ((cmd->command) & 0x7) {
  637. case CmdTx: {
  638. struct tx_cmd *tx_cmd = (struct tx_cmd *) cmd;
  639. struct i596_tbd * tx_cmd_tbd;
  640. tx_cmd_tbd = pa_to_va(tx_cmd->pa_tbd);
  641. dev_kfree_skb_any(tx_cmd_tbd->skb);
  642. lp->stats.tx_errors++;
  643. lp->stats.tx_aborted_errors++;
  644. cmd->pa_next = I596_NULL;
  645. kfree((unsigned char *)tx_cmd);
  646. netif_wake_queue(dev);
  647. break;
  648. }
  649. case CmdMulticastList: {
  650. // unsigned short count = *((unsigned short *) (ptr + 1));
  651. cmd->pa_next = I596_NULL;
  652. kfree((unsigned char *)cmd);
  653. break;
  654. }
  655. default: {
  656. cmd->pa_next = I596_NULL;
  657. break;
  658. }
  659. }
  660. }
  661. if (lp->scb.command && i596_timeout(dev, "i596_cleanup_cmd", 100))
  662. ;
  663. lp->scb.pa_cmd = va_to_pa(lp->cmd_head);
  664. }
  665. static inline void
  666. i596_reset(struct net_device *dev,
  667.    volatile struct i596_private *lp, int ioaddr) {
  668. if (lp->scb.command && i596_timeout(dev, "i596_reset", 100))
  669. ;
  670. netif_stop_queue(dev);
  671. lp->scb.command = CUC_ABORT | RX_ABORT;
  672. CA();
  673. /* wait for shutdown */
  674. if (lp->scb.command && i596_timeout(dev, "i596_reset(2)", 400))
  675. ;
  676. i596_cleanup_cmd(dev);
  677. i596_rx(dev);
  678. netif_start_queue(dev);
  679. /*dev_kfree_skb(skb, FREE_WRITE);*/
  680. init_i596(dev);
  681. }
  682. static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd) {
  683. volatile struct i596_private *lp = dev->priv;
  684. int ioaddr = dev->base_addr;
  685. unsigned long flags;
  686. cmd->status = 0;
  687. cmd->command |= (CMD_EOL | CMD_INTR);
  688. cmd->pa_next = I596_NULL;
  689. save_flags(flags);
  690. cli();
  691. if (lp->cmd_head) {
  692. lp->cmd_tail->pa_next = va_to_pa(cmd);
  693. } else {
  694. lp->cmd_head = cmd;
  695. if (lp->scb.command && i596_timeout(dev, "i596_add_cmd", 100))
  696. ;
  697. lp->scb.pa_cmd = va_to_pa(cmd);
  698. lp->scb.command = CUC_START;
  699. CA();
  700. }
  701. lp->cmd_tail = cmd;
  702. lp->cmd_backlog++;
  703. lp->cmd_head = pa_to_va(lp->scb.pa_cmd);
  704. restore_flags(flags);
  705. if (lp->cmd_backlog > 16) {
  706. int tickssofar = jiffies - lp->last_cmd;
  707. if (tickssofar < 25) return;
  708. printk("%s: command unit timed out, status resetting.n",
  709.        dev->name);
  710. i596_reset(dev, lp, ioaddr);
  711. }
  712. }
  713. static int
  714. i596_open(struct net_device *dev) {
  715. int i;
  716. i = request_irq(dev->irq, &i596_interrupt, SA_SHIRQ, dev->name, dev);
  717. if (i) {
  718. printk("%s: IRQ %d not freen", dev->name, dev->irq);
  719. return i;
  720. }
  721. if ((i = init_rx_bufs(dev, RX_RING_SIZE)) < RX_RING_SIZE)
  722. printk("%s: only able to allocate %d receive buffersn",
  723.        dev->name, i);
  724. if (i < 4) {
  725. // release buffers
  726. free_irq(dev->irq, dev);
  727. return -EAGAIN;
  728. }
  729. netif_start_queue(dev);
  730. init_i596(dev);
  731. return 0; /* Always succeed */
  732. }
  733. static int
  734. i596_start_xmit (struct sk_buff *skb, struct net_device *dev) {
  735. volatile struct i596_private *lp = dev->priv;
  736. struct tx_cmd *tx_cmd;
  737. short length;
  738. /* If some higher level thinks we've missed a tx-done interrupt
  739.    we are passed NULL. n.b. dev_tint handles the cli()/sti()
  740.    itself. */
  741. if (skb == NULL) {
  742. printk ("What about dev_tintn");
  743. /* dev_tint(dev); */
  744. return 0;
  745. }
  746. /* shouldn't happen */
  747. if (skb->len <= 0)
  748. return 0;
  749. length = (ETH_ZLEN < skb->len) ? skb->len : ETH_ZLEN;
  750. dev->trans_start = jiffies;
  751. tx_cmd = (struct tx_cmd *)
  752.     kmalloc ((sizeof (struct tx_cmd)
  753.       + sizeof (struct i596_tbd)), GFP_ATOMIC);
  754. if (tx_cmd == NULL) {
  755. printk ("%s: i596_xmit Memory squeeze, dropping packet.n",
  756. dev->name);
  757. lp->stats.tx_dropped++;
  758. dev_kfree_skb (skb);
  759. } else {
  760. struct i596_tbd *tx_cmd_tbd;
  761. tx_cmd_tbd = (struct i596_tbd *) (tx_cmd + 1);
  762. tx_cmd->pa_tbd = va_to_pa (tx_cmd_tbd);
  763. tx_cmd_tbd->pa_next = I596_NULL;
  764. tx_cmd->cmd.command = (CMD_FLEX | CmdTx);
  765. tx_cmd->pad = 0;
  766. tx_cmd->size = 0;
  767. tx_cmd_tbd->pad = 0;
  768. tx_cmd_tbd->size = (EOF | length);
  769. tx_cmd_tbd->pa_data = va_to_pa (skb->data);
  770. tx_cmd_tbd->skb = skb;
  771. if (i596_debug & LOG_SRCDST)
  772. print_eth (skb->data);
  773. i596_add_cmd (dev, (struct i596_cmd *) tx_cmd);
  774. lp->stats.tx_packets++;
  775. }
  776. return 0;
  777. }
  778. static void
  779. i596_tx_timeout (struct net_device *dev) {
  780. volatile struct i596_private *lp = dev->priv;
  781. int ioaddr = dev->base_addr;
  782. /* Transmitter timeout, serious problems. */
  783. printk ("%s: transmit timed out, status resetting.n", dev->name);
  784. lp->stats.tx_errors++;
  785. /* Try to restart the adaptor */
  786. if (lp->last_restart == lp->stats.tx_packets) {
  787. printk ("Resetting board.n");
  788. /* Shutdown and restart */
  789. i596_reset (dev, lp, ioaddr);
  790. } else {
  791. /* Issue a channel attention signal */
  792. printk ("Kicking board.n");
  793. lp->scb.command = (CUC_START | RX_START);
  794. CA();
  795. lp->last_restart = lp->stats.tx_packets;
  796. }
  797. netif_wake_queue(dev);
  798. }
  799. static void
  800. print_eth(char *add) {
  801. int i;
  802. printk ("Dest  ");
  803. for (i = 0; i < 6; i++)
  804. printk(" %2.2X", (unsigned char) add[i]);
  805. printk ("n");
  806. printk ("Source");
  807. for (i = 0; i < 6; i++)
  808. printk(" %2.2X", (unsigned char) add[i+6]);
  809. printk ("n");
  810. printk ("type %2.2X%2.2Xn",
  811. (unsigned char) add[12], (unsigned char) add[13]);
  812. }
  813. int __init
  814. lp486e_probe(struct net_device *dev) {
  815. volatile struct i596_private *lp;
  816. unsigned char eth_addr[6] = { 0, 0xaa, 0, 0, 0, 0 };
  817. unsigned char *bios;
  818. int i, j;
  819. int ret = -ENOMEM;
  820. static int probed;
  821. if (probed)
  822. return -ENODEV;
  823. probed++;
  824. if (!request_region(IOADDR, LP486E_TOTAL_SIZE, dev->name)) {
  825. printk(KERN_ERR "lp486e: IO address 0x%x in usen", IOADDR);
  826. return -EBUSY;
  827. }
  828. /*
  829.  * Allocate working memory, 16-byte aligned
  830.  */
  831. dev->mem_start = (unsigned long)
  832. kmalloc(sizeof(struct i596_private) + 0x0f, GFP_KERNEL);
  833. if (!dev->mem_start)
  834. goto err_out;
  835. dev->priv = (void *)((dev->mem_start + 0xf) & 0xfffffff0);
  836. lp = (struct i596_private *) dev->priv;
  837. memset((void *)lp, 0, sizeof(struct i596_private));
  838. /*
  839.  * Do we really have this thing?
  840.  */
  841. if (i596_scp_setup(dev)) {
  842. ret = -ENODEV;
  843. goto err_out_kfree;
  844. }
  845. dev->base_addr = IOADDR;
  846. dev->irq = IRQ;
  847. ether_setup(dev);
  848. /*
  849.  * How do we find the ethernet address? I don't know.
  850.  * One possibility is to look at the EISA configuration area
  851.  * [0xe8000-0xe9fff]. This contains the ethernet address
  852.  * but not at a fixed address - things depend on setup options.
  853.  *
  854.  * If we find no address, or the wrong address, use
  855.  *   ifconfig eth0 hw ether a1:a2:a3:a4:a5:a6
  856.  * with the value found in the BIOS setup.
  857.  */
  858. bios = bus_to_virt(0xe8000);
  859. for (j = 0; j < 0x2000; j++) {
  860. if (bios[j] == 0 && bios[j+1] == 0xaa && bios[j+2] == 0) {
  861. printk("%s: maybe address at BIOS 0x%x:",
  862.        dev->name, 0xe8000+j);
  863. for (i = 0; i < 6; i++) {
  864. eth_addr[i] = bios[i+j];
  865. printk(" %2.2X", eth_addr[i]);
  866. }
  867. printk("n");
  868. }
  869. }
  870. printk("%s: lp486e 82596 at %#3lx, IRQ %d,",
  871.        dev->name, dev->base_addr, dev->irq);
  872. for (i = 0; i < 6; i++)
  873. printk(" %2.2X", dev->dev_addr[i] = eth_addr[i]);
  874. printk("n");
  875. /* The LP486E-specific entries in the device structure. */
  876. dev->open = &i596_open;
  877. dev->stop = &i596_close;
  878. dev->hard_start_xmit = &i596_start_xmit;
  879. dev->get_stats = &i596_get_stats;
  880. dev->set_multicast_list = &set_multicast_list;
  881. dev->watchdog_timeo = 5*HZ;
  882. dev->tx_timeout = i596_tx_timeout;
  883. #if 0
  884. /* selftest reports 0x320925ae - don't know what that means */
  885. i596_port_do(dev, PORT_SELFTEST, "selftest");
  886. i596_port_do(dev, PORT_DUMP, "dump");
  887. #endif
  888. return 0;
  889. err_out_kfree:
  890. kfree ((void *) dev->mem_start);
  891. err_out:
  892. release_region(IOADDR, LP486E_TOTAL_SIZE);
  893. return ret;
  894. }
  895. static void inline
  896. i596_handle_CU_completion(struct net_device *dev,
  897.   volatile struct i596_private *lp,
  898.   unsigned short status,
  899.   unsigned short *ack_cmdp) {
  900. volatile struct i596_cmd *cmd;
  901. int frames_out = 0;
  902. int commands_done = 0;
  903. int cmd_val;
  904. cmd = lp->cmd_head;
  905. while (lp->cmd_head && (lp->cmd_head->status & CMD_STAT_C)) {
  906. cmd = lp->cmd_head;
  907. lp->cmd_head = pa_to_va(lp->cmd_head->pa_next);
  908. lp->cmd_backlog--;
  909. commands_done++;
  910. cmd_val = cmd->command & 0x7;
  911. #if 0
  912. printk("finished CU %s command (%d)n",
  913.        CUcmdnames[cmd_val], cmd_val);
  914. #endif
  915. switch (cmd_val) {
  916. case CmdTx:
  917. {
  918. struct tx_cmd *tx_cmd;
  919. struct i596_tbd *tx_cmd_tbd;
  920. tx_cmd = (struct tx_cmd *) cmd;
  921. tx_cmd_tbd = pa_to_va(tx_cmd->pa_tbd);
  922. frames_out++;
  923. if (cmd->status & CMD_STAT_OK) {
  924. if (i596_debug)
  925. print_eth(pa_to_va(tx_cmd_tbd->pa_data));
  926. } else {
  927. lp->stats.tx_errors++;
  928. if (i596_debug)
  929. printk("transmission failure:%04xn",
  930.        cmd->status);
  931. if (cmd->status & 0x0020)
  932. lp->stats.collisions++;
  933. if (!(cmd->status & 0x0040))
  934. lp->stats.tx_heartbeat_errors++;
  935. if (cmd->status & 0x0400)
  936. lp->stats.tx_carrier_errors++;
  937. if (cmd->status & 0x0800)
  938. lp->stats.collisions++;
  939. if (cmd->status & 0x1000)
  940. lp->stats.tx_aborted_errors++;
  941. }
  942. dev_kfree_skb_irq(tx_cmd_tbd->skb);
  943. cmd->pa_next = I596_NULL;
  944. kfree((unsigned char *)tx_cmd);
  945. netif_wake_queue(dev);
  946. break;
  947. }
  948. case CmdMulticastList:
  949. cmd->pa_next = I596_NULL;
  950. kfree((unsigned char *)cmd);
  951. break;
  952. case CmdTDR:
  953. {
  954. unsigned long status = *((unsigned long *) (cmd + 1));
  955. if (status & 0x8000) {
  956. if (i596_debug)
  957. printk("%s: link ok.n", dev->name);
  958. } else {
  959. if (status & 0x4000)
  960. printk("%s: Transceiver problem.n",
  961.        dev->name);
  962. if (status & 0x2000)
  963. printk("%s: Termination problem.n",
  964.        dev->name);
  965. if (status & 0x1000)
  966. printk("%s: Short circuit.n",
  967.        dev->name);
  968. printk("%s: Time %ld.n",
  969.        dev->name, status & 0x07ff);
  970. }
  971. }
  972. default:
  973. cmd->pa_next = I596_NULL;
  974. lp->last_cmd = jiffies;
  975. }
  976. }
  977. cmd = lp->cmd_head;
  978. while (cmd && (cmd != lp->cmd_tail)) {
  979. cmd->command &= 0x1fff;
  980. cmd = pa_to_va(cmd->pa_next);
  981. }
  982. if (lp->cmd_head)
  983. *ack_cmdp |= CUC_START;
  984. lp->scb.pa_cmd = va_to_pa(lp->cmd_head);
  985. }
  986. static void
  987. i596_interrupt (int irq, void *dev_instance, struct pt_regs *regs) {
  988. struct net_device *dev = (struct net_device *) dev_instance;
  989. volatile struct i596_private *lp;
  990. unsigned short status, ack_cmd = 0;
  991. int frames_in = 0;
  992. if (dev == NULL) {
  993. printk ("i596_interrupt(): irq %d for unknown device.n", irq);
  994. return;
  995. }
  996. lp = (struct i596_private *) dev->priv;
  997. /*
  998.  * The 82596 examines the command, performs the required action,
  999.  * and then clears the SCB command word.
  1000.  */
  1001. if (lp->scb.command && i596_timeout(dev, "interrupt", 40))
  1002. ;
  1003. /*
  1004.  * The status word indicates the status of the 82596.
  1005.  * It is modified only by the 82596.
  1006.  *
  1007.  * [So, we must not clear it. I find often status 0xffff,
  1008.  *  which is not one of the values allowed by the docs.]
  1009.  */
  1010. status = lp->scb.status;
  1011. #if 0
  1012. if (i596_debug) {
  1013. printk("%s: i596 interrupt, ", dev->name);
  1014. i596_out_status(status);
  1015. }
  1016. #endif
  1017. /* Impossible, but it happens - perhaps when we get
  1018.    a receive interrupt but scb.pa_rfd is I596_NULL. */
  1019. if (status == 0xffff) {
  1020. printk("%s: i596_interrupt: got status 0xffffn", dev->name);
  1021. goto out;
  1022. }
  1023. ack_cmd = (status & STAT_ACK);
  1024. if (status & (STAT_CX | STAT_CNA))
  1025. i596_handle_CU_completion(dev, lp, status, &ack_cmd);
  1026. if (status & (STAT_FR | STAT_RNR)) {
  1027. /* Restart the receive unit when it got inactive somehow */
  1028. if ((status & STAT_RNR) && netif_running(dev))
  1029. ack_cmd |= RX_START;
  1030. if (status & STAT_FR) {
  1031. frames_in = i596_rx(dev);
  1032. if (!frames_in)
  1033. printk("receive frame reported, but no framesn");
  1034. }
  1035. }
  1036. /* acknowledge the interrupt */
  1037. /*
  1038. if ((lp->scb.pa_cmd != I596_NULL) && netif_running(dev))
  1039. ack_cmd |= CUC_START;
  1040. */
  1041. if (lp->scb.command && i596_timeout(dev, "i596 interrupt", 100))
  1042. ;
  1043. lp->scb.command = ack_cmd;
  1044. CLEAR_INT();
  1045. CA();
  1046.  out:
  1047. return;
  1048. }
  1049. static int i596_close(struct net_device *dev) {
  1050. volatile struct i596_private *lp = dev->priv;
  1051. netif_stop_queue(dev);
  1052. if (i596_debug)
  1053. printk("%s: Shutting down ethercard, status was %4.4x.n",
  1054.        dev->name, lp->scb.status);
  1055. lp->scb.command = (CUC_ABORT | RX_ABORT);
  1056. CA();
  1057. i596_cleanup_cmd(dev);
  1058. if (lp->scb.command && i596_timeout(dev, "i596_close", 200))
  1059. ;
  1060. free_irq(dev->irq, dev);
  1061. remove_rx_bufs(dev);
  1062. return 0;
  1063. }
  1064. static struct net_device_stats * i596_get_stats(struct net_device *dev) {
  1065. struct i596_private *lp = dev->priv;
  1066. return &lp->stats;
  1067. }
  1068. /*
  1069. * Set or clear the multicast filter for this adaptor.
  1070. */
  1071. static void set_multicast_list(struct net_device *dev) {
  1072. volatile struct i596_private *lp = dev->priv;
  1073. struct i596_cmd *cmd;
  1074. if (i596_debug > 1)
  1075. printk ("%s: set multicast list %dn",
  1076. dev->name, dev->mc_count);
  1077. if (dev->mc_count > 0) {
  1078. struct dev_mc_list *dmi;
  1079. char *cp;
  1080. cmd = (struct i596_cmd *)
  1081. kmalloc(sizeof(struct i596_cmd)+2+dev->mc_count*6,
  1082. GFP_ATOMIC);
  1083. if (cmd == NULL) {
  1084. printk ("%s: set_multicast Memory squeeze.n",
  1085. dev->name);
  1086. return;
  1087. }
  1088. cmd->command = CmdMulticastList;
  1089. *((unsigned short *) (cmd + 1)) = dev->mc_count * 6;
  1090. cp = ((char *)(cmd + 1))+2;
  1091. for (dmi = dev->mc_list; dmi != NULL; dmi = dmi->next) {
  1092. memcpy(cp, dmi,6);
  1093. cp += 6;
  1094. }
  1095. if (i596_debug & LOG_SRCDST)
  1096. print_eth (((char *)(cmd + 1)) + 2);
  1097. i596_add_cmd(dev, cmd);
  1098. } else {
  1099. if (lp->set_conf.pa_next != I596_NULL) {
  1100. return;
  1101. }
  1102. if (dev->mc_count == 0 &&
  1103.     !(dev->flags & (IFF_PROMISC | IFF_ALLMULTI))) {
  1104. if (dev->flags & IFF_ALLMULTI)
  1105. dev->flags |= IFF_PROMISC;
  1106. lp->i596_config[8] &= ~0x01;
  1107. } else {
  1108. lp->i596_config[8] |= 0x01;
  1109. }
  1110. i596_add_cmd(dev, (struct i596_cmd *) &lp->set_conf);
  1111. }
  1112. }
  1113. MODULE_AUTHOR("Ard van Breemen <ard@cstmel.nl.eu.org>");
  1114. MODULE_DESCRIPTION("Intel Panther onboard i82596 driver");
  1115. MODULE_LICENSE("GPL");
  1116. MODULE_PARM(debug, "i");
  1117. //MODULE_PARM(max_interrupt_work, "i");
  1118. //MODULE_PARM(reverse_probe, "i");
  1119. //MODULE_PARM(rx_copybreak, "i");
  1120. MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i");
  1121. MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i");
  1122. static struct net_device dev_lp486e;
  1123. static int full_duplex;
  1124. static int options;
  1125. static int io = IOADDR;
  1126. static int irq = IRQ;
  1127. static int __init lp486e_init_module(void) {
  1128. struct net_device *dev = &dev_lp486e;
  1129. dev->irq = irq;
  1130. dev->base_addr = io;
  1131. dev->init = lp486e_probe;
  1132. if (register_netdev(dev) != 0)
  1133. return -EIO;
  1134. full_duplex = 0;
  1135. options = 0;
  1136. return 0;
  1137. }
  1138. static void __exit lp486e_cleanup_module(void) {
  1139. unregister_netdev(&dev_lp486e);
  1140. kfree((void *)dev_lp486e.mem_start);
  1141. dev_lp486e.priv = NULL;
  1142. release_region(dev_lp486e.base_addr, LP486E_TOTAL_SIZE);
  1143. }
  1144. module_init(lp486e_init_module);
  1145. module_exit(lp486e_cleanup_module);