Lines Matching refs:enc
66 static void enc_bset(enc_dev_t *enc, const u8 reg, const u8 data) in enc_bset() argument
72 spi_xfer(enc->slave, 2 * 8, dout, NULL, in enc_bset()
76 static void enc_bclr(enc_dev_t *enc, const u8 reg, const u8 data) in enc_bclr() argument
82 spi_xfer(enc->slave, 2 * 8, dout, NULL, in enc_bclr()
94 static void enc_set_bank(enc_dev_t *enc, const u16 reg) in enc_set_bank() argument
98 if (newbank == 0 || newbank == enc->bank) in enc_set_bank()
102 enc_bclr(enc, CTL_REG_ECON1, in enc_set_bank()
106 enc_bset(enc, CTL_REG_ECON1, ENC_ECON1_BSEL0); in enc_set_bank()
107 enc_bclr(enc, CTL_REG_ECON1, ENC_ECON1_BSEL1); in enc_set_bank()
110 enc_bclr(enc, CTL_REG_ECON1, ENC_ECON1_BSEL0); in enc_set_bank()
111 enc_bset(enc, CTL_REG_ECON1, ENC_ECON1_BSEL1); in enc_set_bank()
114 enc_bset(enc, CTL_REG_ECON1, in enc_set_bank()
118 enc->bank = newbank; in enc_set_bank()
152 static u8 enc_r8(enc_dev_t *enc, const u16 reg) in enc_r8() argument
158 enc_set_bank(enc, reg); in enc_r8()
160 spi_xfer(enc->slave, nbytes * 8, dout, din, in enc_r8()
169 static u16 enc_r16(enc_dev_t *enc, const u16 reg) in enc_r16() argument
176 enc_set_bank(enc, reg); in enc_r16()
178 spi_xfer(enc->slave, nbytes * 8, dout, din, in enc_r16()
182 spi_xfer(enc->slave, nbytes * 8, dout, din, in enc_r16()
191 static void enc_w8(enc_dev_t *enc, const u16 reg, const u8 data) in enc_w8() argument
195 enc_set_bank(enc, reg); in enc_w8()
198 spi_xfer(enc->slave, 2 * 8, dout, NULL, in enc_w8()
206 static void enc_w16(enc_dev_t *enc, const u16 reg, const u16 data) in enc_w16() argument
210 enc_set_bank(enc, reg); in enc_w16()
213 spi_xfer(enc->slave, 2 * 8, dout, NULL, in enc_w16()
217 spi_xfer(enc->slave, 2 * 8, dout, NULL, in enc_w16()
224 static void enc_w8_retry(enc_dev_t *enc, const u16 reg, const u8 data, const int c) in enc_w8_retry() argument
230 enc_set_bank(enc, reg); in enc_w8_retry()
234 spi_xfer(enc->slave, 2 * 8, dout, NULL, in enc_w8_retry()
236 readback = enc_r8(enc, reg); in enc_w8_retry()
243 printf("%s: write reg 0x%03x failed\n", enc->dev->name, reg); in enc_w8_retry()
250 static void enc_rbuf(enc_dev_t *enc, const u16 length, u8 *buf) in enc_rbuf() argument
255 spi_xfer(enc->slave, 8, dout, NULL, SPI_XFER_BEGIN); in enc_rbuf()
256 spi_xfer(enc->slave, length * 8, NULL, buf, SPI_XFER_END); in enc_rbuf()
266 static void enc_wbuf(enc_dev_t *enc, const u16 length, const u8 *buf, const u8 control) in enc_wbuf() argument
271 spi_xfer(enc->slave, 2 * 8, dout, NULL, SPI_XFER_BEGIN); in enc_wbuf()
272 spi_xfer(enc->slave, length * 8, buf, NULL, SPI_XFER_END); in enc_wbuf()
283 static int enc_claim_bus(enc_dev_t *enc) in enc_claim_bus() argument
285 int rc = spi_claim_bus(enc->slave); in enc_claim_bus()
287 printf("%s: failed to claim SPI bus\n", enc->dev->name); in enc_claim_bus()
296 static void enc_release_bus(enc_dev_t *enc) in enc_release_bus() argument
298 spi_release_bus(enc->slave); in enc_release_bus()
304 static u16 enc_phy_read(enc_dev_t *enc, const u8 addr) in enc_phy_read() argument
309 enc_w8(enc, CTL_REG_MIREGADR, addr); in enc_phy_read()
310 enc_w8(enc, CTL_REG_MICMD, ENC_MICMD_MIIRD); in enc_phy_read()
316 status = enc_r8(enc, CTL_REG_MISTAT); in enc_phy_read()
319 printf("%s: timeout reading phy\n", enc->dev->name); in enc_phy_read()
322 enc_w8(enc, CTL_REG_MICMD, 0); in enc_phy_read()
323 return enc_r16(enc, CTL_REG_MIRDL); in enc_phy_read()
329 static void enc_phy_write(enc_dev_t *enc, const u8 addr, const u16 data) in enc_phy_write() argument
334 enc_w8(enc, CTL_REG_MIREGADR, addr); in enc_phy_write()
335 enc_w16(enc, CTL_REG_MIWRL, data); in enc_phy_write()
341 status = enc_r8(enc, CTL_REG_MISTAT); in enc_phy_write()
344 printf("%s: timeout writing phy\n", enc->dev->name); in enc_phy_write()
356 static int enc_phy_link_wait(enc_dev_t *enc) in enc_phy_link_wait() argument
364 status = enc_phy_read(enc, PHY_REG_PHSTAT1); in enc_phy_link_wait()
372 status = enc_phy_read(enc, PHY_REG_PHSTAT1); in enc_phy_link_wait()
375 status = enc_phy_read(enc, PHY_REG_PHSTAT2); in enc_phy_link_wait()
378 enc->dev->name, duplex ? "full" : "half"); in enc_phy_link_wait()
385 printf("%s: link down\n", enc->dev->name); in enc_phy_link_wait()
392 static void enc_reset_rx(enc_dev_t *enc) in enc_reset_rx() argument
396 econ1 = enc_r8(enc, CTL_REG_ECON1); in enc_reset_rx()
398 enc_bset(enc, CTL_REG_ECON1, ENC_ECON1_RXRST); in enc_reset_rx()
399 enc->rx_reset_counter = RX_RESET_COUNTER; in enc_reset_rx()
406 static void enc_reset_rx_call(enc_dev_t *enc) in enc_reset_rx_call() argument
408 enc_bclr(enc, CTL_REG_ECON1, ENC_ECON1_RXRST); in enc_reset_rx_call()
409 enc_bset(enc, CTL_REG_ECON1, ENC_ECON1_RXEN); in enc_reset_rx_call()
416 static void enc_receive(enc_dev_t *enc) in enc_receive() argument
426 enc_w16(enc, CTL_REG_ERDPTL, enc->next_pointer); in enc_receive()
428 enc_rbuf(enc, 6, hbuf); in enc_receive()
429 enc->next_pointer = hbuf[0] | (hbuf[1] << 8); in enc_receive()
433 enc->next_pointer, pkt_len, status); in enc_receive()
441 if (enc->next_pointer >= ENC_TX_BUF_START) in enc_receive()
444 enc_rbuf(enc, copy_len, packet); in enc_receive()
447 enc_w16(enc, CTL_REG_ERDPTL, enc->next_pointer); in enc_receive()
449 enc_bset(enc, CTL_REG_ECON2, ENC_ECON2_PKTDEC); in enc_receive()
454 rxbuf_rdpt = enc->next_pointer - 1; in enc_receive()
455 if ((rxbuf_rdpt < enc_r16(enc, CTL_REG_ERXSTL)) || in enc_receive()
456 (rxbuf_rdpt > enc_r16(enc, CTL_REG_ERXNDL))) { in enc_receive()
457 enc_w16(enc, CTL_REG_ERXRDPTL, in enc_receive()
458 enc_r16(enc, CTL_REG_ERXNDL)); in enc_receive()
460 enc_w16(enc, CTL_REG_ERXRDPTL, rxbuf_rdpt); in enc_receive()
463 pkt_cnt = enc_r8(enc, CTL_REG_EPKTCNT); in enc_receive()
465 (void)enc_r8(enc, CTL_REG_EIR); in enc_receive()
466 enc_reset_rx(enc); in enc_receive()
467 printf("%s: receive copy_len=0\n", enc->dev->name); in enc_receive()
475 enc_release_bus(enc); in enc_receive()
477 if (enc_claim_bus(enc)) in enc_receive()
479 (void)enc_r8(enc, CTL_REG_EIR); in enc_receive()
487 static void enc_poll(enc_dev_t *enc) in enc_poll() argument
492 (void)enc_r8(enc, CTL_REG_ESTAT); in enc_poll()
493 eir_reg = enc_r8(enc, CTL_REG_EIR); in enc_poll()
496 enc_bclr(enc, CTL_REG_EIR, ENC_EIR_TXIF); in enc_poll()
499 pkt_cnt = enc_r8(enc, CTL_REG_EPKTCNT); in enc_poll()
504 enc_receive(enc); in enc_poll()
509 enc_bclr(enc, CTL_REG_EIR, ENC_EIR_PKTIF); in enc_poll()
512 printf("%s: rx error\n", enc->dev->name); in enc_poll()
513 enc_bclr(enc, CTL_REG_EIR, ENC_EIR_RXERIF); in enc_poll()
516 printf("%s: tx error\n", enc->dev->name); in enc_poll()
517 enc_bclr(enc, CTL_REG_EIR, ENC_EIR_TXERIF); in enc_poll()
524 static void enc_reset(enc_dev_t *enc) in enc_reset() argument
529 spi_xfer(enc->slave, 8, dout, NULL, in enc_reset()
607 static int enc_clock_wait(enc_dev_t *enc) in enc_clock_wait() argument
620 if (enc_r8(enc, CTL_REG_ESTAT) & ENC_ESTAT_CLKRDY) in enc_clock_wait()
624 printf("%s: timeout waiting for CLKRDY\n", enc->dev->name); in enc_clock_wait()
631 static int enc_write_macaddr(enc_dev_t *enc) in enc_write_macaddr() argument
633 unsigned char *p = enc->dev->enetaddr; in enc_write_macaddr()
635 enc_w8_retry(enc, CTL_REG_MAADR5, *p++, 5); in enc_write_macaddr()
636 enc_w8_retry(enc, CTL_REG_MAADR4, *p++, 5); in enc_write_macaddr()
637 enc_w8_retry(enc, CTL_REG_MAADR3, *p++, 5); in enc_write_macaddr()
638 enc_w8_retry(enc, CTL_REG_MAADR2, *p++, 5); in enc_write_macaddr()
639 enc_w8_retry(enc, CTL_REG_MAADR1, *p++, 5); in enc_write_macaddr()
640 enc_w8_retry(enc, CTL_REG_MAADR0, *p, 5); in enc_write_macaddr()
647 static int enc_setup(enc_dev_t *enc) in enc_setup() argument
654 enc->next_pointer = ENC_RX_BUF_START; in enc_setup()
655 enc->rx_reset_counter = RX_RESET_COUNTER; in enc_setup()
656 enc->bank = 0xff; /* invalidate current bank in enc28j60 */ in enc_setup()
659 phid1 = enc_phy_read(enc, PHY_REG_PHID1); in enc_setup()
660 phid2 = enc_phy_read(enc, PHY_REG_PHID2) & ENC_PHID2_MASK; in enc_setup()
663 enc->dev->name, phid1, phid2); in enc_setup()
669 enc_w8_retry(enc, tp[0], tp[1], 10); in enc_setup()
675 enc_phy_write(enc, PHY_REG_PHCON2, (1<<8)); in enc_setup()
683 enc_phy_write(enc, PHY_REG_PHLCON, 0x0472); in enc_setup()
686 enc_phy_write(enc, PHY_REG_PHCON1, 0); in enc_setup()
696 static int enc_initcheck(enc_dev_t *enc, const enum enc_initstate requiredstate) in enc_initcheck() argument
698 if (enc->initstate >= requiredstate) in enc_initcheck()
701 if (enc->initstate < setupdone) { in enc_initcheck()
703 enc_reset(enc); in enc_initcheck()
705 if (enc_clock_wait(enc) || enc_setup(enc) || enc_write_macaddr(enc)) { in enc_initcheck()
708 enc->initstate = setupdone; in enc_initcheck()
711 if (enc->initstate >= requiredstate) in enc_initcheck()
715 if (enc_phy_link_wait(enc)) { in enc_initcheck()
718 enc->initstate = linkready; in enc_initcheck()
732 enc_dev_t *enc; in enc_miiphy_read() local
737 enc = dev->priv; in enc_miiphy_read()
738 if (enc_claim_bus(enc)) in enc_miiphy_read()
740 if (enc_initcheck(enc, setupdone)) { in enc_miiphy_read()
741 enc_release_bus(enc); in enc_miiphy_read()
744 value = enc_phy_read(enc, reg); in enc_miiphy_read()
745 enc_release_bus(enc); in enc_miiphy_read()
758 enc_dev_t *enc; in enc_miiphy_write() local
763 enc = dev->priv; in enc_miiphy_write()
764 if (enc_claim_bus(enc)) in enc_miiphy_write()
766 if (enc_initcheck(enc, setupdone)) { in enc_miiphy_write()
767 enc_release_bus(enc); in enc_miiphy_write()
770 enc_phy_write(enc, reg, value); in enc_miiphy_write()
771 enc_release_bus(enc); in enc_miiphy_write()
783 enc_dev_t *enc = dev->priv; in enc_write_hwaddr() local
785 if (enc_claim_bus(enc)) in enc_write_hwaddr()
787 if (enc_initcheck(enc, setupdone)) { in enc_write_hwaddr()
788 enc_release_bus(enc); in enc_write_hwaddr()
791 enc_release_bus(enc); in enc_write_hwaddr()
802 enc_dev_t *enc = dev->priv; in enc_init() local
804 if (enc_claim_bus(enc)) in enc_init()
806 if (enc_initcheck(enc, linkready)) { in enc_init()
807 enc_release_bus(enc); in enc_init()
811 enc_bset(enc, CTL_REG_ECON1, ENC_ECON1_RXEN); in enc_init()
812 enc_release_bus(enc); in enc_init()
823 enc_dev_t *enc = dev->priv; in enc_recv() local
825 if (enc_claim_bus(enc)) in enc_recv()
827 if (enc_initcheck(enc, linkready)) { in enc_recv()
828 enc_release_bus(enc); in enc_recv()
832 if (enc->rx_reset_counter > 0) in enc_recv()
833 enc->rx_reset_counter--; in enc_recv()
835 enc_reset_rx_call(enc); in enc_recv()
836 enc_poll(enc); in enc_recv()
837 enc_release_bus(enc); in enc_recv()
854 enc_dev_t *enc = dev->priv; in enc_send() local
856 if (enc_claim_bus(enc)) in enc_send()
858 if (enc_initcheck(enc, linkready)) { in enc_send()
859 enc_release_bus(enc); in enc_send()
863 enc_w16(enc, CTL_REG_EWRPTL, ENC_TX_BUF_START); in enc_send()
864 enc_w16(enc, CTL_REG_ETXNDL, length + ENC_TX_BUF_START); in enc_send()
865 enc_w16(enc, CTL_REG_ETXSTL, ENC_TX_BUF_START); in enc_send()
867 enc_wbuf(enc, length, (u8 *) packet, 0x00); in enc_send()
873 if (enc_r8(enc, CTL_REG_EIR) & ENC_EIR_TXERIF) { in enc_send()
874 enc_bset(enc, CTL_REG_ECON1, ENC_ECON1_TXRST); in enc_send()
875 enc_bclr(enc, CTL_REG_ECON1, ENC_ECON1_TXRST); in enc_send()
877 enc_bclr(enc, CTL_REG_EIR, (ENC_EIR_TXERIF | ENC_EIR_TXIF)); in enc_send()
879 enc_bset(enc, CTL_REG_ECON1, ENC_ECON1_TXRTS); in enc_send()
880 enc_release_bus(enc); in enc_send()
891 enc_dev_t *enc = dev->priv; in enc_halt() local
893 if (enc_claim_bus(enc)) in enc_halt()
896 enc_bclr(enc, CTL_REG_ECON1, ENC_ECON1_RXEN); in enc_halt()
897 enc_release_bus(enc); in enc_halt()
909 enc_dev_t *enc; in enc28j60_initialize() local
919 enc = malloc(sizeof(*enc)); in enc28j60_initialize()
920 if (!enc) { in enc28j60_initialize()
924 memset(enc, 0, sizeof(*enc)); in enc28j60_initialize()
927 enc->slave = spi_setup_slave(bus, cs, max_hz, mode); in enc28j60_initialize()
928 if (!enc->slave) { in enc28j60_initialize()
930 free(enc); in enc28j60_initialize()
935 enc->dev = dev; in enc28j60_initialize()
937 dev->priv = enc; in enc28j60_initialize()