Home | History | Annotate | Download | only in net
      1 FILE_LICENCE ( GPL_ANY );
      2 
      3 #define NATSEMI_HW_TIMEOUT 400
      4 
      5 #define TX_RING_SIZE 4
      6 #define NUM_RX_DESC  4
      7 #define RX_BUF_SIZE 1536
      8 #define OWN       0x80000000
      9 #define DSIZE     0x00000FFF
     10 #define CRC_SIZE  4
     11 
     12 struct natsemi_tx {
     13 	uint32_t link;
     14 	uint32_t cmdsts;
     15 	uint32_t bufptr;
     16 };
     17 
     18 struct natsemi_rx {
     19 	uint32_t link;
     20 	uint32_t cmdsts;
     21 	uint32_t bufptr;
     22 };
     23 
     24 struct natsemi_private {
     25 	unsigned short ioaddr;
     26 	unsigned short tx_cur;
     27 	unsigned short tx_dirty;
     28 	unsigned short rx_cur;
     29 	struct natsemi_tx tx[TX_RING_SIZE];
     30 	struct natsemi_rx rx[NUM_RX_DESC];
     31 
     32 	/* need to add iobuf as we cannot free iobuf->data in close without this
     33 	 * alternatively substracting sizeof(head) and sizeof(list_head) can also
     34 	 * give the same.
     35 	 */
     36 	struct io_buffer *iobuf[NUM_RX_DESC];
     37 
     38 	/* netdev_tx_complete needs pointer to the iobuf of the data so as to free
     39 	 * it from the memory.
     40 	 */
     41 	struct io_buffer *tx_iobuf[TX_RING_SIZE];
     42 	struct spi_bit_basher spibit;
     43 	struct spi_device eeprom;
     44 	struct nvo_block nvo;
     45 };
     46 
     47 /*
     48  * Support for fibre connections on Am79C874:
     49  * This phy needs a special setup when connected to a fibre cable.
     50  * http://www.amd.com/files/connectivitysolutions/networking/archivednetworking/22235.pdf
     51  */
     52 #define PHYID_AM79C874	0x0022561b
     53 
     54 enum {
     55 	MII_MCTRL	= 0x15,		/* mode control register */
     56 	MII_FX_SEL	= 0x0001,	/* 100BASE-FX (fiber) */
     57 	MII_EN_SCRM	= 0x0004,	/* enable scrambler (tp) */
     58 };
     59 
     60 
     61 
     62 /* values we might find in the silicon revision register */
     63 #define SRR_DP83815_C	0x0302
     64 #define SRR_DP83815_D	0x0403
     65 #define SRR_DP83816_A4	0x0504
     66 #define SRR_DP83816_A5	0x0505
     67 
     68 /* NATSEMI: Offsets to the device registers.
     69  * Unlike software-only systems, device drivers interact with complex hardware.
     70  * It's not useful to define symbolic names for every register bit in the
     71  * device.
     72  */
     73 enum register_offsets {
     74     ChipCmd      = 0x00,
     75     ChipConfig   = 0x04,
     76     EECtrl       = 0x08,
     77     PCIBusCfg    = 0x0C,
     78     IntrStatus   = 0x10,
     79     IntrMask     = 0x14,
     80     IntrEnable   = 0x18,
     81     TxRingPtr    = 0x20,
     82     TxConfig     = 0x24,
     83     RxRingPtr    = 0x30,
     84     RxConfig     = 0x34,
     85     ClkRun       = 0x3C,
     86     WOLCmd       = 0x40,
     87     PauseCmd     = 0x44,
     88     RxFilterAddr = 0x48,
     89     RxFilterData = 0x4C,
     90     BootRomAddr  = 0x50,
     91     BootRomData  = 0x54,
     92     SiliconRev   = 0x58,
     93     StatsCtrl    = 0x5C,
     94     StatsData    = 0x60,
     95     RxPktErrs    = 0x60,
     96     RxMissed     = 0x68,
     97     RxCRCErrs    = 0x64,
     98     PCIPM        = 0x44,
     99     PhyStatus    = 0xC0,
    100     MIntrCtrl    = 0xC4,
    101     MIntrStatus  = 0xC8,
    102 
    103     /* These are from the spec, around page 78... on a separate table.
    104      */
    105     PGSEL        = 0xCC,
    106     PMDCSR       = 0xE4,
    107     TSTDAT       = 0xFC,
    108     DSPCFG       = 0xF4,
    109     SDCFG        = 0x8C,
    110     BasicControl = 0x80,
    111     BasicStatus  = 0x84
    112 
    113 };
    114 
    115 /* the values for the 'magic' registers above (PGSEL=1) */
    116 #define PMDCSR_VAL	0x189c	/* enable preferred adaptation circuitry */
    117 #define TSTDAT_VAL	0x0
    118 #define DSPCFG_VAL	0x5040
    119 #define SDCFG_VAL	0x008c	/* set voltage thresholds for Signal Detect */
    120 #define DSPCFG_LOCK	0x20	/* coefficient lock bit in DSPCFG */
    121 #define DSPCFG_COEF	0x1000	/* see coefficient (in TSTDAT) bit in DSPCFG */
    122 #define TSTDAT_FIXED	0xe8	/* magic number for bad coefficients */
    123 
    124 /* Bit in ChipCmd.
    125  */
    126 enum ChipCmdBits {
    127     ChipReset = 0x100,
    128     RxReset   = 0x20,
    129     TxReset   = 0x10,
    130     RxOff     = 0x08,
    131     RxOn      = 0x04,
    132     TxOff     = 0x02,
    133     TxOn      = 0x01
    134 };
    135 
    136 enum ChipConfig_bits {
    137 	CfgPhyDis		= 0x200,
    138 	CfgPhyRst		= 0x400,
    139 	CfgExtPhy		= 0x1000,
    140 	CfgAnegEnable		= 0x2000,
    141 	CfgAneg100		= 0x4000,
    142 	CfgAnegFull		= 0x8000,
    143 	CfgAnegDone		= 0x8000000,
    144 	CfgFullDuplex		= 0x20000000,
    145 	CfgSpeed100		= 0x40000000,
    146 	CfgLink			= 0x80000000,
    147 };
    148 
    149 
    150 /* Bits in the RxMode register.
    151  */
    152 enum rx_mode_bits {
    153     AcceptErr          = 0x20,
    154     AcceptRunt         = 0x10,
    155     AcceptBroadcast    = 0xC0000000,
    156     AcceptMulticast    = 0x00200000,
    157     AcceptAllMulticast = 0x20000000,
    158     AcceptAllPhys      = 0x10000000,
    159     AcceptMyPhys       = 0x08000000,
    160     RxFilterEnable     = 0x80000000
    161 };
    162 
    163 /* Bits in network_desc.status
    164  */
    165 enum desc_status_bits {
    166     DescOwn   = 0x80000000,
    167     DescMore  = 0x40000000,
    168     DescIntr  = 0x20000000,
    169     DescNoCRC = 0x10000000,
    170     DescPktOK = 0x08000000,
    171     RxTooLong = 0x00400000
    172 };
    173 
    174 /*Bits in Interrupt Mask register
    175  */
    176 enum Intr_mask_register_bits {
    177     RxOk       = 0x001,
    178     RxErr      = 0x004,
    179     TxOk       = 0x040,
    180     TxErr      = 0x100
    181 };
    182 
    183 enum MIntrCtrl_bits {
    184   MICRIntEn               = 0x2,
    185 };
    186 
    187 /* CFG bits [13:16] [18:23] */
    188 #define CFG_RESET_SAVE 0xfde000
    189 /* WCSR bits [0:4] [9:10] */
    190 #define WCSR_RESET_SAVE 0x61f
    191 /* RFCR bits [20] [22] [27:31] */
    192 #define RFCR_RESET_SAVE 0xf8500000;
    193 
    194 /* Delay between EEPROM clock transitions.
    195    No extra delay is needed with 33Mhz PCI, but future 66Mhz access may need
    196    a delay. */
    197 #define eeprom_delay(ee_addr)   inl(ee_addr)
    198 
    199 enum EEPROM_Ctrl_Bits {
    200 	EE_ShiftClk   = 0x04,
    201 	EE_DataIn     = 0x01,
    202 	EE_ChipSelect = 0x08,
    203 	EE_DataOut    = 0x02
    204 };
    205 
    206 #define EE_Write0 (EE_ChipSelect)
    207 #define EE_Write1 (EE_ChipSelect | EE_DataIn)
    208 
    209 /* The EEPROM commands include the alway-set leading bit. */
    210 enum EEPROM_Cmds {
    211   EE_WriteCmd=(5 << 6), EE_ReadCmd=(6 << 6), EE_EraseCmd=(7 << 6),
    212 };
    213 
    214 /*  EEPROM access , values are devices specific
    215  */
    216 #define EE_CS		0x08	/* EEPROM chip select */
    217 #define EE_SK		0x04	/* EEPROM shift clock */
    218 #define EE_DI		0x01	/* Data in */
    219 #define EE_DO		0x02	/* Data out */
    220 
    221 /* Offsets within EEPROM (these are word offsets)
    222  */
    223 #define EE_MAC 7
    224 #define EE_REG  EECtrl
    225 
    226 static const uint8_t natsemi_ee_bits[] = {
    227 	[SPI_BIT_SCLK]	= EE_SK,
    228 	[SPI_BIT_MOSI]	= EE_DI,
    229 	[SPI_BIT_MISO]	= EE_DO,
    230 	[SPI_BIT_SS(0)]	= EE_CS,
    231 };
    232 
    233