summaryrefslogtreecommitdiffstats
path: root/target/linux/atheros/files/drivers/net/ar2313/ar2313.h
blob: 00d35b20fa5ace46ae9f17c1a298fb2740716166 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#ifndef _AR2313_H_
#define _AR2313_H_

#include <linux/autoconf.h>
#include <asm/bootinfo.h>
#include <ar531x_platform.h>

/*
 * probe link timer - 5 secs
 */
#define LINK_TIMER    (5*HZ)

#define IS_DMA_TX_INT(X)   (((X) & (DMA_STATUS_TI)) != 0)
#define IS_DMA_RX_INT(X)   (((X) & (DMA_STATUS_RI)) != 0)
#define IS_DRIVER_OWNED(X) (((X) & (DMA_TX_OWN))    == 0)

#define AR2313_TX_TIMEOUT (HZ/4)

/*
 * Rings
 */
#define DSC_RING_ENTRIES_SIZE	(AR2313_DESCR_ENTRIES * sizeof(struct desc))
#define DSC_NEXT(idx)	        ((idx + 1) & (AR2313_DESCR_ENTRIES - 1))

static inline int tx_space(u32 csm, u32 prd)
{
	return (csm - prd - 1) & (AR2313_DESCR_ENTRIES - 1);
}

#if MAX_SKB_FRAGS
#define TX_RESERVED	(MAX_SKB_FRAGS+1)	/* +1 for message header */
#define tx_ring_full(csm, prd)	(tx_space(csm, prd) <= TX_RESERVED)
#else
#define tx_ring_full		0
#endif

#define AR2313_MBGET		2
#define AR2313_MBSET    	3
#define AR2313_PCI_RECONFIG	4
#define AR2313_PCI_DUMP  	5
#define AR2313_TEST_PANIC	6
#define AR2313_TEST_NULLPTR	7
#define AR2313_READ_DATA	8
#define AR2313_WRITE_DATA	9
#define AR2313_GET_VERSION	10
#define AR2313_TEST_HANG	11
#define AR2313_SYNC		12


//
// New Combo structure for Both Eth0 AND eth1
//
typedef struct {
	volatile unsigned int mac_control;	/* 0x00 */
	volatile unsigned int mac_addr[2];	/* 0x04 - 0x08 */
	volatile unsigned int mcast_table[2];	/* 0x0c - 0x10 */
	volatile unsigned int mii_addr;	/* 0x14 */
	volatile unsigned int mii_data;	/* 0x18 */
	volatile unsigned int flow_control;	/* 0x1c */
	volatile unsigned int vlan_tag;	/* 0x20 */
	volatile unsigned int pad[7];	/* 0x24 - 0x3c */
	volatile unsigned int ucast_table[8];	/* 0x40-0x5c */

} ETHERNET_STRUCT;

/********************************************************************
 * Interrupt controller 
 ********************************************************************/

typedef struct {
	volatile unsigned int wdog_control;	/* 0x08 */
	volatile unsigned int wdog_timer;	/* 0x0c */
	volatile unsigned int misc_status;	/* 0x10 */
	volatile unsigned int misc_mask;	/* 0x14 */
	volatile unsigned int global_status;	/* 0x18 */
	volatile unsigned int reserved;	/* 0x1c */
	volatile unsigned int reset_control;	/* 0x20 */
} INTERRUPT;

/********************************************************************
 * DMA controller
 ********************************************************************/
typedef struct {
	volatile unsigned int bus_mode;	/* 0x00 (CSR0) */
	volatile unsigned int xmt_poll;	/* 0x04 (CSR1) */
	volatile unsigned int rcv_poll;	/* 0x08 (CSR2) */
	volatile unsigned int rcv_base;	/* 0x0c (CSR3) */
	volatile unsigned int xmt_base;	/* 0x10 (CSR4) */
	volatile unsigned int status;	/* 0x14 (CSR5) */
	volatile unsigned int control;	/* 0x18 (CSR6) */
	volatile unsigned int intr_ena;	/* 0x1c (CSR7) */
	volatile unsigned int rcv_missed;	/* 0x20 (CSR8) */
	volatile unsigned int reserved[11];	/* 0x24-0x4c (CSR9-19) */
	volatile unsigned int cur_tx_buf_addr;	/* 0x50 (CSR20) */
	volatile unsigned int cur_rx_buf_addr;	/* 0x50 (CSR21) */
} DMA;

/*
 * Struct private for the Sibyte.
 *
 * Elements are grouped so variables used by the tx handling goes
 * together, and will go into the same cache lines etc. in order to
 * avoid cache line contention between the rx and tx handling on SMP.
 *
 * Frequently accessed variables are put at the beginning of the
 * struct to help the compiler generate better/shorter code.
 */
struct ar2313_private {
	struct net_device *dev;
	int version;
	u32 mb[2];

	volatile ETHERNET_STRUCT *phy_regs;
	volatile ETHERNET_STRUCT *eth_regs;
	volatile DMA *dma_regs;
	volatile u32 *int_regs;
	struct ar531x_eth *cfg;

	spinlock_t lock;			/* Serialise access to device */

	/* 
	 * RX and TX descriptors, must be adjacent
	 */
	ar2313_descr_t *rx_ring;
	ar2313_descr_t *tx_ring;


	struct sk_buff **rx_skb;
	struct sk_buff **tx_skb;

	/* 
	 * RX elements
	 */
	u32 rx_skbprd;
	u32 cur_rx;

	/* 
	 * TX elements
	 */
	u32 tx_prd;
	u32 tx_csm;

	/* 
	 * Misc elements
	 */
	int board_idx;
	char name[48];
	struct net_device_stats stats;
	struct {
		u32 address;
		u32 length;
		char *mapping;
	} desc;


	struct timer_list link_timer;
	unsigned short phy;			/* merlot phy = 1, samsung phy = 0x1f */
	unsigned short mac;
	unsigned short link;		/* 0 - link down, 1 - link up */
	u16 phyData;

	struct tasklet_struct rx_tasklet;
	int unloading;

	struct phy_device *phy_dev;
	struct mii_bus mii_bus;
};


/*
 * Prototypes
 */
static int ar2313_init(struct net_device *dev);
#ifdef TX_TIMEOUT
static void ar2313_tx_timeout(struct net_device *dev);
#endif
#if 0
static void ar2313_multicast_list(struct net_device *dev);
#endif
static int ar2313_restart(struct net_device *dev);
#if DEBUG
static void ar2313_dump_regs(struct net_device *dev);
#endif
static void ar2313_load_rx_ring(struct net_device *dev, int bufs);
static irqreturn_t ar2313_interrupt(int irq, void *dev_id);
static int ar2313_open(struct net_device *dev);
static int ar2313_start_xmit(struct sk_buff *skb, struct net_device *dev);
static int ar2313_close(struct net_device *dev);
static int ar2313_ioctl(struct net_device *dev, struct ifreq *ifr,
						int cmd);
static void ar2313_init_cleanup(struct net_device *dev);
static int ar2313_setup_timer(struct net_device *dev);
static void ar2313_link_timer_fn(unsigned long data);
static void ar2313_check_link(struct net_device *dev);
static struct net_device_stats *ar2313_get_stats(struct net_device *dev);
#endif							/* _AR2313_H_ */