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

嵌入式Linux

开发平台:

Unix_Linux

  1. static const char version[] =
  2. "de600.c: $Revision: 1.40 $,  Bjorn Ekwall (bj0rn@blox.se)n";
  3. /*
  4.  * de600.c
  5.  *
  6.  * Linux driver for the D-Link DE-600 Ethernet pocket adapter.
  7.  *
  8.  * Portions (C) Copyright 1993, 1994 by Bjorn Ekwall
  9.  * The Author may be reached as bj0rn@blox.se
  10.  *
  11.  * Based on adapter information gathered from DE600.ASM by D-Link Inc.,
  12.  * as included on disk C in the v.2.11 of PC/TCP from FTP Software.
  13.  * For DE600.asm:
  14.  * Portions (C) Copyright 1990 D-Link, Inc.
  15.  * Copyright, 1988-1992, Russell Nelson, Crynwr Software
  16.  *
  17.  * Adapted to the sample network driver core for linux,
  18.  * written by: Donald Becker <becker@super.org>
  19.  * (Now at <becker@scyld.com>)
  20.  *
  21.  * compile-command:
  22.  * "gcc -D__KERNEL__  -Wall -Wstrict-prototypes -O6 -fomit-frame-pointer 
  23.  *  -m486 -c de600.c
  24.  *
  25.  **************************************************************/
  26. /*
  27.  * This program is free software; you can redistribute it and/or modify
  28.  * it under the terms of the GNU General Public License as published by
  29.  * the Free Software Foundation; either version 2, or (at your option)
  30.  * any later version.
  31.  *
  32.  * This program is distributed in the hope that it will be useful,
  33.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  34.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  35.  * GNU General Public License for more details.
  36.  *
  37.  * You should have received a copy of the GNU General Public License
  38.  * along with this program; if not, write to the Free Software
  39.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  40.  *
  41.  **************************************************************/
  42. /* Add more time here if your adapter won't work OK: */
  43. #define DE600_SLOW_DOWN udelay(delay_time)
  44.  /*
  45.  * If you still have trouble reading/writing to the adapter,
  46.  * modify the following "#define": (see <asm/io.h> for more info)
  47. #define REALLY_SLOW_IO
  48.  */
  49. #define SLOW_IO_BY_JUMPING /* Looks "better" than dummy write to port 0x80 :-) */
  50. /*
  51.  * If you want to enable automatic continuous checking for the DE600,
  52.  * keep this #define enabled.
  53.  * It doesn't cost much per packet, so I think it is worth it!
  54.  * If you disagree, comment away the #define, and live with it...
  55.  *
  56.  */
  57. #define CHECK_LOST_DE600
  58. /*
  59.  * Enable this #define if you want the adapter to do a "ifconfig down" on
  60.  * itself when we have detected that something is possibly wrong with it.
  61.  * The default behaviour is to retry with "adapter_init()" until success.
  62.  * This should be used for debugging purposes only.
  63.  * (Depends on the CHECK_LOST_DE600 above)
  64.  *
  65.  */
  66. #define SHUTDOWN_WHEN_LOST
  67. /*
  68.  * See comment at "de600_rspace()"!
  69.  * This is an *ugly* hack, but for now it achieves its goal of
  70.  * faking a TCP flow-control that will not flood the poor DE600.
  71.  *
  72.  * Tricks TCP to announce a small max window (max 2 fast packets please :-)
  73.  *
  74.  * Comment away at your own risk!
  75.  *
  76.  * Update: Use the more general per-device maxwindow parameter instead.
  77.  */
  78. #undef FAKE_SMALL_MAX
  79. /* use 0 for production, 1 for verification, >2 for debug */
  80. #ifdef DE600_DEBUG
  81. #define PRINTK(x) if (de600_debug >= 2) printk x
  82. #else
  83. #define DE600_DEBUG 0
  84. #define PRINTK(x) /**/
  85. #endif
  86. #include <linux/module.h>
  87. #include <linux/kernel.h>
  88. #include <linux/sched.h>
  89. #include <linux/types.h>
  90. #include <linux/fcntl.h>
  91. #include <linux/string.h>
  92. #include <linux/interrupt.h>
  93. #include <linux/ioport.h>
  94. #include <asm/io.h>
  95. #include <linux/in.h>
  96. #include <linux/ptrace.h>
  97. #include <asm/system.h>
  98. #include <linux/errno.h>
  99. #include <linux/init.h>
  100. #include <linux/delay.h>
  101. #include <linux/inet.h>
  102. #include <linux/netdevice.h>
  103. #include <linux/etherdevice.h>
  104. #include <linux/skbuff.h>
  105. static unsigned int de600_debug = DE600_DEBUG;
  106. MODULE_PARM(de600_debug, "i");
  107. MODULE_PARM_DESC(de600_debug, "DE-600 debug level (0-2)");
  108. static unsigned int delay_time = 10;
  109. MODULE_PARM(delay_time, "i");
  110. MODULE_PARM_DESC(delay_time, "DE-600 deley on I/O in microseconds");
  111. #ifdef FAKE_SMALL_MAX
  112. static unsigned long de600_rspace(struct sock *sk);
  113. #include <net/sock.h>
  114. #endif
  115. typedef unsigned char byte;
  116. /**************************************************
  117.  *                                                *
  118.  * Definition of D-Link Ethernet Pocket adapter   *
  119.  *                                                *
  120.  **************************************************/
  121. /*
  122.  * D-Link Ethernet pocket adapter ports
  123.  */
  124. /*
  125.  * OK, so I'm cheating, but there are an awful lot of
  126.  * reads and writes in order to get anything in and out
  127.  * of the DE-600 with 4 bits at a time in the parallel port,
  128.  * so every saved instruction really helps :-)
  129.  *
  130.  * That is, I don't care what the device struct says
  131.  * but hope that Space.c will keep the rest of the drivers happy.
  132.  */
  133. #ifndef DE600_IO
  134. #define DE600_IO 0x378
  135. #endif
  136. #define DATA_PORT (DE600_IO)
  137. #define STATUS_PORT (DE600_IO + 1)
  138. #define COMMAND_PORT (DE600_IO + 2)
  139. #ifndef DE600_IRQ
  140. #define DE600_IRQ 7
  141. #endif
  142. /*
  143.  * It really should look like this, and autoprobing as well...
  144.  *
  145. #define DATA_PORT (dev->base_addr + 0)
  146. #define STATUS_PORT (dev->base_addr + 1)
  147. #define COMMAND_PORT (dev->base_addr + 2)
  148. #define DE600_IRQ dev->irq
  149.  */
  150. /*
  151.  * D-Link COMMAND_PORT commands
  152.  */
  153. #define SELECT_NIC 0x04 /* select Network Interface Card */
  154. #define SELECT_PRN 0x1c /* select Printer */
  155. #define NML_PRN 0xec /* normal Printer situation */
  156. #define IRQEN 0x10 /* enable IRQ line */
  157. /*
  158.  * D-Link STATUS_PORT
  159.  */
  160. #define RX_BUSY 0x80
  161. #define RX_GOOD 0x40
  162. #define TX_FAILED16 0x10
  163. #define TX_BUSY 0x08
  164. /*
  165.  * D-Link DATA_PORT commands
  166.  * command in low 4 bits
  167.  * data in high 4 bits
  168.  * select current data nibble with HI_NIBBLE bit
  169.  */
  170. #define WRITE_DATA 0x00 /* write memory */
  171. #define READ_DATA 0x01 /* read memory */
  172. #define STATUS 0x02 /* read  status register */
  173. #define COMMAND 0x03 /* write command register (see COMMAND below) */
  174. #define NULL_COMMAND 0x04 /* null command */
  175. #define RX_LEN 0x05 /* read  received packet length */
  176. #define TX_ADDR 0x06 /* set adapter transmit memory address */
  177. #define RW_ADDR 0x07 /* set adapter read/write memory address */
  178. #define HI_NIBBLE 0x08 /* read/write the high nibble of data,
  179. or-ed with rest of command */
  180. /*
  181.  * command register, accessed through DATA_PORT with low bits = COMMAND
  182.  */
  183. #define RX_ALL 0x01 /* PROMISCUOUS */
  184. #define RX_BP 0x02 /* default: BROADCAST & PHYSICAL ADDRESS */
  185. #define RX_MBP 0x03 /* MULTICAST, BROADCAST & PHYSICAL ADDRESS */
  186. #define TX_ENABLE 0x04 /* bit 2 */
  187. #define RX_ENABLE 0x08 /* bit 3 */
  188. #define RESET 0x80 /* set bit 7 high */
  189. #define STOP_RESET 0x00 /* set bit 7 low */
  190. /*
  191.  * data to command register
  192.  * (high 4 bits in write to DATA_PORT)
  193.  */
  194. #define RX_PAGE2_SELECT 0x10 /* bit 4, only 2 pages to select */
  195. #define RX_BASE_PAGE 0x20 /* bit 5, always set when specifying RX_ADDR */
  196. #define FLIP_IRQ 0x40 /* bit 6 */
  197. /*
  198.  * D-Link adapter internal memory:
  199.  *
  200.  * 0-2K 1:st transmit page (send from pointer up to 2K)
  201.  * 2-4K 2:nd transmit page (send from pointer up to 4K)
  202.  *
  203.  * 4-6K 1:st receive page (data from 4K upwards)
  204.  * 6-8K 2:nd receive page (data from 6K upwards)
  205.  *
  206.  * 8K+ Adapter ROM (contains magic code and last 3 bytes of Ethernet address)
  207.  */
  208. #define MEM_2K 0x0800 /* 2048 */
  209. #define MEM_4K 0x1000 /* 4096 */
  210. #define MEM_6K 0x1800 /* 6144 */
  211. #define NODE_ADDRESS 0x2000 /* 8192 */
  212. #define RUNT 60 /* Too small Ethernet packet */
  213. /**************************************************
  214.  *                                                *
  215.  *             End of definition                  *
  216.  *                                                *
  217.  **************************************************/
  218. /*
  219.  * Index to functions, as function prototypes.
  220.  */
  221. /* Routines used internally. (See "convenience macros") */
  222. static byte de600_read_status(struct net_device *dev);
  223. static byte de600_read_byte(unsigned char type, struct net_device *dev);
  224. /* Put in the device structure. */
  225. static int de600_open(struct net_device *dev);
  226. static int de600_close(struct net_device *dev);
  227. static struct net_device_stats *get_stats(struct net_device *dev);
  228. static int de600_start_xmit(struct sk_buff *skb, struct net_device *dev);
  229. /* Dispatch from interrupts. */
  230. static void de600_interrupt(int irq, void *dev_id, struct pt_regs *regs);
  231. static int de600_tx_intr(struct net_device *dev, int irq_status);
  232. static void de600_rx_intr(struct net_device *dev);
  233. /* Initialization */
  234. static void trigger_interrupt(struct net_device *dev);
  235. int de600_probe(struct net_device *dev);
  236. static int adapter_init(struct net_device *dev);
  237. /*
  238.  * D-Link driver variables:
  239.  */
  240. static volatile int rx_page;
  241. #define TX_PAGES 2
  242. static volatile int tx_fifo[TX_PAGES];
  243. static volatile int tx_fifo_in;
  244. static volatile int tx_fifo_out;
  245. static volatile int free_tx_pages = TX_PAGES;
  246. static int was_down;
  247. /*
  248.  * Convenience macros/functions for D-Link adapter
  249.  */
  250. #define select_prn() outb_p(SELECT_PRN, COMMAND_PORT); DE600_SLOW_DOWN
  251. #define select_nic() outb_p(SELECT_NIC, COMMAND_PORT); DE600_SLOW_DOWN
  252. /* Thanks for hints from Mark Burton <markb@ordern.demon.co.uk> */
  253. #define de600_put_byte(data) ( 
  254. outb_p(((data) << 4)   | WRITE_DATA            , DATA_PORT), 
  255. outb_p(((data) & 0xf0) | WRITE_DATA | HI_NIBBLE, DATA_PORT))
  256. /*
  257.  * The first two outb_p()'s below could perhaps be deleted if there
  258.  * would be more delay in the last two. Not certain about it yet...
  259.  */
  260. #define de600_put_command(cmd) ( 
  261. outb_p(( rx_page        << 4)   | COMMAND            , DATA_PORT), 
  262. outb_p(( rx_page        & 0xf0) | COMMAND | HI_NIBBLE, DATA_PORT), 
  263. outb_p(((rx_page | cmd) << 4)   | COMMAND            , DATA_PORT), 
  264. outb_p(((rx_page | cmd) & 0xf0) | COMMAND | HI_NIBBLE, DATA_PORT))
  265. #define de600_setup_address(addr,type) ( 
  266. outb_p((((addr) << 4) & 0xf0) | type            , DATA_PORT), 
  267. outb_p(( (addr)       & 0xf0) | type | HI_NIBBLE, DATA_PORT), 
  268. outb_p((((addr) >> 4) & 0xf0) | type            , DATA_PORT), 
  269. outb_p((((addr) >> 8) & 0xf0) | type | HI_NIBBLE, DATA_PORT))
  270. #define rx_page_adr() ((rx_page & RX_PAGE2_SELECT)?(MEM_6K):(MEM_4K))
  271. /* Flip bit, only 2 pages */
  272. #define next_rx_page() (rx_page ^= RX_PAGE2_SELECT)
  273. #define tx_page_adr(a) (((a) + 1) * MEM_2K)
  274. static inline byte
  275. de600_read_status(struct net_device *dev)
  276. {
  277. byte status;
  278. outb_p(STATUS, DATA_PORT);
  279. status = inb(STATUS_PORT);
  280. outb_p(NULL_COMMAND | HI_NIBBLE, DATA_PORT);
  281. return status;
  282. }
  283. static inline byte
  284. de600_read_byte(unsigned char type, struct net_device *dev) { /* dev used by macros */
  285. byte lo;
  286. (void)outb_p((type), DATA_PORT);
  287. lo = ((unsigned char)inb(STATUS_PORT)) >> 4;
  288. (void)outb_p((type) | HI_NIBBLE, DATA_PORT);
  289. return ((unsigned char)inb(STATUS_PORT) & (unsigned char)0xf0) | lo;
  290. }
  291. /*
  292.  * Open/initialize the board.  This is called (in the current kernel)
  293.  * after booting when 'ifconfig <dev->name> $IP_ADDR' is run (in rc.inet1).
  294.  *
  295.  * This routine should set everything up anew at each open, even
  296.  * registers that "should" only need to be set once at boot, so that
  297.  * there is a non-reboot way to recover if something goes wrong.
  298.  */
  299. static int
  300. de600_open(struct net_device *dev)
  301. {
  302. int ret = request_irq(DE600_IRQ, de600_interrupt, 0, dev->name, dev);
  303. if (ret) {
  304. printk ("%s: unable to get IRQ %dn", dev->name, DE600_IRQ);
  305. return ret;
  306. }
  307. if (adapter_init(dev))
  308. return -EIO;
  309. return 0;
  310. }
  311. /*
  312.  * The inverse routine to de600_open().
  313.  */
  314. static int
  315. de600_close(struct net_device *dev)
  316. {
  317. select_nic();
  318. rx_page = 0;
  319. de600_put_command(RESET);
  320. de600_put_command(STOP_RESET);
  321. de600_put_command(0);
  322. select_prn();
  323. if (netif_running(dev)) { /* perhaps not needed? */
  324. free_irq(DE600_IRQ, dev);
  325. }
  326. return 0;
  327. }
  328. static struct net_device_stats *
  329. get_stats(struct net_device *dev)
  330. {
  331.     return (struct net_device_stats *)(dev->priv);
  332. }
  333. static inline void
  334. trigger_interrupt(struct net_device *dev)
  335. {
  336. de600_put_command(FLIP_IRQ);
  337. select_prn();
  338. DE600_SLOW_DOWN;
  339. select_nic();
  340. de600_put_command(0);
  341. }
  342. /*
  343.  * Copy a buffer to the adapter transmit page memory.
  344.  * Start sending.
  345.  */
  346. static int
  347. de600_start_xmit(struct sk_buff *skb, struct net_device *dev)
  348. {
  349. unsigned long flags;
  350. int transmit_from;
  351. int len;
  352. int tickssofar;
  353. byte *buffer = skb->data;
  354. if (free_tx_pages <= 0) { /* Do timeouts, to avoid hangs. */
  355. tickssofar = jiffies - dev->trans_start;
  356. if (tickssofar < 5)
  357. return 1;
  358. /* else */
  359. printk("%s: transmit timed out (%d), %s?n",
  360. dev->name,
  361. tickssofar,
  362. "network cable problem"
  363. );
  364. /* Restart the adapter. */
  365. if (adapter_init(dev)) {
  366. return 1;
  367. }
  368. }
  369. /* Start real output */
  370. PRINTK(("de600_start_xmit:len=%d, page %d/%dn", skb->len, tx_fifo_in, free_tx_pages));
  371. if ((len = skb->len) < RUNT)
  372. len = RUNT;
  373. save_flags(flags);
  374. cli();
  375. select_nic();
  376. tx_fifo[tx_fifo_in] = transmit_from = tx_page_adr(tx_fifo_in) - len;
  377. tx_fifo_in = (tx_fifo_in + 1) % TX_PAGES; /* Next free tx page */
  378. #ifdef CHECK_LOST_DE600
  379. /* This costs about 40 instructions per packet... */
  380. de600_setup_address(NODE_ADDRESS, RW_ADDR);
  381. de600_read_byte(READ_DATA, dev);
  382. if (was_down || (de600_read_byte(READ_DATA, dev) != 0xde)) {
  383. if (adapter_init(dev)) {
  384. restore_flags(flags);
  385. return 1;
  386. }
  387. }
  388. #endif
  389. de600_setup_address(transmit_from, RW_ADDR);
  390. for ( ; len > 0; --len, ++buffer)
  391. de600_put_byte(*buffer);
  392. if (free_tx_pages-- == TX_PAGES) { /* No transmission going on */
  393. dev->trans_start = jiffies;
  394. netif_start_queue(dev); /* allow more packets into adapter */
  395. /* Send page and generate a faked interrupt */
  396. de600_setup_address(transmit_from, TX_ADDR);
  397. de600_put_command(TX_ENABLE);
  398. }
  399. else {
  400. if (free_tx_pages)
  401. netif_start_queue(dev);
  402. else
  403. netif_stop_queue(dev);
  404. select_prn();
  405. }
  406. restore_flags(flags);
  407. #ifdef FAKE_SMALL_MAX
  408. /* This will "patch" the socket TCP proto at an early moment */
  409. if (skb->sk && (skb->sk->protocol == IPPROTO_TCP) &&
  410. (skb->sk->prot->rspace != &de600_rspace))
  411. skb->sk->prot->rspace = de600_rspace; /* Ugh! */
  412. #endif
  413. dev_kfree_skb (skb);
  414. return 0;
  415. }
  416. /*
  417.  * The typical workload of the driver:
  418.  * Handle the network interface interrupts.
  419.  */
  420. static void
  421. de600_interrupt(int irq, void *dev_id, struct pt_regs * regs)
  422. {
  423. struct net_device *dev = dev_id;
  424. byte irq_status;
  425. int retrig = 0;
  426. int boguscount = 0;
  427. /* This might just as well be deleted now, no crummy drivers present :-) */
  428. if ((dev == NULL) || (DE600_IRQ != irq)) {
  429. printk("%s: bogus interrupt %dn", dev?dev->name:"DE-600", irq);
  430. return;
  431. }
  432. select_nic();
  433. irq_status = de600_read_status(dev);
  434. do {
  435. PRINTK(("de600_interrupt (%02X)n", irq_status));
  436. if (irq_status & RX_GOOD)
  437. de600_rx_intr(dev);
  438. else if (!(irq_status & RX_BUSY))
  439. de600_put_command(RX_ENABLE);
  440. /* Any transmission in progress? */
  441. if (free_tx_pages < TX_PAGES)
  442. retrig = de600_tx_intr(dev, irq_status);
  443. else
  444. retrig = 0;
  445. irq_status = de600_read_status(dev);
  446. } while ( (irq_status & RX_GOOD) || ((++boguscount < 100) && retrig) );
  447. /*
  448.  * Yeah, it _looks_ like busy waiting, smells like busy waiting
  449.  * and I know it's not PC, but please, it will only occur once
  450.  * in a while and then only for a loop or so (< 1ms for sure!)
  451.  */
  452. /* Enable adapter interrupts */
  453. select_prn();
  454. if (retrig)
  455. trigger_interrupt(dev);
  456. return;
  457. }
  458. static int
  459. de600_tx_intr(struct net_device *dev, int irq_status)
  460. {
  461. /*
  462.  * Returns 1 if tx still not done
  463.  */
  464. /* Check if current transmission is done yet */
  465. if (irq_status & TX_BUSY)
  466. return 1; /* tx not done, try again */
  467. /* else */
  468. /* If last transmission OK then bump fifo index */
  469. if (!(irq_status & TX_FAILED16)) {
  470. tx_fifo_out = (tx_fifo_out + 1) % TX_PAGES;
  471. ++free_tx_pages;
  472. ((struct net_device_stats *)(dev->priv))->tx_packets++;
  473. netif_wake_queue(dev);
  474. }
  475. /* More to send, or resend last packet? */
  476. if ((free_tx_pages < TX_PAGES) || (irq_status & TX_FAILED16)) {
  477. dev->trans_start = jiffies;
  478. de600_setup_address(tx_fifo[tx_fifo_out], TX_ADDR);
  479. de600_put_command(TX_ENABLE);
  480. return 1;
  481. }
  482. /* else */
  483. return 0;
  484. }
  485. /*
  486.  * We have a good packet, get it out of the adapter.
  487.  */
  488. static void
  489. de600_rx_intr(struct net_device *dev)
  490. {
  491. struct sk_buff *skb;
  492. unsigned long flags;
  493. int i;
  494. int read_from;
  495. int size;
  496. register unsigned char *buffer;
  497. save_flags(flags);
  498. cli();
  499. /* Get size of received packet */
  500. size = de600_read_byte(RX_LEN, dev); /* low byte */
  501. size += (de600_read_byte(RX_LEN, dev) << 8); /* high byte */
  502. size -= 4; /* Ignore trailing 4 CRC-bytes */
  503. /* Tell adapter where to store next incoming packet, enable receiver */
  504. read_from = rx_page_adr();
  505. next_rx_page();
  506. de600_put_command(RX_ENABLE);
  507. restore_flags(flags);
  508. if ((size < 32)  ||  (size > 1535)) {
  509. printk("%s: Bogus packet size %d.n", dev->name, size);
  510. if (size > 10000)
  511. adapter_init(dev);
  512. return;
  513. }
  514. skb = dev_alloc_skb(size+2);
  515. if (skb == NULL) {
  516. printk("%s: Couldn't allocate a sk_buff of size %d.n",
  517. dev->name, size);
  518. return;
  519. }
  520. /* else */
  521. skb->dev = dev;
  522. skb_reserve(skb,2); /* Align */
  523. /* 'skb->data' points to the start of sk_buff data area. */
  524. buffer = skb_put(skb,size);
  525. /* copy the packet into the buffer */
  526. de600_setup_address(read_from, RW_ADDR);
  527. for (i = size; i > 0; --i, ++buffer)
  528. *buffer = de600_read_byte(READ_DATA, dev);
  529. skb->protocol=eth_type_trans(skb,dev);
  530. netif_rx(skb);
  531. /* update stats */
  532. dev->last_rx = jiffies;
  533. ((struct net_device_stats *)(dev->priv))->rx_packets++; /* count all receives */
  534. ((struct net_device_stats *)(dev->priv))->rx_bytes += size; /* count all received bytes */
  535. /*
  536.  * If any worth-while packets have been received, netif_rx()
  537.  * has done a mark_bh(INET_BH) for us and will work on them
  538.  * when we get to the bottom-half routine.
  539.  */
  540. }
  541. int __init 
  542. de600_probe(struct net_device *dev)
  543. {
  544. int i;
  545. static struct net_device_stats de600_netstats;
  546. /*dev->priv = kmalloc(sizeof(struct net_device_stats), GFP_KERNEL);*/
  547. SET_MODULE_OWNER(dev);
  548. printk("%s: D-Link DE-600 pocket adapter", dev->name);
  549. /* Alpha testers must have the version number to report bugs. */
  550. if (de600_debug > 1)
  551. printk(version);
  552. /* probe for adapter */
  553. rx_page = 0;
  554. select_nic();
  555. (void)de600_read_status(dev);
  556. de600_put_command(RESET);
  557. de600_put_command(STOP_RESET);
  558. if (de600_read_status(dev) & 0xf0) {
  559. printk(": not at I/O %#3x.n", DATA_PORT);
  560. return -ENODEV;
  561. }
  562. /*
  563.  * Maybe we found one,
  564.  * have to check if it is a D-Link DE-600 adapter...
  565.  */
  566. /* Get the adapter ethernet address from the ROM */
  567. de600_setup_address(NODE_ADDRESS, RW_ADDR);
  568. for (i = 0; i < ETH_ALEN; i++) {
  569. dev->dev_addr[i] = de600_read_byte(READ_DATA, dev);
  570. dev->broadcast[i] = 0xff;
  571. }
  572. /* Check magic code */
  573. if ((dev->dev_addr[1] == 0xde) && (dev->dev_addr[2] == 0x15)) {
  574. /* OK, install real address */
  575. dev->dev_addr[0] = 0x00;
  576. dev->dev_addr[1] = 0x80;
  577. dev->dev_addr[2] = 0xc8;
  578. dev->dev_addr[3] &= 0x0f;
  579. dev->dev_addr[3] |= 0x70;
  580. } else {
  581. printk(" not identified in the printer portn");
  582. return -ENODEV;
  583. }
  584. #if 0 /* Not yet */
  585. if (check_region(DE600_IO, 3)) {
  586. printk(", port 0x%x busyn", DE600_IO);
  587. return -EBUSY;
  588. }
  589. #endif
  590. request_region(DE600_IO, 3, "de600");
  591. printk(", Ethernet Address: %02X", dev->dev_addr[0]);
  592. for (i = 1; i < ETH_ALEN; i++)
  593. printk(":%02X",dev->dev_addr[i]);
  594. printk("n");
  595. /* Initialize the device structure. */
  596. dev->priv = &de600_netstats;
  597. memset(dev->priv, 0, sizeof(struct net_device_stats));
  598. dev->get_stats = get_stats;
  599. dev->open = de600_open;
  600. dev->stop = de600_close;
  601. dev->hard_start_xmit = &de600_start_xmit;
  602. ether_setup(dev);
  603. dev->flags&=~IFF_MULTICAST;
  604. select_prn();
  605. return 0;
  606. }
  607. static int
  608. adapter_init(struct net_device *dev)
  609. {
  610. int i;
  611. long flags;
  612. save_flags(flags);
  613. cli();
  614. select_nic();
  615. rx_page = 0; /* used by RESET */
  616. de600_put_command(RESET);
  617. de600_put_command(STOP_RESET);
  618. #ifdef CHECK_LOST_DE600
  619. /* Check if it is still there... */
  620. /* Get the some bytes of the adapter ethernet address from the ROM */
  621. de600_setup_address(NODE_ADDRESS, RW_ADDR);
  622. de600_read_byte(READ_DATA, dev);
  623. if ((de600_read_byte(READ_DATA, dev) != 0xde) ||
  624.     (de600_read_byte(READ_DATA, dev) != 0x15)) {
  625. /* was: if (de600_read_status(dev) & 0xf0) { */
  626. printk("Something has happened to the DE-600!  Please check it"
  627. #ifdef SHUTDOWN_WHEN_LOST
  628. " and do a new ifconfig"
  629. #endif /* SHUTDOWN_WHEN_LOST */
  630. "!n");
  631. #ifdef SHUTDOWN_WHEN_LOST
  632. /* Goodbye, cruel world... */
  633. dev->flags &= ~IFF_UP;
  634. de600_close(dev);
  635. #endif /* SHUTDOWN_WHEN_LOST */
  636. was_down = 1;
  637. netif_stop_queue(dev); /* Transmit busy...  */
  638. restore_flags(flags);
  639. return 1; /* failed */
  640. }
  641. #endif /* CHECK_LOST_DE600 */
  642. if (was_down) {
  643. printk("Thanks, I feel much better now!n");
  644. was_down = 0;
  645. }
  646. netif_start_queue(dev);
  647. tx_fifo_in = 0;
  648. tx_fifo_out = 0;
  649. free_tx_pages = TX_PAGES;
  650. /* set the ether address. */
  651. de600_setup_address(NODE_ADDRESS, RW_ADDR);
  652. for (i = 0; i < ETH_ALEN; i++)
  653. de600_put_byte(dev->dev_addr[i]);
  654. /* where to start saving incoming packets */
  655. rx_page = RX_BP | RX_BASE_PAGE;
  656. de600_setup_address(MEM_4K, RW_ADDR);
  657. /* Enable receiver */
  658. de600_put_command(RX_ENABLE);
  659. select_prn();
  660. restore_flags(flags);
  661. return 0; /* OK */
  662. }
  663. #ifdef FAKE_SMALL_MAX
  664. /*
  665.  * The new router code (coming soon 8-) ) will fix this properly.
  666.  */
  667. #define DE600_MIN_WINDOW 1024
  668. #define DE600_MAX_WINDOW 2048
  669. #define DE600_TCP_WINDOW_DIFF 1024
  670. /*
  671.  * Copied from "net/inet/sock.c"
  672.  *
  673.  * Sets a lower max receive window in order to achieve <= 2
  674.  * packets arriving at the adapter in fast succession.
  675.  * (No way that a DE-600 can keep up with a net saturated
  676.  *  with packets homing in on it :-( )
  677.  *
  678.  * Since there are only 2 receive buffers in the DE-600
  679.  * and it takes some time to copy from the adapter,
  680.  * this is absolutely necessary for any TCP performance whatsoever!
  681.  *
  682.  * Note that the returned window info will never be smaller than
  683.  * DE600_MIN_WINDOW, i.e. 1024
  684.  * This differs from the standard function, that can return an
  685.  * arbitrarily small window!
  686.  */
  687. static unsigned long
  688. de600_rspace(struct sock *sk)
  689. {
  690.   int amt;
  691.   if (sk != NULL) {
  692. /*
  693.  * Hack! You might want to play with commenting away the following line,
  694.  * if you know what you do!
  695.    sk->max_unacked = DE600_MAX_WINDOW - DE600_TCP_WINDOW_DIFF;
  696.  */
  697. if (atomic_read(&sk->rmem_alloc) >= sk->rcvbuf-2*DE600_MIN_WINDOW) return(0);
  698. amt = min_t(int, (sk->rcvbuf-atomic_read(&sk->rmem_alloc))/2/*-DE600_MIN_WINDOW*/, DE600_MAX_WINDOW);
  699. if (amt < 0) return(0);
  700. return(amt);
  701.   }
  702.   return(0);
  703. }
  704. #endif
  705. #ifdef MODULE
  706. static struct net_device de600_dev;
  707. int
  708. init_module(void)
  709. {
  710. de600_dev.init = de600_probe;
  711. if (register_netdev(&de600_dev) != 0)
  712. return -EIO;
  713. return 0;
  714. }
  715. void
  716. cleanup_module(void)
  717. {
  718. unregister_netdev(&de600_dev);
  719. release_region(DE600_IO, 3);
  720. }
  721. #endif /* MODULE */
  722. MODULE_LICENSE("GPL");
  723. /*
  724.  * Local variables:
  725.  *  kernel-compile-command: "gcc -D__KERNEL__ -Ilinux/include -I../../net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de600.c"
  726.  *  module-compile-command: "gcc -D__KERNEL__ -DMODULE -Ilinux/include -I../../net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de600.c"
  727.  *  compile-command: "gcc -D__KERNEL__ -DMODULE -Ilinux/include -I../../net/inet -Wall -Wstrict-prototypes -O2 -m486 -c de600.c"
  728.  * End:
  729.  */