Lines Matching refs:dev
116 static int smc_get_ethaddr(bd_t *bd, struct eth_device *dev);
117 static int get_rom_mac(struct eth_device *dev, unsigned char *v_rom_mac);
143 void dump_memory_info(struct eth_device *dev) in dump_memory_info() argument
148 old_bank = SMC_inw(dev, LAN91C96_BANK_SELECT) & 0xF; in dump_memory_info()
150 SMC_SELECT_BANK(dev, 0); in dump_memory_info()
151 mem_info = SMC_inw(dev, LAN91C96_MIR); in dump_memory_info()
154 SMC_SELECT_BANK(dev, old_bank); in dump_memory_info()
164 static int poll4int (struct eth_device *dev, byte mask, int timeout) in poll4int() argument
168 word old_bank = SMC_inw(dev, LAN91C96_BANK_SELECT); in poll4int()
171 SMC_SELECT_BANK(dev, 2); in poll4int()
172 while ((SMC_inw(dev, LAN91C96_INT_STATS) & mask) == 0) { in poll4int()
180 SMC_SELECT_BANK(dev, old_bank); in poll4int()
205 static void smc_reset(struct eth_device *dev) in smc_reset() argument
207 PRINTK2("%s:smc_reset\n", dev->name); in smc_reset()
211 SMC_SELECT_BANK(dev, 0); in smc_reset()
212 SMC_outw(dev, LAN91C96_RCR_SOFT_RST, LAN91C96_RCR); in smc_reset()
217 SMC_outw(dev, 0, LAN91C96_RCR); in smc_reset()
218 SMC_outw(dev, 0, LAN91C96_TCR); in smc_reset()
221 SMC_SELECT_BANK(dev, 1); in smc_reset()
222 SMC_outw(dev, SMC_inw(dev, LAN91C96_CONTROL) | LAN91C96_CTR_BIT_8, in smc_reset()
226 SMC_outb(dev, 0, LAN91C96_INT_MASK); in smc_reset()
237 static void smc_enable(struct eth_device *dev) in smc_enable() argument
239 PRINTK2("%s:smc_enable\n", dev->name); in smc_enable()
240 SMC_SELECT_BANK(dev, 0); in smc_enable()
244 SMC_outw(dev, LAN91C96_MCR_TRANSMIT_PAGES, LAN91C96_MCR); in smc_enable()
247 SMC_outw(dev, LAN91C96_TCR_TXENA, LAN91C96_TCR); in smc_enable()
254 SMC_outw(dev, LAN91C96_RCR_RXEN | LAN91C96_RCR_PRMS, LAN91C96_RCR); in smc_enable()
271 static void smc_shutdown(struct eth_device *dev) in smc_shutdown() argument
273 PRINTK2("%s:smc_shutdown\n", dev->name); in smc_shutdown()
276 SMC_SELECT_BANK(dev, 2); in smc_shutdown()
277 SMC_outb(dev, 0, LAN91C96_INT_MASK); in smc_shutdown()
280 SMC_SELECT_BANK(dev, 0); in smc_shutdown()
281 SMC_outb(dev, 0, LAN91C96_RCR); in smc_shutdown()
282 SMC_outb(dev, 0, LAN91C96_TCR); in smc_shutdown()
304 static int smc_send_packet(struct eth_device *dev, void *packet, in smc_send_packet() argument
316 PRINTK3("%s:smc_hardware_send_packet\n", dev->name); in smc_send_packet()
336 printf("%s: Far too big packet error. \n", dev->name); in smc_send_packet()
342 SMC_SELECT_BANK(dev, 2); in smc_send_packet()
343 SMC_outw(dev, LAN91C96_MMUCR_ALLOC_TX | numPages, LAN91C96_MMU); in smc_send_packet()
349 status = SMC_inb(dev, LAN91C96_INT_STATS); in smc_send_packet()
352 SMC_outb(dev, LAN91C96_IST_ALLOC_INT, in smc_send_packet()
360 dev->name, try); in smc_send_packet()
368 dev->name, try); in smc_send_packet()
374 packet_no = SMC_inb(dev, LAN91C96_ARR); in smc_send_packet()
377 printf("%s: Memory allocation failed. \n", dev->name); in smc_send_packet()
382 SMC_outb(dev, packet_no, LAN91C96_PNR); in smc_send_packet()
385 SMC_outw(dev, LAN91C96_PTR_AUTO_INCR, LAN91C96_POINTER); in smc_send_packet()
388 dev->name, length); in smc_send_packet()
398 SMC_outl(dev, (length + 6) << 16, LAN91C96_DATA_HIGH); in smc_send_packet()
400 SMC_outw(dev, 0, LAN91C96_DATA_HIGH); in smc_send_packet()
402 SMC_outw(dev, (length + 6), LAN91C96_DATA_HIGH); in smc_send_packet()
413 SMC_outsl(dev, LAN91C96_DATA_HIGH, buf, length >> 2); in smc_send_packet()
415 SMC_outw(dev, *((word *) (buf + (length & 0xFFFFFFFC))), in smc_send_packet()
418 SMC_outsw(dev, LAN91C96_DATA_HIGH, buf, (length) >> 1); in smc_send_packet()
423 SMC_outw(dev, 0, LAN91C96_DATA_HIGH); in smc_send_packet()
425 SMC_outw(dev, buf[length - 1] | 0x2000, LAN91C96_DATA_HIGH); in smc_send_packet()
429 SMC_outw(dev, LAN91C96_MMUCR_ENQUEUE, LAN91C96_MMU); in smc_send_packet()
432 if (poll4int (dev, LAN91C96_MSK_TX_INT, SMC_TX_TIMEOUT)) { in smc_send_packet()
434 PRINTK2("%s: TX timeout, sending failed...\n", dev->name); in smc_send_packet()
437 SMC_outw(dev, LAN91C96_MMUCR_RELEASE_TX, LAN91C96_MMU); in smc_send_packet()
440 while (SMC_inw(dev, LAN91C96_MMU) & LAN91C96_MMUCR_NO_BUSY) in smc_send_packet()
449 SMC_outw(dev, LAN91C96_IST_TX_INT, LAN91C96_INT_STATS); in smc_send_packet()
451 PRINTK2("%s: Sent packet of length %d \n", dev->name, length); in smc_send_packet()
454 SMC_outw(dev, LAN91C96_MMUCR_RELEASE_TX, LAN91C96_MMU); in smc_send_packet()
457 while (SMC_inw(dev, LAN91C96_MMU) & LAN91C96_MMUCR_NO_BUSY) in smc_send_packet()
473 static int smc_open(bd_t *bd, struct eth_device *dev) in smc_open() argument
477 PRINTK2("%s:smc_open\n", dev->name); in smc_open()
481 smc_reset(dev); in smc_open()
482 smc_enable(dev); in smc_open()
484 SMC_SELECT_BANK(dev, 1); in smc_open()
486 err = smc_get_ethaddr(bd, dev); in smc_open()
495 SMC_outw(dev, address, LAN91C96_IA0 + i); in smc_open()
499 SMC_outb(dev, smc_mac_addr[i], LAN91C96_IA0 + i); in smc_open()
516 static int smc_rcv(struct eth_device *dev) in smc_rcv() argument
528 SMC_SELECT_BANK(dev, 2); in smc_rcv()
529 packet_number = SMC_inw(dev, LAN91C96_FIFO); in smc_rcv()
535 PRINTK3("%s:smc_rcv\n", dev->name); in smc_rcv()
537 SMC_outw(dev, LAN91C96_PTR_READ | LAN91C96_PTR_RCV | in smc_rcv()
542 stat_len = SMC_inl(dev, LAN91C96_DATA_HIGH); in smc_rcv()
546 status = SMC_inw(dev, LAN91C96_DATA_HIGH); in smc_rcv()
547 packet_length = SMC_inw(dev, LAN91C96_DATA_HIGH); in smc_rcv()
571 SMC_insl(dev, LAN91C96_DATA_HIGH, net_rx_packets[0], in smc_rcv()
579 dword leftover = SMC_inl(dev, LAN91C96_DATA_HIGH); in smc_rcv()
587 SMC_insw(dev, LAN91C96_DATA_HIGH, net_rx_packets[0], in smc_rcv()
602 while (SMC_inw(dev, LAN91C96_MMU) & LAN91C96_MMUCR_NO_BUSY) in smc_rcv()
606 SMC_outw(dev, LAN91C96_MMUCR_RELEASE_RX, LAN91C96_MMU); in smc_rcv()
608 while (SMC_inw(dev, LAN91C96_MMU) & LAN91C96_MMUCR_NO_BUSY) in smc_rcv()
629 static int smc_close(struct eth_device *dev) in smc_close() argument
631 PRINTK2("%s:smc_close\n", dev->name); in smc_close()
634 smc_shutdown(dev); in smc_close()
676 static int lan91c96_init(struct eth_device *dev, bd_t *bd) in lan91c96_init() argument
678 return smc_open(bd, dev); in lan91c96_init()
681 static void lan91c96_halt(struct eth_device *dev) in lan91c96_halt() argument
683 smc_close(dev); in lan91c96_halt()
686 static int lan91c96_recv(struct eth_device *dev) in lan91c96_recv() argument
688 return smc_rcv(dev); in lan91c96_recv()
691 static int lan91c96_send(struct eth_device *dev, void *packet, in lan91c96_send() argument
694 return smc_send_packet(dev, packet, length); in lan91c96_send()
703 static int smc_get_ethaddr(bd_t *bd, struct eth_device *dev) in smc_get_ethaddr() argument
709 if (!get_rom_mac(dev, v_mac)) { in smc_get_ethaddr()
726 static int get_rom_mac(struct eth_device *dev, unsigned char *v_rom_mac) in get_rom_mac() argument
729 SMC_SELECT_BANK(dev, 1); in get_rom_mac()
732 v_rom_mac[i] = SMC_inb(dev, LAN91C96_IA0 + i); in get_rom_mac()
756 static int lan91c96_detect_chip(struct eth_device *dev) in lan91c96_detect_chip() argument
760 SMC_SELECT_BANK(dev, 3); in lan91c96_detect_chip()
761 chip_id = (SMC_inw(dev, 0xA) & LAN91C96_REV_CHIPID) >> 4; in lan91c96_detect_chip()
762 SMC_SELECT_BANK(dev, 0); in lan91c96_detect_chip()
771 struct eth_device *dev; in lan91c96_initialize() local
774 dev = malloc(sizeof(*dev)); in lan91c96_initialize()
775 if (!dev) { in lan91c96_initialize()
778 memset(dev, 0, sizeof(*dev)); in lan91c96_initialize()
780 dev->iobase = base_addr; in lan91c96_initialize()
783 r = lan91c96_detect_chip(dev); in lan91c96_initialize()
785 free(dev); in lan91c96_initialize()
788 get_rom_mac(dev, dev->enetaddr); in lan91c96_initialize()
790 dev->init = lan91c96_init; in lan91c96_initialize()
791 dev->halt = lan91c96_halt; in lan91c96_initialize()
792 dev->send = lan91c96_send; in lan91c96_initialize()
793 dev->recv = lan91c96_recv; in lan91c96_initialize()
794 sprintf(dev->name, "%s-%hu", supported_chips[r].name, dev_num); in lan91c96_initialize()
796 eth_register(dev); in lan91c96_initialize()