]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/net/ps3_gelic_net.c
ps3: gelic: updown_lock semaphore to mutex
[net-next-2.6.git] / drivers / net / ps3_gelic_net.c
CommitLineData
02c18891
MM
1/*
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"
09dde54c 49#include "ps3_gelic_wireless.h"
02c18891
MM
50
51#define DRV_NAME "Gelic Network Driver"
09dde54c 52#define DRV_VERSION "2.0"
02c18891
MM
53
54MODULE_AUTHOR("SCE Inc.");
55MODULE_DESCRIPTION("Gelic Network driver");
56MODULE_LICENSE("GPL");
57
589866f9
MM
58
59static inline void gelic_card_enable_rxdmac(struct gelic_card *card);
60static inline void gelic_card_disable_rxdmac(struct gelic_card *card);
61static inline void gelic_card_disable_txdmac(struct gelic_card *card);
62static inline void gelic_card_reset_chain(struct gelic_card *card,
63 struct gelic_descr_chain *chain,
64 struct gelic_descr *start_descr);
02c18891
MM
65
66/* set irq_mask */
589866f9 67int gelic_card_set_irq_mask(struct gelic_card *card, u64 mask)
02c18891
MM
68{
69 int status;
70
71 status = lv1_net_set_interrupt_mask(bus_id(card), dev_id(card),
72 mask, 0);
73 if (status)
74 dev_info(ctodev(card),
589866f9 75 "%s failed %d\n", __func__, status);
02c18891
MM
76 return status;
77}
589866f9 78
59e97327 79static inline void gelic_card_rx_irq_on(struct gelic_card *card)
02c18891 80{
589866f9
MM
81 card->irq_mask |= GELIC_CARD_RXINT;
82 gelic_card_set_irq_mask(card, card->irq_mask);
02c18891 83}
59e97327 84static inline void gelic_card_rx_irq_off(struct gelic_card *card)
02c18891 85{
589866f9
MM
86 card->irq_mask &= ~GELIC_CARD_RXINT;
87 gelic_card_set_irq_mask(card, card->irq_mask);
02c18891 88}
01fed4c2 89
589866f9
MM
90static void gelic_card_get_ether_port_status(struct gelic_card *card,
91 int inform)
01fed4c2
MM
92{
93 u64 v2;
94 struct net_device *ether_netdev;
95
96 lv1_net_control(bus_id(card), dev_id(card),
97 GELIC_LV1_GET_ETH_PORT_STATUS,
98 GELIC_LV1_VLAN_TX_ETHERNET, 0, 0,
99 &card->ether_port_status, &v2);
100
101 if (inform) {
589866f9 102 ether_netdev = card->netdev[GELIC_PORT_ETHERNET];
01fed4c2
MM
103 if (card->ether_port_status & GELIC_LV1_ETHER_LINK_UP)
104 netif_carrier_on(ether_netdev);
105 else
106 netif_carrier_off(ether_netdev);
107 }
108}
109
589866f9
MM
110void gelic_card_up(struct gelic_card *card)
111{
112 pr_debug("%s: called\n", __func__);
2914f3ef 113 mutex_lock(&card->updown_lock);
589866f9
MM
114 if (atomic_inc_return(&card->users) == 1) {
115 pr_debug("%s: real do\n", __func__);
116 /* enable irq */
117 gelic_card_set_irq_mask(card, card->irq_mask);
118 /* start rx */
119 gelic_card_enable_rxdmac(card);
120
121 napi_enable(&card->napi);
122 }
2914f3ef 123 mutex_unlock(&card->updown_lock);
589866f9
MM
124 pr_debug("%s: done\n", __func__);
125}
126
127void gelic_card_down(struct gelic_card *card)
128{
129 u64 mask;
130 pr_debug("%s: called\n", __func__);
2914f3ef 131 mutex_lock(&card->updown_lock);
589866f9
MM
132 if (atomic_dec_if_positive(&card->users) == 0) {
133 pr_debug("%s: real do\n", __func__);
134 napi_disable(&card->napi);
135 /*
136 * Disable irq. Wireless interrupts will
137 * be disabled later if any
138 */
139 mask = card->irq_mask & (GELIC_CARD_WLAN_EVENT_RECEIVED |
140 GELIC_CARD_WLAN_COMMAND_COMPLETED);
141 gelic_card_set_irq_mask(card, mask);
142 /* stop rx */
143 gelic_card_disable_rxdmac(card);
144 gelic_card_reset_chain(card, &card->rx_chain,
145 card->descr + GELIC_NET_TX_DESCRIPTORS);
146 /* stop tx */
147 gelic_card_disable_txdmac(card);
148 }
2914f3ef 149 mutex_unlock(&card->updown_lock);
589866f9
MM
150 pr_debug("%s: done\n", __func__);
151}
01fed4c2 152
02c18891 153/**
59e97327 154 * gelic_descr_get_status -- returns the status of a descriptor
02c18891
MM
155 * @descr: descriptor to look at
156 *
157 * returns the status as in the dmac_cmd_status field of the descriptor
158 */
59e97327
MM
159static enum gelic_descr_dma_status
160gelic_descr_get_status(struct gelic_descr *descr)
02c18891 161{
59e97327 162 return be32_to_cpu(descr->dmac_cmd_status) & GELIC_DESCR_DMA_STAT_MASK;
02c18891
MM
163}
164
165/**
59e97327 166 * gelic_descr_set_status -- sets the status of a descriptor
02c18891
MM
167 * @descr: descriptor to change
168 * @status: status to set in the descriptor
169 *
170 * changes the status to the specified value. Doesn't change other bits
171 * in the status
172 */
59e97327
MM
173static void gelic_descr_set_status(struct gelic_descr *descr,
174 enum gelic_descr_dma_status status)
02c18891 175{
59e97327 176 descr->dmac_cmd_status = cpu_to_be32(status |
589866f9
MM
177 (be32_to_cpu(descr->dmac_cmd_status) &
178 ~GELIC_DESCR_DMA_STAT_MASK));
02c18891
MM
179 /*
180 * dma_cmd_status field is used to indicate whether the descriptor
181 * is valid or not.
182 * Usually caller of this function wants to inform that to the
183 * hardware, so we assure here the hardware sees the change.
184 */
185 wmb();
186}
187
188/**
59e97327 189 * gelic_card_free_chain - free descriptor chain
02c18891
MM
190 * @card: card structure
191 * @descr_in: address of desc
192 */
59e97327
MM
193static void gelic_card_free_chain(struct gelic_card *card,
194 struct gelic_descr *descr_in)
02c18891 195{
59e97327 196 struct gelic_descr *descr;
02c18891
MM
197
198 for (descr = descr_in; descr && descr->bus_addr; descr = descr->next) {
199 dma_unmap_single(ctodev(card), descr->bus_addr,
59e97327 200 GELIC_DESCR_SIZE, DMA_BIDIRECTIONAL);
02c18891
MM
201 descr->bus_addr = 0;
202 }
203}
204
205/**
59e97327 206 * gelic_card_init_chain - links descriptor chain
02c18891
MM
207 * @card: card structure
208 * @chain: address of chain
209 * @start_descr: address of descriptor array
210 * @no: number of descriptors
211 *
212 * we manage a circular list that mirrors the hardware structure,
213 * except that the hardware uses bus addresses.
214 *
215 * returns 0 on success, <0 on failure
216 */
59e97327
MM
217static int gelic_card_init_chain(struct gelic_card *card,
218 struct gelic_descr_chain *chain,
219 struct gelic_descr *start_descr, int no)
02c18891
MM
220{
221 int i;
59e97327 222 struct gelic_descr *descr;
02c18891
MM
223
224 descr = start_descr;
225 memset(descr, 0, sizeof(*descr) * no);
226
227 /* set up the hardware pointers in each descriptor */
228 for (i = 0; i < no; i++, descr++) {
59e97327 229 gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE);
02c18891
MM
230 descr->bus_addr =
231 dma_map_single(ctodev(card), descr,
59e97327 232 GELIC_DESCR_SIZE,
02c18891
MM
233 DMA_BIDIRECTIONAL);
234
235 if (!descr->bus_addr)
236 goto iommu_error;
237
238 descr->next = descr + 1;
239 descr->prev = descr - 1;
240 }
241 /* make them as ring */
242 (descr - 1)->next = start_descr;
243 start_descr->prev = (descr - 1);
244
245 /* chain bus addr of hw descriptor */
246 descr = start_descr;
247 for (i = 0; i < no; i++, descr++) {
100e1d89 248 descr->next_descr_addr = cpu_to_be32(descr->next->bus_addr);
02c18891
MM
249 }
250
251 chain->head = start_descr;
252 chain->tail = start_descr;
253
254 /* do not chain last hw descriptor */
255 (descr - 1)->next_descr_addr = 0;
256
257 return 0;
258
259iommu_error:
260 for (i--, descr--; 0 <= i; i--, descr--)
261 if (descr->bus_addr)
262 dma_unmap_single(ctodev(card), descr->bus_addr,
59e97327 263 GELIC_DESCR_SIZE,
02c18891
MM
264 DMA_BIDIRECTIONAL);
265 return -ENOMEM;
266}
267
589866f9
MM
268/**
269 * gelic_card_reset_chain - reset status of a descriptor chain
270 * @card: card structure
271 * @chain: address of chain
272 * @start_descr: address of descriptor array
273 *
274 * Reset the status of dma descriptors to ready state
275 * and re-initialize the hardware chain for later use
276 */
277static void gelic_card_reset_chain(struct gelic_card *card,
278 struct gelic_descr_chain *chain,
279 struct gelic_descr *start_descr)
280{
281 struct gelic_descr *descr;
282
283 for (descr = start_descr; start_descr != descr->next; descr++) {
284 gelic_descr_set_status(descr, GELIC_DESCR_DMA_CARDOWNED);
285 descr->next_descr_addr = cpu_to_be32(descr->next->bus_addr);
286 }
287
288 chain->head = start_descr;
289 chain->tail = (descr - 1);
290
291 (descr - 1)->next_descr_addr = 0;
292}
02c18891 293/**
59e97327 294 * gelic_descr_prepare_rx - reinitializes a rx descriptor
02c18891
MM
295 * @card: card structure
296 * @descr: descriptor to re-init
297 *
298 * return 0 on succes, <0 on failure
299 *
300 * allocates a new rx skb, iommu-maps it and attaches it to the descriptor.
301 * Activate the descriptor state-wise
302 */
59e97327 303static int gelic_descr_prepare_rx(struct gelic_card *card,
589866f9 304 struct gelic_descr *descr)
02c18891
MM
305{
306 int offset;
307 unsigned int bufsize;
308
59e97327 309 if (gelic_descr_get_status(descr) != GELIC_DESCR_DMA_NOT_IN_USE)
02c18891 310 dev_info(ctodev(card), "%s: ERROR status \n", __func__);
02c18891
MM
311 /* we need to round up the buffer size to a multiple of 128 */
312 bufsize = ALIGN(GELIC_NET_MAX_MTU, GELIC_NET_RXBUF_ALIGN);
313
314 /* and we need to have it 128 byte aligned, therefore we allocate a
315 * bit more */
589866f9 316 descr->skb = dev_alloc_skb(bufsize + GELIC_NET_RXBUF_ALIGN - 1);
02c18891
MM
317 if (!descr->skb) {
318 descr->buf_addr = 0; /* tell DMAC don't touch memory */
319 dev_info(ctodev(card),
320 "%s:allocate skb failed !!\n", __func__);
321 return -ENOMEM;
322 }
100e1d89 323 descr->buf_size = cpu_to_be32(bufsize);
02c18891
MM
324 descr->dmac_cmd_status = 0;
325 descr->result_size = 0;
326 descr->valid_size = 0;
327 descr->data_error = 0;
328
329 offset = ((unsigned long)descr->skb->data) &
330 (GELIC_NET_RXBUF_ALIGN - 1);
331 if (offset)
332 skb_reserve(descr->skb, GELIC_NET_RXBUF_ALIGN - offset);
333 /* io-mmu-map the skb */
100e1d89
MM
334 descr->buf_addr = cpu_to_be32(dma_map_single(ctodev(card),
335 descr->skb->data,
336 GELIC_NET_MAX_MTU,
337 DMA_FROM_DEVICE));
02c18891
MM
338 if (!descr->buf_addr) {
339 dev_kfree_skb_any(descr->skb);
340 descr->skb = NULL;
341 dev_info(ctodev(card),
342 "%s:Could not iommu-map rx buffer\n", __func__);
59e97327 343 gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE);
02c18891
MM
344 return -ENOMEM;
345 } else {
59e97327 346 gelic_descr_set_status(descr, GELIC_DESCR_DMA_CARDOWNED);
02c18891
MM
347 return 0;
348 }
349}
350
351/**
59e97327 352 * gelic_card_release_rx_chain - free all skb of rx descr
02c18891
MM
353 * @card: card structure
354 *
355 */
59e97327 356static void gelic_card_release_rx_chain(struct gelic_card *card)
02c18891 357{
59e97327 358 struct gelic_descr *descr = card->rx_chain.head;
02c18891
MM
359
360 do {
361 if (descr->skb) {
362 dma_unmap_single(ctodev(card),
100e1d89 363 be32_to_cpu(descr->buf_addr),
02c18891
MM
364 descr->skb->len,
365 DMA_FROM_DEVICE);
366 descr->buf_addr = 0;
367 dev_kfree_skb_any(descr->skb);
368 descr->skb = NULL;
59e97327
MM
369 gelic_descr_set_status(descr,
370 GELIC_DESCR_DMA_NOT_IN_USE);
02c18891
MM
371 }
372 descr = descr->next;
373 } while (descr != card->rx_chain.head);
374}
375
376/**
59e97327 377 * gelic_card_fill_rx_chain - fills descriptors/skbs in the rx chains
02c18891
MM
378 * @card: card structure
379 *
380 * fills all descriptors in the rx chain: allocates skbs
381 * and iommu-maps them.
59e97327 382 * returns 0 on success, < 0 on failure
02c18891 383 */
59e97327 384static int gelic_card_fill_rx_chain(struct gelic_card *card)
02c18891 385{
59e97327 386 struct gelic_descr *descr = card->rx_chain.head;
02c18891
MM
387 int ret;
388
389 do {
390 if (!descr->skb) {
59e97327 391 ret = gelic_descr_prepare_rx(card, descr);
02c18891
MM
392 if (ret)
393 goto rewind;
394 }
395 descr = descr->next;
396 } while (descr != card->rx_chain.head);
397
398 return 0;
399rewind:
59e97327 400 gelic_card_release_rx_chain(card);
02c18891
MM
401 return ret;
402}
403
404/**
59e97327 405 * gelic_card_alloc_rx_skbs - allocates rx skbs in rx descriptor chains
02c18891
MM
406 * @card: card structure
407 *
59e97327 408 * returns 0 on success, < 0 on failure
02c18891 409 */
59e97327 410static int gelic_card_alloc_rx_skbs(struct gelic_card *card)
02c18891 411{
59e97327 412 struct gelic_descr_chain *chain;
02c18891
MM
413 int ret;
414 chain = &card->rx_chain;
59e97327 415 ret = gelic_card_fill_rx_chain(card);
589866f9 416 chain->tail = card->rx_top->prev; /* point to the last */
02c18891
MM
417 return ret;
418}
419
420/**
59e97327 421 * gelic_descr_release_tx - processes a used tx descriptor
02c18891
MM
422 * @card: card structure
423 * @descr: descriptor to release
424 *
425 * releases a used tx descriptor (unmapping, freeing of skb)
426 */
59e97327 427static void gelic_descr_release_tx(struct gelic_card *card,
589866f9 428 struct gelic_descr *descr)
02c18891 429{
173261ed 430 struct sk_buff *skb = descr->skb;
02c18891 431
589866f9
MM
432 BUG_ON(!(be32_to_cpu(descr->data_status) & GELIC_DESCR_TX_TAIL));
433
434 dma_unmap_single(ctodev(card), be32_to_cpu(descr->buf_addr), skb->len,
435 DMA_TO_DEVICE);
173261ed 436 dev_kfree_skb_any(skb);
02c18891
MM
437
438 descr->buf_addr = 0;
439 descr->buf_size = 0;
440 descr->next_descr_addr = 0;
441 descr->result_size = 0;
442 descr->valid_size = 0;
443 descr->data_status = 0;
444 descr->data_error = 0;
445 descr->skb = NULL;
446
447 /* set descr status */
59e97327 448 gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE);
02c18891
MM
449}
450
589866f9
MM
451static void gelic_card_stop_queues(struct gelic_card *card)
452{
453 netif_stop_queue(card->netdev[GELIC_PORT_ETHERNET]);
454
455 if (card->netdev[GELIC_PORT_WIRELESS])
456 netif_stop_queue(card->netdev[GELIC_PORT_WIRELESS]);
457}
458static void gelic_card_wake_queues(struct gelic_card *card)
459{
460 netif_wake_queue(card->netdev[GELIC_PORT_ETHERNET]);
461
462 if (card->netdev[GELIC_PORT_WIRELESS])
463 netif_wake_queue(card->netdev[GELIC_PORT_WIRELESS]);
464}
02c18891 465/**
59e97327 466 * gelic_card_release_tx_chain - processes sent tx descriptors
02c18891
MM
467 * @card: adapter structure
468 * @stop: net_stop sequence
469 *
470 * releases the tx descriptors that gelic has finished with
471 */
59e97327 472static void gelic_card_release_tx_chain(struct gelic_card *card, int stop)
02c18891 473{
59e97327
MM
474 struct gelic_descr_chain *tx_chain;
475 enum gelic_descr_dma_status status;
589866f9 476 struct net_device *netdev;
02c18891
MM
477 int release = 0;
478
479 for (tx_chain = &card->tx_chain;
480 tx_chain->head != tx_chain->tail && tx_chain->tail;
481 tx_chain->tail = tx_chain->tail->next) {
59e97327 482 status = gelic_descr_get_status(tx_chain->tail);
589866f9 483 netdev = tx_chain->tail->skb->dev;
02c18891 484 switch (status) {
59e97327
MM
485 case GELIC_DESCR_DMA_RESPONSE_ERROR:
486 case GELIC_DESCR_DMA_PROTECTION_ERROR:
487 case GELIC_DESCR_DMA_FORCE_END:
02c18891
MM
488 if (printk_ratelimit())
489 dev_info(ctodev(card),
490 "%s: forcing end of tx descriptor " \
491 "with status %x\n",
492 __func__, status);
589866f9 493 netdev->stats.tx_dropped++;
02c18891
MM
494 break;
495
59e97327 496 case GELIC_DESCR_DMA_COMPLETE:
48544cc2 497 if (tx_chain->tail->skb) {
589866f9
MM
498 netdev->stats.tx_packets++;
499 netdev->stats.tx_bytes +=
48544cc2
MM
500 tx_chain->tail->skb->len;
501 }
02c18891
MM
502 break;
503
59e97327 504 case GELIC_DESCR_DMA_CARDOWNED:
02c18891
MM
505 /* pending tx request */
506 default:
59e97327 507 /* any other value (== GELIC_DESCR_DMA_NOT_IN_USE) */
48544cc2
MM
508 if (!stop)
509 goto out;
02c18891 510 }
59e97327 511 gelic_descr_release_tx(card, tx_chain->tail);
48544cc2 512 release ++;
02c18891
MM
513 }
514out:
173261ed 515 if (!stop && release)
589866f9 516 gelic_card_wake_queues(card);
02c18891
MM
517}
518
519/**
520 * gelic_net_set_multi - sets multicast addresses and promisc flags
521 * @netdev: interface device structure
522 *
523 * gelic_net_set_multi configures multicast addresses as needed for the
524 * netdev interface. It also sets up multicast, allmulti and promisc
525 * flags appropriately
526 */
589866f9 527void gelic_net_set_multi(struct net_device *netdev)
02c18891 528{
589866f9 529 struct gelic_card *card = netdev_card(netdev);
02c18891
MM
530 struct dev_mc_list *mc;
531 unsigned int i;
532 uint8_t *p;
533 u64 addr;
534 int status;
535
536 /* clear all multicast address */
537 status = lv1_net_remove_multicast_address(bus_id(card), dev_id(card),
538 0, 1);
539 if (status)
540 dev_err(ctodev(card),
541 "lv1_net_remove_multicast_address failed %d\n",
542 status);
543 /* set broadcast address */
544 status = lv1_net_add_multicast_address(bus_id(card), dev_id(card),
545 GELIC_NET_BROADCAST_ADDR, 0);
546 if (status)
547 dev_err(ctodev(card),
548 "lv1_net_add_multicast_address failed, %d\n",
549 status);
550
589866f9
MM
551 if ((netdev->flags & IFF_ALLMULTI) ||
552 (netdev->mc_count > GELIC_NET_MC_COUNT_MAX)) {
02c18891
MM
553 status = lv1_net_add_multicast_address(bus_id(card),
554 dev_id(card),
555 0, 1);
556 if (status)
557 dev_err(ctodev(card),
558 "lv1_net_add_multicast_address failed, %d\n",
559 status);
560 return;
561 }
562
589866f9 563 /* set multicast addresses */
02c18891
MM
564 for (mc = netdev->mc_list; mc; mc = mc->next) {
565 addr = 0;
566 p = mc->dmi_addr;
567 for (i = 0; i < ETH_ALEN; i++) {
568 addr <<= 8;
569 addr |= *p++;
570 }
571 status = lv1_net_add_multicast_address(bus_id(card),
572 dev_id(card),
573 addr, 0);
574 if (status)
575 dev_err(ctodev(card),
576 "lv1_net_add_multicast_address failed, %d\n",
577 status);
578 }
579}
580
581/**
59e97327 582 * gelic_card_enable_rxdmac - enables the receive DMA controller
02c18891
MM
583 * @card: card structure
584 *
59e97327 585 * gelic_card_enable_rxdmac enables the DMA controller by setting RX_DMA_EN
02c18891
MM
586 * in the GDADMACCNTR register
587 */
59e97327 588static inline void gelic_card_enable_rxdmac(struct gelic_card *card)
02c18891
MM
589{
590 int status;
591
589866f9
MM
592#ifdef DEBUG
593 if (gelic_descr_get_status(card->rx_chain.head) !=
594 GELIC_DESCR_DMA_CARDOWNED) {
595 printk(KERN_ERR "%s: status=%x\n", __func__,
596 be32_to_cpu(card->rx_chain.head->dmac_cmd_status));
597 printk(KERN_ERR "%s: nextphy=%x\n", __func__,
598 be32_to_cpu(card->rx_chain.head->next_descr_addr));
599 printk(KERN_ERR "%s: head=%p\n", __func__,
600 card->rx_chain.head);
601 }
602#endif
02c18891 603 status = lv1_net_start_rx_dma(bus_id(card), dev_id(card),
589866f9 604 card->rx_chain.head->bus_addr, 0);
02c18891
MM
605 if (status)
606 dev_info(ctodev(card),
607 "lv1_net_start_rx_dma failed, status=%d\n", status);
608}
609
610/**
59e97327 611 * gelic_card_disable_rxdmac - disables the receive DMA controller
02c18891
MM
612 * @card: card structure
613 *
59e97327 614 * gelic_card_disable_rxdmac terminates processing on the DMA controller by
02c18891
MM
615 * turing off DMA and issueing a force end
616 */
59e97327 617static inline void gelic_card_disable_rxdmac(struct gelic_card *card)
02c18891
MM
618{
619 int status;
620
621 /* this hvc blocks until the DMA in progress really stopped */
622 status = lv1_net_stop_rx_dma(bus_id(card), dev_id(card), 0);
623 if (status)
624 dev_err(ctodev(card),
625 "lv1_net_stop_rx_dma faild, %d\n", status);
626}
627
628/**
59e97327 629 * gelic_card_disable_txdmac - disables the transmit DMA controller
02c18891
MM
630 * @card: card structure
631 *
59e97327 632 * gelic_card_disable_txdmac terminates processing on the DMA controller by
02c18891
MM
633 * turing off DMA and issueing a force end
634 */
59e97327 635static inline void gelic_card_disable_txdmac(struct gelic_card *card)
02c18891
MM
636{
637 int status;
638
639 /* this hvc blocks until the DMA in progress really stopped */
640 status = lv1_net_stop_tx_dma(bus_id(card), dev_id(card), 0);
641 if (status)
642 dev_err(ctodev(card),
643 "lv1_net_stop_tx_dma faild, status=%d\n", status);
644}
645
646/**
647 * gelic_net_stop - called upon ifconfig down
648 * @netdev: interface device structure
649 *
650 * always returns 0
651 */
589866f9 652int gelic_net_stop(struct net_device *netdev)
02c18891 653{
589866f9 654 struct gelic_card *card;
02c18891 655
589866f9 656 pr_debug("%s: start\n", __func__);
02c18891 657
589866f9 658 netif_stop_queue(netdev);
02c18891
MM
659 netif_carrier_off(netdev);
660
589866f9
MM
661 card = netdev_card(netdev);
662 gelic_card_down(card);
02c18891 663
589866f9 664 pr_debug("%s: done\n", __func__);
02c18891
MM
665 return 0;
666}
667
668/**
59e97327 669 * gelic_card_get_next_tx_descr - returns the next available tx descriptor
02c18891
MM
670 * @card: device structure to get descriptor from
671 *
672 * returns the address of the next descriptor, or NULL if not available.
673 */
59e97327
MM
674static struct gelic_descr *
675gelic_card_get_next_tx_descr(struct gelic_card *card)
02c18891
MM
676{
677 if (!card->tx_chain.head)
678 return NULL;
173261ed 679 /* see if the next descriptor is free */
02c18891 680 if (card->tx_chain.tail != card->tx_chain.head->next &&
59e97327
MM
681 gelic_descr_get_status(card->tx_chain.head) ==
682 GELIC_DESCR_DMA_NOT_IN_USE)
02c18891
MM
683 return card->tx_chain.head;
684 else
685 return NULL;
686
687}
688
689/**
589866f9 690 * gelic_net_set_txdescr_cmdstat - sets the tx descriptor command field
02c18891
MM
691 * @descr: descriptor structure to fill out
692 * @skb: packet to consider
02c18891
MM
693 *
694 * fills out the command and status field of the descriptor structure,
695 * depending on hardware checksum settings. This function assumes a wmb()
696 * has executed before.
697 */
59e97327
MM
698static void gelic_descr_set_tx_cmdstat(struct gelic_descr *descr,
699 struct sk_buff *skb)
02c18891 700{
02c18891 701 if (skb->ip_summed != CHECKSUM_PARTIAL)
100e1d89 702 descr->dmac_cmd_status =
59e97327
MM
703 cpu_to_be32(GELIC_DESCR_DMA_CMD_NO_CHKSUM |
704 GELIC_DESCR_TX_DMA_FRAME_TAIL);
02c18891
MM
705 else {
706 /* is packet ip?
707 * if yes: tcp? udp? */
708 if (skb->protocol == htons(ETH_P_IP)) {
709 if (ip_hdr(skb)->protocol == IPPROTO_TCP)
710 descr->dmac_cmd_status =
59e97327
MM
711 cpu_to_be32(GELIC_DESCR_DMA_CMD_TCP_CHKSUM |
712 GELIC_DESCR_TX_DMA_FRAME_TAIL);
173261ed 713
02c18891
MM
714 else if (ip_hdr(skb)->protocol == IPPROTO_UDP)
715 descr->dmac_cmd_status =
59e97327
MM
716 cpu_to_be32(GELIC_DESCR_DMA_CMD_UDP_CHKSUM |
717 GELIC_DESCR_TX_DMA_FRAME_TAIL);
02c18891
MM
718 else /*
719 * the stack should checksum non-tcp and non-udp
720 * packets on his own: NETIF_F_IP_CSUM
721 */
722 descr->dmac_cmd_status =
59e97327
MM
723 cpu_to_be32(GELIC_DESCR_DMA_CMD_NO_CHKSUM |
724 GELIC_DESCR_TX_DMA_FRAME_TAIL);
02c18891
MM
725 }
726 }
727}
728
173261ed
MM
729static inline struct sk_buff *gelic_put_vlan_tag(struct sk_buff *skb,
730 unsigned short tag)
731{
732 struct vlan_ethhdr *veth;
733 static unsigned int c;
734
735 if (skb_headroom(skb) < VLAN_HLEN) {
736 struct sk_buff *sk_tmp = skb;
737 pr_debug("%s: hd=%d c=%ud\n", __func__, skb_headroom(skb), c);
738 skb = skb_realloc_headroom(sk_tmp, VLAN_HLEN);
739 if (!skb)
740 return NULL;
741 dev_kfree_skb_any(sk_tmp);
742 }
743 veth = (struct vlan_ethhdr *)skb_push(skb, VLAN_HLEN);
744
745 /* Move the mac addresses to the top of buffer */
746 memmove(skb->data, skb->data + VLAN_HLEN, 2 * ETH_ALEN);
747
748 veth->h_vlan_proto = __constant_htons(ETH_P_8021Q);
749 veth->h_vlan_TCI = htons(tag);
750
751 return skb;
752}
753
02c18891 754/**
589866f9 755 * gelic_descr_prepare_tx - setup a descriptor for sending packets
02c18891
MM
756 * @card: card structure
757 * @descr: descriptor structure
758 * @skb: packet to use
759 *
760 * returns 0 on success, <0 on failure.
761 *
762 */
59e97327
MM
763static int gelic_descr_prepare_tx(struct gelic_card *card,
764 struct gelic_descr *descr,
765 struct sk_buff *skb)
02c18891 766{
173261ed 767 dma_addr_t buf;
02c18891 768
589866f9 769 if (card->vlan_required) {
173261ed 770 struct sk_buff *skb_tmp;
589866f9
MM
771 enum gelic_port_type type;
772
773 type = netdev_port(skb->dev)->type;
173261ed 774 skb_tmp = gelic_put_vlan_tag(skb,
589866f9 775 card->vlan[type].tx);
173261ed
MM
776 if (!skb_tmp)
777 return -ENOMEM;
778 skb = skb_tmp;
02c18891
MM
779 }
780
173261ed 781 buf = dma_map_single(ctodev(card), skb->data, skb->len, DMA_TO_DEVICE);
02c18891 782
173261ed 783 if (!buf) {
02c18891
MM
784 dev_err(ctodev(card),
785 "dma map 2 failed (%p, %i). Dropping packet\n",
173261ed 786 skb->data, skb->len);
02c18891
MM
787 return -ENOMEM;
788 }
789
100e1d89
MM
790 descr->buf_addr = cpu_to_be32(buf);
791 descr->buf_size = cpu_to_be32(skb->len);
173261ed 792 descr->skb = skb;
02c18891 793 descr->data_status = 0;
173261ed 794 descr->next_descr_addr = 0; /* terminate hw descr */
59e97327 795 gelic_descr_set_tx_cmdstat(descr, skb);
48544cc2
MM
796
797 /* bump free descriptor pointer */
173261ed 798 card->tx_chain.head = descr->next;
02c18891
MM
799 return 0;
800}
801
802/**
59e97327 803 * gelic_card_kick_txdma - enables TX DMA processing
02c18891
MM
804 * @card: card structure
805 * @descr: descriptor address to enable TX processing at
806 *
807 */
59e97327
MM
808static int gelic_card_kick_txdma(struct gelic_card *card,
809 struct gelic_descr *descr)
02c18891 810{
48544cc2 811 int status = 0;
02c18891
MM
812
813 if (card->tx_dma_progress)
814 return 0;
815
59e97327 816 if (gelic_descr_get_status(descr) == GELIC_DESCR_DMA_CARDOWNED) {
02c18891 817 card->tx_dma_progress = 1;
dc029ad9
MM
818 status = lv1_net_start_tx_dma(bus_id(card), dev_id(card),
819 descr->bus_addr, 0);
820 if (status)
02c18891 821 dev_info(ctodev(card), "lv1_net_start_txdma failed," \
dc029ad9 822 "status=%d\n", status);
02c18891
MM
823 }
824 return status;
825}
826
827/**
828 * gelic_net_xmit - transmits a frame over the device
829 * @skb: packet to send out
830 * @netdev: interface device structure
831 *
832 * returns 0 on success, <0 on failure
833 */
589866f9 834int gelic_net_xmit(struct sk_buff *skb, struct net_device *netdev)
02c18891 835{
589866f9 836 struct gelic_card *card = netdev_card(netdev);
59e97327 837 struct gelic_descr *descr;
02c18891
MM
838 int result;
839 unsigned long flags;
840
589866f9 841 spin_lock_irqsave(&card->tx_lock, flags);
02c18891 842
59e97327 843 gelic_card_release_tx_chain(card, 0);
48544cc2 844
59e97327 845 descr = gelic_card_get_next_tx_descr(card);
02c18891 846 if (!descr) {
48544cc2
MM
847 /*
848 * no more descriptors free
849 */
589866f9
MM
850 gelic_card_stop_queues(card);
851 spin_unlock_irqrestore(&card->tx_lock, flags);
02c18891
MM
852 return NETDEV_TX_BUSY;
853 }
02c18891 854
59e97327 855 result = gelic_descr_prepare_tx(card, descr, skb);
48544cc2
MM
856 if (result) {
857 /*
858 * DMA map failed. As chanses are that failure
859 * would continue, just release skb and return
860 */
589866f9 861 netdev->stats.tx_dropped++;
48544cc2 862 dev_kfree_skb_any(skb);
589866f9 863 spin_unlock_irqrestore(&card->tx_lock, flags);
48544cc2
MM
864 return NETDEV_TX_OK;
865 }
866 /*
867 * link this prepared descriptor to previous one
868 * to achieve high performance
869 */
100e1d89 870 descr->prev->next_descr_addr = cpu_to_be32(descr->bus_addr);
02c18891
MM
871 /*
872 * as hardware descriptor is modified in the above lines,
873 * ensure that the hardware sees it
874 */
875 wmb();
59e97327 876 if (gelic_card_kick_txdma(card, descr)) {
48544cc2
MM
877 /*
878 * kick failed.
879 * release descriptors which were just prepared
880 */
589866f9 881 netdev->stats.tx_dropped++;
59e97327
MM
882 gelic_descr_release_tx(card, descr);
883 gelic_descr_release_tx(card, descr->next);
48544cc2
MM
884 card->tx_chain.tail = descr->next->next;
885 dev_info(ctodev(card), "%s: kick failure\n", __func__);
886 } else {
887 /* OK, DMA started/reserved */
888 netdev->trans_start = jiffies;
889 }
02c18891 890
589866f9 891 spin_unlock_irqrestore(&card->tx_lock, flags);
02c18891 892 return NETDEV_TX_OK;
02c18891
MM
893}
894
895/**
896 * gelic_net_pass_skb_up - takes an skb from a descriptor and passes it on
897 * @descr: descriptor to process
898 * @card: card structure
589866f9 899 * @netdev: net_device structure to be passed packet
02c18891
MM
900 *
901 * iommu-unmaps the skb, fills out skb structure and passes the data to the
902 * stack. The descriptor state is not changed.
903 */
59e97327 904static void gelic_net_pass_skb_up(struct gelic_descr *descr,
589866f9
MM
905 struct gelic_card *card,
906 struct net_device *netdev)
907
02c18891 908{
589866f9 909 struct sk_buff *skb = descr->skb;
02c18891
MM
910 u32 data_status, data_error;
911
100e1d89
MM
912 data_status = be32_to_cpu(descr->data_status);
913 data_error = be32_to_cpu(descr->data_error);
02c18891 914 /* unmap skb buffer */
589866f9
MM
915 dma_unmap_single(ctodev(card), be32_to_cpu(descr->buf_addr),
916 GELIC_NET_MAX_MTU,
02c18891
MM
917 DMA_FROM_DEVICE);
918
589866f9 919 skb_put(skb, be32_to_cpu(descr->valid_size)?
100e1d89
MM
920 be32_to_cpu(descr->valid_size) :
921 be32_to_cpu(descr->result_size));
02c18891
MM
922 if (!descr->valid_size)
923 dev_info(ctodev(card), "buffer full %x %x %x\n",
100e1d89
MM
924 be32_to_cpu(descr->result_size),
925 be32_to_cpu(descr->buf_size),
926 be32_to_cpu(descr->dmac_cmd_status));
02c18891
MM
927
928 descr->skb = NULL;
929 /*
930 * the card put 2 bytes vlan tag in front
931 * of the ethernet frame
932 */
933 skb_pull(skb, 2);
934 skb->protocol = eth_type_trans(skb, netdev);
935
936 /* checksum offload */
937 if (card->rx_csum) {
59e97327
MM
938 if ((data_status & GELIC_DESCR_DATA_STATUS_CHK_MASK) &&
939 (!(data_error & GELIC_DESCR_DATA_ERROR_CHK_MASK)))
02c18891
MM
940 skb->ip_summed = CHECKSUM_UNNECESSARY;
941 else
942 skb->ip_summed = CHECKSUM_NONE;
943 } else
944 skb->ip_summed = CHECKSUM_NONE;
945
946 /* update netdevice statistics */
589866f9
MM
947 netdev->stats.rx_packets++;
948 netdev->stats.rx_bytes += skb->len;
02c18891
MM
949
950 /* pass skb up to stack */
951 netif_receive_skb(skb);
952}
953
954/**
59e97327 955 * gelic_card_decode_one_descr - processes an rx descriptor
02c18891
MM
956 * @card: card structure
957 *
958 * returns 1 if a packet has been sent to the stack, otherwise 0
959 *
960 * processes an rx descriptor by iommu-unmapping the data buffer and passing
961 * the packet up to the stack
962 */
59e97327 963static int gelic_card_decode_one_descr(struct gelic_card *card)
02c18891 964{
59e97327
MM
965 enum gelic_descr_dma_status status;
966 struct gelic_descr_chain *chain = &card->rx_chain;
589866f9
MM
967 struct gelic_descr *descr = chain->head;
968 struct net_device *netdev = NULL;
02c18891
MM
969 int dmac_chain_ended;
970
59e97327 971 status = gelic_descr_get_status(descr);
02c18891
MM
972 /* is this descriptor terminated with next_descr == NULL? */
973 dmac_chain_ended =
100e1d89 974 be32_to_cpu(descr->dmac_cmd_status) &
59e97327 975 GELIC_DESCR_RX_DMA_CHAIN_END;
02c18891 976
59e97327 977 if (status == GELIC_DESCR_DMA_CARDOWNED)
02c18891
MM
978 return 0;
979
59e97327 980 if (status == GELIC_DESCR_DMA_NOT_IN_USE) {
02c18891
MM
981 dev_dbg(ctodev(card), "dormant descr? %p\n", descr);
982 return 0;
983 }
984
589866f9
MM
985 /* netdevice select */
986 if (card->vlan_required) {
987 unsigned int i;
988 u16 vid;
989 vid = *(u16 *)(descr->skb->data) & VLAN_VID_MASK;
990 for (i = 0; i < GELIC_PORT_MAX; i++) {
991 if (card->vlan[i].rx == vid) {
992 netdev = card->netdev[i];
993 break;
994 }
995 };
996 if (GELIC_PORT_MAX <= i) {
997 pr_info("%s: unknown packet vid=%x\n", __func__, vid);
998 goto refill;
999 }
1000 } else
1001 netdev = card->netdev[GELIC_PORT_ETHERNET];
1002
59e97327
MM
1003 if ((status == GELIC_DESCR_DMA_RESPONSE_ERROR) ||
1004 (status == GELIC_DESCR_DMA_PROTECTION_ERROR) ||
1005 (status == GELIC_DESCR_DMA_FORCE_END)) {
02c18891
MM
1006 dev_info(ctodev(card), "dropping RX descriptor with state %x\n",
1007 status);
589866f9 1008 netdev->stats.rx_dropped++;
02c18891
MM
1009 goto refill;
1010 }
1011
59e97327 1012 if (status == GELIC_DESCR_DMA_BUFFER_FULL) {
fe6d3a40
MM
1013 /*
1014 * Buffer full would occur if and only if
1015 * the frame length was longer than the size of this
1016 * descriptor's buffer. If the frame length was equal
1017 * to or shorter than buffer'size, FRAME_END condition
1018 * would occur.
1019 * Anyway this frame was longer than the MTU,
1020 * just drop it.
1021 */
1022 dev_info(ctodev(card), "overlength frame\n");
1023 goto refill;
1024 }
1025 /*
1026 * descriptoers any other than FRAME_END here should
1027 * be treated as error.
1028 */
59e97327 1029 if (status != GELIC_DESCR_DMA_FRAME_END) {
02c18891
MM
1030 dev_dbg(ctodev(card), "RX descriptor with state %x\n",
1031 status);
1032 goto refill;
1033 }
1034
1035 /* ok, we've got a packet in descr */
589866f9 1036 gelic_net_pass_skb_up(descr, card, netdev);
02c18891 1037refill:
fe6d3a40
MM
1038 /*
1039 * So that always DMAC can see the end
1040 * of the descriptor chain to avoid
1041 * from unwanted DMAC overrun.
1042 */
1043 descr->next_descr_addr = 0;
02c18891
MM
1044
1045 /* change the descriptor state: */
59e97327 1046 gelic_descr_set_status(descr, GELIC_DESCR_DMA_NOT_IN_USE);
02c18891 1047
fe6d3a40
MM
1048 /*
1049 * this call can fail, but for now, just leave this
1050 * decriptor without skb
02c18891 1051 */
59e97327 1052 gelic_descr_prepare_rx(card, descr);
fe6d3a40 1053
589866f9
MM
1054 chain->tail = descr;
1055 chain->head = descr->next;
fe6d3a40
MM
1056
1057 /*
1058 * Set this descriptor the end of the chain.
1059 */
100e1d89 1060 descr->prev->next_descr_addr = cpu_to_be32(descr->bus_addr);
02c18891 1061
fe6d3a40
MM
1062 /*
1063 * If dmac chain was met, DMAC stopped.
1064 * thus re-enable it
1065 */
02c18891 1066 if (dmac_chain_ended) {
583aae10
MM
1067 card->rx_dma_restart_required = 1;
1068 dev_dbg(ctodev(card), "reenable rx dma scheduled\n");
02c18891
MM
1069 }
1070
1071 return 1;
1072}
1073
1074/**
1075 * gelic_net_poll - NAPI poll function called by the stack to return packets
589866f9 1076 * @napi: napi structure
02c18891
MM
1077 * @budget: number of packets we can pass to the stack at most
1078 *
589866f9 1079 * returns the number of the processed packets
02c18891
MM
1080 *
1081 */
bea3348e 1082static int gelic_net_poll(struct napi_struct *napi, int budget)
02c18891 1083{
59e97327 1084 struct gelic_card *card = container_of(napi, struct gelic_card, napi);
bea3348e 1085 int packets_done = 0;
02c18891 1086
bea3348e 1087 while (packets_done < budget) {
59e97327 1088 if (!gelic_card_decode_one_descr(card))
02c18891 1089 break;
bea3348e
SH
1090
1091 packets_done++;
02c18891 1092 }
bea3348e
SH
1093
1094 if (packets_done < budget) {
589866f9 1095 napi_complete(napi);
59e97327 1096 gelic_card_rx_irq_on(card);
bea3348e
SH
1097 }
1098 return packets_done;
02c18891 1099}
02c18891
MM
1100/**
1101 * gelic_net_change_mtu - changes the MTU of an interface
1102 * @netdev: interface device structure
1103 * @new_mtu: new MTU value
1104 *
1105 * returns 0 on success, <0 on failure
1106 */
589866f9 1107int gelic_net_change_mtu(struct net_device *netdev, int new_mtu)
02c18891
MM
1108{
1109 /* no need to re-alloc skbs or so -- the max mtu is about 2.3k
1110 * and mtu is outbound only anyway */
1111 if ((new_mtu < GELIC_NET_MIN_MTU) ||
1112 (new_mtu > GELIC_NET_MAX_MTU)) {
1113 return -EINVAL;
1114 }
1115 netdev->mtu = new_mtu;
1116 return 0;
1117}
1118
1119/**
59e97327 1120 * gelic_card_interrupt - event handler for gelic_net
02c18891 1121 */
59e97327 1122static irqreturn_t gelic_card_interrupt(int irq, void *ptr)
02c18891
MM
1123{
1124 unsigned long flags;
589866f9 1125 struct gelic_card *card = ptr;
02c18891
MM
1126 u64 status;
1127
1128 status = card->irq_status;
1129
1130 if (!status)
1131 return IRQ_NONE;
1132
589866f9
MM
1133 status &= card->irq_mask;
1134
583aae10
MM
1135 if (card->rx_dma_restart_required) {
1136 card->rx_dma_restart_required = 0;
59e97327 1137 gelic_card_enable_rxdmac(card);
583aae10
MM
1138 }
1139
59e97327
MM
1140 if (status & GELIC_CARD_RXINT) {
1141 gelic_card_rx_irq_off(card);
589866f9 1142 napi_schedule(&card->napi);
02c18891
MM
1143 }
1144
59e97327 1145 if (status & GELIC_CARD_TXINT) {
589866f9 1146 spin_lock_irqsave(&card->tx_lock, flags);
02c18891 1147 card->tx_dma_progress = 0;
59e97327 1148 gelic_card_release_tx_chain(card, 0);
48544cc2 1149 /* kick outstanding tx descriptor if any */
59e97327 1150 gelic_card_kick_txdma(card, card->tx_chain.tail);
589866f9 1151 spin_unlock_irqrestore(&card->tx_lock, flags);
02c18891 1152 }
01fed4c2
MM
1153
1154 /* ether port status changed */
1155 if (status & GELIC_CARD_PORT_STATUS_CHANGED)
1156 gelic_card_get_ether_port_status(card, 1);
589866f9 1157
09dde54c
MM
1158#ifdef CONFIG_GELIC_WIRELESS
1159 if (status & (GELIC_CARD_WLAN_EVENT_RECEIVED |
1160 GELIC_CARD_WLAN_COMMAND_COMPLETED))
1161 gelic_wl_interrupt(card->netdev[GELIC_PORT_WIRELESS], status);
1162#endif
1163
02c18891
MM
1164 return IRQ_HANDLED;
1165}
1166
1167#ifdef CONFIG_NET_POLL_CONTROLLER
1168/**
1169 * gelic_net_poll_controller - artificial interrupt for netconsole etc.
1170 * @netdev: interface device structure
1171 *
1172 * see Documentation/networking/netconsole.txt
1173 */
589866f9 1174void gelic_net_poll_controller(struct net_device *netdev)
02c18891 1175{
589866f9 1176 struct gelic_card *card = netdev_card(netdev);
02c18891 1177
59e97327
MM
1178 gelic_card_set_irq_mask(card, 0);
1179 gelic_card_interrupt(netdev->irq, netdev);
589866f9 1180 gelic_card_set_irq_mask(card, card->irq_mask);
02c18891
MM
1181}
1182#endif /* CONFIG_NET_POLL_CONTROLLER */
1183
02c18891
MM
1184/**
1185 * gelic_net_open - called upon ifonfig up
1186 * @netdev: interface device structure
1187 *
1188 * returns 0 on success, <0 on failure
1189 *
1190 * gelic_net_open allocates all the descriptors and memory needed for
1191 * operation, sets up multicast list and enables interrupts
1192 */
589866f9 1193int gelic_net_open(struct net_device *netdev)
02c18891 1194{
589866f9 1195 struct gelic_card *card = netdev_card(netdev);
02c18891 1196
589866f9 1197 dev_dbg(ctodev(card), " -> %s %p\n", __func__, netdev);
02c18891 1198
589866f9 1199 gelic_card_up(card);
02c18891
MM
1200
1201 netif_start_queue(netdev);
01fed4c2 1202 gelic_card_get_ether_port_status(card, 1);
02c18891 1203
589866f9 1204 dev_dbg(ctodev(card), " <- %s\n", __func__);
02c18891 1205 return 0;
02c18891
MM
1206}
1207
589866f9
MM
1208void gelic_net_get_drvinfo(struct net_device *netdev,
1209 struct ethtool_drvinfo *info)
02c18891
MM
1210{
1211 strncpy(info->driver, DRV_NAME, sizeof(info->driver) - 1);
1212 strncpy(info->version, DRV_VERSION, sizeof(info->version) - 1);
1213}
1214
59e97327
MM
1215static int gelic_ether_get_settings(struct net_device *netdev,
1216 struct ethtool_cmd *cmd)
02c18891 1217{
589866f9 1218 struct gelic_card *card = netdev_card(netdev);
02c18891 1219
01fed4c2
MM
1220 gelic_card_get_ether_port_status(card, 0);
1221
1222 if (card->ether_port_status & GELIC_LV1_ETHER_FULL_DUPLEX)
1223 cmd->duplex = DUPLEX_FULL;
1224 else
1225 cmd->duplex = DUPLEX_HALF;
1226
1227 switch (card->ether_port_status & GELIC_LV1_ETHER_SPEED_MASK) {
1228 case GELIC_LV1_ETHER_SPEED_10:
1229 cmd->speed = SPEED_10;
1230 break;
1231 case GELIC_LV1_ETHER_SPEED_100:
1232 cmd->speed = SPEED_100;
1233 break;
1234 case GELIC_LV1_ETHER_SPEED_1000:
1235 cmd->speed = SPEED_1000;
1236 break;
1237 default:
1238 pr_info("%s: speed unknown\n", __func__);
1239 cmd->speed = SPEED_10;
1240 break;
02c18891 1241 }
01fed4c2 1242
02c18891
MM
1243 cmd->supported = SUPPORTED_TP | SUPPORTED_Autoneg |
1244 SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
1245 SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
1246 SUPPORTED_1000baseT_Half | SUPPORTED_1000baseT_Full;
1247 cmd->advertising = cmd->supported;
02c18891
MM
1248 cmd->autoneg = AUTONEG_ENABLE; /* always enabled */
1249 cmd->port = PORT_TP;
1250
1251 return 0;
1252}
1253
589866f9 1254u32 gelic_net_get_rx_csum(struct net_device *netdev)
02c18891 1255{
589866f9 1256 struct gelic_card *card = netdev_card(netdev);
02c18891
MM
1257
1258 return card->rx_csum;
1259}
1260
589866f9 1261int gelic_net_set_rx_csum(struct net_device *netdev, u32 data)
02c18891 1262{
589866f9 1263 struct gelic_card *card = netdev_card(netdev);
02c18891
MM
1264
1265 card->rx_csum = data;
1266 return 0;
1267}
1268
3faac215
MM
1269static void gelic_net_get_wol(struct net_device *netdev,
1270 struct ethtool_wolinfo *wol)
1271{
1272 if (0 <= ps3_compare_firmware_version(2, 2, 0))
1273 wol->supported = WAKE_MAGIC;
1274 else
1275 wol->supported = 0;
1276
1277 wol->wolopts = ps3_sys_manager_get_wol() ? wol->supported : 0;
1278 memset(&wol->sopass, 0, sizeof(wol->sopass));
1279}
1280static int gelic_net_set_wol(struct net_device *netdev,
1281 struct ethtool_wolinfo *wol)
1282{
1283 int status;
1284 struct gelic_card *card;
1285 u64 v1, v2;
1286
1287 if (ps3_compare_firmware_version(2, 2, 0) < 0 ||
1288 !capable(CAP_NET_ADMIN))
1289 return -EPERM;
1290
1291 if (wol->wolopts & ~WAKE_MAGIC)
1292 return -EINVAL;
1293
1294 card = netdev_card(netdev);
1295 if (wol->wolopts & WAKE_MAGIC) {
1296 status = lv1_net_control(bus_id(card), dev_id(card),
1297 GELIC_LV1_SET_WOL,
1298 GELIC_LV1_WOL_MAGIC_PACKET,
1299 0, GELIC_LV1_WOL_MP_ENABLE,
1300 &v1, &v2);
1301 if (status) {
1302 pr_info("%s: enabling WOL failed %d\n", __func__,
1303 status);
1304 status = -EIO;
1305 goto done;
1306 }
1307 status = lv1_net_control(bus_id(card), dev_id(card),
1308 GELIC_LV1_SET_WOL,
1309 GELIC_LV1_WOL_ADD_MATCH_ADDR,
1310 0, GELIC_LV1_WOL_MATCH_ALL,
1311 &v1, &v2);
1312 if (!status)
1313 ps3_sys_manager_set_wol(1);
1314 else {
1315 pr_info("%s: enabling WOL filter failed %d\n",
1316 __func__, status);
1317 status = -EIO;
1318 }
1319 } else {
1320 status = lv1_net_control(bus_id(card), dev_id(card),
1321 GELIC_LV1_SET_WOL,
1322 GELIC_LV1_WOL_MAGIC_PACKET,
1323 0, GELIC_LV1_WOL_MP_DISABLE,
1324 &v1, &v2);
1325 if (status) {
1326 pr_info("%s: disabling WOL failed %d\n", __func__,
1327 status);
1328 status = -EIO;
1329 goto done;
1330 }
1331 status = lv1_net_control(bus_id(card), dev_id(card),
1332 GELIC_LV1_SET_WOL,
1333 GELIC_LV1_WOL_DELETE_MATCH_ADDR,
1334 0, GELIC_LV1_WOL_MATCH_ALL,
1335 &v1, &v2);
1336 if (!status)
1337 ps3_sys_manager_set_wol(0);
1338 else {
1339 pr_info("%s: removing WOL filter failed %d\n",
1340 __func__, status);
1341 status = -EIO;
1342 }
1343 }
1344done:
1345 return status;
1346}
1347
589866f9 1348static struct ethtool_ops gelic_ether_ethtool_ops = {
02c18891 1349 .get_drvinfo = gelic_net_get_drvinfo,
59e97327 1350 .get_settings = gelic_ether_get_settings,
7bc56b92 1351 .get_link = ethtool_op_get_link,
7bc56b92
MM
1352 .get_tx_csum = ethtool_op_get_tx_csum,
1353 .set_tx_csum = ethtool_op_set_tx_csum,
02c18891
MM
1354 .get_rx_csum = gelic_net_get_rx_csum,
1355 .set_rx_csum = gelic_net_set_rx_csum,
3faac215
MM
1356 .get_wol = gelic_net_get_wol,
1357 .set_wol = gelic_net_set_wol,
02c18891 1358};
02c18891
MM
1359
1360/**
1361 * gelic_net_tx_timeout_task - task scheduled by the watchdog timeout
1362 * function (to be called not under interrupt status)
1363 * @work: work is context of tx timout task
1364 *
1365 * called as task when tx hangs, resets interface (if interface is up)
1366 */
1367static void gelic_net_tx_timeout_task(struct work_struct *work)
1368{
59e97327
MM
1369 struct gelic_card *card =
1370 container_of(work, struct gelic_card, tx_timeout_task);
589866f9 1371 struct net_device *netdev = card->netdev[GELIC_PORT_ETHERNET];
02c18891
MM
1372
1373 dev_info(ctodev(card), "%s:Timed out. Restarting... \n", __func__);
1374
1375 if (!(netdev->flags & IFF_UP))
1376 goto out;
1377
1378 netif_device_detach(netdev);
1379 gelic_net_stop(netdev);
1380
1381 gelic_net_open(netdev);
1382 netif_device_attach(netdev);
1383
1384out:
1385 atomic_dec(&card->tx_timeout_task_counter);
1386}
1387
1388/**
1389 * gelic_net_tx_timeout - called when the tx timeout watchdog kicks in.
1390 * @netdev: interface device structure
1391 *
1392 * called, if tx hangs. Schedules a task that resets the interface
1393 */
589866f9 1394void gelic_net_tx_timeout(struct net_device *netdev)
02c18891 1395{
59e97327 1396 struct gelic_card *card;
02c18891 1397
589866f9 1398 card = netdev_card(netdev);
02c18891
MM
1399 atomic_inc(&card->tx_timeout_task_counter);
1400 if (netdev->flags & IFF_UP)
1401 schedule_work(&card->tx_timeout_task);
1402 else
1403 atomic_dec(&card->tx_timeout_task_counter);
1404}
1405
1406/**
59e97327 1407 * gelic_ether_setup_netdev_ops - initialization of net_device operations
02c18891
MM
1408 * @netdev: net_device structure
1409 *
1410 * fills out function pointers in the net_device structure
1411 */
589866f9
MM
1412static void gelic_ether_setup_netdev_ops(struct net_device *netdev,
1413 struct napi_struct *napi)
02c18891
MM
1414{
1415 netdev->open = &gelic_net_open;
1416 netdev->stop = &gelic_net_stop;
1417 netdev->hard_start_xmit = &gelic_net_xmit;
02c18891
MM
1418 netdev->set_multicast_list = &gelic_net_set_multi;
1419 netdev->change_mtu = &gelic_net_change_mtu;
1420 /* tx watchdog */
1421 netdev->tx_timeout = &gelic_net_tx_timeout;
1422 netdev->watchdog_timeo = GELIC_NET_WATCHDOG_TIMEOUT;
589866f9
MM
1423 /* NAPI */
1424 netif_napi_add(netdev, napi,
1425 gelic_net_poll, GELIC_NET_NAPI_WEIGHT);
1426 netdev->ethtool_ops = &gelic_ether_ethtool_ops;
1427#ifdef CONFIG_NET_POLL_CONTROLLER
1428 netdev->poll_controller = gelic_net_poll_controller;
1429#endif
02c18891
MM
1430}
1431
1432/**
589866f9
MM
1433 * gelic_ether_setup_netdev - initialization of net_device
1434 * @netdev: net_device structure
02c18891
MM
1435 * @card: card structure
1436 *
1437 * Returns 0 on success or <0 on failure
1438 *
589866f9
MM
1439 * gelic_ether_setup_netdev initializes the net_device structure
1440 * and register it.
02c18891 1441 **/
589866f9 1442int gelic_net_setup_netdev(struct net_device *netdev, struct gelic_card *card)
02c18891 1443{
02c18891
MM
1444 int status;
1445 u64 v1, v2;
0795af57 1446 DECLARE_MAC_BUF(mac);
02c18891 1447
02c18891
MM
1448 netdev->features = NETIF_F_IP_CSUM;
1449
1450 status = lv1_net_control(bus_id(card), dev_id(card),
59e97327 1451 GELIC_LV1_GET_MAC_ADDRESS,
02c18891 1452 0, 0, 0, &v1, &v2);
589866f9 1453 v1 <<= 16;
02c18891
MM
1454 if (status || !is_valid_ether_addr((u8 *)&v1)) {
1455 dev_info(ctodev(card),
1456 "%s:lv1_net_control GET_MAC_ADDR failed %d\n",
1457 __func__, status);
1458 return -EINVAL;
1459 }
589866f9 1460 memcpy(netdev->dev_addr, &v1, ETH_ALEN);
173261ed 1461
589866f9 1462 if (card->vlan_required) {
173261ed 1463 netdev->hard_header_len += VLAN_HLEN;
589866f9
MM
1464 /*
1465 * As vlan is internally used,
1466 * we can not receive vlan packets
1467 */
1468 netdev->features |= NETIF_F_VLAN_CHALLENGED;
173261ed 1469 }
02c18891
MM
1470
1471 status = register_netdev(netdev);
1472 if (status) {
589866f9
MM
1473 dev_err(ctodev(card), "%s:Couldn't register %s %d\n",
1474 __func__, netdev->name, status);
02c18891
MM
1475 return status;
1476 }
589866f9
MM
1477 dev_info(ctodev(card), "%s: MAC addr %s\n",
1478 netdev->name,
1479 print_mac(mac, netdev->dev_addr));
02c18891
MM
1480
1481 return 0;
1482}
1483
1484/**
59e97327 1485 * gelic_alloc_card_net - allocates net_device and card structure
02c18891
MM
1486 *
1487 * returns the card structure or NULL in case of errors
1488 *
1489 * the card and net_device structures are linked to each other
1490 */
589866f9
MM
1491#define GELIC_ALIGN (32)
1492static struct gelic_card *gelic_alloc_card_net(struct net_device **netdev)
02c18891 1493{
59e97327 1494 struct gelic_card *card;
589866f9
MM
1495 struct gelic_port *port;
1496 void *p;
02c18891 1497 size_t alloc_size;
02c18891 1498 /*
589866f9
MM
1499 * gelic requires dma descriptor is 32 bytes aligned and
1500 * the hypervisor requires irq_status is 8 bytes aligned.
02c18891 1501 */
59e97327
MM
1502 BUILD_BUG_ON(offsetof(struct gelic_card, irq_status) % 8);
1503 BUILD_BUG_ON(offsetof(struct gelic_card, descr) % 32);
589866f9
MM
1504 alloc_size =
1505 sizeof(struct gelic_card) +
1506 sizeof(struct gelic_descr) * GELIC_NET_RX_DESCRIPTORS +
1507 sizeof(struct gelic_descr) * GELIC_NET_TX_DESCRIPTORS +
1508 GELIC_ALIGN - 1;
02c18891 1509
589866f9
MM
1510 p = kzalloc(alloc_size, GFP_KERNEL);
1511 if (!p)
02c18891 1512 return NULL;
589866f9
MM
1513 card = PTR_ALIGN(p, GELIC_ALIGN);
1514 card->unalign = p;
1515
1516 /*
1517 * alloc netdev
1518 */
1519 *netdev = alloc_etherdev(sizeof(struct gelic_port));
1520 if (!netdev) {
1521 kfree(card->unalign);
1522 return NULL;
1523 }
1524 port = netdev_priv(*netdev);
1525
1526 /* gelic_port */
1527 port->netdev = *netdev;
1528 port->card = card;
1529 port->type = GELIC_PORT_ETHERNET;
1530
1531 /* gelic_card */
1532 card->netdev[GELIC_PORT_ETHERNET] = *netdev;
02c18891 1533
02c18891
MM
1534 INIT_WORK(&card->tx_timeout_task, gelic_net_tx_timeout_task);
1535 init_waitqueue_head(&card->waitq);
1536 atomic_set(&card->tx_timeout_task_counter, 0);
2914f3ef 1537 mutex_init(&card->updown_lock);
589866f9 1538 atomic_set(&card->users, 0);
02c18891
MM
1539
1540 return card;
1541}
1542
589866f9
MM
1543static void gelic_card_get_vlan_info(struct gelic_card *card)
1544{
1545 u64 v1, v2;
1546 int status;
1547 unsigned int i;
1548 struct {
1549 int tx;
1550 int rx;
1551 } vlan_id_ix[2] = {
1552 [GELIC_PORT_ETHERNET] = {
1553 .tx = GELIC_LV1_VLAN_TX_ETHERNET,
1554 .rx = GELIC_LV1_VLAN_RX_ETHERNET
1555 },
1556 [GELIC_PORT_WIRELESS] = {
1557 .tx = GELIC_LV1_VLAN_TX_WIRELESS,
1558 .rx = GELIC_LV1_VLAN_RX_WIRELESS
1559 }
1560 };
1561
1562 for (i = 0; i < ARRAY_SIZE(vlan_id_ix); i++) {
1563 /* tx tag */
1564 status = lv1_net_control(bus_id(card), dev_id(card),
1565 GELIC_LV1_GET_VLAN_ID,
1566 vlan_id_ix[i].tx,
1567 0, 0, &v1, &v2);
1568 if (status || !v1) {
1569 if (status != LV1_NO_ENTRY)
1570 dev_dbg(ctodev(card),
1571 "get vlan id for tx(%d) failed(%d)\n",
1572 vlan_id_ix[i].tx, status);
1573 card->vlan[i].tx = 0;
1574 card->vlan[i].rx = 0;
1575 continue;
1576 }
1577 card->vlan[i].tx = (u16)v1;
1578
1579 /* rx tag */
1580 status = lv1_net_control(bus_id(card), dev_id(card),
1581 GELIC_LV1_GET_VLAN_ID,
1582 vlan_id_ix[i].rx,
1583 0, 0, &v1, &v2);
1584 if (status || !v1) {
1585 if (status != LV1_NO_ENTRY)
1586 dev_info(ctodev(card),
1587 "get vlan id for rx(%d) failed(%d)\n",
1588 vlan_id_ix[i].rx, status);
1589 card->vlan[i].tx = 0;
1590 card->vlan[i].rx = 0;
1591 continue;
1592 }
1593 card->vlan[i].rx = (u16)v1;
1594
1595 dev_dbg(ctodev(card), "vlan_id[%d] tx=%02x rx=%02x\n",
1596 i, card->vlan[i].tx, card->vlan[i].rx);
1597 }
1598
1599 if (card->vlan[GELIC_PORT_ETHERNET].tx) {
1600 BUG_ON(!card->vlan[GELIC_PORT_WIRELESS].tx);
1601 card->vlan_required = 1;
1602 } else
1603 card->vlan_required = 0;
1604
1605 /* check wirelss capable firmware */
1606 if (ps3_compare_firmware_version(1, 6, 0) < 0) {
1607 card->vlan[GELIC_PORT_WIRELESS].tx = 0;
1608 card->vlan[GELIC_PORT_WIRELESS].rx = 0;
1609 }
1610
1611 dev_info(ctodev(card), "internal vlan %s\n",
1612 card->vlan_required? "enabled" : "disabled");
1613}
02c18891
MM
1614/**
1615 * ps3_gelic_driver_probe - add a device to the control of this driver
1616 */
59e97327 1617static int ps3_gelic_driver_probe(struct ps3_system_bus_device *dev)
02c18891 1618{
589866f9
MM
1619 struct gelic_card *card;
1620 struct net_device *netdev;
02c18891
MM
1621 int result;
1622
589866f9 1623 pr_debug("%s: called\n", __func__);
02c18891
MM
1624 result = ps3_open_hv_device(dev);
1625
1626 if (result) {
589866f9
MM
1627 dev_dbg(&dev->core, "%s:ps3_open_hv_device failed\n",
1628 __func__);
02c18891
MM
1629 goto fail_open;
1630 }
1631
1632 result = ps3_dma_region_create(dev->d_region);
1633
1634 if (result) {
589866f9
MM
1635 dev_dbg(&dev->core, "%s:ps3_dma_region_create failed(%d)\n",
1636 __func__, result);
02c18891
MM
1637 BUG_ON("check region type");
1638 goto fail_dma_region;
1639 }
1640
589866f9
MM
1641 /* alloc card/netdevice */
1642 card = gelic_alloc_card_net(&netdev);
1643 if (!card) {
1644 dev_info(&dev->core, "%s:gelic_net_alloc_card failed\n",
1645 __func__);
1646 result = -ENOMEM;
1647 goto fail_alloc_card;
1648 }
1649 ps3_system_bus_set_driver_data(dev, card);
1650 card->dev = dev;
1651
1652 /* get internal vlan info */
1653 gelic_card_get_vlan_info(card);
1654
1655 /* setup interrupt */
02c18891
MM
1656 result = lv1_net_set_interrupt_status_indicator(bus_id(card),
1657 dev_id(card),
1658 ps3_mm_phys_to_lpar(__pa(&card->irq_status)),
1659 0);
1660
1661 if (result) {
1662 dev_dbg(&dev->core,
589866f9
MM
1663 "%s:set_interrupt_status_indicator failed: %s\n",
1664 __func__, ps3_result(result));
02c18891
MM
1665 result = -EIO;
1666 goto fail_status_indicator;
1667 }
1668
589866f9
MM
1669 result = ps3_sb_event_receive_port_setup(dev, PS3_BINDING_CPU_ANY,
1670 &card->irq);
1671
1672 if (result) {
1673 dev_info(ctodev(card),
1674 "%s:gelic_net_open_device failed (%d)\n",
1675 __func__, result);
1676 result = -EPERM;
1677 goto fail_alloc_irq;
1678 }
1679 result = request_irq(card->irq, gelic_card_interrupt,
1680 IRQF_DISABLED, netdev->name, card);
1681
1682 if (result) {
1683 dev_info(ctodev(card), "%s:request_irq failed (%d)\n",
1684 __func__, result);
1685 goto fail_request_irq;
1686 }
1687
1688 /* setup card structure */
1689 card->irq_mask = GELIC_CARD_RXINT | GELIC_CARD_TXINT |
1690 GELIC_CARD_PORT_STATUS_CHANGED;
1691 card->rx_csum = GELIC_CARD_RX_CSUM_DEFAULT;
1692
1693
1694 if (gelic_card_init_chain(card, &card->tx_chain,
1695 card->descr, GELIC_NET_TX_DESCRIPTORS))
1696 goto fail_alloc_tx;
1697 if (gelic_card_init_chain(card, &card->rx_chain,
1698 card->descr + GELIC_NET_TX_DESCRIPTORS,
1699 GELIC_NET_RX_DESCRIPTORS))
1700 goto fail_alloc_rx;
1701
1702 /* head of chain */
1703 card->tx_top = card->tx_chain.head;
1704 card->rx_top = card->rx_chain.head;
1705 dev_dbg(ctodev(card), "descr rx %p, tx %p, size %#lx, num %#x\n",
1706 card->rx_top, card->tx_top, sizeof(struct gelic_descr),
1707 GELIC_NET_RX_DESCRIPTORS);
1708 /* allocate rx skbs */
1709 if (gelic_card_alloc_rx_skbs(card))
1710 goto fail_alloc_skbs;
1711
1712 spin_lock_init(&card->tx_lock);
1713 card->tx_dma_progress = 0;
02c18891 1714
589866f9
MM
1715 /* setup net_device structure */
1716 netdev->irq = card->irq;
1717 SET_NETDEV_DEV(netdev, &card->dev->core);
1718 gelic_ether_setup_netdev_ops(netdev, &card->napi);
1719 result = gelic_net_setup_netdev(netdev, card);
02c18891 1720 if (result) {
589866f9
MM
1721 dev_dbg(&dev->core, "%s: setup_netdev failed %d",
1722 __func__, result);
02c18891
MM
1723 goto fail_setup_netdev;
1724 }
1725
09dde54c
MM
1726#ifdef CONFIG_GELIC_WIRELESS
1727 if (gelic_wl_driver_probe(card)) {
1728 dev_dbg(&dev->core, "%s: WL init failed\n", __func__);
1729 goto fail_setup_netdev;
1730 }
1731#endif
589866f9 1732 pr_debug("%s: done\n", __func__);
02c18891
MM
1733 return 0;
1734
1735fail_setup_netdev:
589866f9
MM
1736fail_alloc_skbs:
1737 gelic_card_free_chain(card, card->rx_chain.head);
1738fail_alloc_rx:
1739 gelic_card_free_chain(card, card->tx_chain.head);
1740fail_alloc_tx:
1741 free_irq(card->irq, card);
1742 netdev->irq = NO_IRQ;
1743fail_request_irq:
1744 ps3_sb_event_receive_port_destroy(dev, card->irq);
1745fail_alloc_irq:
02c18891 1746 lv1_net_set_interrupt_status_indicator(bus_id(card),
589866f9
MM
1747 bus_id(card),
1748 0, 0);
02c18891 1749fail_status_indicator:
589866f9
MM
1750 ps3_system_bus_set_driver_data(dev, NULL);
1751 kfree(netdev_card(netdev)->unalign);
1752 free_netdev(netdev);
1753fail_alloc_card:
02c18891
MM
1754 ps3_dma_region_free(dev->d_region);
1755fail_dma_region:
1756 ps3_close_hv_device(dev);
1757fail_open:
02c18891
MM
1758 return result;
1759}
1760
1761/**
1762 * ps3_gelic_driver_remove - remove a device from the control of this driver
1763 */
1764
59e97327 1765static int ps3_gelic_driver_remove(struct ps3_system_bus_device *dev)
02c18891 1766{
59e97327 1767 struct gelic_card *card = ps3_system_bus_get_driver_data(dev);
589866f9
MM
1768 struct net_device *netdev0;
1769 pr_debug("%s: called\n", __func__);
1770
09dde54c
MM
1771#ifdef CONFIG_GELIC_WIRELESS
1772 gelic_wl_driver_remove(card);
1773#endif
589866f9
MM
1774 /* stop interrupt */
1775 gelic_card_set_irq_mask(card, 0);
1776
1777 /* turn off DMA, force end */
1778 gelic_card_disable_rxdmac(card);
1779 gelic_card_disable_txdmac(card);
1780
1781 /* release chains */
1782 gelic_card_release_tx_chain(card, 1);
1783 gelic_card_release_rx_chain(card);
1784
1785 gelic_card_free_chain(card, card->tx_top);
1786 gelic_card_free_chain(card, card->rx_top);
1787
1788 netdev0 = card->netdev[GELIC_PORT_ETHERNET];
1789 /* disconnect event port */
1790 free_irq(card->irq, card);
1791 netdev0->irq = NO_IRQ;
1792 ps3_sb_event_receive_port_destroy(card->dev, card->irq);
02c18891
MM
1793
1794 wait_event(card->waitq,
1795 atomic_read(&card->tx_timeout_task_counter) == 0);
1796
1797 lv1_net_set_interrupt_status_indicator(bus_id(card), dev_id(card),
1798 0 , 0);
1799
589866f9
MM
1800 unregister_netdev(netdev0);
1801 kfree(netdev_card(netdev0)->unalign);
1802 free_netdev(netdev0);
02c18891
MM
1803
1804 ps3_system_bus_set_driver_data(dev, NULL);
1805
1806 ps3_dma_region_free(dev->d_region);
1807
1808 ps3_close_hv_device(dev);
1809
589866f9 1810 pr_debug("%s: done\n", __func__);
02c18891
MM
1811 return 0;
1812}
1813
1814static struct ps3_system_bus_driver ps3_gelic_driver = {
1815 .match_id = PS3_MATCH_ID_GELIC,
1816 .probe = ps3_gelic_driver_probe,
1817 .remove = ps3_gelic_driver_remove,
1818 .shutdown = ps3_gelic_driver_remove,
1819 .core.name = "ps3_gelic_driver",
1820 .core.owner = THIS_MODULE,
1821};
1822
1823static int __init ps3_gelic_driver_init (void)
1824{
1825 return firmware_has_feature(FW_FEATURE_PS3_LV1)
1826 ? ps3_system_bus_driver_register(&ps3_gelic_driver)
1827 : -ENODEV;
1828}
1829
1830static void __exit ps3_gelic_driver_exit (void)
1831{
1832 ps3_system_bus_driver_unregister(&ps3_gelic_driver);
1833}
1834
59e97327
MM
1835module_init(ps3_gelic_driver_init);
1836module_exit(ps3_gelic_driver_exit);
02c18891
MM
1837
1838MODULE_ALIAS(PS3_MODULE_ALIAS_GELIC);
1839