summaryrefslogtreecommitdiffstats
path: root/target/linux/atheros-2.6/files/drivers/net/ar2313/ar2313.h
blob: 3606bd7a2a055113ce114158cb54756506a7aa33 (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
#ifndef _AR2313_H_
#define _AR2313_H_

#include <linux/autoconf.h>
#include <asm/bootinfo.h>
#include "platform.h"

extern unsigned long mips_machtype;

#undef ETHERNET_BASE
#define ETHERNET_BASE ar_eth_base
#define ETHERNET_SIZE 0x00100000
#define ETHERNET_MACS 2

#undef DMA_BASE
#define DMA_BASE      ar_dma_base
#define DMA_SIZE      0x00100000


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

/*
 * Interrupt register base address
 */
#define INTERRUPT_BASE    PHYS_TO_K1(ar_int_base)

/*
 * Reset Register
 */
#define AR531X_RESET    (AR531X_RESETTMR + 0x0020)
#define RESET_SYSTEM         0x00000001      /* cold reset full system */
#define RESET_PROC           0x00000002      /* cold reset MIPS core */
#define RESET_WLAN0          0x00000004      /* cold reset WLAN MAC and BB */
#define RESET_EPHY0          0x00000008      /* cold reset ENET0 phy */
#define RESET_EPHY1          0x00000010      /* cold reset ENET1 phy */
#define RESET_ENET0          0x00000020      /* cold reset ENET0 mac */
#define RESET_ENET1          0x00000040      /* cold reset ENET1 mac */

#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)

#ifndef K1_TO_PHYS
// hack
#define K1_TO_PHYS(x)   (((unsigned int)(x)) & 0x1FFFFFFF)        /* kseg1 to physical */
#endif

#ifndef PHYS_TO_K1
// hack
#define  PHYS_TO_K1(x)   (((unsigned int)(x)) | 0xA0000000)   /* physical to kseg1 */
#endif

#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


struct ar2313_cmd {
	u32	cmd;
	u32     address;      /* virtual address of image */
	u32     length;       /* size of image to download */
	u32     mailbox;      /* mailbox to get/set */
	u32     data[2];      /* contents of mailbox to read/write */
};


/*
 * 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	*eth_regs;
	volatile DMA			*dma_regs;
	volatile u32		        *int_regs;

	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;
};


/*
 * 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_ */