⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linux下8019驱动程序.txt

📁 8019驱动程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:
326                 SA_prom[i] = inb(ioaddr + NE_DATAPORT);                                                         
327                 SA_prom[i+1] = inb(ioaddr + NE_DATAPORT);                                                       
328                 if (SA_prom[i] != SA_prom[i+1])                                                                 
329                         wordlength = 1;                                                                         
330         }                                                                                                       
331                                                                                                                 
332         if (wordlength == 2)                                                                                    
333         {                                                                                                       
334                 for (i = 0; i < 16; i++)                                                                        
335                         SA_prom[i] = SA_prom[i+i];                                                              
336                 /* We must set the 8390 for word mode. */                                                       
337                 outb_p(0x49, ioaddr + EN0_DCFG);                                                                
338                 start_page = NESM_START_PG;                                                                     
339                 stop_page = NESM_STOP_PG;                                                                       
340         } else {                                                                                                
341                 start_page = NE1SM_START_PG;                                                                    
342                 stop_page = NE1SM_STOP_PG;                                                                      
343         }                                                                                                       
344                                                                                                                 
345         neX000 = (SA_prom[14] == 0x57  &&  SA_prom[15] == 0x57);                                                
346         ctron =  (SA_prom[0] == 0x00 && SA_prom[1] == 0x00 && SA_prom[2] == 0x1d);                              
347         copam =  (SA_prom[14] == 0x49 && SA_prom[15] == 0x00);                                                  
348                                                                                                                 
349         /* Set up the rest of the parameters. */                                                                
350         if (neX000 || bad_card || copam) {                                                                      
351                 name = (wordlength == 2) ? "NE2000" : "NE1000";                                                 
352         }                                                                                                       
353         else if (ctron)                                                                                         
354         {                                                                                                       
355                 name = (wordlength == 2) ? "Ctron-8" : "Ctron-16";                                              
356                 start_page = 0x01;                                                                              
357                 stop_page = (wordlength == 2) ? 0x40 : 0x20;                                                    
358         }                                                                                                       
359         else                                                                                                    
360         {                                                                                                       
361 #ifdef SUPPORT_NE_BAD_CLONES                                                                                    
362                 /* Ack!  Well, there might be a *bad* NE*000 clone there.                                       
363                    Check for total bogus addresses. */                                                          
364                 for (i = 0; bad_clone_list[i].name8; i++)                                                       
365                 {                                                                                               
366                         if (SA_prom[0] == bad_clone_list[i].SAprefix[0] &&                                      
367                                 SA_prom[1] == bad_clone_list[i].SAprefix[1] &&                                  
368                                 SA_prom[2] == bad_clone_list[i].SAprefix[2])                                    
369                         {                                                                                       
370                                 if (wordlength == 2)                                                            
371                                 {                                                                               
372                                         name = bad_clone_list[i].name16;                                        
373                                 } else {                                                                        
374                                         name = bad_clone_list[i].name8;                                         
375                                 }                                                                               
376                                 break;                                                                          
377                         }                                                                                       
378                 }                                                                                               
379                 if (bad_clone_list[i].name8 == NULL)                                                            
380                 {                                                                                               
381                         printk(" not found (invalid signature %2.2x %2.2x).\n",                                 
382                                 SA_prom[14], SA_prom[15]);                                                      
383                         ret = -ENXIO;                                                                           
384                         goto err_out;                                                                           
385                 }                                                                                               
386 #else                                                                                                           
387                 printk(" not found.\n");                                                                        
388                 ret = -ENXIO;                                                                                   
389                 goto err_out;                                                                                   
390 #endif                                                                                                          
391         }                                                                                                       
392                                                                                                                 
393         if (dev->irq < 2)                                                                                       
394         {                                                                                                       
395                 unsigned long cookie = probe_irq_on();                                                          
396                 outb_p(0x50, ioaddr + EN0_IMR); /* Enable one interrupt. */                                     
397                 outb_p(0x00, ioaddr + EN0_RCNTLO);                                                              
398                 outb_p(0x00, ioaddr + EN0_RCNTHI);                                                              
399                 outb_p(E8390_RREAD+E8390_START, ioaddr); /* Trigger it... */                                    
400                 mdelay(10);             /* wait 10ms for interrupt to propagate */                              
401                 outb_p(0x00, ioaddr + EN0_IMR);                 /* Mask it again. */                            
402                 dev->irq = probe_irq_off(cookie);                                                               
403                 if (ei_debug > 2)                                                                               
404                         printk(" autoirq is %d\n", dev->irq);                                                   
405         } else if (dev->irq == 2)                                                                               
406                 /* Fixup for users that don't know that IRQ 2 is really IRQ 9,                                  
407                    or don't know which one to set. */                                                           
408                 dev->irq = 9;                                                                                   
409                                                                                                                 
410         if (! dev->irq) {                                                                                       
411                 printk(" failed to detect IRQ line.\n");                                                        
412                 ret = -EAGAIN;                                                                                  
413                 goto err_out;                                                                                   
414         }                                                                                                       
415                                                                                                                 
416         /* Allocate dev->priv and fill in 8390 specific dev fields. */                                          
417         if (ethdev_init(dev))                                                                                   
418         {                                                                                                       
419                 printk (" unable to get memory for dev->priv.\n");                                              
420                 ret = -ENOMEM;                                                                                  
421                 goto err_out;                                                                                   
422         }                                                                                                       
423                                                                                                                 
424         /* Snarf the interrupt now.  There's no point in waiting since we cannot                                
425            share and the board will usually be enabled. */                                                      
426         ret = request_irq(dev->irq, ei_interrupt, 0, name, dev);                                                
427         if (ret) {                                                                                              
428                 printk (" unable to get IRQ %d (errno=%d).\n", dev->irq, ret);                                  
429                 goto err_out_kfree;                                                                             
430         }                                                                                                       
431                                                                                                                 
432         dev->base_addr = ioaddr;                                                                                
433                                                                                                                 
434         for(i = 0; i < ETHER_ADDR_LEN; i++) {                                                                   
435                 printk(" %2.2x", SA_prom[i]);                                                                   
436                 dev->dev_addr[i] = SA_prom[i];                                                                  
437         }                                                                                                       

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -