diff options
author | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2011-06-25 04:19:17 -0700 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2011-08-13 00:44:19 -0700 |
commit | f860b0522f65d3a0f8e6a4d908933737e1a82817 (patch) | |
tree | 8002a666789db1196fd85df663d0fc4d8e852723 /drivers | |
parent | 531c4f896ca380812c22841e8ae396428a3327bf (diff) |
drivers/net: Kconfig and Makefile cleanup
After the move of the Ethernet drivers into drivers/net/ethernet/
there was some leftover cleanup to do in the Kconfig and Makefile.
Removed the 10/100, 1000, and 10GbE Kconfig menus.
Removed the out-dated pci-skeleton.c file which was used an
example driver. With the current networking features and
structure, the file is no longer a good example to use for
driver creation.
CC: Jeff Garzik <jgarzik@pobox.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/Kconfig | 116 | ||||
-rw-r--r-- | drivers/net/Makefile | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/Kconfig | 6 | ||||
-rw-r--r-- | drivers/net/pci-skeleton.c | 1923 |
4 files changed, 6 insertions, 2043 deletions
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 3a1fd2c716c..31d87929c1a 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -192,122 +192,6 @@ source "drivers/net/phy/Kconfig" source "drivers/net/ethernet/Kconfig" -menuconfig NET_ETHERNET - bool "Ethernet (10 or 100Mbit)" - depends on !UML - ---help--- - Ethernet (also called IEEE 802.3 or ISO 8802-2) is the most common - type of Local Area Network (LAN) in universities and companies. - - Common varieties of Ethernet are: 10BASE-2 or Thinnet (10 Mbps over - coaxial cable, linking computers in a chain), 10BASE-T or twisted - pair (10 Mbps over twisted pair cable, linking computers to central - hubs), 10BASE-F (10 Mbps over optical fiber links, using hubs), - 100BASE-TX (100 Mbps over two twisted pair cables, using hubs), - 100BASE-T4 (100 Mbps over 4 standard voice-grade twisted pair - cables, using hubs), 100BASE-FX (100 Mbps over optical fiber links) - [the 100BASE varieties are also known as Fast Ethernet], and Gigabit - Ethernet (1 Gbps over optical fiber or short copper links). - - If your Linux machine will be connected to an Ethernet and you have - an Ethernet network interface card (NIC) installed in your computer, - say Y here and read the Ethernet-HOWTO, available from - <http://www.tldp.org/docs.html#howto>. You will then also have - to say Y to the driver for your particular NIC. - - Note that the answer to this question won't directly affect the - kernel: saying N will just cause the configurator to skip all - the questions about Ethernet network cards. If unsure, say N. - -if NET_ETHERNET - -config NET_PCI - bool "EISA, VLB, PCI and on board controllers" - depends on ISA || EISA || PCI - help - This is another class of network cards which attach directly to the - bus. If you have one of those, say Y and read the Ethernet-HOWTO, - available from <http://www.tldp.org/docs.html#howto>. - - Note that the answer to this question doesn't directly affect the - kernel: saying N will just cause the configurator to skip all - the questions about this class of network cards. If you say Y, you - will be asked for your specific card in the following questions. If - you are unsure, say Y. - -config NET_POCKET - bool "Pocket and portable adapters" - depends on PARPORT - ---help--- - Cute little network (Ethernet) devices which attach to the parallel - port ("pocket adapters"), commonly used with laptops. If you have - one of those, say Y and read the Ethernet-HOWTO, available from - <http://www.tldp.org/docs.html#howto>. - - If you want to plug a network (or some other) card into the PCMCIA - (or PC-card) slot of your laptop instead (PCMCIA is the standard for - credit card size extension cards used by all modern laptops), you - need the pcmcia-cs package (location contained in the file - <file:Documentation/Changes>) and you can say N here. - - Laptop users should read the Linux Laptop home page at - <http://www.linux-on-laptops.com/> or - Tuxmobil - Linux on Mobile Computers at <http://www.tuxmobil.org/>. - - Note that the answer to this question doesn't directly affect the - kernel: saying N will just cause the configurator to skip all - the questions about this class of network devices. If you say Y, you - will be asked for your specific device in the following questions. - -endif # NET_ETHERNET - -# -# Gigabit Ethernet -# - -menuconfig NETDEV_1000 - bool "Ethernet (1000 Mbit)" - depends on !UML - default y - ---help--- - Ethernet (also called IEEE 802.3 or ISO 8802-2) is the most common - type of Local Area Network (LAN) in universities and companies. - - Say Y here to get to see options for Gigabit Ethernet drivers. - This option alone does not add any kernel code. - Note that drivers supporting both 100 and 1000 MBit may be listed - under "Ethernet (10 or 100MBit)" instead. - - If you say N, all options in this submenu will be skipped and disabled. - -if NETDEV_1000 - -endif # NETDEV_1000 - -# -# 10 Gigabit Ethernet -# - -menuconfig NETDEV_10000 - bool "Ethernet (10000 Mbit)" - depends on !UML - default y - ---help--- - Say Y here to get to see options for 10 Gigabit Ethernet drivers. - This option alone does not add any kernel code. - - If you say N, all options in this submenu will be skipped and disabled. - -if NETDEV_10000 - -config MDIO - tristate - -config SUNGEM_PHY - tristate - -endif # NETDEV_10000 - source "drivers/net/tokenring/Kconfig" source "drivers/net/wireless/Kconfig" diff --git a/drivers/net/Makefile b/drivers/net/Makefile index fcc62e603a2..9cb47bb3a81 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -13,9 +13,7 @@ obj-$(CONFIG_VMXNET3) += vmxnet3/ # link order important here # obj-$(CONFIG_PLIP) += plip.o - obj-$(CONFIG_ROADRUNNER) += rrunner.o - obj-$(CONFIG_SKFP) += skfp/ obj-$(CONFIG_RIONET) += rionet.o @@ -25,7 +23,6 @@ obj-$(CONFIG_RIONET) += rionet.o obj-$(CONFIG_NET) += Space.o loopback.o obj-$(CONFIG_NET_SB1000) += sb1000.o - obj-$(CONFIG_PPP) += ppp_generic.o obj-$(CONFIG_PPP_ASYNC) += ppp_async.o obj-$(CONFIG_PPP_SYNC_TTY) += ppp_synctty.o @@ -35,7 +32,6 @@ obj-$(CONFIG_PPP_MPPE) += ppp_mppe.o obj-$(CONFIG_PPPOE) += pppox.o pppoe.o obj-$(CONFIG_PPPOL2TP) += pppox.o obj-$(CONFIG_PPTP) += pppox.o pptp.o - obj-$(CONFIG_SLIP) += slip.o obj-$(CONFIG_SLHC) += slhc.o diff --git a/drivers/net/ethernet/Kconfig b/drivers/net/ethernet/Kconfig index 1f5a32dbe04..1f647471e65 100644 --- a/drivers/net/ethernet/Kconfig +++ b/drivers/net/ethernet/Kconfig @@ -11,6 +11,12 @@ menuconfig ETHERNET if ETHERNET +config MDIO + tristate + +config SUNGEM_PHY + tristate + source "drivers/net/ethernet/3com/Kconfig" source "drivers/net/ethernet/adaptec/Kconfig" source "drivers/net/ethernet/aeroflex/Kconfig" diff --git a/drivers/net/pci-skeleton.c b/drivers/net/pci-skeleton.c deleted file mode 100644 index c0f23376a46..00000000000 --- a/drivers/net/pci-skeleton.c +++ /dev/null @@ -1,1923 +0,0 @@ -/* - - drivers/net/pci-skeleton.c - - Maintained by Jeff Garzik <jgarzik@pobox.com> - - Original code came from 8139too.c, which in turns was based - originally on Donald Becker's rtl8139.c driver, versions 1.11 - and older. This driver was originally based on rtl8139.c - version 1.07. Header of rtl8139.c version 1.11: - - -----<snip>----- - - Written 1997-2000 by Donald Becker. - This software may be used and distributed according to the - terms of the GNU General Public License (GPL), incorporated - herein by reference. Drivers based on or derived from this - code fall under the GPL and must retain the authorship, - copyright and license notice. This file is not a complete - program and may only be used when the entire operating - system is licensed under the GPL. - - This driver is for boards based on the RTL8129 and RTL8139 - PCI ethernet chips. - - The author may be reached as becker@scyld.com, or C/O Scyld - Computing Corporation 410 Severn Ave., Suite 210 Annapolis - MD 21403 - - Support and updates available at - http://www.scyld.com/network/rtl8139.html - - Twister-tuning table provided by Kinston - <shangh@realtek.com.tw>. - - -----<snip>----- - - This software may be used and distributed according to the terms - of the GNU General Public License, incorporated herein by reference. - - ------------------------------------------------------------------------------ - - Theory of Operation - -I. Board Compatibility - -This device driver is designed for the RealTek RTL8139 series, the RealTek -Fast Ethernet controllers for PCI and CardBus. This chip is used on many -low-end boards, sometimes with its markings changed. - - -II. Board-specific settings - -PCI bus devices are configured by the system at boot time, so no jumpers -need to be set on the board. The system BIOS will assign the -PCI INTA signal to a (preferably otherwise unused) system IRQ line. - -III. Driver operation - -IIIa. Rx Ring buffers - -The receive unit uses a single linear ring buffer rather than the more -common (and more efficient) descriptor-based architecture. Incoming frames -are sequentially stored into the Rx region, and the host copies them into -skbuffs. - -Comment: While it is theoretically possible to process many frames in place, -any delay in Rx processing would cause us to drop frames. More importantly, -the Linux protocol stack is not designed to operate in this manner. - -IIIb. Tx operation - -The RTL8139 uses a fixed set of four Tx descriptors in register space. -In a stunningly bad design choice, Tx frames must be 32 bit aligned. Linux -aligns the IP header on word boundaries, and 14 byte ethernet header means -that almost all frames will need to be copied to an alignment buffer. - -IVb. References - -http://www.realtek.com.tw/ -http://www.scyld.com/expert/NWay.html - -IVc. Errata - -*/ - -#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/pci.h> -#include <linux/init.h> -#include <linux/ioport.h> -#include <linux/netdevice.h> -#include <linux/etherdevice.h> -#include <linux/delay.h> -#include <linux/ethtool.h> -#include <linux/mii.h> -#include <linux/crc32.h> -#include <linux/io.h> - -#define NETDRV_VERSION "1.0.1" -#define MODNAME "netdrv" -#define NETDRV_DRIVER_LOAD_MSG "MyVendor Fast Ethernet driver " NETDRV_VERSION " loaded" - -static char version[] __devinitdata = - KERN_INFO NETDRV_DRIVER_LOAD_MSG "\n" - " Support available from http://foo.com/bar/baz.html\n"; - -/* define to 1 to enable PIO instead of MMIO */ -#undef USE_IO_OPS - -/* define to 1 to enable copious debugging info */ -#undef NETDRV_DEBUG - -/* define to 1 to disable lightweight runtime debugging checks */ -#undef NETDRV_NDEBUG - - -#ifdef NETDRV_DEBUG -/* note: prints function name for you */ -#define DPRINTK(fmt, args...) \ - printk(KERN_DEBUG "%s: " fmt, __func__ , ## args) -#else -#define DPRINTK(fmt, args...) \ -do { \ - if (0) \ - printk(KERN_DEBUG fmt, ##args); \ -} while (0) -#endif - -#ifdef NETDRV_NDEBUG -#define assert(expr) do {} while (0) -#else -#define assert(expr) \ - if (!(expr)) { \ - printk("Assertion failed! %s,%s,%s,line=%d\n", \ - #expr, __FILE__, __func__, __LINE__); \ - } -#endif - - -/* A few user-configurable values. */ -/* media options */ -static int media[] = {-1, -1, -1, -1, -1, -1, -1, -1}; - -/* Maximum events (Rx packets, etc.) to handle at each interrupt. */ -static int max_interrupt_work = 20; - -/* Maximum number of multicast addresses to filter (vs. Rx-all-multicast). - The RTL chips use a 64 element hash table based on the Ethernet CRC. */ -static int multicast_filter_limit = 32; - -/* Size of the in-memory receive ring. */ -#define RX_BUF_LEN_IDX 2 /* 0==8K, 1==16K, 2==32K, 3==64K */ -#define RX_BUF_LEN (8192 << RX_BUF_LEN_IDX) -#define RX_BUF_PAD 16 -#define RX_BUF_WRAP_PAD 2048 /* spare padding to handle lack of packet wrap */ -#define RX_BUF_TOT_LEN (RX_BUF_LEN + RX_BUF_PAD + RX_BUF_WRAP_PAD) - -/* Number of Tx descriptor registers. */ -#define NUM_TX_DESC 4 - -/* max supported ethernet frame size -- must be at least (dev->mtu+14+4).*/ -#define MAX_ETH_FRAME_SIZE 1536 - -/* Size of the Tx bounce buffers -- must be at least (dev->mtu+14+4). */ -#define TX_BUF_SIZE MAX_ETH_FRAME_SIZE -#define TX_BUF_TOT_LEN (TX_BUF_SIZE * NUM_TX_DESC) - -/* PCI Tuning Parameters - Threshold is bytes transferred to chip before transmission starts. */ -#define TX_FIFO_THRESH 256 /* In bytes, rounded down to 32 byte units. */ - -/* The following settings are log_2(bytes)-4: - 0==16 bytes 1==32 2==64 3==128 4==256 5==512 6==1024 7==end of packet. -*/ -#define RX_FIFO_THRESH 6 /* Rx buffer level before first PCI xfer. */ -#define RX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ -#define TX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */ - - -/* Operational parameters that usually are not changed. */ -/* Time in jiffies before concluding the transmitter is hung. */ -#define TX_TIMEOUT (6 * HZ) - -enum { - HAS_CHIP_XCVR = 0x020000, - HAS_LNK_CHNG = 0x040000, -}; - -#define NETDRV_MIN_IO_SIZE 0x80 -#define RTL8139B_IO_SIZE 256 - -#define NETDRV_CAPS (HAS_CHIP_XCVR | HAS_LNK_CHNG) - -typedef enum { - RTL8139 = 0, - NETDRV_CB, - SMC1211TX, - /*MPX5030,*/ - DELTA8139, - ADDTRON8139, -} board_t; - - -/* indexed by board_t, above */ -static struct { - const char *name; -} board_info[] __devinitdata = { - { "RealTek RTL8139 Fast Ethernet" }, - { "RealTek RTL8139B PCI/CardBus" }, - { "SMC1211TX EZCard 10/100 (RealTek RTL8139)" }, -/* { MPX5030, "Accton MPX5030 (RealTek RTL8139)" },*/ - { "Delta Electronics 8139 10/100BaseTX" }, - { "Addtron Technology 8139 10/100BaseTX" }, -}; - - -static DEFINE_PCI_DEVICE_TABLE(netdrv_pci_tbl) = { - {0x10ec, 0x8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 }, - {0x10ec, 0x8138, PCI_ANY_ID, PCI_ANY_ID, 0, 0, NETDRV_CB }, - {0x1113, 0x1211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, SMC1211TX }, -/* {0x1113, 0x1211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, MPX5030 },*/ - {0x1500, 0x1360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DELTA8139 }, - {0x4033, 0x1360, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ADDTRON8139 }, - {0,} -}; -MODULE_DEVICE_TABLE(pci, netdrv_pci_tbl); - - -/* The rest of these values should never change. */ - -/* Symbolic offsets to registers. */ -enum NETDRV_registers { - MAC0 = 0, /* Ethernet hardware address. */ - MAR0 = 8, /* Multicast filter. */ - TxStatus0 = 0x10, /* Transmit status (Four 32bit registers). */ - TxAddr0 = 0x20, /* Tx descriptors (also four 32bit). */ - RxBuf = 0x30, - RxEarlyCnt = 0x34, - RxEarlyStatus = 0x36, - ChipCmd = 0x37, - RxBufPtr = 0x38, - RxBufAddr = 0x3A, - IntrMask = 0x3C, - IntrStatus = 0x3E, - TxConfig = 0x40, - ChipVersion = 0x43, - RxConfig = 0x44, - Timer = 0x48, /* A general-purpose counter. */ - RxMissed = 0x4C, /* 24 bits valid, write clears. */ - Cfg9346 = 0x50, - Config0 = 0x51, - Config1 = 0x52, - FlashReg = 0x54, - MediaStatus = 0x58, - Config3 = 0x59, - Config4 = 0x5A, /* absent on RTL-8139A */ - HltClk = 0x5B, - MultiIntr = 0x5C, - TxSummary = 0x60, - BasicModeCtrl = 0x62, - BasicModeStatus = 0x64, - NWayAdvert = 0x66, - NWayLPAR = 0x68, - NWayExpansion = 0x6A, - /* Undocumented registers, but required for proper operation. */ - FIFOTMS = 0x70, /* FIFO Control and test. */ - CSCR = 0x74, /* Chip Status and Configuration Register. */ - PARA78 = 0x78, - PARA7c = 0x7c, /* Magic transceiver parameter register. */ - Config5 = 0xD8, /* absent on RTL-8139A */ -}; - -enum ClearBitMasks { - MultiIntrClear = 0xF000, - ChipCmdClear = 0xE2, - Config1Clear = (1 << 7) | (1 << 6) | (1 << 3) | (1 << 2) | (1 << 1), -}; - -enum ChipCmdBits { - CmdReset = 0x10, - CmdRxEnb = 0x08, - CmdTxEnb = 0x04, - RxBufEmpty = 0x01, -}; - -/* Interrupt register bits, using my own meaningful names. */ -enum IntrStatusBits { - PCIErr = 0x8000, - PCSTimeout = 0x4000, - RxFIFOOver = 0x40, - RxUnderrun = 0x20, - RxOverflow = 0x10, - TxErr = 0x08, - TxOK = 0x04, - RxErr = 0x02, - RxOK = 0x01, -}; -enum TxStatusBits { - TxHostOwns = 0x2000, - TxUnderrun = 0x4000, - TxStatOK = 0x8000, - TxOutOfWindow = 0x20000000, - TxAborted = 0x40000000, - TxCarrierLost = 0x80000000, -}; -enum RxStatusBits { - RxMulticast = 0x8000, - RxPhysical = 0x4000, - RxBroadcast = 0x2000, - RxBadSymbol = 0x0020, - RxRunt = 0x0010, - RxTooLong = 0x0008, - RxCRCErr = 0x0004, - RxBadAlign = 0x0002, - RxStatusOK = 0x0001, -}; - -/* Bits in RxConfig. */ -enum rx_mode_bits { - AcceptErr = 0x20, - AcceptRunt = 0x10, - AcceptBroadcast = 0x08, - AcceptMulticast = 0x04, - AcceptMyPhys = 0x02, - AcceptAllPhys = 0x01, -}; - -/* Bits in TxConfig. */ -enum tx_config_bits { - TxIFG1 = (1 << 25), /* Interframe Gap Time */ - TxIFG0 = (1 << 24), /* Enabling these bits violates IEEE 802.3 */ - TxLoopBack = (1 << 18) | (1 << 17), /* enable loopback test mode */ - TxCRC = (1 << 16), /* DISABLE appending CRC to end of Tx packets */ - TxClearAbt = (1 << 0), /* Clear abort (WO) */ - TxDMAShift = 8, /* DMA burst value(0-7) is shift this many bits */ - - TxVersionMask = 0x7C800000, /* mask out version bits 30-26, 23 */ -}; - -/* Bits in Config1 */ -enum Config1Bits { - Cfg1_PM_Enable = 0x01, - Cfg1_VPD_Enable = 0x02, - Cfg1_PIO = 0x04, - Cfg1_MMIO = 0x08, - Cfg1_LWAKE = 0x10, - Cfg1_Driver_Load = 0x20, - Cfg1_LED0 = 0x40, - Cfg1_LED1 = 0x80, -}; - -enum RxConfigBits { - /* Early Rx threshold, none or X/16 */ - RxCfgEarlyRxNone = 0, - RxCfgEarlyRxShift = 24, - - /* rx fifo threshold */ - RxCfgFIFOShift = 13, - RxCfgFIFONone = (7 << RxCfgFIFOShift), - - /* Max DMA burst */ - RxCfgDMAShift = 8, - RxCfgDMAUnlimited = (7 << RxCfgDMAShift), - - /* rx ring buffer length */ - RxCfgRcv8K = 0, - RxCfgRcv16K = (1 << 11), - RxCfgRcv32K = (1 << 12), - RxCfgRcv64K = (1 << 11) | (1 << 12), - - /* Disable packet wrap at end of Rx buffer */ - RxNoWrap = (1 << 7), -}; - - -/* Twister tuning parameters from RealTek. - Completely undocumented, but required to tune bad links. */ -enum CSCRBits { - CSCR_LinkOKBit = 0x0400, - CSCR_LinkChangeBit = 0x0800, - CSCR_LinkStatusBits = 0x0f000, - CSCR_LinkDownOffCmd = 0x003c0, - CSCR_LinkDownCmd = 0x0f3c0, -}; - - -enum Cfg9346Bits { - Cfg9346_Lock = 0x00, - Cfg9346_Unlock = 0xC0, -}; - - -#define PARA78_default 0x78fa8388 -#define PARA7c_default 0xcb38de43 /* param[0][3] */ -#define PARA7c_xxx 0xcb38de43 -static const unsigned long param[4][4] = { - {0xcb39de43, 0xcb39ce43, 0xfb38de03, 0xcb38de43}, - {0xcb39de43, 0xcb39ce43, 0xcb39ce83, 0xcb39ce83}, - {0xcb39de43, 0xcb39ce43, 0xcb39ce83, 0xcb39ce83}, - {0xbb39de43, 0xbb39ce43, 0xbb39ce83, 0xbb39ce83} -}; - -struct ring_info { - struct sk_buff *skb; - dma_addr_t mapping; -}; - - -typedef enum { - CH_8139 = 0, - CH_8139_K, - CH_8139A, - CH_8139B, - CH_8130, - CH_8139C, -} chip_t; - - -/* directly indexed by chip_t, above */ -static const struct { - const char *name; - u8 version; /* from RTL8139C docs */ - u32 RxConfigMask; /* should clear the bits supported by this chip */ -} rtl_chip_info[] = { - { "RTL-8139", - 0x40, - 0xf0fe0040, /* XXX copied from RTL8139A, verify */ - }, - - { "RTL-8139 rev K", - 0x60, - 0xf0fe0040, - }, - - { "RTL-8139A", - 0x70, - 0xf0fe0040, - }, - - { "RTL-8139B", - 0x78, - 0xf0fc0040 - }, - - { "RTL-8130", - 0x7C, - 0xf0fe0040, /* XXX copied from RTL8139A, verify */ - }, - - { "RTL-8139C", - 0x74, - 0xf0fc0040, /* XXX copied from RTL8139B, verify */ - }, - -}; - - -struct netdrv_private { - board_t board; - void *mmio_addr; - int drv_flags; - struct pci_dev *pci_dev; - struct timer_list timer; /* Media selection timer. */ - unsigned char *rx_ring; - unsigned int cur_rx; /* Index into the Rx buffer of next Rx pkt. */ - unsigned int tx_flag; - atomic_t cur_tx; - atomic_t dirty_tx; - /* The saved address of a sent-in-place packet/buffer, for skfree(). */ - struct ring_info tx_info[NUM_TX_DESC]; - unsigned char *tx_buf[NUM_TX_DESC]; /* Tx bounce buffers */ - unsigned char *tx_bufs; /* Tx bounce buffer region. */ - dma_addr_t rx_ring_dma; - dma_addr_t tx_bufs_dma; - char phys[4]; /* MII device addresses. */ - char twistie, twist_row, twist_col; /* Twister tune state. */ - unsigned int full_duplex:1; /* Full-duplex operation requested. */ - unsigned int duplex_lock:1; - unsigned int default_port:4; /* Last dev->if_port value. */ - unsigned int media2:4; /* Secondary monitored media port. */ - unsigned int medialock:1; /* Don't sense media type. */ - unsigned int mediasense:1; /* Media sensing in progress. */ - spinlock_t lock; - chip_t chipset; -}; - -MODULE_AUTHOR("Jeff Garzik <jgarzik@pobox.com>"); -MODULE_DESCRIPTION("Skeleton for a PCI Fast Ethernet driver"); -MODULE_LICENSE("GPL"); -module_param(multicast_filter_limit, int, 0); -module_param(max_interrupt_work, int, 0); -module_param_array(media, int, NULL, 0); -MODULE_PARM_DESC(multicast_filter_limit, - MODNAME " maximum number of filtered multicast addresses"); -MODULE_PARM_DESC(max_interrupt_work, - MODNAME " maximum events handled per interrupt"); -MODULE_PARM_DESC(media, - MODNAME " Bits 0-3: media type, bit 17: full duplex"); - -static int read_eeprom(void *ioaddr, int location, int addr_len); -static int netdrv_open(struct net_device *dev); -static int mdio_read(struct net_device *dev, int phy_id, int location); -static void mdio_write(struct net_device *dev, int phy_id, int location, - int val); -static void netdrv_timer(unsigned long data); -static void netdrv_tx_timeout(struct net_device *dev); -static void netdrv_init_ring(struct net_device *dev); -static int netdrv_start_xmit(struct sk_buff *skb, - struct net_device *dev); -static irqreturn_t netdrv_interrupt(int irq, void *dev_instance); -static int netdrv_close(struct net_device *dev); -static int netdrv_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); -static void netdrv_set_rx_mode(struct net_device *dev); -static void netdrv_hw_start(struct net_device *dev); - - -#ifdef USE_IO_OPS - -#define NETDRV_R8(reg) inb(((unsigned long)ioaddr) + (reg)) -#define NETDRV_R16(reg) inw(((unsigned long)ioaddr) + (reg)) -#define NETDRV_R32(reg) ((unsigned long)inl(((unsigned long)ioaddr) + (reg))) -#define NETDRV_W8(reg, val8) outb((val8), ((unsigned long)ioaddr) + (reg)) -#define NETDRV_W16(reg, val16) outw((val16), ((unsigned long)ioaddr) + (reg)) -#define NETDRV_W32(reg, val32) outl((val32), ((unsigned long)ioaddr) + (reg)) -#define NETDRV_W8_F NETDRV_W8 -#define NETDRV_W16_F NETDRV_W16 -#define NETDRV_W32_F NETDRV_W32 -#undef readb -#undef readw -#undef readl -#undef writeb -#undef writew -#undef writel -#define readb(addr) inb((unsigned long)(addr)) -#define readw(addr) inw((unsigned long)(addr)) -#define readl(addr) inl((unsigned long)(addr)) -#define writeb(val, addr) outb((val), (unsigned long)(addr)) -#define writew(val, addr) outw((val), (unsigned long)(addr)) -#define writel(val, addr) outl((val), (unsigned long)(addr)) - -#else - -/* write MMIO register, with flush */ -/* Flush avoids rtl8139 bug w/ posted MMIO writes */ -#define NETDRV_W8_F(reg, val8) \ -do { \ - writeb((val8), ioaddr + (reg)); \ - readb(ioaddr + (reg)); \ -} while (0) -#define NETDRV_W16_F(reg, val16) \ -do { \ - writew((val16), ioaddr + (reg)); \ - readw(ioaddr + (reg)); \ -} while (0) -#define NETDRV_W32_F(reg, val32) \ -do { \ - writel((val32), ioaddr + (reg)); \ - readl(ioaddr + (reg)); \ -} while (0) - - -#ifdef MMIO_FLUSH_AUDIT_COMPLETE - -/* write MMIO register */ -#define NETDRV_W8(reg, val8) writeb((val8), ioaddr + (reg)) -#define NETDRV_W16(reg, val16) writew((val16), ioaddr + (reg)) -#define NETDRV_W32(reg, val32) writel((val32), ioaddr + (reg)) - -#else - -/* write MMIO register, then flush */ -#define NETDRV_W8 NETDRV_W8_F -#define NETDRV_W16 NETDRV_W16_F -#define NETDRV_W32 NETDRV_W32_F - -#endif /* MMIO_FLUSH_AUDIT_COMPLETE */ - -/* read MMIO register */ -#define NETDRV_R8(reg) readb(ioaddr + (reg)) -#define NETDRV_R16(reg) readw(ioaddr + (reg)) -#define NETDRV_R32(reg) ((unsigned long) readl(ioaddr + (reg))) - -#endif /* USE_IO_OPS */ - - -static const u16 netdrv_intr_mask = - PCIErr | PCSTimeout | RxUnderrun | RxOverflow | RxFIFOOver | - TxErr | TxOK | RxErr | RxOK; - -static const unsigned int netdrv_rx_config = - RxCfgEarlyRxNone | RxCfgRcv32K | RxNoWrap | - (RX_FIFO_THRESH << RxCfgFIFOShift) | - (RX_DMA_BURST << RxCfgDMAShift); - - -static int __devinit netdrv_init_board(struct pci_dev *pdev, - struct net_device **dev_out, - void **ioaddr_out) -{ - void *ioaddr = NULL; - struct net_device *dev; - struct netdrv_private *tp; - int rc, i; - u32 pio_start, pio_end, pio_flags, pio_len; - unsigned long mmio_start, mmio_end, mmio_flags, mmio_len; - u32 tmp; - - DPRINTK("ENTER\n"); - - assert(pdev != NULL); - assert(ioaddr_out != NULL); - - *ioaddr_out = NULL; - *dev_out = NULL; - - /* dev zeroed in alloc_etherdev */ - dev = alloc_etherdev(sizeof(*tp)); - if (dev == NULL) { - dev_err(&pdev->dev, "unable to alloc new ethernet\n"); - DPRINTK("EXIT, returning -ENOMEM\n"); - return -ENOMEM; - } - SET_NETDEV_DEV(dev, &pdev->dev); - tp = netdev_priv(dev); - - /* enable device(incl. PCI PM wakeup), and bus-mastering */ - rc = pci_enable_device(pdev); - if (rc) - goto err_out; - - pio_start = pci_resource_start(pdev, 0); - pio_end = pci_resource_end(pdev, 0); - pio_flags = pci_resource_flags(pdev, 0); - pio_len = pci_resource_len(pdev, 0); - - mmio_start = pci_resource_start(pdev, 1); - mmio_end = pci_resource_end(pdev, 1); - mmio_flags = pci_resource_flags(pdev, 1); - mmio_len = pci_resource_len(pdev, 1); - - /* set this immediately, we need to know before - * we talk to the chip directly */ - DPRINTK("PIO region size == %#02X\n", pio_len); - DPRINTK("MMIO region size == %#02lX\n", mmio_len); - - /* make sure PCI base addr 0 is PIO */ - if (!(pio_flags & IORESOURCE_IO)) { - dev_err(&pdev->dev, "region #0 not a PIO resource, aborting\n"); - rc = -ENODEV; - goto err_out; - } - - /* make sure PCI base addr 1 is MMIO */ - if (!(mmio_flags & IORESOURCE_MEM)) { - dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n"); - rc = -ENODEV; - goto err_out; - } - - /* check for weird/broken PCI region reporting */ - if ((pio_len < NETDRV_MIN_IO_SIZE) || - (mmio_len < NETDRV_MIN_IO_SIZE)) { - dev_err(&pdev->dev, "Invalid PCI region size(s), aborting\n"); - rc = -ENODEV; - goto err_out; - } - - rc = pci_request_regions(pdev, MODNAME); - if (rc) - goto err_out; - - pci_set_master(pdev); - -#ifdef USE_IO_OPS - ioaddr = (void *)pio_start; -#else - /* ioremap MMIO region */ - ioaddr = ioremap(mmio_start, mmio_len); - if (ioaddr == NULL) { - dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); - rc = -EIO; - goto err_out_free_res; - } -#endif /* USE_IO_OPS */ - - /* Soft reset the chip. */ - NETDRV_W8(ChipCmd, (NETDRV_R8(ChipCmd) & ChipCmdClear) | CmdReset); - - /* Check that the chip has finished the reset. */ - for (i = 1000; i > 0; i--) - if ((NETDRV_R8(ChipCmd) & CmdReset) == 0) - break; - else - udelay(10); - - /* Bring the chip out of low-power mode. */ - /* <insert device-specific code here> */ - -#ifndef USE_IO_OPS - /* sanity checks -- ensure PIO and MMIO registers agree */ - assert(inb(pio_start+Config0) == readb(ioaddr+Config0)); - assert(inb(pio_start+Config1) == readb(ioaddr+Config1)); - assert(inb(pio_start+TxConfig) == readb(ioaddr+TxConfig)); - assert(inb(pio_start+RxConfig) == readb(ioaddr+RxConfig)); -#endif /* !USE_IO_OPS */ - - /* identify chip attached to board */ - tmp = NETDRV_R8(ChipVersion); - for (i = ARRAY_SIZE(rtl_chip_info) - 1; i >= 0; i--) - if (tmp == rtl_chip_info[i].version) { - tp->chipset = i; - goto match; - } - - /* if unknown chip, assume array element #0, original RTL-8139 in this case */ - dev_printk(KERN_DEBUG, &pdev->dev, - "unknown chip version, assuming RTL-8139\n"); - dev_printk(KERN_DEBUG, &pdev->dev, "TxConfig = %#lx\n", - NETDRV_R32(TxConfig)); - tp->chipset = 0; - -match: - DPRINTK("chipset id(%d) == index %d, '%s'\n", - tmp, tp->chipset, rtl_chip_info[tp->chipset].name); - - rc = register_netdev(dev); - if (rc) - goto err_out_unmap; - - DPRINTK("EXIT, returning 0\n"); - *ioaddr_out = ioaddr; - *dev_out = dev; - return 0; - -err_out_unmap: -#ifndef USE_IO_OPS - iounmap(ioaddr); -err_out_free_res: -#endif - pci_release_regions(pdev); -err_out: - free_netdev(dev); - DPRINTK("EXIT, returning %d\n", rc); - return rc; -} - -static const struct net_device_ops netdrv_netdev_ops = { - .ndo_open = netdrv_open, - .ndo_stop = netdrv_close, - .ndo_start_xmit = netdrv_start_xmit, - .ndo_set_multicast_list = netdrv_set_rx_mode, - .ndo_do_ioctl = netdrv_ioctl, - .ndo_tx_timeout = netdrv_tx_timeout, - .ndo_change_mtu = eth_change_mtu, - .ndo_validate_addr = eth_validate_addr, - .ndo_set_mac_address = eth_mac_addr, -}; - -static int __devinit netdrv_init_one(struct pci_dev *pdev, - const struct pci_device_id *ent) -{ - struct net_device *dev = NULL; - struct netdrv_private *tp; - int i, addr_len, option; - void *ioaddr = NULL; - static int board_idx = -1; - -/* when built into the kernel, we only print version if device is found */ -#ifndef MODULE - static int printed_version; - if (!printed_version++) - printk(version); -#endif - - DPRINTK("ENTER\n"); - - assert(pdev != NULL); - assert(ent != NULL); - - board_idx++; - - i = netdrv_init_board(pdev, &dev, &ioaddr); - if (i < 0) { - DPRINTK("EXIT, returning %d\n", i); - return i; - } - - tp = netdev_priv(dev); - - assert(ioaddr != NULL); - assert(dev != NULL); - assert(tp != NULL); - - addr_len = read_eeprom(ioaddr, 0, 8) == 0x8129 ? 8 : 6; - for (i = 0; i < 3; i++) - ((u16 *)(dev->dev_addr))[i] = - le16_to_cpu(read_eeprom(ioaddr, i + 7, addr_len)); - - dev->netdev_ops = &netdrv_netdev_ops; - dev->watchdog_timeo = TX_TIMEOUT; - - dev->irq = pdev->irq; - dev->base_addr = (unsigned long) ioaddr; - - /* netdev_priv()/tp zeroed and aligned in alloc_etherdev */ - tp = netdev_priv(dev); - - /* note: tp->chipset set in netdrv_init_board */ - tp->drv_flags = PCI_COMMAND_IO | PCI_COMMAND_MEMORY | - PCI_COMMAND_MASTER | NETDRV_CAPS; - tp->pci_dev = pdev; - tp->board = ent->driver_data; - tp->mmio_addr = ioaddr; - spin_lock_init(&tp->lock); - - pci_set_drvdata(pdev, dev); - - tp->phys[0] = 32; - - netdev_info(dev, "%s at %#lx, %pM IRQ %d\n", - board_info[ent->driver_data].name, - dev->base_addr, dev->dev_addr, dev->irq); - - netdev_printk(KERN_DEBUG, dev, "Identified 8139 chip type '%s'\n", - rtl_chip_info[tp->chipset].name); - - /* Put the chip into low-power mode. */ - NETDRV_W8_F(Cfg9346, Cfg9346_Unlock); - - /* The lower four bits are the media type. */ - option = (board_idx > 7) ? 0 : media[board_idx]; - if (option > 0) { - tp->full_duplex = (option & 0x200) ? 1 : 0; - tp->default_port = option & 15; - if (tp->default_port) - tp->medialock = 1; - } - - if (tp->full_duplex) { - netdev_info(dev, "Media type forced to Full Duplex\n"); - mdio_write(dev, tp->phys[0], MII_ADVERTISE, ADVERTISE_FULL); - tp->duplex_lock = 1; - } - - DPRINTK("EXIT - returning 0\n"); - return 0; -} - - -static void __devexit netdrv_remove_one(struct pci_dev *pdev) -{ - struct net_device *dev = pci_get_drvdata(pdev); - struct netdrv_private *np; - - DPRINTK("ENTER\n"); - - assert(dev != NULL); - - np = netdev_priv(dev); - assert(np != NULL); - - unregister_netdev(dev); - -#ifndef USE_IO_OPS - iounmap(np->mmio_addr); -#endif /* !USE_IO_OPS */ - - pci_release_regions(pdev); - - free_netdev(dev); - - pci_set_drvdata(pdev, NULL); - - pci_disable_device(pdev); - - DPRINTK("EXIT\n"); -} - - -/* Serial EEPROM section. */ - -/* EEPROM_Ctrl bits. */ -#define EE_SHIFT_CLK 0x04 /* EEPROM shift clock. */ -#define EE_CS 0x08 /* EEPROM chip select. */ -#define EE_DATA_WRITE 0x02 /* EEPROM chip data in. */ -#define EE_WRITE_0 0x00 -#define EE_WRITE_1 0x02 -#define EE_DATA_READ 0x01 /* EEPROM chip data out. */ -#define EE_ENB (0x80 | EE_CS) - -/* Delay between EEPROM clock transitions. - No extra delay is needed with 33Mhz PCI, but 66Mhz may change this. -*/ - -#define eeprom_delay() readl(ee_addr) - -/* The EEPROM commands include the alway-set leading bit. */ -#define EE_WRITE_CMD (5) -#define EE_READ_CMD (6) -#define EE_ERASE_CMD (7) - -static int __devinit read_eeprom(void *ioaddr, int location, int addr_len) -{ - int i; - unsigned retval = 0; - void *ee_addr = ioaddr + Cfg9346; - int read_cmd = location | (EE_READ_CMD << addr_len); - - DPRINTK("ENTER\n"); - - writeb(EE_ENB & ~EE_CS, ee_addr); - writeb(EE_ENB, ee_addr); - eeprom_delay(); - - /* Shift the read command bits out. */ - for (i = 4 + addr_len; i >= 0; i--) { - int dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0; - writeb(EE_ENB | dataval, ee_addr); - eeprom_delay(); - writeb(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr); - eeprom_delay(); - } - writeb(EE_ENB, ee_addr); - eeprom_delay(); - - for (i = 16; i > 0; i--) { - writeb(EE_ENB | EE_SHIFT_CLK, ee_addr); - eeprom_delay(); |