Lines Matching refs:dev

145 static void smc_phy_configure(struct eth_device *dev);
169 static inline word SMC_inw(struct eth_device *dev, dword offset) in SMC_inw() argument
172 v = *((volatile word*)(dev->iobase + offset)); in SMC_inw()
177 static inline void SMC_outw(struct eth_device *dev, word value, dword offset) in SMC_outw() argument
179 *((volatile word*)(dev->iobase + offset)) = value; in SMC_outw()
183 static inline byte SMC_inb(struct eth_device *dev, dword offset) in SMC_inb() argument
187 _w = SMC_inw(dev, offset & ~((dword)1)); in SMC_inb()
191 static inline void SMC_outb(struct eth_device *dev, byte value, dword offset) in SMC_outb() argument
195 _w = SMC_inw(dev, offset & ~((dword)1)); in SMC_outb()
197 *((volatile word*)(dev->iobase + (offset & ~((dword)1)))) = in SMC_outb()
200 *((volatile word*)(dev->iobase + offset)) = in SMC_outb()
204 static inline void SMC_insw(struct eth_device *dev, dword offset, in SMC_insw() argument
210 *p++ = SMC_inw(dev, offset); in SMC_insw()
216 static inline void SMC_outsw(struct eth_device *dev, dword offset, in SMC_outsw() argument
222 SMC_outw(dev, *p++, offset); in SMC_outsw()
236 #define tx_done(dev) 1 argument
238 static int poll4int (struct eth_device *dev, byte mask, int timeout) in poll4int() argument
242 word old_bank = SMC_inw (dev, BSR_REG); in poll4int()
245 SMC_SELECT_BANK (dev, 2); in poll4int()
246 while ((SMC_inw (dev, SMC91111_INT_REG) & mask) == 0) { in poll4int()
254 SMC_SELECT_BANK (dev, old_bank); in poll4int()
263 static inline void smc_wait_mmu_release_complete (struct eth_device *dev) in smc_wait_mmu_release_complete() argument
268 while (SMC_inw (dev, MMU_CMD_REG) & MC_BUSY) { in smc_wait_mmu_release_complete()
292 static void smc_reset (struct eth_device *dev) in smc_reset() argument
298 SMC_SELECT_BANK (dev, 0); in smc_reset()
299 SMC_outw (dev, RCR_SOFTRST, RCR_REG); in smc_reset()
305 SMC_SELECT_BANK (dev, 1); in smc_reset()
307 SMC_outw (dev, CONFIG_DEFAULT | CONFIG_EXT_PHY, CONFIG_REG); in smc_reset()
309 SMC_outw (dev, CONFIG_DEFAULT, CONFIG_REG); in smc_reset()
315 SMC_outw (dev, SMC_inw (dev, CONFIG_REG) | CONFIG_EPH_POWER_EN, in smc_reset()
318 SMC_SELECT_BANK (dev, 0); in smc_reset()
324 SMC_outw (dev, RCR_CLEAR, RCR_REG); in smc_reset()
325 SMC_outw (dev, TCR_CLEAR, TCR_REG); in smc_reset()
328 SMC_SELECT_BANK (dev, 1); in smc_reset()
329 SMC_outw (dev, CTL_DEFAULT, CTL_REG); in smc_reset()
332 SMC_SELECT_BANK (dev, 2); in smc_reset()
333 smc_wait_mmu_release_complete (dev); in smc_reset()
334 SMC_outw (dev, MC_RESET, MMU_CMD_REG); in smc_reset()
335 while (SMC_inw (dev, MMU_CMD_REG) & MC_BUSY) in smc_reset()
343 SMC_outb (dev, 0, IM_REG); in smc_reset()
354 static void smc_enable(struct eth_device *dev) in smc_enable() argument
357 SMC_SELECT_BANK( dev, 0 ); in smc_enable()
359 SMC_outw( dev, TCR_DEFAULT, TCR_REG ); in smc_enable()
360 SMC_outw( dev, RCR_DEFAULT, RCR_REG ); in smc_enable()
380 static void smc_halt(struct eth_device *dev) in smc_halt() argument
385 SMC_SELECT_BANK( dev, 2 ); in smc_halt()
386 SMC_outb( dev, 0, IM_REG ); in smc_halt()
389 SMC_SELECT_BANK( dev, 0 ); in smc_halt()
390 SMC_outb( dev, RCR_CLEAR, RCR_REG ); in smc_halt()
391 SMC_outb( dev, TCR_CLEAR, TCR_REG ); in smc_halt()
415 static int smc_send(struct eth_device *dev, void *packet, int packet_length) in smc_send() argument
428 SMC_SELECT_BANK (dev, 2); in smc_send()
429 saved_pnr = SMC_inb( dev, PN_REG ); in smc_send()
430 saved_ptr = SMC_inw( dev, PTR_REG ); in smc_send()
457 SMC_SELECT_BANK (dev, 2); in smc_send()
458 SMC_outw (dev, MC_ALLOC | numPages, MMU_CMD_REG); in smc_send()
471 status = SMC_inb (dev, SMC91111_INT_REG); in smc_send()
474 SMC_outb (dev, IM_ALLOC_INT, SMC91111_INT_REG); in smc_send()
494 packet_no = SMC_inb (dev, AR_REG); in smc_send()
502 SMC_outb (dev, packet_no, PN_REG); in smc_send()
509 SMC_outw (dev, PTR_AUTOINC, PTR_REG); in smc_send()
522 SMC_outl (dev, (length + 6) << 16, SMC91111_DATA_REG); in smc_send()
524 SMC_outw (dev, 0, SMC91111_DATA_REG); in smc_send()
526 SMC_outw (dev, (length + 6), SMC91111_DATA_REG); in smc_send()
537 SMC_outsl (dev, SMC91111_DATA_REG, buf, length >> 2); in smc_send()
539 SMC_outw (dev, *((word *) (buf + (length & 0xFFFFFFFC))), in smc_send()
542 SMC_outsw (dev, SMC91111_DATA_REG, buf, (length) >> 1); in smc_send()
547 SMC_outw (dev, 0, SMC91111_DATA_REG); in smc_send()
549 SMC_outw (dev, buf[length - 1] | 0x2000, SMC91111_DATA_REG); in smc_send()
553 SMC_outw (dev, MC_ENQUEUE, MMU_CMD_REG); in smc_send()
558 if (poll4int(dev, IM_TX_EMPTY_INT, SMC_TX_TIMEOUT)) { in smc_send()
566 while (SMC_inw (dev, MMU_CMD_REG) & MC_BUSY) { in smc_send()
576 SMC_outb (dev, IM_TX_EMPTY_INT, SMC91111_INT_REG); in smc_send()
585 while (SMC_inw (dev, MMU_CMD_REG) & MC_BUSY) { in smc_send()
595 SMC_outb( dev, saved_pnr, PN_REG ); in smc_send()
596 SMC_outw( dev, saved_ptr, PTR_REG ); in smc_send()
601 static int smc_write_hwaddr(struct eth_device *dev) in smc_write_hwaddr() argument
606 SMC_SELECT_BANK (dev, 1); in smc_write_hwaddr()
611 address = dev->enetaddr[i + 1] << 8; in smc_write_hwaddr()
612 address |= dev->enetaddr[i]; in smc_write_hwaddr()
613 SMC_outw(dev, address, (ADDR0_REG + i)); in smc_write_hwaddr()
617 SMC_outb(dev, dev->enetaddr[i], (ADDR0_REG + i)); in smc_write_hwaddr()
629 static int smc_init(struct eth_device *dev, bd_t *bd) in smc_init() argument
636 smc_reset (dev); in smc_init()
637 smc_enable (dev); in smc_init()
641 smc_phy_configure (dev); in smc_init()
648 printf(SMC_DEV_NAME ": MAC %pM\n", dev->enetaddr); in smc_init()
665 static int smc_rcv(struct eth_device *dev) in smc_rcv() argument
677 SMC_SELECT_BANK(dev, 2); in smc_rcv()
679 saved_pnr = SMC_inb( dev, PN_REG ); in smc_rcv()
680 saved_ptr = SMC_inw( dev, PTR_REG ); in smc_rcv()
682 packet_number = SMC_inw( dev, RXFIFO_REG ); in smc_rcv()
691 SMC_outw( dev, PTR_READ | PTR_RCV | PTR_AUTOINC, PTR_REG ); in smc_rcv()
695 stat_len = SMC_inl(dev, SMC91111_DATA_REG); in smc_rcv()
699 status = SMC_inw( dev, SMC91111_DATA_REG ); in smc_rcv()
700 packet_length = SMC_inw( dev, SMC91111_DATA_REG ); in smc_rcv()
724 SMC_insl(dev, SMC91111_DATA_REG, net_rx_packets[0], in smc_rcv()
732 dword leftover = SMC_inl(dev, SMC91111_DATA_REG); in smc_rcv()
739 SMC_insw(dev, SMC91111_DATA_REG , net_rx_packets[0], in smc_rcv()
754 while ( SMC_inw( dev, MMU_CMD_REG ) & MC_BUSY ) in smc_rcv()
758 SMC_outw( dev, MC_RELEASE, MMU_CMD_REG ); in smc_rcv()
760 while ( SMC_inw( dev, MMU_CMD_REG ) & MC_BUSY ) in smc_rcv()
764 SMC_outb( dev, saved_pnr, PN_REG ); in smc_rcv()
765 SMC_outw( dev, saved_ptr, PTR_REG ); in smc_rcv()
782 static word smc_modify_regbit(struct eth_device *dev, int bank, int ioaddr, int reg,
787 SMC_SELECT_BANK( dev, bank );
789 regval = SMC_inw( dev, reg );
795 SMC_outw( dev, regval, 0 );
803 static int smc_get_regbit(struct eth_device *dev, int bank, int ioaddr, int reg, unsigned int bit)
805 SMC_SELECT_BANK( dev, bank );
806 if ( SMC_inw( dev, reg ) & bit)
816 static void smc_modify_reg(struct eth_device *dev, int bank, int ioaddr, int reg, word val)
818 SMC_SELECT_BANK( dev, bank );
819 SMC_outw( dev, val, reg );
826 static int smc_get_reg(struct eth_device *dev, int bank, int ioaddr, int reg)
828 SMC_SELECT_BANK( dev, bank );
829 return(SMC_inw( dev, reg ));
882 static word smc_read_phy_register (struct eth_device *dev, byte phyreg) in smc_read_phy_register() argument
945 oldBank = SMC_inw (dev, BANK_SELECT); in smc_read_phy_register()
948 SMC_SELECT_BANK (dev, 3); in smc_read_phy_register()
951 mii_reg = SMC_inw (dev, MII_REG); in smc_read_phy_register()
959 SMC_outw (dev, mii_reg | bits[i], MII_REG); in smc_read_phy_register()
964 SMC_outw (dev, mii_reg | bits[i] | MII_MCLK, MII_REG); in smc_read_phy_register()
966 bits[i] |= SMC_inw (dev, MII_REG) & MII_MDI; in smc_read_phy_register()
971 SMC_outw (dev, mii_reg, MII_REG); in smc_read_phy_register()
975 SMC_SELECT_BANK (dev, oldBank); in smc_read_phy_register()
999 static void smc_write_phy_register (struct eth_device *dev, byte phyreg, in smc_write_phy_register() argument
1066 oldBank = SMC_inw (dev, BANK_SELECT); in smc_write_phy_register()
1069 SMC_SELECT_BANK (dev, 3); in smc_write_phy_register()
1072 mii_reg = SMC_inw (dev, MII_REG); in smc_write_phy_register()
1080 SMC_outw (dev, mii_reg | bits[i], MII_REG); in smc_write_phy_register()
1085 SMC_outw (dev, mii_reg | bits[i] | MII_MCLK, MII_REG); in smc_write_phy_register()
1087 bits[i] |= SMC_inw (dev, MII_REG) & MII_MDI; in smc_write_phy_register()
1092 SMC_outw (dev, mii_reg, MII_REG); in smc_write_phy_register()
1096 SMC_SELECT_BANK (dev, oldBank); in smc_write_phy_register()
1112 static void smc_phy_configure (struct eth_device *dev) in smc_phy_configure() argument
1122 smc_write_phy_register (dev, PHY_CNTL_REG, PHY_CNTL_RST); in smc_phy_configure()
1127 if (!(smc_read_phy_register (dev, PHY_CNTL_REG) in smc_phy_configure()
1146 smc_write_phy_register (dev, PHY_MASK_REG, 0xffff); in smc_phy_configure()
1149 SMC_SELECT_BANK (dev, 0); in smc_phy_configure()
1150 SMC_outw (dev, RPC_DEFAULT, RPC_REG); in smc_phy_configure()
1153 my_phy_caps = smc_read_phy_register (dev, PHY_STAT_REG); in smc_phy_configure()
1172 smc_write_phy_register (dev, PHY_AD_REG, my_ad_caps); in smc_phy_configure()
1177 smc_read_phy_register(dev, PHY_AD_REG); in smc_phy_configure()
1183 smc_write_phy_register (dev, PHY_CNTL_REG, in smc_phy_configure()
1192 status = smc_read_phy_register (dev, PHY_STAT_REG); in smc_phy_configure()
1208 smc_write_phy_register (dev, PHY_CNTL_REG, in smc_phy_configure()
1226 SMC_outw (dev, RPC_DEFAULT, RPC_REG); in smc_phy_configure()
1274 struct eth_device *dev; in smc91111_initialize() local
1280 dev = malloc(sizeof(*dev)); in smc91111_initialize()
1281 if (!dev) { in smc91111_initialize()
1286 memset(dev, 0, sizeof(*dev)); in smc91111_initialize()
1288 dev->priv = priv; in smc91111_initialize()
1289 dev->iobase = base_addr; in smc91111_initialize()
1292 SMC_SELECT_BANK(dev, 1); in smc91111_initialize()
1294 dev->enetaddr[i] = SMC_inb(dev, (ADDR0_REG + i)); in smc91111_initialize()
1297 dev->init = smc_init; in smc91111_initialize()
1298 dev->halt = smc_halt; in smc91111_initialize()
1299 dev->send = smc_send; in smc91111_initialize()
1300 dev->recv = smc_rcv; in smc91111_initialize()
1301 dev->write_hwaddr = smc_write_hwaddr; in smc91111_initialize()
1302 sprintf(dev->name, "%s-%hu", SMC_DEV_NAME, dev_num); in smc91111_initialize()
1304 eth_register(dev); in smc91111_initialize()