0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/compiler.h>
0013 #include <linux/crc32.h>
0014 #include <linux/delay.h>
0015 #include <linux/etherdevice.h>
0016 #include <linux/ethtool.h>
0017 #include <linux/firmware.h>
0018 #include <linux/if_vlan.h>
0019 #include <linux/in.h>
0020 #include <linux/init.h>
0021 #include <linux/interrupt.h>
0022 #include <linux/gfp.h>
0023 #include <linux/ioport.h>
0024 #include <linux/ip.h>
0025 #include <linux/kernel.h>
0026 #include <linux/mii.h>
0027 #include <linux/module.h>
0028 #include <linux/netdevice.h>
0029 #include <linux/device.h>
0030 #include <linux/pci.h>
0031 #include <linux/skbuff.h>
0032 #include <linux/tcp.h>
0033 #include <linux/types.h>
0034 #include <linux/vmalloc.h>
0035 #include <linux/wait.h>
0036 #include <linux/workqueue.h>
0037 #include <linux/bitops.h>
0038 #include <linux/of.h>
0039 #include <net/checksum.h>
0040
0041 #include "spider_net.h"
0042
0043 MODULE_AUTHOR("Utz Bacher <utz.bacher@de.ibm.com> and Jens Osterkamp " \
0044 "<Jens.Osterkamp@de.ibm.com>");
0045 MODULE_DESCRIPTION("Spider Southbridge Gigabit Ethernet driver");
0046 MODULE_LICENSE("GPL");
0047 MODULE_VERSION(VERSION);
0048 MODULE_FIRMWARE(SPIDER_NET_FIRMWARE_NAME);
0049
0050 static int rx_descriptors = SPIDER_NET_RX_DESCRIPTORS_DEFAULT;
0051 static int tx_descriptors = SPIDER_NET_TX_DESCRIPTORS_DEFAULT;
0052
0053 module_param(rx_descriptors, int, 0444);
0054 module_param(tx_descriptors, int, 0444);
0055
0056 MODULE_PARM_DESC(rx_descriptors, "number of descriptors used " \
0057 "in rx chains");
0058 MODULE_PARM_DESC(tx_descriptors, "number of descriptors used " \
0059 "in tx chain");
0060
0061 char spider_net_driver_name[] = "spidernet";
0062
0063 static const struct pci_device_id spider_net_pci_tbl[] = {
0064 { PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_SPIDER_NET,
0065 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
0066 { 0, }
0067 };
0068
0069 MODULE_DEVICE_TABLE(pci, spider_net_pci_tbl);
0070
0071
0072
0073
0074
0075
0076
0077
0078 static inline u32
0079 spider_net_read_reg(struct spider_net_card *card, u32 reg)
0080 {
0081
0082
0083
0084
0085 return in_be32(card->regs + reg);
0086 }
0087
0088
0089
0090
0091
0092
0093
0094 static inline void
0095 spider_net_write_reg(struct spider_net_card *card, u32 reg, u32 value)
0096 {
0097
0098
0099
0100
0101 out_be32(card->regs + reg, value);
0102 }
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115 static void
0116 spider_net_write_phy(struct net_device *netdev, int mii_id,
0117 int reg, int val)
0118 {
0119 struct spider_net_card *card = netdev_priv(netdev);
0120 u32 writevalue;
0121
0122 writevalue = ((u32)mii_id << 21) |
0123 ((u32)reg << 16) | ((u32)val);
0124
0125 spider_net_write_reg(card, SPIDER_NET_GPCWOPCMD, writevalue);
0126 }
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139 static int
0140 spider_net_read_phy(struct net_device *netdev, int mii_id, int reg)
0141 {
0142 struct spider_net_card *card = netdev_priv(netdev);
0143 u32 readvalue;
0144
0145 readvalue = ((u32)mii_id << 21) | ((u32)reg << 16);
0146 spider_net_write_reg(card, SPIDER_NET_GPCROPCMD, readvalue);
0147
0148
0149
0150
0151
0152 do {
0153 readvalue = spider_net_read_reg(card, SPIDER_NET_GPCROPCMD);
0154 } while (readvalue & SPIDER_NET_GPREXEC);
0155
0156 readvalue &= SPIDER_NET_GPRDAT_MASK;
0157
0158 return readvalue;
0159 }
0160
0161
0162
0163
0164
0165 static void
0166 spider_net_setup_aneg(struct spider_net_card *card)
0167 {
0168 struct mii_phy *phy = &card->phy;
0169 u32 advertise = 0;
0170 u16 bmsr, estat;
0171
0172 bmsr = spider_net_read_phy(card->netdev, phy->mii_id, MII_BMSR);
0173 estat = spider_net_read_phy(card->netdev, phy->mii_id, MII_ESTATUS);
0174
0175 if (bmsr & BMSR_10HALF)
0176 advertise |= ADVERTISED_10baseT_Half;
0177 if (bmsr & BMSR_10FULL)
0178 advertise |= ADVERTISED_10baseT_Full;
0179 if (bmsr & BMSR_100HALF)
0180 advertise |= ADVERTISED_100baseT_Half;
0181 if (bmsr & BMSR_100FULL)
0182 advertise |= ADVERTISED_100baseT_Full;
0183
0184 if ((bmsr & BMSR_ESTATEN) && (estat & ESTATUS_1000_TFULL))
0185 advertise |= SUPPORTED_1000baseT_Full;
0186 if ((bmsr & BMSR_ESTATEN) && (estat & ESTATUS_1000_THALF))
0187 advertise |= SUPPORTED_1000baseT_Half;
0188
0189 sungem_phy_probe(phy, phy->mii_id);
0190 phy->def->ops->setup_aneg(phy, advertise);
0191
0192 }
0193
0194
0195
0196
0197
0198
0199
0200 static void
0201 spider_net_rx_irq_off(struct spider_net_card *card)
0202 {
0203 u32 regvalue;
0204
0205 regvalue = SPIDER_NET_INT0_MASK_VALUE & (~SPIDER_NET_RXINT);
0206 spider_net_write_reg(card, SPIDER_NET_GHIINT0MSK, regvalue);
0207 }
0208
0209
0210
0211
0212
0213
0214
0215 static void
0216 spider_net_rx_irq_on(struct spider_net_card *card)
0217 {
0218 u32 regvalue;
0219
0220 regvalue = SPIDER_NET_INT0_MASK_VALUE | SPIDER_NET_RXINT;
0221 spider_net_write_reg(card, SPIDER_NET_GHIINT0MSK, regvalue);
0222 }
0223
0224
0225
0226
0227
0228
0229
0230
0231 static void
0232 spider_net_set_promisc(struct spider_net_card *card)
0233 {
0234 u32 macu, macl;
0235 struct net_device *netdev = card->netdev;
0236
0237 if (netdev->flags & IFF_PROMISC) {
0238
0239 spider_net_write_reg(card, SPIDER_NET_GMRUAFILnR, 0);
0240 spider_net_write_reg(card, SPIDER_NET_GMRUAFILnR + 0x04, 0);
0241 spider_net_write_reg(card, SPIDER_NET_GMRUA0FIL15R,
0242 SPIDER_NET_PROMISC_VALUE);
0243 } else {
0244 macu = netdev->dev_addr[0];
0245 macu <<= 8;
0246 macu |= netdev->dev_addr[1];
0247 memcpy(&macl, &netdev->dev_addr[2], sizeof(macl));
0248
0249 macu |= SPIDER_NET_UA_DESCR_VALUE;
0250 spider_net_write_reg(card, SPIDER_NET_GMRUAFILnR, macu);
0251 spider_net_write_reg(card, SPIDER_NET_GMRUAFILnR + 0x04, macl);
0252 spider_net_write_reg(card, SPIDER_NET_GMRUA0FIL15R,
0253 SPIDER_NET_NONPROMISC_VALUE);
0254 }
0255 }
0256
0257
0258
0259
0260
0261
0262
0263 static inline int
0264 spider_net_get_descr_status(struct spider_net_hw_descr *hwdescr)
0265 {
0266 return hwdescr->dmac_cmd_status & SPIDER_NET_DESCR_IND_PROC_MASK;
0267 }
0268
0269
0270
0271
0272
0273
0274
0275 static void
0276 spider_net_free_chain(struct spider_net_card *card,
0277 struct spider_net_descr_chain *chain)
0278 {
0279 struct spider_net_descr *descr;
0280
0281 descr = chain->ring;
0282 do {
0283 descr->bus_addr = 0;
0284 descr->hwdescr->next_descr_addr = 0;
0285 descr = descr->next;
0286 } while (descr != chain->ring);
0287
0288 dma_free_coherent(&card->pdev->dev, chain->num_desc * sizeof(struct spider_net_hw_descr),
0289 chain->hwring, chain->dma_addr);
0290 }
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302 static int
0303 spider_net_init_chain(struct spider_net_card *card,
0304 struct spider_net_descr_chain *chain)
0305 {
0306 int i;
0307 struct spider_net_descr *descr;
0308 struct spider_net_hw_descr *hwdescr;
0309 dma_addr_t buf;
0310 size_t alloc_size;
0311
0312 alloc_size = chain->num_desc * sizeof(struct spider_net_hw_descr);
0313
0314 chain->hwring = dma_alloc_coherent(&card->pdev->dev, alloc_size,
0315 &chain->dma_addr, GFP_KERNEL);
0316 if (!chain->hwring)
0317 return -ENOMEM;
0318
0319
0320 descr = chain->ring;
0321 hwdescr = chain->hwring;
0322 buf = chain->dma_addr;
0323 for (i=0; i < chain->num_desc; i++, descr++, hwdescr++) {
0324 hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE;
0325 hwdescr->next_descr_addr = 0;
0326
0327 descr->hwdescr = hwdescr;
0328 descr->bus_addr = buf;
0329 descr->next = descr + 1;
0330 descr->prev = descr - 1;
0331
0332 buf += sizeof(struct spider_net_hw_descr);
0333 }
0334
0335 (descr-1)->next = chain->ring;
0336 chain->ring->prev = descr-1;
0337
0338 spin_lock_init(&chain->lock);
0339 chain->head = chain->ring;
0340 chain->tail = chain->ring;
0341 return 0;
0342 }
0343
0344
0345
0346
0347
0348
0349
0350 static void
0351 spider_net_free_rx_chain_contents(struct spider_net_card *card)
0352 {
0353 struct spider_net_descr *descr;
0354
0355 descr = card->rx_chain.head;
0356 do {
0357 if (descr->skb) {
0358 dma_unmap_single(&card->pdev->dev,
0359 descr->hwdescr->buf_addr,
0360 SPIDER_NET_MAX_FRAME,
0361 DMA_BIDIRECTIONAL);
0362 dev_kfree_skb(descr->skb);
0363 descr->skb = NULL;
0364 }
0365 descr = descr->next;
0366 } while (descr != card->rx_chain.head);
0367 }
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379 static int
0380 spider_net_prepare_rx_descr(struct spider_net_card *card,
0381 struct spider_net_descr *descr)
0382 {
0383 struct spider_net_hw_descr *hwdescr = descr->hwdescr;
0384 dma_addr_t buf;
0385 int offset;
0386 int bufsize;
0387
0388
0389 bufsize = (SPIDER_NET_MAX_FRAME + SPIDER_NET_RXBUF_ALIGN - 1) &
0390 (~(SPIDER_NET_RXBUF_ALIGN - 1));
0391
0392
0393
0394
0395
0396 descr->skb = netdev_alloc_skb(card->netdev,
0397 bufsize + SPIDER_NET_RXBUF_ALIGN - 1);
0398 if (!descr->skb) {
0399 if (netif_msg_rx_err(card) && net_ratelimit())
0400 dev_err(&card->netdev->dev,
0401 "Not enough memory to allocate rx buffer\n");
0402 card->spider_stats.alloc_rx_skb_error++;
0403 return -ENOMEM;
0404 }
0405 hwdescr->buf_size = bufsize;
0406 hwdescr->result_size = 0;
0407 hwdescr->valid_size = 0;
0408 hwdescr->data_status = 0;
0409 hwdescr->data_error = 0;
0410
0411 offset = ((unsigned long)descr->skb->data) &
0412 (SPIDER_NET_RXBUF_ALIGN - 1);
0413 if (offset)
0414 skb_reserve(descr->skb, SPIDER_NET_RXBUF_ALIGN - offset);
0415
0416 buf = dma_map_single(&card->pdev->dev, descr->skb->data,
0417 SPIDER_NET_MAX_FRAME, DMA_FROM_DEVICE);
0418 if (dma_mapping_error(&card->pdev->dev, buf)) {
0419 dev_kfree_skb_any(descr->skb);
0420 descr->skb = NULL;
0421 if (netif_msg_rx_err(card) && net_ratelimit())
0422 dev_err(&card->netdev->dev, "Could not iommu-map rx buffer\n");
0423 card->spider_stats.rx_iommu_map_error++;
0424 hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE;
0425 } else {
0426 hwdescr->buf_addr = buf;
0427 wmb();
0428 hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_CARDOWNED |
0429 SPIDER_NET_DMAC_NOINTR_COMPLETE;
0430 }
0431
0432 return 0;
0433 }
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443 static inline void
0444 spider_net_enable_rxchtails(struct spider_net_card *card)
0445 {
0446
0447 spider_net_write_reg(card, SPIDER_NET_GDADCHA ,
0448 card->rx_chain.tail->bus_addr);
0449 }
0450
0451
0452
0453
0454
0455
0456
0457
0458 static inline void
0459 spider_net_enable_rxdmac(struct spider_net_card *card)
0460 {
0461 wmb();
0462 spider_net_write_reg(card, SPIDER_NET_GDADMACCNTR,
0463 SPIDER_NET_DMA_RX_VALUE);
0464 }
0465
0466
0467
0468
0469
0470
0471
0472
0473 static inline void
0474 spider_net_disable_rxdmac(struct spider_net_card *card)
0475 {
0476 spider_net_write_reg(card, SPIDER_NET_GDADMACCNTR,
0477 SPIDER_NET_DMA_RX_FEND_VALUE);
0478 }
0479
0480
0481
0482
0483
0484
0485
0486 static void
0487 spider_net_refill_rx_chain(struct spider_net_card *card)
0488 {
0489 struct spider_net_descr_chain *chain = &card->rx_chain;
0490 unsigned long flags;
0491
0492
0493
0494
0495
0496
0497 if (!spin_trylock_irqsave(&chain->lock, flags))
0498 return;
0499
0500 while (spider_net_get_descr_status(chain->head->hwdescr) ==
0501 SPIDER_NET_DESCR_NOT_IN_USE) {
0502 if (spider_net_prepare_rx_descr(card, chain->head))
0503 break;
0504 chain->head = chain->head->next;
0505 }
0506
0507 spin_unlock_irqrestore(&chain->lock, flags);
0508 }
0509
0510
0511
0512
0513
0514
0515
0516 static int
0517 spider_net_alloc_rx_skbs(struct spider_net_card *card)
0518 {
0519 struct spider_net_descr_chain *chain = &card->rx_chain;
0520 struct spider_net_descr *start = chain->tail;
0521 struct spider_net_descr *descr = start;
0522
0523
0524 do {
0525 descr->prev->hwdescr->next_descr_addr = descr->bus_addr;
0526 descr = descr->next;
0527 } while (descr != start);
0528
0529
0530
0531
0532
0533 if (spider_net_prepare_rx_descr(card, chain->head))
0534 goto error;
0535 else
0536 chain->head = chain->head->next;
0537
0538
0539
0540
0541 spider_net_refill_rx_chain(card);
0542 spider_net_enable_rxdmac(card);
0543 return 0;
0544
0545 error:
0546 spider_net_free_rx_chain_contents(card);
0547 return -ENOMEM;
0548 }
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560 static u8
0561 spider_net_get_multicast_hash(struct net_device *netdev, __u8 *addr)
0562 {
0563 u32 crc;
0564 u8 hash;
0565 char addr_for_crc[ETH_ALEN] = { 0, };
0566 int i, bit;
0567
0568 for (i = 0; i < ETH_ALEN * 8; i++) {
0569 bit = (addr[i / 8] >> (i % 8)) & 1;
0570 addr_for_crc[ETH_ALEN - 1 - i / 8] += bit << (7 - (i % 8));
0571 }
0572
0573 crc = crc32_be(~0, addr_for_crc, netdev->addr_len);
0574
0575 hash = (crc >> 27);
0576 hash <<= 3;
0577 hash |= crc & 7;
0578 hash &= 0xff;
0579
0580 return hash;
0581 }
0582
0583
0584
0585
0586
0587
0588
0589
0590
0591 static void
0592 spider_net_set_multi(struct net_device *netdev)
0593 {
0594 struct netdev_hw_addr *ha;
0595 u8 hash;
0596 int i;
0597 u32 reg;
0598 struct spider_net_card *card = netdev_priv(netdev);
0599 DECLARE_BITMAP(bitmask, SPIDER_NET_MULTICAST_HASHES);
0600
0601 spider_net_set_promisc(card);
0602
0603 if (netdev->flags & IFF_ALLMULTI) {
0604 bitmap_fill(bitmask, SPIDER_NET_MULTICAST_HASHES);
0605 goto write_hash;
0606 }
0607
0608 bitmap_zero(bitmask, SPIDER_NET_MULTICAST_HASHES);
0609
0610
0611
0612 __set_bit(0xfd, bitmask);
0613
0614 netdev_for_each_mc_addr(ha, netdev) {
0615 hash = spider_net_get_multicast_hash(netdev, ha->addr);
0616 __set_bit(hash, bitmask);
0617 }
0618
0619 write_hash:
0620 for (i = 0; i < SPIDER_NET_MULTICAST_HASHES / 4; i++) {
0621 reg = 0;
0622 if (test_bit(i * 4, bitmask))
0623 reg += 0x08;
0624 reg <<= 8;
0625 if (test_bit(i * 4 + 1, bitmask))
0626 reg += 0x08;
0627 reg <<= 8;
0628 if (test_bit(i * 4 + 2, bitmask))
0629 reg += 0x08;
0630 reg <<= 8;
0631 if (test_bit(i * 4 + 3, bitmask))
0632 reg += 0x08;
0633
0634 spider_net_write_reg(card, SPIDER_NET_GMRMHFILnR + i * 4, reg);
0635 }
0636 }
0637
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648 static int
0649 spider_net_prepare_tx_descr(struct spider_net_card *card,
0650 struct sk_buff *skb)
0651 {
0652 struct spider_net_descr_chain *chain = &card->tx_chain;
0653 struct spider_net_descr *descr;
0654 struct spider_net_hw_descr *hwdescr;
0655 dma_addr_t buf;
0656 unsigned long flags;
0657
0658 buf = dma_map_single(&card->pdev->dev, skb->data, skb->len,
0659 DMA_TO_DEVICE);
0660 if (dma_mapping_error(&card->pdev->dev, buf)) {
0661 if (netif_msg_tx_err(card) && net_ratelimit())
0662 dev_err(&card->netdev->dev, "could not iommu-map packet (%p, %i). "
0663 "Dropping packet\n", skb->data, skb->len);
0664 card->spider_stats.tx_iommu_map_error++;
0665 return -ENOMEM;
0666 }
0667
0668 spin_lock_irqsave(&chain->lock, flags);
0669 descr = card->tx_chain.head;
0670 if (descr->next == chain->tail->prev) {
0671 spin_unlock_irqrestore(&chain->lock, flags);
0672 dma_unmap_single(&card->pdev->dev, buf, skb->len,
0673 DMA_TO_DEVICE);
0674 return -ENOMEM;
0675 }
0676 hwdescr = descr->hwdescr;
0677 chain->head = descr->next;
0678
0679 descr->skb = skb;
0680 hwdescr->buf_addr = buf;
0681 hwdescr->buf_size = skb->len;
0682 hwdescr->next_descr_addr = 0;
0683 hwdescr->data_status = 0;
0684
0685 hwdescr->dmac_cmd_status =
0686 SPIDER_NET_DESCR_CARDOWNED | SPIDER_NET_DMAC_TXFRMTL;
0687 spin_unlock_irqrestore(&chain->lock, flags);
0688
0689 if (skb->ip_summed == CHECKSUM_PARTIAL)
0690 switch (ip_hdr(skb)->protocol) {
0691 case IPPROTO_TCP:
0692 hwdescr->dmac_cmd_status |= SPIDER_NET_DMAC_TCP;
0693 break;
0694 case IPPROTO_UDP:
0695 hwdescr->dmac_cmd_status |= SPIDER_NET_DMAC_UDP;
0696 break;
0697 }
0698
0699
0700 wmb();
0701 descr->prev->hwdescr->next_descr_addr = descr->bus_addr;
0702
0703 netif_trans_update(card->netdev);
0704 return 0;
0705 }
0706
0707 static int
0708 spider_net_set_low_watermark(struct spider_net_card *card)
0709 {
0710 struct spider_net_descr *descr = card->tx_chain.tail;
0711 struct spider_net_hw_descr *hwdescr;
0712 unsigned long flags;
0713 int status;
0714 int cnt=0;
0715 int i;
0716
0717
0718
0719
0720 while (descr != card->tx_chain.head) {
0721 status = descr->hwdescr->dmac_cmd_status & SPIDER_NET_DESCR_NOT_IN_USE;
0722 if (status == SPIDER_NET_DESCR_NOT_IN_USE)
0723 break;
0724 descr = descr->next;
0725 cnt++;
0726 }
0727
0728
0729 if (cnt < card->tx_chain.num_desc/4)
0730 return cnt;
0731
0732
0733 descr = card->tx_chain.tail;
0734 cnt = (cnt*3)/4;
0735 for (i=0;i<cnt; i++)
0736 descr = descr->next;
0737
0738
0739 spin_lock_irqsave(&card->tx_chain.lock, flags);
0740 descr->hwdescr->dmac_cmd_status |= SPIDER_NET_DESCR_TXDESFLG;
0741 if (card->low_watermark && card->low_watermark != descr) {
0742 hwdescr = card->low_watermark->hwdescr;
0743 hwdescr->dmac_cmd_status =
0744 hwdescr->dmac_cmd_status & ~SPIDER_NET_DESCR_TXDESFLG;
0745 }
0746 card->low_watermark = descr;
0747 spin_unlock_irqrestore(&card->tx_chain.lock, flags);
0748 return cnt;
0749 }
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762
0763 static int
0764 spider_net_release_tx_chain(struct spider_net_card *card, int brutal)
0765 {
0766 struct net_device *dev = card->netdev;
0767 struct spider_net_descr_chain *chain = &card->tx_chain;
0768 struct spider_net_descr *descr;
0769 struct spider_net_hw_descr *hwdescr;
0770 struct sk_buff *skb;
0771 u32 buf_addr;
0772 unsigned long flags;
0773 int status;
0774
0775 while (1) {
0776 spin_lock_irqsave(&chain->lock, flags);
0777 if (chain->tail == chain->head) {
0778 spin_unlock_irqrestore(&chain->lock, flags);
0779 return 0;
0780 }
0781 descr = chain->tail;
0782 hwdescr = descr->hwdescr;
0783
0784 status = spider_net_get_descr_status(hwdescr);
0785 switch (status) {
0786 case SPIDER_NET_DESCR_COMPLETE:
0787 dev->stats.tx_packets++;
0788 dev->stats.tx_bytes += descr->skb->len;
0789 break;
0790
0791 case SPIDER_NET_DESCR_CARDOWNED:
0792 if (!brutal) {
0793 spin_unlock_irqrestore(&chain->lock, flags);
0794 return 1;
0795 }
0796
0797
0798
0799
0800
0801 fallthrough;
0802
0803 case SPIDER_NET_DESCR_RESPONSE_ERROR:
0804 case SPIDER_NET_DESCR_PROTECTION_ERROR:
0805 case SPIDER_NET_DESCR_FORCE_END:
0806 if (netif_msg_tx_err(card))
0807 dev_err(&card->netdev->dev, "forcing end of tx descriptor "
0808 "with status x%02x\n", status);
0809 dev->stats.tx_errors++;
0810 break;
0811
0812 default:
0813 dev->stats.tx_dropped++;
0814 if (!brutal) {
0815 spin_unlock_irqrestore(&chain->lock, flags);
0816 return 1;
0817 }
0818 }
0819
0820 chain->tail = descr->next;
0821 hwdescr->dmac_cmd_status |= SPIDER_NET_DESCR_NOT_IN_USE;
0822 skb = descr->skb;
0823 descr->skb = NULL;
0824 buf_addr = hwdescr->buf_addr;
0825 spin_unlock_irqrestore(&chain->lock, flags);
0826
0827
0828 if (skb) {
0829 dma_unmap_single(&card->pdev->dev, buf_addr, skb->len,
0830 DMA_TO_DEVICE);
0831 dev_consume_skb_any(skb);
0832 }
0833 }
0834 return 0;
0835 }
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848 static inline void
0849 spider_net_kick_tx_dma(struct spider_net_card *card)
0850 {
0851 struct spider_net_descr *descr;
0852
0853 if (spider_net_read_reg(card, SPIDER_NET_GDTDMACCNTR) &
0854 SPIDER_NET_TX_DMA_EN)
0855 goto out;
0856
0857 descr = card->tx_chain.tail;
0858 for (;;) {
0859 if (spider_net_get_descr_status(descr->hwdescr) ==
0860 SPIDER_NET_DESCR_CARDOWNED) {
0861 spider_net_write_reg(card, SPIDER_NET_GDTDCHA,
0862 descr->bus_addr);
0863 spider_net_write_reg(card, SPIDER_NET_GDTDMACCNTR,
0864 SPIDER_NET_DMA_TX_VALUE);
0865 break;
0866 }
0867 if (descr == card->tx_chain.head)
0868 break;
0869 descr = descr->next;
0870 }
0871
0872 out:
0873 mod_timer(&card->tx_timer, jiffies + SPIDER_NET_TX_TIMER);
0874 }
0875
0876
0877
0878
0879
0880
0881
0882
0883 static netdev_tx_t
0884 spider_net_xmit(struct sk_buff *skb, struct net_device *netdev)
0885 {
0886 int cnt;
0887 struct spider_net_card *card = netdev_priv(netdev);
0888
0889 spider_net_release_tx_chain(card, 0);
0890
0891 if (spider_net_prepare_tx_descr(card, skb) != 0) {
0892 netdev->stats.tx_dropped++;
0893 netif_stop_queue(netdev);
0894 return NETDEV_TX_BUSY;
0895 }
0896
0897 cnt = spider_net_set_low_watermark(card);
0898 if (cnt < 5)
0899 spider_net_kick_tx_dma(card);
0900 return NETDEV_TX_OK;
0901 }
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911
0912 static void
0913 spider_net_cleanup_tx_ring(struct timer_list *t)
0914 {
0915 struct spider_net_card *card = from_timer(card, t, tx_timer);
0916 if ((spider_net_release_tx_chain(card, 0) != 0) &&
0917 (card->netdev->flags & IFF_UP)) {
0918 spider_net_kick_tx_dma(card);
0919 netif_wake_queue(card->netdev);
0920 }
0921 }
0922
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932 static int
0933 spider_net_do_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
0934 {
0935 switch (cmd) {
0936 default:
0937 return -EOPNOTSUPP;
0938 }
0939 }
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949 static void
0950 spider_net_pass_skb_up(struct spider_net_descr *descr,
0951 struct spider_net_card *card)
0952 {
0953 struct spider_net_hw_descr *hwdescr = descr->hwdescr;
0954 struct sk_buff *skb = descr->skb;
0955 struct net_device *netdev = card->netdev;
0956 u32 data_status = hwdescr->data_status;
0957 u32 data_error = hwdescr->data_error;
0958
0959 skb_put(skb, hwdescr->valid_size);
0960
0961
0962
0963
0964 #define SPIDER_MISALIGN 2
0965 skb_pull(skb, SPIDER_MISALIGN);
0966 skb->protocol = eth_type_trans(skb, netdev);
0967
0968
0969 skb_checksum_none_assert(skb);
0970 if (netdev->features & NETIF_F_RXCSUM) {
0971 if ( ( (data_status & SPIDER_NET_DATA_STATUS_CKSUM_MASK) ==
0972 SPIDER_NET_DATA_STATUS_CKSUM_MASK) &&
0973 !(data_error & SPIDER_NET_DATA_ERR_CKSUM_MASK))
0974 skb->ip_summed = CHECKSUM_UNNECESSARY;
0975 }
0976
0977 if (data_status & SPIDER_NET_VLAN_PACKET) {
0978
0979 }
0980
0981
0982 netdev->stats.rx_packets++;
0983 netdev->stats.rx_bytes += skb->len;
0984
0985
0986 netif_receive_skb(skb);
0987 }
0988
0989 static void show_rx_chain(struct spider_net_card *card)
0990 {
0991 struct spider_net_descr_chain *chain = &card->rx_chain;
0992 struct spider_net_descr *start= chain->tail;
0993 struct spider_net_descr *descr= start;
0994 struct spider_net_hw_descr *hwd = start->hwdescr;
0995 struct device *dev = &card->netdev->dev;
0996 u32 curr_desc, next_desc;
0997 int status;
0998
0999 int tot = 0;
1000 int cnt = 0;
1001 int off = start - chain->ring;
1002 int cstat = hwd->dmac_cmd_status;
1003
1004 dev_info(dev, "Total number of descrs=%d\n",
1005 chain->num_desc);
1006 dev_info(dev, "Chain tail located at descr=%d, status=0x%x\n",
1007 off, cstat);
1008
1009 curr_desc = spider_net_read_reg(card, SPIDER_NET_GDACTDPA);
1010 next_desc = spider_net_read_reg(card, SPIDER_NET_GDACNEXTDA);
1011
1012 status = cstat;
1013 do
1014 {
1015 hwd = descr->hwdescr;
1016 off = descr - chain->ring;
1017 status = hwd->dmac_cmd_status;
1018
1019 if (descr == chain->head)
1020 dev_info(dev, "Chain head is at %d, head status=0x%x\n",
1021 off, status);
1022
1023 if (curr_desc == descr->bus_addr)
1024 dev_info(dev, "HW curr desc (GDACTDPA) is at %d, status=0x%x\n",
1025 off, status);
1026
1027 if (next_desc == descr->bus_addr)
1028 dev_info(dev, "HW next desc (GDACNEXTDA) is at %d, status=0x%x\n",
1029 off, status);
1030
1031 if (hwd->next_descr_addr == 0)
1032 dev_info(dev, "chain is cut at %d\n", off);
1033
1034 if (cstat != status) {
1035 int from = (chain->num_desc + off - cnt) % chain->num_desc;
1036 int to = (chain->num_desc + off - 1) % chain->num_desc;
1037 dev_info(dev, "Have %d (from %d to %d) descrs "
1038 "with stat=0x%08x\n", cnt, from, to, cstat);
1039 cstat = status;
1040 cnt = 0;
1041 }
1042
1043 cnt ++;
1044 tot ++;
1045 descr = descr->next;
1046 } while (descr != start);
1047
1048 dev_info(dev, "Last %d descrs with stat=0x%08x "
1049 "for a total of %d descrs\n", cnt, cstat, tot);
1050
1051 #ifdef DEBUG
1052
1053 descr = start;
1054 do
1055 {
1056 struct spider_net_hw_descr *hwd = descr->hwdescr;
1057 status = spider_net_get_descr_status(hwd);
1058 cnt = descr - chain->ring;
1059 dev_info(dev, "Descr %d stat=0x%08x skb=%p\n",
1060 cnt, status, descr->skb);
1061 dev_info(dev, "bus addr=%08x buf addr=%08x sz=%d\n",
1062 descr->bus_addr, hwd->buf_addr, hwd->buf_size);
1063 dev_info(dev, "next=%08x result sz=%d valid sz=%d\n",
1064 hwd->next_descr_addr, hwd->result_size,
1065 hwd->valid_size);
1066 dev_info(dev, "dmac=%08x data stat=%08x data err=%08x\n",
1067 hwd->dmac_cmd_status, hwd->data_status,
1068 hwd->data_error);
1069 dev_info(dev, "\n");
1070
1071 descr = descr->next;
1072 } while (descr != start);
1073 #endif
1074
1075 }
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087 static void spider_net_resync_head_ptr(struct spider_net_card *card)
1088 {
1089 unsigned long flags;
1090 struct spider_net_descr_chain *chain = &card->rx_chain;
1091 struct spider_net_descr *descr;
1092 int i, status;
1093
1094
1095 descr = chain->head;
1096 status = spider_net_get_descr_status(descr->hwdescr);
1097
1098 if (status == SPIDER_NET_DESCR_NOT_IN_USE)
1099 return;
1100
1101 spin_lock_irqsave(&chain->lock, flags);
1102
1103 descr = chain->head;
1104 status = spider_net_get_descr_status(descr->hwdescr);
1105 for (i=0; i<chain->num_desc; i++) {
1106 if (status != SPIDER_NET_DESCR_CARDOWNED) break;
1107 descr = descr->next;
1108 status = spider_net_get_descr_status(descr->hwdescr);
1109 }
1110 chain->head = descr;
1111
1112 spin_unlock_irqrestore(&chain->lock, flags);
1113 }
1114
1115 static int spider_net_resync_tail_ptr(struct spider_net_card *card)
1116 {
1117 struct spider_net_descr_chain *chain = &card->rx_chain;
1118 struct spider_net_descr *descr;
1119 int i, status;
1120
1121
1122 descr = chain->tail;
1123 status = spider_net_get_descr_status(descr->hwdescr);
1124
1125 for (i=0; i<chain->num_desc; i++) {
1126 if ((status != SPIDER_NET_DESCR_CARDOWNED) &&
1127 (status != SPIDER_NET_DESCR_NOT_IN_USE)) break;
1128 descr = descr->next;
1129 status = spider_net_get_descr_status(descr->hwdescr);
1130 }
1131 chain->tail = descr;
1132
1133 if ((i == chain->num_desc) || (i == 0))
1134 return 1;
1135 return 0;
1136 }
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149 static int
1150 spider_net_decode_one_descr(struct spider_net_card *card)
1151 {
1152 struct net_device *dev = card->netdev;
1153 struct spider_net_descr_chain *chain = &card->rx_chain;
1154 struct spider_net_descr *descr = chain->tail;
1155 struct spider_net_hw_descr *hwdescr = descr->hwdescr;
1156 u32 hw_buf_addr;
1157 int status;
1158
1159 status = spider_net_get_descr_status(hwdescr);
1160
1161
1162 if ((status == SPIDER_NET_DESCR_CARDOWNED) ||
1163 (status == SPIDER_NET_DESCR_NOT_IN_USE))
1164 return 0;
1165
1166
1167 chain->tail = descr->next;
1168
1169
1170 hw_buf_addr = hwdescr->buf_addr;
1171 hwdescr->buf_addr = 0xffffffff;
1172 dma_unmap_single(&card->pdev->dev, hw_buf_addr, SPIDER_NET_MAX_FRAME,
1173 DMA_FROM_DEVICE);
1174
1175 if ( (status == SPIDER_NET_DESCR_RESPONSE_ERROR) ||
1176 (status == SPIDER_NET_DESCR_PROTECTION_ERROR) ||
1177 (status == SPIDER_NET_DESCR_FORCE_END) ) {
1178 if (netif_msg_rx_err(card))
1179 dev_err(&dev->dev,
1180 "dropping RX descriptor with state %d\n", status);
1181 dev->stats.rx_dropped++;
1182 goto bad_desc;
1183 }
1184
1185 if ( (status != SPIDER_NET_DESCR_COMPLETE) &&
1186 (status != SPIDER_NET_DESCR_FRAME_END) ) {
1187 if (netif_msg_rx_err(card))
1188 dev_err(&card->netdev->dev,
1189 "RX descriptor with unknown state %d\n", status);
1190 card->spider_stats.rx_desc_unk_state++;
1191 goto bad_desc;
1192 }
1193
1194
1195 if (hwdescr->data_error & SPIDER_NET_DESTROY_RX_FLAGS) {
1196 if (netif_msg_rx_err(card))
1197 dev_err(&card->netdev->dev,
1198 "error in received descriptor found, "
1199 "data_status=x%08x, data_error=x%08x\n",
1200 hwdescr->data_status, hwdescr->data_error);
1201 goto bad_desc;
1202 }
1203
1204 if (hwdescr->dmac_cmd_status & SPIDER_NET_DESCR_BAD_STATUS) {
1205 dev_err(&card->netdev->dev, "bad status, cmd_status=x%08x\n",
1206 hwdescr->dmac_cmd_status);
1207 pr_err("buf_addr=x%08x\n", hw_buf_addr);
1208 pr_err("buf_size=x%08x\n", hwdescr->buf_size);
1209 pr_err("next_descr_addr=x%08x\n", hwdescr->next_descr_addr);
1210 pr_err("result_size=x%08x\n", hwdescr->result_size);
1211 pr_err("valid_size=x%08x\n", hwdescr->valid_size);
1212 pr_err("data_status=x%08x\n", hwdescr->data_status);
1213 pr_err("data_error=x%08x\n", hwdescr->data_error);
1214 pr_err("which=%ld\n", descr - card->rx_chain.ring);
1215
1216 card->spider_stats.rx_desc_error++;
1217 goto bad_desc;
1218 }
1219
1220
1221 spider_net_pass_skb_up(descr, card);
1222 descr->skb = NULL;
1223 hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE;
1224 return 1;
1225
1226 bad_desc:
1227 if (netif_msg_rx_err(card))
1228 show_rx_chain(card);
1229 dev_kfree_skb_irq(descr->skb);
1230 descr->skb = NULL;
1231 hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE;
1232 return 0;
1233 }
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247 static int spider_net_poll(struct napi_struct *napi, int budget)
1248 {
1249 struct spider_net_card *card = container_of(napi, struct spider_net_card, napi);
1250 int packets_done = 0;
1251
1252 while (packets_done < budget) {
1253 if (!spider_net_decode_one_descr(card))
1254 break;
1255
1256 packets_done++;
1257 }
1258
1259 if ((packets_done == 0) && (card->num_rx_ints != 0)) {
1260 if (!spider_net_resync_tail_ptr(card))
1261 packets_done = budget;
1262 spider_net_resync_head_ptr(card);
1263 }
1264 card->num_rx_ints = 0;
1265
1266 spider_net_refill_rx_chain(card);
1267 spider_net_enable_rxdmac(card);
1268
1269 spider_net_cleanup_tx_ring(&card->tx_timer);
1270
1271
1272
1273 if (packets_done < budget) {
1274 napi_complete_done(napi, packets_done);
1275 spider_net_rx_irq_on(card);
1276 card->ignore_rx_ramfull = 0;
1277 }
1278
1279 return packets_done;
1280 }
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290 static int
1291 spider_net_set_mac(struct net_device *netdev, void *p)
1292 {
1293 struct spider_net_card *card = netdev_priv(netdev);
1294 u32 macl, macu, regvalue;
1295 struct sockaddr *addr = p;
1296
1297 if (!is_valid_ether_addr(addr->sa_data))
1298 return -EADDRNOTAVAIL;
1299
1300 eth_hw_addr_set(netdev, addr->sa_data);
1301
1302
1303 regvalue = spider_net_read_reg(card, SPIDER_NET_GMACOPEMD);
1304 regvalue &= ~((1 << 5) | (1 << 6));
1305 spider_net_write_reg(card, SPIDER_NET_GMACOPEMD, regvalue);
1306
1307
1308 macu = (netdev->dev_addr[0]<<24) + (netdev->dev_addr[1]<<16) +
1309 (netdev->dev_addr[2]<<8) + (netdev->dev_addr[3]);
1310 macl = (netdev->dev_addr[4]<<8) + (netdev->dev_addr[5]);
1311 spider_net_write_reg(card, SPIDER_NET_GMACUNIMACU, macu);
1312 spider_net_write_reg(card, SPIDER_NET_GMACUNIMACL, macl);
1313
1314
1315 regvalue = spider_net_read_reg(card, SPIDER_NET_GMACOPEMD);
1316 regvalue |= ((1 << 5) | (1 << 6));
1317 spider_net_write_reg(card, SPIDER_NET_GMACOPEMD, regvalue);
1318
1319 spider_net_set_promisc(card);
1320
1321 return 0;
1322 }
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332 static void
1333 spider_net_link_reset(struct net_device *netdev)
1334 {
1335
1336 struct spider_net_card *card = netdev_priv(netdev);
1337
1338 del_timer_sync(&card->aneg_timer);
1339
1340
1341 spider_net_write_reg(card, SPIDER_NET_GMACST,
1342 spider_net_read_reg(card, SPIDER_NET_GMACST));
1343 spider_net_write_reg(card, SPIDER_NET_GMACINTEN, 0);
1344
1345
1346 card->aneg_count = 0;
1347 card->medium = BCM54XX_COPPER;
1348 spider_net_setup_aneg(card);
1349 mod_timer(&card->aneg_timer, jiffies + SPIDER_NET_ANEG_TIMER);
1350
1351 }
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363 static void
1364 spider_net_handle_error_irq(struct spider_net_card *card, u32 status_reg,
1365 u32 error_reg1, u32 error_reg2)
1366 {
1367 u32 i;
1368 int show_error = 1;
1369
1370
1371 if (status_reg)
1372 for (i = 0; i < 32; i++)
1373 if (status_reg & (1<<i))
1374 switch (i)
1375 {
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385 case SPIDER_NET_GIPSINT:
1386 show_error = 0;
1387 break;
1388
1389 case SPIDER_NET_GPWOPCMPINT:
1390
1391 show_error = 0;
1392 break;
1393 case SPIDER_NET_GPROPCMPINT:
1394
1395
1396
1397
1398
1399 show_error = 0;
1400 break;
1401 case SPIDER_NET_GPWFFINT:
1402
1403 if (netif_msg_intr(card))
1404 dev_err(&card->netdev->dev, "PHY write queue full\n");
1405 show_error = 0;
1406 break;
1407
1408
1409
1410
1411
1412 case SPIDER_NET_GDTDEN0INT:
1413
1414 show_error = 0;
1415 break;
1416
1417 case SPIDER_NET_GDDDEN0INT:
1418 case SPIDER_NET_GDCDEN0INT:
1419 case SPIDER_NET_GDBDEN0INT:
1420 case SPIDER_NET_GDADEN0INT:
1421
1422 show_error = 0;
1423 break;
1424
1425
1426 case SPIDER_NET_GDDFDCINT:
1427 case SPIDER_NET_GDCFDCINT:
1428 case SPIDER_NET_GDBFDCINT:
1429 case SPIDER_NET_GDAFDCINT:
1430
1431
1432
1433
1434
1435 show_error = 0;
1436 break;
1437
1438
1439 case SPIDER_NET_GDTFDCINT:
1440 show_error = 0;
1441 break;
1442 case SPIDER_NET_GTTEDINT:
1443 show_error = 0;
1444 break;
1445 case SPIDER_NET_GDTDCEINT:
1446
1447
1448
1449
1450
1451 show_error = 0;
1452 break;
1453
1454
1455
1456 }
1457
1458
1459 if (error_reg1)
1460 for (i = 0; i < 32; i++)
1461 if (error_reg1 & (1<<i))
1462 switch (i)
1463 {
1464 case SPIDER_NET_GTMFLLINT:
1465
1466
1467
1468 show_error = 0;
1469 break;
1470 case SPIDER_NET_GRFDFLLINT:
1471 case SPIDER_NET_GRFCFLLINT:
1472 case SPIDER_NET_GRFBFLLINT:
1473 case SPIDER_NET_GRFAFLLINT:
1474 case SPIDER_NET_GRMFLLINT:
1475
1476 if (card->ignore_rx_ramfull == 0) {
1477 card->ignore_rx_ramfull = 1;
1478 spider_net_resync_head_ptr(card);
1479 spider_net_refill_rx_chain(card);
1480 spider_net_enable_rxdmac(card);
1481 card->num_rx_ints ++;
1482 napi_schedule(&card->napi);
1483 }
1484 show_error = 0;
1485 break;
1486
1487
1488 case SPIDER_NET_GDTINVDINT:
1489
1490 show_error = 0;
1491 break;
1492
1493
1494 case SPIDER_NET_GDDDCEINT:
1495 case SPIDER_NET_GDCDCEINT:
1496 case SPIDER_NET_GDBDCEINT:
1497 case SPIDER_NET_GDADCEINT:
1498 spider_net_resync_head_ptr(card);
1499 spider_net_refill_rx_chain(card);
1500 spider_net_enable_rxdmac(card);
1501 card->num_rx_ints ++;
1502 napi_schedule(&card->napi);
1503 show_error = 0;
1504 break;
1505
1506
1507 case SPIDER_NET_GDDINVDINT:
1508 case SPIDER_NET_GDCINVDINT:
1509 case SPIDER_NET_GDBINVDINT:
1510 case SPIDER_NET_GDAINVDINT:
1511
1512 spider_net_resync_head_ptr(card);
1513 spider_net_refill_rx_chain(card);
1514 spider_net_enable_rxdmac(card);
1515 card->num_rx_ints ++;
1516 napi_schedule(&card->napi);
1517 show_error = 0;
1518 break;
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531 default:
1532 show_error = 1;
1533 break;
1534 }
1535
1536
1537 if (error_reg2)
1538 for (i = 0; i < 32; i++)
1539 if (error_reg2 & (1<<i))
1540 switch (i)
1541 {
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567 default:
1568 break;
1569 }
1570
1571 if ((show_error) && (netif_msg_intr(card)) && net_ratelimit())
1572 dev_err(&card->netdev->dev, "Error interrupt, GHIINT0STS = 0x%08x, "
1573 "GHIINT1STS = 0x%08x, GHIINT2STS = 0x%08x\n",
1574 status_reg, error_reg1, error_reg2);
1575
1576
1577 spider_net_write_reg(card, SPIDER_NET_GHIINT1STS, error_reg1);
1578 spider_net_write_reg(card, SPIDER_NET_GHIINT2STS, error_reg2);
1579 }
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592 static irqreturn_t
1593 spider_net_interrupt(int irq, void *ptr)
1594 {
1595 struct net_device *netdev = ptr;
1596 struct spider_net_card *card = netdev_priv(netdev);
1597 u32 status_reg, error_reg1, error_reg2;
1598
1599 status_reg = spider_net_read_reg(card, SPIDER_NET_GHIINT0STS);
1600 error_reg1 = spider_net_read_reg(card, SPIDER_NET_GHIINT1STS);
1601 error_reg2 = spider_net_read_reg(card, SPIDER_NET_GHIINT2STS);
1602
1603 if (!(status_reg & SPIDER_NET_INT0_MASK_VALUE) &&
1604 !(error_reg1 & SPIDER_NET_INT1_MASK_VALUE) &&
1605 !(error_reg2 & SPIDER_NET_INT2_MASK_VALUE))
1606 return IRQ_NONE;
1607
1608 if (status_reg & SPIDER_NET_RXINT ) {
1609 spider_net_rx_irq_off(card);
1610 napi_schedule(&card->napi);
1611 card->num_rx_ints ++;
1612 }
1613 if (status_reg & SPIDER_NET_TXINT)
1614 napi_schedule(&card->napi);
1615
1616 if (status_reg & SPIDER_NET_LINKINT)
1617 spider_net_link_reset(netdev);
1618
1619 if (status_reg & SPIDER_NET_ERRINT )
1620 spider_net_handle_error_irq(card, status_reg,
1621 error_reg1, error_reg2);
1622
1623
1624 spider_net_write_reg(card, SPIDER_NET_GHIINT0STS, status_reg);
1625
1626 return IRQ_HANDLED;
1627 }
1628
1629 #ifdef CONFIG_NET_POLL_CONTROLLER
1630
1631
1632
1633
1634
1635
1636 static void
1637 spider_net_poll_controller(struct net_device *netdev)
1638 {
1639 disable_irq(netdev->irq);
1640 spider_net_interrupt(netdev->irq, netdev);
1641 enable_irq(netdev->irq);
1642 }
1643 #endif
1644
1645
1646
1647
1648
1649
1650
1651 static void
1652 spider_net_enable_interrupts(struct spider_net_card *card)
1653 {
1654 spider_net_write_reg(card, SPIDER_NET_GHIINT0MSK,
1655 SPIDER_NET_INT0_MASK_VALUE);
1656 spider_net_write_reg(card, SPIDER_NET_GHIINT1MSK,
1657 SPIDER_NET_INT1_MASK_VALUE);
1658 spider_net_write_reg(card, SPIDER_NET_GHIINT2MSK,
1659 SPIDER_NET_INT2_MASK_VALUE);
1660 }
1661
1662
1663
1664
1665
1666
1667
1668 static void
1669 spider_net_disable_interrupts(struct spider_net_card *card)
1670 {
1671 spider_net_write_reg(card, SPIDER_NET_GHIINT0MSK, 0);
1672 spider_net_write_reg(card, SPIDER_NET_GHIINT1MSK, 0);
1673 spider_net_write_reg(card, SPIDER_NET_GHIINT2MSK, 0);
1674 spider_net_write_reg(card, SPIDER_NET_GMACINTEN, 0);
1675 }
1676
1677
1678
1679
1680
1681
1682
1683
1684 static void
1685 spider_net_init_card(struct spider_net_card *card)
1686 {
1687 spider_net_write_reg(card, SPIDER_NET_CKRCTRL,
1688 SPIDER_NET_CKRCTRL_STOP_VALUE);
1689
1690 spider_net_write_reg(card, SPIDER_NET_CKRCTRL,
1691 SPIDER_NET_CKRCTRL_RUN_VALUE);
1692
1693
1694 spider_net_write_reg(card, SPIDER_NET_GMACOPEMD,
1695 spider_net_read_reg(card, SPIDER_NET_GMACOPEMD) | 0x4);
1696
1697 spider_net_disable_interrupts(card);
1698 }
1699
1700
1701
1702
1703
1704
1705
1706 static void
1707 spider_net_enable_card(struct spider_net_card *card)
1708 {
1709 int i;
1710
1711
1712
1713 u32 regs[][2] = {
1714 { SPIDER_NET_GRESUMINTNUM, 0 },
1715 { SPIDER_NET_GREINTNUM, 0 },
1716
1717
1718
1719 { SPIDER_NET_GFAFRMNUM, SPIDER_NET_GFXFRAMES_VALUE },
1720 { SPIDER_NET_GFBFRMNUM, SPIDER_NET_GFXFRAMES_VALUE },
1721 { SPIDER_NET_GFCFRMNUM, SPIDER_NET_GFXFRAMES_VALUE },
1722 { SPIDER_NET_GFDFRMNUM, SPIDER_NET_GFXFRAMES_VALUE },
1723
1724 { SPIDER_NET_GFFRMNUM, SPIDER_NET_FRAMENUM_VALUE },
1725
1726
1727 { SPIDER_NET_GFREECNNUM, 0 },
1728 { SPIDER_NET_GONETIMENUM, 0 },
1729 { SPIDER_NET_GTOUTFRMNUM, 0 },
1730
1731
1732 { SPIDER_NET_GRXMDSET, SPIDER_NET_RXMODE_VALUE },
1733
1734 { SPIDER_NET_GTXMDSET, SPIDER_NET_TXMODE_VALUE },
1735
1736 { SPIDER_NET_GIPSECINIT, SPIDER_NET_IPSECINIT_VALUE },
1737
1738 { SPIDER_NET_GFTRESTRT, SPIDER_NET_RESTART_VALUE },
1739
1740 { SPIDER_NET_GMRWOLCTRL, 0 },
1741 { SPIDER_NET_GTESTMD, 0x10000000 },
1742 { SPIDER_NET_GTTQMSK, 0x00400040 },
1743
1744 { SPIDER_NET_GMACINTEN, 0 },
1745
1746
1747 { SPIDER_NET_GMACAPAUSE, SPIDER_NET_MACAPAUSE_VALUE },
1748 { SPIDER_NET_GMACTXPAUSE, SPIDER_NET_TXPAUSE_VALUE },
1749
1750 { SPIDER_NET_GMACBSTLMT, SPIDER_NET_BURSTLMT_VALUE },
1751 { 0, 0}
1752 };
1753
1754 i = 0;
1755 while (regs[i][0]) {
1756 spider_net_write_reg(card, regs[i][0], regs[i][1]);
1757 i++;
1758 }
1759
1760
1761 for (i = 1; i <= 14; i++) {
1762 spider_net_write_reg(card,
1763 SPIDER_NET_GMRUAFILnR + i * 8,
1764 0x00080000);
1765 spider_net_write_reg(card,
1766 SPIDER_NET_GMRUAFILnR + i * 8 + 4,
1767 0x00000000);
1768 }
1769
1770 spider_net_write_reg(card, SPIDER_NET_GMRUA0FIL15R, 0x08080000);
1771
1772 spider_net_write_reg(card, SPIDER_NET_ECMODE, SPIDER_NET_ECMODE_VALUE);
1773
1774
1775
1776
1777 spider_net_enable_rxchtails(card);
1778 spider_net_enable_rxdmac(card);
1779
1780 spider_net_write_reg(card, SPIDER_NET_GRXDMAEN, SPIDER_NET_WOL_VALUE);
1781
1782 spider_net_write_reg(card, SPIDER_NET_GMACLENLMT,
1783 SPIDER_NET_LENLMT_VALUE);
1784 spider_net_write_reg(card, SPIDER_NET_GMACOPEMD,
1785 SPIDER_NET_OPMODE_VALUE);
1786
1787 spider_net_write_reg(card, SPIDER_NET_GDTDMACCNTR,
1788 SPIDER_NET_GDTBSTA);
1789 }
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799 static int
1800 spider_net_download_firmware(struct spider_net_card *card,
1801 const void *firmware_ptr)
1802 {
1803 int sequencer, i;
1804 const u32 *fw_ptr = firmware_ptr;
1805
1806
1807 spider_net_write_reg(card, SPIDER_NET_GSINIT,
1808 SPIDER_NET_STOP_SEQ_VALUE);
1809
1810 for (sequencer = 0; sequencer < SPIDER_NET_FIRMWARE_SEQS;
1811 sequencer++) {
1812 spider_net_write_reg(card,
1813 SPIDER_NET_GSnPRGADR + sequencer * 8, 0);
1814 for (i = 0; i < SPIDER_NET_FIRMWARE_SEQWORDS; i++) {
1815 spider_net_write_reg(card, SPIDER_NET_GSnPRGDAT +
1816 sequencer * 8, *fw_ptr);
1817 fw_ptr++;
1818 }
1819 }
1820
1821 if (spider_net_read_reg(card, SPIDER_NET_GSINIT))
1822 return -EIO;
1823
1824 spider_net_write_reg(card, SPIDER_NET_GSINIT,
1825 SPIDER_NET_RUN_SEQ_VALUE);
1826
1827 return 0;
1828 }
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856 static int
1857 spider_net_init_firmware(struct spider_net_card *card)
1858 {
1859 struct firmware *firmware = NULL;
1860 struct device_node *dn;
1861 const u8 *fw_prop = NULL;
1862 int err = -ENOENT;
1863 int fw_size;
1864
1865 if (request_firmware((const struct firmware **)&firmware,
1866 SPIDER_NET_FIRMWARE_NAME, &card->pdev->dev) == 0) {
1867 if ( (firmware->size != SPIDER_NET_FIRMWARE_LEN) &&
1868 netif_msg_probe(card) ) {
1869 dev_err(&card->netdev->dev,
1870 "Incorrect size of spidernet firmware in " \
1871 "filesystem. Looking in host firmware...\n");
1872 goto try_host_fw;
1873 }
1874 err = spider_net_download_firmware(card, firmware->data);
1875
1876 release_firmware(firmware);
1877 if (err)
1878 goto try_host_fw;
1879
1880 goto done;
1881 }
1882
1883 try_host_fw:
1884 dn = pci_device_to_OF_node(card->pdev);
1885 if (!dn)
1886 goto out_err;
1887
1888 fw_prop = of_get_property(dn, "firmware", &fw_size);
1889 if (!fw_prop)
1890 goto out_err;
1891
1892 if ( (fw_size != SPIDER_NET_FIRMWARE_LEN) &&
1893 netif_msg_probe(card) ) {
1894 dev_err(&card->netdev->dev,
1895 "Incorrect size of spidernet firmware in host firmware\n");
1896 goto done;
1897 }
1898
1899 err = spider_net_download_firmware(card, fw_prop);
1900
1901 done:
1902 return err;
1903 out_err:
1904 if (netif_msg_probe(card))
1905 dev_err(&card->netdev->dev,
1906 "Couldn't find spidernet firmware in filesystem " \
1907 "or host firmware\n");
1908 return err;
1909 }
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920 int
1921 spider_net_open(struct net_device *netdev)
1922 {
1923 struct spider_net_card *card = netdev_priv(netdev);
1924 int result;
1925
1926 result = spider_net_init_firmware(card);
1927 if (result)
1928 goto init_firmware_failed;
1929
1930
1931 card->aneg_count = 0;
1932 card->medium = BCM54XX_COPPER;
1933 spider_net_setup_aneg(card);
1934 if (card->phy.def->phy_id)
1935 mod_timer(&card->aneg_timer, jiffies + SPIDER_NET_ANEG_TIMER);
1936
1937 result = spider_net_init_chain(card, &card->tx_chain);
1938 if (result)
1939 goto alloc_tx_failed;
1940 card->low_watermark = NULL;
1941
1942 result = spider_net_init_chain(card, &card->rx_chain);
1943 if (result)
1944 goto alloc_rx_failed;
1945
1946
1947 result = spider_net_alloc_rx_skbs(card);
1948 if (result)
1949 goto alloc_skbs_failed;
1950
1951 spider_net_set_multi(netdev);
1952
1953
1954
1955 result = -EBUSY;
1956 if (request_irq(netdev->irq, spider_net_interrupt,
1957 IRQF_SHARED, netdev->name, netdev))
1958 goto register_int_failed;
1959
1960 spider_net_enable_card(card);
1961
1962 netif_start_queue(netdev);
1963 netif_carrier_on(netdev);
1964 napi_enable(&card->napi);
1965
1966 spider_net_enable_interrupts(card);
1967
1968 return 0;
1969
1970 register_int_failed:
1971 spider_net_free_rx_chain_contents(card);
1972 alloc_skbs_failed:
1973 spider_net_free_chain(card, &card->rx_chain);
1974 alloc_rx_failed:
1975 spider_net_free_chain(card, &card->tx_chain);
1976 alloc_tx_failed:
1977 del_timer_sync(&card->aneg_timer);
1978 init_firmware_failed:
1979 return result;
1980 }
1981
1982
1983
1984
1985
1986 static void spider_net_link_phy(struct timer_list *t)
1987 {
1988 struct spider_net_card *card = from_timer(card, t, aneg_timer);
1989 struct mii_phy *phy = &card->phy;
1990
1991
1992 if (card->aneg_count > SPIDER_NET_ANEG_TIMEOUT) {
1993
1994 pr_debug("%s: link is down trying to bring it up\n",
1995 card->netdev->name);
1996
1997 switch (card->medium) {
1998 case BCM54XX_COPPER:
1999
2000 if (phy->def->ops->enable_fiber)
2001 phy->def->ops->enable_fiber(phy, 1);
2002 card->medium = BCM54XX_FIBER;
2003 break;
2004
2005 case BCM54XX_FIBER:
2006
2007 if (phy->def->ops->enable_fiber)
2008 phy->def->ops->enable_fiber(phy, 0);
2009 card->medium = BCM54XX_UNKNOWN;
2010 break;
2011
2012 case BCM54XX_UNKNOWN:
2013
2014
2015
2016 spider_net_setup_aneg(card);
2017 card->medium = BCM54XX_COPPER;
2018 break;
2019 }
2020
2021 card->aneg_count = 0;
2022 mod_timer(&card->aneg_timer, jiffies + SPIDER_NET_ANEG_TIMER);
2023 return;
2024 }
2025
2026
2027 if (!(phy->def->ops->poll_link(phy))) {
2028 card->aneg_count++;
2029 mod_timer(&card->aneg_timer, jiffies + SPIDER_NET_ANEG_TIMER);
2030 return;
2031 }
2032
2033
2034 phy->def->ops->read_link(phy);
2035
2036 spider_net_write_reg(card, SPIDER_NET_GMACST,
2037 spider_net_read_reg(card, SPIDER_NET_GMACST));
2038 spider_net_write_reg(card, SPIDER_NET_GMACINTEN, 0x4);
2039
2040 if (phy->speed == 1000)
2041 spider_net_write_reg(card, SPIDER_NET_GMACMODE, 0x00000001);
2042 else
2043 spider_net_write_reg(card, SPIDER_NET_GMACMODE, 0);
2044
2045 card->aneg_count = 0;
2046
2047 pr_info("%s: link up, %i Mbps, %s-duplex %sautoneg.\n",
2048 card->netdev->name, phy->speed,
2049 phy->duplex == 1 ? "Full" : "Half",
2050 phy->autoneg == 1 ? "" : "no ");
2051 }
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061 static int
2062 spider_net_setup_phy(struct spider_net_card *card)
2063 {
2064 struct mii_phy *phy = &card->phy;
2065
2066 spider_net_write_reg(card, SPIDER_NET_GDTDMASEL,
2067 SPIDER_NET_DMASEL_VALUE);
2068 spider_net_write_reg(card, SPIDER_NET_GPCCTRL,
2069 SPIDER_NET_PHY_CTRL_VALUE);
2070
2071 phy->dev = card->netdev;
2072 phy->mdio_read = spider_net_read_phy;
2073 phy->mdio_write = spider_net_write_phy;
2074
2075 for (phy->mii_id = 1; phy->mii_id <= 31; phy->mii_id++) {
2076 unsigned short id;
2077 id = spider_net_read_phy(card->netdev, phy->mii_id, MII_BMSR);
2078 if (id != 0x0000 && id != 0xffff) {
2079 if (!sungem_phy_probe(phy, phy->mii_id)) {
2080 pr_info("Found %s.\n", phy->def->name);
2081 break;
2082 }
2083 }
2084 }
2085
2086 return 0;
2087 }
2088
2089
2090
2091
2092
2093
2094
2095 static void
2096 spider_net_workaround_rxramfull(struct spider_net_card *card)
2097 {
2098 int i, sequencer = 0;
2099
2100
2101 spider_net_write_reg(card, SPIDER_NET_CKRCTRL,
2102 SPIDER_NET_CKRCTRL_RUN_VALUE);
2103
2104
2105 for (sequencer = 0; sequencer < SPIDER_NET_FIRMWARE_SEQS;
2106 sequencer++) {
2107 spider_net_write_reg(card, SPIDER_NET_GSnPRGADR +
2108 sequencer * 8, 0x0);
2109 for (i = 0; i < SPIDER_NET_FIRMWARE_SEQWORDS; i++) {
2110 spider_net_write_reg(card, SPIDER_NET_GSnPRGDAT +
2111 sequencer * 8, 0x0);
2112 }
2113 }
2114
2115
2116 spider_net_write_reg(card, SPIDER_NET_GSINIT, 0x000000fe);
2117
2118
2119 spider_net_write_reg(card, SPIDER_NET_CKRCTRL,
2120 SPIDER_NET_CKRCTRL_STOP_VALUE);
2121 }
2122
2123
2124
2125
2126
2127
2128
2129 int
2130 spider_net_stop(struct net_device *netdev)
2131 {
2132 struct spider_net_card *card = netdev_priv(netdev);
2133
2134 napi_disable(&card->napi);
2135 netif_carrier_off(netdev);
2136 netif_stop_queue(netdev);
2137 del_timer_sync(&card->tx_timer);
2138 del_timer_sync(&card->aneg_timer);
2139
2140 spider_net_disable_interrupts(card);
2141
2142 free_irq(netdev->irq, netdev);
2143
2144 spider_net_write_reg(card, SPIDER_NET_GDTDMACCNTR,
2145 SPIDER_NET_DMA_TX_FEND_VALUE);
2146
2147
2148 spider_net_disable_rxdmac(card);
2149
2150
2151 spider_net_release_tx_chain(card, 1);
2152 spider_net_free_rx_chain_contents(card);
2153
2154 spider_net_free_chain(card, &card->tx_chain);
2155 spider_net_free_chain(card, &card->rx_chain);
2156
2157 return 0;
2158 }
2159
2160
2161
2162
2163
2164
2165
2166
2167 static void
2168 spider_net_tx_timeout_task(struct work_struct *work)
2169 {
2170 struct spider_net_card *card =
2171 container_of(work, struct spider_net_card, tx_timeout_task);
2172 struct net_device *netdev = card->netdev;
2173
2174 if (!(netdev->flags & IFF_UP))
2175 goto out;
2176
2177 netif_device_detach(netdev);
2178 spider_net_stop(netdev);
2179
2180 spider_net_workaround_rxramfull(card);
2181 spider_net_init_card(card);
2182
2183 if (spider_net_setup_phy(card))
2184 goto out;
2185
2186 spider_net_open(netdev);
2187 spider_net_kick_tx_dma(card);
2188 netif_device_attach(netdev);
2189
2190 out:
2191 atomic_dec(&card->tx_timeout_task_counter);
2192 }
2193
2194
2195
2196
2197
2198
2199
2200
2201 static void
2202 spider_net_tx_timeout(struct net_device *netdev, unsigned int txqueue)
2203 {
2204 struct spider_net_card *card;
2205
2206 card = netdev_priv(netdev);
2207 atomic_inc(&card->tx_timeout_task_counter);
2208 if (netdev->flags & IFF_UP)
2209 schedule_work(&card->tx_timeout_task);
2210 else
2211 atomic_dec(&card->tx_timeout_task_counter);
2212 card->spider_stats.tx_timeouts++;
2213 }
2214
2215 static const struct net_device_ops spider_net_ops = {
2216 .ndo_open = spider_net_open,
2217 .ndo_stop = spider_net_stop,
2218 .ndo_start_xmit = spider_net_xmit,
2219 .ndo_set_rx_mode = spider_net_set_multi,
2220 .ndo_set_mac_address = spider_net_set_mac,
2221 .ndo_eth_ioctl = spider_net_do_ioctl,
2222 .ndo_tx_timeout = spider_net_tx_timeout,
2223 .ndo_validate_addr = eth_validate_addr,
2224
2225 #ifdef CONFIG_NET_POLL_CONTROLLER
2226
2227 .ndo_poll_controller = spider_net_poll_controller,
2228 #endif
2229 };
2230
2231
2232
2233
2234
2235
2236
2237 static void
2238 spider_net_setup_netdev_ops(struct net_device *netdev)
2239 {
2240 netdev->netdev_ops = &spider_net_ops;
2241 netdev->watchdog_timeo = SPIDER_NET_WATCHDOG_TIMEOUT;
2242
2243 netdev->ethtool_ops = &spider_net_ethtool_ops;
2244 }
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254 static int
2255 spider_net_setup_netdev(struct spider_net_card *card)
2256 {
2257 int result;
2258 struct net_device *netdev = card->netdev;
2259 struct device_node *dn;
2260 struct sockaddr addr;
2261 const u8 *mac;
2262
2263 SET_NETDEV_DEV(netdev, &card->pdev->dev);
2264
2265 pci_set_drvdata(card->pdev, netdev);
2266
2267 timer_setup(&card->tx_timer, spider_net_cleanup_tx_ring, 0);
2268 netdev->irq = card->pdev->irq;
2269
2270 card->aneg_count = 0;
2271 timer_setup(&card->aneg_timer, spider_net_link_phy, 0);
2272
2273 netif_napi_add(netdev, &card->napi,
2274 spider_net_poll, NAPI_POLL_WEIGHT);
2275
2276 spider_net_setup_netdev_ops(netdev);
2277
2278 netdev->hw_features = NETIF_F_RXCSUM | NETIF_F_IP_CSUM;
2279 if (SPIDER_NET_RX_CSUM_DEFAULT)
2280 netdev->features |= NETIF_F_RXCSUM;
2281 netdev->features |= NETIF_F_IP_CSUM | NETIF_F_LLTX;
2282
2283
2284
2285
2286
2287 netdev->min_mtu = SPIDER_NET_MIN_MTU;
2288 netdev->max_mtu = SPIDER_NET_MAX_MTU;
2289
2290 netdev->irq = card->pdev->irq;
2291 card->num_rx_ints = 0;
2292 card->ignore_rx_ramfull = 0;
2293
2294 dn = pci_device_to_OF_node(card->pdev);
2295 if (!dn)
2296 return -EIO;
2297
2298 mac = of_get_property(dn, "local-mac-address", NULL);
2299 if (!mac)
2300 return -EIO;
2301 memcpy(addr.sa_data, mac, ETH_ALEN);
2302
2303 result = spider_net_set_mac(netdev, &addr);
2304 if ((result) && (netif_msg_probe(card)))
2305 dev_err(&card->netdev->dev,
2306 "Failed to set MAC address: %i\n", result);
2307
2308 result = register_netdev(netdev);
2309 if (result) {
2310 if (netif_msg_probe(card))
2311 dev_err(&card->netdev->dev,
2312 "Couldn't register net_device: %i\n", result);
2313 return result;
2314 }
2315
2316 if (netif_msg_probe(card))
2317 pr_info("Initialized device %s.\n", netdev->name);
2318
2319 return 0;
2320 }
2321
2322
2323
2324
2325
2326
2327
2328
2329 static struct spider_net_card *
2330 spider_net_alloc_card(void)
2331 {
2332 struct net_device *netdev;
2333 struct spider_net_card *card;
2334
2335 netdev = alloc_etherdev(struct_size(card, darray,
2336 tx_descriptors + rx_descriptors));
2337 if (!netdev)
2338 return NULL;
2339
2340 card = netdev_priv(netdev);
2341 card->netdev = netdev;
2342 card->msg_enable = SPIDER_NET_DEFAULT_MSG;
2343 INIT_WORK(&card->tx_timeout_task, spider_net_tx_timeout_task);
2344 init_waitqueue_head(&card->waitq);
2345 atomic_set(&card->tx_timeout_task_counter, 0);
2346
2347 card->rx_chain.num_desc = rx_descriptors;
2348 card->rx_chain.ring = card->darray;
2349 card->tx_chain.num_desc = tx_descriptors;
2350 card->tx_chain.ring = card->darray + rx_descriptors;
2351
2352 return card;
2353 }
2354
2355
2356
2357
2358
2359
2360
2361 static void
2362 spider_net_undo_pci_setup(struct spider_net_card *card)
2363 {
2364 iounmap(card->regs);
2365 pci_release_regions(card->pdev);
2366 }
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380 static struct spider_net_card *
2381 spider_net_setup_pci_dev(struct pci_dev *pdev)
2382 {
2383 struct spider_net_card *card;
2384 unsigned long mmio_start, mmio_len;
2385
2386 if (pci_enable_device(pdev)) {
2387 dev_err(&pdev->dev, "Couldn't enable PCI device\n");
2388 return NULL;
2389 }
2390
2391 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
2392 dev_err(&pdev->dev,
2393 "Couldn't find proper PCI device base address.\n");
2394 goto out_disable_dev;
2395 }
2396
2397 if (pci_request_regions(pdev, spider_net_driver_name)) {
2398 dev_err(&pdev->dev,
2399 "Couldn't obtain PCI resources, aborting.\n");
2400 goto out_disable_dev;
2401 }
2402
2403 pci_set_master(pdev);
2404
2405 card = spider_net_alloc_card();
2406 if (!card) {
2407 dev_err(&pdev->dev,
2408 "Couldn't allocate net_device structure, aborting.\n");
2409 goto out_release_regions;
2410 }
2411 card->pdev = pdev;
2412
2413
2414 mmio_start = pci_resource_start(pdev, 0);
2415 mmio_len = pci_resource_len(pdev, 0);
2416
2417 card->netdev->mem_start = mmio_start;
2418 card->netdev->mem_end = mmio_start + mmio_len;
2419 card->regs = ioremap(mmio_start, mmio_len);
2420
2421 if (!card->regs) {
2422 dev_err(&pdev->dev,
2423 "Couldn't obtain PCI resources, aborting.\n");
2424 goto out_release_regions;
2425 }
2426
2427 return card;
2428
2429 out_release_regions:
2430 pci_release_regions(pdev);
2431 out_disable_dev:
2432 pci_disable_device(pdev);
2433 return NULL;
2434 }
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446 static int
2447 spider_net_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2448 {
2449 int err = -EIO;
2450 struct spider_net_card *card;
2451
2452 card = spider_net_setup_pci_dev(pdev);
2453 if (!card)
2454 goto out;
2455
2456 spider_net_workaround_rxramfull(card);
2457 spider_net_init_card(card);
2458
2459 err = spider_net_setup_phy(card);
2460 if (err)
2461 goto out_undo_pci;
2462
2463 err = spider_net_setup_netdev(card);
2464 if (err)
2465 goto out_undo_pci;
2466
2467 return 0;
2468
2469 out_undo_pci:
2470 spider_net_undo_pci_setup(card);
2471 free_netdev(card->netdev);
2472 out:
2473 return err;
2474 }
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485 static void
2486 spider_net_remove(struct pci_dev *pdev)
2487 {
2488 struct net_device *netdev;
2489 struct spider_net_card *card;
2490
2491 netdev = pci_get_drvdata(pdev);
2492 card = netdev_priv(netdev);
2493
2494 wait_event(card->waitq,
2495 atomic_read(&card->tx_timeout_task_counter) == 0);
2496
2497 unregister_netdev(netdev);
2498
2499
2500 spider_net_write_reg(card, SPIDER_NET_CKRCTRL,
2501 SPIDER_NET_CKRCTRL_STOP_VALUE);
2502 spider_net_write_reg(card, SPIDER_NET_CKRCTRL,
2503 SPIDER_NET_CKRCTRL_RUN_VALUE);
2504
2505 spider_net_undo_pci_setup(card);
2506 free_netdev(netdev);
2507 }
2508
2509 static struct pci_driver spider_net_driver = {
2510 .name = spider_net_driver_name,
2511 .id_table = spider_net_pci_tbl,
2512 .probe = spider_net_probe,
2513 .remove = spider_net_remove
2514 };
2515
2516
2517
2518
2519
2520
2521 static int __init spider_net_init(void)
2522 {
2523 printk(KERN_INFO "Spidernet version %s.\n", VERSION);
2524
2525 if (rx_descriptors < SPIDER_NET_RX_DESCRIPTORS_MIN) {
2526 rx_descriptors = SPIDER_NET_RX_DESCRIPTORS_MIN;
2527 pr_info("adjusting rx descriptors to %i.\n", rx_descriptors);
2528 }
2529 if (rx_descriptors > SPIDER_NET_RX_DESCRIPTORS_MAX) {
2530 rx_descriptors = SPIDER_NET_RX_DESCRIPTORS_MAX;
2531 pr_info("adjusting rx descriptors to %i.\n", rx_descriptors);
2532 }
2533 if (tx_descriptors < SPIDER_NET_TX_DESCRIPTORS_MIN) {
2534 tx_descriptors = SPIDER_NET_TX_DESCRIPTORS_MIN;
2535 pr_info("adjusting tx descriptors to %i.\n", tx_descriptors);
2536 }
2537 if (tx_descriptors > SPIDER_NET_TX_DESCRIPTORS_MAX) {
2538 tx_descriptors = SPIDER_NET_TX_DESCRIPTORS_MAX;
2539 pr_info("adjusting tx descriptors to %i.\n", tx_descriptors);
2540 }
2541
2542 return pci_register_driver(&spider_net_driver);
2543 }
2544
2545
2546
2547
2548
2549
2550 static void __exit spider_net_cleanup(void)
2551 {
2552 pci_unregister_driver(&spider_net_driver);
2553 }
2554
2555 module_init(spider_net_init);
2556 module_exit(spider_net_cleanup);