Lines Matching +full:3 +full:- +full:port
1 // SPDX-License-Identifier: GPL-2.0-only
7 * Ethernet port config (0x00 is not present on IXP42X):
9 * logical port 0x00 0x10 0x20
10 * NPE 0 (NPE-A) 1 (NPE-B) 2 (NPE-C)
13 * RX-free queue 26 27 28
14 * TX-done queue is always 31, per-port RX and TX-ready queues are configurable
17 * bits 0 -> 1 - NPE ID (RX and TX-done)
18 * bits 0 -> 2 - priority (TX, per 802.1D)
19 * bits 3 -> 4 - port ID (user-set?)
20 * bits 5 -> 31 - physical descriptor address
24 #include <linux/dma-mapping.h>
51 #define MAX_NPES 3
63 #define MDIO_INTERVAL (3 * HZ)
65 #define MAX_CLOSE_WAIT 1000 /* microseconds, typically 2-3 cycles */
68 #define PHYSICAL_ID(port_id) ((NPE_ID(port_id) + 2) % 3)
75 #define PORT2CHANNEL(p) NPE_ID(p->id)
103 #define CORE_MDC_EN 0x10 /* MDIO using NPE-B ETH-0 only */
151 u32 random_seed, __res3[3]; /* 020 */
154 u32 tx_start_bytes, __res6[3]; /* 040 */
157 u32 slot_time, __res9[3]; /* 070 */
162 u32 int_clock_threshold, __res12[3]; /* 0E0 */
167 struct port { struct
177 int id; /* logical port ID */ argument
233 #define rx_desc_phys(port, n) ((port)->desc_tab_phys + \ argument
235 #define rx_desc_ptr(port, n) (&(port)->desc_tab[n]) argument
237 #define tx_desc_phys(port, n) ((port)->desc_tab_phys + \ argument
239 #define tx_desc_ptr(port, n) (&(port)->desc_tab[(n) + RX_DESCS]) argument
254 static struct port *npe_port_tab[MAX_NPES];
259 u8 *data = skb->data; in ixp_ptp_match()
269 if (skb->len < offset + OFF_PTP_SEQUENCE_ID + sizeof(seqid)) in ixp_ptp_match()
282 static void ixp_rx_timestamp(struct port *port, struct sk_buff *skb) in ixp_rx_timestamp() argument
290 if (!port->hwts_rx_en) in ixp_rx_timestamp()
293 ch = PORT2CHANNEL(port); in ixp_rx_timestamp()
297 val = __raw_readl(®s->channel[ch].ch_event); in ixp_rx_timestamp()
302 lo = __raw_readl(®s->channel[ch].src_uuid_lo); in ixp_rx_timestamp()
303 hi = __raw_readl(®s->channel[ch].src_uuid_hi); in ixp_rx_timestamp()
311 lo = __raw_readl(®s->channel[ch].rx_snap_lo); in ixp_rx_timestamp()
312 hi = __raw_readl(®s->channel[ch].rx_snap_hi); in ixp_rx_timestamp()
319 shhwtstamps->hwtstamp = ns_to_ktime(ns); in ixp_rx_timestamp()
321 __raw_writel(RX_SNAPSHOT_LOCKED, ®s->channel[ch].ch_event); in ixp_rx_timestamp()
324 static void ixp_tx_timestamp(struct port *port, struct sk_buff *skb) in ixp_tx_timestamp() argument
333 if (unlikely(shtx->tx_flags & SKBTX_HW_TSTAMP && port->hwts_tx_en)) in ixp_tx_timestamp()
334 shtx->tx_flags |= SKBTX_IN_PROGRESS; in ixp_tx_timestamp()
338 ch = PORT2CHANNEL(port); in ixp_tx_timestamp()
347 val = __raw_readl(®s->channel[ch].ch_event); in ixp_tx_timestamp()
353 shtx->tx_flags &= ~SKBTX_IN_PROGRESS; in ixp_tx_timestamp()
357 lo = __raw_readl(®s->channel[ch].tx_snap_lo); in ixp_tx_timestamp()
358 hi = __raw_readl(®s->channel[ch].tx_snap_hi); in ixp_tx_timestamp()
367 __raw_writel(TX_SNAPSHOT_LOCKED, ®s->channel[ch].ch_event); in ixp_tx_timestamp()
374 struct port *port = netdev_priv(netdev); in hwtstamp_set() local
377 if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) in hwtstamp_set()
378 return -EFAULT; in hwtstamp_set()
381 return -EINVAL; in hwtstamp_set()
383 ch = PORT2CHANNEL(port); in hwtstamp_set()
387 return -ERANGE; in hwtstamp_set()
391 port->hwts_rx_en = 0; in hwtstamp_set()
394 port->hwts_rx_en = PTP_SLAVE_MODE; in hwtstamp_set()
395 __raw_writel(0, ®s->channel[ch].ch_control); in hwtstamp_set()
398 port->hwts_rx_en = PTP_MASTER_MODE; in hwtstamp_set()
399 __raw_writel(MASTER_MODE, ®s->channel[ch].ch_control); in hwtstamp_set()
402 return -ERANGE; in hwtstamp_set()
405 port->hwts_tx_en = cfg.tx_type == HWTSTAMP_TX_ON; in hwtstamp_set()
409 ®s->channel[ch].ch_event); in hwtstamp_set()
411 return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; in hwtstamp_set()
417 struct port *port = netdev_priv(netdev); in hwtstamp_get() local
420 cfg.tx_type = port->hwts_tx_en ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF; in hwtstamp_get()
422 switch (port->hwts_rx_en) { in hwtstamp_get()
434 return -ERANGE; in hwtstamp_get()
437 return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; in hwtstamp_get()
445 if (__raw_readl(&mdio_regs->mdio_command[3]) & 0x80) { in ixp4xx_mdio_cmd()
446 printk(KERN_ERR "%s: MII not ready to transmit\n", bus->name); in ixp4xx_mdio_cmd()
447 return -1; in ixp4xx_mdio_cmd()
451 __raw_writel(cmd & 0xFF, &mdio_regs->mdio_command[0]); in ixp4xx_mdio_cmd()
452 __raw_writel(cmd >> 8, &mdio_regs->mdio_command[1]); in ixp4xx_mdio_cmd()
455 &mdio_regs->mdio_command[2]); in ixp4xx_mdio_cmd()
456 __raw_writel((phy_id >> 3) | (write << 2) | 0x80 /* GO */, in ixp4xx_mdio_cmd()
457 &mdio_regs->mdio_command[3]); in ixp4xx_mdio_cmd()
460 (__raw_readl(&mdio_regs->mdio_command[3]) & 0x80)) { in ixp4xx_mdio_cmd()
466 printk(KERN_ERR "%s #%i: MII write failed\n", bus->name, in ixp4xx_mdio_cmd()
468 return -1; in ixp4xx_mdio_cmd()
472 printk(KERN_DEBUG "%s #%i: mdio_%s() took %i cycles\n", bus->name, in ixp4xx_mdio_cmd()
479 if (__raw_readl(&mdio_regs->mdio_status[3]) & 0x80) { in ixp4xx_mdio_cmd()
481 printk(KERN_DEBUG "%s #%i: MII read failed\n", bus->name, in ixp4xx_mdio_cmd()
487 return (__raw_readl(&mdio_regs->mdio_status[0]) & 0xFF) | in ixp4xx_mdio_cmd()
488 ((__raw_readl(&mdio_regs->mdio_status[1]) & 0xFF) << 8); in ixp4xx_mdio_cmd()
500 printk(KERN_DEBUG "%s #%i: MII read [%i] -> 0x%X\n", bus->name, in ixp4xx_mdio_read()
516 printk(KERN_DEBUG "%s #%i: MII write [%i] <- 0x%X, err = %i\n", in ixp4xx_mdio_write()
517 bus->name, phy_id, location, val, ret); in ixp4xx_mdio_write()
527 return -ENOMEM; in ixp4xx_mdio_register()
530 __raw_writel(DEFAULT_CORE_CNTRL, &mdio_regs->core_control); in ixp4xx_mdio_register()
532 mdio_bus->name = "IXP4xx MII Bus"; in ixp4xx_mdio_register()
533 mdio_bus->read = &ixp4xx_mdio_read; in ixp4xx_mdio_register()
534 mdio_bus->write = &ixp4xx_mdio_write; in ixp4xx_mdio_register()
535 snprintf(mdio_bus->id, MII_BUS_ID_SIZE, "ixp4xx-eth-0"); in ixp4xx_mdio_register()
551 struct port *port = netdev_priv(dev); in ixp4xx_adjust_link() local
552 struct phy_device *phydev = dev->phydev; in ixp4xx_adjust_link()
554 if (!phydev->link) { in ixp4xx_adjust_link()
555 if (port->speed) { in ixp4xx_adjust_link()
556 port->speed = 0; in ixp4xx_adjust_link()
557 printk(KERN_INFO "%s: link down\n", dev->name); in ixp4xx_adjust_link()
562 if (port->speed == phydev->speed && port->duplex == phydev->duplex) in ixp4xx_adjust_link()
565 port->speed = phydev->speed; in ixp4xx_adjust_link()
566 port->duplex = phydev->duplex; in ixp4xx_adjust_link()
568 if (port->duplex) in ixp4xx_adjust_link()
570 &port->regs->tx_control[0]); in ixp4xx_adjust_link()
573 &port->regs->tx_control[0]); in ixp4xx_adjust_link()
576 dev->name, port->speed, port->duplex ? "full" : "half"); in ixp4xx_adjust_link()
602 printk(KERN_DEBUG "%X: %X %3X %3X %08X %2X < %2X %4X %X" in debug_desc()
604 phys, desc->next, desc->buf_len, desc->pkt_len, in debug_desc()
605 desc->data, desc->dest_id, desc->src_id, desc->flags, in debug_desc()
606 desc->qos, desc->padlen, desc->vlan_tci, in debug_desc()
607 desc->dst_mac_0, desc->dst_mac_1, desc->dst_mac_2, in debug_desc()
608 desc->dst_mac_3, desc->dst_mac_4, desc->dst_mac_5, in debug_desc()
609 desc->src_mac_0, desc->src_mac_1, desc->src_mac_2, in debug_desc()
610 desc->src_mac_3, desc->src_mac_4, desc->src_mac_5); in debug_desc()
614 static inline int queue_get_desc(unsigned int queue, struct port *port, in queue_get_desc() argument
621 return -1; in queue_get_desc()
623 phys &= ~0x1F; /* mask out non-address bits */ in queue_get_desc()
624 tab_phys = is_tx ? tx_desc_phys(port, 0) : rx_desc_phys(port, 0); in queue_get_desc()
625 tab = is_tx ? tx_desc_ptr(port, 0) : rx_desc_ptr(port, 0); in queue_get_desc()
626 n_desc = (phys - tab_phys) / sizeof(struct desc); in queue_get_desc()
644 static inline void dma_unmap_tx(struct port *port, struct desc *desc) in dma_unmap_tx() argument
647 dma_unmap_single(&port->netdev->dev, desc->data, in dma_unmap_tx()
648 desc->buf_len, DMA_TO_DEVICE); in dma_unmap_tx()
650 dma_unmap_single(&port->netdev->dev, desc->data & ~3, in dma_unmap_tx()
651 ALIGN((desc->data & 3) + desc->buf_len, 4), in dma_unmap_tx()
660 struct port *port = netdev_priv(dev); in eth_rx_irq() local
663 printk(KERN_DEBUG "%s: eth_rx_irq\n", dev->name); in eth_rx_irq()
665 qmgr_disable_irq(port->plat->rxq); in eth_rx_irq()
666 napi_schedule(&port->napi); in eth_rx_irq()
671 struct port *port = container_of(napi, struct port, napi); in eth_poll() local
672 struct net_device *dev = port->netdev; in eth_poll()
673 unsigned int rxq = port->plat->rxq, rxfreeq = RXFREE_QUEUE(port->id); in eth_poll()
689 if ((n = queue_get_desc(rxq, port, 0)) < 0) { in eth_poll()
709 desc = rx_desc_ptr(port, n); in eth_poll()
713 phys = dma_map_single(&dev->dev, skb->data, in eth_poll()
715 if (dma_mapping_error(&dev->dev, phys)) { in eth_poll()
722 ALIGN(NET_IP_ALIGN + desc->pkt_len, 4)); in eth_poll()
726 dev->stats.rx_dropped++; in eth_poll()
727 /* put the desc back on RX-ready queue */ in eth_poll()
728 desc->buf_len = MAX_MRU; in eth_poll()
729 desc->pkt_len = 0; in eth_poll()
730 queue_put_desc(rxfreeq, rx_desc_phys(port, n), desc); in eth_poll()
737 skb = port->rx_buff_tab[n]; in eth_poll()
738 dma_unmap_single(&dev->dev, desc->data - NET_IP_ALIGN, in eth_poll()
741 dma_sync_single_for_cpu(&dev->dev, desc->data - NET_IP_ALIGN, in eth_poll()
743 memcpy_swab32((u32 *)skb->data, (u32 *)port->rx_buff_tab[n], in eth_poll()
744 ALIGN(NET_IP_ALIGN + desc->pkt_len, 4) / 4); in eth_poll()
747 skb_put(skb, desc->pkt_len); in eth_poll()
749 debug_pkt(dev, "eth_poll", skb->data, skb->len); in eth_poll()
751 ixp_rx_timestamp(port, skb); in eth_poll()
752 skb->protocol = eth_type_trans(skb, dev); in eth_poll()
753 dev->stats.rx_packets++; in eth_poll()
754 dev->stats.rx_bytes += skb->len; in eth_poll()
757 /* put the new buffer on RX-free queue */ in eth_poll()
759 port->rx_buff_tab[n] = temp; in eth_poll()
760 desc->data = phys + NET_IP_ALIGN; in eth_poll()
762 desc->buf_len = MAX_MRU; in eth_poll()
763 desc->pkt_len = 0; in eth_poll()
764 queue_put_desc(rxfreeq, rx_desc_phys(port, n), desc); in eth_poll()
784 struct port *port; in eth_txdone_irq() local
788 npe_id = phys & 3; in eth_txdone_irq()
790 port = npe_port_tab[npe_id]; in eth_txdone_irq()
791 BUG_ON(!port); in eth_txdone_irq()
792 phys &= ~0x1F; /* mask out non-address bits */ in eth_txdone_irq()
793 n_desc = (phys - tx_desc_phys(port, 0)) / sizeof(struct desc); in eth_txdone_irq()
795 desc = tx_desc_ptr(port, n_desc); in eth_txdone_irq()
798 if (port->tx_buff_tab[n_desc]) { /* not the draining packet */ in eth_txdone_irq()
799 port->netdev->stats.tx_packets++; in eth_txdone_irq()
800 port->netdev->stats.tx_bytes += desc->pkt_len; in eth_txdone_irq()
802 dma_unmap_tx(port, desc); in eth_txdone_irq()
805 port->netdev->name, port->tx_buff_tab[n_desc]); in eth_txdone_irq()
807 free_buffer_irq(port->tx_buff_tab[n_desc]); in eth_txdone_irq()
808 port->tx_buff_tab[n_desc] = NULL; in eth_txdone_irq()
811 start = qmgr_stat_below_low_watermark(port->plat->txreadyq); in eth_txdone_irq()
812 queue_put_desc(port->plat->txreadyq, phys, desc); in eth_txdone_irq()
813 if (start) { /* TX-ready queue was empty */ in eth_txdone_irq()
816 port->netdev->name); in eth_txdone_irq()
818 netif_wake_queue(port->netdev); in eth_txdone_irq()
825 struct port *port = netdev_priv(dev); in eth_xmit() local
826 unsigned int txreadyq = port->plat->txreadyq; in eth_xmit()
836 if (unlikely(skb->len > MAX_MRU)) { in eth_xmit()
838 dev->stats.tx_errors++; in eth_xmit()
842 debug_pkt(dev, "eth_xmit", skb->data, skb->len); in eth_xmit()
844 len = skb->len; in eth_xmit()
848 mem = skb->data; in eth_xmit()
850 offset = (int)skb->data & 3; /* keep 32-bit alignment */ in eth_xmit()
854 dev->stats.tx_dropped++; in eth_xmit()
857 memcpy_swab32(mem, (u32 *)((int)skb->data & ~3), bytes / 4); in eth_xmit()
860 phys = dma_map_single(&dev->dev, mem, bytes, DMA_TO_DEVICE); in eth_xmit()
861 if (dma_mapping_error(&dev->dev, phys)) { in eth_xmit()
866 dev->stats.tx_dropped++; in eth_xmit()
870 n = queue_get_desc(txreadyq, port, 1); in eth_xmit()
872 desc = tx_desc_ptr(port, n); in eth_xmit()
875 port->tx_buff_tab[n] = skb; in eth_xmit()
877 port->tx_buff_tab[n] = mem; in eth_xmit()
879 desc->data = phys + offset; in eth_xmit()
880 desc->buf_len = desc->pkt_len = len; in eth_xmit()
884 queue_put_desc(TX_QUEUE(port->id), tx_desc_phys(port, n), desc); in eth_xmit()
905 ixp_tx_timestamp(port, skb); in eth_xmit()
917 struct port *port = netdev_priv(dev); in eth_set_mcast_list() local
923 if ((dev->flags & IFF_ALLMULTI) && !(dev->flags & IFF_PROMISC)) { in eth_set_mcast_list()
925 __raw_writel(allmulti[i], &port->regs->mcast_addr[i]); in eth_set_mcast_list()
926 __raw_writel(allmulti[i], &port->regs->mcast_mask[i]); in eth_set_mcast_list()
929 &port->regs->rx_control[0]); in eth_set_mcast_list()
933 if ((dev->flags & IFF_PROMISC) || netdev_mc_empty(dev)) { in eth_set_mcast_list()
935 &port->regs->rx_control[0]); in eth_set_mcast_list()
944 addr = ha->addr; /* first MAC address */ in eth_set_mcast_list()
946 diffs[i] |= addr[i] ^ ha->addr[i]; in eth_set_mcast_list()
950 __raw_writel(addr[i], &port->regs->mcast_addr[i]); in eth_set_mcast_list()
951 __raw_writel(~diffs[i], &port->regs->mcast_mask[i]); in eth_set_mcast_list()
955 &port->regs->rx_control[0]); in eth_set_mcast_list()
962 return -EINVAL; in eth_ioctl()
971 return phy_mii_ioctl(dev->phydev, req, cmd); in eth_ioctl()
979 struct port *port = netdev_priv(dev); in ixp4xx_get_drvinfo() local
981 strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); in ixp4xx_get_drvinfo()
982 snprintf(info->fw_version, sizeof(info->fw_version), "%u:%u:%u:%u", in ixp4xx_get_drvinfo()
983 port->firmware[0], port->firmware[1], in ixp4xx_get_drvinfo()
984 port->firmware[2], port->firmware[3]); in ixp4xx_get_drvinfo()
985 strlcpy(info->bus_info, "internal", sizeof(info->bus_info)); in ixp4xx_get_drvinfo()
988 int ixp46x_phc_index = -1;
995 info->so_timestamping = in ixp4xx_get_ts_info()
999 info->phc_index = -1; in ixp4xx_get_ts_info()
1002 info->so_timestamping = in ixp4xx_get_ts_info()
1006 info->phc_index = ixp46x_phc_index; in ixp4xx_get_ts_info()
1007 info->tx_types = in ixp4xx_get_ts_info()
1010 info->rx_filters = in ixp4xx_get_ts_info()
1027 static int request_queues(struct port *port) in request_queues() argument
1031 err = qmgr_request_queue(RXFREE_QUEUE(port->id), RX_DESCS, 0, 0, in request_queues()
1032 "%s:RX-free", port->netdev->name); in request_queues()
1036 err = qmgr_request_queue(port->plat->rxq, RX_DESCS, 0, 0, in request_queues()
1037 "%s:RX", port->netdev->name); in request_queues()
1041 err = qmgr_request_queue(TX_QUEUE(port->id), TX_DESCS, 0, 0, in request_queues()
1042 "%s:TX", port->netdev->name); in request_queues()
1046 err = qmgr_request_queue(port->plat->txreadyq, TX_DESCS, 0, 0, in request_queues()
1047 "%s:TX-ready", port->netdev->name); in request_queues()
1051 /* TX-done queue handles skbs sent out by the NPEs */ in request_queues()
1054 "%s:TX-done", DRV_NAME); in request_queues()
1061 qmgr_release_queue(port->plat->txreadyq); in request_queues()
1063 qmgr_release_queue(TX_QUEUE(port->id)); in request_queues()
1065 qmgr_release_queue(port->plat->rxq); in request_queues()
1067 qmgr_release_queue(RXFREE_QUEUE(port->id)); in request_queues()
1069 port->netdev->name); in request_queues()
1073 static void release_queues(struct port *port) in release_queues() argument
1075 qmgr_release_queue(RXFREE_QUEUE(port->id)); in release_queues()
1076 qmgr_release_queue(port->plat->rxq); in release_queues()
1077 qmgr_release_queue(TX_QUEUE(port->id)); in release_queues()
1078 qmgr_release_queue(port->plat->txreadyq); in release_queues()
1084 static int init_queues(struct port *port) in init_queues() argument
1089 dma_pool = dma_pool_create(DRV_NAME, port->netdev->dev.parent, in init_queues()
1092 return -ENOMEM; in init_queues()
1095 if (!(port->desc_tab = dma_pool_alloc(dma_pool, GFP_KERNEL, in init_queues()
1096 &port->desc_tab_phys))) in init_queues()
1097 return -ENOMEM; in init_queues()
1098 memset(port->desc_tab, 0, POOL_ALLOC_SIZE); in init_queues()
1099 memset(port->rx_buff_tab, 0, sizeof(port->rx_buff_tab)); /* tables */ in init_queues()
1100 memset(port->tx_buff_tab, 0, sizeof(port->tx_buff_tab)); in init_queues()
1104 struct desc *desc = rx_desc_ptr(port, i); in init_queues()
1108 if (!(buff = netdev_alloc_skb(port->netdev, RX_BUFF_SIZE))) in init_queues()
1109 return -ENOMEM; in init_queues()
1110 data = buff->data; in init_queues()
1113 return -ENOMEM; in init_queues()
1116 desc->buf_len = MAX_MRU; in init_queues()
1117 desc->data = dma_map_single(&port->netdev->dev, data, in init_queues()
1119 if (dma_mapping_error(&port->netdev->dev, desc->data)) { in init_queues()
1121 return -EIO; in init_queues()
1123 desc->data += NET_IP_ALIGN; in init_queues()
1124 port->rx_buff_tab[i] = buff; in init_queues()
1130 static void destroy_queues(struct port *port) in destroy_queues() argument
1134 if (port->desc_tab) { in destroy_queues()
1136 struct desc *desc = rx_desc_ptr(port, i); in destroy_queues()
1137 buffer_t *buff = port->rx_buff_tab[i]; in destroy_queues()
1139 dma_unmap_single(&port->netdev->dev, in destroy_queues()
1140 desc->data - NET_IP_ALIGN, in destroy_queues()
1146 struct desc *desc = tx_desc_ptr(port, i); in destroy_queues()
1147 buffer_t *buff = port->tx_buff_tab[i]; in destroy_queues()
1149 dma_unmap_tx(port, desc); in destroy_queues()
1153 dma_pool_free(dma_pool, port->desc_tab, port->desc_tab_phys); in destroy_queues()
1154 port->desc_tab = NULL; in destroy_queues()
1165 struct port *port = netdev_priv(dev); in eth_open() local
1166 struct npe *npe = port->npe; in eth_open()
1171 err = npe_load_firmware(npe, npe_name(npe), &dev->dev); in eth_open()
1177 return -EIO; in eth_open()
1179 port->firmware[0] = msg.byte4; in eth_open()
1180 port->firmware[1] = msg.byte5; in eth_open()
1181 port->firmware[2] = msg.byte6; in eth_open()
1182 port->firmware[3] = msg.byte7; in eth_open()
1187 msg.eth_id = port->id; in eth_open()
1188 msg.byte5 = port->plat->rxq | 0x80; in eth_open()
1189 msg.byte7 = port->plat->rxq << 4; in eth_open()
1192 if (npe_send_recv_message(port->npe, &msg, "ETH_SET_RXQ")) in eth_open()
1193 return -EIO; in eth_open()
1197 msg.eth_id = PHYSICAL_ID(port->id); in eth_open()
1198 msg.byte2 = dev->dev_addr[0]; in eth_open()
1199 msg.byte3 = dev->dev_addr[1]; in eth_open()
1200 msg.byte4 = dev->dev_addr[2]; in eth_open()
1201 msg.byte5 = dev->dev_addr[3]; in eth_open()
1202 msg.byte6 = dev->dev_addr[4]; in eth_open()
1203 msg.byte7 = dev->dev_addr[5]; in eth_open()
1204 if (npe_send_recv_message(port->npe, &msg, "ETH_SET_MAC")) in eth_open()
1205 return -EIO; in eth_open()
1209 msg.eth_id = port->id; in eth_open()
1210 if (npe_send_recv_message(port->npe, &msg, "ETH_SET_FIREWALL_MODE")) in eth_open()
1211 return -EIO; in eth_open()
1213 if ((err = request_queues(port)) != 0) in eth_open()
1216 if ((err = init_queues(port)) != 0) { in eth_open()
1217 destroy_queues(port); in eth_open()
1218 release_queues(port); in eth_open()
1222 port->speed = 0; /* force "link up" message */ in eth_open()
1223 phy_start(dev->phydev); in eth_open()
1226 __raw_writel(dev->dev_addr[i], &port->regs->hw_addr[i]); in eth_open()
1227 __raw_writel(0x08, &port->regs->random_seed); in eth_open()
1228 __raw_writel(0x12, &port->regs->partial_empty_threshold); in eth_open()
1229 __raw_writel(0x30, &port->regs->partial_full_threshold); in eth_open()
1230 __raw_writel(0x08, &port->regs->tx_start_bytes); in eth_open()
1231 __raw_writel(0x15, &port->regs->tx_deferral); in eth_open()
1232 __raw_writel(0x08, &port->regs->tx_2part_deferral[0]); in eth_open()
1233 __raw_writel(0x07, &port->regs->tx_2part_deferral[1]); in eth_open()
1234 __raw_writel(0x80, &port->regs->slot_time); in eth_open()
1235 __raw_writel(0x01, &port->regs->int_clock_threshold); in eth_open()
1239 queue_put_desc(port->plat->txreadyq, in eth_open()
1240 tx_desc_phys(port, i), tx_desc_ptr(port, i)); in eth_open()
1243 queue_put_desc(RXFREE_QUEUE(port->id), in eth_open()
1244 rx_desc_phys(port, i), rx_desc_ptr(port, i)); in eth_open()
1246 __raw_writel(TX_CNTRL1_RETRIES, &port->regs->tx_control[1]); in eth_open()
1247 __raw_writel(DEFAULT_TX_CNTRL0, &port->regs->tx_control[0]); in eth_open()
1248 __raw_writel(0, &port->regs->rx_control[1]); in eth_open()
1249 __raw_writel(DEFAULT_RX_CNTRL0, &port->regs->rx_control[0]); in eth_open()
1251 napi_enable(&port->napi); in eth_open()
1255 qmgr_set_irq(port->plat->rxq, QUEUE_IRQ_SRC_NOT_EMPTY, in eth_open()
1264 napi_schedule(&port->napi); in eth_open()
1270 struct port *port = netdev_priv(dev); in eth_close() local
1275 ports_open--; in eth_close()
1276 qmgr_disable_irq(port->plat->rxq); in eth_close()
1277 napi_disable(&port->napi); in eth_close()
1280 while (queue_get_desc(RXFREE_QUEUE(port->id), port, 0) >= 0) in eth_close()
1281 buffs--; in eth_close()
1285 msg.eth_id = port->id; in eth_close()
1287 if (npe_send_recv_message(port->npe, &msg, "ETH_ENABLE_LOOPBACK")) in eth_close()
1292 while (queue_get_desc(port->plat->rxq, port, 0) >= 0) in eth_close()
1293 buffs--; in eth_close()
1296 if (qmgr_stat_empty(TX_QUEUE(port->id))) { in eth_close()
1300 int n = queue_get_desc(port->plat->txreadyq, port, 1); in eth_close()
1302 desc = tx_desc_ptr(port, n); in eth_close()
1303 phys = tx_desc_phys(port, n); in eth_close()
1304 desc->buf_len = desc->pkt_len = 1; in eth_close()
1306 queue_put_desc(TX_QUEUE(port->id), phys, desc); in eth_close()
1320 while (queue_get_desc(TX_QUEUE(port->id), port, 1) >= 0) in eth_close()
1321 buffs--; /* cancel TX */ in eth_close()
1325 while (queue_get_desc(port->plat->txreadyq, port, 1) >= 0) in eth_close()
1326 buffs--; in eth_close()
1340 if (npe_send_recv_message(port->npe, &msg, "ETH_DISABLE_LOOPBACK")) in eth_close()
1343 phy_stop(dev->phydev); in eth_close()
1347 destroy_queues(port); in eth_close()
1348 release_queues(port); in eth_close()
1364 char phy_id[MII_BUS_ID_SIZE + 3]; in ixp4xx_eth_probe()
1366 struct device *dev = &pdev->dev; in ixp4xx_eth_probe()
1371 struct port *port; in ixp4xx_eth_probe() local
1376 if (!(ndev = devm_alloc_etherdev(dev, sizeof(struct port)))) in ixp4xx_eth_probe()
1377 return -ENOMEM; in ixp4xx_eth_probe()
1380 port = netdev_priv(ndev); in ixp4xx_eth_probe()
1381 port->netdev = ndev; in ixp4xx_eth_probe()
1382 port->id = pdev->id; in ixp4xx_eth_probe()
1384 /* Get the port resource and remap */ in ixp4xx_eth_probe()
1387 return -ENODEV; in ixp4xx_eth_probe()
1388 regs_phys = res->start; in ixp4xx_eth_probe()
1389 port->regs = devm_ioremap_resource(dev, res); in ixp4xx_eth_probe()
1390 if (IS_ERR(port->regs)) in ixp4xx_eth_probe()
1391 return PTR_ERR(port->regs); in ixp4xx_eth_probe()
1393 switch (port->id) { in ixp4xx_eth_probe()
1397 return -EPROBE_DEFER; in ixp4xx_eth_probe()
1401 * On all except IXP43x, NPE-B is used for the MDIO bus. in ixp4xx_eth_probe()
1402 * If there is no NPE-B in the feature set, bail out, else in ixp4xx_eth_probe()
1408 return -ENODEV; in ixp4xx_eth_probe()
1409 /* Else register the MDIO bus on NPE-B */ in ixp4xx_eth_probe()
1410 if ((err = ixp4xx_mdio_register(port->regs))) in ixp4xx_eth_probe()
1414 return -EPROBE_DEFER; in ixp4xx_eth_probe()
1418 * IXP43x lacks NPE-B and uses NPE-C for the MDIO bus access, in ixp4xx_eth_probe()
1419 * of there is no NPE-C, no bus, nothing works, so bail out. in ixp4xx_eth_probe()
1424 return -ENODEV; in ixp4xx_eth_probe()
1425 /* Else register the MDIO bus on NPE-C */ in ixp4xx_eth_probe()
1426 if ((err = ixp4xx_mdio_register(port->regs))) in ixp4xx_eth_probe()
1430 return -EPROBE_DEFER; in ixp4xx_eth_probe()
1433 return -ENODEV; in ixp4xx_eth_probe()
1436 ndev->netdev_ops = &ixp4xx_netdev_ops; in ixp4xx_eth_probe()
1437 ndev->ethtool_ops = &ixp4xx_ethtool_ops; in ixp4xx_eth_probe()
1438 ndev->tx_queue_len = 100; in ixp4xx_eth_probe()
1440 netif_napi_add(ndev, &port->napi, eth_poll, NAPI_WEIGHT); in ixp4xx_eth_probe()
1442 if (!(port->npe = npe_request(NPE_ID(port->id)))) in ixp4xx_eth_probe()
1443 return -EIO; in ixp4xx_eth_probe()
1445 port->mem_res = request_mem_region(regs_phys, REGS_SIZE, ndev->name); in ixp4xx_eth_probe()
1446 if (!port->mem_res) { in ixp4xx_eth_probe()
1447 err = -EBUSY; in ixp4xx_eth_probe()
1451 port->plat = plat; in ixp4xx_eth_probe()
1452 npe_port_tab[NPE_ID(port->id)] = port; in ixp4xx_eth_probe()
1453 memcpy(ndev->dev_addr, plat->hwaddr, ETH_ALEN); in ixp4xx_eth_probe()
1458 &port->regs->core_control); in ixp4xx_eth_probe()
1460 __raw_writel(DEFAULT_CORE_CNTRL, &port->regs->core_control); in ixp4xx_eth_probe()
1463 snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, in ixp4xx_eth_probe()
1464 mdio_bus->id, plat->phy); in ixp4xx_eth_probe()
1472 phydev->irq = PHY_POLL; in ixp4xx_eth_probe()
1477 netdev_info(ndev, "%s: MII PHY %i on %s\n", ndev->name, plat->phy, in ixp4xx_eth_probe()
1478 npe_name(port->npe)); in ixp4xx_eth_probe()
1485 npe_port_tab[NPE_ID(port->id)] = NULL; in ixp4xx_eth_probe()
1486 release_resource(port->mem_res); in ixp4xx_eth_probe()
1488 npe_release(port->npe); in ixp4xx_eth_probe()
1495 struct phy_device *phydev = ndev->phydev; in ixp4xx_eth_remove()
1496 struct port *port = netdev_priv(ndev); in ixp4xx_eth_remove() local
1501 npe_port_tab[NPE_ID(port->id)] = NULL; in ixp4xx_eth_remove()
1502 npe_release(port->npe); in ixp4xx_eth_remove()
1503 release_resource(port->mem_res); in ixp4xx_eth_remove()