Lines Matching +full:bit +full:- +full:banged
1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * This is a driver for SMSC's LAN911{5,6,7,8} single-chip Ethernet devices.
18 "smc911x.c: v1.0 04-16-2005 by Dustin McIntire <dustin@sensoria.com>\n";
92 * Use power-down feature of the chip
172 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_reset()
182 } while (--timeout && !reg); in smc911x_reset()
190 spin_lock_irqsave(&lp->lock, flags); in smc911x_reset()
192 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_reset()
194 while (resets--) { in smc911x_reset()
206 } while (--timeout && (reg & HW_CFG_SRST_)); in smc911x_reset()
215 while (--timeout && (SMC_GET_E2P_CMD(lp) & E2P_CMD_EPC_BUSY_)) in smc911x_reset()
225 SMC_ACK_INT(lp, -1); in smc911x_reset()
228 SMC_SET_HW_CFG(lp, (lp->tx_fifo_kb & 0xF) << 16); in smc911x_reset()
231 SMC_SET_AFC_CFG(lp, lp->afc_cfg); in smc911x_reset()
239 * and drive IRQ pin push-pull in smc911x_reset()
243 if (lp->cfg.irq_polarity) in smc911x_reset()
249 if (lp->pending_tx_skb != NULL) { in smc911x_reset()
250 dev_kfree_skb (lp->pending_tx_skb); in smc911x_reset()
251 lp->pending_tx_skb = NULL; in smc911x_reset()
252 dev->stats.tx_errors++; in smc911x_reset()
253 dev->stats.tx_aborted_errors++; in smc911x_reset()
266 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_enable()
268 spin_lock_irqsave(&lp->lock, flags); in smc911x_enable()
270 SMC_SET_MAC_ADDR(lp, dev->dev_addr); in smc911x_enable()
304 if (IS_REV_A(lp->revision)) in smc911x_enable()
311 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_enable()
323 DBG(SMC_DEBUG_FUNC, dev, "%s: --> %s\n", CARDNAME, __func__); in smc911x_shutdown()
329 spin_lock_irqsave(&lp->lock, flags); in smc911x_shutdown()
334 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_shutdown()
342 DBG(SMC_DEBUG_FUNC | SMC_DEBUG_RX, dev, "%s: --> %s\n", in smc911x_drop_pkt()
347 while (fifo_count--) in smc911x_drop_pkt()
356 } while (--timeout && reg); in smc911x_drop_pkt()
376 DBG(SMC_DEBUG_FUNC | SMC_DEBUG_RX, dev, "--> %s\n", in smc911x_rcv()
384 dev->stats.rx_errors++; in smc911x_rcv()
386 dev->stats.rx_crc_errors++; in smc911x_rcv()
389 dev->stats.rx_length_errors++; in smc911x_rcv()
391 dev->stats.multicast++; in smc911x_rcv()
401 dev->stats.rx_dropped++; in smc911x_rcv()
409 data = skb->data; in smc911x_rcv()
411 skb_put(skb,pkt_len-4); in smc911x_rcv()
417 if (fifo & 0xFF) fifo--; in smc911x_rcv()
423 lp->rxdma_active = 1; in smc911x_rcv()
424 lp->current_rx_skb = skb; in smc911x_rcv()
433 PRINT_PKT(data, ((pkt_len - 4) <= 64) ? pkt_len - 4 : 64); in smc911x_rcv()
434 skb->protocol = eth_type_trans(skb, dev); in smc911x_rcv()
436 dev->stats.rx_packets++; in smc911x_rcv()
437 dev->stats.rx_bytes += pkt_len-4; in smc911x_rcv()
452 DBG(SMC_DEBUG_FUNC | SMC_DEBUG_TX, dev, "--> %s\n", __func__); in smc911x_hardware_send_pkt()
453 BUG_ON(lp->pending_tx_skb == NULL); in smc911x_hardware_send_pkt()
455 skb = lp->pending_tx_skb; in smc911x_hardware_send_pkt()
456 lp->pending_tx_skb = NULL; in smc911x_hardware_send_pkt()
462 buf = (char*)((u32)(skb->data) & ~0xF); in smc911x_hardware_send_pkt()
463 len = (skb->len + 0xF + ((u32)skb->data & 0xF)) & ~0xF; in smc911x_hardware_send_pkt()
464 cmdA = (1<<24) | (((u32)skb->data & 0xF)<<16) | in smc911x_hardware_send_pkt()
466 skb->len; in smc911x_hardware_send_pkt()
468 buf = (char *)((uintptr_t)skb->data & ~0x3); in smc911x_hardware_send_pkt()
469 len = (skb->len + 3 + ((uintptr_t)skb->data & 3)) & ~0x3; in smc911x_hardware_send_pkt()
470 cmdA = (((uintptr_t)skb->data & 0x3) << 16) | in smc911x_hardware_send_pkt()
472 skb->len; in smc911x_hardware_send_pkt()
475 cmdB = (skb->len << 16) | (skb->len & 0x7FF); in smc911x_hardware_send_pkt()
487 lp->current_tx_skb = skb; in smc911x_hardware_send_pkt()
495 if (!lp->tx_throttle) { in smc911x_hardware_send_pkt()
514 DBG(SMC_DEBUG_FUNC | SMC_DEBUG_TX, dev, "--> %s\n", in smc911x_hard_start_xmit()
517 spin_lock_irqsave(&lp->lock, flags); in smc911x_hard_start_xmit()
519 BUG_ON(lp->pending_tx_skb != NULL); in smc911x_hard_start_xmit()
530 lp->tx_throttle = 1; in smc911x_hard_start_xmit()
541 if (unlikely(free < (skb->len + 8 + 15 + 15))) { in smc911x_hard_start_xmit()
543 free, skb->len); in smc911x_hard_start_xmit()
544 lp->pending_tx_skb = NULL; in smc911x_hard_start_xmit()
545 dev->stats.tx_errors++; in smc911x_hard_start_xmit()
546 dev->stats.tx_dropped++; in smc911x_hard_start_xmit()
547 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_hard_start_xmit()
557 if (lp->txdma_active) { in smc911x_hard_start_xmit()
559 lp->pending_tx_skb = skb; in smc911x_hard_start_xmit()
561 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_hard_start_xmit()
565 lp->txdma_active = 1; in smc911x_hard_start_xmit()
569 lp->pending_tx_skb = skb; in smc911x_hard_start_xmit()
571 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_hard_start_xmit()
578 * - a TX error occurred, or
579 * - TX of a packet completed.
586 DBG(SMC_DEBUG_FUNC | SMC_DEBUG_TX, dev, "--> %s\n", in smc911x_tx()
594 dev->stats.tx_packets++; in smc911x_tx()
595 dev->stats.tx_bytes+=tx_status>>16; in smc911x_tx()
600 * full-duplex mode */ in smc911x_tx()
601 if ((tx_status & TX_STS_ES_) && !(lp->ctl_rfduplx && in smc911x_tx()
603 dev->stats.tx_errors++; in smc911x_tx()
606 dev->stats.collisions+=16; in smc911x_tx()
607 dev->stats.tx_aborted_errors++; in smc911x_tx()
609 dev->stats.collisions+=(tx_status & TX_STS_COLL_CNT_) >> 3; in smc911x_tx()
611 /* carrier error only has meaning for half-duplex communication */ in smc911x_tx()
613 !lp->ctl_rfduplx) { in smc911x_tx()
614 dev->stats.tx_carrier_errors++; in smc911x_tx()
617 dev->stats.collisions++; in smc911x_tx()
618 dev->stats.tx_aborted_errors++; in smc911x_tx()
624 /*---PHY CONTROL AND CONFIGURATION-----------------------------------------*/
666 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_phy_detect()
668 lp->phy_type = 0; in smc911x_phy_detect()
674 switch(lp->version) { in smc911x_phy_detect()
709 lp->mii.phy_id = phyaddr & 31; in smc911x_phy_detect()
710 lp->phy_type = id1 << 16 | id2; in smc911x_phy_detect()
724 lp->mii.phy_id = 1; in smc911x_phy_detect()
725 lp->phy_type = id1 << 16 | id2; in smc911x_phy_detect()
729 id1, id2, lp->mii.phy_id); in smc911x_phy_detect()
739 int phyaddr = lp->mii.phy_id; in smc911x_phy_fixed()
742 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_phy_fixed()
751 * Disable auto-negotiation in smc911x_phy_fixed()
754 if (lp->ctl_rfduplx) in smc911x_phy_fixed()
757 if (lp->ctl_rspeed == 100) in smc911x_phy_fixed()
763 /* Re-Configure the Receive/Phy Control register */ in smc911x_phy_fixed()
771 * smc911x_phy_reset - reset the phy
789 DBG(SMC_DEBUG_FUNC, dev, "--> %s()\n", __func__); in smc911x_phy_reset()
791 spin_lock_irqsave(&lp->lock, flags); in smc911x_phy_reset()
796 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_phy_reset()
797 for (timeout = 2; timeout; timeout--) { in smc911x_phy_reset()
799 spin_lock_irqsave(&lp->lock, flags); in smc911x_phy_reset()
801 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_phy_reset()
817 * smc911x_phy_powerdown - powerdown phy
835 * smc911x_phy_check_media - check the media status and adjust BMCR
845 int phyaddr = lp->mii.phy_id; in smc911x_phy_check_media()
848 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_phy_check_media()
850 if (mii_check_media(&lp->mii, netif_msg_link(lp), init)) { in smc911x_phy_check_media()
854 if (lp->mii.full_duplex) { in smc911x_phy_check_media()
855 DBG(SMC_DEBUG_MISC, dev, "Configuring for full-duplex mode\n"); in smc911x_phy_check_media()
859 DBG(SMC_DEBUG_MISC, dev, "Configuring for half-duplex mode\n"); in smc911x_phy_check_media()
872 * If RPC ANEG bit is set, the media selection is dependent purely on
874 * of autonegotiation.) If the RPC ANEG bit is cleared, the selection
881 struct net_device *dev = lp->netdev; in smc911x_phy_configure()
882 int phyaddr = lp->mii.phy_id; in smc911x_phy_configure()
888 DBG(SMC_DEBUG_FUNC, dev, "--> %s()\n", __func__); in smc911x_phy_configure()
893 if (lp->phy_type == 0) in smc911x_phy_configure()
900 spin_lock_irqsave(&lp->lock, flags); in smc911x_phy_configure()
911 if (lp->mii.force_media) { in smc911x_phy_configure()
939 if (lp->ctl_rspeed != 100) in smc911x_phy_configure()
942 if (!lp->ctl_rfduplx) in smc911x_phy_configure()
945 /* Update our Auto-Neg Advertisement Register */ in smc911x_phy_configure()
947 lp->mii.advertising = my_ad_caps; in smc911x_phy_configure()
951 * auto-negotiation is restarted, sometimes it isn't ready and in smc911x_phy_configure()
960 /* Restart auto-negotiation process in order to advertise my caps */ in smc911x_phy_configure()
966 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_phy_configure()
978 int phyaddr = lp->mii.phy_id; in smc911x_phy_interrupt()
981 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_phy_interrupt()
983 if (lp->phy_type == 0) in smc911x_phy_interrupt()
995 /*--- END PHY CONTROL AND CONFIGURATION-------------------------------------*/
1009 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_interrupt()
1011 spin_lock_irqsave(&lp->lock, flags); in smc911x_interrupt()
1016 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_interrupt()
1045 dev->stats.rx_errors++; in smc911x_interrupt()
1049 dev->stats.rx_dropped+=SMC_GET_RX_DROP(lp); in smc911x_interrupt()
1051 /* Undocumented interrupt-what is the right thing to do here? */ in smc911x_interrupt()
1058 if (IS_REV_A(lp->revision)) { in smc911x_interrupt()
1064 dev->stats.rx_errors++; in smc911x_interrupt()
1065 dev->stats.rx_fifo_errors++; in smc911x_interrupt()
1070 if (!IS_REV_A(lp->revision)) { in smc911x_interrupt()
1076 dev->stats.rx_errors++; in smc911x_interrupt()
1077 dev->stats.rx_fifo_errors++; in smc911x_interrupt()
1092 if (lp->rxdma_active){ in smc911x_interrupt()
1112 lp->tx_throttle = 0; in smc911x_interrupt()
1114 if (!lp->txdma_active) in smc911x_interrupt()
1157 } while (--timeout); in smc911x_interrupt()
1163 8-timeout); in smc911x_interrupt()
1165 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_interrupt()
1175 struct net_device *dev = lp->netdev; in smc911x_tx_dma_irq()
1176 struct sk_buff *skb = lp->current_tx_skb; in smc911x_tx_dma_irq()
1179 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_tx_dma_irq()
1183 dma_unmap_single(lp->dev, tx_dmabuf, tx_dmalen, DMA_TO_DEVICE); in smc911x_tx_dma_irq()
1186 lp->current_tx_skb = NULL; in smc911x_tx_dma_irq()
1187 if (lp->pending_tx_skb != NULL) in smc911x_tx_dma_irq()
1192 spin_lock_irqsave(&lp->lock, flags); in smc911x_tx_dma_irq()
1193 lp->txdma_active = 0; in smc911x_tx_dma_irq()
1194 if (!lp->tx_throttle) { in smc911x_tx_dma_irq()
1197 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_tx_dma_irq()
1207 struct net_device *dev = lp->netdev; in smc911x_rx_dma_irq()
1208 struct sk_buff *skb = lp->current_rx_skb; in smc911x_rx_dma_irq()
1212 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_rx_dma_irq()
1214 dma_unmap_single(lp->dev, rx_dmabuf, rx_dmalen, DMA_FROM_DEVICE); in smc911x_rx_dma_irq()
1216 lp->current_rx_skb = NULL; in smc911x_rx_dma_irq()
1217 PRINT_PKT(skb->data, skb->len); in smc911x_rx_dma_irq()
1218 skb->protocol = eth_type_trans(skb, dev); in smc911x_rx_dma_irq()
1219 dev->stats.rx_packets++; in smc911x_rx_dma_irq()
1220 dev->stats.rx_bytes += skb->len; in smc911x_rx_dma_irq()
1223 spin_lock_irqsave(&lp->lock, flags); in smc911x_rx_dma_irq()
1228 lp->rxdma_active = 0; in smc911x_rx_dma_irq()
1230 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_rx_dma_irq()
1239 * Polling receive - used by netconsole and other diagnostic tools
1244 disable_irq(dev->irq); in smc911x_poll_controller()
1245 smc911x_interrupt(dev->irq, dev); in smc911x_poll_controller()
1246 enable_irq(dev->irq); in smc911x_poll_controller()
1257 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_timeout()
1259 spin_lock_irqsave(&lp->lock, flags); in smc911x_timeout()
1262 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_timeout()
1274 if (lp->phy_type != 0) in smc911x_timeout()
1275 schedule_work(&lp->phy_configure); in smc911x_timeout()
1295 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_set_multicast_list()
1297 spin_lock_irqsave(&lp->lock, flags); in smc911x_set_multicast_list()
1299 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_set_multicast_list()
1301 if (dev->flags & IFF_PROMISC) { in smc911x_set_multicast_list()
1311 else if (dev->flags & IFF_ALLMULTI || netdev_mc_count(dev) > 16) { in smc911x_set_multicast_list()
1321 * address are the offset into the table. If that bit is 1, then the in smc911x_set_multicast_list()
1324 * To use the 6 bits as an offset into the table, the high 1 bit is in smc911x_set_multicast_list()
1325 * the number of the 32 bit register, while the low 5 bits are the bit in smc911x_set_multicast_list()
1341 position = ether_crc(ETH_ALEN, ha->addr)>>26; in smc911x_set_multicast_list()
1363 spin_lock_irqsave(&lp->lock, flags); in smc911x_set_multicast_list()
1372 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_set_multicast_list()
1386 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_open()
1392 smc911x_phy_configure(&lp->phy_configure); in smc911x_open()
1413 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_close()
1421 if (lp->phy_type != 0) { in smc911x_close()
1425 cancel_work_sync(&lp->phy_configure); in smc911x_close()
1426 smc911x_phy_powerdown(dev, lp->mii.phy_id); in smc911x_close()
1429 if (lp->pending_tx_skb) { in smc911x_close()
1430 dev_kfree_skb(lp->pending_tx_skb); in smc911x_close()
1431 lp->pending_tx_skb = NULL; in smc911x_close()
1449 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_ethtool_get_link_ksettings()
1451 if (lp->phy_type != 0) { in smc911x_ethtool_get_link_ksettings()
1452 spin_lock_irqsave(&lp->lock, flags); in smc911x_ethtool_get_link_ksettings()
1453 mii_ethtool_get_link_ksettings(&lp->mii, cmd); in smc911x_ethtool_get_link_ksettings()
1454 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_ethtool_get_link_ksettings()
1460 if (lp->ctl_rspeed == 10) in smc911x_ethtool_get_link_ksettings()
1461 cmd->base.speed = SPEED_10; in smc911x_ethtool_get_link_ksettings()
1462 else if (lp->ctl_rspeed == 100) in smc911x_ethtool_get_link_ksettings()
1463 cmd->base.speed = SPEED_100; in smc911x_ethtool_get_link_ksettings()
1465 cmd->base.autoneg = AUTONEG_DISABLE; in smc911x_ethtool_get_link_ksettings()
1466 cmd->base.port = 0; in smc911x_ethtool_get_link_ksettings()
1467 SMC_GET_PHY_SPECIAL(lp, lp->mii.phy_id, status); in smc911x_ethtool_get_link_ksettings()
1468 cmd->base.duplex = in smc911x_ethtool_get_link_ksettings()
1473 cmd->link_modes.supported, supported); in smc911x_ethtool_get_link_ksettings()
1488 if (lp->phy_type != 0) { in smc911x_ethtool_set_link_ksettings()
1489 spin_lock_irqsave(&lp->lock, flags); in smc911x_ethtool_set_link_ksettings()
1490 ret = mii_ethtool_set_link_ksettings(&lp->mii, cmd); in smc911x_ethtool_set_link_ksettings()
1491 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_ethtool_set_link_ksettings()
1493 if (cmd->base.autoneg != AUTONEG_DISABLE || in smc911x_ethtool_set_link_ksettings()
1494 cmd->base.speed != SPEED_10 || in smc911x_ethtool_set_link_ksettings()
1495 (cmd->base.duplex != DUPLEX_HALF && in smc911x_ethtool_set_link_ksettings()
1496 cmd->base.duplex != DUPLEX_FULL) || in smc911x_ethtool_set_link_ksettings()
1497 (cmd->base.port != PORT_TP && in smc911x_ethtool_set_link_ksettings()
1498 cmd->base.port != PORT_AUI)) in smc911x_ethtool_set_link_ksettings()
1499 return -EINVAL; in smc911x_ethtool_set_link_ksettings()
1501 lp->ctl_rfduplx = cmd->base.duplex == DUPLEX_FULL; in smc911x_ethtool_set_link_ksettings()
1512 strlcpy(info->driver, CARDNAME, sizeof(info->driver)); in smc911x_ethtool_getdrvinfo()
1513 strlcpy(info->version, version, sizeof(info->version)); in smc911x_ethtool_getdrvinfo()
1514 strlcpy(info->bus_info, dev_name(dev->dev.parent), in smc911x_ethtool_getdrvinfo()
1515 sizeof(info->bus_info)); in smc911x_ethtool_getdrvinfo()
1521 int ret = -EINVAL; in smc911x_ethtool_nwayreset()
1524 if (lp->phy_type != 0) { in smc911x_ethtool_nwayreset()
1525 spin_lock_irqsave(&lp->lock, flags); in smc911x_ethtool_nwayreset()
1526 ret = mii_nway_restart(&lp->mii); in smc911x_ethtool_nwayreset()
1527 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_ethtool_nwayreset()
1536 return lp->msg_enable; in smc911x_ethtool_getmsglevel()
1542 lp->msg_enable = level; in smc911x_ethtool_setmsglevel()
1548 return (((E2P_CMD - ID_REV)/4 + 1) + in smc911x_ethtool_getregslen()
1549 (WUCSR - MAC_CR)+1 + 32) * sizeof(u32); in smc911x_ethtool_getregslen()
1560 regs->version = lp->version; in smc911x_ethtool_getregs()
1565 spin_lock_irqsave(&lp->lock, flags); in smc911x_ethtool_getregs()
1567 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_ethtool_getregs()
1571 spin_lock_irqsave(&lp->lock, flags); in smc911x_ethtool_getregs()
1572 SMC_GET_MII(lp, i, lp->mii.phy_id, reg); in smc911x_ethtool_getregs()
1573 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_ethtool_getregs()
1585 for(timeout=10;(e2p_cmd & E2P_CMD_EPC_BUSY_) && timeout; timeout--) { in smc911x_ethtool_wait_eeprom_ready()
1589 return -EFAULT; in smc911x_ethtool_wait_eeprom_ready()
1597 return -ETIMEDOUT; in smc911x_ethtool_wait_eeprom_ready()
1652 memcpy(data, eebuf+eeprom->offset, eeprom->len); in smc911x_ethtool_geteeprom()
1664 for(i=eeprom->offset;i<(eeprom->offset+eeprom->len);i++) { in smc911x_ethtool_seteeprom()
1700 * This routine has a simple purpose -- make the SMC chip generate an
1701 * interrupt, so an auto-detect routine can detect it, and find the IRQ,
1709 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_findirq()
1728 } while (--timeout); in smc911x_findirq()
1792 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_probe()
1800 retval = -ENODEV; in smc911x_probe()
1817 retval = -ENODEV; in smc911x_probe()
1833 retval = -EINVAL; in smc911x_probe()
1838 lp->version = chip_ids[i].id; in smc911x_probe()
1839 lp->revision = revision; in smc911x_probe()
1840 lp->tx_fifo_kb = tx_fifo_kb; in smc911x_probe()
1842 lp->tx_fifo_size=(lp->tx_fifo_kb<<10) - 512; in smc911x_probe()
1843 lp->rx_fifo_size= ((0x4000 - 512 - lp->tx_fifo_size) / 16) * 15; in smc911x_probe()
1846 switch(lp->tx_fifo_kb) { in smc911x_probe()
1853 lp->afc_cfg=0x008C46AF;break; in smc911x_probe()
1855 lp->afc_cfg=0x0082419F;break; in smc911x_probe()
1857 lp->afc_cfg=0x00783C9F;break; in smc911x_probe()
1859 lp->afc_cfg=0x006E374F;break; in smc911x_probe()
1861 lp->afc_cfg=0x0064328F;break; in smc911x_probe()
1863 lp->afc_cfg=0x005A2D7F;break; in smc911x_probe()
1865 lp->afc_cfg=0x0050287F;break; in smc911x_probe()
1867 lp->afc_cfg=0x0046236F;break; in smc911x_probe()
1869 lp->afc_cfg=0x003C1E6F;break; in smc911x_probe()
1871 lp->afc_cfg=0x0032195F;break; in smc911x_probe()
1878 lp->afc_cfg=0x0024124F;break; in smc911x_probe()
1880 lp->afc_cfg=0x0015073F;break; in smc911x_probe()
1882 lp->afc_cfg=0x0006032F;break; in smc911x_probe()
1884 PRINTK(dev, "ERROR -- no AFC_CFG setting found"); in smc911x_probe()
1890 lp->tx_fifo_size, lp->rx_fifo_size, lp->afc_cfg); in smc911x_probe()
1892 spin_lock_init(&lp->lock); in smc911x_probe()
1895 SMC_GET_MAC_ADDR(lp, dev->dev_addr); in smc911x_probe()
1901 * If dev->irq is 0, then the device has to be banged on to see in smc911x_probe()
1907 if (dev->irq < 1) { in smc911x_probe()
1911 while (trials--) { in smc911x_probe()
1912 dev->irq = smc911x_findirq(dev); in smc911x_probe()
1913 if (dev->irq) in smc911x_probe()
1919 if (dev->irq == 0) { in smc911x_probe()
1921 retval = -ENODEV; in smc911x_probe()
1924 dev->irq = irq_canonicalize(dev->irq); in smc911x_probe()
1926 dev->netdev_ops = &smc911x_netdev_ops; in smc911x_probe()
1927 dev->watchdog_timeo = msecs_to_jiffies(watchdog); in smc911x_probe()
1928 dev->ethtool_ops = &smc911x_ethtool_ops; in smc911x_probe()
1930 INIT_WORK(&lp->phy_configure, smc911x_phy_configure); in smc911x_probe()
1931 lp->mii.phy_id_mask = 0x1f; in smc911x_probe()
1932 lp->mii.reg_num_mask = 0x1f; in smc911x_probe()
1933 lp->mii.force_media = 0; in smc911x_probe()
1934 lp->mii.full_duplex = 0; in smc911x_probe()
1935 lp->mii.dev = dev; in smc911x_probe()
1936 lp->mii.mdio_read = smc911x_phy_read; in smc911x_probe()
1937 lp->mii.mdio_write = smc911x_phy_write; in smc911x_probe()
1945 lp->msg_enable = NETIF_MSG_LINK; in smc911x_probe()
1946 lp->ctl_rfduplx = 1; in smc911x_probe()
1947 lp->ctl_rspeed = 100; in smc911x_probe()
1950 irq_flags = lp->cfg.irq_flags; in smc911x_probe()
1956 retval = request_irq(dev->irq, smc911x_interrupt, in smc911x_probe()
1957 irq_flags, dev->name, dev); in smc911x_probe()
1965 lp->rxdma = dma_request_channel(mask, NULL, NULL); in smc911x_probe()
1966 lp->txdma = dma_request_channel(mask, NULL, NULL); in smc911x_probe()
1967 lp->rxdma_active = 0; in smc911x_probe()
1968 lp->txdma_active = 0; in smc911x_probe()
1973 config.src_addr = lp->physaddr + RX_DATA_FIFO; in smc911x_probe()
1974 config.dst_addr = lp->physaddr + TX_DATA_FIFO; in smc911x_probe()
1977 retval = dmaengine_slave_config(lp->rxdma, &config); in smc911x_probe()
1979 dev_err(lp->dev, "dma rx channel configuration failed: %d\n", in smc911x_probe()
1983 retval = dmaengine_slave_config(lp->txdma, &config); in smc911x_probe()
1985 dev_err(lp->dev, "dma tx channel configuration failed: %d\n", in smc911x_probe()
1995 version_string, lp->revision, in smc911x_probe()
1996 dev->base_addr, dev->irq); in smc911x_probe()
1999 if (lp->rxdma) in smc911x_probe()
2000 pr_cont(" RXDMA %p", lp->rxdma); in smc911x_probe()
2002 if (lp->txdma) in smc911x_probe()
2003 pr_cont(" TXDMA %p", lp->txdma); in smc911x_probe()
2006 if (!is_valid_ether_addr(dev->dev_addr)) { in smc911x_probe()
2011 dev->dev_addr); in smc911x_probe()
2014 if (lp->phy_type == 0) { in smc911x_probe()
2016 } else if ((lp->phy_type & ~0xff) == LAN911X_INTERNAL_PHY_ID) { in smc911x_probe()
2019 PRINTK(dev, "External PHY 0x%08x\n", lp->phy_type); in smc911x_probe()
2026 if (lp->rxdma) in smc911x_probe()
2027 dma_release_channel(lp->rxdma); in smc911x_probe()
2028 if (lp->txdma) in smc911x_probe()
2029 dma_release_channel(lp->txdma); in smc911x_probe()
2039 * 0 --> there is a device
2052 ret = -ENODEV; in smc911x_drv_probe()
2059 if (!request_mem_region(res->start, SMC911X_IO_EXTENT, CARDNAME)) { in smc911x_drv_probe()
2060 ret = -EBUSY; in smc911x_drv_probe()
2066 ret = -ENOMEM; in smc911x_drv_probe()
2069 SET_NETDEV_DEV(ndev, &pdev->dev); in smc911x_drv_probe()
2071 ndev->dma = (unsigned char)-1; in smc911x_drv_probe()
2072 ndev->irq = platform_get_irq(pdev, 0); in smc911x_drv_probe()
2074 lp->netdev = ndev; in smc911x_drv_probe()
2077 struct smc911x_platdata *pd = dev_get_platdata(&pdev->dev); in smc911x_drv_probe()
2079 ret = -EINVAL; in smc911x_drv_probe()
2082 memcpy(&lp->cfg, pd, sizeof(lp->cfg)); in smc911x_drv_probe()
2086 addr = ioremap(res->start, SMC911X_IO_EXTENT); in smc911x_drv_probe()
2088 ret = -ENOMEM; in smc911x_drv_probe()
2093 lp->base = addr; in smc911x_drv_probe()
2094 ndev->base_addr = res->start; in smc911x_drv_probe()
2101 release_mem_region(res->start, SMC911X_IO_EXTENT); in smc911x_drv_probe()
2107 lp->physaddr = res->start; in smc911x_drv_probe()
2108 lp->dev = &pdev->dev; in smc911x_drv_probe()
2121 DBG(SMC_DEBUG_FUNC, ndev, "--> %s\n", __func__); in smc911x_drv_remove()
2125 free_irq(ndev->irq, ndev); in smc911x_drv_remove()
2129 if (lp->rxdma) in smc911x_drv_remove()
2130 dma_release_channel(lp->rxdma); in smc911x_drv_remove()
2131 if (lp->txdma) in smc911x_drv_remove()
2132 dma_release_channel(lp->txdma); in smc911x_drv_remove()
2135 iounmap(lp->base); in smc911x_drv_remove()
2137 release_mem_region(res->start, SMC911X_IO_EXTENT); in smc911x_drv_remove()
2148 DBG(SMC_DEBUG_FUNC, ndev, "--> %s\n", __func__); in smc911x_drv_suspend()
2154 /* Set D2 - Energy detect only setting */ in smc911x_drv_suspend()
2166 DBG(SMC_DEBUG_FUNC, ndev, "--> %s\n", __func__); in smc911x_drv_resume()
2172 if (lp->phy_type != 0) in smc911x_drv_resume()
2173 smc911x_phy_configure(&lp->phy_configure); in smc911x_drv_resume()