Lines Matching refs:ks
484 static u8 ks_rdreg8(struct ks_net *ks, int offset) in ks_rdreg8() argument
489 ks->cmd_reg_cache = (u16) offset | (u16)(BE0 << shift_bit); in ks_rdreg8()
490 iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); in ks_rdreg8()
491 data = ioread16(ks->hw_addr); in ks_rdreg8()
503 static u16 ks_rdreg16(struct ks_net *ks, int offset) in ks_rdreg16() argument
505 ks->cmd_reg_cache = (u16)offset | ((BE1 | BE0) << (offset & 0x02)); in ks_rdreg16()
506 iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); in ks_rdreg16()
507 return ioread16(ks->hw_addr); in ks_rdreg16()
517 static void ks_wrreg8(struct ks_net *ks, int offset, u8 value) in ks_wrreg8() argument
521 ks->cmd_reg_cache = (u16)offset | (BE0 << shift_bit); in ks_wrreg8()
522 iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); in ks_wrreg8()
523 iowrite16(value_write, ks->hw_addr); in ks_wrreg8()
534 static void ks_wrreg16(struct ks_net *ks, int offset, u16 value) in ks_wrreg16() argument
536 ks->cmd_reg_cache = (u16)offset | ((BE1 | BE0) << (offset & 0x02)); in ks_wrreg16()
537 iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); in ks_wrreg16()
538 iowrite16(value, ks->hw_addr); in ks_wrreg16()
548 static inline void ks_inblk(struct ks_net *ks, u16 *wptr, u32 len) in ks_inblk() argument
552 *wptr++ = (u16)ioread16(ks->hw_addr); in ks_inblk()
562 static inline void ks_outblk(struct ks_net *ks, u16 *wptr, u32 len) in ks_outblk() argument
566 iowrite16(*wptr++, ks->hw_addr); in ks_outblk()
569 static void ks_disable_int(struct ks_net *ks) in ks_disable_int() argument
571 ks_wrreg16(ks, KS_IER, 0x0000); in ks_disable_int()
574 static void ks_enable_int(struct ks_net *ks) in ks_enable_int() argument
576 ks_wrreg16(ks, KS_IER, ks->rc_ier); in ks_enable_int()
584 static inline u16 ks_tx_fifo_space(struct ks_net *ks) in ks_tx_fifo_space() argument
586 return ks_rdreg16(ks, KS_TXMIR) & 0x1fff; in ks_tx_fifo_space()
594 static inline void ks_save_cmd_reg(struct ks_net *ks) in ks_save_cmd_reg() argument
599 ks->cmd_reg_cache_int = ks->cmd_reg_cache; in ks_save_cmd_reg()
608 static inline void ks_restore_cmd_reg(struct ks_net *ks) in ks_restore_cmd_reg() argument
610 ks->cmd_reg_cache = ks->cmd_reg_cache_int; in ks_restore_cmd_reg()
611 iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); in ks_restore_cmd_reg()
621 static void ks_set_powermode(struct ks_net *ks, unsigned pwrmode) in ks_set_powermode() argument
625 netif_dbg(ks, hw, ks->netdev, "setting power mode %d\n", pwrmode); in ks_set_powermode()
627 ks_rdreg16(ks, KS_GRR); in ks_set_powermode()
628 pmecr = ks_rdreg16(ks, KS_PMECR); in ks_set_powermode()
632 ks_wrreg16(ks, KS_PMECR, pmecr); in ks_set_powermode()
640 static void ks_read_config(struct ks_net *ks) in ks_read_config() argument
645 reg_data = ks_rdreg8(ks, KS_CCR) & 0x00FF; in ks_read_config()
646 reg_data |= ks_rdreg8(ks, KS_CCR+1) << 8; in ks_read_config()
649 ks->sharedbus = (reg_data & CCR_SHARED) == CCR_SHARED; in ks_read_config()
656 ks->bus_width = ENUM_BUS_8BIT; in ks_read_config()
657 ks->extra_byte = 1; in ks_read_config()
659 ks->bus_width = ENUM_BUS_16BIT; in ks_read_config()
660 ks->extra_byte = 2; in ks_read_config()
662 ks->bus_width = ENUM_BUS_32BIT; in ks_read_config()
663 ks->extra_byte = 4; in ks_read_config()
680 static void ks_soft_reset(struct ks_net *ks, unsigned op) in ks_soft_reset() argument
683 ks_wrreg16(ks, KS_IER, 0x0000); in ks_soft_reset()
684 ks_wrreg16(ks, KS_GRR, op); in ks_soft_reset()
686 ks_wrreg16(ks, KS_GRR, 0); in ks_soft_reset()
691 static void ks_enable_qmu(struct ks_net *ks) in ks_enable_qmu() argument
695 w = ks_rdreg16(ks, KS_TXCR); in ks_enable_qmu()
697 ks_wrreg16(ks, KS_TXCR, w | TXCR_TXE); in ks_enable_qmu()
704 w = ks_rdreg16(ks, KS_RXQCR); in ks_enable_qmu()
705 ks_wrreg16(ks, KS_RXQCR, w | RXQCR_RXFCTE); in ks_enable_qmu()
708 w = ks_rdreg16(ks, KS_RXCR1); in ks_enable_qmu()
709 ks_wrreg16(ks, KS_RXCR1, w | RXCR1_RXE); in ks_enable_qmu()
710 ks->enabled = true; in ks_enable_qmu()
713 static void ks_disable_qmu(struct ks_net *ks) in ks_disable_qmu() argument
717 w = ks_rdreg16(ks, KS_TXCR); in ks_disable_qmu()
721 ks_wrreg16(ks, KS_TXCR, w); in ks_disable_qmu()
724 w = ks_rdreg16(ks, KS_RXCR1); in ks_disable_qmu()
726 ks_wrreg16(ks, KS_RXCR1, w); in ks_disable_qmu()
728 ks->enabled = false; in ks_disable_qmu()
743 static inline void ks_read_qmu(struct ks_net *ks, u16 *buf, u32 len) in ks_read_qmu() argument
745 u32 r = ks->extra_byte & 0x1 ; in ks_read_qmu()
746 u32 w = ks->extra_byte - r; in ks_read_qmu()
749 ks_wrreg16(ks, KS_RXFDPR, RXFDPR_RXFPAI); in ks_read_qmu()
750 ks_wrreg8(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_SDA) & 0xff); in ks_read_qmu()
760 ioread8(ks->hw_addr); in ks_read_qmu()
761 ks_inblk(ks, buf, w + 2 + 2); in ks_read_qmu()
764 ks_inblk(ks, buf, ALIGN(len, 4)); in ks_read_qmu()
767 ks_wrreg8(ks, KS_RXQCR, ks->rc_rxqcr); in ks_read_qmu()
779 static void ks_rcv(struct ks_net *ks, struct net_device *netdev) in ks_rcv() argument
782 struct type_frame_head *frame_hdr = ks->frame_head_info; in ks_rcv()
785 ks->frame_cnt = ks_rdreg16(ks, KS_RXFCTR) >> 8; in ks_rcv()
788 for (i = 0; i < ks->frame_cnt; i++) { in ks_rcv()
790 frame_hdr->sts = ks_rdreg16(ks, KS_RXFHSR); in ks_rcv()
792 frame_hdr->len = ks_rdreg16(ks, KS_RXFHBCR); in ks_rcv()
796 frame_hdr = ks->frame_head_info; in ks_rcv()
797 while (ks->frame_cnt--) { in ks_rcv()
803 ks_wrreg16(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_RRXEF)); in ks_rcv()
817 ks_read_qmu(ks, (u16 *)skb->data, frame_hdr->len); in ks_rcv()
825 ks_wrreg16(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_RRXEF)); in ks_rcv()
839 static void ks_update_link_status(struct net_device *netdev, struct ks_net *ks) in ks_update_link_status() argument
843 if (ks_rdreg16(ks, KS_P1SR) & P1SR_LINK_GOOD) { in ks_update_link_status()
850 netif_dbg(ks, link, ks->netdev, in ks_update_link_status()
868 struct ks_net *ks = netdev_priv(netdev); in ks_irq() local
872 ks_save_cmd_reg(ks); in ks_irq()
874 status = ks_rdreg16(ks, KS_ISR); in ks_irq()
876 ks_restore_cmd_reg(ks); in ks_irq()
880 ks_wrreg16(ks, KS_ISR, status); in ks_irq()
883 ks_rcv(ks, netdev); in ks_irq()
886 ks_update_link_status(netdev, ks); in ks_irq()
893 u16 pmecr = ks_rdreg16(ks, KS_PMECR); in ks_irq()
895 ks_wrreg16(ks, KS_PMECR, pmecr | PMECR_WKEVT_LINK); in ks_irq()
899 ks->netdev->stats.rx_over_errors++; in ks_irq()
901 ks_restore_cmd_reg(ks); in ks_irq()
915 struct ks_net *ks = netdev_priv(netdev); in ks_net_open() local
923 netif_dbg(ks, ifup, ks->netdev, "%s - entry\n", __func__); in ks_net_open()
934 ks_set_powermode(ks, PMECR_PM_NORMAL); in ks_net_open()
937 ks_wrreg16(ks, KS_ISR, 0xffff); in ks_net_open()
938 ks_enable_int(ks); in ks_net_open()
939 ks_enable_qmu(ks); in ks_net_open()
940 netif_start_queue(ks->netdev); in ks_net_open()
942 netif_dbg(ks, ifup, ks->netdev, "network device up\n"); in ks_net_open()
957 struct ks_net *ks = netdev_priv(netdev); in ks_net_stop() local
959 netif_info(ks, ifdown, netdev, "shutting down\n"); in ks_net_stop()
963 mutex_lock(&ks->lock); in ks_net_stop()
966 ks_wrreg16(ks, KS_IER, 0x0000); in ks_net_stop()
967 ks_wrreg16(ks, KS_ISR, 0xffff); in ks_net_stop()
970 ks_disable_qmu(ks); in ks_net_stop()
973 ks_set_powermode(ks, PMECR_PM_SOFTDOWN); in ks_net_stop()
975 mutex_unlock(&ks->lock); in ks_net_stop()
993 static void ks_write_qmu(struct ks_net *ks, u8 *pdata, u16 len) in ks_write_qmu() argument
996 ks->txh.txw[0] = 0; in ks_write_qmu()
997 ks->txh.txw[1] = cpu_to_le16(len); in ks_write_qmu()
1000 ks_wrreg8(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_SDA) & 0xff); in ks_write_qmu()
1002 ks_outblk(ks, ks->txh.txw, 4); in ks_write_qmu()
1004 ks_outblk(ks, (u16 *)pdata, ALIGN(len, 4)); in ks_write_qmu()
1006 ks_wrreg8(ks, KS_RXQCR, ks->rc_rxqcr); in ks_write_qmu()
1008 ks_wrreg16(ks, KS_TXQCR, TXQCR_METFE); in ks_write_qmu()
1010 while (ks_rdreg16(ks, KS_TXQCR) & TXQCR_METFE) in ks_write_qmu()
1026 struct ks_net *ks = netdev_priv(netdev); in ks_start_xmit() local
1029 ks_disable_int(ks); in ks_start_xmit()
1030 spin_lock(&ks->statelock); in ks_start_xmit()
1036 if (likely(ks_tx_fifo_space(ks) >= skb->len + 12)) { in ks_start_xmit()
1037 ks_write_qmu(ks, skb->data, skb->len); in ks_start_xmit()
1044 spin_unlock(&ks->statelock); in ks_start_xmit()
1045 ks_enable_int(ks); in ks_start_xmit()
1055 static void ks_start_rx(struct ks_net *ks) in ks_start_rx() argument
1060 cntl = ks_rdreg16(ks, KS_RXCR1); in ks_start_rx()
1062 ks_wrreg16(ks, KS_RXCR1, cntl); in ks_start_rx()
1070 static void ks_stop_rx(struct ks_net *ks) in ks_stop_rx() argument
1075 cntl = ks_rdreg16(ks, KS_RXCR1); in ks_stop_rx()
1077 ks_wrreg16(ks, KS_RXCR1, cntl); in ks_stop_rx()
1104 static void ks_set_grpaddr(struct ks_net *ks) in ks_set_grpaddr() argument
1109 memset(ks->mcast_bits, 0, sizeof(u8) * HW_MCAST_SIZE); in ks_set_grpaddr()
1111 for (i = 0; i < ks->mcast_lst_size; i++) { in ks_set_grpaddr()
1112 position = (ether_gen_crc(6, ks->mcast_lst[i]) >> 26) & 0x3f; in ks_set_grpaddr()
1115 ks->mcast_bits[index] |= (u8)value; in ks_set_grpaddr()
1120 ks_wrreg16(ks, (u16)((KS_MAHTR0 + i) & ~1), in ks_set_grpaddr()
1121 (ks->mcast_bits[i] << 8) | in ks_set_grpaddr()
1122 ks->mcast_bits[i - 1]); in ks_set_grpaddr()
1134 static void ks_clear_mcast(struct ks_net *ks) in ks_clear_mcast() argument
1138 ks->mcast_bits[i] = 0; in ks_clear_mcast()
1142 ks_wrreg16(ks, KS_MAHTR0 + (2*i), 0); in ks_clear_mcast()
1145 static void ks_set_promis(struct ks_net *ks, u16 promiscuous_mode) in ks_set_promis() argument
1148 ks->promiscuous = promiscuous_mode; in ks_set_promis()
1149 ks_stop_rx(ks); /* Stop receiving for reconfiguration */ in ks_set_promis()
1150 cntl = ks_rdreg16(ks, KS_RXCR1); in ks_set_promis()
1160 ks_wrreg16(ks, KS_RXCR1, cntl); in ks_set_promis()
1162 if (ks->enabled) in ks_set_promis()
1163 ks_start_rx(ks); in ks_set_promis()
1167 static void ks_set_mcast(struct ks_net *ks, u16 mcast) in ks_set_mcast() argument
1171 ks->all_mcast = mcast; in ks_set_mcast()
1172 ks_stop_rx(ks); /* Stop receiving for reconfiguration */ in ks_set_mcast()
1173 cntl = ks_rdreg16(ks, KS_RXCR1); in ks_set_mcast()
1185 ks_wrreg16(ks, KS_RXCR1, cntl); in ks_set_mcast()
1187 if (ks->enabled) in ks_set_mcast()
1188 ks_start_rx(ks); in ks_set_mcast()
1193 struct ks_net *ks = netdev_priv(netdev); in ks_set_rx_mode() local
1198 ks_set_promis(ks, in ks_set_rx_mode()
1202 ks_set_mcast(ks, in ks_set_rx_mode()
1205 ks_set_promis(ks, false); in ks_set_rx_mode()
1214 memcpy(ks->mcast_lst[i++], ha->addr, ETH_ALEN); in ks_set_rx_mode()
1216 ks->mcast_lst_size = (u8)i; in ks_set_rx_mode()
1217 ks_set_grpaddr(ks); in ks_set_rx_mode()
1223 ks->mcast_lst_size = MAX_MCAST_LST; in ks_set_rx_mode()
1224 ks_set_mcast(ks, true); in ks_set_rx_mode()
1227 ks->mcast_lst_size = 0; in ks_set_rx_mode()
1228 ks_clear_mcast(ks); in ks_set_rx_mode()
1232 static void ks_set_mac(struct ks_net *ks, u8 *data) in ks_set_mac() argument
1237 ks_stop_rx(ks); /* Stop receiving for reconfiguration */ in ks_set_mac()
1241 ks_wrreg16(ks, KS_MARH, w); in ks_set_mac()
1245 ks_wrreg16(ks, KS_MARM, w); in ks_set_mac()
1249 ks_wrreg16(ks, KS_MARL, w); in ks_set_mac()
1251 memcpy(ks->mac_addr, data, ETH_ALEN); in ks_set_mac()
1253 if (ks->enabled) in ks_set_mac()
1254 ks_start_rx(ks); in ks_set_mac()
1259 struct ks_net *ks = netdev_priv(netdev); in ks_set_mac_address() local
1267 ks_set_mac(ks, da); in ks_set_mac_address()
1273 struct ks_net *ks = netdev_priv(netdev); in ks_net_ioctl() local
1278 return generic_mii_ioctl(&ks->mii, if_mii(req), cmd, NULL); in ks_net_ioctl()
1305 struct ks_net *ks = netdev_priv(netdev); in ks_get_msglevel() local
1306 return ks->msg_enable; in ks_get_msglevel()
1311 struct ks_net *ks = netdev_priv(netdev); in ks_set_msglevel() local
1312 ks->msg_enable = to; in ks_set_msglevel()
1317 struct ks_net *ks = netdev_priv(netdev); in ks_get_settings() local
1318 return mii_ethtool_gset(&ks->mii, cmd); in ks_get_settings()
1323 struct ks_net *ks = netdev_priv(netdev); in ks_set_settings() local
1324 return mii_ethtool_sset(&ks->mii, cmd); in ks_set_settings()
1329 struct ks_net *ks = netdev_priv(netdev); in ks_get_link() local
1330 return mii_link_ok(&ks->mii); in ks_get_link()
1335 struct ks_net *ks = netdev_priv(netdev); in ks_nway_reset() local
1336 return mii_nway_restart(&ks->mii); in ks_nway_reset()
1396 struct ks_net *ks = netdev_priv(netdev); in ks_phy_read() local
1404 mutex_lock(&ks->lock); in ks_phy_read()
1405 result = ks_rdreg16(ks, ksreg); in ks_phy_read()
1406 mutex_unlock(&ks->lock); in ks_phy_read()
1414 struct ks_net *ks = netdev_priv(netdev); in ks_phy_write() local
1419 mutex_lock(&ks->lock); in ks_phy_write()
1420 ks_wrreg16(ks, ksreg, value); in ks_phy_write()
1421 mutex_unlock(&ks->lock); in ks_phy_write()
1431 static int ks_read_selftest(struct ks_net *ks) in ks_read_selftest() argument
1437 rd = ks_rdreg16(ks, KS_MBIR); in ks_read_selftest()
1440 netdev_warn(ks->netdev, "Memory selftest not finished\n"); in ks_read_selftest()
1445 netdev_err(ks->netdev, "TX memory selftest fails\n"); in ks_read_selftest()
1450 netdev_err(ks->netdev, "RX memory selftest fails\n"); in ks_read_selftest()
1454 netdev_info(ks->netdev, "the selftest passes\n"); in ks_read_selftest()
1458 static void ks_setup(struct ks_net *ks) in ks_setup() argument
1467 ks_wrreg16(ks, KS_TXFDPR, TXFDPR_TXFPAI); in ks_setup()
1470 ks_wrreg16(ks, KS_RXFDPR, RXFDPR_RXFPAI); in ks_setup()
1473 ks_wrreg16(ks, KS_RXFCTR, 1 & RXFCTR_THRESHOLD_MASK); in ks_setup()
1476 ks->rc_rxqcr = RXQCR_CMD_CNTL; in ks_setup()
1477 ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr); in ks_setup()
1485 w = ks_rdreg16(ks, KS_P1MBCR); in ks_setup()
1487 ks_wrreg16(ks, KS_P1MBCR, w); in ks_setup()
1490 ks_wrreg16(ks, KS_TXCR, w); in ks_setup()
1494 if (ks->promiscuous) /* bPromiscuous */ in ks_setup()
1496 else if (ks->all_mcast) /* Multicast address passed mode */ in ks_setup()
1501 ks_wrreg16(ks, KS_RXCR1, w); in ks_setup()
1505 static void ks_setup_int(struct ks_net *ks) in ks_setup_int() argument
1507 ks->rc_ier = 0x00; in ks_setup_int()
1509 ks_wrreg16(ks, KS_ISR, 0xffff); in ks_setup_int()
1512 ks->rc_ier = (IRQ_LCI | IRQ_TXI | IRQ_RXI); in ks_setup_int()
1515 static int ks_hw_init(struct ks_net *ks) in ks_hw_init() argument
1518 ks->promiscuous = 0; in ks_hw_init()
1519 ks->all_mcast = 0; in ks_hw_init()
1520 ks->mcast_lst_size = 0; in ks_hw_init()
1522 ks->frame_head_info = devm_kmalloc(&ks->pdev->dev, MHEADER_SIZE, in ks_hw_init()
1524 if (!ks->frame_head_info) in ks_hw_init()
1527 ks_set_mac(ks, KS_DEFAULT_MAC_ADDRESS); in ks_hw_init()
1544 struct ks_net *ks; in ks8851_probe() local
1554 ks = netdev_priv(netdev); in ks8851_probe()
1555 ks->netdev = netdev; in ks8851_probe()
1558 ks->hw_addr = devm_ioremap_resource(&pdev->dev, io_d); in ks8851_probe()
1559 if (IS_ERR(ks->hw_addr)) { in ks8851_probe()
1560 err = PTR_ERR(ks->hw_addr); in ks8851_probe()
1565 ks->hw_addr_cmd = devm_ioremap_resource(&pdev->dev, io_c); in ks8851_probe()
1566 if (IS_ERR(ks->hw_addr_cmd)) { in ks8851_probe()
1567 err = PTR_ERR(ks->hw_addr_cmd); in ks8851_probe()
1578 ks->pdev = pdev; in ks8851_probe()
1580 mutex_init(&ks->lock); in ks8851_probe()
1581 spin_lock_init(&ks->statelock); in ks8851_probe()
1587 ks->mii.dev = netdev; in ks8851_probe()
1588 ks->mii.phy_id = 1, in ks8851_probe()
1589 ks->mii.phy_id_mask = 1; in ks8851_probe()
1590 ks->mii.reg_num_mask = 0xf; in ks8851_probe()
1591 ks->mii.mdio_read = ks_phy_read; in ks8851_probe()
1592 ks->mii.mdio_write = ks_phy_write; in ks8851_probe()
1596 ks->msg_enable = netif_msg_init(msg_enable, (NETIF_MSG_DRV | in ks8851_probe()
1599 ks_read_config(ks); in ks8851_probe()
1602 if ((ks_rdreg16(ks, KS_CIDER) & ~CIDER_REV_MASK) != CIDER_ID) { in ks8851_probe()
1608 if (ks_read_selftest(ks)) { in ks8851_probe()
1620 ks_soft_reset(ks, GRR_GSR); in ks8851_probe()
1621 ks_hw_init(ks); in ks8851_probe()
1622 ks_disable_qmu(ks); in ks8851_probe()
1623 ks_setup(ks); in ks8851_probe()
1624 ks_setup_int(ks); in ks8851_probe()
1626 data = ks_rdreg16(ks, KS_OBCR); in ks8851_probe()
1627 ks_wrreg16(ks, KS_OBCR, data | OBCR_ODS_16MA); in ks8851_probe()
1633 memcpy(ks->mac_addr, mac, ETH_ALEN); in ks8851_probe()
1643 memcpy(ks->mac_addr, pdata->mac_addr, ETH_ALEN); in ks8851_probe()
1645 if (!is_valid_ether_addr(ks->mac_addr)) { in ks8851_probe()
1647 eth_random_addr(ks->mac_addr); in ks8851_probe()
1650 netdev_info(netdev, "Mac address is: %pM\n", ks->mac_addr); in ks8851_probe()
1652 memcpy(netdev->dev_addr, ks->mac_addr, ETH_ALEN); in ks8851_probe()
1654 ks_set_mac(ks, netdev->dev_addr); in ks8851_probe()
1656 id = ks_rdreg16(ks, KS_CIDER); in ks8851_probe()