Lines Matching refs:mac

83 static unsigned int read_mac_reg(const struct pasemi_mac *mac, unsigned int reg)
85 return pasemi_read_mac_reg(mac->dma_if, reg);
88 static void write_mac_reg(const struct pasemi_mac *mac, unsigned int reg,
91 pasemi_write_mac_reg(mac->dma_if, reg, val);
104 static struct pasemi_mac_rxring *rx_ring(const struct pasemi_mac *mac)
106 return mac->rx;
109 static struct pasemi_mac_txring *tx_ring(const struct pasemi_mac *mac)
111 return mac->tx;
124 static int mac_to_intf(struct pasemi_mac *mac)
126 struct pci_dev *pdev = mac->pdev;
152 static void pasemi_mac_intf_disable(struct pasemi_mac *mac)
156 flags = read_mac_reg(mac, PAS_MAC_CFG_PCFG);
158 write_mac_reg(mac, PAS_MAC_CFG_PCFG, flags);
161 static void pasemi_mac_intf_enable(struct pasemi_mac *mac)
165 flags = read_mac_reg(mac, PAS_MAC_CFG_PCFG);
167 write_mac_reg(mac, PAS_MAC_CFG_PCFG, flags);
170 static int pasemi_get_mac_addr(struct pasemi_mac *mac)
172 struct pci_dev *pdev = mac->pdev;
180 "No device node for mac, not configuring\n");
184 maddr = of_get_property(dn, "local-mac-address", &len);
187 memcpy(mac->mac_addr, maddr, ETH_ALEN);
191 /* Some old versions of firmware mistakenly uses mac-address
192 * (and as a string) instead of a byte array in local-mac-address.
196 maddr = of_get_property(dn, "mac-address", NULL);
200 "no mac address in device tree, not configuring\n");
206 "can't parse mac address, not configuring\n");
210 memcpy(mac->mac_addr, addr, ETH_ALEN);
217 struct pasemi_mac *mac = netdev_priv(dev);
230 adr1 = read_mac_reg(mac, PAS_MAC_CFG_ADR1);
234 pasemi_mac_intf_disable(mac);
235 write_mac_reg(mac, PAS_MAC_CFG_ADR0, adr0);
236 write_mac_reg(mac, PAS_MAC_CFG_ADR1, adr1);
237 pasemi_mac_intf_enable(mac);
242 static int pasemi_mac_unmap_tx_skb(struct pasemi_mac *mac,
248 struct pci_dev *pdev = mac->dma_pdev;
266 static struct pasemi_mac_csring *pasemi_mac_setup_csring(struct pasemi_mac *mac)
277 dev_err(&mac->pdev->dev, "Can't allocate checksum channel\n");
340 static void pasemi_mac_setup_csrings(struct pasemi_mac *mac)
343 mac->cs[0] = pasemi_mac_setup_csring(mac);
344 if (mac->type == MAC_TYPE_XAUI)
345 mac->cs[1] = pasemi_mac_setup_csring(mac);
347 mac->cs[1] = 0;
350 if (mac->cs[i])
351 mac->num_cs++;
367 struct pasemi_mac *mac = netdev_priv(dev);
375 dev_err(&mac->pdev->dev, "Can't allocate RX channel\n");
394 ring->buffers = dma_alloc_coherent(&mac->dma_pdev->dev,
414 write_dma_reg(PAS_DMA_RXINT_BASEL(mac->dma_if),
417 write_dma_reg(PAS_DMA_RXINT_BASEU(mac->dma_if),
428 write_dma_reg(PAS_DMA_RXINT_CFG(mac->dma_if), cfg);
432 ring->mac = mac;
433 mac->rx = ring;
448 struct pasemi_mac *mac = netdev_priv(dev);
458 dev_err(&mac->pdev->dev, "Can't allocate TX channel\n");
485 PAS_DMA_TXCHAN_CFG_TATTR(mac->dma_if) |
496 ring->mac = mac;
508 static void pasemi_mac_free_tx_resources(struct pasemi_mac *mac)
510 struct pasemi_mac_txring *txring = tx_ring(mac);
531 freed = pasemi_mac_unmap_tx_skb(mac, nfrags,
543 static void pasemi_mac_free_rx_buffers(struct pasemi_mac *mac)
545 struct pasemi_mac_rxring *rx = rx_ring(mac);
552 dma_unmap_single(&mac->dma_pdev->dev, info->dma,
564 static void pasemi_mac_free_rx_resources(struct pasemi_mac *mac)
566 pasemi_mac_free_rx_buffers(mac);
568 dma_free_coherent(&mac->dma_pdev->dev, RX_RING_SIZE * sizeof(u64),
569 rx_ring(mac)->buffers, rx_ring(mac)->buf_dma);
571 kfree(rx_ring(mac)->ring_info);
572 pasemi_dma_free_chan(&rx_ring(mac)->chan);
573 mac->rx = NULL;
579 const struct pasemi_mac *mac = netdev_priv(dev);
580 struct pasemi_mac_rxring *rx = rx_ring(mac);
586 fill = rx_ring(mac)->next_to_fill;
596 skb = netdev_alloc_skb(dev, mac->bufsz);
602 dma = dma_map_single(&mac->dma_pdev->dev, skb->data,
603 mac->bufsz - LOCAL_SKB_ALIGN,
606 if (dma_mapping_error(&mac->dma_pdev->dev, dma)) {
613 *buff = XCT_RXB_LEN(mac->bufsz) | XCT_RXB_ADDR(dma);
619 write_dma_reg(PAS_DMA_RXINT_INCR(mac->dma_if), count);
621 rx_ring(mac)->next_to_fill = (rx_ring(mac)->next_to_fill + count) &
625 static void pasemi_mac_restart_rx_intr(const struct pasemi_mac *mac)
627 struct pasemi_mac_rxring *rx = rx_ring(mac);
640 write_iob_reg(PAS_IOB_DMA_RXCH_RESET(mac->rx->chan.chno), reg);
643 static void pasemi_mac_restart_tx_intr(const struct pasemi_mac *mac)
648 pcnt = *tx_ring(mac)->chan.status & PAS_STATUS_PCNT_M;
652 write_iob_reg(PAS_IOB_DMA_TXCH_RESET(tx_ring(mac)->chan.chno), reg);
656 static inline void pasemi_mac_rx_error(const struct pasemi_mac *mac,
660 struct pasemi_dmachan *chan = &rx_ring(mac)->chan;
662 if (!netif_msg_rx_err(mac))
665 rcmdsta = read_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if));
675 static inline void pasemi_mac_tx_error(const struct pasemi_mac *mac,
679 struct pasemi_dmachan *chan = &tx_ring(mac)->chan;
681 if (!netif_msg_tx_err(mac))
696 struct pasemi_mac *mac = rx->mac;
697 struct pci_dev *pdev = mac->dma_pdev;
721 pasemi_mac_rx_error(mac, macrx);
744 mac->bufsz - LOCAL_SKB_ALIGN,
749 mac->netdev->stats.rx_errors++;
750 mac->netdev->stats.rx_crc_errors++;
772 skb->protocol = eth_type_trans(skb, mac->netdev);
773 napi_gro_receive(&mac->napi, skb);
793 rx_ring(mac)->next_to_clean = n;
799 write_dma_reg(PAS_DMA_RXCHAN_INCR(mac->rx->chan.chno), count << 1);
801 pasemi_mac_replenish_rx_ring(mac->netdev, count);
803 mac->netdev->stats.rx_bytes += tot_bytes;
804 mac->netdev->stats.rx_packets += packets;
806 spin_unlock(&rx_ring(mac)->lock);
817 struct pasemi_mac *mac = txring->mac;
853 pasemi_mac_tx_error(mac, mactx);
891 netif_wake_queue(mac->netdev);
894 pasemi_mac_unmap_tx_skb(mac, nf[i], skbs[i], dmas[i]);
909 struct pasemi_mac *mac = rxring->mac;
926 napi_schedule(&mac->napi);
939 struct pasemi_mac *mac = txring->mac;
945 pasemi_mac_restart_tx_intr(mac);
952 struct pasemi_mac *mac = txring->mac;
967 napi_schedule(&mac->napi);
977 struct pasemi_mac *mac = netdev_priv(dev);
986 if (mac->link && netif_msg_link(mac))
990 pasemi_mac_intf_disable(mac);
991 mac->link = 0;
995 pasemi_mac_intf_enable(mac);
999 flags = read_mac_reg(mac, PAS_MAC_CFG_PCFG);
1024 msg = mac->link != dev->phydev->link || flags != new_flags;
1026 mac->duplex = dev->phydev->duplex;
1027 mac->speed = dev->phydev->speed;
1028 mac->link = dev->phydev->link;
1031 write_mac_reg(mac, PAS_MAC_CFG_PCFG, new_flags);
1033 if (msg && netif_msg_link(mac))
1035 dev->name, mac->speed, mac->duplex ? "full" : "half");
1040 struct pasemi_mac *mac = netdev_priv(dev);
1044 dn = pci_device_to_OF_node(mac->pdev);
1047 mac->link = 0;
1048 mac->speed = 0;
1049 mac->duplex = -1;
1066 struct pasemi_mac *mac = netdev_priv(dev);
1074 write_mac_reg(mac, PAS_MAC_CFG_TXP, flags);
1080 mac->tx = pasemi_mac_setup_tx_resources(dev);
1082 if (!mac->tx) {
1090 if (dev->mtu > 1500 && !mac->num_cs) {
1091 pasemi_mac_setup_csrings(mac);
1092 if (!mac->num_cs) {
1100 write_mac_reg(mac, PAS_MAC_RMON(i), 0);
1106 write_iob_reg(PAS_IOB_DMA_RXCH_CFG(mac->rx->chan.chno),
1109 write_iob_reg(PAS_IOB_DMA_TXCH_CFG(mac->tx->chan.chno),
1112 write_mac_reg(mac, PAS_MAC_IPC_CHNL,
1113 PAS_MAC_IPC_CHNL_DCHNO(mac->rx->chan.chno) |
1114 PAS_MAC_IPC_CHNL_BCH(mac->rx->chan.chno));
1117 write_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if),
1125 pasemi_dma_start_chan(&rx_ring(mac)->chan, PAS_DMA_RXCHAN_CCMDSTA_DU |
1131 pasemi_dma_start_chan(&tx_ring(mac)->chan, PAS_DMA_TXCHAN_TCMDSTA_SZ |
1138 write_dma_reg(PAS_DMA_RXCHAN_INCR(rx_ring(mac)->chan.chno),
1142 pasemi_mac_restart_rx_intr(mac);
1143 pasemi_mac_restart_tx_intr(mac);
1147 if (mac->type == MAC_TYPE_GMAC)
1153 write_mac_reg(mac, PAS_MAC_CFG_PCFG, flags);
1158 pasemi_mac_intf_enable(mac);
1159 if (mac->type == MAC_TYPE_GMAC) {
1161 dev_warn(&mac->pdev->dev,
1163 dev_warn(&mac->pdev->dev,
1169 napi_enable(&mac->napi);
1171 snprintf(mac->tx_irq_name, sizeof(mac->tx_irq_name), "%s tx",
1174 ret = request_irq(mac->tx->chan.irq, pasemi_mac_tx_intr, 0,
1175 mac->tx_irq_name, mac->tx);
1177 dev_err(&mac->pdev->dev, "request_irq of irq %d failed: %d\n",
1178 mac->tx->chan.irq, ret);
1182 snprintf(mac->rx_irq_name, sizeof(mac->rx_irq_name), "%s rx",
1185 ret = request_irq(mac->rx->chan.irq, pasemi_mac_rx_intr, 0,
1186 mac->rx_irq_name, mac->rx);
1188 dev_err(&mac->pdev->dev, "request_irq of irq %d failed: %d\n",
1189 mac->rx->chan.irq, ret);
1196 timer_setup(&mac->tx->clean_timer, pasemi_mac_tx_timer, 0);
1197 mod_timer(&mac->tx->clean_timer, jiffies + HZ);
1202 free_irq(mac->tx->chan.irq, mac->tx);
1204 napi_disable(&mac->napi);
1207 if (mac->tx)
1208 pasemi_mac_free_tx_resources(mac);
1209 pasemi_mac_free_rx_resources(mac);
1217 static void pasemi_mac_pause_txchan(struct pasemi_mac *mac)
1220 int txch = tx_ring(mac)->chan.chno;
1233 dev_err(&mac->dma_pdev->dev,
1239 static void pasemi_mac_pause_rxchan(struct pasemi_mac *mac)
1242 int rxch = rx_ring(mac)->chan.chno;
1254 dev_err(&mac->dma_pdev->dev,
1259 static void pasemi_mac_pause_rxint(struct pasemi_mac *mac)
1263 write_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if),
1266 sta = read_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if));
1273 dev_err(&mac->dma_pdev->dev,
1275 write_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if), 0);
1280 struct pasemi_mac *mac = netdev_priv(dev);
1284 rxch = rx_ring(mac)->chan.chno;
1285 txch = tx_ring(mac)->chan.chno;
1292 timer_delete_sync(&mac->tx->clean_timer);
1295 napi_disable(&mac->napi);
1297 sta = read_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if));
1316 pasemi_mac_clean_tx(tx_ring(mac));
1317 pasemi_mac_clean_rx(rx_ring(mac), RX_RING_SIZE);
1319 pasemi_mac_pause_txchan(mac);
1320 pasemi_mac_pause_rxint(mac);
1321 pasemi_mac_pause_rxchan(mac);
1322 pasemi_mac_intf_disable(mac);
1324 free_irq(mac->tx->chan.irq, mac->tx);
1325 free_irq(mac->rx->chan.irq, mac->rx);
1327 for (i = 0; i < mac->num_cs; i++) {
1328 pasemi_mac_free_csring(mac->cs[i]);
1329 mac->cs[i] = NULL;
1332 mac->num_cs = 0;
1335 pasemi_mac_free_rx_resources(mac);
1336 pasemi_mac_free_tx_resources(mac);
1429 struct pasemi_mac * const mac = netdev_priv(dev);
1430 struct pasemi_mac_txring * const txring = tx_ring(mac);
1448 map[0] = dma_map_single(&mac->dma_pdev->dev, skb->data,
1451 if (dma_mapping_error(&mac->dma_pdev->dev, map[0]))
1457 map[i + 1] = skb_frag_dma_map(&mac->dma_pdev->dev, frag, 0,
1460 if (dma_mapping_error(&mac->dma_pdev->dev, map[i + 1])) {
1498 if (mac->num_cs && skb->ip_summed == CHECKSUM_PARTIAL && skb->len > 1540) {
1499 csring = mac->cs[mac->last_cs];
1500 mac->last_cs = (mac->last_cs + 1) % mac->num_cs;
1538 dma_unmap_single(&mac->dma_pdev->dev, map[nfrags],
1546 const struct pasemi_mac *mac = netdev_priv(dev);
1549 flags = read_mac_reg(mac, PAS_MAC_CFG_PCFG);
1557 write_mac_reg(mac, PAS_MAC_CFG_PCFG, flags);
1563 struct pasemi_mac *mac = container_of(napi, struct pasemi_mac, napi);
1566 pasemi_mac_clean_tx(tx_ring(mac));
1567 pkts = pasemi_mac_clean_rx(rx_ring(mac), budget);
1572 pasemi_mac_restart_rx_intr(mac);
1573 pasemi_mac_restart_tx_intr(mac);
1586 const struct pasemi_mac *mac = netdev_priv(dev);
1588 disable_irq(mac->tx->chan.irq);
1589 pasemi_mac_tx_intr(mac->tx->chan.irq, mac->tx);
1590 enable_irq(mac->tx->chan.irq);
1592 disable_irq(mac->rx->chan.irq);
1593 pasemi_mac_rx_intr(mac->rx->chan.irq, mac->rx);
1594 enable_irq(mac->rx->chan.irq);
1600 struct pasemi_mac *mac = netdev_priv(dev);
1615 napi_disable(&mac->napi);
1617 pasemi_mac_intf_disable(mac);
1619 rcmdsta = read_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if));
1620 pasemi_mac_pause_rxint(mac);
1621 pasemi_mac_clean_rx(rx_ring(mac), RX_RING_SIZE);
1622 pasemi_mac_free_rx_buffers(mac);
1627 if (new_mtu > PE_DEF_MTU && !mac->num_cs) {
1628 pasemi_mac_setup_csrings(mac);
1629 if (!mac->num_cs) {
1638 reg = read_mac_reg(mac, PAS_MAC_CFG_MACCFG);
1641 write_mac_reg(mac, PAS_MAC_CFG_MACCFG, reg);
1645 mac->bufsz = new_mtu + ETH_HLEN + ETH_FCS_LEN + LOCAL_SKB_ALIGN + 128;
1649 write_dma_reg(PAS_DMA_RXINT_RCMDSTA(mac->dma_if),
1652 rx_ring(mac)->next_to_fill = 0;
1655 napi_enable(&mac->napi);
1657 pasemi_mac_intf_enable(mac);
1680 struct pasemi_mac *mac;
1696 mac = netdev_priv(dev);
1698 mac->pdev = pdev;
1699 mac->netdev = dev;
1701 netif_napi_add(dev, &mac->napi, pasemi_mac_poll);
1707 mac->dma_pdev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa007, NULL);
1708 if (!mac->dma_pdev) {
1709 dev_err(&mac->pdev->dev, "Can't find DMA Controller\n");
1713 dma_set_mask(&mac->dma_pdev->dev, DMA_BIT_MASK(64));
1715 mac->iob_pdev = pci_get_device(PCI_VENDOR_ID_PASEMI, 0xa001, NULL);
1716 if (!mac->iob_pdev) {
1717 dev_err(&mac->pdev->dev, "Can't find I/O Bridge\n");
1722 /* get mac addr from device tree */
1723 if (pasemi_get_mac_addr(mac) || !is_valid_ether_addr(mac->mac_addr)) {
1727 eth_hw_addr_set(dev, mac->mac_addr);
1729 ret = mac_to_intf(mac);
1731 dev_err(&mac->pdev->dev, "Can't map DMA interface\n");
1735 mac->dma_if = ret;
1739 mac->type = MAC_TYPE_GMAC;
1742 mac->type = MAC_TYPE_XAUI;
1757 mac->bufsz = dev->mtu + ETH_HLEN + ETH_FCS_LEN + LOCAL_SKB_ALIGN + 128;
1764 mac->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);
1767 mac->msg_enable = (NETIF_MSG_IFUP << 1 ) - 1;
1772 dev_err(&mac->pdev->dev, "register_netdev failed with error %d\n",
1775 } else if (netif_msg_probe(mac)) {
1777 dev->name, mac->type == MAC_TYPE_GMAC ? "GMAC" : "XAUI",
1778 mac->dma_if, dev->dev_addr);
1784 pci_dev_put(mac->iob_pdev);
1785 pci_dev_put(mac->dma_pdev);
1797 struct pasemi_mac *mac;
1802 mac = netdev_priv(netdev);
1807 pci_dev_put(mac->dma_pdev);
1808 pci_dev_put(mac->iob_pdev);
1810 pasemi_dma_free_chan(&mac->tx->chan);
1811 pasemi_dma_free_chan(&mac->rx->chan);