| /* |
| * Copyright (c) 2010 Andrei Faur <da3drus@gmail.com> |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License as |
| * published by the Free Software Foundation; either version 2 of the |
| * License, or any later version. |
| * |
| * This program is distributed in the hope that it will be useful, but |
| * WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
| * 02110-1301, USA. |
| * |
| */ |
| |
| FILE_LICENCE ( GPL2_OR_LATER ); |
| |
| #ifndef _PCNET32_H_ |
| #define _PCNET32_H_ |
| |
| /* |
| * Set the number of Tx and Rx buffers, using Log_2(# buffers). |
| * Set default values to 16 Tx buffers and 32 Rx buffers. |
| */ |
| #define PCNET32_LOG_TX_BUFFERS 4 |
| #define PCNET32_LOG_RX_BUFFERS 5 |
| |
| /* Maximum number of descriptor rings is 512 */ |
| #define PCNET32_LOG_MAX_TX_BUFFERS 9 |
| #define PCNET32_LOG_MAX_RX_BUFFERS 9 |
| |
| #define TX_RING_SIZE ( 1 << ( PCNET32_LOG_TX_BUFFERS ) ) |
| #define TX_MAX_RING_SIZE ( 1 << ( PCNET32_LOG_MAX_TX_BUFFERS ) ) |
| |
| #define RX_RING_SIZE ( 1 << ( PCNET32_LOG_RX_BUFFERS ) ) |
| #define RX_MAX_RING_SIZE ( 1 << ( PCNET32_LOG_MAX_RX_BUFFERS ) ) |
| |
| #define RX_RING_BYTES ( RX_RING_SIZE * sizeof(struct pcnet32_rx_desc ) ) |
| #define TX_RING_BYTES ( TX_RING_SIZE * sizeof(struct pcnet32_tx_desc ) ) |
| |
| #define PKT_BUF_SIZE 1536 |
| |
| #define RX_RING_ALIGN 16 |
| #define TX_RING_ALIGN 16 |
| |
| #define INIT_BLOCK_ALIGN 32 |
| |
| #define PCNET32_WIO_RDP 0x10 |
| #define PCNET32_WIO_RAP 0x12 |
| #define PCNET32_WIO_RESET 0x14 |
| #define PCNET32_WIO_BDP 0x16 |
| |
| #define PCNET32_DWIO_RDP 0x10 |
| #define PCNET32_DWIO_RAP 0x14 |
| #define PCNET32_DWIO_RESET 0x18 |
| #define PCNET32_DWIO_BDP 0x1C |
| |
| #define PCNET32_PORT_AUI 0x00 |
| #define PCNET32_PORT_10BT 0x01 |
| #define PCNET32_PORT_GPSI 0x02 |
| #define PCNET32_PORT_MII 0x03 |
| |
| #define PCNET32_PORT_PORTSEL 0x03 |
| #define PCNET32_PORT_ASEL 0x04 |
| #define PCNET32_PORT_100 0x40 |
| #define PCNET32_PORT_FD 0x80 |
| |
| #define PCNET32_SWSTYLE_LANCE 0x00 |
| #define PCNET32_SWSTYLE_ILACC 0x01 |
| #define PCNET32_SWSTYLE_PCNET32 0x02 |
| |
| #define PCNET32_MAX_PHYS 32 |
| |
| #ifndef PCI_VENDOR_ID_AT |
| #define PCI_VENDOR_ID_AT 0x1259 |
| #endif |
| |
| #ifndef PCI_SUBDEVICE_ID_AT_2700FX |
| #define PCI_SUBDEVICE_ID_AT_2700FX 0x2701 |
| #endif |
| |
| #ifndef PCI_SUBDEVICE_ID_AT_2701FX |
| #define PCI_SUBDEVICE_ID_AT_2701FX 0x2703 |
| #endif |
| |
| struct pcnet32_rx_desc { |
| u32 base; |
| s16 buf_length; |
| s16 status; |
| u32 msg_length; |
| u32 reserved; |
| }; |
| |
| struct pcnet32_tx_desc { |
| u32 base; |
| s16 length; |
| s16 status; |
| u32 misc; |
| u32 reserved; |
| }; |
| |
| struct pcnet32_init_block { |
| u16 mode; |
| u16 tlen_rlen; |
| u8 phys_addr[6]; |
| u16 reserved; |
| u32 filter[2]; |
| u32 rx_ring; |
| u32 tx_ring; |
| }; |
| |
| struct pcnet32_access { |
| u16 ( *read_csr ) ( unsigned long, int ); |
| void ( *write_csr ) ( unsigned long, int, u16 ); |
| u16 ( *read_bcr ) ( unsigned long, int ); |
| void ( *write_bcr ) ( unsigned long, int, u16 ); |
| u16 ( *read_rap ) ( unsigned long ); |
| void ( *write_rap ) ( unsigned long, u16 ); |
| void ( *reset ) ( unsigned long ); |
| }; |
| |
| struct pcnet32_private { |
| struct pcnet32_init_block init_block __attribute__((aligned(32))); |
| struct pci_device *pci_dev; |
| struct net_device *netdev; |
| |
| struct io_buffer *rx_iobuf[RX_RING_SIZE]; |
| struct io_buffer *tx_iobuf[TX_RING_SIZE]; |
| |
| struct pcnet32_rx_desc *rx_base; |
| struct pcnet32_tx_desc *tx_base; |
| uint32_t rx_curr; |
| uint32_t tx_curr; |
| uint32_t tx_tail; |
| uint32_t tx_fill_ctr; |
| |
| struct pcnet32_access *a; |
| int options; |
| unsigned int mii:1, |
| full_duplex:1; |
| |
| unsigned short chip_version; |
| |
| char irq_enabled; |
| }; |
| |
| enum pcnet32_desc_status_bit { |
| DescOwn = (1 << 15), |
| StartOfPacket = (1 << 9), |
| EndOfPacket = (1 << 8) |
| }; |
| |
| enum pcnet32_register_content { |
| /* CSR0 bits - Controller status register */ |
| RxInt = (1 << 10), |
| TxInt = (1 << 9), |
| InitDone = (1 << 8), |
| IntFlag = (1 << 7), |
| IntEnable = (1 << 6), |
| TxDemand = (1 << 3), |
| Stop = (1 << 2), |
| Strt = (1 << 1), |
| Init = (1 << 0), |
| |
| /* CSR3 bits - Controller status register */ |
| BablMask = (1 << 14), |
| MissFrameMask = (1 << 12), |
| MemErrMask = (1 << 11), |
| RxIntMask = (1 << 10), |
| TxIntMask = (1 << 9), |
| InitDoneMask = (1 << 8) |
| |
| }; |
| |
| #endif /* _PCNET32_H_ */ |