Lines Matching +full:dma +full:- +full:poll +full:- +full:cnt

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Network device driver for Cell Processor-Based Blade and Celleb platform
72 * spider_net_read_reg - reads an SMMIO register of a card
85 return in_be32(card->regs + reg); in spider_net_read_reg()
89 * spider_net_write_reg - writes to an SMMIO register of a card
101 out_be32(card->regs + reg, value); in spider_net_write_reg()
105 * spider_net_write_phy - write to phy register
129 * spider_net_read_phy - read from phy register
149 * interrupt, as we poll for the completion of the read operation in spider_net_read_phy()
162 * spider_net_setup_aneg - initial auto-negotiation setup
168 struct mii_phy *phy = &card->phy; in spider_net_setup_aneg()
172 bmsr = spider_net_read_phy(card->netdev, phy->mii_id, MII_BMSR); in spider_net_setup_aneg()
173 estat = spider_net_read_phy(card->netdev, phy->mii_id, MII_ESTATUS); in spider_net_setup_aneg()
189 sungem_phy_probe(phy, phy->mii_id); in spider_net_setup_aneg()
190 phy->def->ops->setup_aneg(phy, advertise); in spider_net_setup_aneg()
195 * spider_net_rx_irq_off - switch off rx irq on this spider card
210 * spider_net_rx_irq_on - switch on rx irq on this spider card
225 * spider_net_set_promisc - sets the unicast address or the promiscuous mode
229 * thus either allows for non-promisc mode or promisc mode
235 struct net_device *netdev = card->netdev; in spider_net_set_promisc()
237 if (netdev->flags & IFF_PROMISC) { in spider_net_set_promisc()
244 macu = netdev->dev_addr[0]; in spider_net_set_promisc()
246 macu |= netdev->dev_addr[1]; in spider_net_set_promisc()
247 memcpy(&macl, &netdev->dev_addr[2], sizeof(macl)); in spider_net_set_promisc()
258 * spider_net_get_descr_status -- returns the status of a descriptor
266 return hwdescr->dmac_cmd_status & SPIDER_NET_DESCR_IND_PROC_MASK; in spider_net_get_descr_status()
270 * spider_net_free_chain - free descriptor chain
281 descr = chain->ring; in spider_net_free_chain()
283 descr->bus_addr = 0; in spider_net_free_chain()
284 descr->hwdescr->next_descr_addr = 0; in spider_net_free_chain()
285 descr = descr->next; in spider_net_free_chain()
286 } while (descr != chain->ring); in spider_net_free_chain()
288 dma_free_coherent(&card->pdev->dev, chain->num_desc * sizeof(struct spider_net_hw_descr), in spider_net_free_chain()
289 chain->hwring, chain->dma_addr); in spider_net_free_chain()
293 * spider_net_init_chain - alloc and link descriptor chain
312 alloc_size = chain->num_desc * sizeof(struct spider_net_hw_descr); in spider_net_init_chain()
314 chain->hwring = dma_alloc_coherent(&card->pdev->dev, alloc_size, in spider_net_init_chain()
315 &chain->dma_addr, GFP_KERNEL); in spider_net_init_chain()
316 if (!chain->hwring) in spider_net_init_chain()
317 return -ENOMEM; in spider_net_init_chain()
320 descr = chain->ring; in spider_net_init_chain()
321 hwdescr = chain->hwring; in spider_net_init_chain()
322 buf = chain->dma_addr; in spider_net_init_chain()
323 for (i=0; i < chain->num_desc; i++, descr++, hwdescr++) { in spider_net_init_chain()
324 hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE; in spider_net_init_chain()
325 hwdescr->next_descr_addr = 0; in spider_net_init_chain()
327 descr->hwdescr = hwdescr; in spider_net_init_chain()
328 descr->bus_addr = buf; in spider_net_init_chain()
329 descr->next = descr + 1; in spider_net_init_chain()
330 descr->prev = descr - 1; in spider_net_init_chain()
335 (descr-1)->next = chain->ring; in spider_net_init_chain()
336 chain->ring->prev = descr-1; in spider_net_init_chain()
338 spin_lock_init(&chain->lock); in spider_net_init_chain()
339 chain->head = chain->ring; in spider_net_init_chain()
340 chain->tail = chain->ring; in spider_net_init_chain()
345 * spider_net_free_rx_chain_contents - frees descr contents in rx chain
355 descr = card->rx_chain.head; in spider_net_free_rx_chain_contents()
357 if (descr->skb) { in spider_net_free_rx_chain_contents()
358 dma_unmap_single(&card->pdev->dev, in spider_net_free_rx_chain_contents()
359 descr->hwdescr->buf_addr, in spider_net_free_rx_chain_contents()
362 dev_kfree_skb(descr->skb); in spider_net_free_rx_chain_contents()
363 descr->skb = NULL; in spider_net_free_rx_chain_contents()
365 descr = descr->next; in spider_net_free_rx_chain_contents()
366 } while (descr != card->rx_chain.head); in spider_net_free_rx_chain_contents()
370 * spider_net_prepare_rx_descr - Reinitialize RX descriptor
372 * @descr: descriptor to re-init
376 * Allocates a new rx skb, iommu-maps it and attaches it to the
377 * descriptor. Mark the descriptor as activated, ready-to-use.
383 struct spider_net_hw_descr *hwdescr = descr->hwdescr; in spider_net_prepare_rx_descr()
389 bufsize = (SPIDER_NET_MAX_FRAME + SPIDER_NET_RXBUF_ALIGN - 1) & in spider_net_prepare_rx_descr()
390 (~(SPIDER_NET_RXBUF_ALIGN - 1)); in spider_net_prepare_rx_descr()
396 descr->skb = netdev_alloc_skb(card->netdev, in spider_net_prepare_rx_descr()
397 bufsize + SPIDER_NET_RXBUF_ALIGN - 1); in spider_net_prepare_rx_descr()
398 if (!descr->skb) { in spider_net_prepare_rx_descr()
400 dev_err(&card->netdev->dev, in spider_net_prepare_rx_descr()
402 card->spider_stats.alloc_rx_skb_error++; in spider_net_prepare_rx_descr()
403 return -ENOMEM; in spider_net_prepare_rx_descr()
405 hwdescr->buf_size = bufsize; in spider_net_prepare_rx_descr()
406 hwdescr->result_size = 0; in spider_net_prepare_rx_descr()
407 hwdescr->valid_size = 0; in spider_net_prepare_rx_descr()
408 hwdescr->data_status = 0; in spider_net_prepare_rx_descr()
409 hwdescr->data_error = 0; in spider_net_prepare_rx_descr()
411 offset = ((unsigned long)descr->skb->data) & in spider_net_prepare_rx_descr()
412 (SPIDER_NET_RXBUF_ALIGN - 1); in spider_net_prepare_rx_descr()
414 skb_reserve(descr->skb, SPIDER_NET_RXBUF_ALIGN - offset); in spider_net_prepare_rx_descr()
415 /* iommu-map the skb */ in spider_net_prepare_rx_descr()
416 buf = dma_map_single(&card->pdev->dev, descr->skb->data, in spider_net_prepare_rx_descr()
418 if (dma_mapping_error(&card->pdev->dev, buf)) { in spider_net_prepare_rx_descr()
419 dev_kfree_skb_any(descr->skb); in spider_net_prepare_rx_descr()
420 descr->skb = NULL; in spider_net_prepare_rx_descr()
422 dev_err(&card->netdev->dev, "Could not iommu-map rx buffer\n"); in spider_net_prepare_rx_descr()
423 card->spider_stats.rx_iommu_map_error++; in spider_net_prepare_rx_descr()
424 hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE; in spider_net_prepare_rx_descr()
426 hwdescr->buf_addr = buf; in spider_net_prepare_rx_descr()
428 hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_CARDOWNED | in spider_net_prepare_rx_descr()
436 * spider_net_enable_rxchtails - sets RX dmac chain tail addresses
440 * chip by writing to the appropriate register. DMA is enabled in
448 card->rx_chain.tail->bus_addr); in spider_net_enable_rxchtails()
452 * spider_net_enable_rxdmac - enables a receive DMA controller
455 * spider_net_enable_rxdmac enables the DMA controller by setting RX_DMA_EN
467 * spider_net_disable_rxdmac - disables the receive DMA controller
470 * spider_net_disable_rxdmac terminates processing on the DMA controller
471 * by turing off the DMA controller, with the force-end flag set.
481 * spider_net_refill_rx_chain - refills descriptors/skbs in the rx chains
484 * refills descriptors in the rx chain: allocates skbs and iommu-maps them.
489 struct spider_net_descr_chain *chain = &card->rx_chain; in spider_net_refill_rx_chain()
497 if (!spin_trylock_irqsave(&chain->lock, flags)) in spider_net_refill_rx_chain()
500 while (spider_net_get_descr_status(chain->head->hwdescr) == in spider_net_refill_rx_chain()
502 if (spider_net_prepare_rx_descr(card, chain->head)) in spider_net_refill_rx_chain()
504 chain->head = chain->head->next; in spider_net_refill_rx_chain()
507 spin_unlock_irqrestore(&chain->lock, flags); in spider_net_refill_rx_chain()
511 * spider_net_alloc_rx_skbs - Allocates rx skbs in rx descriptor chains
519 struct spider_net_descr_chain *chain = &card->rx_chain; in spider_net_alloc_rx_skbs()
520 struct spider_net_descr *start = chain->tail; in spider_net_alloc_rx_skbs()
525 descr->prev->hwdescr->next_descr_addr = descr->bus_addr; in spider_net_alloc_rx_skbs()
526 descr = descr->next; in spider_net_alloc_rx_skbs()
533 if (spider_net_prepare_rx_descr(card, chain->head)) in spider_net_alloc_rx_skbs()
536 chain->head = chain->head->next; in spider_net_alloc_rx_skbs()
547 return -ENOMEM; in spider_net_alloc_rx_skbs()
551 * spider_net_get_multicast_hash - generates hash for multicast filter table
570 addr_for_crc[ETH_ALEN - 1 - i / 8] += bit << (7 - (i % 8)); in spider_net_get_multicast_hash()
573 crc = crc32_be(~0, addr_for_crc, netdev->addr_len); in spider_net_get_multicast_hash()
584 * spider_net_set_multi - sets multicast addresses and promisc flags
603 if (netdev->flags & IFF_ALLMULTI) { in spider_net_set_multi()
611 hash = spider_net_get_multicast_hash(netdev, netdev->broadcast); */ in spider_net_set_multi()
615 hash = spider_net_get_multicast_hash(netdev, ha->addr); in spider_net_set_multi()
639 * spider_net_prepare_tx_descr - fill tx descriptor with skb data
646 * if needed (32bit DMA!)
652 struct spider_net_descr_chain *chain = &card->tx_chain; in spider_net_prepare_tx_descr()
658 buf = dma_map_single(&card->pdev->dev, skb->data, skb->len, in spider_net_prepare_tx_descr()
660 if (dma_mapping_error(&card->pdev->dev, buf)) { in spider_net_prepare_tx_descr()
662 dev_err(&card->netdev->dev, "could not iommu-map packet (%p, %i). " in spider_net_prepare_tx_descr()
663 "Dropping packet\n", skb->data, skb->len); in spider_net_prepare_tx_descr()
664 card->spider_stats.tx_iommu_map_error++; in spider_net_prepare_tx_descr()
665 return -ENOMEM; in spider_net_prepare_tx_descr()
668 spin_lock_irqsave(&chain->lock, flags); in spider_net_prepare_tx_descr()
669 descr = card->tx_chain.head; in spider_net_prepare_tx_descr()
670 if (descr->next == chain->tail->prev) { in spider_net_prepare_tx_descr()
671 spin_unlock_irqrestore(&chain->lock, flags); in spider_net_prepare_tx_descr()
672 dma_unmap_single(&card->pdev->dev, buf, skb->len, in spider_net_prepare_tx_descr()
674 return -ENOMEM; in spider_net_prepare_tx_descr()
676 hwdescr = descr->hwdescr; in spider_net_prepare_tx_descr()
677 chain->head = descr->next; in spider_net_prepare_tx_descr()
679 descr->skb = skb; in spider_net_prepare_tx_descr()
680 hwdescr->buf_addr = buf; in spider_net_prepare_tx_descr()
681 hwdescr->buf_size = skb->len; in spider_net_prepare_tx_descr()
682 hwdescr->next_descr_addr = 0; in spider_net_prepare_tx_descr()
683 hwdescr->data_status = 0; in spider_net_prepare_tx_descr()
685 hwdescr->dmac_cmd_status = in spider_net_prepare_tx_descr()
687 spin_unlock_irqrestore(&chain->lock, flags); in spider_net_prepare_tx_descr()
689 if (skb->ip_summed == CHECKSUM_PARTIAL) in spider_net_prepare_tx_descr()
690 switch (ip_hdr(skb)->protocol) { in spider_net_prepare_tx_descr()
692 hwdescr->dmac_cmd_status |= SPIDER_NET_DMAC_TCP; in spider_net_prepare_tx_descr()
695 hwdescr->dmac_cmd_status |= SPIDER_NET_DMAC_UDP; in spider_net_prepare_tx_descr()
699 /* Chain the bus address, so that the DMA engine finds this descr. */ in spider_net_prepare_tx_descr()
701 descr->prev->hwdescr->next_descr_addr = descr->bus_addr; in spider_net_prepare_tx_descr()
703 netif_trans_update(card->netdev); /* set netdev watchdog timer */ in spider_net_prepare_tx_descr()
710 struct spider_net_descr *descr = card->tx_chain.tail; in spider_net_set_low_watermark()
714 int cnt=0; in spider_net_set_low_watermark() local
718 * need to be precise -- does not need a lock. in spider_net_set_low_watermark()
720 while (descr != card->tx_chain.head) { in spider_net_set_low_watermark()
721 status = descr->hwdescr->dmac_cmd_status & SPIDER_NET_DESCR_NOT_IN_USE; in spider_net_set_low_watermark()
724 descr = descr->next; in spider_net_set_low_watermark()
725 cnt++; in spider_net_set_low_watermark()
729 if (cnt < card->tx_chain.num_desc/4) in spider_net_set_low_watermark()
730 return cnt; in spider_net_set_low_watermark()
732 /* Set low-watermark 3/4th's of the way into the queue. */ in spider_net_set_low_watermark()
733 descr = card->tx_chain.tail; in spider_net_set_low_watermark()
734 cnt = (cnt*3)/4; in spider_net_set_low_watermark()
735 for (i=0;i<cnt; i++) in spider_net_set_low_watermark()
736 descr = descr->next; in spider_net_set_low_watermark()
739 spin_lock_irqsave(&card->tx_chain.lock, flags); in spider_net_set_low_watermark()
740 descr->hwdescr->dmac_cmd_status |= SPIDER_NET_DESCR_TXDESFLG; in spider_net_set_low_watermark()
741 if (card->low_watermark && card->low_watermark != descr) { in spider_net_set_low_watermark()
742 hwdescr = card->low_watermark->hwdescr; in spider_net_set_low_watermark()
743 hwdescr->dmac_cmd_status = in spider_net_set_low_watermark()
744 hwdescr->dmac_cmd_status & ~SPIDER_NET_DESCR_TXDESFLG; in spider_net_set_low_watermark()
746 card->low_watermark = descr; in spider_net_set_low_watermark()
747 spin_unlock_irqrestore(&card->tx_chain.lock, flags); in spider_net_set_low_watermark()
748 return cnt; in spider_net_set_low_watermark()
752 * spider_net_release_tx_chain - processes sent tx descriptors
759 * finished with (if non-brutal) or simply release tx descriptors (if brutal).
766 struct net_device *dev = card->netdev; in spider_net_release_tx_chain()
767 struct spider_net_descr_chain *chain = &card->tx_chain; in spider_net_release_tx_chain()
776 spin_lock_irqsave(&chain->lock, flags); in spider_net_release_tx_chain()
777 if (chain->tail == chain->head) { in spider_net_release_tx_chain()
778 spin_unlock_irqrestore(&chain->lock, flags); in spider_net_release_tx_chain()
781 descr = chain->tail; in spider_net_release_tx_chain()
782 hwdescr = descr->hwdescr; in spider_net_release_tx_chain()
787 dev->stats.tx_packets++; in spider_net_release_tx_chain()
788 dev->stats.tx_bytes += descr->skb->len; in spider_net_release_tx_chain()
793 spin_unlock_irqrestore(&chain->lock, flags); in spider_net_release_tx_chain()
807 dev_err(&card->netdev->dev, "forcing end of tx descriptor " in spider_net_release_tx_chain()
809 dev->stats.tx_errors++; in spider_net_release_tx_chain()
813 dev->stats.tx_dropped++; in spider_net_release_tx_chain()
815 spin_unlock_irqrestore(&chain->lock, flags); in spider_net_release_tx_chain()
820 chain->tail = descr->next; in spider_net_release_tx_chain()
821 hwdescr->dmac_cmd_status |= SPIDER_NET_DESCR_NOT_IN_USE; in spider_net_release_tx_chain()
822 skb = descr->skb; in spider_net_release_tx_chain()
823 descr->skb = NULL; in spider_net_release_tx_chain()
824 buf_addr = hwdescr->buf_addr; in spider_net_release_tx_chain()
825 spin_unlock_irqrestore(&chain->lock, flags); in spider_net_release_tx_chain()
829 dma_unmap_single(&card->pdev->dev, buf_addr, skb->len, in spider_net_release_tx_chain()
838 * spider_net_kick_tx_dma - enables TX DMA processing
841 * This routine will start the transmit DMA running if
846 * DMA engine.
857 descr = card->tx_chain.tail; in spider_net_kick_tx_dma()
859 if (spider_net_get_descr_status(descr->hwdescr) == in spider_net_kick_tx_dma()
862 descr->bus_addr); in spider_net_kick_tx_dma()
867 if (descr == card->tx_chain.head) in spider_net_kick_tx_dma()
869 descr = descr->next; in spider_net_kick_tx_dma()
873 mod_timer(&card->tx_timer, jiffies + SPIDER_NET_TX_TIMER); in spider_net_kick_tx_dma()
877 * spider_net_xmit - transmits a frame over the device
886 int cnt; in spider_net_xmit() local
892 netdev->stats.tx_dropped++; in spider_net_xmit()
897 cnt = spider_net_set_low_watermark(card); in spider_net_xmit()
898 if (cnt < 5) in spider_net_xmit()
904 * spider_net_cleanup_tx_ring - cleans up the TX ring
917 (card->netdev->flags & IFF_UP)) { in spider_net_cleanup_tx_ring()
919 netif_wake_queue(card->netdev); in spider_net_cleanup_tx_ring()
924 * spider_net_do_ioctl - called for device ioctls
930 * -EOPNOTSUPP is returned, if an unknown ioctl was requested
937 return -EOPNOTSUPP; in spider_net_do_ioctl()
942 * spider_net_pass_skb_up - takes an skb from a descriptor and passes it on
953 struct spider_net_hw_descr *hwdescr = descr->hwdescr; in spider_net_pass_skb_up()
954 struct sk_buff *skb = descr->skb; in spider_net_pass_skb_up()
955 struct net_device *netdev = card->netdev; in spider_net_pass_skb_up()
956 u32 data_status = hwdescr->data_status; in spider_net_pass_skb_up()
957 u32 data_error = hwdescr->data_error; in spider_net_pass_skb_up()
959 skb_put(skb, hwdescr->valid_size); in spider_net_pass_skb_up()
966 skb->protocol = eth_type_trans(skb, netdev); in spider_net_pass_skb_up()
970 if (netdev->features & NETIF_F_RXCSUM) { in spider_net_pass_skb_up()
974 skb->ip_summed = CHECKSUM_UNNECESSARY; in spider_net_pass_skb_up()
978 /* further enhancements: HW-accel VLAN */ in spider_net_pass_skb_up()
982 netdev->stats.rx_packets++; in spider_net_pass_skb_up()
983 netdev->stats.rx_bytes += skb->len; in spider_net_pass_skb_up()
991 struct spider_net_descr_chain *chain = &card->rx_chain; in show_rx_chain()
992 struct spider_net_descr *start= chain->tail; in show_rx_chain()
994 struct spider_net_hw_descr *hwd = start->hwdescr; in show_rx_chain()
995 struct device *dev = &card->netdev->dev; in show_rx_chain()
1000 int cnt = 0; in show_rx_chain() local
1001 int off = start - chain->ring; in show_rx_chain()
1002 int cstat = hwd->dmac_cmd_status; in show_rx_chain()
1005 chain->num_desc); in show_rx_chain()
1015 hwd = descr->hwdescr; in show_rx_chain()
1016 off = descr - chain->ring; in show_rx_chain()
1017 status = hwd->dmac_cmd_status; in show_rx_chain()
1019 if (descr == chain->head) in show_rx_chain()
1023 if (curr_desc == descr->bus_addr) in show_rx_chain()
1027 if (next_desc == descr->bus_addr) in show_rx_chain()
1031 if (hwd->next_descr_addr == 0) in show_rx_chain()
1035 int from = (chain->num_desc + off - cnt) % chain->num_desc; in show_rx_chain()
1036 int to = (chain->num_desc + off - 1) % chain->num_desc; in show_rx_chain()
1038 "with stat=0x%08x\n", cnt, from, to, cstat); in show_rx_chain()
1040 cnt = 0; in show_rx_chain()
1043 cnt ++; in show_rx_chain()
1045 descr = descr->next; in show_rx_chain()
1049 "for a total of %d descrs\n", cnt, cstat, tot); in show_rx_chain()
1056 struct spider_net_hw_descr *hwd = descr->hwdescr; in show_rx_chain()
1058 cnt = descr - chain->ring; in show_rx_chain()
1060 cnt, status, descr->skb); in show_rx_chain()
1062 descr->bus_addr, hwd->buf_addr, hwd->buf_size); in show_rx_chain()
1064 hwd->next_descr_addr, hwd->result_size, in show_rx_chain()
1065 hwd->valid_size); in show_rx_chain()
1067 hwd->dmac_cmd_status, hwd->data_status, in show_rx_chain()
1068 hwd->data_error); in show_rx_chain()
1071 descr = descr->next; in show_rx_chain()
1078 * spider_net_resync_head_ptr - Advance head ptr past empty descrs
1090 struct spider_net_descr_chain *chain = &card->rx_chain; in spider_net_resync_head_ptr()
1095 descr = chain->head; in spider_net_resync_head_ptr()
1096 status = spider_net_get_descr_status(descr->hwdescr); in spider_net_resync_head_ptr()
1101 spin_lock_irqsave(&chain->lock, flags); in spider_net_resync_head_ptr()
1103 descr = chain->head; in spider_net_resync_head_ptr()
1104 status = spider_net_get_descr_status(descr->hwdescr); in spider_net_resync_head_ptr()
1105 for (i=0; i<chain->num_desc; i++) { in spider_net_resync_head_ptr()
1107 descr = descr->next; in spider_net_resync_head_ptr()
1108 status = spider_net_get_descr_status(descr->hwdescr); in spider_net_resync_head_ptr()
1110 chain->head = descr; in spider_net_resync_head_ptr()
1112 spin_unlock_irqrestore(&chain->lock, flags); in spider_net_resync_head_ptr()
1117 struct spider_net_descr_chain *chain = &card->rx_chain; in spider_net_resync_tail_ptr()
1122 descr = chain->tail; in spider_net_resync_tail_ptr()
1123 status = spider_net_get_descr_status(descr->hwdescr); in spider_net_resync_tail_ptr()
1125 for (i=0; i<chain->num_desc; i++) { in spider_net_resync_tail_ptr()
1128 descr = descr->next; in spider_net_resync_tail_ptr()
1129 status = spider_net_get_descr_status(descr->hwdescr); in spider_net_resync_tail_ptr()
1131 chain->tail = descr; in spider_net_resync_tail_ptr()
1133 if ((i == chain->num_desc) || (i == 0)) in spider_net_resync_tail_ptr()
1139 * spider_net_decode_one_descr - processes an RX descriptor
1144 * Processes an RX descriptor by iommu-unmapping the data buffer
1152 struct net_device *dev = card->netdev; in spider_net_decode_one_descr()
1153 struct spider_net_descr_chain *chain = &card->rx_chain; in spider_net_decode_one_descr()
1154 struct spider_net_descr *descr = chain->tail; in spider_net_decode_one_descr()
1155 struct spider_net_hw_descr *hwdescr = descr->hwdescr; in spider_net_decode_one_descr()
1166 /* descriptor definitively used -- move on tail */ in spider_net_decode_one_descr()
1167 chain->tail = descr->next; in spider_net_decode_one_descr()
1170 hw_buf_addr = hwdescr->buf_addr; in spider_net_decode_one_descr()
1171 hwdescr->buf_addr = 0xffffffff; in spider_net_decode_one_descr()
1172 dma_unmap_single(&card->pdev->dev, hw_buf_addr, SPIDER_NET_MAX_FRAME, in spider_net_decode_one_descr()
1179 dev_err(&dev->dev, in spider_net_decode_one_descr()
1181 dev->stats.rx_dropped++; in spider_net_decode_one_descr()
1188 dev_err(&card->netdev->dev, in spider_net_decode_one_descr()
1190 card->spider_stats.rx_desc_unk_state++; in spider_net_decode_one_descr()
1195 if (hwdescr->data_error & SPIDER_NET_DESTROY_RX_FLAGS) { in spider_net_decode_one_descr()
1197 dev_err(&card->netdev->dev, in spider_net_decode_one_descr()
1200 hwdescr->data_status, hwdescr->data_error); in spider_net_decode_one_descr()
1204 if (hwdescr->dmac_cmd_status & SPIDER_NET_DESCR_BAD_STATUS) { in spider_net_decode_one_descr()
1205 dev_err(&card->netdev->dev, "bad status, cmd_status=x%08x\n", in spider_net_decode_one_descr()
1206 hwdescr->dmac_cmd_status); in spider_net_decode_one_descr()
1208 pr_err("buf_size=x%08x\n", hwdescr->buf_size); in spider_net_decode_one_descr()
1209 pr_err("next_descr_addr=x%08x\n", hwdescr->next_descr_addr); in spider_net_decode_one_descr()
1210 pr_err("result_size=x%08x\n", hwdescr->result_size); in spider_net_decode_one_descr()
1211 pr_err("valid_size=x%08x\n", hwdescr->valid_size); in spider_net_decode_one_descr()
1212 pr_err("data_status=x%08x\n", hwdescr->data_status); in spider_net_decode_one_descr()
1213 pr_err("data_error=x%08x\n", hwdescr->data_error); in spider_net_decode_one_descr()
1214 pr_err("which=%ld\n", descr - card->rx_chain.ring); in spider_net_decode_one_descr()
1216 card->spider_stats.rx_desc_error++; in spider_net_decode_one_descr()
1222 descr->skb = NULL; in spider_net_decode_one_descr()
1223 hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE; in spider_net_decode_one_descr()
1229 dev_kfree_skb_irq(descr->skb); in spider_net_decode_one_descr()
1230 descr->skb = NULL; in spider_net_decode_one_descr()
1231 hwdescr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE; in spider_net_decode_one_descr()
1236 * spider_net_poll - NAPI poll function called by the stack to return packets
1259 if ((packets_done == 0) && (card->num_rx_ints != 0)) { in spider_net_poll()
1264 card->num_rx_ints = 0; in spider_net_poll()
1269 spider_net_cleanup_tx_ring(&card->tx_timer); in spider_net_poll()
1276 card->ignore_rx_ramfull = 0; in spider_net_poll()
1283 * spider_net_set_mac - sets the MAC of an interface
1297 if (!is_valid_ether_addr(addr->sa_data)) in spider_net_set_mac()
1298 return -EADDRNOTAVAIL; in spider_net_set_mac()
1300 eth_hw_addr_set(netdev, addr->sa_data); in spider_net_set_mac()
1308 macu = (netdev->dev_addr[0]<<24) + (netdev->dev_addr[1]<<16) + in spider_net_set_mac()
1309 (netdev->dev_addr[2]<<8) + (netdev->dev_addr[3]); in spider_net_set_mac()
1310 macl = (netdev->dev_addr[4]<<8) + (netdev->dev_addr[5]); in spider_net_set_mac()
1338 del_timer_sync(&card->aneg_timer); in spider_net_link_reset()
1346 card->aneg_count = 0; in spider_net_link_reset()
1347 card->medium = BCM54XX_COPPER; in spider_net_link_reset()
1349 mod_timer(&card->aneg_timer, jiffies + SPIDER_NET_ANEG_TIMER); in spider_net_link_reset()
1354 * spider_net_handle_error_irq - handles errors raised by an interrupt
1395 /* we don't use semaphores, as we poll for the completion in spider_net_handle_error_irq()
1404 dev_err(&card->netdev->dev, "PHY write queue full\n"); in spider_net_handle_error_irq()
1447 * tx dma in spider_net_handle_error_irq()
1448 if (card->tx_chain.tail != card->tx_chain.head) in spider_net_handle_error_irq()
1476 if (card->ignore_rx_ramfull == 0) { in spider_net_handle_error_irq()
1477 card->ignore_rx_ramfull = 1; in spider_net_handle_error_irq()
1481 card->num_rx_ints ++; in spider_net_handle_error_irq()
1482 napi_schedule(&card->napi); in spider_net_handle_error_irq()
1501 card->num_rx_ints ++; in spider_net_handle_error_irq()
1502 napi_schedule(&card->napi); in spider_net_handle_error_irq()
1515 card->num_rx_ints ++; in spider_net_handle_error_irq()
1516 napi_schedule(&card->napi); in spider_net_handle_error_irq()
1572 dev_err(&card->netdev->dev, "Error interrupt, GHIINT0STS = 0x%08x, " in spider_net_handle_error_irq()
1582 * spider_net_interrupt - interrupt handler for spider_net
1590 * interrupts for this device and makes the stack poll the driver
1610 napi_schedule(&card->napi); in spider_net_interrupt()
1611 card->num_rx_ints ++; in spider_net_interrupt()
1614 napi_schedule(&card->napi); in spider_net_interrupt()
1631 * spider_net_poll_controller - artificial interrupt for netconsole etc.
1639 disable_irq(netdev->irq); in spider_net_poll_controller()
1640 spider_net_interrupt(netdev->irq, netdev); in spider_net_poll_controller()
1641 enable_irq(netdev->irq); in spider_net_poll_controller()
1646 * spider_net_enable_interrupts - enable interrupts
1663 * spider_net_disable_interrupts - disable interrupts
1678 * spider_net_init_card - initializes the card
1701 * spider_net_enable_card - enables the card by setting all kinds of regs
1718 /* clear the single DMA engine registers first */ in spider_net_enable_card()
1775 * enable DMA in spider_net_enable_card()
1792 * spider_net_download_firmware - loads firmware into the adapter
1822 return -EIO; in spider_net_download_firmware()
1831 * spider_net_init_firmware - reads in firmware parts
1844 * tail -q -n +2 Seq_code1_0x088.txt Seq_code2_0x090.txt \
1846 * Seq_code6_0x0B0.txt | xxd -r -p -c4 > spider_fw.bin
1851 * <FIRST 4-BYTES-WORD FOR SEQUENCER>
1852 * <SECOND 4-BYTES-WORD FOR SEQUENCER>
1854 * <1024th 4-BYTES-WORD FOR SEQUENCER>
1862 int err = -ENOENT; in spider_net_init_firmware()
1866 SPIDER_NET_FIRMWARE_NAME, &card->pdev->dev) == 0) { in spider_net_init_firmware()
1867 if ( (firmware->size != SPIDER_NET_FIRMWARE_LEN) && in spider_net_init_firmware()
1869 dev_err(&card->netdev->dev, in spider_net_init_firmware()
1874 err = spider_net_download_firmware(card, firmware->data); in spider_net_init_firmware()
1884 dn = pci_device_to_OF_node(card->pdev); in spider_net_init_firmware()
1894 dev_err(&card->netdev->dev, in spider_net_init_firmware()
1905 dev_err(&card->netdev->dev, in spider_net_init_firmware()
1912 * spider_net_open - called upon ifonfig up
1931 card->aneg_count = 0; in spider_net_open()
1932 card->medium = BCM54XX_COPPER; in spider_net_open()
1934 if (card->phy.def->phy_id) in spider_net_open()
1935 mod_timer(&card->aneg_timer, jiffies + SPIDER_NET_ANEG_TIMER); in spider_net_open()
1937 result = spider_net_init_chain(card, &card->tx_chain); in spider_net_open()
1940 card->low_watermark = NULL; in spider_net_open()
1942 result = spider_net_init_chain(card, &card->rx_chain); in spider_net_open()
1955 result = -EBUSY; in spider_net_open()
1956 if (request_irq(netdev->irq, spider_net_interrupt, in spider_net_open()
1957 IRQF_SHARED, netdev->name, netdev)) in spider_net_open()
1964 napi_enable(&card->napi); in spider_net_open()
1973 spider_net_free_chain(card, &card->rx_chain); in spider_net_open()
1975 spider_net_free_chain(card, &card->tx_chain); in spider_net_open()
1977 del_timer_sync(&card->aneg_timer); in spider_net_open()
1989 struct mii_phy *phy = &card->phy; in spider_net_link_phy()
1992 if (card->aneg_count > SPIDER_NET_ANEG_TIMEOUT) { in spider_net_link_phy()
1995 card->netdev->name); in spider_net_link_phy()
1997 switch (card->medium) { in spider_net_link_phy()
2000 if (phy->def->ops->enable_fiber) in spider_net_link_phy()
2001 phy->def->ops->enable_fiber(phy, 1); in spider_net_link_phy()
2002 card->medium = BCM54XX_FIBER; in spider_net_link_phy()
2007 if (phy->def->ops->enable_fiber) in spider_net_link_phy()
2008 phy->def->ops->enable_fiber(phy, 0); in spider_net_link_phy()
2009 card->medium = BCM54XX_UNKNOWN; in spider_net_link_phy()
2017 card->medium = BCM54XX_COPPER; in spider_net_link_phy()
2021 card->aneg_count = 0; in spider_net_link_phy()
2022 mod_timer(&card->aneg_timer, jiffies + SPIDER_NET_ANEG_TIMER); in spider_net_link_phy()
2027 if (!(phy->def->ops->poll_link(phy))) { in spider_net_link_phy()
2028 card->aneg_count++; in spider_net_link_phy()
2029 mod_timer(&card->aneg_timer, jiffies + SPIDER_NET_ANEG_TIMER); in spider_net_link_phy()
2034 phy->def->ops->read_link(phy); in spider_net_link_phy()
2040 if (phy->speed == 1000) in spider_net_link_phy()
2045 card->aneg_count = 0; in spider_net_link_phy()
2047 pr_info("%s: link up, %i Mbps, %s-duplex %sautoneg.\n", in spider_net_link_phy()
2048 card->netdev->name, phy->speed, in spider_net_link_phy()
2049 phy->duplex == 1 ? "Full" : "Half", in spider_net_link_phy()
2050 phy->autoneg == 1 ? "" : "no "); in spider_net_link_phy()
2054 * spider_net_setup_phy - setup PHY
2064 struct mii_phy *phy = &card->phy; in spider_net_setup_phy()
2071 phy->dev = card->netdev; in spider_net_setup_phy()
2072 phy->mdio_read = spider_net_read_phy; in spider_net_setup_phy()
2073 phy->mdio_write = spider_net_write_phy; in spider_net_setup_phy()
2075 for (phy->mii_id = 1; phy->mii_id <= 31; phy->mii_id++) { in spider_net_setup_phy()
2077 id = spider_net_read_phy(card->netdev, phy->mii_id, MII_BMSR); in spider_net_setup_phy()
2079 if (!sungem_phy_probe(phy, phy->mii_id)) { in spider_net_setup_phy()
2080 pr_info("Found %s.\n", phy->def->name); in spider_net_setup_phy()
2090 * spider_net_workaround_rxramfull - work around firmware bug
2124 * spider_net_stop - called upon ifconfig down
2134 napi_disable(&card->napi); in spider_net_stop()
2137 del_timer_sync(&card->tx_timer); in spider_net_stop()
2138 del_timer_sync(&card->aneg_timer); in spider_net_stop()
2142 free_irq(netdev->irq, netdev); in spider_net_stop()
2147 /* turn off DMA, force end */ in spider_net_stop()
2154 spider_net_free_chain(card, &card->tx_chain); in spider_net_stop()
2155 spider_net_free_chain(card, &card->rx_chain); in spider_net_stop()
2161 * spider_net_tx_timeout_task - task scheduled by the watchdog timeout
2172 struct net_device *netdev = card->netdev; in spider_net_tx_timeout_task()
2174 if (!(netdev->flags & IFF_UP)) in spider_net_tx_timeout_task()
2191 atomic_dec(&card->tx_timeout_task_counter); in spider_net_tx_timeout_task()
2195 * spider_net_tx_timeout - called when the tx timeout watchdog kicks in.
2207 atomic_inc(&card->tx_timeout_task_counter); in spider_net_tx_timeout()
2208 if (netdev->flags & IFF_UP) in spider_net_tx_timeout()
2209 schedule_work(&card->tx_timeout_task); in spider_net_tx_timeout()
2211 atomic_dec(&card->tx_timeout_task_counter); in spider_net_tx_timeout()
2212 card->spider_stats.tx_timeouts++; in spider_net_tx_timeout()
2226 /* poll controller */
2232 * spider_net_setup_netdev_ops - initialization of net_device operations
2240 netdev->netdev_ops = &spider_net_ops; in spider_net_setup_netdev_ops()
2241 netdev->watchdog_timeo = SPIDER_NET_WATCHDOG_TIMEOUT; in spider_net_setup_netdev_ops()
2243 netdev->ethtool_ops = &spider_net_ethtool_ops; in spider_net_setup_netdev_ops()
2247 * spider_net_setup_netdev - initialization of net_device
2258 struct net_device *netdev = card->netdev; in spider_net_setup_netdev()
2263 SET_NETDEV_DEV(netdev, &card->pdev->dev); in spider_net_setup_netdev()
2265 pci_set_drvdata(card->pdev, netdev); in spider_net_setup_netdev()
2267 timer_setup(&card->tx_timer, spider_net_cleanup_tx_ring, 0); in spider_net_setup_netdev()
2268 netdev->irq = card->pdev->irq; in spider_net_setup_netdev()
2270 card->aneg_count = 0; in spider_net_setup_netdev()
2271 timer_setup(&card->aneg_timer, spider_net_link_phy, 0); in spider_net_setup_netdev()
2273 netif_napi_add(netdev, &card->napi, spider_net_poll); in spider_net_setup_netdev()
2277 netdev->hw_features = NETIF_F_RXCSUM | NETIF_F_IP_CSUM; in spider_net_setup_netdev()
2279 netdev->features |= NETIF_F_RXCSUM; in spider_net_setup_netdev()
2280 netdev->features |= NETIF_F_IP_CSUM; in spider_net_setup_netdev()
2284 netdev->lltx = true; in spider_net_setup_netdev()
2286 /* MTU range: 64 - 2294 */ in spider_net_setup_netdev()
2287 netdev->min_mtu = SPIDER_NET_MIN_MTU; in spider_net_setup_netdev()
2288 netdev->max_mtu = SPIDER_NET_MAX_MTU; in spider_net_setup_netdev()
2290 netdev->irq = card->pdev->irq; in spider_net_setup_netdev()
2291 card->num_rx_ints = 0; in spider_net_setup_netdev()
2292 card->ignore_rx_ramfull = 0; in spider_net_setup_netdev()
2294 dn = pci_device_to_OF_node(card->pdev); in spider_net_setup_netdev()
2296 return -EIO; in spider_net_setup_netdev()
2298 mac = of_get_property(dn, "local-mac-address", NULL); in spider_net_setup_netdev()
2300 return -EIO; in spider_net_setup_netdev()
2305 dev_err(&card->netdev->dev, in spider_net_setup_netdev()
2311 dev_err(&card->netdev->dev, in spider_net_setup_netdev()
2317 pr_info("Initialized device %s.\n", netdev->name); in spider_net_setup_netdev()
2323 * spider_net_alloc_card - allocates net_device and card structure
2341 card->netdev = netdev; in spider_net_alloc_card()
2342 card->msg_enable = SPIDER_NET_DEFAULT_MSG; in spider_net_alloc_card()
2343 INIT_WORK(&card->tx_timeout_task, spider_net_tx_timeout_task); in spider_net_alloc_card()
2344 init_waitqueue_head(&card->waitq); in spider_net_alloc_card()
2345 atomic_set(&card->tx_timeout_task_counter, 0); in spider_net_alloc_card()
2347 card->rx_chain.num_desc = rx_descriptors; in spider_net_alloc_card()
2348 card->rx_chain.ring = card->darray; in spider_net_alloc_card()
2349 card->tx_chain.num_desc = tx_descriptors; in spider_net_alloc_card()
2350 card->tx_chain.ring = card->darray + rx_descriptors; in spider_net_alloc_card()
2356 * spider_net_undo_pci_setup - releases PCI ressources
2364 iounmap(card->regs); in spider_net_undo_pci_setup()
2365 pci_release_regions(card->pdev); in spider_net_undo_pci_setup()
2369 * spider_net_setup_pci_dev - sets up the device in terms of PCI operations
2387 dev_err(&pdev->dev, "Couldn't enable PCI device\n"); in spider_net_setup_pci_dev()
2392 dev_err(&pdev->dev, in spider_net_setup_pci_dev()
2398 dev_err(&pdev->dev, in spider_net_setup_pci_dev()
2407 dev_err(&pdev->dev, in spider_net_setup_pci_dev()
2411 card->pdev = pdev; in spider_net_setup_pci_dev()
2417 card->netdev->mem_start = mmio_start; in spider_net_setup_pci_dev()
2418 card->netdev->mem_end = mmio_start + mmio_len; in spider_net_setup_pci_dev()
2419 card->regs = ioremap(mmio_start, mmio_len); in spider_net_setup_pci_dev()
2421 if (!card->regs) { in spider_net_setup_pci_dev()
2422 dev_err(&pdev->dev, in spider_net_setup_pci_dev()
2437 * spider_net_probe - initialization of a device
2449 int err = -EIO; in spider_net_probe()
2471 free_netdev(card->netdev); in spider_net_probe()
2477 * spider_net_remove - removal of a device
2494 wait_event(card->waitq, in spider_net_remove()
2495 atomic_read(&card->tx_timeout_task_counter) == 0); in spider_net_remove()
2517 * spider_net_init - init function when the driver is loaded
2546 * spider_net_cleanup - exit function when driver is unloaded