Lines Matching +full:inter +full:- +full:chip
1 // SPDX-License-Identifier: GPL-2.0+
78 } debug = { -1 };
87 struct device *dev = &priv->spi->dev; in spi_read_buf()
88 u8 *rx_buf = priv->spi_transfer_buf + 4; in spi_read_buf()
89 u8 *tx_buf = priv->spi_transfer_buf; in spi_read_buf()
107 ret = spi_sync(priv->spi, &msg); in spi_read_buf()
124 struct device *dev = &priv->spi->dev; in spi_write_buf()
127 if (len > SPI_TRANSFER_BUF_LEN - 1 || len <= 0) in spi_write_buf()
128 ret = -EINVAL; in spi_write_buf()
130 priv->spi_transfer_buf[0] = ENC28J60_WRITE_BUF_MEM; in spi_write_buf()
131 memcpy(&priv->spi_transfer_buf[1], data, len); in spi_write_buf()
132 ret = spi_write(priv->spi, priv->spi_transfer_buf, len + 1); in spi_write_buf()
145 struct device *dev = &priv->spi->dev; in spi_read_op()
157 ret = spi_write_then_read(priv->spi, tx_buf, 1, rx_buf, slen); in spi_read_op()
162 val = rx_buf[slen - 1]; in spi_read_op()
172 struct device *dev = &priv->spi->dev; in spi_write_op()
175 priv->spi_transfer_buf[0] = op | (addr & ADDR_MASK); in spi_write_op()
176 priv->spi_transfer_buf[1] = val; in spi_write_op()
177 ret = spi_write(priv->spi, priv->spi_transfer_buf, 2); in spi_write_op()
206 if ((b & ECON1_BSEL0) != (priv->bank & ECON1_BSEL0)) { in enc28j60_set_bank()
214 if ((b & ECON1_BSEL1) != (priv->bank & ECON1_BSEL1)) { in enc28j60_set_bank()
222 priv->bank = b; in enc28j60_set_bank()
228 * - nolock_xxx: caller needs to invoke mutex_lock, usually to access
230 * - locked_xxx: caller doesn't need to invoke mutex_lock, single access
247 mutex_lock(&priv->lock); in locked_reg_bfset()
249 mutex_unlock(&priv->lock); in locked_reg_bfset()
263 mutex_lock(&priv->lock); in locked_reg_bfclr()
265 mutex_unlock(&priv->lock); in locked_reg_bfclr()
281 mutex_lock(&priv->lock); in locked_regb_read()
283 mutex_unlock(&priv->lock); in locked_regb_read()
306 mutex_lock(&priv->lock); in locked_regw_read()
308 mutex_unlock(&priv->lock); in locked_regw_read()
324 mutex_lock(&priv->lock); in locked_regb_write()
326 mutex_unlock(&priv->lock); in locked_regb_write()
342 mutex_lock(&priv->lock); in locked_regw_write()
344 mutex_unlock(&priv->lock); in locked_regw_write()
354 mutex_lock(&priv->lock); in enc28j60_mem_read()
358 struct device *dev = &priv->spi->dev; in enc28j60_mem_read()
364 "%s() error writing ERDPT (0x%04x - 0x%04x)\n", in enc28j60_mem_read()
369 mutex_unlock(&priv->lock); in enc28j60_mem_read()
378 struct device *dev = &priv->spi->dev; in enc28j60_packet_write()
380 mutex_lock(&priv->lock); in enc28j60_packet_write()
395 /* write per-packet control byte */ in enc28j60_packet_write()
407 mutex_unlock(&priv->lock); in enc28j60_packet_write()
412 struct device *dev = &priv->spi->dev; in poll_ready()
420 return -ETIMEDOUT; in poll_ready()
443 mutex_lock(&priv->lock); in enc28j60_phy_read()
454 mutex_unlock(&priv->lock); in enc28j60_phy_read()
463 mutex_lock(&priv->lock); in enc28j60_phy_write()
470 mutex_unlock(&priv->lock); in enc28j60_phy_write()
476 * Program the hardware MAC address from dev->dev_addr.
482 struct device *dev = &priv->spi->dev; in enc28j60_set_hw_macaddr()
484 mutex_lock(&priv->lock); in enc28j60_set_hw_macaddr()
485 if (!priv->hw_enable) { in enc28j60_set_hw_macaddr()
488 ndev->name, ndev->dev_addr); in enc28j60_set_hw_macaddr()
489 /* NOTE: MAC address in ENC28J60 is byte-backward */ in enc28j60_set_hw_macaddr()
490 nolock_regb_write(priv, MAADR5, ndev->dev_addr[0]); in enc28j60_set_hw_macaddr()
491 nolock_regb_write(priv, MAADR4, ndev->dev_addr[1]); in enc28j60_set_hw_macaddr()
492 nolock_regb_write(priv, MAADR3, ndev->dev_addr[2]); in enc28j60_set_hw_macaddr()
493 nolock_regb_write(priv, MAADR2, ndev->dev_addr[3]); in enc28j60_set_hw_macaddr()
494 nolock_regb_write(priv, MAADR1, ndev->dev_addr[4]); in enc28j60_set_hw_macaddr()
495 nolock_regb_write(priv, MAADR0, ndev->dev_addr[5]); in enc28j60_set_hw_macaddr()
502 ret = -EBUSY; in enc28j60_set_hw_macaddr()
504 mutex_unlock(&priv->lock); in enc28j60_set_hw_macaddr()
509 * Store the new hardware address in dev->dev_addr, and update the MAC.
516 return -EBUSY; in enc28j60_set_mac_address()
517 if (!is_valid_ether_addr(address->sa_data)) in enc28j60_set_mac_address()
518 return -EADDRNOTAVAIL; in enc28j60_set_mac_address()
520 ether_addr_copy(dev->dev_addr, address->sa_data); in enc28j60_set_mac_address()
529 struct device *dev = &priv->spi->dev; in enc28j60_dump_regs()
531 mutex_lock(&priv->lock); in enc28j60_dump_regs()
559 mutex_unlock(&priv->lock); in enc28j60_dump_regs()
569 if ((next_packet_ptr - 1 < start) || (next_packet_ptr - 1 > end)) in erxrdpt_workaround()
572 erxrdpt = next_packet_ptr - 1; in erxrdpt_workaround()
583 return (ptr + RSV_SIZE) - (RXEND_INIT - RXSTART_INIT + 1); in rx_packet_start()
590 struct device *dev = &priv->spi->dev; in nolock_rxfifo_init()
600 priv->next_pk_ptr = start; in nolock_rxfifo_init()
602 erxrdpt = erxrdpt_workaround(priv->next_pk_ptr, start, end); in nolock_rxfifo_init()
609 struct device *dev = &priv->spi->dev; in nolock_txfifo_init()
624 * the chip to be in that mode whenever it's inactive. (However, we
629 struct device *dev = &priv->spi->dev; in enc28j60_lowpower()
634 mutex_lock(&priv->lock); in enc28j60_lowpower()
646 mutex_unlock(&priv->lock); in enc28j60_lowpower()
651 struct device *dev = &priv->spi->dev; in enc28j60_hw_init()
655 dev_printk(KERN_DEBUG, dev, "%s() - %s\n", __func__, in enc28j60_hw_init()
656 priv->full_duplex ? "FullDuplex" : "HalfDuplex"); in enc28j60_hw_init()
658 mutex_lock(&priv->lock); in enc28j60_hw_init()
659 /* first reset the chip */ in enc28j60_hw_init()
663 priv->bank = 0; in enc28j60_hw_init()
664 priv->hw_enable = false; in enc28j60_hw_init()
665 priv->tx_retry_count = 0; in enc28j60_hw_init()
666 priv->max_pk_counter = 0; in enc28j60_hw_init()
667 priv->rxfilter = RXFILTER_NORMAL; in enc28j60_hw_init()
673 mutex_unlock(&priv->lock); in enc28j60_hw_init()
682 dev_info(dev, "chip RevID: 0x%02x\n", reg); in enc28j60_hw_init()
698 if (priv->full_duplex) { in enc28j60_hw_init()
702 /* set inter-frame gap (non-back-to-back) */ in enc28j60_hw_init()
704 /* set inter-frame gap (back-to-back) */ in enc28j60_hw_init()
711 /* set inter-frame gap (non-back-to-back) */ in enc28j60_hw_init()
713 /* set inter-frame gap (back-to-back) */ in enc28j60_hw_init()
727 if (priv->full_duplex) { in enc28j60_hw_init()
746 struct device *dev = &priv->spi->dev; in enc28j60_hw_enable()
755 mutex_lock(&priv->lock); in enc28j60_hw_enable()
763 priv->hw_enable = true; in enc28j60_hw_enable()
764 mutex_unlock(&priv->lock); in enc28j60_hw_enable()
769 mutex_lock(&priv->lock); in enc28j60_hw_disable()
773 priv->hw_enable = false; in enc28j60_hw_disable()
774 mutex_unlock(&priv->lock); in enc28j60_hw_disable()
783 if (!priv->hw_enable) { in enc28j60_setlink()
788 priv->full_duplex = (duplex == DUPLEX_FULL); in enc28j60_setlink()
792 ret = -EOPNOTSUPP; in enc28j60_setlink()
797 ret = -EBUSY; in enc28j60_setlink()
807 struct device *dev = &priv->spi->dev; in enc28j60_read_tsv()
820 struct device *dev = &priv->spi->dev; in enc28j60_dump_tsv()
823 dev_printk(KERN_DEBUG, dev, "%s - TSV:\n", msg); in enc28j60_dump_tsv()
866 struct device *dev = &priv->spi->dev; in enc28j60_dump_rsv()
868 dev_printk(KERN_DEBUG, dev, "%s - NextPk: 0x%04x - RSV:\n", msg, pk_ptr); in enc28j60_dump_rsv()
893 printk(KERN_DEBUG DRV_NAME ": %s - packet len:%d\n", msg, len); in dump_packet()
906 struct device *dev = &priv->spi->dev; in enc28j60_hw_rx()
914 priv->next_pk_ptr); in enc28j60_hw_rx()
916 if (unlikely(priv->next_pk_ptr > RXEND_INIT)) { in enc28j60_hw_rx()
919 __func__, priv->next_pk_ptr); in enc28j60_hw_rx()
921 mutex_lock(&priv->lock); in enc28j60_hw_rx()
928 mutex_unlock(&priv->lock); in enc28j60_hw_rx()
929 ndev->stats.rx_errors++; in enc28j60_hw_rx()
933 enc28j60_mem_read(priv, priv->next_pk_ptr, sizeof(rsv), rsv); in enc28j60_hw_rx()
953 ndev->stats.rx_errors++; in enc28j60_hw_rx()
955 ndev->stats.rx_crc_errors++; in enc28j60_hw_rx()
957 ndev->stats.rx_frame_errors++; in enc28j60_hw_rx()
959 ndev->stats.rx_over_errors++; in enc28j60_hw_rx()
965 ndev->stats.rx_dropped++; in enc28j60_hw_rx()
970 rx_packet_start(priv->next_pk_ptr), in enc28j60_hw_rx()
973 dump_packet(__func__, skb->len, skb->data); in enc28j60_hw_rx()
974 skb->protocol = eth_type_trans(skb, ndev); in enc28j60_hw_rx()
976 ndev->stats.rx_packets++; in enc28j60_hw_rx()
977 ndev->stats.rx_bytes += len; in enc28j60_hw_rx()
991 mutex_lock(&priv->lock); in enc28j60_hw_rx()
999 "%s() ERXRDPT verify error (0x%04x - 0x%04x)\n", in enc28j60_hw_rx()
1003 priv->next_pk_ptr = next_packet; in enc28j60_hw_rx()
1006 mutex_unlock(&priv->lock); in enc28j60_hw_rx()
1014 struct net_device *ndev = priv->netdev; in enc28j60_get_free_rxfifo()
1018 mutex_lock(&priv->lock); in enc28j60_get_free_rxfifo()
1021 free_space = -1; in enc28j60_get_free_rxfifo()
1029 free_space = (erxnd - erxst) - (erxwr - erxrd); in enc28j60_get_free_rxfifo()
1031 free_space = (erxnd - erxst); in enc28j60_get_free_rxfifo()
1033 free_space = erxrd - erxwr - 1; in enc28j60_get_free_rxfifo()
1035 mutex_unlock(&priv->lock); in enc28j60_get_free_rxfifo()
1048 struct device *dev = &priv->spi->dev; in enc28j60_check_link_status()
1062 netdev_info(ndev, "link up - %s\n", in enc28j60_check_link_status()
1076 ndev->stats.tx_errors++; in enc28j60_tx_clear()
1078 ndev->stats.tx_packets++; in enc28j60_tx_clear()
1080 if (priv->tx_skb) { in enc28j60_tx_clear()
1082 ndev->stats.tx_bytes += priv->tx_skb->len; in enc28j60_tx_clear()
1083 dev_kfree_skb(priv->tx_skb); in enc28j60_tx_clear()
1084 priv->tx_skb = NULL; in enc28j60_tx_clear()
1107 if (pk_counter > priv->max_pk_counter) { in enc28j60_rx_interrupt()
1109 priv->max_pk_counter = pk_counter; in enc28j60_rx_interrupt()
1110 if (netif_msg_rx_status(priv) && priv->max_pk_counter > 1) in enc28j60_rx_interrupt()
1112 priv->max_pk_counter); in enc28j60_rx_interrupt()
1115 while (pk_counter-- > 0) in enc28j60_rx_interrupt()
1125 struct net_device *ndev = priv->netdev; in enc28j60_irq_work_handler()
1160 priv->tx_retry_count = 0; in enc28j60_irq_work_handler()
1187 mutex_lock(&priv->lock); in enc28j60_irq_work_handler()
1191 mutex_unlock(&priv->lock); in enc28j60_irq_work_handler()
1197 priv->tx_retry_count); in enc28j60_irq_work_handler()
1198 if (priv->tx_retry_count++ < MAX_TX_RETRYCOUNT) in enc28j60_irq_work_handler()
1217 ndev->stats.rx_dropped++; in enc28j60_irq_work_handler()
1226 /* re-enable interrupts */ in enc28j60_irq_work_handler()
1237 struct net_device *ndev = priv->netdev; in enc28j60_hw_tx()
1239 BUG_ON(!priv->tx_skb); in enc28j60_hw_tx()
1243 priv->tx_skb->len); in enc28j60_hw_tx()
1247 priv->tx_skb->len, priv->tx_skb->data); in enc28j60_hw_tx()
1248 enc28j60_packet_write(priv, priv->tx_skb->len, priv->tx_skb->data); in enc28j60_hw_tx()
1253 struct device *dev = &priv->spi->dev; in enc28j60_hw_tx()
1258 test_len = priv->tx_skb->len; in enc28j60_hw_tx()
1266 if (priv->tx_skb->data[k] != test_buf[k]) { in enc28j60_hw_tx()
1268 "Error, %d location differ: 0x%02x-0x%02x\n", in enc28j60_hw_tx()
1269 k, priv->tx_skb->data[k], test_buf[k]); in enc28j60_hw_tx()
1297 priv->tx_skb = skb; in enc28j60_send_packet()
1298 schedule_work(&priv->tx_work); in enc28j60_send_packet()
1323 schedule_work(&priv->irq_work); in enc28j60_irq()
1335 ndev->stats.tx_errors++; in enc28j60_tx_timeout()
1337 schedule_work(&priv->restart_work); in enc28j60_tx_timeout()
1346 * there is non-reboot way to recover if something goes wrong.
1352 if (!is_valid_ether_addr(dev->dev_addr)) { in enc28j60_net_open()
1354 netdev_err(dev, "invalid MAC address %pM\n", dev->dev_addr); in enc28j60_net_open()
1355 return -EADDRNOTAVAIL; in enc28j60_net_open()
1363 return -EINVAL; in enc28j60_net_open()
1393 * num_addrs == -1 Promiscuous mode, receive all packets
1400 int oldfilter = priv->rxfilter; in enc28j60_set_multicast_list()
1402 if (dev->flags & IFF_PROMISC) { in enc28j60_set_multicast_list()
1405 priv->rxfilter = RXFILTER_PROMISC; in enc28j60_set_multicast_list()
1406 } else if ((dev->flags & IFF_ALLMULTI) || !netdev_mc_empty(dev)) { in enc28j60_set_multicast_list()
1409 (dev->flags & IFF_ALLMULTI) ? "all-" : ""); in enc28j60_set_multicast_list()
1410 priv->rxfilter = RXFILTER_MULTI; in enc28j60_set_multicast_list()
1414 priv->rxfilter = RXFILTER_NORMAL; in enc28j60_set_multicast_list()
1417 if (oldfilter != priv->rxfilter) in enc28j60_set_multicast_list()
1418 schedule_work(&priv->setrx_work); in enc28j60_set_multicast_list()
1425 struct device *dev = &priv->spi->dev; in enc28j60_setrx_work_handler()
1427 if (priv->rxfilter == RXFILTER_PROMISC) { in enc28j60_setrx_work_handler()
1431 } else if (priv->rxfilter == RXFILTER_MULTI) { in enc28j60_setrx_work_handler()
1450 struct net_device *ndev = priv->netdev; in enc28j60_restart_work_handler()
1470 strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); in enc28j60_get_drvinfo()
1471 strlcpy(info->version, DRV_VERSION, sizeof(info->version)); in enc28j60_get_drvinfo()
1472 strlcpy(info->bus_info, in enc28j60_get_drvinfo()
1473 dev_name(dev->dev.parent), sizeof(info->bus_info)); in enc28j60_get_drvinfo()
1487 cmd->base.speed = SPEED_10; in enc28j60_get_link_ksettings()
1488 cmd->base.duplex = priv->full_duplex ? DUPLEX_FULL : DUPLEX_HALF; in enc28j60_get_link_ksettings()
1489 cmd->base.port = PORT_TP; in enc28j60_get_link_ksettings()
1490 cmd->base.autoneg = AUTONEG_DISABLE; in enc28j60_get_link_ksettings()
1499 return enc28j60_setlink(dev, cmd->base.autoneg, in enc28j60_set_link_ksettings()
1500 cmd->base.speed, cmd->base.duplex); in enc28j60_set_link_ksettings()
1506 return priv->msg_enable; in enc28j60_get_msglevel()
1512 priv->msg_enable = val; in enc28j60_set_msglevel()
1548 dev_info(&spi->dev, "Ethernet driver %s loaded\n", DRV_VERSION); in enc28j60_probe()
1552 ret = -ENOMEM; in enc28j60_probe()
1557 priv->netdev = dev; /* priv to netdev reference */ in enc28j60_probe()
1558 priv->spi = spi; /* priv to spi reference */ in enc28j60_probe()
1559 priv->msg_enable = netif_msg_init(debug.msg_enable, ENC28J60_MSG_DEFAULT); in enc28j60_probe()
1560 mutex_init(&priv->lock); in enc28j60_probe()
1561 INIT_WORK(&priv->tx_work, enc28j60_tx_work_handler); in enc28j60_probe()
1562 INIT_WORK(&priv->setrx_work, enc28j60_setrx_work_handler); in enc28j60_probe()
1563 INIT_WORK(&priv->irq_work, enc28j60_irq_work_handler); in enc28j60_probe()
1564 INIT_WORK(&priv->restart_work, enc28j60_restart_work_handler); in enc28j60_probe()
1566 SET_NETDEV_DEV(dev, &spi->dev); in enc28j60_probe()
1570 dev_info(&spi->dev, "chip not found\n"); in enc28j60_probe()
1571 ret = -EIO; in enc28j60_probe()
1575 if (device_get_mac_address(&spi->dev, macaddr, sizeof(macaddr))) in enc28j60_probe()
1576 ether_addr_copy(dev->dev_addr, macaddr); in enc28j60_probe()
1584 ret = request_irq(spi->irq, enc28j60_irq, 0, DRV_NAME, priv); in enc28j60_probe()
1587 dev_err(&spi->dev, "request irq %d failed (ret = %d)\n", in enc28j60_probe()
1588 spi->irq, ret); in enc28j60_probe()
1592 dev->if_port = IF_PORT_10BASET; in enc28j60_probe()
1593 dev->irq = spi->irq; in enc28j60_probe()
1594 dev->netdev_ops = &enc28j60_netdev_ops; in enc28j60_probe()
1595 dev->watchdog_timeo = TX_TIMEOUT; in enc28j60_probe()
1596 dev->ethtool_ops = &enc28j60_ethtool_ops; in enc28j60_probe()
1603 dev_err(&spi->dev, "register netdev failed (ret = %d)\n", in enc28j60_probe()
1611 free_irq(spi->irq, priv); in enc28j60_probe()
1622 unregister_netdev(priv->netdev); in enc28j60_remove()
1623 free_irq(spi->irq, priv); in enc28j60_remove()
1624 free_netdev(priv->netdev); in enc28j60_remove()