Lines Matching refs:dev
117 static int smc_get_ethaddr(struct bd_info *bd, struct eth_device *dev);
118 static int get_rom_mac(struct eth_device *dev, unsigned char *v_rom_mac);
144 void dump_memory_info(struct eth_device *dev) in dump_memory_info() argument
149 old_bank = SMC_inw(dev, LAN91C96_BANK_SELECT) & 0xF; in dump_memory_info()
151 SMC_SELECT_BANK(dev, 0); in dump_memory_info()
152 mem_info = SMC_inw(dev, LAN91C96_MIR); in dump_memory_info()
155 SMC_SELECT_BANK(dev, old_bank); in dump_memory_info()
165 static int poll4int (struct eth_device *dev, byte mask, int timeout) in poll4int() argument
169 word old_bank = SMC_inw(dev, LAN91C96_BANK_SELECT); in poll4int()
172 SMC_SELECT_BANK(dev, 2); in poll4int()
173 while ((SMC_inw(dev, LAN91C96_INT_STATS) & mask) == 0) { in poll4int()
181 SMC_SELECT_BANK(dev, old_bank); in poll4int()
206 static void smc_reset(struct eth_device *dev) in smc_reset() argument
208 PRINTK2("%s:smc_reset\n", dev->name); in smc_reset()
212 SMC_SELECT_BANK(dev, 0); in smc_reset()
213 SMC_outw(dev, LAN91C96_RCR_SOFT_RST, LAN91C96_RCR); in smc_reset()
218 SMC_outw(dev, 0, LAN91C96_RCR); in smc_reset()
219 SMC_outw(dev, 0, LAN91C96_TCR); in smc_reset()
222 SMC_SELECT_BANK(dev, 1); in smc_reset()
223 SMC_outw(dev, SMC_inw(dev, LAN91C96_CONTROL) | LAN91C96_CTR_BIT_8, in smc_reset()
227 SMC_outb(dev, 0, LAN91C96_INT_MASK); in smc_reset()
238 static void smc_enable(struct eth_device *dev) in smc_enable() argument
240 PRINTK2("%s:smc_enable\n", dev->name); in smc_enable()
241 SMC_SELECT_BANK(dev, 0); in smc_enable()
245 SMC_outw(dev, LAN91C96_MCR_TRANSMIT_PAGES, LAN91C96_MCR); in smc_enable()
248 SMC_outw(dev, LAN91C96_TCR_TXENA, LAN91C96_TCR); in smc_enable()
255 SMC_outw(dev, LAN91C96_RCR_RXEN | LAN91C96_RCR_PRMS, LAN91C96_RCR); in smc_enable()
272 static void smc_shutdown(struct eth_device *dev) in smc_shutdown() argument
274 PRINTK2("%s:smc_shutdown\n", dev->name); in smc_shutdown()
277 SMC_SELECT_BANK(dev, 2); in smc_shutdown()
278 SMC_outb(dev, 0, LAN91C96_INT_MASK); in smc_shutdown()
281 SMC_SELECT_BANK(dev, 0); in smc_shutdown()
282 SMC_outb(dev, 0, LAN91C96_RCR); in smc_shutdown()
283 SMC_outb(dev, 0, LAN91C96_TCR); in smc_shutdown()
305 static int smc_send_packet(struct eth_device *dev, void *packet, in smc_send_packet() argument
317 PRINTK3("%s:smc_hardware_send_packet\n", dev->name); in smc_send_packet()
337 printf("%s: Far too big packet error. \n", dev->name); in smc_send_packet()
343 SMC_SELECT_BANK(dev, 2); in smc_send_packet()
344 SMC_outw(dev, LAN91C96_MMUCR_ALLOC_TX | numPages, LAN91C96_MMU); in smc_send_packet()
350 status = SMC_inb(dev, LAN91C96_INT_STATS); in smc_send_packet()
353 SMC_outb(dev, LAN91C96_IST_ALLOC_INT, in smc_send_packet()
361 dev->name, try); in smc_send_packet()
369 dev->name, try); in smc_send_packet()
375 packet_no = SMC_inb(dev, LAN91C96_ARR); in smc_send_packet()
378 printf("%s: Memory allocation failed. \n", dev->name); in smc_send_packet()
383 SMC_outb(dev, packet_no, LAN91C96_PNR); in smc_send_packet()
386 SMC_outw(dev, LAN91C96_PTR_AUTO_INCR, LAN91C96_POINTER); in smc_send_packet()
389 dev->name, length); in smc_send_packet()
399 SMC_outl(dev, (length + 6) << 16, LAN91C96_DATA_HIGH); in smc_send_packet()
401 SMC_outw(dev, 0, LAN91C96_DATA_HIGH); in smc_send_packet()
403 SMC_outw(dev, (length + 6), LAN91C96_DATA_HIGH); in smc_send_packet()
414 SMC_outsl(dev, LAN91C96_DATA_HIGH, buf, length >> 2); in smc_send_packet()
416 SMC_outw(dev, *((word *) (buf + (length & 0xFFFFFFFC))), in smc_send_packet()
419 SMC_outsw(dev, LAN91C96_DATA_HIGH, buf, (length) >> 1); in smc_send_packet()
424 SMC_outw(dev, 0, LAN91C96_DATA_HIGH); in smc_send_packet()
426 SMC_outw(dev, buf[length - 1] | 0x2000, LAN91C96_DATA_HIGH); in smc_send_packet()
430 SMC_outw(dev, LAN91C96_MMUCR_ENQUEUE, LAN91C96_MMU); in smc_send_packet()
433 if (poll4int (dev, LAN91C96_MSK_TX_INT, SMC_TX_TIMEOUT)) { in smc_send_packet()
435 PRINTK2("%s: TX timeout, sending failed...\n", dev->name); in smc_send_packet()
438 SMC_outw(dev, LAN91C96_MMUCR_RELEASE_TX, LAN91C96_MMU); in smc_send_packet()
441 while (SMC_inw(dev, LAN91C96_MMU) & LAN91C96_MMUCR_NO_BUSY) in smc_send_packet()
450 SMC_outw(dev, LAN91C96_IST_TX_INT, LAN91C96_INT_STATS); in smc_send_packet()
452 PRINTK2("%s: Sent packet of length %d \n", dev->name, length); in smc_send_packet()
455 SMC_outw(dev, LAN91C96_MMUCR_RELEASE_TX, LAN91C96_MMU); in smc_send_packet()
458 while (SMC_inw(dev, LAN91C96_MMU) & LAN91C96_MMUCR_NO_BUSY) in smc_send_packet()
474 static int smc_open(struct bd_info *bd, struct eth_device *dev) in smc_open() argument
478 PRINTK2("%s:smc_open\n", dev->name); in smc_open()
482 smc_reset(dev); in smc_open()
483 smc_enable(dev); in smc_open()
485 SMC_SELECT_BANK(dev, 1); in smc_open()
487 err = smc_get_ethaddr(bd, dev); in smc_open()
496 SMC_outw(dev, address, LAN91C96_IA0 + i); in smc_open()
500 SMC_outb(dev, smc_mac_addr[i], LAN91C96_IA0 + i); in smc_open()
517 static int smc_rcv(struct eth_device *dev) in smc_rcv() argument
529 SMC_SELECT_BANK(dev, 2); in smc_rcv()
530 packet_number = SMC_inw(dev, LAN91C96_FIFO); in smc_rcv()
536 PRINTK3("%s:smc_rcv\n", dev->name); in smc_rcv()
538 SMC_outw(dev, LAN91C96_PTR_READ | LAN91C96_PTR_RCV | in smc_rcv()
543 stat_len = SMC_inl(dev, LAN91C96_DATA_HIGH); in smc_rcv()
547 status = SMC_inw(dev, LAN91C96_DATA_HIGH); in smc_rcv()
548 packet_length = SMC_inw(dev, LAN91C96_DATA_HIGH); in smc_rcv()
572 SMC_insl(dev, LAN91C96_DATA_HIGH, net_rx_packets[0], in smc_rcv()
580 dword leftover = SMC_inl(dev, LAN91C96_DATA_HIGH); in smc_rcv()
588 SMC_insw(dev, LAN91C96_DATA_HIGH, net_rx_packets[0], in smc_rcv()
603 while (SMC_inw(dev, LAN91C96_MMU) & LAN91C96_MMUCR_NO_BUSY) in smc_rcv()
607 SMC_outw(dev, LAN91C96_MMUCR_RELEASE_RX, LAN91C96_MMU); in smc_rcv()
609 while (SMC_inw(dev, LAN91C96_MMU) & LAN91C96_MMUCR_NO_BUSY) in smc_rcv()
630 static int smc_close(struct eth_device *dev) in smc_close() argument
632 PRINTK2("%s:smc_close\n", dev->name); in smc_close()
635 smc_shutdown(dev); in smc_close()
677 static int lan91c96_init(struct eth_device *dev, struct bd_info *bd) in lan91c96_init() argument
679 return smc_open(bd, dev); in lan91c96_init()
682 static void lan91c96_halt(struct eth_device *dev) in lan91c96_halt() argument
684 smc_close(dev); in lan91c96_halt()
687 static int lan91c96_recv(struct eth_device *dev) in lan91c96_recv() argument
689 return smc_rcv(dev); in lan91c96_recv()
692 static int lan91c96_send(struct eth_device *dev, void *packet, in lan91c96_send() argument
695 return smc_send_packet(dev, packet, length); in lan91c96_send()
704 static int smc_get_ethaddr(struct bd_info *bd, struct eth_device *dev) in smc_get_ethaddr() argument
710 if (!get_rom_mac(dev, v_mac)) { in smc_get_ethaddr()
727 static int get_rom_mac(struct eth_device *dev, unsigned char *v_rom_mac) in get_rom_mac() argument
730 SMC_SELECT_BANK(dev, 1); in get_rom_mac()
733 v_rom_mac[i] = SMC_inb(dev, LAN91C96_IA0 + i); in get_rom_mac()
757 static int lan91c96_detect_chip(struct eth_device *dev) in lan91c96_detect_chip() argument
761 SMC_SELECT_BANK(dev, 3); in lan91c96_detect_chip()
762 chip_id = (SMC_inw(dev, 0xA) & LAN91C96_REV_CHIPID) >> 4; in lan91c96_detect_chip()
763 SMC_SELECT_BANK(dev, 0); in lan91c96_detect_chip()
772 struct eth_device *dev; in lan91c96_initialize() local
775 dev = malloc(sizeof(*dev)); in lan91c96_initialize()
776 if (!dev) { in lan91c96_initialize()
779 memset(dev, 0, sizeof(*dev)); in lan91c96_initialize()
781 dev->iobase = base_addr; in lan91c96_initialize()
784 r = lan91c96_detect_chip(dev); in lan91c96_initialize()
786 free(dev); in lan91c96_initialize()
789 get_rom_mac(dev, dev->enetaddr); in lan91c96_initialize()
791 dev->init = lan91c96_init; in lan91c96_initialize()
792 dev->halt = lan91c96_halt; in lan91c96_initialize()
793 dev->send = lan91c96_send; in lan91c96_initialize()
794 dev->recv = lan91c96_recv; in lan91c96_initialize()
795 sprintf(dev->name, "%s-%hu", supported_chips[r].name, dev_num); in lan91c96_initialize()
797 eth_register(dev); in lan91c96_initialize()