1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * PS3 Platfom gelic network driver.
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2007 Sony Computer Entertainment Inc.
6*4882a593Smuzhiyun * Copyright 2006, 2007 Sony Corporation.
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * This file is based on: spider_net.h
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * (C) Copyright IBM Corp. 2005
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun * Authors : Utz Bacher <utz.bacher@de.ibm.com>
13*4882a593Smuzhiyun * Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
14*4882a593Smuzhiyun */
15*4882a593Smuzhiyun #ifndef _GELIC_NET_H
16*4882a593Smuzhiyun #define _GELIC_NET_H
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun /* descriptors */
19*4882a593Smuzhiyun #define GELIC_NET_RX_DESCRIPTORS 128 /* num of descriptors */
20*4882a593Smuzhiyun #define GELIC_NET_TX_DESCRIPTORS 128 /* num of descriptors */
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #define GELIC_NET_MAX_MTU VLAN_ETH_FRAME_LEN
23*4882a593Smuzhiyun #define GELIC_NET_MIN_MTU VLAN_ETH_ZLEN
24*4882a593Smuzhiyun #define GELIC_NET_RXBUF_ALIGN 128
25*4882a593Smuzhiyun #define GELIC_CARD_RX_CSUM_DEFAULT 1 /* hw chksum */
26*4882a593Smuzhiyun #define GELIC_NET_WATCHDOG_TIMEOUT 5*HZ
27*4882a593Smuzhiyun #define GELIC_NET_BROADCAST_ADDR 0xffffffffffffL
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun #define GELIC_NET_MC_COUNT_MAX 32 /* multicast address list */
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun /* virtual interrupt status register bits */
32*4882a593Smuzhiyun /* INT1 */
33*4882a593Smuzhiyun #define GELIC_CARD_TX_RAM_FULL_ERR 0x0000000000000001L
34*4882a593Smuzhiyun #define GELIC_CARD_RX_RAM_FULL_ERR 0x0000000000000002L
35*4882a593Smuzhiyun #define GELIC_CARD_TX_SHORT_FRAME_ERR 0x0000000000000004L
36*4882a593Smuzhiyun #define GELIC_CARD_TX_INVALID_DESCR_ERR 0x0000000000000008L
37*4882a593Smuzhiyun #define GELIC_CARD_RX_FIFO_FULL_ERR 0x0000000000002000L
38*4882a593Smuzhiyun #define GELIC_CARD_RX_DESCR_CHAIN_END 0x0000000000004000L
39*4882a593Smuzhiyun #define GELIC_CARD_RX_INVALID_DESCR_ERR 0x0000000000008000L
40*4882a593Smuzhiyun #define GELIC_CARD_TX_RESPONCE_ERR 0x0000000000010000L
41*4882a593Smuzhiyun #define GELIC_CARD_RX_RESPONCE_ERR 0x0000000000100000L
42*4882a593Smuzhiyun #define GELIC_CARD_TX_PROTECTION_ERR 0x0000000000400000L
43*4882a593Smuzhiyun #define GELIC_CARD_RX_PROTECTION_ERR 0x0000000004000000L
44*4882a593Smuzhiyun #define GELIC_CARD_TX_TCP_UDP_CHECKSUM_ERR 0x0000000008000000L
45*4882a593Smuzhiyun #define GELIC_CARD_PORT_STATUS_CHANGED 0x0000000020000000L
46*4882a593Smuzhiyun #define GELIC_CARD_WLAN_EVENT_RECEIVED 0x0000000040000000L
47*4882a593Smuzhiyun #define GELIC_CARD_WLAN_COMMAND_COMPLETED 0x0000000080000000L
48*4882a593Smuzhiyun /* INT 0 */
49*4882a593Smuzhiyun #define GELIC_CARD_TX_FLAGGED_DESCR 0x0004000000000000L
50*4882a593Smuzhiyun #define GELIC_CARD_RX_FLAGGED_DESCR 0x0040000000000000L
51*4882a593Smuzhiyun #define GELIC_CARD_TX_TRANSFER_END 0x0080000000000000L
52*4882a593Smuzhiyun #define GELIC_CARD_TX_DESCR_CHAIN_END 0x0100000000000000L
53*4882a593Smuzhiyun #define GELIC_CARD_NUMBER_OF_RX_FRAME 0x1000000000000000L
54*4882a593Smuzhiyun #define GELIC_CARD_ONE_TIME_COUNT_TIMER 0x4000000000000000L
55*4882a593Smuzhiyun #define GELIC_CARD_FREE_RUN_COUNT_TIMER 0x8000000000000000L
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun /* initial interrupt mask */
58*4882a593Smuzhiyun #define GELIC_CARD_TXINT GELIC_CARD_TX_DESCR_CHAIN_END
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun #define GELIC_CARD_RXINT (GELIC_CARD_RX_DESCR_CHAIN_END | \
61*4882a593Smuzhiyun GELIC_CARD_NUMBER_OF_RX_FRAME)
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun /* RX descriptor data_status bits */
64*4882a593Smuzhiyun enum gelic_descr_rx_status {
65*4882a593Smuzhiyun GELIC_DESCR_RXDMADU = 0x80000000, /* destination MAC addr unknown */
66*4882a593Smuzhiyun GELIC_DESCR_RXLSTFBF = 0x40000000, /* last frame buffer */
67*4882a593Smuzhiyun GELIC_DESCR_RXIPCHK = 0x20000000, /* IP checksum performed */
68*4882a593Smuzhiyun GELIC_DESCR_RXTCPCHK = 0x10000000, /* TCP/UDP checksup performed */
69*4882a593Smuzhiyun GELIC_DESCR_RXWTPKT = 0x00C00000, /*
70*4882a593Smuzhiyun * wakeup trigger packet
71*4882a593Smuzhiyun * 01: Magic Packet (TM)
72*4882a593Smuzhiyun * 10: ARP packet
73*4882a593Smuzhiyun * 11: Multicast MAC addr
74*4882a593Smuzhiyun */
75*4882a593Smuzhiyun GELIC_DESCR_RXVLNPKT = 0x00200000, /* VLAN packet */
76*4882a593Smuzhiyun /* bit 20..16 reserved */
77*4882a593Smuzhiyun GELIC_DESCR_RXRRECNUM = 0x0000ff00, /* reception receipt number */
78*4882a593Smuzhiyun /* bit 7..0 reserved */
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun #define GELIC_DESCR_DATA_STATUS_CHK_MASK \
82*4882a593Smuzhiyun (GELIC_DESCR_RXIPCHK | GELIC_DESCR_RXTCPCHK)
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun /* TX descriptor data_status bits */
85*4882a593Smuzhiyun enum gelic_descr_tx_status {
86*4882a593Smuzhiyun GELIC_DESCR_TX_TAIL = 0x00000001, /* gelic treated this
87*4882a593Smuzhiyun * descriptor was end of
88*4882a593Smuzhiyun * a tx frame
89*4882a593Smuzhiyun */
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun /* RX descriptor data error bits */
93*4882a593Smuzhiyun enum gelic_descr_rx_error {
94*4882a593Smuzhiyun /* bit 31 reserved */
95*4882a593Smuzhiyun GELIC_DESCR_RXALNERR = 0x40000000, /* alignement error 10/100M */
96*4882a593Smuzhiyun GELIC_DESCR_RXOVERERR = 0x20000000, /* oversize error */
97*4882a593Smuzhiyun GELIC_DESCR_RXRNTERR = 0x10000000, /* Runt error */
98*4882a593Smuzhiyun GELIC_DESCR_RXIPCHKERR = 0x08000000, /* IP checksum error */
99*4882a593Smuzhiyun GELIC_DESCR_RXTCPCHKERR = 0x04000000, /* TCP/UDP checksum error */
100*4882a593Smuzhiyun GELIC_DESCR_RXDRPPKT = 0x00100000, /* drop packet */
101*4882a593Smuzhiyun GELIC_DESCR_RXIPFMTERR = 0x00080000, /* IP packet format error */
102*4882a593Smuzhiyun /* bit 18 reserved */
103*4882a593Smuzhiyun GELIC_DESCR_RXDATAERR = 0x00020000, /* IP packet format error */
104*4882a593Smuzhiyun GELIC_DESCR_RXCALERR = 0x00010000, /* cariier extension length
105*4882a593Smuzhiyun * error */
106*4882a593Smuzhiyun GELIC_DESCR_RXCREXERR = 0x00008000, /* carrier extension error */
107*4882a593Smuzhiyun GELIC_DESCR_RXMLTCST = 0x00004000, /* multicast address frame */
108*4882a593Smuzhiyun /* bit 13..0 reserved */
109*4882a593Smuzhiyun };
110*4882a593Smuzhiyun #define GELIC_DESCR_DATA_ERROR_CHK_MASK \
111*4882a593Smuzhiyun (GELIC_DESCR_RXIPCHKERR | GELIC_DESCR_RXTCPCHKERR)
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun /* DMA command and status (RX and TX)*/
114*4882a593Smuzhiyun enum gelic_descr_dma_status {
115*4882a593Smuzhiyun GELIC_DESCR_DMA_COMPLETE = 0x00000000, /* used in tx */
116*4882a593Smuzhiyun GELIC_DESCR_DMA_BUFFER_FULL = 0x00000000, /* used in rx */
117*4882a593Smuzhiyun GELIC_DESCR_DMA_RESPONSE_ERROR = 0x10000000, /* used in rx, tx */
118*4882a593Smuzhiyun GELIC_DESCR_DMA_PROTECTION_ERROR = 0x20000000, /* used in rx, tx */
119*4882a593Smuzhiyun GELIC_DESCR_DMA_FRAME_END = 0x40000000, /* used in rx */
120*4882a593Smuzhiyun GELIC_DESCR_DMA_FORCE_END = 0x50000000, /* used in rx, tx */
121*4882a593Smuzhiyun GELIC_DESCR_DMA_CARDOWNED = 0xa0000000, /* used in rx, tx */
122*4882a593Smuzhiyun GELIC_DESCR_DMA_NOT_IN_USE = 0xb0000000, /* any other value */
123*4882a593Smuzhiyun };
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun #define GELIC_DESCR_DMA_STAT_MASK (0xf0000000)
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun /* tx descriptor command and status */
128*4882a593Smuzhiyun enum gelic_descr_tx_dma_status {
129*4882a593Smuzhiyun /* [19] */
130*4882a593Smuzhiyun GELIC_DESCR_TX_DMA_IKE = 0x00080000, /* IPSEC off */
131*4882a593Smuzhiyun /* [18] */
132*4882a593Smuzhiyun GELIC_DESCR_TX_DMA_FRAME_TAIL = 0x00040000, /* last descriptor of
133*4882a593Smuzhiyun * the packet
134*4882a593Smuzhiyun */
135*4882a593Smuzhiyun /* [17..16] */
136*4882a593Smuzhiyun GELIC_DESCR_TX_DMA_TCP_CHKSUM = 0x00020000, /* TCP packet */
137*4882a593Smuzhiyun GELIC_DESCR_TX_DMA_UDP_CHKSUM = 0x00030000, /* UDP packet */
138*4882a593Smuzhiyun GELIC_DESCR_TX_DMA_NO_CHKSUM = 0x00000000, /* no checksum */
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun /* [1] */
141*4882a593Smuzhiyun GELIC_DESCR_TX_DMA_CHAIN_END = 0x00000002, /* DMA terminated
142*4882a593Smuzhiyun * due to chain end
143*4882a593Smuzhiyun */
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun #define GELIC_DESCR_DMA_CMD_NO_CHKSUM \
147*4882a593Smuzhiyun (GELIC_DESCR_DMA_CARDOWNED | GELIC_DESCR_TX_DMA_IKE | \
148*4882a593Smuzhiyun GELIC_DESCR_TX_DMA_NO_CHKSUM)
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun #define GELIC_DESCR_DMA_CMD_TCP_CHKSUM \
151*4882a593Smuzhiyun (GELIC_DESCR_DMA_CARDOWNED | GELIC_DESCR_TX_DMA_IKE | \
152*4882a593Smuzhiyun GELIC_DESCR_TX_DMA_TCP_CHKSUM)
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun #define GELIC_DESCR_DMA_CMD_UDP_CHKSUM \
155*4882a593Smuzhiyun (GELIC_DESCR_DMA_CARDOWNED | GELIC_DESCR_TX_DMA_IKE | \
156*4882a593Smuzhiyun GELIC_DESCR_TX_DMA_UDP_CHKSUM)
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun enum gelic_descr_rx_dma_status {
159*4882a593Smuzhiyun /* [ 1 ] */
160*4882a593Smuzhiyun GELIC_DESCR_RX_DMA_CHAIN_END = 0x00000002, /* DMA terminated
161*4882a593Smuzhiyun * due to chain end
162*4882a593Smuzhiyun */
163*4882a593Smuzhiyun };
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun /* for lv1_net_control */
166*4882a593Smuzhiyun enum gelic_lv1_net_control_code {
167*4882a593Smuzhiyun GELIC_LV1_GET_MAC_ADDRESS = 1,
168*4882a593Smuzhiyun GELIC_LV1_GET_ETH_PORT_STATUS = 2,
169*4882a593Smuzhiyun GELIC_LV1_SET_NEGOTIATION_MODE = 3,
170*4882a593Smuzhiyun GELIC_LV1_GET_VLAN_ID = 4,
171*4882a593Smuzhiyun GELIC_LV1_SET_WOL = 5,
172*4882a593Smuzhiyun GELIC_LV1_GET_CHANNEL = 6,
173*4882a593Smuzhiyun GELIC_LV1_POST_WLAN_CMD = 9,
174*4882a593Smuzhiyun GELIC_LV1_GET_WLAN_CMD_RESULT = 10,
175*4882a593Smuzhiyun GELIC_LV1_GET_WLAN_EVENT = 11,
176*4882a593Smuzhiyun };
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun /* for GELIC_LV1_SET_WOL */
179*4882a593Smuzhiyun enum gelic_lv1_wol_command {
180*4882a593Smuzhiyun GELIC_LV1_WOL_MAGIC_PACKET = 1,
181*4882a593Smuzhiyun GELIC_LV1_WOL_ADD_MATCH_ADDR = 6,
182*4882a593Smuzhiyun GELIC_LV1_WOL_DELETE_MATCH_ADDR = 7,
183*4882a593Smuzhiyun };
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun /* for GELIC_LV1_WOL_MAGIC_PACKET */
186*4882a593Smuzhiyun enum gelic_lv1_wol_mp_arg {
187*4882a593Smuzhiyun GELIC_LV1_WOL_MP_DISABLE = 0,
188*4882a593Smuzhiyun GELIC_LV1_WOL_MP_ENABLE = 1,
189*4882a593Smuzhiyun };
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun /* for GELIC_LV1_WOL_{ADD,DELETE}_MATCH_ADDR */
192*4882a593Smuzhiyun enum gelic_lv1_wol_match_arg {
193*4882a593Smuzhiyun GELIC_LV1_WOL_MATCH_INDIVIDUAL = 0,
194*4882a593Smuzhiyun GELIC_LV1_WOL_MATCH_ALL = 1,
195*4882a593Smuzhiyun };
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun /* status returened from GET_ETH_PORT_STATUS */
198*4882a593Smuzhiyun enum gelic_lv1_ether_port_status {
199*4882a593Smuzhiyun GELIC_LV1_ETHER_LINK_UP = 0x0000000000000001L,
200*4882a593Smuzhiyun GELIC_LV1_ETHER_FULL_DUPLEX = 0x0000000000000002L,
201*4882a593Smuzhiyun GELIC_LV1_ETHER_AUTO_NEG = 0x0000000000000004L,
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun GELIC_LV1_ETHER_SPEED_10 = 0x0000000000000010L,
204*4882a593Smuzhiyun GELIC_LV1_ETHER_SPEED_100 = 0x0000000000000020L,
205*4882a593Smuzhiyun GELIC_LV1_ETHER_SPEED_1000 = 0x0000000000000040L,
206*4882a593Smuzhiyun GELIC_LV1_ETHER_SPEED_MASK = 0x0000000000000070L,
207*4882a593Smuzhiyun };
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun enum gelic_lv1_vlan_index {
210*4882a593Smuzhiyun /* for outgoing packets */
211*4882a593Smuzhiyun GELIC_LV1_VLAN_TX_ETHERNET_0 = 0x0000000000000002L,
212*4882a593Smuzhiyun GELIC_LV1_VLAN_TX_WIRELESS = 0x0000000000000003L,
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun /* for incoming packets */
215*4882a593Smuzhiyun GELIC_LV1_VLAN_RX_ETHERNET_0 = 0x0000000000000012L,
216*4882a593Smuzhiyun GELIC_LV1_VLAN_RX_WIRELESS = 0x0000000000000013L,
217*4882a593Smuzhiyun };
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun enum gelic_lv1_phy {
220*4882a593Smuzhiyun GELIC_LV1_PHY_ETHERNET_0 = 0x0000000000000002L,
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun /* size of hardware part of gelic descriptor */
224*4882a593Smuzhiyun #define GELIC_DESCR_SIZE (32)
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun enum gelic_port_type {
227*4882a593Smuzhiyun GELIC_PORT_ETHERNET_0 = 0,
228*4882a593Smuzhiyun GELIC_PORT_WIRELESS = 1,
229*4882a593Smuzhiyun GELIC_PORT_MAX
230*4882a593Smuzhiyun };
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun struct gelic_descr {
233*4882a593Smuzhiyun /* as defined by the hardware */
234*4882a593Smuzhiyun __be32 buf_addr;
235*4882a593Smuzhiyun __be32 buf_size;
236*4882a593Smuzhiyun __be32 next_descr_addr;
237*4882a593Smuzhiyun __be32 dmac_cmd_status;
238*4882a593Smuzhiyun __be32 result_size;
239*4882a593Smuzhiyun __be32 valid_size; /* all zeroes for tx */
240*4882a593Smuzhiyun __be32 data_status;
241*4882a593Smuzhiyun __be32 data_error; /* all zeroes for tx */
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun /* used in the driver */
244*4882a593Smuzhiyun struct sk_buff *skb;
245*4882a593Smuzhiyun dma_addr_t bus_addr;
246*4882a593Smuzhiyun struct gelic_descr *next;
247*4882a593Smuzhiyun struct gelic_descr *prev;
248*4882a593Smuzhiyun } __attribute__((aligned(32)));
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun struct gelic_descr_chain {
251*4882a593Smuzhiyun /* we walk from tail to head */
252*4882a593Smuzhiyun struct gelic_descr *head;
253*4882a593Smuzhiyun struct gelic_descr *tail;
254*4882a593Smuzhiyun };
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun struct gelic_vlan_id {
257*4882a593Smuzhiyun u16 tx;
258*4882a593Smuzhiyun u16 rx;
259*4882a593Smuzhiyun };
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun struct gelic_card {
262*4882a593Smuzhiyun struct napi_struct napi;
263*4882a593Smuzhiyun struct net_device *netdev[GELIC_PORT_MAX];
264*4882a593Smuzhiyun /*
265*4882a593Smuzhiyun * hypervisor requires irq_status should be
266*4882a593Smuzhiyun * 8 bytes aligned, but u64 member is
267*4882a593Smuzhiyun * always disposed in that manner
268*4882a593Smuzhiyun */
269*4882a593Smuzhiyun u64 irq_status;
270*4882a593Smuzhiyun u64 irq_mask;
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun struct ps3_system_bus_device *dev;
273*4882a593Smuzhiyun struct gelic_vlan_id vlan[GELIC_PORT_MAX];
274*4882a593Smuzhiyun int vlan_required;
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun struct gelic_descr_chain tx_chain;
277*4882a593Smuzhiyun struct gelic_descr_chain rx_chain;
278*4882a593Smuzhiyun /*
279*4882a593Smuzhiyun * tx_lock guards tx descriptor list and
280*4882a593Smuzhiyun * tx_dma_progress.
281*4882a593Smuzhiyun */
282*4882a593Smuzhiyun spinlock_t tx_lock;
283*4882a593Smuzhiyun int tx_dma_progress;
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun struct work_struct tx_timeout_task;
286*4882a593Smuzhiyun atomic_t tx_timeout_task_counter;
287*4882a593Smuzhiyun wait_queue_head_t waitq;
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun /* only first user should up the card */
290*4882a593Smuzhiyun struct mutex updown_lock;
291*4882a593Smuzhiyun atomic_t users;
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun u64 ether_port_status;
294*4882a593Smuzhiyun int link_mode;
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun /* original address returned by kzalloc */
297*4882a593Smuzhiyun void *unalign;
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun /*
300*4882a593Smuzhiyun * each netdevice has copy of irq
301*4882a593Smuzhiyun */
302*4882a593Smuzhiyun unsigned int irq;
303*4882a593Smuzhiyun struct gelic_descr *tx_top, *rx_top;
304*4882a593Smuzhiyun struct gelic_descr descr[]; /* must be the last */
305*4882a593Smuzhiyun };
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun struct gelic_port {
308*4882a593Smuzhiyun struct gelic_card *card;
309*4882a593Smuzhiyun struct net_device *netdev;
310*4882a593Smuzhiyun enum gelic_port_type type;
311*4882a593Smuzhiyun long priv[]; /* long for alignment */
312*4882a593Smuzhiyun };
313*4882a593Smuzhiyun
port_to_card(struct gelic_port * p)314*4882a593Smuzhiyun static inline struct gelic_card *port_to_card(struct gelic_port *p)
315*4882a593Smuzhiyun {
316*4882a593Smuzhiyun return p->card;
317*4882a593Smuzhiyun }
port_to_netdev(struct gelic_port * p)318*4882a593Smuzhiyun static inline struct net_device *port_to_netdev(struct gelic_port *p)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun return p->netdev;
321*4882a593Smuzhiyun }
netdev_card(struct net_device * d)322*4882a593Smuzhiyun static inline struct gelic_card *netdev_card(struct net_device *d)
323*4882a593Smuzhiyun {
324*4882a593Smuzhiyun return ((struct gelic_port *)netdev_priv(d))->card;
325*4882a593Smuzhiyun }
netdev_port(struct net_device * d)326*4882a593Smuzhiyun static inline struct gelic_port *netdev_port(struct net_device *d)
327*4882a593Smuzhiyun {
328*4882a593Smuzhiyun return (struct gelic_port *)netdev_priv(d);
329*4882a593Smuzhiyun }
ctodev(struct gelic_card * card)330*4882a593Smuzhiyun static inline struct device *ctodev(struct gelic_card *card)
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun return &card->dev->core;
333*4882a593Smuzhiyun }
bus_id(struct gelic_card * card)334*4882a593Smuzhiyun static inline u64 bus_id(struct gelic_card *card)
335*4882a593Smuzhiyun {
336*4882a593Smuzhiyun return card->dev->bus_id;
337*4882a593Smuzhiyun }
dev_id(struct gelic_card * card)338*4882a593Smuzhiyun static inline u64 dev_id(struct gelic_card *card)
339*4882a593Smuzhiyun {
340*4882a593Smuzhiyun return card->dev->dev_id;
341*4882a593Smuzhiyun }
342*4882a593Smuzhiyun
port_priv(struct gelic_port * port)343*4882a593Smuzhiyun static inline void *port_priv(struct gelic_port *port)
344*4882a593Smuzhiyun {
345*4882a593Smuzhiyun return port->priv;
346*4882a593Smuzhiyun }
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun #ifdef CONFIG_PPC_EARLY_DEBUG_PS3GELIC
349*4882a593Smuzhiyun void udbg_shutdown_ps3gelic(void);
350*4882a593Smuzhiyun #else
udbg_shutdown_ps3gelic(void)351*4882a593Smuzhiyun static inline void udbg_shutdown_ps3gelic(void) {}
352*4882a593Smuzhiyun #endif
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun int gelic_card_set_irq_mask(struct gelic_card *card, u64 mask);
355*4882a593Smuzhiyun /* shared netdev ops */
356*4882a593Smuzhiyun void gelic_card_up(struct gelic_card *card);
357*4882a593Smuzhiyun void gelic_card_down(struct gelic_card *card);
358*4882a593Smuzhiyun int gelic_net_open(struct net_device *netdev);
359*4882a593Smuzhiyun int gelic_net_stop(struct net_device *netdev);
360*4882a593Smuzhiyun netdev_tx_t gelic_net_xmit(struct sk_buff *skb, struct net_device *netdev);
361*4882a593Smuzhiyun void gelic_net_set_multi(struct net_device *netdev);
362*4882a593Smuzhiyun void gelic_net_tx_timeout(struct net_device *netdev, unsigned int txqueue);
363*4882a593Smuzhiyun int gelic_net_setup_netdev(struct net_device *netdev, struct gelic_card *card);
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun /* shared ethtool ops */
366*4882a593Smuzhiyun void gelic_net_get_drvinfo(struct net_device *netdev,
367*4882a593Smuzhiyun struct ethtool_drvinfo *info);
368*4882a593Smuzhiyun void gelic_net_poll_controller(struct net_device *netdev);
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun #endif /* _GELIC_NET_H */
371