Lines Matching +full:bit +full:- +full:banged

1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * This is a driver for SMSC's 91C9x/91C1xx single-chip Ethernet devices.
37 * 29/09/03 Russell King - add driver model support
38 * - ethtool support
39 * - convert to use generic MII interface
40 * - add link up/down notification
41 * - don't try to handle full negotiation in
43 * - clean up (and fix stack overrun) in PHY
112 * Use power-down feature of the chip
197 spin_lock_irqsave(&lp->lock, smc_enable_flags); \
201 spin_unlock_irqrestore(&lp->lock, smc_enable_flags); \
208 spin_lock_irqsave(&lp->lock, smc_disable_flags); \
212 spin_unlock_irqrestore(&lp->lock, smc_disable_flags); \
241 void __iomem *ioaddr = lp->base; in smc_reset()
248 spin_lock_irq(&lp->lock); in smc_reset()
251 pending_skb = lp->pending_tx_skb; in smc_reset()
252 lp->pending_tx_skb = NULL; in smc_reset()
253 spin_unlock_irq(&lp->lock); in smc_reset()
258 dev->stats.tx_errors++; in smc_reset()
259 dev->stats.tx_aborted_errors++; in smc_reset()
283 if (lp->cfg.flags & SMC91X_NOWAIT) in smc_reset()
287 * Release from possible power-down state in smc_reset()
296 * elaborate? What does the chip _need_? --jgarzik in smc_reset()
300 * info/determined empirically. --rmk in smc_reset()
335 void __iomem *ioaddr = lp->base; in smc_enable()
342 SMC_SET_TCR(lp, lp->tcr_cur_mode); in smc_enable()
343 SMC_SET_RCR(lp, lp->rcr_cur_mode); in smc_enable()
346 SMC_SET_MAC_ADDR(lp, dev->dev_addr); in smc_enable()
350 if (lp->version >= (CHIP_91100 << 4)) in smc_enable()
369 void __iomem *ioaddr = lp->base; in smc_shutdown()
375 spin_lock_irq(&lp->lock); in smc_shutdown()
378 pending_skb = lp->pending_tx_skb; in smc_shutdown()
379 lp->pending_tx_skb = NULL; in smc_shutdown()
380 spin_unlock_irq(&lp->lock); in smc_shutdown()
401 void __iomem *ioaddr = lp->base; in smc_rcv()
436 dev->stats.rx_errors++; in smc_rcv()
438 dev->stats.rx_frame_errors++; in smc_rcv()
440 dev->stats.rx_length_errors++; in smc_rcv()
442 dev->stats.rx_crc_errors++; in smc_rcv()
450 dev->stats.multicast++; in smc_rcv()
453 * Actual payload is packet_len - 6 (or 5 if odd byte). in smc_rcv()
457 * multiple of 4 bytes on 32 bit buses. in smc_rcv()
458 * Hence packet_len - 6 + 2 + 2 + 2. in smc_rcv()
464 dev->stats.rx_dropped++; in smc_rcv()
471 /* BUG: the LAN91C111 rev A never sets this bit. Force it. */ in smc_rcv()
472 if (lp->version == 0x90) in smc_rcv()
476 * If odd length: packet_len - 5, in smc_rcv()
477 * otherwise packet_len - 6. in smc_rcv()
478 * With the trailing ctrl byte it's packet_len - 4. in smc_rcv()
480 data_len = packet_len - ((status & RS_ODDFRAME) ? 5 : 6); in smc_rcv()
482 SMC_PULL_DATA(lp, data, packet_len - 4); in smc_rcv()
487 PRINT_PKT(data, packet_len - 4); in smc_rcv()
489 skb->protocol = eth_type_trans(skb, dev); in smc_rcv()
491 dev->stats.rx_packets++; in smc_rcv()
492 dev->stats.rx_bytes += data_len; in smc_rcv()
541 struct net_device *dev = lp->dev; in smc_hardware_send_pkt()
542 void __iomem *ioaddr = lp->base; in smc_hardware_send_pkt()
550 if (!smc_special_trylock(&lp->lock, flags)) { in smc_hardware_send_pkt()
552 tasklet_schedule(&lp->tx_task); in smc_hardware_send_pkt()
556 skb = lp->pending_tx_skb; in smc_hardware_send_pkt()
558 smc_special_unlock(&lp->lock, flags); in smc_hardware_send_pkt()
561 lp->pending_tx_skb = NULL; in smc_hardware_send_pkt()
566 dev->stats.tx_errors++; in smc_hardware_send_pkt()
567 dev->stats.tx_fifo_errors++; in smc_hardware_send_pkt()
568 smc_special_unlock(&lp->lock, flags); in smc_hardware_send_pkt()
576 buf = skb->data; in smc_hardware_send_pkt()
577 len = skb->len; in smc_hardware_send_pkt()
592 SMC_outw(lp, ((len & 1) ? (0x2000 | buf[len - 1]) : 0), ioaddr, in smc_hardware_send_pkt()
608 smc_special_unlock(&lp->lock, flags); in smc_hardware_send_pkt()
611 dev->stats.tx_packets++; in smc_hardware_send_pkt()
612 dev->stats.tx_bytes += len; in smc_hardware_send_pkt()
632 void __iomem *ioaddr = lp->base; in smc_hard_start_xmit()
638 BUG_ON(lp->pending_tx_skb != NULL); in smc_hard_start_xmit()
651 numPages = ((skb->len & ~1) + (6 - 1)) >> 8; in smc_hard_start_xmit()
654 dev->stats.tx_errors++; in smc_hard_start_xmit()
655 dev->stats.tx_dropped++; in smc_hard_start_xmit()
660 smc_special_lock(&lp->lock, flags); in smc_hard_start_xmit()
676 } while (--poll_count); in smc_hard_start_xmit()
678 smc_special_unlock(&lp->lock, flags); in smc_hard_start_xmit()
680 lp->pending_tx_skb = skb; in smc_hard_start_xmit()
691 smc_hardware_send_pkt(&lp->tx_task); in smc_hard_start_xmit()
699 * - a TX error occurred, or
700 * - CTL_AUTO_RELEASE is not set and TX of a packet completed.
705 void __iomem *ioaddr = lp->base; in smc_tx()
728 dev->stats.tx_errors++; in smc_tx()
731 dev->stats.tx_carrier_errors++; in smc_tx()
737 dev->stats.tx_window_errors++; in smc_tx()
738 if (!(dev->stats.tx_window_errors & 63) && net_ratelimit()) { in smc_tx()
747 /* Don't restore Packet Number Reg until busy bit is cleared */ in smc_tx()
751 /* re-enable transmit */ in smc_tx()
753 SMC_SET_TCR(lp, lp->tcr_cur_mode); in smc_tx()
758 /*---PHY CONTROL AND CONFIGURATION-----------------------------------------*/
763 void __iomem *ioaddr = lp->base; in smc_mii_out()
769 for (mask = 1 << (bits - 1); mask; mask >>= 1) { in smc_mii_out()
785 void __iomem *ioaddr = lp->base; in smc_mii_in()
791 for (mask = 1 << (bits - 1), val = 0; mask; mask >>= 1) { in smc_mii_in()
810 void __iomem *ioaddr = lp->base; in smc_phy_read()
815 /* Idle - 32 ones */ in smc_phy_read()
841 void __iomem *ioaddr = lp->base; in smc_phy_write()
845 /* Idle - 32 ones */ in smc_phy_write()
870 lp->phy_type = 0; in smc_phy_detect()
890 lp->mii.phy_id = phyaddr & 31; in smc_phy_detect()
891 lp->phy_type = id1 << 16 | id2; in smc_phy_detect()
903 void __iomem *ioaddr = lp->base; in smc_phy_fixed()
904 int phyaddr = lp->mii.phy_id; in smc_phy_fixed()
916 * Disable auto-negotiation in smc_phy_fixed()
920 if (lp->ctl_rfduplx) in smc_phy_fixed()
923 if (lp->ctl_rspeed == 100) in smc_phy_fixed()
929 /* Re-Configure the Receive/Phy Control register */ in smc_phy_fixed()
931 SMC_SET_RPC(lp, lp->rpc_cur_mode); in smc_phy_fixed()
938 * smc_phy_reset - reset the phy
948 * Must be called with lp->lock locked.
958 for (timeout = 2; timeout; timeout--) { in smc_phy_reset()
959 spin_unlock_irq(&lp->lock); in smc_phy_reset()
961 spin_lock_irq(&lp->lock); in smc_phy_reset()
972 * smc_phy_powerdown - powerdown phy
981 int phy = lp->mii.phy_id; in smc_phy_powerdown()
983 if (lp->phy_type == 0) in smc_phy_powerdown()
989 cancel_work_sync(&lp->phy_configure); in smc_phy_powerdown()
996 * smc_phy_check_media - check the media status and adjust TCR
1006 void __iomem *ioaddr = lp->base; in smc_phy_check_media()
1008 if (mii_check_media(&lp->mii, netif_msg_link(lp), init)) { in smc_phy_check_media()
1010 if (lp->mii.full_duplex) { in smc_phy_check_media()
1011 lp->tcr_cur_mode |= TCR_SWFDUP; in smc_phy_check_media()
1013 lp->tcr_cur_mode &= ~TCR_SWFDUP; in smc_phy_check_media()
1017 SMC_SET_TCR(lp, lp->tcr_cur_mode); in smc_phy_check_media()
1025 * If RPC ANEG bit is set, the media selection is dependent purely on
1027 * of autonegotiation.) If the RPC ANEG bit is cleared, the selection
1034 struct net_device *dev = lp->dev; in smc_phy_configure()
1035 void __iomem *ioaddr = lp->base; in smc_phy_configure()
1036 int phyaddr = lp->mii.phy_id; in smc_phy_configure()
1042 spin_lock_irq(&lp->lock); in smc_phy_configure()
1047 if (lp->phy_type == 0) in smc_phy_configure()
1066 SMC_SET_RPC(lp, lp->rpc_cur_mode); in smc_phy_configure()
1069 if (lp->mii.force_media) { in smc_phy_configure()
1097 if (lp->ctl_rspeed != 100) in smc_phy_configure()
1100 if (!lp->ctl_rfduplx) in smc_phy_configure()
1103 /* Update our Auto-Neg Advertisement Register */ in smc_phy_configure()
1105 lp->mii.advertising = my_ad_caps; in smc_phy_configure()
1109 * auto-negotiation is restarted, sometimes it isn't ready and in smc_phy_configure()
1117 /* Restart auto-negotiation process in order to advertise my caps */ in smc_phy_configure()
1124 spin_unlock_irq(&lp->lock); in smc_phy_configure()
1136 int phyaddr = lp->mii.phy_id; in smc_phy_interrupt()
1141 if (lp->phy_type == 0) in smc_phy_interrupt()
1154 /*--- END PHY CONTROL AND CONFIGURATION-------------------------------------*/
1159 void __iomem *ioaddr = lp->base; in smc_10bt_check_media()
1183 void __iomem *ioaddr = lp->base; in smc_eph_interrupt()
1203 void __iomem *ioaddr = lp->base; in smc_interrupt()
1209 spin_lock(&lp->lock); in smc_interrupt()
1249 tasklet_hi_schedule(&lp->tx_task); in smc_interrupt()
1261 dev->stats.collisions += card_stats & 0xF; in smc_interrupt()
1265 dev->stats.collisions += card_stats & 0xF; in smc_interrupt()
1272 dev->stats.rx_errors++; in smc_interrupt()
1273 dev->stats.rx_fifo_errors++; in smc_interrupt()
1283 } while (--timeout); in smc_interrupt()
1288 spin_unlock(&lp->lock); in smc_interrupt()
1296 MAX_IRQ_LOOPS - timeout); in smc_interrupt()
1311 * Polling receive - used by netconsole and other diagnostic tools
1316 disable_irq(dev->irq); in smc_poll_controller()
1317 smc_interrupt(dev->irq, dev); in smc_poll_controller()
1318 enable_irq(dev->irq); in smc_poll_controller()
1326 void __iomem *ioaddr = lp->base; in smc_timeout()
1331 spin_lock_irq(&lp->lock); in smc_timeout()
1339 spin_unlock_irq(&lp->lock); in smc_timeout()
1351 if (lp->phy_type != 0) in smc_timeout()
1352 schedule_work(&lp->phy_configure); in smc_timeout()
1368 void __iomem *ioaddr = lp->base; in smc_set_multicast_list()
1374 if (dev->flags & IFF_PROMISC) { in smc_set_multicast_list()
1376 lp->rcr_cur_mode |= RCR_PRMS; in smc_set_multicast_list()
1389 else if (dev->flags & IFF_ALLMULTI || netdev_mc_count(dev) > 16) { in smc_set_multicast_list()
1391 lp->rcr_cur_mode |= RCR_ALMUL; in smc_set_multicast_list()
1399 * address are the offset into the table. If that bit is 1, then the in smc_set_multicast_list()
1403 * the number of the 8 bit register, while the low 3 bits are the bit in smc_set_multicast_list()
1419 position = crc32_le(~0, ha->addr, 6) & 0x3f; in smc_set_multicast_list()
1421 /* do some messy swapping to put the bit in the right spot */ in smc_set_multicast_list()
1427 lp->rcr_cur_mode &= ~(RCR_PRMS | RCR_ALMUL); in smc_set_multicast_list()
1433 lp->rcr_cur_mode &= ~(RCR_PRMS | RCR_ALMUL); in smc_set_multicast_list()
1443 spin_lock_irq(&lp->lock); in smc_set_multicast_list()
1445 SMC_SET_RCR(lp, lp->rcr_cur_mode); in smc_set_multicast_list()
1451 spin_unlock_irq(&lp->lock); in smc_set_multicast_list()
1468 lp->tcr_cur_mode = TCR_DEFAULT; in smc_open()
1469 lp->rcr_cur_mode = RCR_DEFAULT; in smc_open()
1470 lp->rpc_cur_mode = RPC_DEFAULT | in smc_open()
1471 lp->cfg.leda << RPC_LSXA_SHFT | in smc_open()
1472 lp->cfg.ledb << RPC_LSXB_SHFT; in smc_open()
1478 if (lp->phy_type == 0) in smc_open()
1479 lp->tcr_cur_mode |= TCR_MON_CSN; in smc_open()
1486 if (lp->phy_type != 0) in smc_open()
1487 smc_phy_configure(&lp->phy_configure); in smc_open()
1489 spin_lock_irq(&lp->lock); in smc_open()
1491 spin_unlock_irq(&lp->lock); in smc_open()
1516 tasklet_kill(&lp->tx_task); in smc_close()
1530 if (lp->phy_type != 0) { in smc_ethtool_get_link_ksettings()
1531 spin_lock_irq(&lp->lock); in smc_ethtool_get_link_ksettings()
1532 mii_ethtool_get_link_ksettings(&lp->mii, cmd); in smc_ethtool_get_link_ksettings()
1533 spin_unlock_irq(&lp->lock); in smc_ethtool_get_link_ksettings()
1539 if (lp->ctl_rspeed == 10) in smc_ethtool_get_link_ksettings()
1540 cmd->base.speed = SPEED_10; in smc_ethtool_get_link_ksettings()
1541 else if (lp->ctl_rspeed == 100) in smc_ethtool_get_link_ksettings()
1542 cmd->base.speed = SPEED_100; in smc_ethtool_get_link_ksettings()
1544 cmd->base.autoneg = AUTONEG_DISABLE; in smc_ethtool_get_link_ksettings()
1545 cmd->base.port = 0; in smc_ethtool_get_link_ksettings()
1546 cmd->base.duplex = lp->tcr_cur_mode & TCR_SWFDUP ? in smc_ethtool_get_link_ksettings()
1550 cmd->link_modes.supported, supported); in smc_ethtool_get_link_ksettings()
1563 if (lp->phy_type != 0) { in smc_ethtool_set_link_ksettings()
1564 spin_lock_irq(&lp->lock); in smc_ethtool_set_link_ksettings()
1565 ret = mii_ethtool_set_link_ksettings(&lp->mii, cmd); in smc_ethtool_set_link_ksettings()
1566 spin_unlock_irq(&lp->lock); in smc_ethtool_set_link_ksettings()
1568 if (cmd->base.autoneg != AUTONEG_DISABLE || in smc_ethtool_set_link_ksettings()
1569 cmd->base.speed != SPEED_10 || in smc_ethtool_set_link_ksettings()
1570 (cmd->base.duplex != DUPLEX_HALF && in smc_ethtool_set_link_ksettings()
1571 cmd->base.duplex != DUPLEX_FULL) || in smc_ethtool_set_link_ksettings()
1572 (cmd->base.port != PORT_TP && cmd->base.port != PORT_AUI)) in smc_ethtool_set_link_ksettings()
1573 return -EINVAL; in smc_ethtool_set_link_ksettings()
1575 // lp->port = cmd->base.port; in smc_ethtool_set_link_ksettings()
1576 lp->ctl_rfduplx = cmd->base.duplex == DUPLEX_FULL; in smc_ethtool_set_link_ksettings()
1590 strlcpy(info->driver, CARDNAME, sizeof(info->driver)); in smc_ethtool_getdrvinfo()
1591 strlcpy(info->version, version, sizeof(info->version)); in smc_ethtool_getdrvinfo()
1592 strlcpy(info->bus_info, dev_name(dev->dev.parent), in smc_ethtool_getdrvinfo()
1593 sizeof(info->bus_info)); in smc_ethtool_getdrvinfo()
1599 int ret = -EINVAL; in smc_ethtool_nwayreset()
1601 if (lp->phy_type != 0) { in smc_ethtool_nwayreset()
1602 spin_lock_irq(&lp->lock); in smc_ethtool_nwayreset()
1603 ret = mii_nway_restart(&lp->mii); in smc_ethtool_nwayreset()
1604 spin_unlock_irq(&lp->lock); in smc_ethtool_nwayreset()
1613 return lp->msg_enable; in smc_ethtool_getmsglevel()
1619 lp->msg_enable = level; in smc_ethtool_setmsglevel()
1626 void __iomem *ioaddr = lp->base; in smc_write_eeprom_word()
1628 spin_lock_irq(&lp->lock); in smc_write_eeprom_word()
1646 spin_unlock_irq(&lp->lock); in smc_write_eeprom_word()
1654 void __iomem *ioaddr = lp->base; in smc_read_eeprom_word()
1656 spin_lock_irq(&lp->lock); in smc_read_eeprom_word()
1674 spin_unlock_irq(&lp->lock); in smc_read_eeprom_word()
1690 eeprom->len, eeprom->offset, eeprom->offset); in smc_ethtool_geteeprom()
1692 for (i = 0; i < eeprom->len; i += 2) { in smc_ethtool_geteeprom()
1695 int offset = i + eeprom->offset; in smc_ethtool_geteeprom()
1715 eeprom->len, eeprom->offset, eeprom->offset); in smc_ethtool_seteeprom()
1717 for (i = 0; i < eeprom->len; i += 2) { in smc_ethtool_seteeprom()
1720 int offset = i + eeprom->offset; in smc_ethtool_seteeprom()
1763 * This routine has a simple purpose -- make the SMC chip generate an
1764 * interrupt, so an auto-detect routine can detect it, and find the IRQ,
1770 * --jgarzik
1774 void __iomem *ioaddr = lp->base; in smc_findirq()
1778 DBG(2, lp->dev, "%s: %s\n", CARDNAME, __func__); in smc_findirq()
1806 } while (--timeout); in smc_findirq()
1863 "%s: Detected possible byte-swapped interface at IOADDR %p\n", in smc_probe()
1866 retval = -ENODEV; in smc_probe()
1877 retval = -ENODEV; in smc_probe()
1909 retval = -ENODEV; in smc_probe()
1917 dev->base_addr = (unsigned long)ioaddr; in smc_probe()
1918 lp->base = ioaddr; in smc_probe()
1919 lp->version = revision_register & 0xff; in smc_probe()
1920 spin_lock_init(&lp->lock); in smc_probe()
1924 SMC_GET_MAC_ADDR(lp, dev->dev_addr); in smc_probe()
1930 * If dev->irq is 0, then the device has to be banged on to see in smc_probe()
1938 * because the card that I have uses a non-standard method of accessing in smc_probe()
1944 if (dev->irq < 1) { in smc_probe()
1948 while (trials--) { in smc_probe()
1949 dev->irq = smc_findirq(lp); in smc_probe()
1950 if (dev->irq) in smc_probe()
1956 if (dev->irq == 0) { in smc_probe()
1958 retval = -ENODEV; in smc_probe()
1961 dev->irq = irq_canonicalize(dev->irq); in smc_probe()
1963 dev->watchdog_timeo = msecs_to_jiffies(watchdog); in smc_probe()
1964 dev->netdev_ops = &smc_netdev_ops; in smc_probe()
1965 dev->ethtool_ops = &smc_ethtool_ops; in smc_probe()
1967 tasklet_setup(&lp->tx_task, smc_hardware_send_pkt); in smc_probe()
1968 INIT_WORK(&lp->phy_configure, smc_phy_configure); in smc_probe()
1969 lp->dev = dev; in smc_probe()
1970 lp->mii.phy_id_mask = 0x1f; in smc_probe()
1971 lp->mii.reg_num_mask = 0x1f; in smc_probe()
1972 lp->mii.force_media = 0; in smc_probe()
1973 lp->mii.full_duplex = 0; in smc_probe()
1974 lp->mii.dev = dev; in smc_probe()
1975 lp->mii.mdio_read = smc_phy_read; in smc_probe()
1976 lp->mii.mdio_write = smc_phy_write; in smc_probe()
1981 if (lp->version >= (CHIP_91100 << 4)) in smc_probe()
1989 lp->msg_enable = NETIF_MSG_LINK; in smc_probe()
1990 lp->ctl_rfduplx = 0; in smc_probe()
1991 lp->ctl_rspeed = 10; in smc_probe()
1993 if (lp->version >= (CHIP_91100 << 4)) { in smc_probe()
1994 lp->ctl_rfduplx = 1; in smc_probe()
1995 lp->ctl_rspeed = 100; in smc_probe()
1999 retval = request_irq(dev->irq, smc_interrupt, irq_flags, dev->name, dev); in smc_probe()
2005 lp->cfg.flags |= SMC91X_USE_DMA; in smc_probe()
2007 if (lp->cfg.flags & SMC91X_USE_DMA) { in smc_probe()
2012 lp->dma_chan = dma_request_channel(mask, NULL, NULL); in smc_probe()
2021 lp->base, dev->irq); in smc_probe()
2023 if (lp->dma_chan) in smc_probe()
2024 pr_cont(" DMA %p", lp->dma_chan); in smc_probe()
2027 lp->cfg.flags & SMC91X_NOWAIT ? " [nowait]" : "", in smc_probe()
2030 if (!is_valid_ether_addr(dev->dev_addr)) { in smc_probe()
2035 dev->dev_addr); in smc_probe()
2038 if (lp->phy_type == 0) { in smc_probe()
2040 } else if ((lp->phy_type & 0xfffffff0) == 0x0016f840) { in smc_probe()
2042 } else if ((lp->phy_type & 0xfffffff0) == 0x02821c50) { in smc_probe()
2049 if (retval && lp->dma_chan) in smc_probe()
2050 dma_release_channel(lp->dma_chan); in smc_probe()
2064 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-attrib"); in smc_enable_device()
2071 addr = ioremap(res->start, ATTRIB_SIZE); in smc_enable_device()
2073 return -ENOMEM; in smc_enable_device()
2090 * The device will ignore all writes to the enable bit while in smc_enable_device()
2091 * reset is asserted, even if the reset bit is cleared in the in smc_enable_device()
2121 struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-attrib"); in smc_request_attrib()
2127 if (!request_mem_region(res->start, ATTRIB_SIZE, CARDNAME)) in smc_request_attrib()
2128 return -EBUSY; in smc_request_attrib()
2136 struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-attrib"); in smc_release_attrib()
2140 release_mem_region(res->start, ATTRIB_SIZE); in smc_release_attrib()
2146 struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-data32"); in smc_request_datacs()
2152 if(!request_mem_region(res->start, SMC_DATA_EXTENT, CARDNAME)) { in smc_request_datacs()
2158 lp->datacs = ioremap(res->start, SMC_DATA_EXTENT); in smc_request_datacs()
2166 struct resource * res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-data32"); in smc_release_datacs()
2168 if (lp->datacs) in smc_release_datacs()
2169 iounmap(lp->datacs); in smc_release_datacs()
2171 lp->datacs = NULL; in smc_release_datacs()
2174 release_mem_region(res->start, SMC_DATA_EXTENT); in smc_release_datacs()
2193 * of_try_set_control_gpio - configure a gpio if it exists
2221 * dev->base_addr == 0, try to find all possible locations
2222 * dev->base_addr > 0x1ff, this is the address to check
2223 * dev->base_addr == <anything else>, return failure code
2226 * 0 --> there is a device
2231 struct smc91x_platdata *pd = dev_get_platdata(&pdev->dev); in smc_drv_probe()
2243 ret = -ENOMEM; in smc_drv_probe()
2246 SET_NETDEV_DEV(ndev, &pdev->dev); in smc_drv_probe()
2253 lp->cfg.flags = 0; in smc_drv_probe()
2256 memcpy(&lp->cfg, pd, sizeof(lp->cfg)); in smc_drv_probe()
2257 lp->io_shift = SMC91X_IO_SHIFT(lp->cfg.flags); in smc_drv_probe()
2260 dev_err(&pdev->dev, in smc_drv_probe()
2261 "at least one of 8-bit or 16-bit access support is required.\n"); in smc_drv_probe()
2262 ret = -ENXIO; in smc_drv_probe()
2268 match = of_match_device(of_match_ptr(smc91x_match), &pdev->dev); in smc_drv_probe()
2273 ret = try_toggle_control_gpio(&pdev->dev, &lp->power_gpio, in smc_drv_probe()
2282 ret = try_toggle_control_gpio(&pdev->dev, &lp->reset_gpio, in smc_drv_probe()
2291 if (lp->reset_gpio) in smc_drv_probe()
2294 /* Combination of IO widths supported, default to 16-bit */ in smc_drv_probe()
2295 if (!device_property_read_u32(&pdev->dev, "reg-io-width", in smc_drv_probe()
2298 lp->cfg.flags |= SMC91X_USE_8BIT; in smc_drv_probe()
2300 lp->cfg.flags |= SMC91X_USE_16BIT; in smc_drv_probe()
2302 lp->cfg.flags |= SMC91X_USE_32BIT; in smc_drv_probe()
2304 lp->cfg.flags |= SMC91X_USE_16BIT; in smc_drv_probe()
2306 if (!device_property_read_u32(&pdev->dev, "reg-shift", in smc_drv_probe()
2308 lp->io_shift = val; in smc_drv_probe()
2309 lp->cfg.pxa_u16_align4 = in smc_drv_probe()
2310 device_property_read_bool(&pdev->dev, "pxa-u16-align4"); in smc_drv_probe()
2315 lp->cfg.flags |= (SMC_CAN_USE_8BIT) ? SMC91X_USE_8BIT : 0; in smc_drv_probe()
2316 lp->cfg.flags |= (SMC_CAN_USE_16BIT) ? SMC91X_USE_16BIT : 0; in smc_drv_probe()
2317 lp->cfg.flags |= (SMC_CAN_USE_32BIT) ? SMC91X_USE_32BIT : 0; in smc_drv_probe()
2318 lp->cfg.flags |= (nowait) ? SMC91X_NOWAIT : 0; in smc_drv_probe()
2321 if (!lp->cfg.leda && !lp->cfg.ledb) { in smc_drv_probe()
2322 lp->cfg.leda = RPC_LSA_DEFAULT; in smc_drv_probe()
2323 lp->cfg.ledb = RPC_LSB_DEFAULT; in smc_drv_probe()
2326 ndev->dma = (unsigned char)-1; in smc_drv_probe()
2328 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-regs"); in smc_drv_probe()
2332 ret = -ENODEV; in smc_drv_probe()
2337 if (!request_mem_region(res->start, SMC_IO_EXTENT, CARDNAME)) { in smc_drv_probe()
2338 ret = -EBUSY; in smc_drv_probe()
2342 ndev->irq = platform_get_irq(pdev, 0); in smc_drv_probe()
2343 if (ndev->irq < 0) { in smc_drv_probe()
2344 ret = ndev->irq; in smc_drv_probe()
2352 irq_resflags = irqd_get_trigger_type(irq_get_irq_data(ndev->irq)); in smc_drv_probe()
2353 if (irq_flags == -1 || irq_resflags & IRQF_TRIGGER_MASK) in smc_drv_probe()
2368 addr = ioremap(res->start, SMC_IO_EXTENT); in smc_drv_probe()
2370 ret = -ENOMEM; in smc_drv_probe()
2377 lp->device = &pdev->dev; in smc_drv_probe()
2378 lp->physaddr = res->start; in smc_drv_probe()
2396 release_mem_region(res->start, SMC_IO_EXTENT); in smc_drv_probe()
2413 free_irq(ndev->irq, ndev); in smc_drv_remove()
2416 if (lp->dma_chan) in smc_drv_remove()
2417 dma_release_channel(lp->dma_chan); in smc_drv_remove()
2419 iounmap(lp->base); in smc_drv_remove()
2424 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "smc91x-regs"); in smc_drv_remove()
2427 release_mem_region(res->start, SMC_IO_EXTENT); in smc_drv_remove()
2459 if (lp->phy_type != 0) in smc_drv_resume()
2460 smc_phy_configure(&lp->phy_configure); in smc_drv_resume()