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

📄 rtl_3c905cx_drv.c

📁 最新rtlinux内核源码
💻 C
📖 第 1 页 / 共 4 页
字号:
/*        The original file was written 1996-1999 by Donald Becker.	This software may be used and distributed according to the terms	of the GNU General Public License, incorporated herein by reference.	This driver is for the 3Com "Vortex" and "Boomerang" series ethercards.	Members of the series include Fast EtherLink 3c590/3c592/3c595/3c597	and the EtherLink XL 3c900 and 3c905 cards.	Problem reports and questions should be directed to	vortex@scyld.com	The author may be reached as becker@scyld.com, or C/O	Scyld Computing Corporation	410 Severn Ave., Suite 210	Annapolis MD 21403	Linux Kernel Additions (better to see the last one first):	 	0.99H+lk0.9 - David S. Miller - softnet, PCI DMA updates 	0.99H+lk1.0 - Jeff Garzik <jgarzik@mandrakesoft.com>		Remove compatibility defines for kernel versions < 2.2.x.		Update for new 2.3.x module interface	LK1.1.2 (March 19, 2000)	* New PCI interface (jgarzik)    LK1.1.3 25 April 2000, Andrew Morton <andrewm@uow.edu.au>    - Merged with 3c575_cb.c    - Don't set RxComplete in boomerang interrupt enable reg    - spinlock in vortex_timer to protect mdio functions    - disable local interrupts around call to vortex_interrupt in      vortex_tx_timeout() (So vortex_interrupt can use spin_lock())    - Select window 3 in vortex_timer()'s write to Wn3_MAC_Ctrl    - In vortex_start_xmit(), move the lock to _after_ we've altered      vp->cur_tx and vp->tx_full.  This defeats the race between      vortex_start_xmit() and vortex_interrupt which was identified      by Bogdan Costescu.    - Merged back support for six new cards from various sources    - Set vortex_have_pci if pci_module_init returns zero (fixes cardbus      insertion oops)    - Tell it that 3c905C has NWAY for 100bT autoneg    - Fix handling of SetStatusEnd in 'Too much work..' code, as      per 2.3.99's 3c575_cb (Dave Hinds).    - Split ISR into two for vortex & boomerang    - Fix MOD_INC/DEC races    - Handle resource allocation failures.    - Fix 3CCFE575CT LED polarity    - Make tx_interrupt_mitigation the default    LK1.1.4 25 April 2000, Andrew Morton <andrewm@uow.edu.au>        - Add extra TxReset to vortex_up() to fix 575_cb hotplug initialisation probs.    - Put vortex_info_tbl into __devinitdata    - In the vortex_error StatsFull HACK, disable stats in vp->intr_enable as well      as in the hardware.    - Increased the loop counter in issue_and_wait from 2,000 to 4,000.    LK1.1.5 28 April 2000, andrewm    - Added powerpc defines (John Daniel <jdaniel@etresoft.com> said these work...)    - Some extra diagnostics    - In vortex_error(), reset the Tx on maxCollisions.  Otherwise most      chips usually get a Tx timeout.    - Added extra_reset module parm    - Replaced some inline timer manip with mod_timer      (Franois romieu <Francois.Romieu@nic.fr>)    - In vortex_up(), don't make Wn3_config initialisation dependent upon has_nway      (this came across from 3c575_cb).    LK1.1.6 06 Jun 2000, andrewm    - Backed out the PPC defines.    - Use del_timer_sync(), mod_timer().    - Fix wrapped ulong comparison in boomerang_rx()    - Add IS_TORNADO, use it to suppress 3c905C checksum error msg      (Donald Becker, I Lee Hetherington <ilh@sls.lcs.mit.edu>)    - Replace union wn3_config with BFINS/BFEXT manipulation for      sparc64 (Pete Zaitcev, Peter Jones)    - In vortex_error, do_tx_reset and vortex_tx_timeout(Vortex):      do a netif_wake_queue() to better recover from errors. (Anders Pedersen,      Donald Becker)    - Print a warning on out-of-memory (rate limited to 1 per 10 secs)    - Added two more Cardbus 575 NICs: 5b57 and 6564 (Paul Wagland)    LK1.1.7 2 Jul 2000 andrewm    - Better handling of shared IRQs    - Reset the transmitter on a Tx reclaim error    - Fixed crash under OOM during vortex_open() (Mark Hemment)    - Fix Rx cessation problem during OOM (help from Mark Hemment)    - The spinlocks around the mdio access were blocking interrupts for 300uS.      Fix all this to use spin_lock_bh() within mdio_read/write    - Only write to TxFreeThreshold if it's a boomerang - other NICs don't      have one.    - Added 802.3x MAC-layer flow control support   LK1.1.8 13 Aug 2000 andrewm    - Ignore request_region() return value - already reserved if Cardbus.    - Merged some additional Cardbus flags from Don's 0.99Qk    - Some fixes for 3c556 (Fred Maciel)    - Fix for EISA initialisation (Jan Rekorajski)    - Renamed MII_XCVR_PWR and EEPROM_230 to align with 3c575_cb and D. Becker's drivers    - Fixed MII_XCVR_PWR for 3CCFE575CT    - Added INVERT_LED_PWR, used it.    - Backed out the extra_reset stuff   LK1.1.9 12 Sep 2000 andrewm    - Backed out the tx_reset_resume flags.  It was a no-op.    - In vortex_error, don't reset the Tx on txReclaim errors    - In vortex_error, don't reset the Tx on maxCollisions errors.      Hence backed out all the DownListPtr logic here.    - In vortex_error, give Tornado cards a partial TxReset on      maxCollisions (David Hinds).  Defined MAX_COLLISION_RESET for this.    - Redid some driver flags and device names based on pcmcia_cs-3.1.20.    - Fixed a bug where, if vp->tx_full is set when the interface      is downed, it remains set when the interface is upped.  Bad      things happen.   LK1.1.10 17 Sep 2000 andrewm    - Added EEPROM_8BIT for 3c555 (Fred Maciel)    - Added experimental support for the 3c556B Laptop Hurricane (Louis Gerbarg)    - Add HAS_NWAY to "3c900 Cyclone 10Mbps TPO"   LK1.1.11 13 Nov 2000 andrewm    - Dump MOD_INC/DEC_USE_COUNT, use SET_MODULE_OWNER   LK1.1.12 1 Jan 2001 andrewm (2.4.0-pre1)    - Call pci_enable_device before we request our IRQ (Tobias Ringstrom)    - Add 3c590 PCI latency timer hack to vortex_probe1 (from 0.99Ra)    - Added extended issue_and_wait for the 3c905CX.    - Look for an MII on PHY index 24 first (3c905CX oddity).    - Add HAS_NWAY to 3cSOHO100-TX (Brett Frankenberger)    - Don't free skbs we don't own on oom path in vortex_open().   LK1.1.13 27 Jan 2001    - Added explicit `medialock' flag so we can truly      lock the media type down with `options'.    - "check ioremap return and some tidbits" (Arnaldo Carvalho de Melo <acme@conectiva.com.br>)    - Added and used EEPROM_NORESET for 3c556B PM resumes.    - Fixed leakage of vp->rx_ring.    - Break out separate HAS_HWCKSM device capability flag.    - Kill vp->tx_full (ANK)    - Merge zerocopy fragment handling (ANK?)   LK1.1.14 15 Feb 2001    - Enable WOL.  Can be turned on with `enable_wol' module option.    - EISA and PCI initialisation fixes (jgarzik, Manfred Spraul)    - If a device's internalconfig register reports it has NWAY,      use it, even if autoselect is enabled.   LK1.1.15 6 June 2001 akpm    - Prevent double counting of received bytes (Lars Christensen)    - Add ethtool support (jgarzik)    - Add module parm descriptions (Andrzej M. Krzysztofowicz)    - Implemented alloc_etherdev() API    - Special-case the 'Tx error 82' message.   LK1.1.16 18 July 2001 akpm    - Make NETIF_F_SG dependent upon nr_free_highpages(), not on CONFIG_HIGHMEM    - Lessen verbosity of bootup messages    - Fix WOL - use new PM API functions.    - Use netif_running() instead of vp->open in suspend/resume.    - Don't reset the interface logic on open/close/rmmod.  It upsets      autonegotiation, and hence DHCP (from 0.99T).    - Back out EEPROM_NORESET flag because of the above (we do it for all      NICs).    - Correct 3c982 identification string    - Rename wait_for_completion() to issue_and_wait() to avoid completion.h      clash.=====================================================================================                          PORTING TO RT-LINUX                       =====================================================================================   LK1.1.17 14 March 2003             Sergio Perez Alca駃z  <serpeal@upvnet.upv.es>  Departamento            de  Inform醫ica  de  Sistemas  y Computadores  Universidad            Polit閏nica de Valencia	    The RTL-lwIP project  has  been supported by  the  Spanish	    Government  Research   Office (CICYT)     under      grant	    TIC2002-04123-C03-03   SISTEMAS DE TIEMPO REAL EMPOTRADOS,	    FIABLES Y DISTRIBUIDOS BASADOS EN COMPONENTES          Valencia (Spain)                      	    Porting the driver to RT-Linux, that is:	    -Giving to  the  driver the RT-Linux  driver  architecture	    (open, close, read, write, ioctl).	    -Using my own buffer management.	    -No NIC stats allowed.	    -Some calls of pci stuff have been implemented.	    -Changing  the    interrupts management and    the handler	    phylosophy.	    -Changing the "receive" and "send" phylosophy.	    -Introducing signaling.	    -Registering threads  that  want  to  be notified  of  the	    arrival of a packet.	    -IP filtering.	    -Ethernet filtering.	     - ....	     The porting is just for  the 3Com905C-X card. So no other	     cards are supported (as far as I know...).	     	     Just take a look at it.   LK1.1.18     12     January    2004            Sergio Perez Alca駃z <serpeal@upvnet.upv.es> Departamento            de Inform醫ica de Sistemas y Computadores Universidad            Polit閏nica de Valencia	    The RTL-lwIP project  has  been supported by   the Spanish	    Government     Research   Office   (CICYT)    under  grant	    TIC2002-04123-C03-03  SISTEMAS DE  TIEMPO REAL EMPOTRADOS,	    FIABLES Y  DISTRIBUIDOS  BASADOS EN  COMPONENTES  Valencia	    (Spain)	    -Removed threads  registration (to  better comply with the	    POSIX standard).            -Added  a semaphore   to block   threads  when they    are            performing a read and there are not packets available.	    -Modified to use the  new release of DIDMA (Dynamic Memory	    Allocator) now called TLSF.=====================================================================================    - see Documentation/networking/vortex.txt*/#include "rtl_3c905cx_drv.h"#include "rt_pci.h"#include "netif/net_policy/FIFO_policy.h"MODULE_LICENSE("GPL");static struct net_policy_operations rt_3c905x_policy = {  FIFO_add_frame_to_buffer,  FIFO_extract_frame_of_buffer,  FIFO_initialize_rx_buffer,  FIFO_dealloc_rx_buffer,};static struct fifo_rx_buffer_t rt_3c905x_rx_buffer;static sem_t rt_3c905x_sem;#define COM3_905C_MAJOR 204#define COM3_905C_NAME "eth"#define COM3_SIGNAL RTL_SIGUSR2static int rt_3c905c_inside_the_interrupt_handler = 0, rt_3c905c_trying_to_close = 0;static int rt_3c905c_interrupted = 0, rt_3c905c_writting = 0;static struct rtl_file_operations rtl_3COM905C_fops = {       	NULL, 	rtl_3COM905C_read,	rtl_3COM905C_write,	rtl_3COM905C_ioctl,	NULL,	rtl_3COM905C_open,	rtl_3COM905C_release};struct pci_dev *rt_3c905c_dev;static struct vortex_private rt_3c905c_vp;static unsigned char rt_3c905c_registered = 0x00, rt_3c905c_opened = 0x00;unsigned char rt_3c905c_ip_addr[2][4]={{0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00}};static int rt_3c905c_n_filters = 0;/*************************************************************************************//* This function is used to set an IP filter to the incoming packets. It is accessed *//* by means of ioctl. Only two IP filters are allowed.                               */  /*************************************************************************************/int rt_3c905c_set_ip_filter(unsigned long ipaddr){  if(rt_3c905c_n_filters<=1){    rt_3c905c_ip_addr[rt_3c905c_n_filters][0]=ipaddr & 0x000000ff;     rt_3c905c_ip_addr[rt_3c905c_n_filters][1]= (ipaddr >> 8) & 0x000000ff;     rt_3c905c_ip_addr[rt_3c905c_n_filters][2]= (ipaddr >> 16) & 0x000000ff;     rt_3c905c_ip_addr[rt_3c905c_n_filters][3]= (ipaddr >> 24) & 0x000000ff;     rt_3c905c_n_filters++;    return 0;  }   rtl_printf("You cannot set more than 2 IP filters !!");  return -1;}/***************************************************************************************//* This function is used to get the MAC address of the ethernet card. It is accessed   *//* by means of ioctl.                                                                  *//***************************************************************************************/int rt_3c905c_obtain_mac_address(unsigned char *mac){  int i;  for(i=0; i<6; i++)    mac[i]=rt_3c905c_vp.dev_addr[i];  return 0;}/***************************************************************************************//* This function implements the read call. Makes buf to point to an internal buffer    *//* and returns the lenght of that buffer. The packet returned depends on the policy    *//* selected.                                                                           *//***************************************************************************************/static ssize_t rtl_3COM905C_read(struct rtl_file *filp, char *buf, size_t count, loff_t* ppos){  sem_wait(&rt_3c905x_sem);  return rt_3c905x_policy.extract_frame_of_buffer(&rt_3c905x_rx_buffer, buf);}/***************************************************************************************//* This function implements the ioctl call.                                            *//***************************************************************************************/static int rtl_3COM905C_ioctl(struct rtl_file * filp, unsigned int request, unsigned long other){  switch(request) {  case 1:           /* set_ip_filter */    rt_3c905c_set_ip_filter(other);    break;  case 2:           /* obtain_mac_address */    rt_3c905c_obtain_mac_address((unsigned char *)other);    break;  }  return 0;}/***************************************************************************************//* This function implements the close call. It stalls the card and frees resources.    *//***************************************************************************************/static int rtl_3COM905C_release (struct rtl_file *filp){    rtl_irqstate_t state;    rtl_no_interrupts(state);    vortex_close(rt_3c905c_dev);    vortex_remove_one(rt_3c905c_dev);    if(rt_3c905c_opened == 0x01){      sem_destroy(&rt_3c905x_sem);      rt_3c905x_policy.dealloc_rx_buffer(&rt_3c905x_rx_buffer);    }    rt_3c905c_opened = 0x00;    rtl_restore_interrupts(state);    return 0;}/***************************************************************************************//* This function implements the write call. It is not a blocking function, that means  *//* that writting returns inmediatly, it doesn't waits till the packet has been sent.   *//* The return value is always the size of the buffer being sent.                       *//***************************************************************************************/static ssize_t rtl_3COM905C_write(struct rtl_file *filp, const char *buf, size_t count, loff_t* ppos){  ssize_t tmp;   rtl_irqstate_t state;  rtl_no_interrupts(state);  tmp=rt_3c905c_send_packet(buf,count);  rtl_restore_interrupts(state);  return tmp;}/***************************************************************************************//* This function implements the open call. It initialises the card. The card starts    *//* receiving packets.                                                                  *//***************************************************************************************/

⌨️ 快捷键说明

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