Lines Matching defs:rocker
3 * drivers/net/ethernet/rocker/rocker.c - Rocker switch device driver
38 #include "rocker.h"
41 static const char rocker_driver_name[] = "rocker";
96 static u32 rocker_msix_vector(const struct rocker *rocker, unsigned int vector)
98 return rocker->msix_entries[vector].vector;
103 return rocker_msix_vector(rocker_port->rocker,
109 return rocker_msix_vector(rocker_port->rocker,
113 #define rocker_write32(rocker, reg, val) \
114 writel((val), (rocker)->hw_addr + (ROCKER_ ## reg))
115 #define rocker_read32(rocker, reg) \
116 readl((rocker)->hw_addr + (ROCKER_ ## reg))
117 #define rocker_write64(rocker, reg, val) \
118 writeq((val), (rocker)->hw_addr + (ROCKER_ ## reg))
119 #define rocker_read64(rocker, reg) \
120 readq((rocker)->hw_addr + (ROCKER_ ## reg))
126 static int rocker_reg_test(const struct rocker *rocker)
128 const struct pci_dev *pdev = rocker->pdev;
134 rocker_write32(rocker, TEST_REG, rnd);
135 test_reg = rocker_read32(rocker, TEST_REG);
145 rocker_write64(rocker, TEST_REG64, rnd);
146 test_reg = rocker_read64(rocker, TEST_REG64);
156 static int rocker_dma_test_one(const struct rocker *rocker,
161 const struct pci_dev *pdev = rocker->pdev;
165 rocker_write32(rocker, TEST_DMA_CTRL, test_type);
185 static int rocker_dma_test_offset(const struct rocker *rocker,
188 struct pci_dev *pdev = rocker->pdev;
210 rocker_write64(rocker, TEST_DMA_ADDR, dma_handle);
211 rocker_write32(rocker, TEST_DMA_SIZE, ROCKER_TEST_DMA_BUF_SIZE);
214 err = rocker_dma_test_one(rocker, wait, ROCKER_TEST_DMA_CTRL_FILL,
221 err = rocker_dma_test_one(rocker, wait, ROCKER_TEST_DMA_CTRL_CLEAR,
230 err = rocker_dma_test_one(rocker, wait, ROCKER_TEST_DMA_CTRL_INVERT,
245 static int rocker_dma_test(const struct rocker *rocker,
252 err = rocker_dma_test_offset(rocker, wait, i);
268 static int rocker_basic_hw_test(const struct rocker *rocker)
270 const struct pci_dev *pdev = rocker->pdev;
274 err = rocker_reg_test(rocker);
280 err = request_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_TEST),
289 rocker_write32(rocker, TEST_IRQ, ROCKER_MSIX_VEC_TEST);
297 err = rocker_dma_test(rocker, &wait);
302 free_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_TEST), &wait);
386 static void rocker_desc_head_set(const struct rocker *rocker,
395 rocker_write32(rocker, DMA_DESC_HEAD(info->type), head);
413 static void rocker_dma_ring_credits_set(const struct rocker *rocker,
418 rocker_write32(rocker, DMA_DESC_CREDITS(info->type), credits);
427 static int rocker_dma_ring_create(const struct rocker *rocker,
444 info->desc = dma_alloc_coherent(&rocker->pdev->dev,
455 rocker_write32(rocker, DMA_DESC_CTRL(info->type),
457 rocker_write64(rocker, DMA_DESC_ADDR(info->type), info->mapaddr);
458 rocker_write32(rocker, DMA_DESC_SIZE(info->type), info->size);
463 static void rocker_dma_ring_destroy(const struct rocker *rocker,
466 rocker_write64(rocker, DMA_DESC_ADDR(info->type), 0);
468 dma_free_coherent(&rocker->pdev->dev,
474 static void rocker_dma_ring_pass_to_producer(const struct rocker *rocker,
485 rocker_desc_head_set(rocker, info, &info->desc_info[i]);
489 static int rocker_dma_ring_bufs_alloc(const struct rocker *rocker,
493 struct pci_dev *pdev = rocker->pdev;
538 static void rocker_dma_ring_bufs_free(const struct rocker *rocker,
542 struct pci_dev *pdev = rocker->pdev;
577 static int rocker_dma_cmd_ring_waits_alloc(const struct rocker *rocker)
579 const struct rocker_dma_ring_info *cmd_ring = &rocker->cmd_ring;
596 static void rocker_dma_cmd_ring_waits_free(const struct rocker *rocker)
598 const struct rocker_dma_ring_info *cmd_ring = &rocker->cmd_ring;
605 static int rocker_dma_rings_init(struct rocker *rocker)
607 const struct pci_dev *pdev = rocker->pdev;
610 err = rocker_dma_ring_create(rocker, ROCKER_DMA_CMD,
612 &rocker->cmd_ring);
618 spin_lock_init(&rocker->cmd_ring_lock);
620 err = rocker_dma_ring_bufs_alloc(rocker, &rocker->cmd_ring,
627 err = rocker_dma_cmd_ring_waits_alloc(rocker);
633 err = rocker_dma_ring_create(rocker, ROCKER_DMA_EVENT,
635 &rocker->event_ring);
641 err = rocker_dma_ring_bufs_alloc(rocker, &rocker->event_ring,
647 rocker_dma_ring_pass_to_producer(rocker, &rocker->event_ring);
651 rocker_dma_ring_destroy(rocker, &rocker->event_ring);
653 rocker_dma_cmd_ring_waits_free(rocker);
655 rocker_dma_ring_bufs_free(rocker, &rocker->cmd_ring,
658 rocker_dma_ring_destroy(rocker, &rocker->cmd_ring);
662 static void rocker_dma_rings_fini(struct rocker *rocker)
664 rocker_dma_ring_bufs_free(rocker, &rocker->event_ring,
666 rocker_dma_ring_destroy(rocker, &rocker->event_ring);
667 rocker_dma_cmd_ring_waits_free(rocker);
668 rocker_dma_ring_bufs_free(rocker, &rocker->cmd_ring,
670 rocker_dma_ring_destroy(rocker, &rocker->cmd_ring);
677 const struct rocker *rocker = rocker_port->rocker;
678 struct pci_dev *pdev = rocker->pdev;
728 static void rocker_dma_rx_ring_skb_unmap(const struct rocker *rocker,
731 struct pci_dev *pdev = rocker->pdev;
743 static void rocker_dma_rx_ring_skb_free(const struct rocker *rocker,
752 rocker_dma_rx_ring_skb_unmap(rocker, attrs);
759 const struct rocker *rocker = rocker_port->rocker;
773 rocker_dma_rx_ring_skb_free(rocker, &rx_ring->desc_info[i]);
780 const struct rocker *rocker = rocker_port->rocker;
784 rocker_dma_rx_ring_skb_free(rocker, &rx_ring->desc_info[i]);
789 struct rocker *rocker = rocker_port->rocker;
792 err = rocker_dma_ring_create(rocker,
801 err = rocker_dma_ring_bufs_alloc(rocker, &rocker_port->tx_ring,
809 err = rocker_dma_ring_create(rocker,
818 err = rocker_dma_ring_bufs_alloc(rocker, &rocker_port->rx_ring,
831 rocker_dma_ring_pass_to_producer(rocker, &rocker_port->rx_ring);
836 rocker_dma_ring_bufs_free(rocker, &rocker_port->rx_ring,
839 rocker_dma_ring_destroy(rocker, &rocker_port->rx_ring);
841 rocker_dma_ring_bufs_free(rocker, &rocker_port->tx_ring,
844 rocker_dma_ring_destroy(rocker, &rocker_port->tx_ring);
850 struct rocker *rocker = rocker_port->rocker;
853 rocker_dma_ring_bufs_free(rocker, &rocker_port->rx_ring,
855 rocker_dma_ring_destroy(rocker, &rocker_port->rx_ring);
856 rocker_dma_ring_bufs_free(rocker, &rocker_port->tx_ring,
858 rocker_dma_ring_destroy(rocker, &rocker_port->tx_ring);
864 u64 val = rocker_read64(rocker_port->rocker, PORT_PHYS_ENABLE);
870 rocker_write64(rocker_port->rocker, PORT_PHYS_ENABLE, val);
879 struct rocker *rocker = dev_id;
884 spin_lock(&rocker->cmd_ring_lock);
885 while ((desc_info = rocker_desc_tail_get(&rocker->cmd_ring))) {
894 spin_unlock(&rocker->cmd_ring_lock);
895 rocker_dma_ring_credits_set(rocker, &rocker->cmd_ring, credits);
912 static int rocker_event_link_change(const struct rocker *rocker,
928 if (port_number >= rocker->port_count)
931 rocker_port = rocker->ports[port_number];
946 static int rocker_event_mac_vlan_seen(const struct rocker *rocker,
965 if (port_number >= rocker->port_count)
968 rocker_port = rocker->ports[port_number];
972 static int rocker_event_process(const struct rocker *rocker,
989 return rocker_event_link_change(rocker, info);
991 return rocker_event_mac_vlan_seen(rocker, info);
999 struct rocker *rocker = dev_id;
1000 const struct pci_dev *pdev = rocker->pdev;
1005 while ((desc_info = rocker_desc_tail_get(&rocker->event_ring))) {
1011 err = rocker_event_process(rocker, desc_info);
1017 rocker_desc_head_set(rocker, &rocker->event_ring, desc_info);
1020 rocker_dma_ring_credits_set(rocker, &rocker->event_ring, credits);
1049 struct rocker *rocker = rocker_port->rocker;
1055 spin_lock_irqsave(&rocker->cmd_ring_lock, lock_flags);
1057 desc_info = rocker_desc_head_get(&rocker->cmd_ring);
1059 spin_unlock_irqrestore(&rocker->cmd_ring_lock, lock_flags);
1069 spin_unlock_irqrestore(&rocker->cmd_ring_lock, lock_flags);
1073 rocker_desc_head_set(rocker, &rocker->cmd_ring, desc_info);
1075 spin_unlock_irqrestore(&rocker->cmd_ring_lock, lock_flags);
1436 static int rocker_world_init(struct rocker *rocker, u8 mode)
1443 dev_err(&rocker->pdev->dev, "port mode \"%d\" is not supported\n",
1447 rocker->wops = wops;
1448 rocker->wpriv = kzalloc(wops->priv_size, GFP_KERNEL);
1449 if (!rocker->wpriv)
1453 err = wops->init(rocker);
1455 kfree(rocker->wpriv);
1459 static void rocker_world_fini(struct rocker *rocker)
1461 struct rocker_world_ops *wops = rocker->wops;
1465 wops->fini(rocker);
1466 kfree(rocker->wpriv);
1471 struct rocker *rocker = rocker_port->rocker;
1477 dev_err(&rocker->pdev->dev, "failed to get port mode\n");
1480 if (rocker->wops) {
1481 if (rocker->wops->mode != mode) {
1482 dev_err(&rocker->pdev->dev, "hardware has ports in different worlds, which is not supported\n");
1487 return rocker_world_init(rocker, mode);
1492 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1508 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1517 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1526 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1536 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1545 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1556 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1573 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1586 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1609 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1627 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1644 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1659 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1673 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1685 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1695 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1705 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1715 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1725 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1736 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1743 static int rocker_world_fib4_add(struct rocker *rocker,
1746 struct rocker_world_ops *wops = rocker->wops;
1750 return wops->fib4_add(rocker, fen_info);
1753 static int rocker_world_fib4_del(struct rocker *rocker,
1756 struct rocker_world_ops *wops = rocker->wops;
1760 return wops->fib4_del(rocker, fen_info);
1763 static void rocker_world_fib4_abort(struct rocker *rocker)
1765 struct rocker_world_ops *wops = rocker->wops;
1768 wops->fib4_abort(rocker);
1841 const struct rocker *rocker = rocker_port->rocker;
1842 struct pci_dev *pdev = rocker->pdev;
1872 const struct rocker *rocker = rocker_port->rocker;
1873 struct pci_dev *pdev = rocker->pdev;
1905 struct rocker *rocker = rocker_port->rocker;
1945 rocker_desc_head_set(rocker, &rocker_port->tx_ring, desc_info);
2044 const struct rocker *rocker = rocker_port->rocker;
2046 ppid->id_len = sizeof(rocker->hw.id);
2047 memcpy(&ppid->id, &rocker->hw.id, ppid->id_len);
2150 struct rocker *rocker;
2158 struct rocker *rocker = fib_work->rocker;
2166 err = rocker_world_fib4_add(rocker, &fib_work->fen_info);
2168 rocker_world_fib4_abort(rocker);
2172 rocker_world_fib4_del(rocker, &fib_work->fen_info);
2179 rocker_world_fib4_abort(rocker);
2191 struct rocker *rocker = container_of(nb, struct rocker, fib_nb);
2203 fib_work->rocker = rocker;
2237 queue_work(rocker->rocker_owq, &fib_work->work);
2420 const struct rocker *rocker = rocker_port->rocker;
2451 rocker_dma_ring_credits_set(rocker, &rocker_port->tx_ring, credits);
2456 static int rocker_port_rx_proc(const struct rocker *rocker,
2474 rocker_dma_rx_ring_skb_unmap(rocker, attrs);
2499 const struct rocker *rocker = rocker_port->rocker;
2513 err = rocker_port_rx_proc(rocker, rocker_port,
2523 rocker_desc_head_set(rocker, &rocker_port->rx_ring, desc_info);
2530 rocker_dma_ring_credits_set(rocker, &rocker_port->rx_ring, credits);
2541 const struct rocker *rocker = rocker_port->rocker;
2542 u64 link_status = rocker_read64(rocker, PORT_PHYS_LINK_STATUS);
2552 static void rocker_remove_ports(struct rocker *rocker)
2557 for (i = 0; i < rocker->port_count; i++) {
2558 rocker_port = rocker->ports[i];
2566 rocker_world_fini(rocker);
2567 kfree(rocker->ports);
2572 const struct rocker *rocker = rocker_port->rocker;
2573 const struct pci_dev *pdev = rocker->pdev;
2586 static int rocker_probe_port(struct rocker *rocker, unsigned int port_number)
2588 struct pci_dev *pdev = rocker->pdev;
2599 rocker_port->rocker = rocker;
2634 rocker->ports[port_number] = rocker_port;
2645 rocker->ports[port_number] = NULL;
2655 static int rocker_probe_ports(struct rocker *rocker)
2661 alloc_size = sizeof(struct rocker_port *) * rocker->port_count;
2662 rocker->ports = kzalloc(alloc_size, GFP_KERNEL);
2663 if (!rocker->ports)
2665 for (i = 0; i < rocker->port_count; i++) {
2666 err = rocker_probe_port(rocker, i);
2673 rocker_remove_ports(rocker);
2677 static int rocker_msix_init(struct rocker *rocker)
2679 struct pci_dev *pdev = rocker->pdev;
2688 if (msix_entries != ROCKER_MSIX_VEC_COUNT(rocker->port_count))
2691 rocker->msix_entries = kmalloc_array(msix_entries,
2694 if (!rocker->msix_entries)
2698 rocker->msix_entries[i].entry = i;
2700 err = pci_enable_msix_exact(pdev, rocker->msix_entries, msix_entries);
2707 kfree(rocker->msix_entries);
2711 static void rocker_msix_fini(const struct rocker *rocker)
2713 pci_disable_msix(rocker->pdev);
2714 kfree(rocker->msix_entries);
2829 /* Take a reference on the rocker device */
2837 queue_work(rocker_port->rocker->rocker_owq,
2892 struct rocker *rocker;
2895 rocker = kzalloc(sizeof(*rocker), GFP_KERNEL);
2896 if (!rocker)
2932 rocker->hw_addr = ioremap(pci_resource_start(pdev, 0),
2934 if (!rocker->hw_addr) {
2941 rocker->pdev = pdev;
2942 pci_set_drvdata(pdev, rocker);
2944 rocker->port_count = rocker_read32(rocker, PORT_PHYS_COUNT);
2946 err = rocker_msix_init(rocker);
2952 err = rocker_basic_hw_test(rocker);
2958 rocker_write32(rocker, CONTROL, ROCKER_CONTROL_RESET);
2960 err = rocker_dma_rings_init(rocker);
2964 err = request_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_CMD),
2966 rocker_driver_name, rocker);
2972 err = request_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_EVENT),
2974 rocker_driver_name, rocker);
2980 rocker->rocker_owq = alloc_ordered_workqueue(rocker_driver_name,
2982 if (!rocker->rocker_owq) {
2987 err = rocker_probe_ports(rocker);
2996 rocker->fib_nb.notifier_call = rocker_router_fib_event;
2997 err = register_fib_notifier(&init_net, &rocker->fib_nb, NULL, NULL);
3014 rocker->hw.id = rocker_read64(rocker, SWITCH_ID);
3017 (int)sizeof(rocker->hw.id), &rocker->hw.id);
3024 unregister_fib_notifier(&init_net, &rocker->fib_nb);
3026 rocker_remove_ports(rocker);
3028 destroy_workqueue(rocker->rocker_owq);
3030 free_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_EVENT), rocker);
3032 free_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_CMD), rocker);
3034 rocker_dma_rings_fini(rocker);
3037 rocker_msix_fini(rocker);
3039 iounmap(rocker->hw_addr);
3047 kfree(rocker);
3053 struct rocker *rocker = pci_get_drvdata(pdev);
3060 unregister_fib_notifier(&init_net, &rocker->fib_nb);
3061 rocker_remove_ports(rocker);
3062 rocker_write32(rocker, CONTROL, ROCKER_CONTROL_RESET);
3063 destroy_workqueue(rocker->rocker_owq);
3064 free_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_EVENT), rocker);
3065 free_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_CMD), rocker);
3066 rocker_dma_rings_fini(rocker);
3067 rocker_msix_fini(rocker);
3068 iounmap(rocker->hw_addr);
3069 pci_release_regions(rocker->pdev);
3070 pci_disable_device(rocker->pdev);
3071 kfree(rocker);
3086 struct rocker *rocker)
3094 if (rocker_port->rocker != rocker)
3101 struct rocker *rocker;
3111 if (rocker_port_dev_check_under(lower_dev, data->rocker)) {
3120 struct rocker *rocker)
3125 if (rocker_port_dev_check_under(dev, rocker))
3128 data.rocker = rocker;