Lines Matching refs:dev
106 static u8 ks_rdreg8(struct eth_device *dev, u16 offset) in ks_rdreg8() argument
111 writew(offset | (BE0 << shift_bit), dev->iobase + 2); in ks_rdreg8()
113 return (u8)(readw(dev->iobase) >> shift_data); in ks_rdreg8()
116 static u16 ks_rdreg16(struct eth_device *dev, u16 offset) in ks_rdreg16() argument
118 writew(offset | ((BE1 | BE0) << (offset & 0x02)), dev->iobase + 2); in ks_rdreg16()
120 return readw(dev->iobase); in ks_rdreg16()
123 static void ks_wrreg8(struct eth_device *dev, u16 offset, u8 val) in ks_wrreg8() argument
128 writew(offset | (BE0 << shift_bit), dev->iobase + 2); in ks_wrreg8()
129 writew(value_write, dev->iobase); in ks_wrreg8()
132 static void ks_wrreg16(struct eth_device *dev, u16 offset, u16 val) in ks_wrreg16() argument
134 writew(offset | ((BE1 | BE0) << (offset & 0x02)), dev->iobase + 2); in ks_wrreg16()
135 writew(val, dev->iobase); in ks_wrreg16()
145 static inline void ks_inblk(struct eth_device *dev, u16 *wptr, u32 len) in ks_inblk() argument
150 *wptr++ = readw(dev->iobase); in ks_inblk()
159 static inline void ks_outblk(struct eth_device *dev, u16 *wptr, u32 len) in ks_outblk() argument
164 writew(*wptr++, dev->iobase); in ks_outblk()
167 static void ks_enable_int(struct eth_device *dev) in ks_enable_int() argument
169 ks_wrreg16(dev, KS_IER, ks->rc_ier); in ks_enable_int()
172 static void ks_set_powermode(struct eth_device *dev, unsigned pwrmode) in ks_set_powermode() argument
176 ks_rdreg16(dev, KS_GRR); in ks_set_powermode()
177 pmecr = ks_rdreg16(dev, KS_PMECR); in ks_set_powermode()
181 ks_wrreg16(dev, KS_PMECR, pmecr); in ks_set_powermode()
188 static void ks_read_config(struct eth_device *dev) in ks_read_config() argument
193 reg_data = ks_rdreg8(dev, KS_CCR) & 0x00FF; in ks_read_config()
194 reg_data |= ks_rdreg8(dev, KS_CCR + 1) << 8; in ks_read_config()
228 static void ks_soft_reset(struct eth_device *dev, unsigned op) in ks_soft_reset() argument
231 ks_wrreg16(dev, KS_IER, 0x0000); in ks_soft_reset()
232 ks_wrreg16(dev, KS_GRR, op); in ks_soft_reset()
234 ks_wrreg16(dev, KS_GRR, 0); in ks_soft_reset()
238 void ks_enable_qmu(struct eth_device *dev) in ks_enable_qmu() argument
242 w = ks_rdreg16(dev, KS_TXCR); in ks_enable_qmu()
245 ks_wrreg16(dev, KS_TXCR, w | TXCR_TXE); in ks_enable_qmu()
248 w = ks_rdreg16(dev, KS_RXQCR); in ks_enable_qmu()
249 ks_wrreg16(dev, KS_RXQCR, w | RXQCR_RXFCTE); in ks_enable_qmu()
252 w = ks_rdreg16(dev, KS_RXCR1); in ks_enable_qmu()
253 ks_wrreg16(dev, KS_RXCR1, w | RXCR1_RXE); in ks_enable_qmu()
256 static void ks_disable_qmu(struct eth_device *dev) in ks_disable_qmu() argument
260 w = ks_rdreg16(dev, KS_TXCR); in ks_disable_qmu()
264 ks_wrreg16(dev, KS_TXCR, w); in ks_disable_qmu()
267 w = ks_rdreg16(dev, KS_RXCR1); in ks_disable_qmu()
269 ks_wrreg16(dev, KS_RXCR1, w); in ks_disable_qmu()
272 static inline void ks_read_qmu(struct eth_device *dev, u16 *buf, u32 len) in ks_read_qmu() argument
278 ks_wrreg16(dev, KS_RXFDPR, RXFDPR_RXFPAI); in ks_read_qmu()
279 ks_wrreg8(dev, KS_RXQCR, (ks->rc_rxqcr | RXQCR_SDA) & 0xff); in ks_read_qmu()
289 ks_rdreg8(dev, 0); in ks_read_qmu()
291 ks_inblk(dev, buf, w + 2 + 2); in ks_read_qmu()
294 ks_inblk(dev, buf, ALIGN(len, 4)); in ks_read_qmu()
297 ks_wrreg8(dev, KS_RXQCR, (ks->rc_rxqcr & ~RXQCR_SDA) & 0xff); in ks_read_qmu()
300 static void ks_rcv(struct eth_device *dev, uchar **pv_data) in ks_rcv() argument
305 ks->frame_cnt = ks_rdreg16(dev, KS_RXFCTR) >> 8; in ks_rcv()
310 frame_hdr->sts = ks_rdreg16(dev, KS_RXFHSR); in ks_rcv()
312 frame_hdr->len = ks_rdreg16(dev, KS_RXFHBCR); in ks_rcv()
322 ks_read_qmu(dev, (u16 *)(*pv_data), frame_hdr->len); in ks_rcv()
328 ks_wrreg16(dev, KS_RXQCR, (ks->rc_rxqcr | RXQCR_RRXEF)); in ks_rcv()
341 static int ks_read_selftest(struct eth_device *dev) in ks_read_selftest() argument
347 mbir = ks_rdreg16(dev, KS_MBIR); in ks_read_selftest()
369 static void ks_setup(struct eth_device *dev) in ks_setup() argument
374 ks_wrreg16(dev, KS_TXFDPR, TXFDPR_TXFPAI); in ks_setup()
377 ks_wrreg16(dev, KS_RXFDPR, RXFDPR_RXFPAI); in ks_setup()
380 ks_wrreg16(dev, KS_RXFCTR, 1 & RXFCTR_THRESHOLD_MASK); in ks_setup()
384 ks_wrreg16(dev, KS_RXQCR, ks->rc_rxqcr); in ks_setup()
391 w = ks_rdreg16(dev, KS_P1MBCR); in ks_setup()
393 ks_wrreg16(dev, KS_P1MBCR, w); in ks_setup()
396 ks_wrreg16(dev, KS_TXCR, w); in ks_setup()
403 ks_wrreg16(dev, KS_RXCR1, w); in ks_setup()
406 static void ks_setup_int(struct eth_device *dev) in ks_setup_int() argument
411 ks_wrreg16(dev, KS_ISR, 0xffff); in ks_setup_int()
417 static int ks8851_mll_detect_chip(struct eth_device *dev) in ks8851_mll_detect_chip() argument
421 ks_read_config(dev); in ks8851_mll_detect_chip()
423 val = ks_rdreg16(dev, KS_CIDER); in ks8851_mll_detect_chip()
447 dev->priv = (void *)&chip_ids[i]; in ks8851_mll_detect_chip()
452 static void ks8851_mll_reset(struct eth_device *dev) in ks8851_mll_reset() argument
455 ks_set_powermode(dev, PMECR_PM_NORMAL); in ks8851_mll_reset()
459 ks_soft_reset(dev, GRR_GSR); in ks8851_mll_reset()
462 ks_wrreg16(dev, KS_IER, 0x0000); in ks8851_mll_reset()
463 ks_wrreg16(dev, KS_ISR, 0xffff); in ks8851_mll_reset()
466 ks_disable_qmu(dev); in ks8851_mll_reset()
469 static void ks8851_mll_phy_configure(struct eth_device *dev) in ks8851_mll_phy_configure() argument
473 ks_setup(dev); in ks8851_mll_phy_configure()
474 ks_setup_int(dev); in ks8851_mll_phy_configure()
477 data = ks_rdreg16(dev, KS_OBCR); in ks8851_mll_phy_configure()
478 ks_wrreg16(dev, KS_OBCR, data | OBCR_ODS_16MA); in ks8851_mll_phy_configure()
483 static void ks8851_mll_enable(struct eth_device *dev) in ks8851_mll_enable() argument
485 ks_wrreg16(dev, KS_ISR, 0xffff); in ks8851_mll_enable()
486 ks_enable_int(dev); in ks8851_mll_enable()
487 ks_enable_qmu(dev); in ks8851_mll_enable()
490 static int ks8851_mll_init(struct eth_device *dev, bd_t *bd) in ks8851_mll_init() argument
492 struct chip_id *id = dev->priv; in ks8851_mll_init()
496 if (ks_read_selftest(dev)) { in ks8851_mll_init()
501 ks8851_mll_reset(dev); in ks8851_mll_init()
504 ks8851_mll_phy_configure(dev); in ks8851_mll_init()
510 ks8851_mll_enable(dev); in ks8851_mll_init()
515 static void ks_write_qmu(struct eth_device *dev, u8 *pdata, u16 len) in ks_write_qmu() argument
522 ks_wrreg16(dev, KS_TXFDPR, TXFDPR_TXFPAI); in ks_write_qmu()
523 ks_wrreg8(dev, KS_RXQCR, (ks->rc_rxqcr | RXQCR_SDA) & 0xff); in ks_write_qmu()
525 ks_outblk(dev, ks->txh.txw, 4); in ks_write_qmu()
527 ks_outblk(dev, (u16 *)pdata, ALIGN(len, 4)); in ks_write_qmu()
529 ks_wrreg8(dev, KS_RXQCR, (ks->rc_rxqcr & ~RXQCR_SDA) & 0xff); in ks_write_qmu()
531 ks_wrreg16(dev, KS_TXQCR, TXQCR_METFE); in ks_write_qmu()
533 do { } while (ks_rdreg16(dev, KS_TXQCR) & TXQCR_METFE); in ks_write_qmu()
536 static int ks8851_mll_send(struct eth_device *dev, void *packet, int length) in ks8851_mll_send() argument
546 retv = ks_rdreg16(dev, KS_TXMIR) & 0x1fff; in ks8851_mll_send()
548 ks_write_qmu(dev, data, tmplen); in ks8851_mll_send()
556 static void ks8851_mll_halt(struct eth_device *dev) in ks8851_mll_halt() argument
558 ks8851_mll_reset(dev); in ks8851_mll_halt()
567 static int ks8851_mll_recv(struct eth_device *dev) in ks8851_mll_recv() argument
571 status = ks_rdreg16(dev, KS_ISR); in ks8851_mll_recv()
573 ks_wrreg16(dev, KS_ISR, status); in ks8851_mll_recv()
576 ks_rcv(dev, (uchar **)net_rx_packets); in ks8851_mll_recv()
579 u16 pmecr = ks_rdreg16(dev, KS_PMECR); in ks8851_mll_recv()
581 ks_wrreg16(dev, KS_PMECR, pmecr | PMECR_WKEVT_LINK); in ks8851_mll_recv()
587 static int ks8851_mll_write_hwaddr(struct eth_device *dev) in ks8851_mll_write_hwaddr() argument
591 addrh = (dev->enetaddr[0] << 8) | dev->enetaddr[1]; in ks8851_mll_write_hwaddr()
592 addrm = (dev->enetaddr[2] << 8) | dev->enetaddr[3]; in ks8851_mll_write_hwaddr()
593 addrl = (dev->enetaddr[4] << 8) | dev->enetaddr[5]; in ks8851_mll_write_hwaddr()
595 ks_wrreg16(dev, KS_MARH, addrh); in ks8851_mll_write_hwaddr()
596 ks_wrreg16(dev, KS_MARM, addrm); in ks8851_mll_write_hwaddr()
597 ks_wrreg16(dev, KS_MARL, addrl); in ks8851_mll_write_hwaddr()
604 struct eth_device *dev; in ks8851_mll_initialize() local
606 dev = malloc(sizeof(*dev)); in ks8851_mll_initialize()
607 if (!dev) { in ks8851_mll_initialize()
611 memset(dev, 0, sizeof(*dev)); in ks8851_mll_initialize()
613 dev->iobase = base_addr; in ks8851_mll_initialize()
618 if (ks8851_mll_detect_chip(dev)) { in ks8851_mll_initialize()
619 free(dev); in ks8851_mll_initialize()
623 dev->init = ks8851_mll_init; in ks8851_mll_initialize()
624 dev->halt = ks8851_mll_halt; in ks8851_mll_initialize()
625 dev->send = ks8851_mll_send; in ks8851_mll_initialize()
626 dev->recv = ks8851_mll_recv; in ks8851_mll_initialize()
627 dev->write_hwaddr = ks8851_mll_write_hwaddr; in ks8851_mll_initialize()
628 sprintf(dev->name, "%s-%hu", DRIVERNAME, dev_num); in ks8851_mll_initialize()
630 eth_register(dev); in ks8851_mll_initialize()