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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * ni6510 (am7990 'lance' chip) driver for Linux-net-3
  3.  * BETAcode v0.71 (96/09/29) for 2.0.0 (or later)
  4.  * copyrights (c) 1994,1995,1996 by M.Hipp
  5.  *
  6.  * This driver can handle the old ni6510 board and the newer ni6510
  7.  * EtherBlaster. (probably it also works with every full NE2100
  8.  * compatible card)
  9.  *
  10.  * To compile as module, type:
  11.  *     gcc -O2 -fomit-frame-pointer -m486 -D__KERNEL__ -DMODULE -c ni65.c
  12.  * driver probes: io: 0x360,0x300,0x320,0x340 / dma: 3,5,6,7
  13.  *
  14.  * This is an extension to the Linux operating system, and is covered by the
  15.  * same GNU General Public License that covers the Linux-kernel.
  16.  *
  17.  * comments/bugs/suggestions can be sent to:
  18.  *   Michael Hipp
  19.  *   email: hippm@informatik.uni-tuebingen.de
  20.  *
  21.  * sources:
  22.  *   some things are from the 'ni6510-packet-driver for dos by Russ Nelson'
  23.  *   and from the original drivers by D.Becker
  24.  *
  25.  * known problems:
  26.  *   - on some PCI boards (including my own) the card/board/ISA-bridge has
  27.  *     problems with bus master DMA. This results in lotsa overruns.
  28.  *     It may help to '#define RCV_PARANOIA_CHECK' or try to #undef
  29.  *     the XMT and RCV_VIA_SKB option .. this reduces driver performance.
  30.  *     Or just play with your BIOS options to optimize ISA-DMA access.
  31.  *     Maybe you also wanna play with the LOW_PERFORAMCE and MID_PERFORMANCE
  32.  *     defines -> please report me your experience then
  33.  *   - Harald reported for ASUS SP3G mainboards, that you should use
  34.  *     the 'optimal settings' from the user's manual on page 3-12!
  35.  *
  36.  * credits:
  37.  *   thanx to Jason Sullivan for sending me a ni6510 card!
  38.  *   lot of debug runs with ASUS SP3G Boards (Intel Saturn) by Harald Koenig
  39.  *
  40.  * simple performance test: (486DX-33/Ni6510-EB receives from 486DX4-100/Ni6510-EB)
  41.  *    average: FTP -> 8384421 bytes received in 8.5 seconds
  42.  *           (no RCV_VIA_SKB,no XMT_VIA_SKB,PARANOIA_CHECK,4 XMIT BUFS, 8 RCV_BUFFS)
  43.  *    peak: FTP -> 8384421 bytes received in 7.5 seconds
  44.  *           (RCV_VIA_SKB,XMT_VIA_SKB,no PARANOIA_CHECK,1(!) XMIT BUF, 16 RCV BUFFS)
  45.  */
  46. /*
  47.  * 99.Jun.8: added support for /proc/net/dev byte count for xosview (HK)
  48.  * 96.Sept.29: virt_to_bus stuff added for new memory modell
  49.  * 96.April.29: Added Harald Koenig's Patches (MH)
  50.  * 96.April.13: enhanced error handling .. more tests (MH)
  51.  * 96.April.5/6: a lot of performance tests. Got it stable now (hopefully) (MH)
  52.  * 96.April.1: (no joke ;) .. added EtherBlaster and Module support (MH)
  53.  * 96.Feb.19: fixed a few bugs .. cleanups .. tested for 1.3.66 (MH)
  54.  *            hopefully no more 16MB limit
  55.  *
  56.  * 95.Nov.18: multicast tweaked (AC).
  57.  *
  58.  * 94.Aug.22: changes in xmit_intr (ack more than one xmitted-packet), ni65_send_packet (p->lock) (MH)
  59.  *
  60.  * 94.July.16: fixed bugs in recv_skb and skb-alloc stuff  (MH)
  61.  */
  62. #include <linux/kernel.h>
  63. #include <linux/sched.h>
  64. #include <linux/string.h>
  65. #include <linux/ptrace.h>
  66. #include <linux/errno.h>
  67. #include <linux/ioport.h>
  68. #include <linux/slab.h>
  69. #include <linux/interrupt.h>
  70. #include <linux/delay.h>
  71. #include <linux/init.h>
  72. #include <asm/bitops.h>
  73. #include <asm/io.h>
  74. #include <asm/dma.h>
  75. #include <linux/netdevice.h>
  76. #include <linux/etherdevice.h>
  77. #include <linux/skbuff.h>
  78. #include <linux/version.h>
  79. #include <linux/module.h>
  80. #include "ni65.h"
  81. /*
  82.  * the current setting allows an acceptable performance
  83.  * for 'RCV_PARANOIA_CHECK' read the 'known problems' part in
  84.  * the header of this file
  85.  * 'invert' the defines for max. performance. This may cause DMA problems
  86.  * on some boards (e.g on my ASUS SP3G)
  87.  */
  88. #undef XMT_VIA_SKB
  89. #undef RCV_VIA_SKB
  90. #define RCV_PARANOIA_CHECK
  91. #define MID_PERFORMANCE
  92. #if   defined( LOW_PERFORMANCE )
  93.  static int isa0=7,isa1=7,csr80=0x0c10;
  94. #elif defined( MID_PERFORMANCE )
  95.  static int isa0=5,isa1=5,csr80=0x2810;
  96. #else /* high performance */
  97.  static int isa0=4,isa1=4,csr80=0x0017;
  98. #endif
  99. /*
  100.  * a few card/vendor specific defines
  101.  */
  102. #define NI65_ID0    0x00
  103. #define NI65_ID1    0x55
  104. #define NI65_EB_ID0 0x52
  105. #define NI65_EB_ID1 0x44
  106. #define NE2100_ID0  0x57
  107. #define NE2100_ID1  0x57
  108. #define PORT p->cmdr_addr
  109. /*
  110.  * buffer configuration
  111.  */
  112. #if 1
  113. #define RMDNUM 16
  114. #define RMDNUMMASK 0x80000000
  115. #else
  116. #define RMDNUM 8
  117. #define RMDNUMMASK 0x60000000 /* log2(RMDNUM)<<29 */
  118. #endif
  119. #if 0
  120. #define TMDNUM 1
  121. #define TMDNUMMASK 0x00000000
  122. #else
  123. #define TMDNUM 4
  124. #define TMDNUMMASK 0x40000000 /* log2(TMDNUM)<<29 */
  125. #endif
  126. /* slightly oversized */
  127. #define R_BUF_SIZE 1544
  128. #define T_BUF_SIZE 1544
  129. /*
  130.  * lance register defines
  131.  */
  132. #define L_DATAREG 0x00
  133. #define L_ADDRREG 0x02
  134. #define L_RESET   0x04
  135. #define L_CONFIG  0x05
  136. #define L_BUSIF   0x06
  137. /*
  138.  * to access the lance/am7990-regs, you have to write
  139.  * reg-number into L_ADDRREG, then you can access it using L_DATAREG
  140.  */
  141. #define CSR0  0x00
  142. #define CSR1  0x01
  143. #define CSR2  0x02
  144. #define CSR3  0x03
  145. #define INIT_RING_BEFORE_START 0x1
  146. #define FULL_RESET_ON_ERROR 0x2
  147. #if 0
  148. #define writereg(val,reg) {outw(reg,PORT+L_ADDRREG);inw(PORT+L_ADDRREG); 
  149.                            outw(val,PORT+L_DATAREG);inw(PORT+L_DATAREG);}
  150. #define readreg(reg) (outw(reg,PORT+L_ADDRREG),inw(PORT+L_ADDRREG),
  151.                        inw(PORT+L_DATAREG))
  152. #if 0
  153. #define writedatareg(val) {outw(val,PORT+L_DATAREG);inw(PORT+L_DATAREG);}
  154. #else
  155. #define writedatareg(val) {  writereg(val,CSR0); }
  156. #endif
  157. #else
  158. #define writereg(val,reg) {outw(reg,PORT+L_ADDRREG);outw(val,PORT+L_DATAREG);}
  159. #define readreg(reg) (outw(reg,PORT+L_ADDRREG),inw(PORT+L_DATAREG))
  160. #define writedatareg(val) { writereg(val,CSR0); }
  161. #endif
  162. static unsigned char ni_vendor[] = { 0x02,0x07,0x01 };
  163. static struct card {
  164. unsigned char id0,id1;
  165. short id_offset;
  166. short total_size;
  167. short cmd_offset;
  168. short addr_offset;
  169. unsigned char *vendor_id;
  170. char *cardname;
  171. unsigned char config;
  172. } cards[] = {
  173. { NI65_ID0,NI65_ID1,0x0e,0x10,0x0,0x8,ni_vendor,"ni6510", 0x1 } ,
  174. { NI65_EB_ID0,NI65_EB_ID1,0x0e,0x18,0x10,0x0,ni_vendor,"ni6510 EtherBlaster", 0x2 } ,
  175. { NE2100_ID0,NE2100_ID1,0x0e,0x18,0x10,0x0,NULL,"generic NE2100", 0x0 }
  176. };
  177. #define NUM_CARDS 3
  178. struct priv
  179. {
  180. struct rmd rmdhead[RMDNUM];
  181. struct tmd tmdhead[TMDNUM];
  182. struct init_block ib;
  183. int rmdnum;
  184. int tmdnum,tmdlast;
  185. #ifdef RCV_VIA_SKB
  186. struct sk_buff *recv_skb[RMDNUM];
  187. #else
  188. void *recvbounce[RMDNUM];
  189. #endif
  190. #ifdef XMT_VIA_SKB
  191. struct sk_buff *tmd_skb[TMDNUM];
  192. #endif
  193. void *tmdbounce[TMDNUM];
  194. int tmdbouncenum;
  195. int lock,xmit_queued;
  196. struct net_device_stats stats;
  197. void *self;
  198. int cmdr_addr;
  199. int cardno;
  200. int features;
  201. };
  202. static int  ni65_probe1(struct net_device *dev,int);
  203. static void ni65_interrupt(int irq, void * dev_id, struct pt_regs *regs);
  204. static void ni65_recv_intr(struct net_device *dev,int);
  205. static void ni65_xmit_intr(struct net_device *dev,int);
  206. static int  ni65_open(struct net_device *dev);
  207. static int  ni65_lance_reinit(struct net_device *dev);
  208. static void ni65_init_lance(struct priv *p,unsigned char*,int,int);
  209. static int  ni65_send_packet(struct sk_buff *skb, struct net_device *dev);
  210. static void  ni65_timeout(struct net_device *dev);
  211. static int  ni65_close(struct net_device *dev);
  212. static int  ni65_alloc_buffer(struct net_device *dev);
  213. static void ni65_free_buffer(struct priv *p);
  214. static struct net_device_stats *ni65_get_stats(struct net_device *);
  215. static void set_multicast_list(struct net_device *dev);
  216. static int irqtab[] __initdata = { 9,12,15,5 }; /* irq config-translate */
  217. static int dmatab[] __initdata = { 0,3,5,6,7 }; /* dma config-translate and autodetect */
  218. static int debuglevel = 1;
  219. /*
  220.  * set 'performance' registers .. we must STOP lance for that
  221.  */
  222. static void ni65_set_performance(struct priv *p)
  223. {
  224. writereg(CSR0_STOP | CSR0_CLRALL,CSR0); /* STOP */
  225. if( !(cards[p->cardno].config & 0x02) )
  226. return;
  227. outw(80,PORT+L_ADDRREG);
  228. if(inw(PORT+L_ADDRREG) != 80)
  229. return;
  230. writereg( (csr80 & 0x3fff) ,80); /* FIFO watermarks */
  231. outw(0,PORT+L_ADDRREG);
  232. outw((short)isa0,PORT+L_BUSIF); /* write ISA 0: DMA_R : isa0 * 50ns */
  233. outw(1,PORT+L_ADDRREG);
  234. outw((short)isa1,PORT+L_BUSIF); /* write ISA 1: DMA_W : isa1 * 50ns */
  235. outw(CSR0,PORT+L_ADDRREG); /* switch back to CSR0 */
  236. }
  237. /*
  238.  * open interface (up)
  239.  */
  240. static int ni65_open(struct net_device *dev)
  241. {
  242. struct priv *p = (struct priv *) dev->priv;
  243. int irqval = request_irq(dev->irq, &ni65_interrupt,0,
  244.                         cards[p->cardno].cardname,dev);
  245. if (irqval) {
  246. printk ("%s: unable to get IRQ %d (irqval=%d).n",
  247.           dev->name,dev->irq, irqval);
  248. return -EAGAIN;
  249. }
  250. if(ni65_lance_reinit(dev))
  251. {
  252. netif_start_queue(dev);
  253. MOD_INC_USE_COUNT;
  254. return 0;
  255. }
  256. else
  257. {
  258. free_irq(dev->irq,dev);
  259. return -EAGAIN;
  260. }
  261. }
  262. /*
  263.  * close interface (down)
  264.  */
  265. static int ni65_close(struct net_device *dev)
  266. {
  267. struct priv *p = (struct priv *) dev->priv;
  268. netif_stop_queue(dev);
  269. outw(inw(PORT+L_RESET),PORT+L_RESET); /* that's the hard way */
  270. #ifdef XMT_VIA_SKB
  271. {
  272. int i;
  273. for(i=0;i<TMDNUM;i++)
  274. {
  275. if(p->tmd_skb[i]) {
  276. dev_kfree_skb(p->tmd_skb[i]);
  277. p->tmd_skb[i] = NULL;
  278. }
  279. }
  280. }
  281. #endif
  282. free_irq(dev->irq,dev);
  283. MOD_DEC_USE_COUNT;
  284. return 0;
  285. }
  286. /*
  287.  * Probe The Card (not the lance-chip)
  288.  */
  289. #ifdef MODULE
  290. static
  291. #endif
  292. int __init ni65_probe(struct net_device *dev)
  293. {
  294. int *port;
  295. static int ports[] = {0x360,0x300,0x320,0x340, 0};
  296. if (dev->base_addr > 0x1ff)          /* Check a single specified location. */
  297.  return ni65_probe1(dev, dev->base_addr);
  298. else if (dev->base_addr > 0)         /* Don't probe at all. */
  299.  return -ENXIO;
  300. for (port = ports; *port; port++)
  301. {
  302. if (ni65_probe1(dev, *port) == 0)
  303.  return 0;
  304. }
  305. return -ENODEV;
  306. }
  307. /*
  308.  * this is the real card probe ..
  309.  */
  310. static int __init ni65_probe1(struct net_device *dev,int ioaddr)
  311. {
  312. int i,j;
  313. struct priv *p;
  314. unsigned long flags;
  315. for(i=0;i<NUM_CARDS;i++) {
  316. if(check_region(ioaddr, cards[i].total_size))
  317. continue;
  318. if(cards[i].id_offset >= 0) {
  319. if(inb(ioaddr+cards[i].id_offset+0) != cards[i].id0 ||
  320.  inb(ioaddr+cards[i].id_offset+1) != cards[i].id1) {
  321.  continue;
  322. }
  323. }
  324. if(cards[i].vendor_id) {
  325. for(j=0;j<3;j++)
  326. if(inb(ioaddr+cards[i].addr_offset+j) != cards[i].vendor_id[j])
  327. continue;
  328. }
  329. break;
  330. }
  331. if(i == NUM_CARDS)
  332. return -ENODEV;
  333. for(j=0;j<6;j++)
  334. dev->dev_addr[j] = inb(ioaddr+cards[i].addr_offset+j);
  335. if( (j=ni65_alloc_buffer(dev)) < 0)
  336. return j;
  337. p = (struct priv *) dev->priv;
  338. p->cmdr_addr = ioaddr + cards[i].cmd_offset;
  339. p->cardno = i;
  340. printk("%s: %s found at %#3x, ", dev->name, cards[p->cardno].cardname , ioaddr);
  341. outw(inw(PORT+L_RESET),PORT+L_RESET); /* first: reset the card */
  342. if( (j=readreg(CSR0)) != 0x4) {
  343.  printk(KERN_ERR "can't RESET card: %04xn",j);
  344.  ni65_free_buffer(p);
  345.  return -EAGAIN;
  346. }
  347. outw(88,PORT+L_ADDRREG);
  348. if(inw(PORT+L_ADDRREG) == 88) {
  349. unsigned long v;
  350. v = inw(PORT+L_DATAREG);
  351. v <<= 16;
  352. outw(89,PORT+L_ADDRREG);
  353. v |= inw(PORT+L_DATAREG);
  354. printk("Version %#08lx, ",v);
  355. p->features = INIT_RING_BEFORE_START;
  356. }
  357. else {
  358. printk("ancient LANCE, ");
  359. p->features = 0x0;
  360. }
  361. if(test_bit(0,&cards[i].config)) {
  362. dev->irq = irqtab[(inw(ioaddr+L_CONFIG)>>2)&3];
  363. dev->dma = dmatab[inw(ioaddr+L_CONFIG)&3];
  364. printk("IRQ %d (from card), DMA %d (from card).n",dev->irq,dev->dma);
  365. }
  366. else {
  367. if(dev->dma == 0) {
  368. /* 'stuck test' from lance.c */
  369. int dma_channels = ((inb(DMA1_STAT_REG) >> 4) & 0x0f) | (inb(DMA2_STAT_REG) & 0xf0);
  370. for(i=1;i<5;i++) {
  371. int dma = dmatab[i];
  372. if(test_bit(dma,&dma_channels) || request_dma(dma,"ni6510"))
  373. continue;
  374. flags=claim_dma_lock();
  375. disable_dma(dma);
  376. set_dma_mode(dma,DMA_MODE_CASCADE);
  377. enable_dma(dma);
  378. release_dma_lock(flags);
  379. ni65_init_lance(p,dev->dev_addr,0,0); /* trigger memory access */
  380. flags=claim_dma_lock();
  381. disable_dma(dma);
  382. free_dma(dma);
  383. release_dma_lock(flags);
  384. if(readreg(CSR0) & CSR0_IDON)
  385. break;
  386. }
  387. if(i == 5) {
  388. printk("Can't detect DMA channel!n");
  389. ni65_free_buffer(p);
  390. return -EAGAIN;
  391. }
  392. dev->dma = dmatab[i];
  393. printk("DMA %d (autodetected), ",dev->dma);
  394. }
  395. else
  396. printk("DMA %d (assigned), ",dev->dma);
  397. if(dev->irq < 2)
  398. {
  399. ni65_init_lance(p,dev->dev_addr,0,0);
  400. autoirq_setup(0);
  401. writereg(CSR0_INIT|CSR0_INEA,CSR0); /* trigger interrupt */
  402. if(!(dev->irq = autoirq_report(2)))
  403. {
  404. printk("Failed to detect IRQ line!n");
  405. ni65_free_buffer(p);
  406. return -EAGAIN;
  407. }
  408. printk("IRQ %d (autodetected).n",dev->irq);
  409. }
  410. else
  411. printk("IRQ %d (assigned).n",dev->irq);
  412. }
  413. if(request_dma(dev->dma, cards[p->cardno].cardname ) != 0)
  414. {
  415. printk("%s: Can't request dma-channel %dn",dev->name,(int) dev->dma);
  416. ni65_free_buffer(p);
  417. return -EAGAIN;
  418. }
  419. /*
  420.  * Grab the region so we can find another board.
  421.  */
  422. request_region(ioaddr,cards[p->cardno].total_size,cards[p->cardno].cardname);
  423. dev->base_addr = ioaddr;
  424. dev->open = ni65_open;
  425. dev->stop = ni65_close;
  426. dev->hard_start_xmit = ni65_send_packet;
  427. dev->tx_timeout = ni65_timeout;
  428. dev->watchdog_timeo = HZ/2;
  429. dev->get_stats = ni65_get_stats;
  430. dev->set_multicast_list = set_multicast_list;
  431. ether_setup(dev);
  432. return 0; /* everything is OK */
  433. }
  434. /*
  435.  * set lance register and trigger init
  436.  */
  437. static void ni65_init_lance(struct priv *p,unsigned char *daddr,int filter,int mode)
  438. {
  439. int i;
  440. u32 pib;
  441. writereg(CSR0_CLRALL|CSR0_STOP,CSR0);
  442. for(i=0;i<6;i++)
  443. p->ib.eaddr[i] = daddr[i];
  444. for(i=0;i<8;i++)
  445. p->ib.filter[i] = filter;
  446. p->ib.mode = mode;
  447. p->ib.trp = (u32) virt_to_bus(p->tmdhead) | TMDNUMMASK;
  448. p->ib.rrp = (u32) virt_to_bus(p->rmdhead) | RMDNUMMASK;
  449. writereg(0,CSR3); /* busmaster/no word-swap */
  450. pib = (u32) virt_to_bus(&p->ib);
  451. writereg(pib & 0xffff,CSR1);
  452. writereg(pib >> 16,CSR2);
  453. writereg(CSR0_INIT,CSR0); /* this changes L_ADDRREG to CSR0 */
  454. for(i=0;i<32;i++)
  455. {
  456. mdelay(4);
  457. if(inw(PORT+L_DATAREG) & (CSR0_IDON | CSR0_MERR) )
  458. break; /* init ok ? */
  459. }
  460. }
  461. /*
  462.  * allocate memory area and check the 16MB border
  463.  */
  464. static void *ni65_alloc_mem(struct net_device *dev,char *what,int size,int type)
  465. {
  466. struct sk_buff *skb=NULL;
  467. unsigned char *ptr;
  468. void *ret;
  469. if(type) {
  470. ret = skb = alloc_skb(2+16+size,GFP_KERNEL|GFP_DMA);
  471. if(!skb) {
  472. printk("%s: unable to allocate %s memory.n",dev->name,what);
  473. return NULL;
  474. }
  475. skb->dev = dev;
  476. skb_reserve(skb,2+16);
  477. skb_put(skb,R_BUF_SIZE);  /* grab the whole space .. (not necessary) */
  478. ptr = skb->data;
  479. }
  480. else {
  481. ret = ptr = kmalloc(T_BUF_SIZE,GFP_KERNEL | GFP_DMA);
  482. if(!ret) {
  483. printk("%s: unable to allocate %s memory.n",dev->name,what);
  484. return NULL;
  485. }
  486. }
  487. if( (u32) virt_to_bus(ptr+size) > 0x1000000) {
  488. printk("%s: unable to allocate %s memory in lower 16MB!n",dev->name,what);
  489. if(type)
  490. kfree_skb(skb);
  491. else
  492. kfree(ptr);
  493. return NULL;
  494. }
  495. return ret;
  496. }
  497. /*
  498.  * allocate all memory structures .. send/recv buffers etc ...
  499.  */
  500. static int ni65_alloc_buffer(struct net_device *dev)
  501. {
  502. unsigned char *ptr;
  503. struct priv *p;
  504. int i;
  505. /*
  506.  * we need 8-aligned memory ..
  507.  */
  508. ptr = ni65_alloc_mem(dev,"BUFFER",sizeof(struct priv)+8,0);
  509. if(!ptr)
  510. return -ENOMEM;
  511. p = dev->priv = (struct priv *) (((unsigned long) ptr + 7) & ~0x7);
  512. memset((char *) dev->priv,0,sizeof(struct priv));
  513. p->self = ptr;
  514. for(i=0;i<TMDNUM;i++)
  515. {
  516. #ifdef XMT_VIA_SKB
  517. p->tmd_skb[i] = NULL;
  518. #endif
  519. p->tmdbounce[i] = ni65_alloc_mem(dev,"XMIT",T_BUF_SIZE,0);
  520. if(!p->tmdbounce[i]) {
  521. ni65_free_buffer(p);
  522. return -ENOMEM;
  523. }
  524. }
  525. for(i=0;i<RMDNUM;i++)
  526. {
  527. #ifdef RCV_VIA_SKB
  528. p->recv_skb[i] = ni65_alloc_mem(dev,"RECV",R_BUF_SIZE,1);
  529. if(!p->recv_skb[i]) {
  530. ni65_free_buffer(p);
  531. return -ENOMEM;
  532. }
  533. #else
  534. p->recvbounce[i] = ni65_alloc_mem(dev,"RECV",R_BUF_SIZE,0);
  535. if(!p->recvbounce[i]) {
  536. ni65_free_buffer(p);
  537. return -ENOMEM;
  538. }
  539. #endif
  540. }
  541. return 0; /* everything is OK */
  542. }
  543. /*
  544.  * free buffers and private struct
  545.  */
  546. static void ni65_free_buffer(struct priv *p)
  547. {
  548. int i;
  549. if(!p)
  550. return;
  551. for(i=0;i<TMDNUM;i++) {
  552. if(p->tmdbounce[i])
  553. kfree(p->tmdbounce[i]);
  554. #ifdef XMT_VIA_SKB
  555. if(p->tmd_skb[i])
  556. dev_kfree_skb(p->tmd_skb[i]);
  557. #endif
  558. }
  559. for(i=0;i<RMDNUM;i++)
  560. {
  561. #ifdef RCV_VIA_SKB
  562. if(p->recv_skb[i])
  563. dev_kfree_skb(p->recv_skb[i]);
  564. #else
  565. if(p->recvbounce[i])
  566. kfree(p->recvbounce[i]);
  567. #endif
  568. }
  569. if(p->self)
  570. kfree(p->self);
  571. }
  572. /*
  573.  * stop and (re)start lance .. e.g after an error
  574.  */
  575. static void ni65_stop_start(struct net_device *dev,struct priv *p)
  576. {
  577. int csr0 = CSR0_INEA;
  578. writedatareg(CSR0_STOP);
  579. if(debuglevel > 1)
  580. printk("ni65_stop_startn");
  581. if(p->features & INIT_RING_BEFORE_START) {
  582. int i;
  583. #ifdef XMT_VIA_SKB
  584. struct sk_buff *skb_save[TMDNUM];
  585. #endif
  586. unsigned long buffer[TMDNUM];
  587. short blen[TMDNUM];
  588. if(p->xmit_queued) {
  589. while(1) {
  590. if((p->tmdhead[p->tmdlast].u.s.status & XMIT_OWN))
  591. break;
  592. p->tmdlast = (p->tmdlast + 1) & (TMDNUM-1);
  593. if(p->tmdlast == p->tmdnum)
  594. break;
  595. }
  596. }
  597. for(i=0;i<TMDNUM;i++) {
  598. struct tmd *tmdp = p->tmdhead + i;
  599. #ifdef XMT_VIA_SKB
  600. skb_save[i] = p->tmd_skb[i];
  601. #endif
  602. buffer[i] = (u32) bus_to_virt(tmdp->u.buffer);
  603. blen[i] = tmdp->blen;
  604. tmdp->u.s.status = 0x0;
  605. }
  606. for(i=0;i<RMDNUM;i++) {
  607. struct rmd *rmdp = p->rmdhead + i;
  608. rmdp->u.s.status = RCV_OWN;
  609. }
  610. p->tmdnum = p->xmit_queued = 0;
  611. writedatareg(CSR0_STRT | csr0);
  612. for(i=0;i<TMDNUM;i++) {
  613. int num = (i + p->tmdlast) & (TMDNUM-1);
  614. p->tmdhead[i].u.buffer = (u32) virt_to_bus((char *)buffer[num]); /* status is part of buffer field */
  615. p->tmdhead[i].blen = blen[num];
  616. if(p->tmdhead[i].u.s.status & XMIT_OWN) {
  617.  p->tmdnum = (p->tmdnum + 1) & (TMDNUM-1);
  618.  p->xmit_queued = 1;
  619.  writedatareg(CSR0_TDMD | CSR0_INEA | csr0);
  620. }
  621. #ifdef XMT_VIA_SKB
  622. p->tmd_skb[i] = skb_save[num];
  623. #endif
  624. }
  625. p->rmdnum = p->tmdlast = 0;
  626. if(!p->lock)
  627. if (p->tmdnum || !p->xmit_queued)
  628. netif_wake_queue(dev);
  629. dev->trans_start = jiffies;
  630. }
  631. else
  632. writedatareg(CSR0_STRT | csr0);
  633. }
  634. /*
  635.  * init lance (write init-values .. init-buffers) (open-helper)
  636.  */
  637. static int ni65_lance_reinit(struct net_device *dev)
  638. {
  639.  int i;
  640.  struct priv *p = (struct priv *) dev->priv;
  641.  unsigned long flags;
  642.  p->lock = 0;
  643.  p->xmit_queued = 0;
  644.  flags=claim_dma_lock();
  645.  disable_dma(dev->dma); /* I've never worked with dma, but we do it like the packetdriver */
  646.  set_dma_mode(dev->dma,DMA_MODE_CASCADE);
  647.  enable_dma(dev->dma);
  648.  release_dma_lock(flags);
  649.  outw(inw(PORT+L_RESET),PORT+L_RESET); /* first: reset the card */
  650.  if( (i=readreg(CSR0) ) != 0x4)
  651.  {
  652.  printk(KERN_ERR "%s: can't RESET %s card: %04xn",dev->name,
  653. cards[p->cardno].cardname,(int) i);
  654.  flags=claim_dma_lock();
  655.  disable_dma(dev->dma);
  656.  release_dma_lock(flags);
  657.  return 0;
  658.  }
  659.  p->rmdnum = p->tmdnum = p->tmdlast = p->tmdbouncenum = 0;
  660.  for(i=0;i<TMDNUM;i++)
  661.  {
  662.  struct tmd *tmdp = p->tmdhead + i;
  663. #ifdef XMT_VIA_SKB
  664.  if(p->tmd_skb[i]) {
  665.  dev_kfree_skb(p->tmd_skb[i]);
  666.  p->tmd_skb[i] = NULL;
  667.  }
  668. #endif
  669.  tmdp->u.buffer = 0x0;
  670.  tmdp->u.s.status = XMIT_START | XMIT_END;
  671.  tmdp->blen = tmdp->status2 = 0;
  672.  }
  673.  for(i=0;i<RMDNUM;i++)
  674.  {
  675.  struct rmd *rmdp = p->rmdhead + i;
  676. #ifdef RCV_VIA_SKB
  677.  rmdp->u.buffer = (u32) virt_to_bus(p->recv_skb[i]->data);
  678. #else
  679.  rmdp->u.buffer = (u32) virt_to_bus(p->recvbounce[i]);
  680. #endif
  681.  rmdp->blen = -(R_BUF_SIZE-8);
  682.  rmdp->mlen = 0;
  683.  rmdp->u.s.status = RCV_OWN;
  684.  }
  685.  if(dev->flags & IFF_PROMISC)
  686.  ni65_init_lance(p,dev->dev_addr,0x00,M_PROM);
  687.  else if(dev->mc_count || dev->flags & IFF_ALLMULTI)
  688.  ni65_init_lance(p,dev->dev_addr,0xff,0x0);
  689.  else
  690.  ni65_init_lance(p,dev->dev_addr,0x00,0x00);
  691. /*
  692.  * ni65_set_lance_mem() sets L_ADDRREG to CSR0
  693.  * NOW, WE WILL NEVER CHANGE THE L_ADDRREG, CSR0 IS ALWAYS SELECTED
  694.  */
  695.  if(inw(PORT+L_DATAREG) & CSR0_IDON) {
  696.  ni65_set_performance(p);
  697.  /* init OK: start lance , enable interrupts */
  698.  writedatareg(CSR0_CLRALL | CSR0_INEA | CSR0_STRT);
  699.  return 1; /* ->OK */
  700.  }
  701.  printk(KERN_ERR "%s: can't init lance, status: %04xn",dev->name,(int) inw(PORT+L_DATAREG));
  702.  flags=claim_dma_lock();
  703.  disable_dma(dev->dma);
  704.  release_dma_lock(flags);
  705.  return 0; /* ->Error */
  706. }
  707. /*
  708.  * interrupt handler
  709.  */
  710. static void ni65_interrupt(int irq, void * dev_id, struct pt_regs * regs)
  711. {
  712. int csr0 = 0;
  713. struct net_device *dev = dev_id;
  714. struct priv *p;
  715. int bcnt = 32;
  716. p = (struct priv *) dev->priv;
  717. while(--bcnt) {
  718. csr0 = inw(PORT+L_DATAREG);
  719. #if 0
  720. writedatareg( (csr0 & CSR0_CLRALL) ); /* ack interrupts, disable int. */
  721. #else
  722. writedatareg( (csr0 & CSR0_CLRALL) | CSR0_INEA ); /* ack interrupts, interrupts enabled */
  723. #endif
  724. if(!(csr0 & (CSR0_ERR | CSR0_RINT | CSR0_TINT)))
  725. break;
  726. if(csr0 & CSR0_RINT) /* RECV-int? */
  727. ni65_recv_intr(dev,csr0);
  728. if(csr0 & CSR0_TINT) /* XMIT-int? */
  729. ni65_xmit_intr(dev,csr0);
  730. if(csr0 & CSR0_ERR)
  731. {
  732. struct priv *p = (struct priv *) dev->priv;
  733. if(debuglevel > 1)
  734. printk("%s: general error: %04x.n",dev->name,csr0);
  735. if(csr0 & CSR0_BABL)
  736. p->stats.tx_errors++;
  737. if(csr0 & CSR0_MISS) {
  738. int i;
  739. for(i=0;i<RMDNUM;i++)
  740. printk("%02x ",p->rmdhead[i].u.s.status);
  741. printk("n");
  742. p->stats.rx_errors++;
  743. }
  744. if(csr0 & CSR0_MERR) {
  745. if(debuglevel > 1)
  746. printk("%s: Ooops .. memory error: %04x.n",dev->name,csr0);
  747. ni65_stop_start(dev,p);
  748. }
  749. }
  750. }
  751. #ifdef RCV_PARANOIA_CHECK
  752. {
  753.  int j;
  754.  for(j=0;j<RMDNUM;j++)
  755.  {
  756. struct priv *p = (struct priv *) dev->priv;
  757. int i,k,num1,num2;
  758. for(i=RMDNUM-1;i>0;i--) {
  759.  num2 = (p->rmdnum + i) & (RMDNUM-1);
  760.  if(!(p->rmdhead[num2].u.s.status & RCV_OWN))
  761. break;
  762. }
  763. if(i) {
  764. for(k=0;k<RMDNUM;k++) {
  765. num1 = (p->rmdnum + k) & (RMDNUM-1);
  766. if(!(p->rmdhead[num1].u.s.status & RCV_OWN))
  767. break;
  768. }
  769. if(!k)
  770. break;
  771. if(debuglevel > 0)
  772. {
  773. char buf[256],*buf1;
  774. int k;
  775. buf1 = buf;
  776. for(k=0;k<RMDNUM;k++) {
  777. sprintf(buf1,"%02x ",(p->rmdhead[k].u.s.status)); /* & RCV_OWN) ); */
  778. buf1 += 3;
  779. }
  780. *buf1 = 0;
  781. printk(KERN_ERR "%s: Ooops, receive ring corrupted %2d %2d | %sn",dev->name,p->rmdnum,i,buf);
  782. }
  783. p->rmdnum = num1;
  784. ni65_recv_intr(dev,csr0);
  785. if((p->rmdhead[num2].u.s.status & RCV_OWN))
  786. break; /* ok, we are 'in sync' again */
  787. }
  788. else
  789. break;
  790.  }
  791. }
  792. #endif
  793. if( (csr0 & (CSR0_RXON | CSR0_TXON)) != (CSR0_RXON | CSR0_TXON) ) {
  794. printk("%s: RX or TX was offline -> restartn",dev->name);
  795. ni65_stop_start(dev,p);
  796. }
  797. else
  798. writedatareg(CSR0_INEA);
  799. return;
  800. }
  801. /*
  802.  * We have received an Xmit-Interrupt ..
  803.  * send a new packet if necessary
  804.  */
  805. static void ni65_xmit_intr(struct net_device *dev,int csr0)
  806. {
  807. struct priv *p = (struct priv *) dev->priv;
  808. while(p->xmit_queued)
  809. {
  810. struct tmd *tmdp = p->tmdhead + p->tmdlast;
  811. int tmdstat = tmdp->u.s.status;
  812. if(tmdstat & XMIT_OWN)
  813. break;
  814. if(tmdstat & XMIT_ERR)
  815. {
  816. #if 0
  817. if(tmdp->status2 & XMIT_TDRMASK && debuglevel > 3)
  818. printk(KERN_ERR "%s: tdr-problems (e.g. no resistor)n",dev->name);
  819. #endif
  820.  /* checking some errors */
  821. if(tmdp->status2 & XMIT_RTRY)
  822. p->stats.tx_aborted_errors++;
  823. if(tmdp->status2 & XMIT_LCAR)
  824. p->stats.tx_carrier_errors++;
  825. if(tmdp->status2 & (XMIT_BUFF | XMIT_UFLO )) {
  826. /* this stops the xmitter */
  827. p->stats.tx_fifo_errors++;
  828. if(debuglevel > 0)
  829. printk(KERN_ERR "%s: Xmit FIFO/BUFF errorn",dev->name);
  830. if(p->features & INIT_RING_BEFORE_START) {
  831. tmdp->u.s.status = XMIT_OWN | XMIT_START | XMIT_END; /* test: resend this frame */
  832. ni65_stop_start(dev,p);
  833. break; /* no more Xmit processing .. */
  834. }
  835. else
  836.  ni65_stop_start(dev,p);
  837. }
  838. if(debuglevel > 2)
  839. printk(KERN_ERR "%s: xmit-error: %04x %02x-%04xn",dev->name,csr0,(int) tmdstat,(int) tmdp->status2);
  840. if(!(csr0 & CSR0_BABL)) /* don't count errors twice */
  841. p->stats.tx_errors++;
  842. tmdp->status2 = 0;
  843. }
  844. else {
  845. p->stats.tx_bytes -= (short)(tmdp->blen);
  846. p->stats.tx_packets++;
  847. }
  848. #ifdef XMT_VIA_SKB
  849. if(p->tmd_skb[p->tmdlast]) {
  850.  dev_kfree_skb_irq(p->tmd_skb[p->tmdlast]);
  851.  p->tmd_skb[p->tmdlast] = NULL;
  852. }
  853. #endif
  854. p->tmdlast = (p->tmdlast + 1) & (TMDNUM-1);
  855. if(p->tmdlast == p->tmdnum)
  856. p->xmit_queued = 0;
  857. }
  858. netif_wake_queue(dev);
  859. }
  860. /*
  861.  * We have received a packet
  862.  */
  863. static void ni65_recv_intr(struct net_device *dev,int csr0)
  864. {
  865. struct rmd *rmdp;
  866. int rmdstat,len;
  867. int cnt=0;
  868. struct priv *p = (struct priv *) dev->priv;
  869. rmdp = p->rmdhead + p->rmdnum;
  870. while(!( (rmdstat = rmdp->u.s.status) & RCV_OWN))
  871. {
  872. cnt++;
  873. if( (rmdstat & (RCV_START | RCV_END | RCV_ERR)) != (RCV_START | RCV_END) ) /* error or oversized? */
  874. {
  875. if(!(rmdstat & RCV_ERR)) {
  876. if(rmdstat & RCV_START)
  877. {
  878. p->stats.rx_length_errors++;
  879. printk(KERN_ERR "%s: recv, packet too long: %dn",dev->name,rmdp->mlen & 0x0fff);
  880. }
  881. }
  882. else {
  883. if(debuglevel > 2)
  884. printk(KERN_ERR "%s: receive-error: %04x, lance-status: %04x/%04xn",
  885. dev->name,(int) rmdstat,csr0,(int) inw(PORT+L_DATAREG) );
  886. if(rmdstat & RCV_FRAM)
  887. p->stats.rx_frame_errors++;
  888. if(rmdstat & RCV_OFLO)
  889. p->stats.rx_over_errors++;
  890. if(rmdstat & RCV_CRC)
  891. p->stats.rx_crc_errors++;
  892. if(rmdstat & RCV_BUF_ERR)
  893. p->stats.rx_fifo_errors++;
  894. }
  895. if(!(csr0 & CSR0_MISS)) /* don't count errors twice */
  896. p->stats.rx_errors++;
  897. }
  898. else if( (len = (rmdp->mlen & 0x0fff) - 4) >= 60)
  899. {
  900. #ifdef RCV_VIA_SKB
  901. struct sk_buff *skb = alloc_skb(R_BUF_SIZE+2+16,GFP_ATOMIC);
  902. if (skb)
  903. skb_reserve(skb,16);
  904. #else
  905. struct sk_buff *skb = dev_alloc_skb(len+2);
  906. #endif
  907. if(skb)
  908. {
  909. skb_reserve(skb,2);
  910. skb->dev = dev;
  911. #ifdef RCV_VIA_SKB
  912. if( (unsigned long) (skb->data + R_BUF_SIZE) > 0x1000000) {
  913. skb_put(skb,len);
  914. eth_copy_and_sum(skb, (unsigned char *)(p->recv_skb[p->rmdnum]->data),len,0);
  915. }
  916. else {
  917. struct sk_buff *skb1 = p->recv_skb[p->rmdnum];
  918. skb_put(skb,R_BUF_SIZE);
  919. p->recv_skb[p->rmdnum] = skb;
  920. rmdp->u.buffer = (u32) virt_to_bus(skb->data);
  921. skb = skb1;
  922. skb_trim(skb,len);
  923. }
  924. #else
  925. skb_put(skb,len);
  926. eth_copy_and_sum(skb, (unsigned char *) p->recvbounce[p->rmdnum],len,0);
  927. #endif
  928. p->stats.rx_packets++;
  929. p->stats.rx_bytes += len;
  930. skb->protocol=eth_type_trans(skb,dev);
  931. netif_rx(skb);
  932. dev->last_rx = jiffies;
  933. }
  934. else
  935. {
  936. printk(KERN_ERR "%s: can't alloc new sk_buffn",dev->name);
  937. p->stats.rx_dropped++;
  938. }
  939. }
  940. else {
  941. printk(KERN_INFO "%s: received runt packetn",dev->name);
  942. p->stats.rx_errors++;
  943. }
  944. rmdp->blen = -(R_BUF_SIZE-8);
  945. rmdp->mlen = 0;
  946. rmdp->u.s.status = RCV_OWN; /* change owner */
  947. p->rmdnum = (p->rmdnum + 1) & (RMDNUM-1);
  948. rmdp = p->rmdhead + p->rmdnum;
  949. }
  950. }
  951. /*
  952.  * kick xmitter ..
  953.  */
  954.  
  955. static void ni65_timeout(struct net_device *dev)
  956. {
  957. int i;
  958. struct priv *p = (struct priv *) dev->priv;
  959. printk(KERN_ERR "%s: xmitter timed out, try to restart!n",dev->name);
  960. for(i=0;i<TMDNUM;i++)
  961. printk("%02x ",p->tmdhead[i].u.s.status);
  962. printk("n");
  963. ni65_lance_reinit(dev);
  964. dev->trans_start = jiffies;
  965. netif_wake_queue(dev);
  966. }
  967. /*
  968.  * Send a packet
  969.  */
  970. static int ni65_send_packet(struct sk_buff *skb, struct net_device *dev)
  971. {
  972. struct priv *p = (struct priv *) dev->priv;
  973. netif_stop_queue(dev);
  974. if (test_and_set_bit(0, (void*)&p->lock)) {
  975. printk(KERN_ERR "%s: Queue was locked.n", dev->name);
  976. return 1;
  977. }
  978. {
  979. short len = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
  980. struct tmd *tmdp;
  981. long flags;
  982. #ifdef XMT_VIA_SKB
  983. if( (unsigned long) (skb->data + skb->len) > 0x1000000) {
  984. #endif
  985. memcpy((char *) p->tmdbounce[p->tmdbouncenum] ,(char *)skb->data,
  986.  (skb->len > T_BUF_SIZE) ? T_BUF_SIZE : skb->len);
  987. dev_kfree_skb (skb);
  988. save_flags(flags);
  989. cli();
  990. tmdp = p->tmdhead + p->tmdnum;
  991. tmdp->u.buffer = (u32) virt_to_bus(p->tmdbounce[p->tmdbouncenum]);
  992. p->tmdbouncenum = (p->tmdbouncenum + 1) & (TMDNUM - 1);
  993. #ifdef XMT_VIA_SKB
  994. }
  995. else {
  996. save_flags(flags);
  997. cli();
  998. tmdp = p->tmdhead + p->tmdnum;
  999. tmdp->u.buffer = (u32) virt_to_bus(skb->data);
  1000. p->tmd_skb[p->tmdnum] = skb;
  1001. }
  1002. #endif
  1003. tmdp->blen = -len;
  1004. tmdp->u.s.status = XMIT_OWN | XMIT_START | XMIT_END;
  1005. writedatareg(CSR0_TDMD | CSR0_INEA); /* enable xmit & interrupt */
  1006. p->xmit_queued = 1;
  1007. p->tmdnum = (p->tmdnum + 1) & (TMDNUM-1);
  1008. if(p->tmdnum != p->tmdlast)
  1009. netif_wake_queue(dev);
  1010. p->lock = 0;
  1011. dev->trans_start = jiffies;
  1012. restore_flags(flags);
  1013. }
  1014. return 0;
  1015. }
  1016. static struct net_device_stats *ni65_get_stats(struct net_device *dev)
  1017. {
  1018. #if 0
  1019. int i;
  1020. struct priv *p = (struct priv *) dev->priv;
  1021. for(i=0;i<RMDNUM;i++)
  1022. {
  1023. struct rmd *rmdp = p->rmdhead + ((p->rmdnum + i) & (RMDNUM-1));
  1024. printk("%02x ",rmdp->u.s.status);
  1025. }
  1026. printk("n");
  1027. #endif
  1028. return &((struct priv *) dev->priv)->stats;
  1029. }
  1030. static void set_multicast_list(struct net_device *dev)
  1031. {
  1032. if(!ni65_lance_reinit(dev))
  1033. printk(KERN_ERR "%s: Can't switch card into MC mode!n",dev->name);
  1034. netif_wake_queue(dev);
  1035. }
  1036. #ifdef MODULE
  1037. static struct net_device dev_ni65 = { base_addr: 0x360, irq: 9, init: ni65_probe };
  1038. /* set: io,irq,dma or set it when calling insmod */
  1039. static int irq;
  1040. static int io;
  1041. static int dma;
  1042. MODULE_PARM(irq, "i");
  1043. MODULE_PARM(io, "i");
  1044. MODULE_PARM(dma, "i");
  1045. MODULE_PARM_DESC(irq, "ni6510 IRQ number (ignored for some cards)");
  1046. MODULE_PARM_DESC(io, "ni6510 I/O base address");
  1047. MODULE_PARM_DESC(dma, "ni6510 ISA DMA channel (ignored for some cards)");
  1048. int init_module(void)
  1049. {
  1050. dev_ni65.irq = irq;
  1051. dev_ni65.dma = dma;
  1052. dev_ni65.base_addr = io;
  1053. if (register_netdev(&dev_ni65) != 0)
  1054. return -EIO;
  1055. return 0;
  1056. }
  1057. void cleanup_module(void)
  1058. {
  1059. struct priv *p;
  1060. p = (struct priv *) dev_ni65.priv;
  1061. if(!p) {
  1062. printk("Ooops .. no private structn");
  1063. return;
  1064. }
  1065. disable_dma(dev_ni65.dma);
  1066. free_dma(dev_ni65.dma);
  1067. unregister_netdev(&dev_ni65);
  1068. release_region(dev_ni65.base_addr,cards[p->cardno].total_size);
  1069. ni65_free_buffer(p);
  1070. dev_ni65.priv = NULL;
  1071. }
  1072. #endif /* MODULE */
  1073. MODULE_LICENSE("GPL");
  1074. /*
  1075.  * END of ni65.c
  1076.  */