Lines Matching full:card
71 * spider_net_read_reg - reads an SMMIO register of a card
72 * @card: device structure
78 spider_net_read_reg(struct spider_net_card *card, u32 reg) in spider_net_read_reg() argument
84 return in_be32(card->regs + reg); in spider_net_read_reg()
88 * spider_net_write_reg - writes to an SMMIO register of a card
89 * @card: device structure
94 spider_net_write_reg(struct spider_net_card *card, u32 reg, u32 value) in spider_net_write_reg() argument
100 out_be32(card->regs + reg, value); in spider_net_write_reg()
118 struct spider_net_card *card = netdev_priv(netdev); in spider_net_write_phy() local
124 spider_net_write_reg(card, SPIDER_NET_GPCWOPCMD, writevalue); in spider_net_write_phy()
141 struct spider_net_card *card = netdev_priv(netdev); in spider_net_read_phy() local
145 spider_net_write_reg(card, SPIDER_NET_GPCROPCMD, readvalue); in spider_net_read_phy()
152 readvalue = spider_net_read_reg(card, SPIDER_NET_GPCROPCMD); in spider_net_read_phy()
162 * @card: device structure
165 spider_net_setup_aneg(struct spider_net_card *card) in spider_net_setup_aneg() argument
167 struct mii_phy *phy = &card->phy; in spider_net_setup_aneg()
171 bmsr = spider_net_read_phy(card->netdev, phy->mii_id, MII_BMSR); in spider_net_setup_aneg()
172 estat = spider_net_read_phy(card->netdev, phy->mii_id, MII_ESTATUS); in spider_net_setup_aneg()
194 * spider_net_rx_irq_off - switch off rx irq on this spider card
195 * @card: device structure
200 spider_net_rx_irq_off(struct spider_net_card *card) in spider_net_rx_irq_off() argument
205 spider_net_write_reg(card, SPIDER_NET_GHIINT0MSK, regvalue); in spider_net_rx_irq_off()
209 * spider_net_rx_irq_on - switch on rx irq on this spider card
210 * @card: device structure
215 spider_net_rx_irq_on(struct spider_net_card *card) in spider_net_rx_irq_on() argument
220 spider_net_write_reg(card, SPIDER_NET_GHIINT0MSK, regvalue); in spider_net_rx_irq_on()
225 * @card: card structure
231 spider_net_set_promisc(struct spider_net_card *card) in spider_net_set_promisc() argument
234 struct net_device *netdev = card->netdev; in spider_net_set_promisc()
238 spider_net_write_reg(card, SPIDER_NET_GMRUAFILnR, 0); in spider_net_set_promisc()
239 spider_net_write_reg(card, SPIDER_NET_GMRUAFILnR + 0x04, 0); in spider_net_set_promisc()
240 spider_net_write_reg(card, SPIDER_NET_GMRUA0FIL15R, in spider_net_set_promisc()
249 spider_net_write_reg(card, SPIDER_NET_GMRUAFILnR, macu); in spider_net_set_promisc()
250 spider_net_write_reg(card, SPIDER_NET_GMRUAFILnR + 0x04, macl); in spider_net_set_promisc()
251 spider_net_write_reg(card, SPIDER_NET_GMRUA0FIL15R, in spider_net_set_promisc()
270 * @card: card structure
275 spider_net_free_chain(struct spider_net_card *card, in spider_net_free_chain() argument
287 dma_free_coherent(&card->pdev->dev, chain->num_desc * sizeof(struct spider_net_hw_descr), in spider_net_free_chain()
293 * @card: card structure
302 spider_net_init_chain(struct spider_net_card *card, in spider_net_init_chain() argument
313 chain->hwring = dma_alloc_coherent(&card->pdev->dev, alloc_size, in spider_net_init_chain()
345 * @card: card structure
350 spider_net_free_rx_chain_contents(struct spider_net_card *card) in spider_net_free_rx_chain_contents() argument
354 descr = card->rx_chain.head; in spider_net_free_rx_chain_contents()
357 dma_unmap_single(&card->pdev->dev, in spider_net_free_rx_chain_contents()
365 } while (descr != card->rx_chain.head); in spider_net_free_rx_chain_contents()
370 * @card: card structure
379 spider_net_prepare_rx_descr(struct spider_net_card *card, in spider_net_prepare_rx_descr() argument
395 descr->skb = netdev_alloc_skb(card->netdev, in spider_net_prepare_rx_descr()
398 if (netif_msg_rx_err(card) && net_ratelimit()) in spider_net_prepare_rx_descr()
399 dev_err(&card->netdev->dev, in spider_net_prepare_rx_descr()
401 card->spider_stats.alloc_rx_skb_error++; in spider_net_prepare_rx_descr()
415 buf = dma_map_single(&card->pdev->dev, descr->skb->data, in spider_net_prepare_rx_descr()
417 if (dma_mapping_error(&card->pdev->dev, buf)) { in spider_net_prepare_rx_descr()
420 if (netif_msg_rx_err(card) && net_ratelimit()) in spider_net_prepare_rx_descr()
421 dev_err(&card->netdev->dev, "Could not iommu-map rx buffer\n"); in spider_net_prepare_rx_descr()
422 card->spider_stats.rx_iommu_map_error++; in spider_net_prepare_rx_descr()
436 * @card: card structure
443 spider_net_enable_rxchtails(struct spider_net_card *card) in spider_net_enable_rxchtails() argument
446 spider_net_write_reg(card, SPIDER_NET_GDADCHA , in spider_net_enable_rxchtails()
447 card->rx_chain.tail->bus_addr); in spider_net_enable_rxchtails()
452 * @card: card structure
458 spider_net_enable_rxdmac(struct spider_net_card *card) in spider_net_enable_rxdmac() argument
461 spider_net_write_reg(card, SPIDER_NET_GDADMACCNTR, in spider_net_enable_rxdmac()
467 * @card: card structure
473 spider_net_disable_rxdmac(struct spider_net_card *card) in spider_net_disable_rxdmac() argument
475 spider_net_write_reg(card, SPIDER_NET_GDADMACCNTR, in spider_net_disable_rxdmac()
481 * @card: card structure
486 spider_net_refill_rx_chain(struct spider_net_card *card) in spider_net_refill_rx_chain() argument
488 struct spider_net_descr_chain *chain = &card->rx_chain; in spider_net_refill_rx_chain()
501 if (spider_net_prepare_rx_descr(card, chain->head)) in spider_net_refill_rx_chain()
511 * @card: card structure
516 spider_net_alloc_rx_skbs(struct spider_net_card *card) in spider_net_alloc_rx_skbs() argument
518 struct spider_net_descr_chain *chain = &card->rx_chain; in spider_net_alloc_rx_skbs()
532 if (spider_net_prepare_rx_descr(card, chain->head)) in spider_net_alloc_rx_skbs()
540 spider_net_refill_rx_chain(card); in spider_net_alloc_rx_skbs()
541 spider_net_enable_rxdmac(card); in spider_net_alloc_rx_skbs()
545 spider_net_free_rx_chain_contents(card); in spider_net_alloc_rx_skbs()
597 struct spider_net_card *card = netdev_priv(netdev); in spider_net_set_multi() local
600 spider_net_set_promisc(card); in spider_net_set_multi()
633 spider_net_write_reg(card, SPIDER_NET_GMRMHFILnR + i * 4, reg); in spider_net_set_multi()
639 * @card: card structure
648 spider_net_prepare_tx_descr(struct spider_net_card *card, in spider_net_prepare_tx_descr() argument
651 struct spider_net_descr_chain *chain = &card->tx_chain; in spider_net_prepare_tx_descr()
657 buf = dma_map_single(&card->pdev->dev, skb->data, skb->len, in spider_net_prepare_tx_descr()
659 if (dma_mapping_error(&card->pdev->dev, buf)) { in spider_net_prepare_tx_descr()
660 if (netif_msg_tx_err(card) && net_ratelimit()) in spider_net_prepare_tx_descr()
661 dev_err(&card->netdev->dev, "could not iommu-map packet (%p, %i). " in spider_net_prepare_tx_descr()
663 card->spider_stats.tx_iommu_map_error++; in spider_net_prepare_tx_descr()
668 descr = card->tx_chain.head; in spider_net_prepare_tx_descr()
671 dma_unmap_single(&card->pdev->dev, buf, skb->len, in spider_net_prepare_tx_descr()
702 netif_trans_update(card->netdev); /* set netdev watchdog timer */ in spider_net_prepare_tx_descr()
707 spider_net_set_low_watermark(struct spider_net_card *card) in spider_net_set_low_watermark() argument
709 struct spider_net_descr *descr = card->tx_chain.tail; in spider_net_set_low_watermark()
719 while (descr != card->tx_chain.head) { in spider_net_set_low_watermark()
728 if (cnt < card->tx_chain.num_desc/4) in spider_net_set_low_watermark()
732 descr = card->tx_chain.tail; in spider_net_set_low_watermark()
738 spin_lock_irqsave(&card->tx_chain.lock, flags); in spider_net_set_low_watermark()
740 if (card->low_watermark && card->low_watermark != descr) { in spider_net_set_low_watermark()
741 hwdescr = card->low_watermark->hwdescr; in spider_net_set_low_watermark()
745 card->low_watermark = descr; in spider_net_set_low_watermark()
746 spin_unlock_irqrestore(&card->tx_chain.lock, flags); in spider_net_set_low_watermark()
752 * @card: adapter structure
763 spider_net_release_tx_chain(struct spider_net_card *card, int brutal) in spider_net_release_tx_chain() argument
765 struct net_device *dev = card->netdev; in spider_net_release_tx_chain()
766 struct spider_net_descr_chain *chain = &card->tx_chain; in spider_net_release_tx_chain()
805 if (netif_msg_tx_err(card)) in spider_net_release_tx_chain()
806 dev_err(&card->netdev->dev, "forcing end of tx descriptor " in spider_net_release_tx_chain()
828 dma_unmap_single(&card->pdev->dev, buf_addr, skb->len, in spider_net_release_tx_chain()
838 * @card: card structure
848 spider_net_kick_tx_dma(struct spider_net_card *card) in spider_net_kick_tx_dma() argument
852 if (spider_net_read_reg(card, SPIDER_NET_GDTDMACCNTR) & in spider_net_kick_tx_dma()
856 descr = card->tx_chain.tail; in spider_net_kick_tx_dma()
860 spider_net_write_reg(card, SPIDER_NET_GDTDCHA, in spider_net_kick_tx_dma()
862 spider_net_write_reg(card, SPIDER_NET_GDTDMACCNTR, in spider_net_kick_tx_dma()
866 if (descr == card->tx_chain.head) in spider_net_kick_tx_dma()
872 mod_timer(&card->tx_timer, jiffies + SPIDER_NET_TX_TIMER); in spider_net_kick_tx_dma()
886 struct spider_net_card *card = netdev_priv(netdev); in spider_net_xmit() local
888 spider_net_release_tx_chain(card, 0); in spider_net_xmit()
890 if (spider_net_prepare_tx_descr(card, skb) != 0) { in spider_net_xmit()
896 cnt = spider_net_set_low_watermark(card); in spider_net_xmit()
898 spider_net_kick_tx_dma(card); in spider_net_xmit()
904 * @t: timer context used to obtain the pointer to net card data structure
914 struct spider_net_card *card = from_timer(card, t, tx_timer); in spider_net_cleanup_tx_ring() local
915 if ((spider_net_release_tx_chain(card, 0) != 0) && in spider_net_cleanup_tx_ring()
916 (card->netdev->flags & IFF_UP)) { in spider_net_cleanup_tx_ring()
917 spider_net_kick_tx_dma(card); in spider_net_cleanup_tx_ring()
918 netif_wake_queue(card->netdev); in spider_net_cleanup_tx_ring()
943 * @card: card structure
950 struct spider_net_card *card) in spider_net_pass_skb_up() argument
954 struct net_device *netdev = card->netdev; in spider_net_pass_skb_up()
960 /* the card seems to add 2 bytes of junk in front in spider_net_pass_skb_up()
988 static void show_rx_chain(struct spider_net_card *card) in show_rx_chain() argument
990 struct spider_net_descr_chain *chain = &card->rx_chain; in show_rx_chain()
994 struct device *dev = &card->netdev->dev; in show_rx_chain()
1008 curr_desc = spider_net_read_reg(card, SPIDER_NET_GDACTDPA); in show_rx_chain()
1009 next_desc = spider_net_read_reg(card, SPIDER_NET_GDACNEXTDA); in show_rx_chain()
1078 * @card: card structure
1086 static void spider_net_resync_head_ptr(struct spider_net_card *card) in spider_net_resync_head_ptr() argument
1089 struct spider_net_descr_chain *chain = &card->rx_chain; in spider_net_resync_head_ptr()
1114 static int spider_net_resync_tail_ptr(struct spider_net_card *card) in spider_net_resync_tail_ptr() argument
1116 struct spider_net_descr_chain *chain = &card->rx_chain; in spider_net_resync_tail_ptr()
1139 * @card: card structure
1149 spider_net_decode_one_descr(struct spider_net_card *card) in spider_net_decode_one_descr() argument
1151 struct net_device *dev = card->netdev; in spider_net_decode_one_descr()
1152 struct spider_net_descr_chain *chain = &card->rx_chain; in spider_net_decode_one_descr()
1171 dma_unmap_single(&card->pdev->dev, hw_buf_addr, SPIDER_NET_MAX_FRAME, in spider_net_decode_one_descr()
1177 if (netif_msg_rx_err(card)) in spider_net_decode_one_descr()
1186 if (netif_msg_rx_err(card)) in spider_net_decode_one_descr()
1187 dev_err(&card->netdev->dev, in spider_net_decode_one_descr()
1189 card->spider_stats.rx_desc_unk_state++; in spider_net_decode_one_descr()
1195 if (netif_msg_rx_err(card)) in spider_net_decode_one_descr()
1196 dev_err(&card->netdev->dev, in spider_net_decode_one_descr()
1204 dev_err(&card->netdev->dev, "bad status, cmd_status=x%08x\n", in spider_net_decode_one_descr()
1213 pr_err("which=%ld\n", descr - card->rx_chain.ring); in spider_net_decode_one_descr()
1215 card->spider_stats.rx_desc_error++; in spider_net_decode_one_descr()
1220 spider_net_pass_skb_up(descr, card); in spider_net_decode_one_descr()
1226 if (netif_msg_rx_err(card)) in spider_net_decode_one_descr()
1227 show_rx_chain(card); in spider_net_decode_one_descr()
1248 struct spider_net_card *card = container_of(napi, struct spider_net_card, napi); in spider_net_poll() local
1252 if (!spider_net_decode_one_descr(card)) in spider_net_poll()
1258 if ((packets_done == 0) && (card->num_rx_ints != 0)) { in spider_net_poll()
1259 if (!spider_net_resync_tail_ptr(card)) in spider_net_poll()
1261 spider_net_resync_head_ptr(card); in spider_net_poll()
1263 card->num_rx_ints = 0; in spider_net_poll()
1265 spider_net_refill_rx_chain(card); in spider_net_poll()
1266 spider_net_enable_rxdmac(card); in spider_net_poll()
1268 spider_net_cleanup_tx_ring(&card->tx_timer); in spider_net_poll()
1274 spider_net_rx_irq_on(card); in spider_net_poll()
1275 card->ignore_rx_ramfull = 0; in spider_net_poll()
1292 struct spider_net_card *card = netdev_priv(netdev); in spider_net_set_mac() local
1302 regvalue = spider_net_read_reg(card, SPIDER_NET_GMACOPEMD); in spider_net_set_mac()
1304 spider_net_write_reg(card, SPIDER_NET_GMACOPEMD, regvalue); in spider_net_set_mac()
1310 spider_net_write_reg(card, SPIDER_NET_GMACUNIMACU, macu); in spider_net_set_mac()
1311 spider_net_write_reg(card, SPIDER_NET_GMACUNIMACL, macl); in spider_net_set_mac()
1314 regvalue = spider_net_read_reg(card, SPIDER_NET_GMACOPEMD); in spider_net_set_mac()
1316 spider_net_write_reg(card, SPIDER_NET_GMACOPEMD, regvalue); in spider_net_set_mac()
1318 spider_net_set_promisc(card); in spider_net_set_mac()
1335 struct spider_net_card *card = netdev_priv(netdev); in spider_net_link_reset() local
1337 del_timer_sync(&card->aneg_timer); in spider_net_link_reset()
1340 spider_net_write_reg(card, SPIDER_NET_GMACST, in spider_net_link_reset()
1341 spider_net_read_reg(card, SPIDER_NET_GMACST)); in spider_net_link_reset()
1342 spider_net_write_reg(card, SPIDER_NET_GMACINTEN, 0); in spider_net_link_reset()
1345 card->aneg_count = 0; in spider_net_link_reset()
1346 card->medium = BCM54XX_COPPER; in spider_net_link_reset()
1347 spider_net_setup_aneg(card); in spider_net_link_reset()
1348 mod_timer(&card->aneg_timer, jiffies + SPIDER_NET_ANEG_TIMER); in spider_net_link_reset()
1354 * @card: card structure
1363 spider_net_handle_error_irq(struct spider_net_card *card, u32 status_reg, in spider_net_handle_error_irq() argument
1402 if (netif_msg_intr(card)) in spider_net_handle_error_irq()
1403 dev_err(&card->netdev->dev, "PHY write queue full\n"); in spider_net_handle_error_irq()
1447 if (card->tx_chain.tail != card->tx_chain.head) in spider_net_handle_error_irq()
1448 spider_net_kick_tx_dma(card); in spider_net_handle_error_irq()
1475 if (card->ignore_rx_ramfull == 0) { in spider_net_handle_error_irq()
1476 card->ignore_rx_ramfull = 1; in spider_net_handle_error_irq()
1477 spider_net_resync_head_ptr(card); in spider_net_handle_error_irq()
1478 spider_net_refill_rx_chain(card); in spider_net_handle_error_irq()
1479 spider_net_enable_rxdmac(card); in spider_net_handle_error_irq()
1480 card->num_rx_ints ++; in spider_net_handle_error_irq()
1481 napi_schedule(&card->napi); in spider_net_handle_error_irq()
1497 spider_net_resync_head_ptr(card); in spider_net_handle_error_irq()
1498 spider_net_refill_rx_chain(card); in spider_net_handle_error_irq()
1499 spider_net_enable_rxdmac(card); in spider_net_handle_error_irq()
1500 card->num_rx_ints ++; in spider_net_handle_error_irq()
1501 napi_schedule(&card->napi); in spider_net_handle_error_irq()
1511 spider_net_resync_head_ptr(card); in spider_net_handle_error_irq()
1512 spider_net_refill_rx_chain(card); in spider_net_handle_error_irq()
1513 spider_net_enable_rxdmac(card); in spider_net_handle_error_irq()
1514 card->num_rx_ints ++; in spider_net_handle_error_irq()
1515 napi_schedule(&card->napi); in spider_net_handle_error_irq()
1570 if ((show_error) && (netif_msg_intr(card)) && net_ratelimit()) in spider_net_handle_error_irq()
1571 dev_err(&card->netdev->dev, "Error interrupt, GHIINT0STS = 0x%08x, " in spider_net_handle_error_irq()
1576 spider_net_write_reg(card, SPIDER_NET_GHIINT1STS, error_reg1); in spider_net_handle_error_irq()
1577 spider_net_write_reg(card, SPIDER_NET_GHIINT2STS, error_reg2); in spider_net_handle_error_irq()
1586 * interrupt found raised by card.
1595 struct spider_net_card *card = netdev_priv(netdev); in spider_net_interrupt() local
1598 status_reg = spider_net_read_reg(card, SPIDER_NET_GHIINT0STS); in spider_net_interrupt()
1599 error_reg1 = spider_net_read_reg(card, SPIDER_NET_GHIINT1STS); in spider_net_interrupt()
1600 error_reg2 = spider_net_read_reg(card, SPIDER_NET_GHIINT2STS); in spider_net_interrupt()
1608 spider_net_rx_irq_off(card); in spider_net_interrupt()
1609 napi_schedule(&card->napi); in spider_net_interrupt()
1610 card->num_rx_ints ++; in spider_net_interrupt()
1613 napi_schedule(&card->napi); in spider_net_interrupt()
1619 spider_net_handle_error_irq(card, status_reg, in spider_net_interrupt()
1623 spider_net_write_reg(card, SPIDER_NET_GHIINT0STS, status_reg); in spider_net_interrupt()
1646 * @card: card structure
1651 spider_net_enable_interrupts(struct spider_net_card *card) in spider_net_enable_interrupts() argument
1653 spider_net_write_reg(card, SPIDER_NET_GHIINT0MSK, in spider_net_enable_interrupts()
1655 spider_net_write_reg(card, SPIDER_NET_GHIINT1MSK, in spider_net_enable_interrupts()
1657 spider_net_write_reg(card, SPIDER_NET_GHIINT2MSK, in spider_net_enable_interrupts()
1663 * @card: card structure
1668 spider_net_disable_interrupts(struct spider_net_card *card) in spider_net_disable_interrupts() argument
1670 spider_net_write_reg(card, SPIDER_NET_GHIINT0MSK, 0); in spider_net_disable_interrupts()
1671 spider_net_write_reg(card, SPIDER_NET_GHIINT1MSK, 0); in spider_net_disable_interrupts()
1672 spider_net_write_reg(card, SPIDER_NET_GHIINT2MSK, 0); in spider_net_disable_interrupts()
1673 spider_net_write_reg(card, SPIDER_NET_GMACINTEN, 0); in spider_net_disable_interrupts()
1677 * spider_net_init_card - initializes the card
1678 * @card: card structure
1680 * spider_net_init_card initializes the card so that other registers can
1684 spider_net_init_card(struct spider_net_card *card) in spider_net_init_card() argument
1686 spider_net_write_reg(card, SPIDER_NET_CKRCTRL, in spider_net_init_card()
1689 spider_net_write_reg(card, SPIDER_NET_CKRCTRL, in spider_net_init_card()
1693 spider_net_write_reg(card, SPIDER_NET_GMACOPEMD, in spider_net_init_card()
1694 spider_net_read_reg(card, SPIDER_NET_GMACOPEMD) | 0x4); in spider_net_init_card()
1696 spider_net_disable_interrupts(card); in spider_net_init_card()
1700 * spider_net_enable_card - enables the card by setting all kinds of regs
1701 * @card: card structure
1706 spider_net_enable_card(struct spider_net_card *card) in spider_net_enable_card() argument
1755 spider_net_write_reg(card, regs[i][0], regs[i][1]); in spider_net_enable_card()
1761 spider_net_write_reg(card, in spider_net_enable_card()
1764 spider_net_write_reg(card, in spider_net_enable_card()
1769 spider_net_write_reg(card, SPIDER_NET_GMRUA0FIL15R, 0x08080000); in spider_net_enable_card()
1771 spider_net_write_reg(card, SPIDER_NET_ECMODE, SPIDER_NET_ECMODE_VALUE); in spider_net_enable_card()
1776 spider_net_enable_rxchtails(card); in spider_net_enable_card()
1777 spider_net_enable_rxdmac(card); in spider_net_enable_card()
1779 spider_net_write_reg(card, SPIDER_NET_GRXDMAEN, SPIDER_NET_WOL_VALUE); in spider_net_enable_card()
1781 spider_net_write_reg(card, SPIDER_NET_GMACLENLMT, in spider_net_enable_card()
1783 spider_net_write_reg(card, SPIDER_NET_GMACOPEMD, in spider_net_enable_card()
1786 spider_net_write_reg(card, SPIDER_NET_GDTDMACCNTR, in spider_net_enable_card()
1792 * @card: card structure
1799 spider_net_download_firmware(struct spider_net_card *card, in spider_net_download_firmware() argument
1806 spider_net_write_reg(card, SPIDER_NET_GSINIT, in spider_net_download_firmware()
1811 spider_net_write_reg(card, in spider_net_download_firmware()
1814 spider_net_write_reg(card, SPIDER_NET_GSnPRGDAT + in spider_net_download_firmware()
1820 if (spider_net_read_reg(card, SPIDER_NET_GSINIT)) in spider_net_download_firmware()
1823 spider_net_write_reg(card, SPIDER_NET_GSINIT, in spider_net_download_firmware()
1831 * @card: card structure
1856 spider_net_init_firmware(struct spider_net_card *card) in spider_net_init_firmware() argument
1865 SPIDER_NET_FIRMWARE_NAME, &card->pdev->dev) == 0) { in spider_net_init_firmware()
1867 netif_msg_probe(card) ) { in spider_net_init_firmware()
1868 dev_err(&card->netdev->dev, in spider_net_init_firmware()
1873 err = spider_net_download_firmware(card, firmware->data); in spider_net_init_firmware()
1883 dn = pci_device_to_OF_node(card->pdev); in spider_net_init_firmware()
1892 netif_msg_probe(card) ) { in spider_net_init_firmware()
1893 dev_err(&card->netdev->dev, in spider_net_init_firmware()
1898 err = spider_net_download_firmware(card, fw_prop); in spider_net_init_firmware()
1903 if (netif_msg_probe(card)) in spider_net_init_firmware()
1904 dev_err(&card->netdev->dev, in spider_net_init_firmware()
1922 struct spider_net_card *card = netdev_priv(netdev); in spider_net_open() local
1925 result = spider_net_init_firmware(card); in spider_net_open()
1930 card->aneg_count = 0; in spider_net_open()
1931 card->medium = BCM54XX_COPPER; in spider_net_open()
1932 spider_net_setup_aneg(card); in spider_net_open()
1933 if (card->phy.def->phy_id) in spider_net_open()
1934 mod_timer(&card->aneg_timer, jiffies + SPIDER_NET_ANEG_TIMER); in spider_net_open()
1936 result = spider_net_init_chain(card, &card->tx_chain); in spider_net_open()
1939 card->low_watermark = NULL; in spider_net_open()
1941 result = spider_net_init_chain(card, &card->rx_chain); in spider_net_open()
1946 result = spider_net_alloc_rx_skbs(card); in spider_net_open()
1959 spider_net_enable_card(card); in spider_net_open()
1963 napi_enable(&card->napi); in spider_net_open()
1965 spider_net_enable_interrupts(card); in spider_net_open()
1970 spider_net_free_rx_chain_contents(card); in spider_net_open()
1972 spider_net_free_chain(card, &card->rx_chain); in spider_net_open()
1974 spider_net_free_chain(card, &card->tx_chain); in spider_net_open()
1976 del_timer_sync(&card->aneg_timer); in spider_net_open()
1983 * @t: timer context used to obtain the pointer to net card data structure
1987 struct spider_net_card *card = from_timer(card, t, aneg_timer); in spider_net_link_phy() local
1988 struct mii_phy *phy = &card->phy; in spider_net_link_phy()
1991 if (card->aneg_count > SPIDER_NET_ANEG_TIMEOUT) { in spider_net_link_phy()
1994 card->netdev->name); in spider_net_link_phy()
1996 switch (card->medium) { in spider_net_link_phy()
2001 card->medium = BCM54XX_FIBER; in spider_net_link_phy()
2008 card->medium = BCM54XX_UNKNOWN; in spider_net_link_phy()
2015 spider_net_setup_aneg(card); in spider_net_link_phy()
2016 card->medium = BCM54XX_COPPER; in spider_net_link_phy()
2020 card->aneg_count = 0; in spider_net_link_phy()
2021 mod_timer(&card->aneg_timer, jiffies + SPIDER_NET_ANEG_TIMER); in spider_net_link_phy()
2027 card->aneg_count++; in spider_net_link_phy()
2028 mod_timer(&card->aneg_timer, jiffies + SPIDER_NET_ANEG_TIMER); in spider_net_link_phy()
2035 spider_net_write_reg(card, SPIDER_NET_GMACST, in spider_net_link_phy()
2036 spider_net_read_reg(card, SPIDER_NET_GMACST)); in spider_net_link_phy()
2037 spider_net_write_reg(card, SPIDER_NET_GMACINTEN, 0x4); in spider_net_link_phy()
2040 spider_net_write_reg(card, SPIDER_NET_GMACMODE, 0x00000001); in spider_net_link_phy()
2042 spider_net_write_reg(card, SPIDER_NET_GMACMODE, 0); in spider_net_link_phy()
2044 card->aneg_count = 0; in spider_net_link_phy()
2047 card->netdev->name, phy->speed, in spider_net_link_phy()
2054 * @card: card structure
2061 spider_net_setup_phy(struct spider_net_card *card) in spider_net_setup_phy() argument
2063 struct mii_phy *phy = &card->phy; in spider_net_setup_phy()
2065 spider_net_write_reg(card, SPIDER_NET_GDTDMASEL, in spider_net_setup_phy()
2067 spider_net_write_reg(card, SPIDER_NET_GPCCTRL, in spider_net_setup_phy()
2070 phy->dev = card->netdev; in spider_net_setup_phy()
2076 id = spider_net_read_phy(card->netdev, phy->mii_id, MII_BMSR); in spider_net_setup_phy()
2090 * @card: card structure
2095 spider_net_workaround_rxramfull(struct spider_net_card *card) in spider_net_workaround_rxramfull() argument
2100 spider_net_write_reg(card, SPIDER_NET_CKRCTRL, in spider_net_workaround_rxramfull()
2106 spider_net_write_reg(card, SPIDER_NET_GSnPRGADR + in spider_net_workaround_rxramfull()
2109 spider_net_write_reg(card, SPIDER_NET_GSnPRGDAT + in spider_net_workaround_rxramfull()
2115 spider_net_write_reg(card, SPIDER_NET_GSINIT, 0x000000fe); in spider_net_workaround_rxramfull()
2118 spider_net_write_reg(card, SPIDER_NET_CKRCTRL, in spider_net_workaround_rxramfull()
2131 struct spider_net_card *card = netdev_priv(netdev); in spider_net_stop() local
2133 napi_disable(&card->napi); in spider_net_stop()
2136 del_timer_sync(&card->tx_timer); in spider_net_stop()
2137 del_timer_sync(&card->aneg_timer); in spider_net_stop()
2139 spider_net_disable_interrupts(card); in spider_net_stop()
2143 spider_net_write_reg(card, SPIDER_NET_GDTDMACCNTR, in spider_net_stop()
2147 spider_net_disable_rxdmac(card); in spider_net_stop()
2150 spider_net_release_tx_chain(card, 1); in spider_net_stop()
2151 spider_net_free_rx_chain_contents(card); in spider_net_stop()
2153 spider_net_free_chain(card, &card->tx_chain); in spider_net_stop()
2154 spider_net_free_chain(card, &card->rx_chain); in spider_net_stop()
2162 * @work: work context used to obtain the pointer to net card data structure
2169 struct spider_net_card *card = in spider_net_tx_timeout_task() local
2171 struct net_device *netdev = card->netdev; in spider_net_tx_timeout_task()
2179 spider_net_workaround_rxramfull(card); in spider_net_tx_timeout_task()
2180 spider_net_init_card(card); in spider_net_tx_timeout_task()
2182 if (spider_net_setup_phy(card)) in spider_net_tx_timeout_task()
2186 spider_net_kick_tx_dma(card); in spider_net_tx_timeout_task()
2190 atomic_dec(&card->tx_timeout_task_counter); in spider_net_tx_timeout_task()
2203 struct spider_net_card *card; in spider_net_tx_timeout() local
2205 card = netdev_priv(netdev); in spider_net_tx_timeout()
2206 atomic_inc(&card->tx_timeout_task_counter); in spider_net_tx_timeout()
2208 schedule_work(&card->tx_timeout_task); in spider_net_tx_timeout()
2210 atomic_dec(&card->tx_timeout_task_counter); in spider_net_tx_timeout()
2211 card->spider_stats.tx_timeouts++; in spider_net_tx_timeout()
2247 * @card: card structure
2254 spider_net_setup_netdev(struct spider_net_card *card) in spider_net_setup_netdev() argument
2257 struct net_device *netdev = card->netdev; in spider_net_setup_netdev()
2262 SET_NETDEV_DEV(netdev, &card->pdev->dev); in spider_net_setup_netdev()
2264 pci_set_drvdata(card->pdev, netdev); in spider_net_setup_netdev()
2266 timer_setup(&card->tx_timer, spider_net_cleanup_tx_ring, 0); in spider_net_setup_netdev()
2267 netdev->irq = card->pdev->irq; in spider_net_setup_netdev()
2269 card->aneg_count = 0; in spider_net_setup_netdev()
2270 timer_setup(&card->aneg_timer, spider_net_link_phy, 0); in spider_net_setup_netdev()
2272 netif_napi_add(netdev, &card->napi, in spider_net_setup_netdev()
2289 netdev->irq = card->pdev->irq; in spider_net_setup_netdev()
2290 card->num_rx_ints = 0; in spider_net_setup_netdev()
2291 card->ignore_rx_ramfull = 0; in spider_net_setup_netdev()
2293 dn = pci_device_to_OF_node(card->pdev); in spider_net_setup_netdev()
2303 if ((result) && (netif_msg_probe(card))) in spider_net_setup_netdev()
2304 dev_err(&card->netdev->dev, in spider_net_setup_netdev()
2309 if (netif_msg_probe(card)) in spider_net_setup_netdev()
2310 dev_err(&card->netdev->dev, in spider_net_setup_netdev()
2315 if (netif_msg_probe(card)) in spider_net_setup_netdev()
2322 * spider_net_alloc_card - allocates net_device and card structure
2324 * returns the card structure or NULL in case of errors
2326 * the card and net_device structures are linked to each other
2332 struct spider_net_card *card; in spider_net_alloc_card() local
2334 netdev = alloc_etherdev(struct_size(card, darray, in spider_net_alloc_card()
2339 card = netdev_priv(netdev); in spider_net_alloc_card()
2340 card->netdev = netdev; in spider_net_alloc_card()
2341 card->msg_enable = SPIDER_NET_DEFAULT_MSG; in spider_net_alloc_card()
2342 INIT_WORK(&card->tx_timeout_task, spider_net_tx_timeout_task); in spider_net_alloc_card()
2343 init_waitqueue_head(&card->waitq); in spider_net_alloc_card()
2344 atomic_set(&card->tx_timeout_task_counter, 0); in spider_net_alloc_card()
2346 card->rx_chain.num_desc = rx_descriptors; in spider_net_alloc_card()
2347 card->rx_chain.ring = card->darray; in spider_net_alloc_card()
2348 card->tx_chain.num_desc = tx_descriptors; in spider_net_alloc_card()
2349 card->tx_chain.ring = card->darray + rx_descriptors; in spider_net_alloc_card()
2351 return card; in spider_net_alloc_card()
2356 * @card: card structure
2361 spider_net_undo_pci_setup(struct spider_net_card *card) in spider_net_undo_pci_setup() argument
2363 iounmap(card->regs); in spider_net_undo_pci_setup()
2364 pci_release_regions(card->pdev); in spider_net_undo_pci_setup()
2371 * Returns the card structure or NULL if any errors occur
2376 * The net_device structure is attached to the card structure, if the
2382 struct spider_net_card *card; in spider_net_setup_pci_dev() local
2404 card = spider_net_alloc_card(); in spider_net_setup_pci_dev()
2405 if (!card) { in spider_net_setup_pci_dev()
2410 card->pdev = pdev; in spider_net_setup_pci_dev()
2416 card->netdev->mem_start = mmio_start; in spider_net_setup_pci_dev()
2417 card->netdev->mem_end = mmio_start + mmio_len; in spider_net_setup_pci_dev()
2418 card->regs = ioremap(mmio_start, mmio_len); in spider_net_setup_pci_dev()
2420 if (!card->regs) { in spider_net_setup_pci_dev()
2426 return card; in spider_net_setup_pci_dev()
2449 struct spider_net_card *card; in spider_net_probe() local
2451 card = spider_net_setup_pci_dev(pdev); in spider_net_probe()
2452 if (!card) in spider_net_probe()
2455 spider_net_workaround_rxramfull(card); in spider_net_probe()
2456 spider_net_init_card(card); in spider_net_probe()
2458 err = spider_net_setup_phy(card); in spider_net_probe()
2462 err = spider_net_setup_netdev(card); in spider_net_probe()
2469 spider_net_undo_pci_setup(card); in spider_net_probe()
2470 free_netdev(card->netdev); in spider_net_probe()
2488 struct spider_net_card *card; in spider_net_remove() local
2491 card = netdev_priv(netdev); in spider_net_remove()
2493 wait_event(card->waitq, in spider_net_remove()
2494 atomic_read(&card->tx_timeout_task_counter) == 0); in spider_net_remove()
2498 /* switch off card */ in spider_net_remove()
2499 spider_net_write_reg(card, SPIDER_NET_CKRCTRL, in spider_net_remove()
2501 spider_net_write_reg(card, SPIDER_NET_CKRCTRL, in spider_net_remove()
2504 spider_net_undo_pci_setup(card); in spider_net_remove()