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;
1555 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1569 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1581 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1603 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1615 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1627 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1639 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1653 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1665 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1676 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1686 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1696 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1706 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1717 struct rocker_world_ops *wops = rocker_port->rocker->wops;
1724 static int rocker_world_fib4_add(struct rocker *rocker,
1727 struct rocker_world_ops *wops = rocker->wops;
1731 return wops->fib4_add(rocker, fen_info);
1734 static int rocker_world_fib4_del(struct rocker *rocker,
1737 struct rocker_world_ops *wops = rocker->wops;
1741 return wops->fib4_del(rocker, fen_info);
1744 static void rocker_world_fib4_abort(struct rocker *rocker)
1746 struct rocker_world_ops *wops = rocker->wops;
1749 wops->fib4_abort(rocker);
1822 const struct rocker *rocker = rocker_port->rocker;
1823 struct pci_dev *pdev = rocker->pdev;
1853 const struct rocker *rocker = rocker_port->rocker;
1854 struct pci_dev *pdev = rocker->pdev;
1886 struct rocker *rocker = rocker_port->rocker;
1926 rocker_desc_head_set(rocker, &rocker_port->tx_ring, desc_info);
2014 const struct rocker *rocker = rocker_port->rocker;
2016 ppid->id_len = sizeof(rocker->hw.id);
2017 memcpy(&ppid->id, &rocker->hw.id, ppid->id_len);
2112 struct rocker *rocker;
2120 struct rocker *rocker = fib_work->rocker;
2128 err = rocker_world_fib4_add(rocker, &fib_work->fen_info);
2130 rocker_world_fib4_abort(rocker);
2134 rocker_world_fib4_del(rocker, &fib_work->fen_info);
2141 rocker_world_fib4_abort(rocker);
2153 struct rocker *rocker = container_of(nb, struct rocker, fib_nb);
2165 fib_work->rocker = rocker;
2199 queue_work(rocker->rocker_owq, &fib_work->work);
2382 const struct rocker *rocker = rocker_port->rocker;
2413 rocker_dma_ring_credits_set(rocker, &rocker_port->tx_ring, credits);
2418 static int rocker_port_rx_proc(const struct rocker *rocker,
2436 rocker_dma_rx_ring_skb_unmap(rocker, attrs);
2461 const struct rocker *rocker = rocker_port->rocker;
2475 err = rocker_port_rx_proc(rocker, rocker_port,
2485 rocker_desc_head_set(rocker, &rocker_port->rx_ring, desc_info);
2492 rocker_dma_ring_credits_set(rocker, &rocker_port->rx_ring, credits);
2503 const struct rocker *rocker = rocker_port->rocker;
2504 u64 link_status = rocker_read64(rocker, PORT_PHYS_LINK_STATUS);
2514 static void rocker_remove_ports(struct rocker *rocker)
2519 for (i = 0; i < rocker->port_count; i++) {
2520 rocker_port = rocker->ports[i];
2528 rocker_world_fini(rocker);
2529 kfree(rocker->ports);
2534 const struct rocker *rocker = rocker_port->rocker;
2535 const struct pci_dev *pdev = rocker->pdev;
2550 static int rocker_probe_port(struct rocker *rocker, unsigned int port_number)
2552 struct pci_dev *pdev = rocker->pdev;
2563 rocker_port->rocker = rocker;
2596 rocker->ports[port_number] = rocker_port;
2607 rocker->ports[port_number] = NULL;
2617 static int rocker_probe_ports(struct rocker *rocker)
2623 alloc_size = sizeof(struct rocker_port *) * rocker->port_count;
2624 rocker->ports = kzalloc(alloc_size, GFP_KERNEL);
2625 if (!rocker->ports)
2627 for (i = 0; i < rocker->port_count; i++) {
2628 err = rocker_probe_port(rocker, i);
2635 rocker_remove_ports(rocker);
2639 static int rocker_msix_init(struct rocker *rocker)
2641 struct pci_dev *pdev = rocker->pdev;
2650 if (msix_entries != ROCKER_MSIX_VEC_COUNT(rocker->port_count))
2653 rocker->msix_entries = kmalloc_array(msix_entries,
2656 if (!rocker->msix_entries)
2660 rocker->msix_entries[i].entry = i;
2662 err = pci_enable_msix_exact(pdev, rocker->msix_entries, msix_entries);
2669 kfree(rocker->msix_entries);
2673 static void rocker_msix_fini(const struct rocker *rocker)
2675 pci_disable_msix(rocker->pdev);
2676 kfree(rocker->msix_entries);
2790 /* Take a reference on the rocker device */
2798 queue_work(rocker_port->rocker->rocker_owq,
2852 struct rocker *rocker;
2855 rocker = kzalloc(sizeof(*rocker), GFP_KERNEL);
2856 if (!rocker)
2883 rocker->hw_addr = ioremap(pci_resource_start(pdev, 0),
2885 if (!rocker->hw_addr) {
2892 rocker->pdev = pdev;
2893 pci_set_drvdata(pdev, rocker);
2895 rocker->port_count = rocker_read32(rocker, PORT_PHYS_COUNT);
2897 err = rocker_msix_init(rocker);
2903 err = rocker_basic_hw_test(rocker);
2909 rocker_write32(rocker, CONTROL, ROCKER_CONTROL_RESET);
2911 err = rocker_dma_rings_init(rocker);
2915 err = request_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_CMD),
2917 rocker_driver_name, rocker);
2923 err = request_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_EVENT),
2925 rocker_driver_name, rocker);
2931 rocker->rocker_owq = alloc_ordered_workqueue(rocker_driver_name,
2933 if (!rocker->rocker_owq) {
2938 err = rocker_probe_ports(rocker);
2947 rocker->fib_nb.notifier_call = rocker_router_fib_event;
2948 err = register_fib_notifier(&init_net, &rocker->fib_nb, NULL, NULL);
2965 rocker->hw.id = rocker_read64(rocker, SWITCH_ID);
2968 (int)sizeof(rocker->hw.id), &rocker->hw.id);
2975 unregister_fib_notifier(&init_net, &rocker->fib_nb);
2977 rocker_remove_ports(rocker);
2979 destroy_workqueue(rocker->rocker_owq);
2981 free_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_EVENT), rocker);
2983 free_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_CMD), rocker);
2985 rocker_dma_rings_fini(rocker);
2988 rocker_msix_fini(rocker);
2990 iounmap(rocker->hw_addr);
2998 kfree(rocker);
3004 struct rocker *rocker = pci_get_drvdata(pdev);
3011 unregister_fib_notifier(&init_net, &rocker->fib_nb);
3012 rocker_remove_ports(rocker);
3013 rocker_write32(rocker, CONTROL, ROCKER_CONTROL_RESET);
3014 destroy_workqueue(rocker->rocker_owq);
3015 free_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_EVENT), rocker);
3016 free_irq(rocker_msix_vector(rocker, ROCKER_MSIX_VEC_CMD), rocker);
3017 rocker_dma_rings_fini(rocker);
3018 rocker_msix_fini(rocker);
3019 iounmap(rocker->hw_addr);
3020 pci_release_regions(rocker->pdev);
3021 pci_disable_device(rocker->pdev);
3022 kfree(rocker);
3037 struct rocker *rocker)
3045 if (rocker_port->rocker != rocker)
3052 struct rocker *rocker;
3062 if (rocker_port_dev_check_under(lower_dev, data->rocker)) {
3071 struct rocker *rocker)
3076 if (rocker_port_dev_check_under(dev, rocker))
3079 data.rocker = rocker;