Lines Matching +full:cmd +full:- +full:db
1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * (C) Copyright 1997-1998 DAVICOM Semiconductor,Inc. All Rights Reserved.
40 /* Board/System/Debug information/definition ---------------- */
58 MODULE_PARM_DESC(debug, "dm9000 debug level (0-6)");
88 /* Structure/enum declaration ------------------------------- */
142 #define dm9000_dbg(db, lev, msg...) do { \ argument
144 dev_dbg(db->dev, msg); \
153 /* DM9000 network board routine ---------------------------- */
159 ior(struct board_info *db, int reg) in ior() argument
161 writeb(reg, db->io_addr); in ior()
162 return readb(db->io_data); in ior()
170 iow(struct board_info *db, int reg, int value) in iow() argument
172 writeb(reg, db->io_addr); in iow()
173 writeb(value, db->io_data); in iow()
177 dm9000_reset(struct board_info *db) in dm9000_reset() argument
179 dev_dbg(db->dev, "resetting device\n"); in dm9000_reset()
185 iow(db, DM9000_NCR, NCR_RST | NCR_MAC_LBK); in dm9000_reset()
187 if (ior(db, DM9000_NCR) & 1) in dm9000_reset()
188 dev_err(db->dev, "dm9000 did not respond to first reset\n"); in dm9000_reset()
190 iow(db, DM9000_NCR, 0); in dm9000_reset()
191 iow(db, DM9000_NCR, NCR_RST | NCR_MAC_LBK); in dm9000_reset()
193 if (ior(db, DM9000_NCR) & 1) in dm9000_reset()
194 dev_err(db->dev, "dm9000 did not respond to second reset\n"); in dm9000_reset()
269 static void dm9000_msleep(struct board_info *db, unsigned int ms) in dm9000_msleep() argument
271 if (db->in_suspend || db->in_timeout) in dm9000_msleep()
281 struct board_info *db = netdev_priv(dev); in dm9000_phy_read() local
286 mutex_lock(&db->addr_lock); in dm9000_phy_read()
288 spin_lock_irqsave(&db->lock, flags); in dm9000_phy_read()
291 reg_save = readb(db->io_addr); in dm9000_phy_read()
294 iow(db, DM9000_EPAR, DM9000_PHY | reg); in dm9000_phy_read()
297 iow(db, DM9000_EPCR, EPCR_ERPRR | EPCR_EPOS); in dm9000_phy_read()
299 writeb(reg_save, db->io_addr); in dm9000_phy_read()
300 spin_unlock_irqrestore(&db->lock, flags); in dm9000_phy_read()
302 dm9000_msleep(db, 1); /* Wait read complete */ in dm9000_phy_read()
304 spin_lock_irqsave(&db->lock, flags); in dm9000_phy_read()
305 reg_save = readb(db->io_addr); in dm9000_phy_read()
307 iow(db, DM9000_EPCR, 0x0); /* Clear phyxcer read command */ in dm9000_phy_read()
310 ret = (ior(db, DM9000_EPDRH) << 8) | ior(db, DM9000_EPDRL); in dm9000_phy_read()
313 writeb(reg_save, db->io_addr); in dm9000_phy_read()
314 spin_unlock_irqrestore(&db->lock, flags); in dm9000_phy_read()
316 mutex_unlock(&db->addr_lock); in dm9000_phy_read()
318 dm9000_dbg(db, 5, "phy_read[%02x] -> %04x\n", reg, ret); in dm9000_phy_read()
327 struct board_info *db = netdev_priv(dev); in dm9000_phy_write() local
331 dm9000_dbg(db, 5, "phy_write[%02x] = %04x\n", reg, value); in dm9000_phy_write()
332 if (!db->in_timeout) in dm9000_phy_write()
333 mutex_lock(&db->addr_lock); in dm9000_phy_write()
335 spin_lock_irqsave(&db->lock, flags); in dm9000_phy_write()
338 reg_save = readb(db->io_addr); in dm9000_phy_write()
341 iow(db, DM9000_EPAR, DM9000_PHY | reg); in dm9000_phy_write()
344 iow(db, DM9000_EPDRL, value); in dm9000_phy_write()
345 iow(db, DM9000_EPDRH, value >> 8); in dm9000_phy_write()
348 iow(db, DM9000_EPCR, EPCR_EPOS | EPCR_ERPRW); in dm9000_phy_write()
350 writeb(reg_save, db->io_addr); in dm9000_phy_write()
351 spin_unlock_irqrestore(&db->lock, flags); in dm9000_phy_write()
353 dm9000_msleep(db, 1); /* Wait write complete */ in dm9000_phy_write()
355 spin_lock_irqsave(&db->lock, flags); in dm9000_phy_write()
356 reg_save = readb(db->io_addr); in dm9000_phy_write()
358 iow(db, DM9000_EPCR, 0x0); /* Clear phyxcer write command */ in dm9000_phy_write()
361 writeb(reg_save, db->io_addr); in dm9000_phy_write()
363 spin_unlock_irqrestore(&db->lock, flags); in dm9000_phy_write()
364 if (!db->in_timeout) in dm9000_phy_write()
365 mutex_unlock(&db->addr_lock); in dm9000_phy_write()
374 static void dm9000_set_io(struct board_info *db, int byte_width) in dm9000_set_io() argument
382 db->dumpblk = dm9000_dumpblk_8bit; in dm9000_set_io()
383 db->outblk = dm9000_outblk_8bit; in dm9000_set_io()
384 db->inblk = dm9000_inblk_8bit; in dm9000_set_io()
389 dev_dbg(db->dev, ": 3 byte IO, falling back to 16bit\n"); in dm9000_set_io()
392 db->dumpblk = dm9000_dumpblk_16bit; in dm9000_set_io()
393 db->outblk = dm9000_outblk_16bit; in dm9000_set_io()
394 db->inblk = dm9000_inblk_16bit; in dm9000_set_io()
399 db->dumpblk = dm9000_dumpblk_32bit; in dm9000_set_io()
400 db->outblk = dm9000_outblk_32bit; in dm9000_set_io()
401 db->inblk = dm9000_inblk_32bit; in dm9000_set_io()
406 static void dm9000_schedule_poll(struct board_info *db) in dm9000_schedule_poll() argument
408 if (db->type == TYPE_DM9000E) in dm9000_schedule_poll()
409 schedule_delayed_work(&db->phy_poll, HZ * 2); in dm9000_schedule_poll()
412 static int dm9000_ioctl(struct net_device *dev, struct ifreq *req, int cmd) in dm9000_ioctl() argument
417 return -EINVAL; in dm9000_ioctl()
419 return generic_mii_ioctl(&dm->mii, if_mii(req), cmd, NULL); in dm9000_ioctl()
423 dm9000_read_locked(struct board_info *db, int reg) in dm9000_read_locked() argument
428 spin_lock_irqsave(&db->lock, flags); in dm9000_read_locked()
429 ret = ior(db, reg); in dm9000_read_locked()
430 spin_unlock_irqrestore(&db->lock, flags); in dm9000_read_locked()
435 static int dm9000_wait_eeprom(struct board_info *db) in dm9000_wait_eeprom() argument
452 status = dm9000_read_locked(db, DM9000_EPCR); in dm9000_wait_eeprom()
459 if (timeout-- < 0) { in dm9000_wait_eeprom()
460 dev_dbg(db->dev, "timeout waiting EEPROM\n"); in dm9000_wait_eeprom()
472 dm9000_read_eeprom(struct board_info *db, int offset, u8 *to) in dm9000_read_eeprom() argument
476 if (db->flags & DM9000_PLATF_NO_EEPROM) { in dm9000_read_eeprom()
482 mutex_lock(&db->addr_lock); in dm9000_read_eeprom()
484 spin_lock_irqsave(&db->lock, flags); in dm9000_read_eeprom()
486 iow(db, DM9000_EPAR, offset); in dm9000_read_eeprom()
487 iow(db, DM9000_EPCR, EPCR_ERPRR); in dm9000_read_eeprom()
489 spin_unlock_irqrestore(&db->lock, flags); in dm9000_read_eeprom()
491 dm9000_wait_eeprom(db); in dm9000_read_eeprom()
493 /* delay for at-least 150uS */ in dm9000_read_eeprom()
496 spin_lock_irqsave(&db->lock, flags); in dm9000_read_eeprom()
498 iow(db, DM9000_EPCR, 0x0); in dm9000_read_eeprom()
500 to[0] = ior(db, DM9000_EPDRL); in dm9000_read_eeprom()
501 to[1] = ior(db, DM9000_EPDRH); in dm9000_read_eeprom()
503 spin_unlock_irqrestore(&db->lock, flags); in dm9000_read_eeprom()
505 mutex_unlock(&db->addr_lock); in dm9000_read_eeprom()
512 dm9000_write_eeprom(struct board_info *db, int offset, u8 *data) in dm9000_write_eeprom() argument
516 if (db->flags & DM9000_PLATF_NO_EEPROM) in dm9000_write_eeprom()
519 mutex_lock(&db->addr_lock); in dm9000_write_eeprom()
521 spin_lock_irqsave(&db->lock, flags); in dm9000_write_eeprom()
522 iow(db, DM9000_EPAR, offset); in dm9000_write_eeprom()
523 iow(db, DM9000_EPDRH, data[1]); in dm9000_write_eeprom()
524 iow(db, DM9000_EPDRL, data[0]); in dm9000_write_eeprom()
525 iow(db, DM9000_EPCR, EPCR_WEP | EPCR_ERPRW); in dm9000_write_eeprom()
526 spin_unlock_irqrestore(&db->lock, flags); in dm9000_write_eeprom()
528 dm9000_wait_eeprom(db); in dm9000_write_eeprom()
532 spin_lock_irqsave(&db->lock, flags); in dm9000_write_eeprom()
533 iow(db, DM9000_EPCR, 0); in dm9000_write_eeprom()
534 spin_unlock_irqrestore(&db->lock, flags); in dm9000_write_eeprom()
536 mutex_unlock(&db->addr_lock); in dm9000_write_eeprom()
546 strlcpy(info->driver, CARDNAME, sizeof(info->driver)); in dm9000_get_drvinfo()
547 strlcpy(info->bus_info, to_platform_device(dm->dev)->name, in dm9000_get_drvinfo()
548 sizeof(info->bus_info)); in dm9000_get_drvinfo()
555 return dm->msg_enable; in dm9000_get_msglevel()
562 dm->msg_enable = value; in dm9000_set_msglevel()
566 struct ethtool_link_ksettings *cmd) in dm9000_get_link_ksettings() argument
570 mii_ethtool_get_link_ksettings(&dm->mii, cmd); in dm9000_get_link_ksettings()
575 const struct ethtool_link_ksettings *cmd) in dm9000_set_link_ksettings() argument
579 return mii_ethtool_set_link_ksettings(&dm->mii, cmd); in dm9000_set_link_ksettings()
585 return mii_nway_restart(&dm->mii); in dm9000_nway_reset()
592 netdev_features_t changed = dev->features ^ features; in dm9000_set_features()
598 spin_lock_irqsave(&dm->lock, flags); in dm9000_set_features()
600 spin_unlock_irqrestore(&dm->lock, flags); in dm9000_set_features()
610 if (dm->flags & DM9000_PLATF_EXT_PHY) in dm9000_get_link()
611 ret = mii_link_ok(&dm->mii); in dm9000_get_link()
629 int offset = ee->offset; in dm9000_get_eeprom()
630 int len = ee->len; in dm9000_get_eeprom()
636 return -EINVAL; in dm9000_get_eeprom()
638 if (dm->flags & DM9000_PLATF_NO_EEPROM) in dm9000_get_eeprom()
639 return -ENOENT; in dm9000_get_eeprom()
641 ee->magic = DM_EEPROM_MAGIC; in dm9000_get_eeprom()
653 int offset = ee->offset; in dm9000_set_eeprom()
654 int len = ee->len; in dm9000_set_eeprom()
659 if (dm->flags & DM9000_PLATF_NO_EEPROM) in dm9000_set_eeprom()
660 return -ENOENT; in dm9000_set_eeprom()
662 if (ee->magic != DM_EEPROM_MAGIC) in dm9000_set_eeprom()
663 return -EINVAL; in dm9000_set_eeprom()
682 len -= done; in dm9000_set_eeprom()
694 /* note, we could probably support wake-phy too */ in dm9000_get_wol()
695 w->supported = dm->wake_supported ? WAKE_MAGIC : 0; in dm9000_get_wol()
696 w->wolopts = dm->wake_state; in dm9000_get_wol()
703 u32 opts = w->wolopts; in dm9000_set_wol()
706 if (!dm->wake_supported) in dm9000_set_wol()
707 return -EOPNOTSUPP; in dm9000_set_wol()
710 return -EINVAL; in dm9000_set_wol()
715 mutex_lock(&dm->addr_lock); in dm9000_set_wol()
717 spin_lock_irqsave(&dm->lock, flags); in dm9000_set_wol()
719 spin_unlock_irqrestore(&dm->lock, flags); in dm9000_set_wol()
721 mutex_unlock(&dm->addr_lock); in dm9000_set_wol()
723 if (dm->wake_state != opts) { in dm9000_set_wol()
726 if (!dm->wake_state) in dm9000_set_wol()
727 irq_set_irq_wake(dm->irq_wake, 1); in dm9000_set_wol()
728 else if (dm->wake_state && !opts) in dm9000_set_wol()
729 irq_set_irq_wake(dm->irq_wake, 0); in dm9000_set_wol()
732 dm->wake_state = opts; in dm9000_set_wol()
751 static void dm9000_show_carrier(struct board_info *db, in dm9000_show_carrier() argument
755 struct net_device *ndev = db->ndev; in dm9000_show_carrier()
756 struct mii_if_info *mii = &db->mii; in dm9000_show_carrier()
757 unsigned ncr = dm9000_read_locked(db, DM9000_NCR); in dm9000_show_carrier()
760 lpa = mii->mdio_read(mii->dev, mii->phy_id, MII_LPA); in dm9000_show_carrier()
761 dev_info(db->dev, in dm9000_show_carrier()
762 "%s: link up, %dMbps, %s-duplex, lpa 0x%04X\n", in dm9000_show_carrier()
763 ndev->name, (nsr & NSR_SPEED) ? 10 : 100, in dm9000_show_carrier()
766 dev_info(db->dev, "%s: link down\n", ndev->name); in dm9000_show_carrier()
774 struct board_info *db = container_of(dw, struct board_info, phy_poll); in dm9000_poll_work() local
775 struct net_device *ndev = db->ndev; in dm9000_poll_work()
777 if (db->flags & DM9000_PLATF_SIMPLE_PHY && in dm9000_poll_work()
778 !(db->flags & DM9000_PLATF_EXT_PHY)) { in dm9000_poll_work()
779 unsigned nsr = dm9000_read_locked(db, DM9000_NSR); in dm9000_poll_work()
786 if (netif_msg_link(db)) in dm9000_poll_work()
787 dm9000_show_carrier(db, new_carrier, nsr); in dm9000_poll_work()
795 mii_check_media(&db->mii, netif_msg_link(db), 0); in dm9000_poll_work()
798 dm9000_schedule_poll(db); in dm9000_poll_work()
807 dm9000_release_board(struct platform_device *pdev, struct board_info *db) in dm9000_release_board() argument
811 iounmap(db->io_addr); in dm9000_release_board()
812 iounmap(db->io_data); in dm9000_release_board()
816 if (db->data_req) in dm9000_release_board()
817 release_resource(db->data_req); in dm9000_release_board()
818 kfree(db->data_req); in dm9000_release_board()
820 if (db->addr_req) in dm9000_release_board()
821 release_resource(db->addr_req); in dm9000_release_board()
822 kfree(db->addr_req); in dm9000_release_board()
842 struct board_info *db = netdev_priv(dev); in dm9000_hash_table_unlocked() local
849 dm9000_dbg(db, 1, "entering %s\n", __func__); in dm9000_hash_table_unlocked()
852 iow(db, oft, dev->dev_addr[i]); in dm9000_hash_table_unlocked()
854 if (dev->flags & IFF_PROMISC) in dm9000_hash_table_unlocked()
857 if (dev->flags & IFF_ALLMULTI) in dm9000_hash_table_unlocked()
862 hash_val = ether_crc_le(6, ha->addr) & 0x3f; in dm9000_hash_table_unlocked()
868 iow(db, oft++, hash_table[i]); in dm9000_hash_table_unlocked()
869 iow(db, oft++, hash_table[i] >> 8); in dm9000_hash_table_unlocked()
872 iow(db, DM9000_RCR, rcr); in dm9000_hash_table_unlocked()
878 struct board_info *db = netdev_priv(dev); in dm9000_hash_table() local
881 spin_lock_irqsave(&db->lock, flags); in dm9000_hash_table()
883 spin_unlock_irqrestore(&db->lock, flags); in dm9000_hash_table()
887 dm9000_mask_interrupts(struct board_info *db) in dm9000_mask_interrupts() argument
889 iow(db, DM9000_IMR, IMR_PAR); in dm9000_mask_interrupts()
893 dm9000_unmask_interrupts(struct board_info *db) in dm9000_unmask_interrupts() argument
895 iow(db, DM9000_IMR, db->imr_all); in dm9000_unmask_interrupts()
904 struct board_info *db = netdev_priv(dev); in dm9000_init_dm9000() local
908 dm9000_dbg(db, 1, "entering %s\n", __func__); in dm9000_init_dm9000()
910 dm9000_reset(db); in dm9000_init_dm9000()
911 dm9000_mask_interrupts(db); in dm9000_init_dm9000()
914 db->io_mode = ior(db, DM9000_ISR) >> 6; /* ISR bit7:6 keeps I/O mode */ in dm9000_init_dm9000()
917 if (dev->hw_features & NETIF_F_RXCSUM) in dm9000_init_dm9000()
918 iow(db, DM9000_RCSR, in dm9000_init_dm9000()
919 (dev->features & NETIF_F_RXCSUM) ? RCSR_CSUM : 0); in dm9000_init_dm9000()
921 iow(db, DM9000_GPCR, GPCR_GEP_CNTL); /* Let GPIO0 output */ in dm9000_init_dm9000()
922 iow(db, DM9000_GPR, 0); in dm9000_init_dm9000()
927 if (db->type == TYPE_DM9000B) { in dm9000_init_dm9000()
932 ncr = (db->flags & DM9000_PLATF_EXT_PHY) ? NCR_EXT_PHY : 0; in dm9000_init_dm9000()
936 * a wake-mask in DM9000_WCR */ in dm9000_init_dm9000()
937 if (db->wake_supported) in dm9000_init_dm9000()
940 iow(db, DM9000_NCR, ncr); in dm9000_init_dm9000()
943 iow(db, DM9000_TCR, 0); /* TX Polling clear */ in dm9000_init_dm9000()
944 iow(db, DM9000_BPTR, 0x3f); /* Less 3Kb, 200us */ in dm9000_init_dm9000()
945 iow(db, DM9000_FCR, 0xff); /* Flow Control */ in dm9000_init_dm9000()
946 iow(db, DM9000_SMCR, 0); /* Special Mode */ in dm9000_init_dm9000()
948 iow(db, DM9000_NSR, NSR_WAKEST | NSR_TX2END | NSR_TX1END); in dm9000_init_dm9000()
949 iow(db, DM9000_ISR, ISR_CLR_STATUS); /* Clear interrupt status */ in dm9000_init_dm9000()
955 if (db->type != TYPE_DM9000E) in dm9000_init_dm9000()
958 db->imr_all = imr; in dm9000_init_dm9000()
961 db->tx_pkt_cnt = 0; in dm9000_init_dm9000()
962 db->queue_pkt_len = 0; in dm9000_init_dm9000()
969 struct board_info *db = netdev_priv(dev); in dm9000_timeout() local
974 spin_lock_irqsave(&db->lock, flags); in dm9000_timeout()
975 db->in_timeout = 1; in dm9000_timeout()
976 reg_save = readb(db->io_addr); in dm9000_timeout()
980 dm9000_unmask_interrupts(db); in dm9000_timeout()
986 writeb(reg_save, db->io_addr); in dm9000_timeout()
987 db->in_timeout = 0; in dm9000_timeout()
988 spin_unlock_irqrestore(&db->lock, flags); in dm9000_timeout()
998 if (dm->ip_summed != ip_summed) { in dm9000_send_packet()
1003 dm->ip_summed = ip_summed; in dm9000_send_packet()
1022 struct board_info *db = netdev_priv(dev); in dm9000_start_xmit() local
1024 dm9000_dbg(db, 3, "%s:\n", __func__); in dm9000_start_xmit()
1026 if (db->tx_pkt_cnt > 1) in dm9000_start_xmit()
1029 spin_lock_irqsave(&db->lock, flags); in dm9000_start_xmit()
1032 writeb(DM9000_MWCMD, db->io_addr); in dm9000_start_xmit()
1034 (db->outblk)(db->io_data, skb->data, skb->len); in dm9000_start_xmit()
1035 dev->stats.tx_bytes += skb->len; in dm9000_start_xmit()
1037 db->tx_pkt_cnt++; in dm9000_start_xmit()
1039 if (db->tx_pkt_cnt == 1) { in dm9000_start_xmit()
1040 dm9000_send_packet(dev, skb->ip_summed, skb->len); in dm9000_start_xmit()
1043 db->queue_pkt_len = skb->len; in dm9000_start_xmit()
1044 db->queue_ip_summed = skb->ip_summed; in dm9000_start_xmit()
1048 spin_unlock_irqrestore(&db->lock, flags); in dm9000_start_xmit()
1061 static void dm9000_tx_done(struct net_device *dev, struct board_info *db) in dm9000_tx_done() argument
1063 int tx_status = ior(db, DM9000_NSR); /* Got TX status */ in dm9000_tx_done()
1067 db->tx_pkt_cnt--; in dm9000_tx_done()
1068 dev->stats.tx_packets++; in dm9000_tx_done()
1070 if (netif_msg_tx_done(db)) in dm9000_tx_done()
1071 dev_dbg(db->dev, "tx done, NSR %02x\n", tx_status); in dm9000_tx_done()
1074 if (db->tx_pkt_cnt > 0) in dm9000_tx_done()
1075 dm9000_send_packet(dev, db->queue_ip_summed, in dm9000_tx_done()
1076 db->queue_pkt_len); in dm9000_tx_done()
1093 struct board_info *db = netdev_priv(dev); in dm9000_rx() local
1102 ior(db, DM9000_MRCMDX); /* Dummy read */ in dm9000_rx()
1105 rxbyte = readb(db->io_data); in dm9000_rx()
1109 dev_warn(db->dev, "status check fail: %d\n", rxbyte); in dm9000_rx()
1110 iow(db, DM9000_RCR, 0x00); /* Stop Device */ in dm9000_rx()
1119 writeb(DM9000_MRCMD, db->io_addr); in dm9000_rx()
1121 (db->inblk)(db->io_data, &rxhdr, sizeof(rxhdr)); in dm9000_rx()
1125 if (netif_msg_rx_status(db)) in dm9000_rx()
1126 dev_dbg(db->dev, "RX: status %02x, length %04x\n", in dm9000_rx()
1132 if (netif_msg_rx_err(db)) in dm9000_rx()
1133 dev_dbg(db->dev, "RX: Bad Packet (runt)\n"); in dm9000_rx()
1137 dev_dbg(db->dev, "RST: RX Len:%x\n", RxLen); in dm9000_rx()
1146 if (netif_msg_rx_err(db)) in dm9000_rx()
1147 dev_dbg(db->dev, "fifo error\n"); in dm9000_rx()
1148 dev->stats.rx_fifo_errors++; in dm9000_rx()
1151 if (netif_msg_rx_err(db)) in dm9000_rx()
1152 dev_dbg(db->dev, "crc error\n"); in dm9000_rx()
1153 dev->stats.rx_crc_errors++; in dm9000_rx()
1156 if (netif_msg_rx_err(db)) in dm9000_rx()
1157 dev_dbg(db->dev, "length error\n"); in dm9000_rx()
1158 dev->stats.rx_length_errors++; in dm9000_rx()
1166 rdptr = skb_put(skb, RxLen - 4); in dm9000_rx()
1170 (db->inblk)(db->io_data, rdptr, RxLen); in dm9000_rx()
1171 dev->stats.rx_bytes += RxLen; in dm9000_rx()
1174 skb->protocol = eth_type_trans(skb, dev); in dm9000_rx()
1175 if (dev->features & NETIF_F_RXCSUM) { in dm9000_rx()
1177 skb->ip_summed = CHECKSUM_UNNECESSARY; in dm9000_rx()
1182 dev->stats.rx_packets++; in dm9000_rx()
1187 (db->dumpblk)(db->io_data, RxLen); in dm9000_rx()
1195 struct board_info *db = netdev_priv(dev); in dm9000_interrupt() local
1200 dm9000_dbg(db, 3, "entering %s\n", __func__); in dm9000_interrupt()
1204 /* holders of db->lock must always block IRQs */ in dm9000_interrupt()
1205 spin_lock_irqsave(&db->lock, flags); in dm9000_interrupt()
1208 reg_save = readb(db->io_addr); in dm9000_interrupt()
1210 dm9000_mask_interrupts(db); in dm9000_interrupt()
1212 int_status = ior(db, DM9000_ISR); /* Got ISR */ in dm9000_interrupt()
1213 iow(db, DM9000_ISR, int_status); /* Clear ISR status */ in dm9000_interrupt()
1215 if (netif_msg_intr(db)) in dm9000_interrupt()
1216 dev_dbg(db->dev, "interrupt status %02x\n", int_status); in dm9000_interrupt()
1224 dm9000_tx_done(dev, db); in dm9000_interrupt()
1226 if (db->type != TYPE_DM9000E) { in dm9000_interrupt()
1228 /* fire a link-change request */ in dm9000_interrupt()
1229 schedule_delayed_work(&db->phy_poll, 1); in dm9000_interrupt()
1233 dm9000_unmask_interrupts(db); in dm9000_interrupt()
1235 writeb(reg_save, db->io_addr); in dm9000_interrupt()
1237 spin_unlock_irqrestore(&db->lock, flags); in dm9000_interrupt()
1245 struct board_info *db = netdev_priv(dev); in dm9000_wol_interrupt() local
1249 spin_lock_irqsave(&db->lock, flags); in dm9000_wol_interrupt()
1251 nsr = ior(db, DM9000_NSR); in dm9000_wol_interrupt()
1252 wcr = ior(db, DM9000_WCR); in dm9000_wol_interrupt()
1254 dev_dbg(db->dev, "%s: NSR=0x%02x, WCR=0x%02x\n", __func__, nsr, wcr); in dm9000_wol_interrupt()
1258 iow(db, DM9000_NSR, NSR_WAKEST); in dm9000_wol_interrupt()
1261 dev_info(db->dev, "wake by link status change\n"); in dm9000_wol_interrupt()
1263 dev_info(db->dev, "wake by sample packet\n"); in dm9000_wol_interrupt()
1265 dev_info(db->dev, "wake by magic packet\n"); in dm9000_wol_interrupt()
1267 dev_err(db->dev, "wake signalled with no reason? " in dm9000_wol_interrupt()
1271 spin_unlock_irqrestore(&db->lock, flags); in dm9000_wol_interrupt()
1282 disable_irq(dev->irq); in dm9000_poll_controller()
1283 dm9000_interrupt(dev->irq, dev); in dm9000_poll_controller()
1284 enable_irq(dev->irq); in dm9000_poll_controller()
1295 struct board_info *db = netdev_priv(dev); in dm9000_open() local
1296 unsigned int irq_flags = irq_get_trigger_type(dev->irq); in dm9000_open()
1298 if (netif_msg_ifup(db)) in dm9000_open()
1299 dev_dbg(db->dev, "enabling %s\n", dev->name); in dm9000_open()
1305 dev_warn(db->dev, "WARNING: no IRQ resource flags set.\n"); in dm9000_open()
1309 /* GPIO0 on pre-activate PHY, Reg 1F is not set by reset */ in dm9000_open()
1310 iow(db, DM9000_GPR, 0); /* REG_1F bit0 activate phyxcer */ in dm9000_open()
1316 if (request_irq(dev->irq, dm9000_interrupt, irq_flags, dev->name, dev)) in dm9000_open()
1317 return -EAGAIN; in dm9000_open()
1321 dm9000_unmask_interrupts(db); in dm9000_open()
1324 db->dbug_cnt = 0; in dm9000_open()
1326 mii_check_media(&db->mii, netif_msg_link(db), 1); in dm9000_open()
1330 schedule_delayed_work(&db->phy_poll, 1); in dm9000_open()
1338 struct board_info *db = netdev_priv(dev); in dm9000_shutdown() local
1342 iow(db, DM9000_GPR, 0x01); /* Power-Down PHY */ in dm9000_shutdown()
1343 dm9000_mask_interrupts(db); in dm9000_shutdown()
1344 iow(db, DM9000_RCR, 0x00); /* Disable RX */ in dm9000_shutdown()
1354 struct board_info *db = netdev_priv(ndev); in dm9000_stop() local
1356 if (netif_msg_ifdown(db)) in dm9000_stop()
1357 dev_dbg(db->dev, "shutting down %s\n", ndev->name); in dm9000_stop()
1359 cancel_delayed_work_sync(&db->phy_poll); in dm9000_stop()
1365 free_irq(ndev->irq, ndev); in dm9000_stop()
1390 struct device_node *np = dev->of_node; in dm9000_parse_dt()
1394 return ERR_PTR(-ENXIO); in dm9000_parse_dt()
1398 return ERR_PTR(-ENOMEM); in dm9000_parse_dt()
1400 if (of_find_property(np, "davicom,ext-phy", NULL)) in dm9000_parse_dt()
1401 pdata->flags |= DM9000_PLATF_EXT_PHY; in dm9000_parse_dt()
1402 if (of_find_property(np, "davicom,no-eeprom", NULL)) in dm9000_parse_dt()
1403 pdata->flags |= DM9000_PLATF_NO_EEPROM; in dm9000_parse_dt()
1407 ether_addr_copy(pdata->dev_addr, mac_addr); in dm9000_parse_dt()
1408 else if (PTR_ERR(mac_addr) == -EPROBE_DEFER) in dm9000_parse_dt()
1420 struct dm9000_plat_data *pdata = dev_get_platdata(&pdev->dev); in dm9000_probe()
1421 struct board_info *db; /* Point a board information structure */ in dm9000_probe() local
1423 struct device *dev = &pdev->dev; in dm9000_probe()
1436 if (PTR_ERR(power) == -EPROBE_DEFER) in dm9000_probe()
1437 return -EPROBE_DEFER; in dm9000_probe()
1449 reset_gpios = of_get_named_gpio_flags(dev->of_node, "reset-gpios", 0, in dm9000_probe()
1468 pdata = dm9000_parse_dt(&pdev->dev); in dm9000_probe()
1478 ret = -ENOMEM; in dm9000_probe()
1482 SET_NETDEV_DEV(ndev, &pdev->dev); in dm9000_probe()
1484 dev_dbg(&pdev->dev, "dm9000_probe()\n"); in dm9000_probe()
1487 db = netdev_priv(ndev); in dm9000_probe()
1489 db->dev = &pdev->dev; in dm9000_probe()
1490 db->ndev = ndev; in dm9000_probe()
1492 db->power_supply = power; in dm9000_probe()
1494 spin_lock_init(&db->lock); in dm9000_probe()
1495 mutex_init(&db->addr_lock); in dm9000_probe()
1497 INIT_DELAYED_WORK(&db->phy_poll, dm9000_poll_work); in dm9000_probe()
1499 db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); in dm9000_probe()
1500 db->data_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); in dm9000_probe()
1502 if (!db->addr_res || !db->data_res) { in dm9000_probe()
1503 dev_err(db->dev, "insufficient resources addr=%p data=%p\n", in dm9000_probe()
1504 db->addr_res, db->data_res); in dm9000_probe()
1505 ret = -ENOENT; in dm9000_probe()
1509 ndev->irq = platform_get_irq(pdev, 0); in dm9000_probe()
1510 if (ndev->irq < 0) { in dm9000_probe()
1511 ret = ndev->irq; in dm9000_probe()
1515 db->irq_wake = platform_get_irq_optional(pdev, 1); in dm9000_probe()
1516 if (db->irq_wake >= 0) { in dm9000_probe()
1517 dev_dbg(db->dev, "wakeup irq %d\n", db->irq_wake); in dm9000_probe()
1519 ret = request_irq(db->irq_wake, dm9000_wol_interrupt, in dm9000_probe()
1520 IRQF_SHARED, dev_name(db->dev), ndev); in dm9000_probe()
1522 dev_err(db->dev, "cannot get wakeup irq (%d)\n", ret); in dm9000_probe()
1526 ret = irq_set_irq_wake(db->irq_wake, 1); in dm9000_probe()
1528 dev_err(db->dev, "irq %d cannot set wakeup (%d)\n", in dm9000_probe()
1529 db->irq_wake, ret); in dm9000_probe()
1532 irq_set_irq_wake(db->irq_wake, 0); in dm9000_probe()
1533 db->wake_supported = 1; in dm9000_probe()
1538 iosize = resource_size(db->addr_res); in dm9000_probe()
1539 db->addr_req = request_mem_region(db->addr_res->start, iosize, in dm9000_probe()
1540 pdev->name); in dm9000_probe()
1542 if (db->addr_req == NULL) { in dm9000_probe()
1543 dev_err(db->dev, "cannot claim address reg area\n"); in dm9000_probe()
1544 ret = -EIO; in dm9000_probe()
1548 db->io_addr = ioremap(db->addr_res->start, iosize); in dm9000_probe()
1550 if (db->io_addr == NULL) { in dm9000_probe()
1551 dev_err(db->dev, "failed to ioremap address reg\n"); in dm9000_probe()
1552 ret = -EINVAL; in dm9000_probe()
1556 iosize = resource_size(db->data_res); in dm9000_probe()
1557 db->data_req = request_mem_region(db->data_res->start, iosize, in dm9000_probe()
1558 pdev->name); in dm9000_probe()
1560 if (db->data_req == NULL) { in dm9000_probe()
1561 dev_err(db->dev, "cannot claim data reg area\n"); in dm9000_probe()
1562 ret = -EIO; in dm9000_probe()
1566 db->io_data = ioremap(db->data_res->start, iosize); in dm9000_probe()
1568 if (db->io_data == NULL) { in dm9000_probe()
1569 dev_err(db->dev, "failed to ioremap data reg\n"); in dm9000_probe()
1570 ret = -EINVAL; in dm9000_probe()
1574 /* fill in parameters for net-dev structure */ in dm9000_probe()
1575 ndev->base_addr = (unsigned long)db->io_addr; in dm9000_probe()
1578 dm9000_set_io(db, iosize); in dm9000_probe()
1580 /* check to see if anything is being over-ridden */ in dm9000_probe()
1582 /* check to see if the driver wants to over-ride the in dm9000_probe()
1585 if (pdata->flags & DM9000_PLATF_8BITONLY) in dm9000_probe()
1586 dm9000_set_io(db, 1); in dm9000_probe()
1588 if (pdata->flags & DM9000_PLATF_16BITONLY) in dm9000_probe()
1589 dm9000_set_io(db, 2); in dm9000_probe()
1591 if (pdata->flags & DM9000_PLATF_32BITONLY) in dm9000_probe()
1592 dm9000_set_io(db, 4); in dm9000_probe()
1595 * over-rides */ in dm9000_probe()
1597 if (pdata->inblk != NULL) in dm9000_probe()
1598 db->inblk = pdata->inblk; in dm9000_probe()
1600 if (pdata->outblk != NULL) in dm9000_probe()
1601 db->outblk = pdata->outblk; in dm9000_probe()
1603 if (pdata->dumpblk != NULL) in dm9000_probe()
1604 db->dumpblk = pdata->dumpblk; in dm9000_probe()
1606 db->flags = pdata->flags; in dm9000_probe()
1610 db->flags |= DM9000_PLATF_SIMPLE_PHY; in dm9000_probe()
1613 dm9000_reset(db); in dm9000_probe()
1617 id_val = ior(db, DM9000_VIDL); in dm9000_probe()
1618 id_val |= (u32)ior(db, DM9000_VIDH) << 8; in dm9000_probe()
1619 id_val |= (u32)ior(db, DM9000_PIDL) << 16; in dm9000_probe()
1620 id_val |= (u32)ior(db, DM9000_PIDH) << 24; in dm9000_probe()
1624 dev_err(db->dev, "read wrong id 0x%08x\n", id_val); in dm9000_probe()
1628 dev_err(db->dev, "wrong id: 0x%08x\n", id_val); in dm9000_probe()
1629 ret = -ENODEV; in dm9000_probe()
1635 id_val = ior(db, DM9000_CHIPR); in dm9000_probe()
1636 dev_dbg(db->dev, "dm9000 revision 0x%02x\n", id_val); in dm9000_probe()
1640 db->type = TYPE_DM9000A; in dm9000_probe()
1643 db->type = TYPE_DM9000B; in dm9000_probe()
1646 dev_dbg(db->dev, "ID %02x => defaulting to DM9000E\n", id_val); in dm9000_probe()
1647 db->type = TYPE_DM9000E; in dm9000_probe()
1651 if (db->type == TYPE_DM9000A || db->type == TYPE_DM9000B) { in dm9000_probe()
1652 ndev->hw_features = NETIF_F_RXCSUM | NETIF_F_IP_CSUM; in dm9000_probe()
1653 ndev->features |= ndev->hw_features; in dm9000_probe()
1658 ndev->netdev_ops = &dm9000_netdev_ops; in dm9000_probe()
1659 ndev->watchdog_timeo = msecs_to_jiffies(watchdog); in dm9000_probe()
1660 ndev->ethtool_ops = &dm9000_ethtool_ops; in dm9000_probe()
1662 db->msg_enable = NETIF_MSG_LINK; in dm9000_probe()
1663 db->mii.phy_id_mask = 0x1f; in dm9000_probe()
1664 db->mii.reg_num_mask = 0x1f; in dm9000_probe()
1665 db->mii.force_media = 0; in dm9000_probe()
1666 db->mii.full_duplex = 0; in dm9000_probe()
1667 db->mii.dev = ndev; in dm9000_probe()
1668 db->mii.mdio_read = dm9000_phy_read; in dm9000_probe()
1669 db->mii.mdio_write = dm9000_phy_write; in dm9000_probe()
1675 dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i); in dm9000_probe()
1677 if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) { in dm9000_probe()
1679 memcpy(ndev->dev_addr, pdata->dev_addr, ETH_ALEN); in dm9000_probe()
1682 if (!is_valid_ether_addr(ndev->dev_addr)) { in dm9000_probe()
1687 ndev->dev_addr[i] = ior(db, i+DM9000_PAR); in dm9000_probe()
1690 if (!is_valid_ether_addr(ndev->dev_addr)) { in dm9000_probe()
1702 dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please set using ip\n", in dm9000_probe()
1703 ndev->name); in dm9000_probe()
1705 ndev->name, dm9000_type_to_char(db->type), in dm9000_probe()
1706 db->io_addr, db->io_data, ndev->irq, in dm9000_probe()
1707 ndev->dev_addr, mac_src); in dm9000_probe()
1712 dev_err(db->dev, "not found (%d).\n", ret); in dm9000_probe()
1714 dm9000_release_board(pdev, db); in dm9000_probe()
1728 struct board_info *db; in dm9000_drv_suspend() local
1731 db = netdev_priv(ndev); in dm9000_drv_suspend()
1732 db->in_suspend = 1; in dm9000_drv_suspend()
1740 if (!db->wake_state) in dm9000_drv_suspend()
1750 struct board_info *db = netdev_priv(ndev); in dm9000_drv_resume() local
1756 if (!db->wake_state) { in dm9000_drv_resume()
1758 dm9000_unmask_interrupts(db); in dm9000_drv_resume()
1764 db->in_suspend = 0; in dm9000_drv_resume()
1783 if (dm->power_supply) in dm9000_drv_remove()
1784 regulator_disable(dm->power_supply); in dm9000_drv_remove()
1786 dev_dbg(&pdev->dev, "released and freed device\n"); in dm9000_drv_remove()