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
169 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_reset()
179 } while (--timeout && !reg); in smc911x_reset()
187 spin_lock_irqsave(&lp->lock, flags); in smc911x_reset()
189 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_reset()
191 while (resets--) { in smc911x_reset()
203 } while (--timeout && (reg & HW_CFG_SRST_)); in smc911x_reset()
212 while (--timeout && (SMC_GET_E2P_CMD(lp) & E2P_CMD_EPC_BUSY_)) in smc911x_reset()
222 SMC_ACK_INT(lp, -1); in smc911x_reset()
225 SMC_SET_HW_CFG(lp, (lp->tx_fifo_kb & 0xF) << 16); in smc911x_reset()
228 SMC_SET_AFC_CFG(lp, lp->afc_cfg); in smc911x_reset()
236 * and drive IRQ pin push-pull in smc911x_reset()
240 if (lp->cfg.irq_polarity) in smc911x_reset()
246 if (lp->pending_tx_skb != NULL) { in smc911x_reset()
247 dev_kfree_skb (lp->pending_tx_skb); in smc911x_reset()
248 lp->pending_tx_skb = NULL; in smc911x_reset()
249 dev->stats.tx_errors++; in smc911x_reset()
250 dev->stats.tx_aborted_errors++; in smc911x_reset()
263 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_enable()
265 spin_lock_irqsave(&lp->lock, flags); in smc911x_enable()
267 SMC_SET_MAC_ADDR(lp, dev->dev_addr); in smc911x_enable()
301 if (IS_REV_A(lp->revision)) in smc911x_enable()
308 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_enable()
320 DBG(SMC_DEBUG_FUNC, dev, "%s: --> %s\n", CARDNAME, __func__); in smc911x_shutdown()
326 spin_lock_irqsave(&lp->lock, flags); in smc911x_shutdown()
331 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_shutdown()
339 DBG(SMC_DEBUG_FUNC | SMC_DEBUG_RX, dev, "%s: --> %s\n", in smc911x_drop_pkt()
344 while (fifo_count--) in smc911x_drop_pkt()
353 } while (--timeout && reg); in smc911x_drop_pkt()
373 DBG(SMC_DEBUG_FUNC | SMC_DEBUG_RX, dev, "--> %s\n", in smc911x_rcv()
381 dev->stats.rx_errors++; in smc911x_rcv()
383 dev->stats.rx_crc_errors++; in smc911x_rcv()
386 dev->stats.rx_length_errors++; in smc911x_rcv()
388 dev->stats.multicast++; in smc911x_rcv()
398 dev->stats.rx_dropped++; in smc911x_rcv()
406 data = skb->data; in smc911x_rcv()
408 skb_put(skb,pkt_len-4); in smc911x_rcv()
414 if (fifo & 0xFF) fifo--; in smc911x_rcv()
420 lp->rxdma_active = 1; in smc911x_rcv()
421 lp->current_rx_skb = skb; in smc911x_rcv()
430 PRINT_PKT(data, ((pkt_len - 4) <= 64) ? pkt_len - 4 : 64); in smc911x_rcv()
431 skb->protocol = eth_type_trans(skb, dev); in smc911x_rcv()
433 dev->stats.rx_packets++; in smc911x_rcv()
434 dev->stats.rx_bytes += pkt_len-4; in smc911x_rcv()
449 DBG(SMC_DEBUG_FUNC | SMC_DEBUG_TX, dev, "--> %s\n", __func__); in smc911x_hardware_send_pkt()
450 BUG_ON(lp->pending_tx_skb == NULL); in smc911x_hardware_send_pkt()
452 skb = lp->pending_tx_skb; in smc911x_hardware_send_pkt()
453 lp->pending_tx_skb = NULL; in smc911x_hardware_send_pkt()
459 buf = (char*)((u32)(skb->data) & ~0xF); in smc911x_hardware_send_pkt()
460 len = (skb->len + 0xF + ((u32)skb->data & 0xF)) & ~0xF; in smc911x_hardware_send_pkt()
461 cmdA = (1<<24) | (((u32)skb->data & 0xF)<<16) | in smc911x_hardware_send_pkt()
463 skb->len; in smc911x_hardware_send_pkt()
465 buf = (char*)((u32)skb->data & ~0x3); in smc911x_hardware_send_pkt()
466 len = (skb->len + 3 + ((u32)skb->data & 3)) & ~0x3; in smc911x_hardware_send_pkt()
467 cmdA = (((u32)skb->data & 0x3) << 16) | in smc911x_hardware_send_pkt()
469 skb->len; in smc911x_hardware_send_pkt()
472 cmdB = (skb->len << 16) | (skb->len & 0x7FF); in smc911x_hardware_send_pkt()
484 lp->current_tx_skb = skb; in smc911x_hardware_send_pkt()
492 if (!lp->tx_throttle) { in smc911x_hardware_send_pkt()
511 DBG(SMC_DEBUG_FUNC | SMC_DEBUG_TX, dev, "--> %s\n", in smc911x_hard_start_xmit()
514 spin_lock_irqsave(&lp->lock, flags); in smc911x_hard_start_xmit()
516 BUG_ON(lp->pending_tx_skb != NULL); in smc911x_hard_start_xmit()
527 lp->tx_throttle = 1; in smc911x_hard_start_xmit()
538 if (unlikely(free < (skb->len + 8 + 15 + 15))) { in smc911x_hard_start_xmit()
540 free, skb->len); in smc911x_hard_start_xmit()
541 lp->pending_tx_skb = NULL; in smc911x_hard_start_xmit()
542 dev->stats.tx_errors++; in smc911x_hard_start_xmit()
543 dev->stats.tx_dropped++; in smc911x_hard_start_xmit()
544 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_hard_start_xmit()
554 if (lp->txdma_active) { in smc911x_hard_start_xmit()
556 lp->pending_tx_skb = skb; in smc911x_hard_start_xmit()
558 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_hard_start_xmit()
562 lp->txdma_active = 1; in smc911x_hard_start_xmit()
566 lp->pending_tx_skb = skb; in smc911x_hard_start_xmit()
568 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_hard_start_xmit()
575 * - a TX error occurred, or
576 * - TX of a packet completed.
583 DBG(SMC_DEBUG_FUNC | SMC_DEBUG_TX, dev, "--> %s\n", in smc911x_tx()
591 dev->stats.tx_packets++; in smc911x_tx()
592 dev->stats.tx_bytes+=tx_status>>16; in smc911x_tx()
597 * full-duplex mode */ in smc911x_tx()
598 if ((tx_status & TX_STS_ES_) && !(lp->ctl_rfduplx && in smc911x_tx()
600 dev->stats.tx_errors++; in smc911x_tx()
603 dev->stats.collisions+=16; in smc911x_tx()
604 dev->stats.tx_aborted_errors++; in smc911x_tx()
606 dev->stats.collisions+=(tx_status & TX_STS_COLL_CNT_) >> 3; in smc911x_tx()
608 /* carrier error only has meaning for half-duplex communication */ in smc911x_tx()
610 !lp->ctl_rfduplx) { in smc911x_tx()
611 dev->stats.tx_carrier_errors++; in smc911x_tx()
614 dev->stats.collisions++; in smc911x_tx()
615 dev->stats.tx_aborted_errors++; in smc911x_tx()
621 /*---PHY CONTROL AND CONFIGURATION-----------------------------------------*/
663 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_phy_detect()
665 lp->phy_type = 0; in smc911x_phy_detect()
671 switch(lp->version) { in smc911x_phy_detect()
706 lp->mii.phy_id = phyaddr & 31; in smc911x_phy_detect()
707 lp->phy_type = id1 << 16 | id2; in smc911x_phy_detect()
721 lp->mii.phy_id = 1; in smc911x_phy_detect()
722 lp->phy_type = id1 << 16 | id2; in smc911x_phy_detect()
726 id1, id2, lp->mii.phy_id); in smc911x_phy_detect()
736 int phyaddr = lp->mii.phy_id; in smc911x_phy_fixed()
739 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_phy_fixed()
748 * Disable auto-negotiation in smc911x_phy_fixed()
751 if (lp->ctl_rfduplx) in smc911x_phy_fixed()
754 if (lp->ctl_rspeed == 100) in smc911x_phy_fixed()
760 /* Re-Configure the Receive/Phy Control register */ in smc911x_phy_fixed()
768 * smc911x_phy_reset - reset the phy
786 DBG(SMC_DEBUG_FUNC, dev, "--> %s()\n", __func__); in smc911x_phy_reset()
788 spin_lock_irqsave(&lp->lock, flags); in smc911x_phy_reset()
793 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_phy_reset()
794 for (timeout = 2; timeout; timeout--) { in smc911x_phy_reset()
796 spin_lock_irqsave(&lp->lock, flags); in smc911x_phy_reset()
798 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_phy_reset()
814 * smc911x_phy_powerdown - powerdown phy
832 * smc911x_phy_check_media - check the media status and adjust BMCR
842 int phyaddr = lp->mii.phy_id; in smc911x_phy_check_media()
845 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_phy_check_media()
847 if (mii_check_media(&lp->mii, netif_msg_link(lp), init)) { in smc911x_phy_check_media()
851 if (lp->mii.full_duplex) { in smc911x_phy_check_media()
852 DBG(SMC_DEBUG_MISC, dev, "Configuring for full-duplex mode\n"); in smc911x_phy_check_media()
856 DBG(SMC_DEBUG_MISC, dev, "Configuring for half-duplex mode\n"); in smc911x_phy_check_media()
869 * If RPC ANEG bit is set, the media selection is dependent purely on
871 * of autonegotiation.) If the RPC ANEG bit is cleared, the selection
878 struct net_device *dev = lp->netdev; in smc911x_phy_configure()
879 int phyaddr = lp->mii.phy_id; in smc911x_phy_configure()
885 DBG(SMC_DEBUG_FUNC, dev, "--> %s()\n", __func__); in smc911x_phy_configure()
890 if (lp->phy_type == 0) in smc911x_phy_configure()
897 spin_lock_irqsave(&lp->lock, flags); in smc911x_phy_configure()
908 if (lp->mii.force_media) { in smc911x_phy_configure()
936 if (lp->ctl_rspeed != 100) in smc911x_phy_configure()
939 if (!lp->ctl_rfduplx) in smc911x_phy_configure()
942 /* Update our Auto-Neg Advertisement Register */ in smc911x_phy_configure()
944 lp->mii.advertising = my_ad_caps; in smc911x_phy_configure()
948 * auto-negotiation is restarted, sometimes it isn't ready and in smc911x_phy_configure()
957 /* Restart auto-negotiation process in order to advertise my caps */ in smc911x_phy_configure()
963 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_phy_configure()
975 int phyaddr = lp->mii.phy_id; in smc911x_phy_interrupt()
978 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_phy_interrupt()
980 if (lp->phy_type == 0) in smc911x_phy_interrupt()
992 /*--- END PHY CONTROL AND CONFIGURATION-------------------------------------*/
1006 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_interrupt()
1008 spin_lock_irqsave(&lp->lock, flags); in smc911x_interrupt()
1013 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_interrupt()
1042 dev->stats.rx_errors++; in smc911x_interrupt()
1046 dev->stats.rx_dropped+=SMC_GET_RX_DROP(lp); in smc911x_interrupt()
1048 /* Undocumented interrupt-what is the right thing to do here? */ in smc911x_interrupt()
1055 if (IS_REV_A(lp->revision)) { in smc911x_interrupt()
1061 dev->stats.rx_errors++; in smc911x_interrupt()
1062 dev->stats.rx_fifo_errors++; in smc911x_interrupt()
1067 if (!IS_REV_A(lp->revision)) { in smc911x_interrupt()
1073 dev->stats.rx_errors++; in smc911x_interrupt()
1074 dev->stats.rx_fifo_errors++; in smc911x_interrupt()
1089 if (lp->rxdma_active){ in smc911x_interrupt()
1109 lp->tx_throttle = 0; in smc911x_interrupt()
1111 if (!lp->txdma_active) in smc911x_interrupt()
1154 } while (--timeout); in smc911x_interrupt()
1160 8-timeout); in smc911x_interrupt()
1162 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_interrupt()
1172 struct net_device *dev = lp->netdev; in smc911x_tx_dma_irq()
1173 struct sk_buff *skb = lp->current_tx_skb; in smc911x_tx_dma_irq()
1176 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_tx_dma_irq()
1180 dma_unmap_single(lp->dev, tx_dmabuf, tx_dmalen, DMA_TO_DEVICE); in smc911x_tx_dma_irq()
1183 lp->current_tx_skb = NULL; in smc911x_tx_dma_irq()
1184 if (lp->pending_tx_skb != NULL) in smc911x_tx_dma_irq()
1189 spin_lock_irqsave(&lp->lock, flags); in smc911x_tx_dma_irq()
1190 lp->txdma_active = 0; in smc911x_tx_dma_irq()
1191 if (!lp->tx_throttle) { in smc911x_tx_dma_irq()
1194 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_tx_dma_irq()
1204 struct net_device *dev = lp->netdev; in smc911x_rx_dma_irq()
1205 struct sk_buff *skb = lp->current_rx_skb; in smc911x_rx_dma_irq()
1209 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_rx_dma_irq()
1211 dma_unmap_single(lp->dev, rx_dmabuf, rx_dmalen, DMA_FROM_DEVICE); in smc911x_rx_dma_irq()
1213 lp->current_rx_skb = NULL; in smc911x_rx_dma_irq()
1214 PRINT_PKT(skb->data, skb->len); in smc911x_rx_dma_irq()
1215 skb->protocol = eth_type_trans(skb, dev); in smc911x_rx_dma_irq()
1216 dev->stats.rx_packets++; in smc911x_rx_dma_irq()
1217 dev->stats.rx_bytes += skb->len; in smc911x_rx_dma_irq()
1220 spin_lock_irqsave(&lp->lock, flags); in smc911x_rx_dma_irq()
1225 lp->rxdma_active = 0; in smc911x_rx_dma_irq()
1227 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_rx_dma_irq()
1236 * Polling receive - used by netconsole and other diagnostic tools
1241 disable_irq(dev->irq); in smc911x_poll_controller()
1242 smc911x_interrupt(dev->irq, dev); in smc911x_poll_controller()
1243 enable_irq(dev->irq); in smc911x_poll_controller()
1254 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_timeout()
1256 spin_lock_irqsave(&lp->lock, flags); in smc911x_timeout()
1259 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_timeout()
1271 if (lp->phy_type != 0) in smc911x_timeout()
1272 schedule_work(&lp->phy_configure); in smc911x_timeout()
1292 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_set_multicast_list()
1294 spin_lock_irqsave(&lp->lock, flags); in smc911x_set_multicast_list()
1296 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_set_multicast_list()
1298 if (dev->flags & IFF_PROMISC) { in smc911x_set_multicast_list()
1308 else if (dev->flags & IFF_ALLMULTI || netdev_mc_count(dev) > 16) { in smc911x_set_multicast_list()
1318 * address are the offset into the table. If that bit is 1, then the in smc911x_set_multicast_list()
1321 * To use the 6 bits as an offset into the table, the high 1 bit is in smc911x_set_multicast_list()
1322 * the number of the 32 bit register, while the low 5 bits are the bit in smc911x_set_multicast_list()
1338 position = ether_crc(ETH_ALEN, ha->addr)>>26; in smc911x_set_multicast_list()
1360 spin_lock_irqsave(&lp->lock, flags); in smc911x_set_multicast_list()
1369 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_set_multicast_list()
1383 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_open()
1389 smc911x_phy_configure(&lp->phy_configure); in smc911x_open()
1410 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_close()
1418 if (lp->phy_type != 0) { in smc911x_close()
1422 cancel_work_sync(&lp->phy_configure); in smc911x_close()
1423 smc911x_phy_powerdown(dev, lp->mii.phy_id); in smc911x_close()
1426 if (lp->pending_tx_skb) { in smc911x_close()
1427 dev_kfree_skb(lp->pending_tx_skb); in smc911x_close()
1428 lp->pending_tx_skb = NULL; in smc911x_close()
1446 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_ethtool_get_link_ksettings()
1448 if (lp->phy_type != 0) { in smc911x_ethtool_get_link_ksettings()
1449 spin_lock_irqsave(&lp->lock, flags); in smc911x_ethtool_get_link_ksettings()
1450 mii_ethtool_get_link_ksettings(&lp->mii, cmd); in smc911x_ethtool_get_link_ksettings()
1451 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_ethtool_get_link_ksettings()
1457 if (lp->ctl_rspeed == 10) in smc911x_ethtool_get_link_ksettings()
1458 cmd->base.speed = SPEED_10; in smc911x_ethtool_get_link_ksettings()
1459 else if (lp->ctl_rspeed == 100) in smc911x_ethtool_get_link_ksettings()
1460 cmd->base.speed = SPEED_100; in smc911x_ethtool_get_link_ksettings()
1462 cmd->base.autoneg = AUTONEG_DISABLE; in smc911x_ethtool_get_link_ksettings()
1463 cmd->base.port = 0; in smc911x_ethtool_get_link_ksettings()
1464 SMC_GET_PHY_SPECIAL(lp, lp->mii.phy_id, status); in smc911x_ethtool_get_link_ksettings()
1465 cmd->base.duplex = in smc911x_ethtool_get_link_ksettings()
1470 cmd->link_modes.supported, supported); in smc911x_ethtool_get_link_ksettings()
1485 if (lp->phy_type != 0) { in smc911x_ethtool_set_link_ksettings()
1486 spin_lock_irqsave(&lp->lock, flags); in smc911x_ethtool_set_link_ksettings()
1487 ret = mii_ethtool_set_link_ksettings(&lp->mii, cmd); in smc911x_ethtool_set_link_ksettings()
1488 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_ethtool_set_link_ksettings()
1490 if (cmd->base.autoneg != AUTONEG_DISABLE || in smc911x_ethtool_set_link_ksettings()
1491 cmd->base.speed != SPEED_10 || in smc911x_ethtool_set_link_ksettings()
1492 (cmd->base.duplex != DUPLEX_HALF && in smc911x_ethtool_set_link_ksettings()
1493 cmd->base.duplex != DUPLEX_FULL) || in smc911x_ethtool_set_link_ksettings()
1494 (cmd->base.port != PORT_TP && in smc911x_ethtool_set_link_ksettings()
1495 cmd->base.port != PORT_AUI)) in smc911x_ethtool_set_link_ksettings()
1496 return -EINVAL; in smc911x_ethtool_set_link_ksettings()
1498 lp->ctl_rfduplx = cmd->base.duplex == DUPLEX_FULL; in smc911x_ethtool_set_link_ksettings()
1509 strlcpy(info->driver, CARDNAME, sizeof(info->driver)); in smc911x_ethtool_getdrvinfo()
1510 strlcpy(info->version, version, sizeof(info->version)); in smc911x_ethtool_getdrvinfo()
1511 strlcpy(info->bus_info, dev_name(dev->dev.parent), in smc911x_ethtool_getdrvinfo()
1512 sizeof(info->bus_info)); in smc911x_ethtool_getdrvinfo()
1518 int ret = -EINVAL; in smc911x_ethtool_nwayreset()
1521 if (lp->phy_type != 0) { in smc911x_ethtool_nwayreset()
1522 spin_lock_irqsave(&lp->lock, flags); in smc911x_ethtool_nwayreset()
1523 ret = mii_nway_restart(&lp->mii); in smc911x_ethtool_nwayreset()
1524 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_ethtool_nwayreset()
1533 return lp->msg_enable; in smc911x_ethtool_getmsglevel()
1539 lp->msg_enable = level; in smc911x_ethtool_setmsglevel()
1545 return (((E2P_CMD - ID_REV)/4 + 1) + in smc911x_ethtool_getregslen()
1546 (WUCSR - MAC_CR)+1 + 32) * sizeof(u32); in smc911x_ethtool_getregslen()
1557 regs->version = lp->version; in smc911x_ethtool_getregs()
1562 spin_lock_irqsave(&lp->lock, flags); in smc911x_ethtool_getregs()
1564 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_ethtool_getregs()
1568 spin_lock_irqsave(&lp->lock, flags); in smc911x_ethtool_getregs()
1569 SMC_GET_MII(lp, i, lp->mii.phy_id, reg); in smc911x_ethtool_getregs()
1570 spin_unlock_irqrestore(&lp->lock, flags); in smc911x_ethtool_getregs()
1582 for(timeout=10;(e2p_cmd & E2P_CMD_EPC_BUSY_) && timeout; timeout--) { in smc911x_ethtool_wait_eeprom_ready()
1586 return -EFAULT; in smc911x_ethtool_wait_eeprom_ready()
1594 return -ETIMEDOUT; in smc911x_ethtool_wait_eeprom_ready()
1649 memcpy(data, eebuf+eeprom->offset, eeprom->len); in smc911x_ethtool_geteeprom()
1661 for(i=eeprom->offset;i<(eeprom->offset+eeprom->len);i++) { in smc911x_ethtool_seteeprom()
1697 * This routine has a simple purpose -- make the SMC chip generate an
1698 * interrupt, so an auto-detect routine can detect it, and find the IRQ,
1706 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_findirq()
1725 } while (--timeout); in smc911x_findirq()
1789 DBG(SMC_DEBUG_FUNC, dev, "--> %s\n", __func__); in smc911x_probe()
1797 retval = -ENODEV; in smc911x_probe()
1814 retval = -ENODEV; in smc911x_probe()
1830 retval = -EINVAL; in smc911x_probe()
1835 lp->version = chip_ids[i].id; in smc911x_probe()
1836 lp->revision = revision; in smc911x_probe()
1837 lp->tx_fifo_kb = tx_fifo_kb; in smc911x_probe()
1839 lp->tx_fifo_size=(lp->tx_fifo_kb<<10) - 512; in smc911x_probe()
1840 lp->rx_fifo_size= ((0x4000 - 512 - lp->tx_fifo_size) / 16) * 15; in smc911x_probe()
1843 switch(lp->tx_fifo_kb) { in smc911x_probe()
1850 lp->afc_cfg=0x008C46AF;break; in smc911x_probe()
1852 lp->afc_cfg=0x0082419F;break; in smc911x_probe()
1854 lp->afc_cfg=0x00783C9F;break; in smc911x_probe()
1856 lp->afc_cfg=0x006E374F;break; in smc911x_probe()
1858 lp->afc_cfg=0x0064328F;break; in smc911x_probe()
1860 lp->afc_cfg=0x005A2D7F;break; in smc911x_probe()
1862 lp->afc_cfg=0x0050287F;break; in smc911x_probe()
1864 lp->afc_cfg=0x0046236F;break; in smc911x_probe()
1866 lp->afc_cfg=0x003C1E6F;break; in smc911x_probe()
1868 lp->afc_cfg=0x0032195F;break; in smc911x_probe()
1875 lp->afc_cfg=0x0024124F;break; in smc911x_probe()
1877 lp->afc_cfg=0x0015073F;break; in smc911x_probe()
1879 lp->afc_cfg=0x0006032F;break; in smc911x_probe()
1881 PRINTK(dev, "ERROR -- no AFC_CFG setting found"); in smc911x_probe()
1887 lp->tx_fifo_size, lp->rx_fifo_size, lp->afc_cfg); in smc911x_probe()
1889 spin_lock_init(&lp->lock); in smc911x_probe()
1892 SMC_GET_MAC_ADDR(lp, dev->dev_addr); in smc911x_probe()
1898 * If dev->irq is 0, then the device has to be banged on to see in smc911x_probe()
1904 if (dev->irq < 1) { in smc911x_probe()
1908 while (trials--) { in smc911x_probe()
1909 dev->irq = smc911x_findirq(dev); in smc911x_probe()
1910 if (dev->irq) in smc911x_probe()
1916 if (dev->irq == 0) { in smc911x_probe()
1918 retval = -ENODEV; in smc911x_probe()
1921 dev->irq = irq_canonicalize(dev->irq); in smc911x_probe()
1923 dev->netdev_ops = &smc911x_netdev_ops; in smc911x_probe()
1924 dev->watchdog_timeo = msecs_to_jiffies(watchdog); in smc911x_probe()
1925 dev->ethtool_ops = &smc911x_ethtool_ops; in smc911x_probe()
1927 INIT_WORK(&lp->phy_configure, smc911x_phy_configure); in smc911x_probe()
1928 lp->mii.phy_id_mask = 0x1f; in smc911x_probe()
1929 lp->mii.reg_num_mask = 0x1f; in smc911x_probe()
1930 lp->mii.force_media = 0; in smc911x_probe()
1931 lp->mii.full_duplex = 0; in smc911x_probe()
1932 lp->mii.dev = dev; in smc911x_probe()
1933 lp->mii.mdio_read = smc911x_phy_read; in smc911x_probe()
1934 lp->mii.mdio_write = smc911x_phy_write; in smc911x_probe()
1942 lp->msg_enable = NETIF_MSG_LINK; in smc911x_probe()
1943 lp->ctl_rfduplx = 1; in smc911x_probe()
1944 lp->ctl_rspeed = 100; in smc911x_probe()
1947 irq_flags = lp->cfg.irq_flags; in smc911x_probe()
1953 retval = request_irq(dev->irq, smc911x_interrupt, in smc911x_probe()
1954 irq_flags, dev->name, dev); in smc911x_probe()
1962 lp->rxdma = dma_request_channel(mask, NULL, NULL); in smc911x_probe()
1963 lp->txdma = dma_request_channel(mask, NULL, NULL); in smc911x_probe()
1964 lp->rxdma_active = 0; in smc911x_probe()
1965 lp->txdma_active = 0; in smc911x_probe()
1970 config.src_addr = lp->physaddr + RX_DATA_FIFO; in smc911x_probe()
1971 config.dst_addr = lp->physaddr + TX_DATA_FIFO; in smc911x_probe()
1974 retval = dmaengine_slave_config(lp->rxdma, &config); in smc911x_probe()
1976 dev_err(lp->dev, "dma rx channel configuration failed: %d\n", in smc911x_probe()
1980 retval = dmaengine_slave_config(lp->txdma, &config); in smc911x_probe()
1982 dev_err(lp->dev, "dma tx channel configuration failed: %d\n", in smc911x_probe()
1992 version_string, lp->revision, in smc911x_probe()
1993 dev->base_addr, dev->irq); in smc911x_probe()
1996 if (lp->rxdma) in smc911x_probe()
1997 pr_cont(" RXDMA %p", lp->rxdma); in smc911x_probe()
1999 if (lp->txdma) in smc911x_probe()
2000 pr_cont(" TXDMA %p", lp->txdma); in smc911x_probe()
2003 if (!is_valid_ether_addr(dev->dev_addr)) { in smc911x_probe()
2008 dev->dev_addr); in smc911x_probe()
2011 if (lp->phy_type == 0) { in smc911x_probe()
2013 } else if ((lp->phy_type & ~0xff) == LAN911X_INTERNAL_PHY_ID) { in smc911x_probe()
2016 PRINTK(dev, "External PHY 0x%08x\n", lp->phy_type); in smc911x_probe()
2023 if (lp->rxdma) in smc911x_probe()
2024 dma_release_channel(lp->rxdma); in smc911x_probe()
2025 if (lp->txdma) in smc911x_probe()
2026 dma_release_channel(lp->txdma); in smc911x_probe()
2036 * 0 --> there is a device
2048 DBG(SMC_DEBUG_FUNC, "--> %s\n", __func__); in smc911x_drv_probe()
2051 ret = -ENODEV; in smc911x_drv_probe()
2058 if (!request_mem_region(res->start, SMC911X_IO_EXTENT, CARDNAME)) { in smc911x_drv_probe()
2059 ret = -EBUSY; in smc911x_drv_probe()
2065 ret = -ENOMEM; in smc911x_drv_probe()
2068 SET_NETDEV_DEV(ndev, &pdev->dev); in smc911x_drv_probe()
2070 ndev->dma = (unsigned char)-1; in smc911x_drv_probe()
2071 ndev->irq = platform_get_irq(pdev, 0); in smc911x_drv_probe()
2073 lp->netdev = ndev; in smc911x_drv_probe()
2076 struct smc911x_platdata *pd = dev_get_platdata(&pdev->dev); in smc911x_drv_probe()
2078 ret = -EINVAL; in smc911x_drv_probe()
2081 memcpy(&lp->cfg, pd, sizeof(lp->cfg)); in smc911x_drv_probe()
2085 addr = ioremap(res->start, SMC911X_IO_EXTENT); in smc911x_drv_probe()
2087 ret = -ENOMEM; in smc911x_drv_probe()
2092 lp->base = addr; in smc911x_drv_probe()
2093 ndev->base_addr = res->start; in smc911x_drv_probe()
2100 release_mem_region(res->start, SMC911X_IO_EXTENT); in smc911x_drv_probe()
2106 lp->physaddr = res->start; in smc911x_drv_probe()
2107 lp->dev = &pdev->dev; in smc911x_drv_probe()
2120 DBG(SMC_DEBUG_FUNC, ndev, "--> %s\n", __func__); in smc911x_drv_remove()
2124 free_irq(ndev->irq, ndev); in smc911x_drv_remove()
2128 if (lp->rxdma) in smc911x_drv_remove()
2129 dma_release_channel(lp->rxdma); in smc911x_drv_remove()
2130 if (lp->txdma) in smc911x_drv_remove()
2131 dma_release_channel(lp->txdma); in smc911x_drv_remove()
2134 iounmap(lp->base); in smc911x_drv_remove()
2136 release_mem_region(res->start, SMC911X_IO_EXTENT); in smc911x_drv_remove()
2147 DBG(SMC_DEBUG_FUNC, ndev, "--> %s\n", __func__); in smc911x_drv_suspend()
2153 /* Set D2 - Energy detect only setting */ in smc911x_drv_suspend()
2165 DBG(SMC_DEBUG_FUNC, ndev, "--> %s\n", __func__); in smc911x_drv_resume()
2171 if (lp->phy_type != 0) in smc911x_drv_resume()
2172 smc911x_phy_configure(&lp->phy_configure); in smc911x_drv_resume()