blob: 3b11b1ca0e7730040d86c75b852fed7710302913 [file] [log] [blame]
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001/*
2 * PS3 gelic network driver.
3 *
4 * Copyright (C) 2007 Sony Computer Entertainment Inc.
5 * Copyright 2006, 2007 Sony Corporation
6 *
7 * This file is based on: spider_net.c
8 *
9 * (C) Copyright IBM Corp. 2005
10 *
11 * Authors : Utz Bacher <utz.bacher@de.ibm.com>
12 * Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2, or (at your option)
17 * any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 */
28
29#undef DEBUG
30
31#include <linux/kernel.h>
32#include <linux/module.h>
33
34#include <linux/etherdevice.h>
35#include <linux/ethtool.h>
36#include <linux/if_vlan.h>
37
38#include <linux/in.h>
39#include <linux/ip.h>
40#include <linux/tcp.h>
41
42#include <linux/dma-mapping.h>
43#include <net/checksum.h>
44#include <asm/firmware.h>
45#include <asm/ps3.h>
46#include <asm/lv1call.h>
47
48#include "ps3_gelic_net.h"
49
50#define DRV_NAME "Gelic Network Driver"
51#define DRV_VERSION "1.0"
52
53MODULE_AUTHOR("SCE Inc.");
54MODULE_DESCRIPTION("Gelic Network driver");
55MODULE_LICENSE("GPL");
56
Masakazu Mokuno59e97322008-02-07 19:58:08 +090057static inline struct device *ctodev(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +090058{
59 return &card->dev->core;
60}
Masakazu Mokuno59e97322008-02-07 19:58:08 +090061static inline u64 bus_id(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +090062{
63 return card->dev->bus_id;
64}
Masakazu Mokuno59e97322008-02-07 19:58:08 +090065static inline u64 dev_id(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +090066{
67 return card->dev->dev_id;
68}
69
70/* set irq_mask */
Masakazu Mokuno59e97322008-02-07 19:58:08 +090071static int gelic_card_set_irq_mask(struct gelic_card *card, u64 mask)
Masakazu Mokuno02c18892007-07-05 20:11:16 +090072{
73 int status;
74
75 status = lv1_net_set_interrupt_mask(bus_id(card), dev_id(card),
76 mask, 0);
77 if (status)
78 dev_info(ctodev(card),
79 "lv1_net_set_interrupt_mask failed %d\n", status);
80 return status;
81}
Masakazu Mokuno59e97322008-02-07 19:58:08 +090082static inline void gelic_card_rx_irq_on(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +090083{
Masakazu Mokuno59e97322008-02-07 19:58:08 +090084 gelic_card_set_irq_mask(card, card->ghiintmask | GELIC_CARD_RXINT);
Masakazu Mokuno02c18892007-07-05 20:11:16 +090085}
Masakazu Mokuno59e97322008-02-07 19:58:08 +090086static inline void gelic_card_rx_irq_off(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +090087{
Masakazu Mokuno59e97322008-02-07 19:58:08 +090088 gelic_card_set_irq_mask(card, card->ghiintmask & ~GELIC_CARD_RXINT);
Masakazu Mokuno02c18892007-07-05 20:11:16 +090089}
Masakazu Mokuno01fed4c2008-02-07 19:58:32 +090090
91static void
92gelic_card_get_ether_port_status(struct gelic_card *card, int inform)
93{
94 u64 v2;
95 struct net_device *ether_netdev;
96
97 lv1_net_control(bus_id(card), dev_id(card),
98 GELIC_LV1_GET_ETH_PORT_STATUS,
99 GELIC_LV1_VLAN_TX_ETHERNET, 0, 0,
100 &card->ether_port_status, &v2);
101
102 if (inform) {
103 ether_netdev = card->netdev;
104 if (card->ether_port_status & GELIC_LV1_ETHER_LINK_UP)
105 netif_carrier_on(ether_netdev);
106 else
107 netif_carrier_off(ether_netdev);
108 }
109}
110
111
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900112/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900113 * gelic_descr_get_status -- returns the status of a descriptor
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900114 * @descr: descriptor to look at
115 *
116 * returns the status as in the dmac_cmd_status field of the descriptor
117 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900118static enum gelic_descr_dma_status
119gelic_descr_get_status(struct gelic_descr *descr)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900120{
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900121 return be32_to_cpu(descr->dmac_cmd_status) & GELIC_DESCR_DMA_STAT_MASK;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900122}
123
124/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900125 * gelic_descr_set_status -- sets the status of a descriptor
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900126 * @descr: descriptor to change
127 * @status: status to set in the descriptor
128 *
129 * changes the status to the specified value. Doesn't change other bits
130 * in the status
131 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900132static void gelic_descr_set_status(struct gelic_descr *descr,
133 enum gelic_descr_dma_status status)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900134{
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900135 descr->dmac_cmd_status = cpu_to_be32(status |
136 (be32_to_cpu(descr->dmac_cmd_status) &
137 ~GELIC_DESCR_DMA_STAT_MASK));
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900138 /*
139 * dma_cmd_status field is used to indicate whether the descriptor
140 * is valid or not.
141 * Usually caller of this function wants to inform that to the
142 * hardware, so we assure here the hardware sees the change.
143 */
144 wmb();
145}
146
147/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900148 * gelic_card_free_chain - free descriptor chain
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900149 * @card: card structure
150 * @descr_in: address of desc
151 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900152static void gelic_card_free_chain(struct gelic_card *card,
153 struct gelic_descr *descr_in)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900154{
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900155 struct gelic_descr *descr;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900156
157 for (descr = descr_in; descr && descr->bus_addr; descr = descr->next) {
158 dma_unmap_single(ctodev(card), descr->bus_addr,
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900159 GELIC_DESCR_SIZE, DMA_BIDIRECTIONAL);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900160 descr->bus_addr = 0;
161 }
162}
163
164/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900165 * gelic_card_init_chain - links descriptor chain
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900166 * @card: card structure
167 * @chain: address of chain
168 * @start_descr: address of descriptor array
169 * @no: number of descriptors
170 *
171 * we manage a circular list that mirrors the hardware structure,
172 * except that the hardware uses bus addresses.
173 *
174 * returns 0 on success, <0 on failure
175 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900176static int gelic_card_init_chain(struct gelic_card *card,
177 struct gelic_descr_chain *chain,
178 struct gelic_descr *start_descr, int no)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900179{
180 int i;
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900181 struct gelic_descr *descr;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900182
183 descr = start_descr;
184 memset(descr, 0, sizeof(*descr) * no);
185
186 /* set up the hardware pointers in each descriptor */
187 for (i = 0; i < no; i++, descr++) {
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900188 gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900189 descr->bus_addr =
190 dma_map_single(ctodev(card), descr,
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900191 GELIC_DESCR_SIZE,
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900192 DMA_BIDIRECTIONAL);
193
194 if (!descr->bus_addr)
195 goto iommu_error;
196
197 descr->next = descr + 1;
198 descr->prev = descr - 1;
199 }
200 /* make them as ring */
201 (descr - 1)->next = start_descr;
202 start_descr->prev = (descr - 1);
203
204 /* chain bus addr of hw descriptor */
205 descr = start_descr;
206 for (i = 0; i < no; i++, descr++) {
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900207 descr->next_descr_addr = cpu_to_be32(descr->next->bus_addr);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900208 }
209
210 chain->head = start_descr;
211 chain->tail = start_descr;
212
213 /* do not chain last hw descriptor */
214 (descr - 1)->next_descr_addr = 0;
215
216 return 0;
217
218iommu_error:
219 for (i--, descr--; 0 <= i; i--, descr--)
220 if (descr->bus_addr)
221 dma_unmap_single(ctodev(card), descr->bus_addr,
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900222 GELIC_DESCR_SIZE,
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900223 DMA_BIDIRECTIONAL);
224 return -ENOMEM;
225}
226
227/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900228 * gelic_descr_prepare_rx - reinitializes a rx descriptor
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900229 * @card: card structure
230 * @descr: descriptor to re-init
231 *
232 * return 0 on succes, <0 on failure
233 *
234 * allocates a new rx skb, iommu-maps it and attaches it to the descriptor.
235 * Activate the descriptor state-wise
236 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900237static int gelic_descr_prepare_rx(struct gelic_card *card,
238 struct gelic_descr *descr)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900239{
240 int offset;
241 unsigned int bufsize;
242
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900243 if (gelic_descr_get_status(descr) != GELIC_DESCR_DMA_NOT_IN_USE)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900244 dev_info(ctodev(card), "%s: ERROR status \n", __func__);
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900245
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900246 /* we need to round up the buffer size to a multiple of 128 */
247 bufsize = ALIGN(GELIC_NET_MAX_MTU, GELIC_NET_RXBUF_ALIGN);
248
249 /* and we need to have it 128 byte aligned, therefore we allocate a
250 * bit more */
251 descr->skb = netdev_alloc_skb(card->netdev,
252 bufsize + GELIC_NET_RXBUF_ALIGN - 1);
253 if (!descr->skb) {
254 descr->buf_addr = 0; /* tell DMAC don't touch memory */
255 dev_info(ctodev(card),
256 "%s:allocate skb failed !!\n", __func__);
257 return -ENOMEM;
258 }
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900259 descr->buf_size = cpu_to_be32(bufsize);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900260 descr->dmac_cmd_status = 0;
261 descr->result_size = 0;
262 descr->valid_size = 0;
263 descr->data_error = 0;
264
265 offset = ((unsigned long)descr->skb->data) &
266 (GELIC_NET_RXBUF_ALIGN - 1);
267 if (offset)
268 skb_reserve(descr->skb, GELIC_NET_RXBUF_ALIGN - offset);
269 /* io-mmu-map the skb */
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900270 descr->buf_addr = cpu_to_be32(dma_map_single(ctodev(card),
271 descr->skb->data,
272 GELIC_NET_MAX_MTU,
273 DMA_FROM_DEVICE));
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900274 if (!descr->buf_addr) {
275 dev_kfree_skb_any(descr->skb);
276 descr->skb = NULL;
277 dev_info(ctodev(card),
278 "%s:Could not iommu-map rx buffer\n", __func__);
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900279 gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900280 return -ENOMEM;
281 } else {
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900282 gelic_descr_set_status(descr, GELIC_DESCR_DMA_CARDOWNED);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900283 return 0;
284 }
285}
286
287/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900288 * gelic_card_release_rx_chain - free all skb of rx descr
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900289 * @card: card structure
290 *
291 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900292static void gelic_card_release_rx_chain(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900293{
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900294 struct gelic_descr *descr = card->rx_chain.head;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900295
296 do {
297 if (descr->skb) {
298 dma_unmap_single(ctodev(card),
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900299 be32_to_cpu(descr->buf_addr),
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900300 descr->skb->len,
301 DMA_FROM_DEVICE);
302 descr->buf_addr = 0;
303 dev_kfree_skb_any(descr->skb);
304 descr->skb = NULL;
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900305 gelic_descr_set_status(descr,
306 GELIC_DESCR_DMA_NOT_IN_USE);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900307 }
308 descr = descr->next;
309 } while (descr != card->rx_chain.head);
310}
311
312/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900313 * gelic_card_fill_rx_chain - fills descriptors/skbs in the rx chains
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900314 * @card: card structure
315 *
316 * fills all descriptors in the rx chain: allocates skbs
317 * and iommu-maps them.
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900318 * returns 0 on success, < 0 on failure
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900319 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900320static int gelic_card_fill_rx_chain(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900321{
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900322 struct gelic_descr *descr = card->rx_chain.head;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900323 int ret;
324
325 do {
326 if (!descr->skb) {
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900327 ret = gelic_descr_prepare_rx(card, descr);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900328 if (ret)
329 goto rewind;
330 }
331 descr = descr->next;
332 } while (descr != card->rx_chain.head);
333
334 return 0;
335rewind:
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900336 gelic_card_release_rx_chain(card);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900337 return ret;
338}
339
340/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900341 * gelic_card_alloc_rx_skbs - allocates rx skbs in rx descriptor chains
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900342 * @card: card structure
343 *
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900344 * returns 0 on success, < 0 on failure
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900345 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900346static int gelic_card_alloc_rx_skbs(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900347{
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900348 struct gelic_descr_chain *chain;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900349 int ret;
350 chain = &card->rx_chain;
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900351 ret = gelic_card_fill_rx_chain(card);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900352 chain->head = card->rx_top->prev; /* point to the last */
353 return ret;
354}
355
356/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900357 * gelic_descr_release_tx - processes a used tx descriptor
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900358 * @card: card structure
359 * @descr: descriptor to release
360 *
361 * releases a used tx descriptor (unmapping, freeing of skb)
362 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900363static void gelic_descr_release_tx(struct gelic_card *card,
364 struct gelic_descr *descr)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900365{
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900366 struct sk_buff *skb = descr->skb;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900367
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900368#ifdef DEBUG
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900369 BUG_ON(!(be32_to_cpu(descr->data_status) &
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900370 (1 << GELIC_DESCR_TX_DMA_FRAME_TAIL)));
371#endif
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900372 dma_unmap_single(ctodev(card),
373 be32_to_cpu(descr->buf_addr), skb->len, DMA_TO_DEVICE);
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900374 dev_kfree_skb_any(skb);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900375
376 descr->buf_addr = 0;
377 descr->buf_size = 0;
378 descr->next_descr_addr = 0;
379 descr->result_size = 0;
380 descr->valid_size = 0;
381 descr->data_status = 0;
382 descr->data_error = 0;
383 descr->skb = NULL;
384
385 /* set descr status */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900386 gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900387}
388
389/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900390 * gelic_card_release_tx_chain - processes sent tx descriptors
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900391 * @card: adapter structure
392 * @stop: net_stop sequence
393 *
394 * releases the tx descriptors that gelic has finished with
395 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900396static void gelic_card_release_tx_chain(struct gelic_card *card, int stop)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900397{
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900398 struct gelic_descr_chain *tx_chain;
399 enum gelic_descr_dma_status status;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900400 int release = 0;
401
402 for (tx_chain = &card->tx_chain;
403 tx_chain->head != tx_chain->tail && tx_chain->tail;
404 tx_chain->tail = tx_chain->tail->next) {
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900405 status = gelic_descr_get_status(tx_chain->tail);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900406 switch (status) {
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900407 case GELIC_DESCR_DMA_RESPONSE_ERROR:
408 case GELIC_DESCR_DMA_PROTECTION_ERROR:
409 case GELIC_DESCR_DMA_FORCE_END:
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900410 if (printk_ratelimit())
411 dev_info(ctodev(card),
412 "%s: forcing end of tx descriptor " \
413 "with status %x\n",
414 __func__, status);
Masakazu Mokuno92548d62007-07-20 17:31:07 +0900415 card->netdev->stats.tx_dropped++;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900416 break;
417
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900418 case GELIC_DESCR_DMA_COMPLETE:
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900419 if (tx_chain->tail->skb) {
Masakazu Mokuno92548d62007-07-20 17:31:07 +0900420 card->netdev->stats.tx_packets++;
421 card->netdev->stats.tx_bytes +=
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900422 tx_chain->tail->skb->len;
423 }
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900424 break;
425
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900426 case GELIC_DESCR_DMA_CARDOWNED:
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900427 /* pending tx request */
428 default:
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900429 /* any other value (== GELIC_DESCR_DMA_NOT_IN_USE) */
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900430 if (!stop)
431 goto out;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900432 }
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900433 gelic_descr_release_tx(card, tx_chain->tail);
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900434 release ++;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900435 }
436out:
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900437 if (!stop && release)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900438 netif_wake_queue(card->netdev);
439}
440
441/**
442 * gelic_net_set_multi - sets multicast addresses and promisc flags
443 * @netdev: interface device structure
444 *
445 * gelic_net_set_multi configures multicast addresses as needed for the
446 * netdev interface. It also sets up multicast, allmulti and promisc
447 * flags appropriately
448 */
449static void gelic_net_set_multi(struct net_device *netdev)
450{
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900451 struct gelic_card *card = netdev_priv(netdev);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900452 struct dev_mc_list *mc;
453 unsigned int i;
454 uint8_t *p;
455 u64 addr;
456 int status;
457
458 /* clear all multicast address */
459 status = lv1_net_remove_multicast_address(bus_id(card), dev_id(card),
460 0, 1);
461 if (status)
462 dev_err(ctodev(card),
463 "lv1_net_remove_multicast_address failed %d\n",
464 status);
465 /* set broadcast address */
466 status = lv1_net_add_multicast_address(bus_id(card), dev_id(card),
467 GELIC_NET_BROADCAST_ADDR, 0);
468 if (status)
469 dev_err(ctodev(card),
470 "lv1_net_add_multicast_address failed, %d\n",
471 status);
472
473 if (netdev->flags & IFF_ALLMULTI
474 || netdev->mc_count > GELIC_NET_MC_COUNT_MAX) { /* list max */
475 status = lv1_net_add_multicast_address(bus_id(card),
476 dev_id(card),
477 0, 1);
478 if (status)
479 dev_err(ctodev(card),
480 "lv1_net_add_multicast_address failed, %d\n",
481 status);
482 return;
483 }
484
485 /* set multicast address */
486 for (mc = netdev->mc_list; mc; mc = mc->next) {
487 addr = 0;
488 p = mc->dmi_addr;
489 for (i = 0; i < ETH_ALEN; i++) {
490 addr <<= 8;
491 addr |= *p++;
492 }
493 status = lv1_net_add_multicast_address(bus_id(card),
494 dev_id(card),
495 addr, 0);
496 if (status)
497 dev_err(ctodev(card),
498 "lv1_net_add_multicast_address failed, %d\n",
499 status);
500 }
501}
502
503/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900504 * gelic_card_enable_rxdmac - enables the receive DMA controller
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900505 * @card: card structure
506 *
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900507 * gelic_card_enable_rxdmac enables the DMA controller by setting RX_DMA_EN
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900508 * in the GDADMACCNTR register
509 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900510static inline void gelic_card_enable_rxdmac(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900511{
512 int status;
513
514 status = lv1_net_start_rx_dma(bus_id(card), dev_id(card),
515 card->rx_chain.tail->bus_addr, 0);
516 if (status)
517 dev_info(ctodev(card),
518 "lv1_net_start_rx_dma failed, status=%d\n", status);
519}
520
521/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900522 * gelic_card_disable_rxdmac - disables the receive DMA controller
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900523 * @card: card structure
524 *
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900525 * gelic_card_disable_rxdmac terminates processing on the DMA controller by
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900526 * turing off DMA and issueing a force end
527 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900528static inline void gelic_card_disable_rxdmac(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900529{
530 int status;
531
532 /* this hvc blocks until the DMA in progress really stopped */
533 status = lv1_net_stop_rx_dma(bus_id(card), dev_id(card), 0);
534 if (status)
535 dev_err(ctodev(card),
536 "lv1_net_stop_rx_dma faild, %d\n", status);
537}
538
539/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900540 * gelic_card_disable_txdmac - disables the transmit DMA controller
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900541 * @card: card structure
542 *
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900543 * gelic_card_disable_txdmac terminates processing on the DMA controller by
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900544 * turing off DMA and issueing a force end
545 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900546static inline void gelic_card_disable_txdmac(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900547{
548 int status;
549
550 /* this hvc blocks until the DMA in progress really stopped */
551 status = lv1_net_stop_tx_dma(bus_id(card), dev_id(card), 0);
552 if (status)
553 dev_err(ctodev(card),
554 "lv1_net_stop_tx_dma faild, status=%d\n", status);
555}
556
557/**
558 * gelic_net_stop - called upon ifconfig down
559 * @netdev: interface device structure
560 *
561 * always returns 0
562 */
563static int gelic_net_stop(struct net_device *netdev)
564{
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900565 struct gelic_card *card = netdev_priv(netdev);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900566
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700567 napi_disable(&card->napi);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900568 netif_stop_queue(netdev);
569
570 /* turn off DMA, force end */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900571 gelic_card_disable_rxdmac(card);
572 gelic_card_disable_txdmac(card);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900573
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900574 gelic_card_set_irq_mask(card, 0);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900575
576 /* disconnect event port */
577 free_irq(card->netdev->irq, card->netdev);
578 ps3_sb_event_receive_port_destroy(card->dev, card->netdev->irq);
579 card->netdev->irq = NO_IRQ;
580
581 netif_carrier_off(netdev);
582
583 /* release chains */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900584 gelic_card_release_tx_chain(card, 1);
585 gelic_card_release_rx_chain(card);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900586
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900587 gelic_card_free_chain(card, card->tx_top);
588 gelic_card_free_chain(card, card->rx_top);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900589
590 return 0;
591}
592
593/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900594 * gelic_card_get_next_tx_descr - returns the next available tx descriptor
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900595 * @card: device structure to get descriptor from
596 *
597 * returns the address of the next descriptor, or NULL if not available.
598 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900599static struct gelic_descr *
600gelic_card_get_next_tx_descr(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900601{
602 if (!card->tx_chain.head)
603 return NULL;
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900604 /* see if the next descriptor is free */
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900605 if (card->tx_chain.tail != card->tx_chain.head->next &&
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900606 gelic_descr_get_status(card->tx_chain.head) ==
607 GELIC_DESCR_DMA_NOT_IN_USE)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900608 return card->tx_chain.head;
609 else
610 return NULL;
611
612}
613
614/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900615 * gelic_descr_set_tx_cmdstat - sets the tx descriptor command field
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900616 * @descr: descriptor structure to fill out
617 * @skb: packet to consider
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900618 *
619 * fills out the command and status field of the descriptor structure,
620 * depending on hardware checksum settings. This function assumes a wmb()
621 * has executed before.
622 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900623static void gelic_descr_set_tx_cmdstat(struct gelic_descr *descr,
624 struct sk_buff *skb)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900625{
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900626 if (skb->ip_summed != CHECKSUM_PARTIAL)
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900627 descr->dmac_cmd_status =
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900628 cpu_to_be32(GELIC_DESCR_DMA_CMD_NO_CHKSUM |
629 GELIC_DESCR_TX_DMA_FRAME_TAIL);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900630 else {
631 /* is packet ip?
632 * if yes: tcp? udp? */
633 if (skb->protocol == htons(ETH_P_IP)) {
634 if (ip_hdr(skb)->protocol == IPPROTO_TCP)
635 descr->dmac_cmd_status =
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900636 cpu_to_be32(GELIC_DESCR_DMA_CMD_TCP_CHKSUM |
637 GELIC_DESCR_TX_DMA_FRAME_TAIL);
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900638
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900639 else if (ip_hdr(skb)->protocol == IPPROTO_UDP)
640 descr->dmac_cmd_status =
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900641 cpu_to_be32(GELIC_DESCR_DMA_CMD_UDP_CHKSUM |
642 GELIC_DESCR_TX_DMA_FRAME_TAIL);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900643 else /*
644 * the stack should checksum non-tcp and non-udp
645 * packets on his own: NETIF_F_IP_CSUM
646 */
647 descr->dmac_cmd_status =
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900648 cpu_to_be32(GELIC_DESCR_DMA_CMD_NO_CHKSUM |
649 GELIC_DESCR_TX_DMA_FRAME_TAIL);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900650 }
651 }
652}
653
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900654static inline struct sk_buff *gelic_put_vlan_tag(struct sk_buff *skb,
655 unsigned short tag)
656{
657 struct vlan_ethhdr *veth;
658 static unsigned int c;
659
660 if (skb_headroom(skb) < VLAN_HLEN) {
661 struct sk_buff *sk_tmp = skb;
662 pr_debug("%s: hd=%d c=%ud\n", __func__, skb_headroom(skb), c);
663 skb = skb_realloc_headroom(sk_tmp, VLAN_HLEN);
664 if (!skb)
665 return NULL;
666 dev_kfree_skb_any(sk_tmp);
667 }
668 veth = (struct vlan_ethhdr *)skb_push(skb, VLAN_HLEN);
669
670 /* Move the mac addresses to the top of buffer */
671 memmove(skb->data, skb->data + VLAN_HLEN, 2 * ETH_ALEN);
672
673 veth->h_vlan_proto = __constant_htons(ETH_P_8021Q);
674 veth->h_vlan_TCI = htons(tag);
675
676 return skb;
677}
678
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900679/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900680 * gelic_descr_prepare_tx - get dma address of skb_data
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900681 * @card: card structure
682 * @descr: descriptor structure
683 * @skb: packet to use
684 *
685 * returns 0 on success, <0 on failure.
686 *
687 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900688static int gelic_descr_prepare_tx(struct gelic_card *card,
689 struct gelic_descr *descr,
690 struct sk_buff *skb)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900691{
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900692 dma_addr_t buf;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900693
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900694 if (card->vlan_index != -1) {
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900695 struct sk_buff *skb_tmp;
696 skb_tmp = gelic_put_vlan_tag(skb,
697 card->vlan_id[card->vlan_index]);
698 if (!skb_tmp)
699 return -ENOMEM;
700 skb = skb_tmp;
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900701 }
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900702
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900703 buf = dma_map_single(ctodev(card), skb->data, skb->len, DMA_TO_DEVICE);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900704
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900705 if (!buf) {
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900706 dev_err(ctodev(card),
707 "dma map 2 failed (%p, %i). Dropping packet\n",
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900708 skb->data, skb->len);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900709 return -ENOMEM;
710 }
711
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900712 descr->buf_addr = cpu_to_be32(buf);
713 descr->buf_size = cpu_to_be32(skb->len);
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900714 descr->skb = skb;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900715 descr->data_status = 0;
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900716 descr->next_descr_addr = 0; /* terminate hw descr */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900717 gelic_descr_set_tx_cmdstat(descr, skb);
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900718
719 /* bump free descriptor pointer */
Masakazu Mokuno173261e2007-08-31 22:22:32 +0900720 card->tx_chain.head = descr->next;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900721 return 0;
722}
723
724/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900725 * gelic_card_kick_txdma - enables TX DMA processing
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900726 * @card: card structure
727 * @descr: descriptor address to enable TX processing at
728 *
729 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900730static int gelic_card_kick_txdma(struct gelic_card *card,
731 struct gelic_descr *descr)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900732{
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900733 int status = 0;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900734
735 if (card->tx_dma_progress)
736 return 0;
737
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900738 if (gelic_descr_get_status(descr) == GELIC_DESCR_DMA_CARDOWNED) {
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900739 card->tx_dma_progress = 1;
Masakazu Mokunodc029ad2007-08-31 22:25:09 +0900740 status = lv1_net_start_tx_dma(bus_id(card), dev_id(card),
741 descr->bus_addr, 0);
742 if (status)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900743 dev_info(ctodev(card), "lv1_net_start_txdma failed," \
Masakazu Mokunodc029ad2007-08-31 22:25:09 +0900744 "status=%d\n", status);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900745 }
746 return status;
747}
748
749/**
750 * gelic_net_xmit - transmits a frame over the device
751 * @skb: packet to send out
752 * @netdev: interface device structure
753 *
754 * returns 0 on success, <0 on failure
755 */
756static int gelic_net_xmit(struct sk_buff *skb, struct net_device *netdev)
757{
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900758 struct gelic_card *card = netdev_priv(netdev);
759 struct gelic_descr *descr;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900760 int result;
761 unsigned long flags;
762
763 spin_lock_irqsave(&card->tx_dma_lock, flags);
764
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900765 gelic_card_release_tx_chain(card, 0);
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900766
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900767 descr = gelic_card_get_next_tx_descr(card);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900768 if (!descr) {
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900769 /*
770 * no more descriptors free
771 */
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900772 netif_stop_queue(netdev);
773 spin_unlock_irqrestore(&card->tx_dma_lock, flags);
774 return NETDEV_TX_BUSY;
775 }
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900776
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900777 result = gelic_descr_prepare_tx(card, descr, skb);
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900778 if (result) {
779 /*
780 * DMA map failed. As chanses are that failure
781 * would continue, just release skb and return
782 */
Masakazu Mokuno92548d62007-07-20 17:31:07 +0900783 card->netdev->stats.tx_dropped++;
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900784 dev_kfree_skb_any(skb);
785 spin_unlock_irqrestore(&card->tx_dma_lock, flags);
786 return NETDEV_TX_OK;
787 }
788 /*
789 * link this prepared descriptor to previous one
790 * to achieve high performance
791 */
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900792 descr->prev->next_descr_addr = cpu_to_be32(descr->bus_addr);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900793 /*
794 * as hardware descriptor is modified in the above lines,
795 * ensure that the hardware sees it
796 */
797 wmb();
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900798 if (gelic_card_kick_txdma(card, descr)) {
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900799 /*
800 * kick failed.
801 * release descriptors which were just prepared
802 */
Masakazu Mokuno92548d62007-07-20 17:31:07 +0900803 card->netdev->stats.tx_dropped++;
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900804 gelic_descr_release_tx(card, descr);
805 gelic_descr_release_tx(card, descr->next);
Masakazu Mokuno48544cc262007-07-20 17:24:56 +0900806 card->tx_chain.tail = descr->next->next;
807 dev_info(ctodev(card), "%s: kick failure\n", __func__);
808 } else {
809 /* OK, DMA started/reserved */
810 netdev->trans_start = jiffies;
811 }
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900812
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900813 spin_unlock_irqrestore(&card->tx_dma_lock, flags);
814 return NETDEV_TX_OK;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900815}
816
817/**
818 * gelic_net_pass_skb_up - takes an skb from a descriptor and passes it on
819 * @descr: descriptor to process
820 * @card: card structure
821 *
822 * iommu-unmaps the skb, fills out skb structure and passes the data to the
823 * stack. The descriptor state is not changed.
824 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900825static void gelic_net_pass_skb_up(struct gelic_descr *descr,
826 struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900827{
828 struct sk_buff *skb;
829 struct net_device *netdev;
830 u32 data_status, data_error;
831
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900832 data_status = be32_to_cpu(descr->data_status);
833 data_error = be32_to_cpu(descr->data_error);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900834 netdev = card->netdev;
835 /* unmap skb buffer */
836 skb = descr->skb;
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900837 dma_unmap_single(ctodev(card),
838 be32_to_cpu(descr->buf_addr), GELIC_NET_MAX_MTU,
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900839 DMA_FROM_DEVICE);
840
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900841 skb_put(skb, descr->valid_size ?
842 be32_to_cpu(descr->valid_size) :
843 be32_to_cpu(descr->result_size));
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900844 if (!descr->valid_size)
845 dev_info(ctodev(card), "buffer full %x %x %x\n",
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900846 be32_to_cpu(descr->result_size),
847 be32_to_cpu(descr->buf_size),
848 be32_to_cpu(descr->dmac_cmd_status));
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900849
850 descr->skb = NULL;
851 /*
852 * the card put 2 bytes vlan tag in front
853 * of the ethernet frame
854 */
855 skb_pull(skb, 2);
856 skb->protocol = eth_type_trans(skb, netdev);
857
858 /* checksum offload */
859 if (card->rx_csum) {
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900860 if ((data_status & GELIC_DESCR_DATA_STATUS_CHK_MASK) &&
861 (!(data_error & GELIC_DESCR_DATA_ERROR_CHK_MASK)))
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900862 skb->ip_summed = CHECKSUM_UNNECESSARY;
863 else
864 skb->ip_summed = CHECKSUM_NONE;
865 } else
866 skb->ip_summed = CHECKSUM_NONE;
867
868 /* update netdevice statistics */
Masakazu Mokuno92548d62007-07-20 17:31:07 +0900869 card->netdev->stats.rx_packets++;
870 card->netdev->stats.rx_bytes += skb->len;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900871
872 /* pass skb up to stack */
873 netif_receive_skb(skb);
874}
875
876/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900877 * gelic_card_decode_one_descr - processes an rx descriptor
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900878 * @card: card structure
879 *
880 * returns 1 if a packet has been sent to the stack, otherwise 0
881 *
882 * processes an rx descriptor by iommu-unmapping the data buffer and passing
883 * the packet up to the stack
884 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900885static int gelic_card_decode_one_descr(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900886{
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900887 enum gelic_descr_dma_status status;
888 struct gelic_descr_chain *chain = &card->rx_chain;
889 struct gelic_descr *descr = chain->tail;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900890 int dmac_chain_ended;
891
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900892 status = gelic_descr_get_status(descr);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900893 /* is this descriptor terminated with next_descr == NULL? */
894 dmac_chain_ended =
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900895 be32_to_cpu(descr->dmac_cmd_status) &
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900896 GELIC_DESCR_RX_DMA_CHAIN_END;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900897
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900898 if (status == GELIC_DESCR_DMA_CARDOWNED)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900899 return 0;
900
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900901 if (status == GELIC_DESCR_DMA_NOT_IN_USE) {
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900902 dev_dbg(ctodev(card), "dormant descr? %p\n", descr);
903 return 0;
904 }
905
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900906 if ((status == GELIC_DESCR_DMA_RESPONSE_ERROR) ||
907 (status == GELIC_DESCR_DMA_PROTECTION_ERROR) ||
908 (status == GELIC_DESCR_DMA_FORCE_END)) {
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900909 dev_info(ctodev(card), "dropping RX descriptor with state %x\n",
910 status);
Masakazu Mokuno92548d62007-07-20 17:31:07 +0900911 card->netdev->stats.rx_dropped++;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900912 goto refill;
913 }
914
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900915 if (status == GELIC_DESCR_DMA_BUFFER_FULL) {
Masakazu Mokunofe6d3a42007-07-20 17:39:25 +0900916 /*
917 * Buffer full would occur if and only if
918 * the frame length was longer than the size of this
919 * descriptor's buffer. If the frame length was equal
920 * to or shorter than buffer'size, FRAME_END condition
921 * would occur.
922 * Anyway this frame was longer than the MTU,
923 * just drop it.
924 */
925 dev_info(ctodev(card), "overlength frame\n");
926 goto refill;
927 }
928 /*
929 * descriptoers any other than FRAME_END here should
930 * be treated as error.
931 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900932 if (status != GELIC_DESCR_DMA_FRAME_END) {
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900933 dev_dbg(ctodev(card), "RX descriptor with state %x\n",
934 status);
935 goto refill;
936 }
937
938 /* ok, we've got a packet in descr */
Masakazu Mokunofe6d3a42007-07-20 17:39:25 +0900939 gelic_net_pass_skb_up(descr, card);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900940refill:
Masakazu Mokunofe6d3a42007-07-20 17:39:25 +0900941 /*
942 * So that always DMAC can see the end
943 * of the descriptor chain to avoid
944 * from unwanted DMAC overrun.
945 */
946 descr->next_descr_addr = 0;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900947
948 /* change the descriptor state: */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900949 gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900950
Masakazu Mokunofe6d3a42007-07-20 17:39:25 +0900951 /*
952 * this call can fail, but for now, just leave this
953 * decriptor without skb
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900954 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900955 gelic_descr_prepare_rx(card, descr);
Masakazu Mokunofe6d3a42007-07-20 17:39:25 +0900956
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900957 chain->head = descr;
958 chain->tail = descr->next;
Masakazu Mokunofe6d3a42007-07-20 17:39:25 +0900959
960 /*
961 * Set this descriptor the end of the chain.
962 */
Masakazu Mokuno100e1d82008-02-07 19:57:54 +0900963 descr->prev->next_descr_addr = cpu_to_be32(descr->bus_addr);
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900964
Masakazu Mokunofe6d3a42007-07-20 17:39:25 +0900965 /*
966 * If dmac chain was met, DMAC stopped.
967 * thus re-enable it
968 */
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900969 if (dmac_chain_ended) {
Masakazu Mokuno583aae12007-07-20 17:35:54 +0900970 card->rx_dma_restart_required = 1;
971 dev_dbg(ctodev(card), "reenable rx dma scheduled\n");
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900972 }
973
974 return 1;
975}
976
977/**
978 * gelic_net_poll - NAPI poll function called by the stack to return packets
979 * @netdev: interface device structure
980 * @budget: number of packets we can pass to the stack at most
981 *
982 * returns 0 if no more packets available to the driver/stack. Returns 1,
983 * if the quota is exceeded, but the driver has still packets.
984 *
985 */
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700986static int gelic_net_poll(struct napi_struct *napi, int budget)
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900987{
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900988 struct gelic_card *card = container_of(napi, struct gelic_card, napi);
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700989 struct net_device *netdev = card->netdev;
990 int packets_done = 0;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900991
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700992 while (packets_done < budget) {
Masakazu Mokuno59e97322008-02-07 19:58:08 +0900993 if (!gelic_card_decode_one_descr(card))
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900994 break;
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700995
996 packets_done++;
Masakazu Mokuno02c18892007-07-05 20:11:16 +0900997 }
Stephen Hemmingerbea33482007-10-03 16:41:36 -0700998
999 if (packets_done < budget) {
1000 netif_rx_complete(netdev, napi);
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001001 gelic_card_rx_irq_on(card);
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001002 }
1003 return packets_done;
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001004}
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001005/**
1006 * gelic_net_change_mtu - changes the MTU of an interface
1007 * @netdev: interface device structure
1008 * @new_mtu: new MTU value
1009 *
1010 * returns 0 on success, <0 on failure
1011 */
1012static int gelic_net_change_mtu(struct net_device *netdev, int new_mtu)
1013{
1014 /* no need to re-alloc skbs or so -- the max mtu is about 2.3k
1015 * and mtu is outbound only anyway */
1016 if ((new_mtu < GELIC_NET_MIN_MTU) ||
1017 (new_mtu > GELIC_NET_MAX_MTU)) {
1018 return -EINVAL;
1019 }
1020 netdev->mtu = new_mtu;
1021 return 0;
1022}
1023
1024/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001025 * gelic_card_interrupt - event handler for gelic_net
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001026 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001027static irqreturn_t gelic_card_interrupt(int irq, void *ptr)
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001028{
1029 unsigned long flags;
1030 struct net_device *netdev = ptr;
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001031 struct gelic_card *card = netdev_priv(netdev);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001032 u64 status;
1033
1034 status = card->irq_status;
1035
1036 if (!status)
1037 return IRQ_NONE;
1038
Masakazu Mokuno583aae12007-07-20 17:35:54 +09001039 if (card->rx_dma_restart_required) {
1040 card->rx_dma_restart_required = 0;
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001041 gelic_card_enable_rxdmac(card);
Masakazu Mokuno583aae12007-07-20 17:35:54 +09001042 }
1043
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001044 if (status & GELIC_CARD_RXINT) {
1045 gelic_card_rx_irq_off(card);
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001046 netif_rx_schedule(netdev, &card->napi);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001047 }
1048
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001049 if (status & GELIC_CARD_TXINT) {
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001050 spin_lock_irqsave(&card->tx_dma_lock, flags);
1051 card->tx_dma_progress = 0;
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001052 gelic_card_release_tx_chain(card, 0);
Masakazu Mokuno48544cc262007-07-20 17:24:56 +09001053 /* kick outstanding tx descriptor if any */
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001054 gelic_card_kick_txdma(card, card->tx_chain.tail);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001055 spin_unlock_irqrestore(&card->tx_dma_lock, flags);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001056 }
Masakazu Mokuno01fed4c2008-02-07 19:58:32 +09001057
1058 /* ether port status changed */
1059 if (status & GELIC_CARD_PORT_STATUS_CHANGED)
1060 gelic_card_get_ether_port_status(card, 1);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001061 return IRQ_HANDLED;
1062}
1063
1064#ifdef CONFIG_NET_POLL_CONTROLLER
1065/**
1066 * gelic_net_poll_controller - artificial interrupt for netconsole etc.
1067 * @netdev: interface device structure
1068 *
1069 * see Documentation/networking/netconsole.txt
1070 */
1071static void gelic_net_poll_controller(struct net_device *netdev)
1072{
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001073 struct gelic_card *card = netdev_priv(netdev);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001074
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001075 gelic_card_set_irq_mask(card, 0);
1076 gelic_card_interrupt(netdev->irq, netdev);
1077 gelic_card_set_irq_mask(card, card->ghiintmask);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001078}
1079#endif /* CONFIG_NET_POLL_CONTROLLER */
1080
1081/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001082 * gelic_card_open - open device and map dma region
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001083 * @card: card structure
1084 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001085static int gelic_card_open(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001086{
1087 int result;
1088
1089 result = ps3_sb_event_receive_port_setup(card->dev, PS3_BINDING_CPU_ANY,
1090 &card->netdev->irq);
1091
1092 if (result) {
1093 dev_info(ctodev(card),
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001094 "%s:%d: recieve_port_setup failed (%d)\n",
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001095 __func__, __LINE__, result);
1096 result = -EPERM;
1097 goto fail_alloc_irq;
1098 }
1099
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001100 result = request_irq(card->netdev->irq, gelic_card_interrupt,
Masakazu Mokunof0861f82007-07-20 17:33:02 +09001101 IRQF_DISABLED, card->netdev->name, card->netdev);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001102
1103 if (result) {
1104 dev_info(ctodev(card), "%s:%d: request_irq failed (%d)\n",
1105 __func__, __LINE__, result);
1106 goto fail_request_irq;
1107 }
1108
1109 return 0;
1110
1111fail_request_irq:
1112 ps3_sb_event_receive_port_destroy(card->dev, card->netdev->irq);
1113 card->netdev->irq = NO_IRQ;
1114fail_alloc_irq:
1115 return result;
1116}
1117
1118
1119/**
1120 * gelic_net_open - called upon ifonfig up
1121 * @netdev: interface device structure
1122 *
1123 * returns 0 on success, <0 on failure
1124 *
1125 * gelic_net_open allocates all the descriptors and memory needed for
1126 * operation, sets up multicast list and enables interrupts
1127 */
1128static int gelic_net_open(struct net_device *netdev)
1129{
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001130 struct gelic_card *card = netdev_priv(netdev);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001131
1132 dev_dbg(ctodev(card), " -> %s:%d\n", __func__, __LINE__);
1133
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001134 gelic_card_open(card);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001135
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001136 if (gelic_card_init_chain(card, &card->tx_chain,
1137 card->descr, GELIC_NET_TX_DESCRIPTORS))
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001138 goto alloc_tx_failed;
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001139 if (gelic_card_init_chain(card, &card->rx_chain,
1140 card->descr + GELIC_NET_TX_DESCRIPTORS,
1141 GELIC_NET_RX_DESCRIPTORS))
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001142 goto alloc_rx_failed;
1143
1144 /* head of chain */
1145 card->tx_top = card->tx_chain.head;
1146 card->rx_top = card->rx_chain.head;
1147 dev_dbg(ctodev(card), "descr rx %p, tx %p, size %#lx, num %#x\n",
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001148 card->rx_top, card->tx_top, sizeof(struct gelic_descr),
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001149 GELIC_NET_RX_DESCRIPTORS);
1150 /* allocate rx skbs */
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001151 if (gelic_card_alloc_rx_skbs(card))
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001152 goto alloc_skbs_failed;
1153
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001154 napi_enable(&card->napi);
1155
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001156 card->tx_dma_progress = 0;
Masakazu Mokuno01fed4c2008-02-07 19:58:32 +09001157 card->ghiintmask = GELIC_CARD_RXINT | GELIC_CARD_TXINT |
1158 GELIC_CARD_PORT_STATUS_CHANGED;
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001159
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001160 gelic_card_set_irq_mask(card, card->ghiintmask);
1161 gelic_card_enable_rxdmac(card);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001162
1163 netif_start_queue(netdev);
Masakazu Mokuno01fed4c2008-02-07 19:58:32 +09001164 gelic_card_get_ether_port_status(card, 1);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001165
1166 return 0;
1167
1168alloc_skbs_failed:
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001169 gelic_card_free_chain(card, card->rx_top);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001170alloc_rx_failed:
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001171 gelic_card_free_chain(card, card->tx_top);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001172alloc_tx_failed:
1173 return -ENOMEM;
1174}
1175
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001176static void gelic_net_get_drvinfo(struct net_device *netdev,
1177 struct ethtool_drvinfo *info)
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001178{
1179 strncpy(info->driver, DRV_NAME, sizeof(info->driver) - 1);
1180 strncpy(info->version, DRV_VERSION, sizeof(info->version) - 1);
1181}
1182
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001183static int gelic_ether_get_settings(struct net_device *netdev,
1184 struct ethtool_cmd *cmd)
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001185{
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001186 struct gelic_card *card = netdev_priv(netdev);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001187
Masakazu Mokuno01fed4c2008-02-07 19:58:32 +09001188 gelic_card_get_ether_port_status(card, 0);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001189
Masakazu Mokuno01fed4c2008-02-07 19:58:32 +09001190 if (card->ether_port_status & GELIC_LV1_ETHER_FULL_DUPLEX)
1191 cmd->duplex = DUPLEX_FULL;
1192 else
1193 cmd->duplex = DUPLEX_HALF;
1194
1195 switch (card->ether_port_status & GELIC_LV1_ETHER_SPEED_MASK) {
1196 case GELIC_LV1_ETHER_SPEED_10:
1197 cmd->speed = SPEED_10;
1198 break;
1199 case GELIC_LV1_ETHER_SPEED_100:
1200 cmd->speed = SPEED_100;
1201 break;
1202 case GELIC_LV1_ETHER_SPEED_1000:
1203 cmd->speed = SPEED_1000;
1204 break;
1205 default:
1206 pr_info("%s: speed unknown\n", __func__);
1207 cmd->speed = SPEED_10;
1208 break;
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001209 }
Masakazu Mokuno01fed4c2008-02-07 19:58:32 +09001210
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001211 cmd->supported = SUPPORTED_TP | SUPPORTED_Autoneg |
1212 SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
1213 SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
1214 SUPPORTED_1000baseT_Half | SUPPORTED_1000baseT_Full;
1215 cmd->advertising = cmd->supported;
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001216 cmd->autoneg = AUTONEG_ENABLE; /* always enabled */
1217 cmd->port = PORT_TP;
1218
1219 return 0;
1220}
1221
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001222static int gelic_net_nway_reset(struct net_device *netdev)
1223{
1224 if (netif_running(netdev)) {
1225 gelic_net_stop(netdev);
1226 gelic_net_open(netdev);
1227 }
1228 return 0;
1229}
1230
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001231static u32 gelic_net_get_rx_csum(struct net_device *netdev)
1232{
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001233 struct gelic_card *card = netdev_priv(netdev);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001234
1235 return card->rx_csum;
1236}
1237
1238static int gelic_net_set_rx_csum(struct net_device *netdev, u32 data)
1239{
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001240 struct gelic_card *card = netdev_priv(netdev);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001241
1242 card->rx_csum = data;
1243 return 0;
1244}
1245
1246static struct ethtool_ops gelic_net_ethtool_ops = {
1247 .get_drvinfo = gelic_net_get_drvinfo,
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001248 .get_settings = gelic_ether_get_settings,
Masakazu Mokuno7bc56b92008-02-07 19:58:20 +09001249 .get_link = ethtool_op_get_link,
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001250 .nway_reset = gelic_net_nway_reset,
Masakazu Mokuno7bc56b92008-02-07 19:58:20 +09001251 .get_tx_csum = ethtool_op_get_tx_csum,
1252 .set_tx_csum = ethtool_op_set_tx_csum,
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001253 .get_rx_csum = gelic_net_get_rx_csum,
1254 .set_rx_csum = gelic_net_set_rx_csum,
1255};
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001256
1257/**
1258 * gelic_net_tx_timeout_task - task scheduled by the watchdog timeout
1259 * function (to be called not under interrupt status)
1260 * @work: work is context of tx timout task
1261 *
1262 * called as task when tx hangs, resets interface (if interface is up)
1263 */
1264static void gelic_net_tx_timeout_task(struct work_struct *work)
1265{
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001266 struct gelic_card *card =
1267 container_of(work, struct gelic_card, tx_timeout_task);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001268 struct net_device *netdev = card->netdev;
1269
1270 dev_info(ctodev(card), "%s:Timed out. Restarting... \n", __func__);
1271
1272 if (!(netdev->flags & IFF_UP))
1273 goto out;
1274
1275 netif_device_detach(netdev);
1276 gelic_net_stop(netdev);
1277
1278 gelic_net_open(netdev);
1279 netif_device_attach(netdev);
1280
1281out:
1282 atomic_dec(&card->tx_timeout_task_counter);
1283}
1284
1285/**
1286 * gelic_net_tx_timeout - called when the tx timeout watchdog kicks in.
1287 * @netdev: interface device structure
1288 *
1289 * called, if tx hangs. Schedules a task that resets the interface
1290 */
1291static void gelic_net_tx_timeout(struct net_device *netdev)
1292{
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001293 struct gelic_card *card;
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001294
1295 card = netdev_priv(netdev);
1296 atomic_inc(&card->tx_timeout_task_counter);
1297 if (netdev->flags & IFF_UP)
1298 schedule_work(&card->tx_timeout_task);
1299 else
1300 atomic_dec(&card->tx_timeout_task_counter);
1301}
1302
1303/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001304 * gelic_ether_setup_netdev_ops - initialization of net_device operations
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001305 * @netdev: net_device structure
1306 *
1307 * fills out function pointers in the net_device structure
1308 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001309static void gelic_ether_setup_netdev_ops(struct net_device *netdev)
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001310{
1311 netdev->open = &gelic_net_open;
1312 netdev->stop = &gelic_net_stop;
1313 netdev->hard_start_xmit = &gelic_net_xmit;
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001314 netdev->set_multicast_list = &gelic_net_set_multi;
1315 netdev->change_mtu = &gelic_net_change_mtu;
1316 /* tx watchdog */
1317 netdev->tx_timeout = &gelic_net_tx_timeout;
1318 netdev->watchdog_timeo = GELIC_NET_WATCHDOG_TIMEOUT;
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001319 netdev->ethtool_ops = &gelic_net_ethtool_ops;
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001320}
1321
1322/**
1323 * gelic_net_setup_netdev - initialization of net_device
1324 * @card: card structure
1325 *
1326 * Returns 0 on success or <0 on failure
1327 *
1328 * gelic_net_setup_netdev initializes the net_device structure
1329 **/
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001330static int gelic_net_setup_netdev(struct gelic_card *card)
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001331{
1332 struct net_device *netdev = card->netdev;
1333 struct sockaddr addr;
1334 unsigned int i;
1335 int status;
1336 u64 v1, v2;
Joe Perches0795af52007-10-03 17:59:30 -07001337 DECLARE_MAC_BUF(mac);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001338
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001339 SET_NETDEV_DEV(netdev, &card->dev->core);
1340 spin_lock_init(&card->tx_dma_lock);
1341
1342 card->rx_csum = GELIC_NET_RX_CSUM_DEFAULT;
1343
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001344 gelic_ether_setup_netdev_ops(netdev);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001345
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001346 netif_napi_add(netdev, &card->napi,
1347 gelic_net_poll, GELIC_NET_NAPI_WEIGHT);
1348
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001349 netdev->features = NETIF_F_IP_CSUM;
1350
1351 status = lv1_net_control(bus_id(card), dev_id(card),
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001352 GELIC_LV1_GET_MAC_ADDRESS,
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001353 0, 0, 0, &v1, &v2);
1354 if (status || !is_valid_ether_addr((u8 *)&v1)) {
1355 dev_info(ctodev(card),
1356 "%s:lv1_net_control GET_MAC_ADDR failed %d\n",
1357 __func__, status);
1358 return -EINVAL;
1359 }
1360 v1 <<= 16;
1361 memcpy(addr.sa_data, &v1, ETH_ALEN);
1362 memcpy(netdev->dev_addr, addr.sa_data, ETH_ALEN);
Joe Perches0795af52007-10-03 17:59:30 -07001363 dev_info(ctodev(card), "MAC addr %s\n",
1364 print_mac(mac, netdev->dev_addr));
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001365
1366 card->vlan_index = -1; /* no vlan */
1367 for (i = 0; i < GELIC_NET_VLAN_MAX; i++) {
1368 status = lv1_net_control(bus_id(card), dev_id(card),
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001369 GELIC_LV1_GET_VLAN_ID,
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001370 i + 1, /* index; one based */
1371 0, 0, &v1, &v2);
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001372 if (status == LV1_NO_ENTRY) {
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001373 dev_dbg(ctodev(card),
1374 "GELIC_VLAN_ID no entry:%d, VLAN disabled\n",
1375 status);
1376 card->vlan_id[i] = 0;
1377 } else if (status) {
1378 dev_dbg(ctodev(card),
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001379 "%s:get vlan id faild, status=%d\n",
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001380 __func__, status);
1381 card->vlan_id[i] = 0;
1382 } else {
1383 card->vlan_id[i] = (u32)v1;
1384 dev_dbg(ctodev(card), "vlan_id:%d, %lx\n", i, v1);
1385 }
1386 }
Masakazu Mokuno173261e2007-08-31 22:22:32 +09001387
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001388 if (card->vlan_id[GELIC_LV1_VLAN_TX_ETHERNET - 1]) {
1389 card->vlan_index = GELIC_LV1_VLAN_TX_ETHERNET - 1;
Masakazu Mokuno173261e2007-08-31 22:22:32 +09001390 netdev->hard_header_len += VLAN_HLEN;
1391 }
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001392
1393 status = register_netdev(netdev);
1394 if (status) {
1395 dev_err(ctodev(card), "%s:Couldn't register net_device: %d\n",
1396 __func__, status);
1397 return status;
1398 }
1399
1400 return 0;
1401}
1402
1403/**
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001404 * gelic_alloc_card_net - allocates net_device and card structure
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001405 *
1406 * returns the card structure or NULL in case of errors
1407 *
1408 * the card and net_device structures are linked to each other
1409 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001410static struct gelic_card *gelic_alloc_card_net(void)
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001411{
1412 struct net_device *netdev;
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001413 struct gelic_card *card;
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001414 size_t alloc_size;
1415
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001416 alloc_size = sizeof(*card) +
1417 sizeof(struct gelic_descr) * GELIC_NET_RX_DESCRIPTORS +
1418 sizeof(struct gelic_descr) * GELIC_NET_TX_DESCRIPTORS;
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001419 /*
1420 * we assume private data is allocated 32 bytes (or more) aligned
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001421 * so that gelic_descr should be 32 bytes aligned.
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001422 * Current alloc_etherdev() does do it because NETDEV_ALIGN
1423 * is 32.
1424 * check this assumption here.
1425 */
1426 BUILD_BUG_ON(NETDEV_ALIGN < 32);
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001427 BUILD_BUG_ON(offsetof(struct gelic_card, irq_status) % 8);
1428 BUILD_BUG_ON(offsetof(struct gelic_card, descr) % 32);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001429
1430 netdev = alloc_etherdev(alloc_size);
1431 if (!netdev)
1432 return NULL;
1433
1434 card = netdev_priv(netdev);
1435 card->netdev = netdev;
1436 INIT_WORK(&card->tx_timeout_task, gelic_net_tx_timeout_task);
1437 init_waitqueue_head(&card->waitq);
1438 atomic_set(&card->tx_timeout_task_counter, 0);
1439
1440 return card;
1441}
1442
1443/**
1444 * ps3_gelic_driver_probe - add a device to the control of this driver
1445 */
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001446static int ps3_gelic_driver_probe(struct ps3_system_bus_device *dev)
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001447{
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001448 struct gelic_card *card = gelic_alloc_card_net();
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001449 int result;
1450
1451 if (!card) {
1452 dev_info(&dev->core, "gelic_net_alloc_card failed\n");
1453 result = -ENOMEM;
1454 goto fail_alloc_card;
1455 }
1456
1457 ps3_system_bus_set_driver_data(dev, card);
1458 card->dev = dev;
1459
1460 result = ps3_open_hv_device(dev);
1461
1462 if (result) {
1463 dev_dbg(&dev->core, "ps3_open_hv_device failed\n");
1464 goto fail_open;
1465 }
1466
1467 result = ps3_dma_region_create(dev->d_region);
1468
1469 if (result) {
1470 dev_dbg(&dev->core, "ps3_dma_region_create failed(%d)\n",
1471 result);
1472 BUG_ON("check region type");
1473 goto fail_dma_region;
1474 }
1475
1476 result = lv1_net_set_interrupt_status_indicator(bus_id(card),
1477 dev_id(card),
1478 ps3_mm_phys_to_lpar(__pa(&card->irq_status)),
1479 0);
1480
1481 if (result) {
1482 dev_dbg(&dev->core,
1483 "lv1_net_set_interrupt_status_indicator failed: %s\n",
1484 ps3_result(result));
1485 result = -EIO;
1486 goto fail_status_indicator;
1487 }
1488
1489 result = gelic_net_setup_netdev(card);
1490
1491 if (result) {
1492 dev_dbg(&dev->core, "%s:%d: ps3_dma_region_create failed: "
1493 "(%d)\n", __func__, __LINE__, result);
1494 goto fail_setup_netdev;
1495 }
1496
1497 return 0;
1498
1499fail_setup_netdev:
1500 lv1_net_set_interrupt_status_indicator(bus_id(card),
Masakazu Mokunob94e1d42008-02-07 19:57:41 +09001501 dev_id(card),
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001502 0 , 0);
1503fail_status_indicator:
1504 ps3_dma_region_free(dev->d_region);
1505fail_dma_region:
1506 ps3_close_hv_device(dev);
1507fail_open:
1508 ps3_system_bus_set_driver_data(dev, NULL);
1509 free_netdev(card->netdev);
1510fail_alloc_card:
1511 return result;
1512}
1513
1514/**
1515 * ps3_gelic_driver_remove - remove a device from the control of this driver
1516 */
1517
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001518static int ps3_gelic_driver_remove(struct ps3_system_bus_device *dev)
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001519{
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001520 struct gelic_card *card = ps3_system_bus_get_driver_data(dev);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001521
1522 wait_event(card->waitq,
1523 atomic_read(&card->tx_timeout_task_counter) == 0);
1524
1525 lv1_net_set_interrupt_status_indicator(bus_id(card), dev_id(card),
1526 0 , 0);
1527
1528 unregister_netdev(card->netdev);
1529 free_netdev(card->netdev);
1530
1531 ps3_system_bus_set_driver_data(dev, NULL);
1532
1533 ps3_dma_region_free(dev->d_region);
1534
1535 ps3_close_hv_device(dev);
1536
1537 return 0;
1538}
1539
1540static struct ps3_system_bus_driver ps3_gelic_driver = {
1541 .match_id = PS3_MATCH_ID_GELIC,
1542 .probe = ps3_gelic_driver_probe,
1543 .remove = ps3_gelic_driver_remove,
1544 .shutdown = ps3_gelic_driver_remove,
1545 .core.name = "ps3_gelic_driver",
1546 .core.owner = THIS_MODULE,
1547};
1548
1549static int __init ps3_gelic_driver_init (void)
1550{
1551 return firmware_has_feature(FW_FEATURE_PS3_LV1)
1552 ? ps3_system_bus_driver_register(&ps3_gelic_driver)
1553 : -ENODEV;
1554}
1555
1556static void __exit ps3_gelic_driver_exit (void)
1557{
1558 ps3_system_bus_driver_unregister(&ps3_gelic_driver);
1559}
1560
Masakazu Mokuno59e97322008-02-07 19:58:08 +09001561module_init(ps3_gelic_driver_init);
1562module_exit(ps3_gelic_driver_exit);
Masakazu Mokuno02c18892007-07-05 20:11:16 +09001563
1564MODULE_ALIAS(PS3_MODULE_ALIAS_GELIC);
1565