Lines Matching refs:ks
485 static u8 ks_rdreg8(struct ks_net *ks, int offset) in ks_rdreg8() argument
490 ks->cmd_reg_cache = (u16) offset | (u16)(BE0 << shift_bit); in ks_rdreg8()
491 iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); in ks_rdreg8()
492 data = ioread16(ks->hw_addr); in ks_rdreg8()
504 static u16 ks_rdreg16(struct ks_net *ks, int offset) in ks_rdreg16() argument
506 ks->cmd_reg_cache = (u16)offset | ((BE1 | BE0) << (offset & 0x02)); in ks_rdreg16()
507 iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); in ks_rdreg16()
508 return ioread16(ks->hw_addr); in ks_rdreg16()
518 static void ks_wrreg8(struct ks_net *ks, int offset, u8 value) in ks_wrreg8() argument
522 ks->cmd_reg_cache = (u16)offset | (BE0 << shift_bit); in ks_wrreg8()
523 iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); in ks_wrreg8()
524 iowrite16(value_write, ks->hw_addr); in ks_wrreg8()
535 static void ks_wrreg16(struct ks_net *ks, int offset, u16 value) in ks_wrreg16() argument
537 ks->cmd_reg_cache = (u16)offset | ((BE1 | BE0) << (offset & 0x02)); in ks_wrreg16()
538 iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); in ks_wrreg16()
539 iowrite16(value, ks->hw_addr); in ks_wrreg16()
549 static inline void ks_inblk(struct ks_net *ks, u16 *wptr, u32 len) in ks_inblk() argument
553 *wptr++ = (u16)ioread16(ks->hw_addr); in ks_inblk()
563 static inline void ks_outblk(struct ks_net *ks, u16 *wptr, u32 len) in ks_outblk() argument
567 iowrite16(*wptr++, ks->hw_addr); in ks_outblk()
570 static void ks_disable_int(struct ks_net *ks) in ks_disable_int() argument
572 ks_wrreg16(ks, KS_IER, 0x0000); in ks_disable_int()
575 static void ks_enable_int(struct ks_net *ks) in ks_enable_int() argument
577 ks_wrreg16(ks, KS_IER, ks->rc_ier); in ks_enable_int()
585 static inline u16 ks_tx_fifo_space(struct ks_net *ks) in ks_tx_fifo_space() argument
587 return ks_rdreg16(ks, KS_TXMIR) & 0x1fff; in ks_tx_fifo_space()
595 static inline void ks_save_cmd_reg(struct ks_net *ks) in ks_save_cmd_reg() argument
600 ks->cmd_reg_cache_int = ks->cmd_reg_cache; in ks_save_cmd_reg()
609 static inline void ks_restore_cmd_reg(struct ks_net *ks) in ks_restore_cmd_reg() argument
611 ks->cmd_reg_cache = ks->cmd_reg_cache_int; in ks_restore_cmd_reg()
612 iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd); in ks_restore_cmd_reg()
622 static void ks_set_powermode(struct ks_net *ks, unsigned pwrmode) in ks_set_powermode() argument
626 netif_dbg(ks, hw, ks->netdev, "setting power mode %d\n", pwrmode); in ks_set_powermode()
628 ks_rdreg16(ks, KS_GRR); in ks_set_powermode()
629 pmecr = ks_rdreg16(ks, KS_PMECR); in ks_set_powermode()
633 ks_wrreg16(ks, KS_PMECR, pmecr); in ks_set_powermode()
641 static void ks_read_config(struct ks_net *ks) in ks_read_config() argument
646 reg_data = ks_rdreg8(ks, KS_CCR) & 0x00FF; in ks_read_config()
647 reg_data |= ks_rdreg8(ks, KS_CCR+1) << 8; in ks_read_config()
650 ks->sharedbus = (reg_data & CCR_SHARED) == CCR_SHARED; in ks_read_config()
657 ks->bus_width = ENUM_BUS_8BIT; in ks_read_config()
658 ks->extra_byte = 1; in ks_read_config()
660 ks->bus_width = ENUM_BUS_16BIT; in ks_read_config()
661 ks->extra_byte = 2; in ks_read_config()
663 ks->bus_width = ENUM_BUS_32BIT; in ks_read_config()
664 ks->extra_byte = 4; in ks_read_config()
681 static void ks_soft_reset(struct ks_net *ks, unsigned op) in ks_soft_reset() argument
684 ks_wrreg16(ks, KS_IER, 0x0000); in ks_soft_reset()
685 ks_wrreg16(ks, KS_GRR, op); in ks_soft_reset()
687 ks_wrreg16(ks, KS_GRR, 0); in ks_soft_reset()
692 static void ks_enable_qmu(struct ks_net *ks) in ks_enable_qmu() argument
696 w = ks_rdreg16(ks, KS_TXCR); in ks_enable_qmu()
698 ks_wrreg16(ks, KS_TXCR, w | TXCR_TXE); in ks_enable_qmu()
705 w = ks_rdreg16(ks, KS_RXQCR); in ks_enable_qmu()
706 ks_wrreg16(ks, KS_RXQCR, w | RXQCR_RXFCTE); in ks_enable_qmu()
709 w = ks_rdreg16(ks, KS_RXCR1); in ks_enable_qmu()
710 ks_wrreg16(ks, KS_RXCR1, w | RXCR1_RXE); in ks_enable_qmu()
711 ks->enabled = true; in ks_enable_qmu()
714 static void ks_disable_qmu(struct ks_net *ks) in ks_disable_qmu() argument
718 w = ks_rdreg16(ks, KS_TXCR); in ks_disable_qmu()
722 ks_wrreg16(ks, KS_TXCR, w); in ks_disable_qmu()
725 w = ks_rdreg16(ks, KS_RXCR1); in ks_disable_qmu()
727 ks_wrreg16(ks, KS_RXCR1, w); in ks_disable_qmu()
729 ks->enabled = false; in ks_disable_qmu()
744 static inline void ks_read_qmu(struct ks_net *ks, u16 *buf, u32 len) in ks_read_qmu() argument
746 u32 r = ks->extra_byte & 0x1 ; in ks_read_qmu()
747 u32 w = ks->extra_byte - r; in ks_read_qmu()
750 ks_wrreg16(ks, KS_RXFDPR, RXFDPR_RXFPAI); in ks_read_qmu()
751 ks_wrreg8(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_SDA) & 0xff); in ks_read_qmu()
761 ioread8(ks->hw_addr); in ks_read_qmu()
762 ks_inblk(ks, buf, w + 2 + 2); in ks_read_qmu()
765 ks_inblk(ks, buf, ALIGN(len, 4)); in ks_read_qmu()
768 ks_wrreg8(ks, KS_RXQCR, ks->rc_rxqcr); in ks_read_qmu()
780 static void ks_rcv(struct ks_net *ks, struct net_device *netdev) in ks_rcv() argument
783 struct type_frame_head *frame_hdr = ks->frame_head_info; in ks_rcv()
786 ks->frame_cnt = ks_rdreg16(ks, KS_RXFCTR) >> 8; in ks_rcv()
789 for (i = 0; i < ks->frame_cnt; i++) { in ks_rcv()
791 frame_hdr->sts = ks_rdreg16(ks, KS_RXFHSR); in ks_rcv()
793 frame_hdr->len = ks_rdreg16(ks, KS_RXFHBCR); in ks_rcv()
797 frame_hdr = ks->frame_head_info; in ks_rcv()
798 while (ks->frame_cnt--) { in ks_rcv()
804 ks_wrreg16(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_RRXEF)); in ks_rcv()
818 ks_read_qmu(ks, (u16 *)skb->data, frame_hdr->len); in ks_rcv()
826 ks_wrreg16(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_RRXEF)); in ks_rcv()
840 static void ks_update_link_status(struct net_device *netdev, struct ks_net *ks) in ks_update_link_status() argument
844 if (ks_rdreg16(ks, KS_P1SR) & P1SR_LINK_GOOD) { in ks_update_link_status()
851 netif_dbg(ks, link, ks->netdev, in ks_update_link_status()
869 struct ks_net *ks = netdev_priv(netdev); in ks_irq() local
873 ks_save_cmd_reg(ks); in ks_irq()
875 status = ks_rdreg16(ks, KS_ISR); in ks_irq()
877 ks_restore_cmd_reg(ks); in ks_irq()
881 ks_wrreg16(ks, KS_ISR, status); in ks_irq()
884 ks_rcv(ks, netdev); in ks_irq()
887 ks_update_link_status(netdev, ks); in ks_irq()
894 u16 pmecr = ks_rdreg16(ks, KS_PMECR); in ks_irq()
896 ks_wrreg16(ks, KS_PMECR, pmecr | PMECR_WKEVT_LINK); in ks_irq()
900 ks->netdev->stats.rx_over_errors++; in ks_irq()
902 ks_restore_cmd_reg(ks); in ks_irq()
916 struct ks_net *ks = netdev_priv(netdev); in ks_net_open() local
924 netif_dbg(ks, ifup, ks->netdev, "%s - entry\n", __func__); in ks_net_open()
935 ks_set_powermode(ks, PMECR_PM_NORMAL); in ks_net_open()
938 ks_wrreg16(ks, KS_ISR, 0xffff); in ks_net_open()
939 ks_enable_int(ks); in ks_net_open()
940 ks_enable_qmu(ks); in ks_net_open()
941 netif_start_queue(ks->netdev); in ks_net_open()
943 netif_dbg(ks, ifup, ks->netdev, "network device up\n"); in ks_net_open()
958 struct ks_net *ks = netdev_priv(netdev); in ks_net_stop() local
960 netif_info(ks, ifdown, netdev, "shutting down\n"); in ks_net_stop()
964 mutex_lock(&ks->lock); in ks_net_stop()
967 ks_wrreg16(ks, KS_IER, 0x0000); in ks_net_stop()
968 ks_wrreg16(ks, KS_ISR, 0xffff); in ks_net_stop()
971 ks_disable_qmu(ks); in ks_net_stop()
974 ks_set_powermode(ks, PMECR_PM_SOFTDOWN); in ks_net_stop()
976 mutex_unlock(&ks->lock); in ks_net_stop()
994 static void ks_write_qmu(struct ks_net *ks, u8 *pdata, u16 len) in ks_write_qmu() argument
997 ks->txh.txw[0] = 0; in ks_write_qmu()
998 ks->txh.txw[1] = cpu_to_le16(len); in ks_write_qmu()
1001 ks_wrreg8(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_SDA) & 0xff); in ks_write_qmu()
1003 ks_outblk(ks, ks->txh.txw, 4); in ks_write_qmu()
1005 ks_outblk(ks, (u16 *)pdata, ALIGN(len, 4)); in ks_write_qmu()
1007 ks_wrreg8(ks, KS_RXQCR, ks->rc_rxqcr); in ks_write_qmu()
1009 ks_wrreg16(ks, KS_TXQCR, TXQCR_METFE); in ks_write_qmu()
1011 while (ks_rdreg16(ks, KS_TXQCR) & TXQCR_METFE) in ks_write_qmu()
1027 struct ks_net *ks = netdev_priv(netdev); in ks_start_xmit() local
1030 ks_disable_int(ks); in ks_start_xmit()
1031 spin_lock(&ks->statelock); in ks_start_xmit()
1037 if (likely(ks_tx_fifo_space(ks) >= skb->len + 12)) { in ks_start_xmit()
1038 ks_write_qmu(ks, skb->data, skb->len); in ks_start_xmit()
1045 spin_unlock(&ks->statelock); in ks_start_xmit()
1046 ks_enable_int(ks); in ks_start_xmit()
1056 static void ks_start_rx(struct ks_net *ks) in ks_start_rx() argument
1061 cntl = ks_rdreg16(ks, KS_RXCR1); in ks_start_rx()
1063 ks_wrreg16(ks, KS_RXCR1, cntl); in ks_start_rx()
1071 static void ks_stop_rx(struct ks_net *ks) in ks_stop_rx() argument
1076 cntl = ks_rdreg16(ks, KS_RXCR1); in ks_stop_rx()
1078 ks_wrreg16(ks, KS_RXCR1, cntl); in ks_stop_rx()
1105 static void ks_set_grpaddr(struct ks_net *ks) in ks_set_grpaddr() argument
1110 memset(ks->mcast_bits, 0, sizeof(u8) * HW_MCAST_SIZE); in ks_set_grpaddr()
1112 for (i = 0; i < ks->mcast_lst_size; i++) { in ks_set_grpaddr()
1113 position = (ether_gen_crc(6, ks->mcast_lst[i]) >> 26) & 0x3f; in ks_set_grpaddr()
1116 ks->mcast_bits[index] |= (u8)value; in ks_set_grpaddr()
1121 ks_wrreg16(ks, (u16)((KS_MAHTR0 + i) & ~1), in ks_set_grpaddr()
1122 (ks->mcast_bits[i] << 8) | in ks_set_grpaddr()
1123 ks->mcast_bits[i - 1]); in ks_set_grpaddr()
1135 static void ks_clear_mcast(struct ks_net *ks) in ks_clear_mcast() argument
1139 ks->mcast_bits[i] = 0; in ks_clear_mcast()
1143 ks_wrreg16(ks, KS_MAHTR0 + (2*i), 0); in ks_clear_mcast()
1146 static void ks_set_promis(struct ks_net *ks, u16 promiscuous_mode) in ks_set_promis() argument
1149 ks->promiscuous = promiscuous_mode; in ks_set_promis()
1150 ks_stop_rx(ks); /* Stop receiving for reconfiguration */ in ks_set_promis()
1151 cntl = ks_rdreg16(ks, KS_RXCR1); in ks_set_promis()
1161 ks_wrreg16(ks, KS_RXCR1, cntl); in ks_set_promis()
1163 if (ks->enabled) in ks_set_promis()
1164 ks_start_rx(ks); in ks_set_promis()
1168 static void ks_set_mcast(struct ks_net *ks, u16 mcast) in ks_set_mcast() argument
1172 ks->all_mcast = mcast; in ks_set_mcast()
1173 ks_stop_rx(ks); /* Stop receiving for reconfiguration */ in ks_set_mcast()
1174 cntl = ks_rdreg16(ks, KS_RXCR1); in ks_set_mcast()
1186 ks_wrreg16(ks, KS_RXCR1, cntl); in ks_set_mcast()
1188 if (ks->enabled) in ks_set_mcast()
1189 ks_start_rx(ks); in ks_set_mcast()
1194 struct ks_net *ks = netdev_priv(netdev); in ks_set_rx_mode() local
1199 ks_set_promis(ks, in ks_set_rx_mode()
1203 ks_set_mcast(ks, in ks_set_rx_mode()
1206 ks_set_promis(ks, false); in ks_set_rx_mode()
1215 memcpy(ks->mcast_lst[i++], ha->addr, ETH_ALEN); in ks_set_rx_mode()
1217 ks->mcast_lst_size = (u8)i; in ks_set_rx_mode()
1218 ks_set_grpaddr(ks); in ks_set_rx_mode()
1224 ks->mcast_lst_size = MAX_MCAST_LST; in ks_set_rx_mode()
1225 ks_set_mcast(ks, true); in ks_set_rx_mode()
1228 ks->mcast_lst_size = 0; in ks_set_rx_mode()
1229 ks_clear_mcast(ks); in ks_set_rx_mode()
1233 static void ks_set_mac(struct ks_net *ks, u8 *data) in ks_set_mac() argument
1238 ks_stop_rx(ks); /* Stop receiving for reconfiguration */ in ks_set_mac()
1242 ks_wrreg16(ks, KS_MARH, w); in ks_set_mac()
1246 ks_wrreg16(ks, KS_MARM, w); in ks_set_mac()
1250 ks_wrreg16(ks, KS_MARL, w); in ks_set_mac()
1252 memcpy(ks->mac_addr, data, ETH_ALEN); in ks_set_mac()
1254 if (ks->enabled) in ks_set_mac()
1255 ks_start_rx(ks); in ks_set_mac()
1260 struct ks_net *ks = netdev_priv(netdev); in ks_set_mac_address() local
1268 ks_set_mac(ks, da); in ks_set_mac_address()
1274 struct ks_net *ks = netdev_priv(netdev); in ks_net_ioctl() local
1279 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()
1318 struct ks_net *ks = netdev_priv(netdev); in ks_get_link_ksettings() local
1320 mii_ethtool_get_link_ksettings(&ks->mii, cmd); in ks_get_link_ksettings()
1328 struct ks_net *ks = netdev_priv(netdev); in ks_set_link_ksettings() local
1329 return mii_ethtool_set_link_ksettings(&ks->mii, cmd); in ks_set_link_ksettings()
1334 struct ks_net *ks = netdev_priv(netdev); in ks_get_link() local
1335 return mii_link_ok(&ks->mii); in ks_get_link()
1340 struct ks_net *ks = netdev_priv(netdev); in ks_nway_reset() local
1341 return mii_nway_restart(&ks->mii); in ks_nway_reset()
1401 struct ks_net *ks = netdev_priv(netdev); in ks_phy_read() local
1409 mutex_lock(&ks->lock); in ks_phy_read()
1410 result = ks_rdreg16(ks, ksreg); in ks_phy_read()
1411 mutex_unlock(&ks->lock); in ks_phy_read()
1419 struct ks_net *ks = netdev_priv(netdev); in ks_phy_write() local
1424 mutex_lock(&ks->lock); in ks_phy_write()
1425 ks_wrreg16(ks, ksreg, value); in ks_phy_write()
1426 mutex_unlock(&ks->lock); in ks_phy_write()
1436 static int ks_read_selftest(struct ks_net *ks) in ks_read_selftest() argument
1442 rd = ks_rdreg16(ks, KS_MBIR); in ks_read_selftest()
1445 netdev_warn(ks->netdev, "Memory selftest not finished\n"); in ks_read_selftest()
1450 netdev_err(ks->netdev, "TX memory selftest fails\n"); in ks_read_selftest()
1455 netdev_err(ks->netdev, "RX memory selftest fails\n"); in ks_read_selftest()
1459 netdev_info(ks->netdev, "the selftest passes\n"); in ks_read_selftest()
1463 static void ks_setup(struct ks_net *ks) in ks_setup() argument
1472 ks_wrreg16(ks, KS_TXFDPR, TXFDPR_TXFPAI); in ks_setup()
1475 ks_wrreg16(ks, KS_RXFDPR, RXFDPR_RXFPAI); in ks_setup()
1478 ks_wrreg16(ks, KS_RXFCTR, 1 & RXFCTR_THRESHOLD_MASK); in ks_setup()
1481 ks->rc_rxqcr = RXQCR_CMD_CNTL; in ks_setup()
1482 ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr); in ks_setup()
1490 w = ks_rdreg16(ks, KS_P1MBCR); in ks_setup()
1492 ks_wrreg16(ks, KS_P1MBCR, w); in ks_setup()
1495 ks_wrreg16(ks, KS_TXCR, w); in ks_setup()
1499 if (ks->promiscuous) /* bPromiscuous */ in ks_setup()
1501 else if (ks->all_mcast) /* Multicast address passed mode */ in ks_setup()
1506 ks_wrreg16(ks, KS_RXCR1, w); in ks_setup()
1510 static void ks_setup_int(struct ks_net *ks) in ks_setup_int() argument
1512 ks->rc_ier = 0x00; in ks_setup_int()
1514 ks_wrreg16(ks, KS_ISR, 0xffff); in ks_setup_int()
1517 ks->rc_ier = (IRQ_LCI | IRQ_TXI | IRQ_RXI); in ks_setup_int()
1520 static int ks_hw_init(struct ks_net *ks) in ks_hw_init() argument
1523 ks->promiscuous = 0; in ks_hw_init()
1524 ks->all_mcast = 0; in ks_hw_init()
1525 ks->mcast_lst_size = 0; in ks_hw_init()
1527 ks->frame_head_info = devm_kmalloc(&ks->pdev->dev, MHEADER_SIZE, in ks_hw_init()
1529 if (!ks->frame_head_info) in ks_hw_init()
1532 ks_set_mac(ks, KS_DEFAULT_MAC_ADDRESS); in ks_hw_init()
1549 struct ks_net *ks; in ks8851_probe() local
1559 ks = netdev_priv(netdev); in ks8851_probe()
1560 ks->netdev = netdev; in ks8851_probe()
1563 ks->hw_addr = devm_ioremap_resource(&pdev->dev, io_d); in ks8851_probe()
1564 if (IS_ERR(ks->hw_addr)) { in ks8851_probe()
1565 err = PTR_ERR(ks->hw_addr); in ks8851_probe()
1570 ks->hw_addr_cmd = devm_ioremap_resource(&pdev->dev, io_c); in ks8851_probe()
1571 if (IS_ERR(ks->hw_addr_cmd)) { in ks8851_probe()
1572 err = PTR_ERR(ks->hw_addr_cmd); in ks8851_probe()
1583 ks->pdev = pdev; in ks8851_probe()
1585 mutex_init(&ks->lock); in ks8851_probe()
1586 spin_lock_init(&ks->statelock); in ks8851_probe()
1592 ks->mii.dev = netdev; in ks8851_probe()
1593 ks->mii.phy_id = 1, in ks8851_probe()
1594 ks->mii.phy_id_mask = 1; in ks8851_probe()
1595 ks->mii.reg_num_mask = 0xf; in ks8851_probe()
1596 ks->mii.mdio_read = ks_phy_read; in ks8851_probe()
1597 ks->mii.mdio_write = ks_phy_write; in ks8851_probe()
1601 ks->msg_enable = netif_msg_init(msg_enable, (NETIF_MSG_DRV | in ks8851_probe()
1604 ks_read_config(ks); in ks8851_probe()
1607 if ((ks_rdreg16(ks, KS_CIDER) & ~CIDER_REV_MASK) != CIDER_ID) { in ks8851_probe()
1613 if (ks_read_selftest(ks)) { in ks8851_probe()
1625 ks_soft_reset(ks, GRR_GSR); in ks8851_probe()
1626 ks_hw_init(ks); in ks8851_probe()
1627 ks_disable_qmu(ks); in ks8851_probe()
1628 ks_setup(ks); in ks8851_probe()
1629 ks_setup_int(ks); in ks8851_probe()
1631 data = ks_rdreg16(ks, KS_OBCR); in ks8851_probe()
1632 ks_wrreg16(ks, KS_OBCR, data | OBCR_ODS_16MA); in ks8851_probe()
1638 memcpy(ks->mac_addr, mac, ETH_ALEN); in ks8851_probe()
1648 memcpy(ks->mac_addr, pdata->mac_addr, ETH_ALEN); in ks8851_probe()
1650 if (!is_valid_ether_addr(ks->mac_addr)) { in ks8851_probe()
1652 eth_random_addr(ks->mac_addr); in ks8851_probe()
1655 netdev_info(netdev, "Mac address is: %pM\n", ks->mac_addr); in ks8851_probe()
1657 memcpy(netdev->dev_addr, ks->mac_addr, ETH_ALEN); in ks8851_probe()
1659 ks_set_mac(ks, netdev->dev_addr); in ks8851_probe()
1661 id = ks_rdreg16(ks, KS_CIDER); in ks8851_probe()