Lines Matching refs:rocker_port
157 struct rocker_port *rocker_port; member
215 struct rocker_port { struct
238 struct rocker_port **ports; argument
302 static __be16 rocker_port_vid_to_vlan(const struct rocker_port *rocker_port, in rocker_port_vid_to_vlan() argument
311 vlan_id = rocker_port->internal_vlan_id; in rocker_port_vid_to_vlan()
319 static u16 rocker_port_vlan_to_vid(const struct rocker_port *rocker_port, in rocker_port_vlan_to_vid() argument
328 static bool rocker_port_is_bridged(const struct rocker_port *rocker_port) in rocker_port_is_bridged() argument
330 return rocker_port->bridge_dev && in rocker_port_is_bridged()
331 netif_is_bridge_master(rocker_port->bridge_dev); in rocker_port_is_bridged()
334 static bool rocker_port_is_ovsed(const struct rocker_port *rocker_port) in rocker_port_is_ovsed() argument
336 return rocker_port->bridge_dev && in rocker_port_is_ovsed()
337 netif_is_ovs_master(rocker_port->bridge_dev); in rocker_port_is_ovsed()
345 static void *__rocker_port_mem_alloc(struct rocker_port *rocker_port, in __rocker_port_mem_alloc() argument
376 static void *rocker_port_kzalloc(struct rocker_port *rocker_port, in rocker_port_kzalloc() argument
380 return __rocker_port_mem_alloc(rocker_port, trans, flags, size); in rocker_port_kzalloc()
383 static void *rocker_port_kcalloc(struct rocker_port *rocker_port, in rocker_port_kcalloc() argument
387 return __rocker_port_mem_alloc(rocker_port, trans, flags, n * size); in rocker_port_kcalloc()
424 static struct rocker_wait *rocker_wait_create(struct rocker_port *rocker_port, in rocker_wait_create() argument
430 wait = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*wait)); in rocker_wait_create()
463 static u32 rocker_msix_tx_vector(const struct rocker_port *rocker_port) in rocker_msix_tx_vector() argument
465 return rocker_msix_vector(rocker_port->rocker, in rocker_msix_tx_vector()
466 ROCKER_MSIX_VEC_TX(rocker_port->port_number)); in rocker_msix_tx_vector()
469 static u32 rocker_msix_rx_vector(const struct rocker_port *rocker_port) in rocker_msix_rx_vector() argument
471 return rocker_msix_vector(rocker_port->rocker, in rocker_msix_rx_vector()
472 ROCKER_MSIX_VEC_RX(rocker_port->port_number)); in rocker_msix_rx_vector()
1187 static int rocker_dma_rx_ring_skb_map(const struct rocker_port *rocker_port, in rocker_dma_rx_ring_skb_map() argument
1191 const struct rocker *rocker = rocker_port->rocker; in rocker_dma_rx_ring_skb_map()
1211 static size_t rocker_port_rx_buf_len(const struct rocker_port *rocker_port) in rocker_port_rx_buf_len() argument
1213 return rocker_port->dev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN; in rocker_port_rx_buf_len()
1216 static int rocker_dma_rx_ring_skb_alloc(const struct rocker_port *rocker_port, in rocker_dma_rx_ring_skb_alloc() argument
1219 struct net_device *dev = rocker_port->dev; in rocker_dma_rx_ring_skb_alloc()
1221 size_t buf_len = rocker_port_rx_buf_len(rocker_port); in rocker_dma_rx_ring_skb_alloc()
1233 err = rocker_dma_rx_ring_skb_map(rocker_port, desc_info, skb, buf_len); in rocker_dma_rx_ring_skb_alloc()
1270 static int rocker_dma_rx_ring_skbs_alloc(const struct rocker_port *rocker_port) in rocker_dma_rx_ring_skbs_alloc() argument
1272 const struct rocker_dma_ring_info *rx_ring = &rocker_port->rx_ring; in rocker_dma_rx_ring_skbs_alloc()
1273 const struct rocker *rocker = rocker_port->rocker; in rocker_dma_rx_ring_skbs_alloc()
1278 err = rocker_dma_rx_ring_skb_alloc(rocker_port, in rocker_dma_rx_ring_skbs_alloc()
1291 static void rocker_dma_rx_ring_skbs_free(const struct rocker_port *rocker_port) in rocker_dma_rx_ring_skbs_free() argument
1293 const struct rocker_dma_ring_info *rx_ring = &rocker_port->rx_ring; in rocker_dma_rx_ring_skbs_free()
1294 const struct rocker *rocker = rocker_port->rocker; in rocker_dma_rx_ring_skbs_free()
1301 static int rocker_port_dma_rings_init(struct rocker_port *rocker_port) in rocker_port_dma_rings_init() argument
1303 struct rocker *rocker = rocker_port->rocker; in rocker_port_dma_rings_init()
1307 ROCKER_DMA_TX(rocker_port->port_number), in rocker_port_dma_rings_init()
1309 &rocker_port->tx_ring); in rocker_port_dma_rings_init()
1311 netdev_err(rocker_port->dev, "failed to create tx dma ring\n"); in rocker_port_dma_rings_init()
1315 err = rocker_dma_ring_bufs_alloc(rocker, &rocker_port->tx_ring, in rocker_port_dma_rings_init()
1319 netdev_err(rocker_port->dev, "failed to alloc tx dma ring buffers\n"); in rocker_port_dma_rings_init()
1324 ROCKER_DMA_RX(rocker_port->port_number), in rocker_port_dma_rings_init()
1326 &rocker_port->rx_ring); in rocker_port_dma_rings_init()
1328 netdev_err(rocker_port->dev, "failed to create rx dma ring\n"); in rocker_port_dma_rings_init()
1332 err = rocker_dma_ring_bufs_alloc(rocker, &rocker_port->rx_ring, in rocker_port_dma_rings_init()
1336 netdev_err(rocker_port->dev, "failed to alloc rx dma ring buffers\n"); in rocker_port_dma_rings_init()
1340 err = rocker_dma_rx_ring_skbs_alloc(rocker_port); in rocker_port_dma_rings_init()
1342 netdev_err(rocker_port->dev, "failed to alloc rx dma ring skbs\n"); in rocker_port_dma_rings_init()
1345 rocker_dma_ring_pass_to_producer(rocker, &rocker_port->rx_ring); in rocker_port_dma_rings_init()
1350 rocker_dma_ring_bufs_free(rocker, &rocker_port->rx_ring, in rocker_port_dma_rings_init()
1353 rocker_dma_ring_destroy(rocker, &rocker_port->rx_ring); in rocker_port_dma_rings_init()
1355 rocker_dma_ring_bufs_free(rocker, &rocker_port->tx_ring, in rocker_port_dma_rings_init()
1358 rocker_dma_ring_destroy(rocker, &rocker_port->tx_ring); in rocker_port_dma_rings_init()
1362 static void rocker_port_dma_rings_fini(struct rocker_port *rocker_port) in rocker_port_dma_rings_fini() argument
1364 struct rocker *rocker = rocker_port->rocker; in rocker_port_dma_rings_fini()
1366 rocker_dma_rx_ring_skbs_free(rocker_port); in rocker_port_dma_rings_fini()
1367 rocker_dma_ring_bufs_free(rocker, &rocker_port->rx_ring, in rocker_port_dma_rings_fini()
1369 rocker_dma_ring_destroy(rocker, &rocker_port->rx_ring); in rocker_port_dma_rings_fini()
1370 rocker_dma_ring_bufs_free(rocker, &rocker_port->tx_ring, in rocker_port_dma_rings_fini()
1372 rocker_dma_ring_destroy(rocker, &rocker_port->tx_ring); in rocker_port_dma_rings_fini()
1375 static void rocker_port_set_enable(const struct rocker_port *rocker_port, in rocker_port_set_enable() argument
1378 u64 val = rocker_read64(rocker_port->rocker, PORT_PHYS_ENABLE); in rocker_port_set_enable()
1381 val |= 1ULL << rocker_port->pport; in rocker_port_set_enable()
1383 val &= ~(1ULL << rocker_port->pport); in rocker_port_set_enable()
1384 rocker_write64(rocker_port->rocker, PORT_PHYS_ENABLE, val); in rocker_port_set_enable()
1415 static void rocker_port_link_up(const struct rocker_port *rocker_port) in rocker_port_link_up() argument
1417 netif_carrier_on(rocker_port->dev); in rocker_port_link_up()
1418 netdev_info(rocker_port->dev, "Link is up\n"); in rocker_port_link_up()
1421 static void rocker_port_link_down(const struct rocker_port *rocker_port) in rocker_port_link_down() argument
1423 netif_carrier_off(rocker_port->dev); in rocker_port_link_down()
1424 netdev_info(rocker_port->dev, "Link is down\n"); in rocker_port_link_down()
1433 struct rocker_port *rocker_port; in rocker_event_link_change() local
1446 rocker_port = rocker->ports[port_number]; in rocker_event_link_change()
1447 if (netif_carrier_ok(rocker_port->dev) != link_up) { in rocker_event_link_change()
1449 rocker_port_link_up(rocker_port); in rocker_event_link_change()
1451 rocker_port_link_down(rocker_port); in rocker_event_link_change()
1457 static int rocker_port_fdb(struct rocker_port *rocker_port,
1467 struct rocker_port *rocker_port; in rocker_event_mac_vlan_seen() local
1485 rocker_port = rocker->ports[port_number]; in rocker_event_mac_vlan_seen()
1487 if (rocker_port->stp_state != BR_STATE_LEARNING && in rocker_event_mac_vlan_seen()
1488 rocker_port->stp_state != BR_STATE_FORWARDING) in rocker_event_mac_vlan_seen()
1491 return rocker_port_fdb(rocker_port, NULL, addr, vlan_id, flags); in rocker_event_mac_vlan_seen()
1549 struct rocker_port *rocker_port = dev_id; in rocker_tx_irq_handler() local
1551 napi_schedule(&rocker_port->napi_tx); in rocker_tx_irq_handler()
1557 struct rocker_port *rocker_port = dev_id; in rocker_rx_irq_handler() local
1559 napi_schedule(&rocker_port->napi_rx); in rocker_rx_irq_handler()
1567 typedef int (*rocker_cmd_prep_cb_t)(const struct rocker_port *rocker_port,
1571 typedef int (*rocker_cmd_proc_cb_t)(const struct rocker_port *rocker_port,
1575 static int rocker_cmd_exec(struct rocker_port *rocker_port, in rocker_cmd_exec() argument
1580 struct rocker *rocker = rocker_port->rocker; in rocker_cmd_exec()
1587 wait = rocker_wait_create(rocker_port, trans, flags); in rocker_cmd_exec()
1601 err = prepare(rocker_port, desc_info, prepare_priv); in rocker_cmd_exec()
1626 err = process(rocker_port, desc_info, process_priv); in rocker_cmd_exec()
1635 rocker_cmd_get_port_settings_prep(const struct rocker_port *rocker_port, in rocker_cmd_get_port_settings_prep() argument
1648 rocker_port->pport)) in rocker_cmd_get_port_settings_prep()
1655 rocker_cmd_get_port_settings_ethtool_proc(const struct rocker_port *rocker_port, in rocker_cmd_get_port_settings_ethtool_proc() argument
1693 rocker_cmd_get_port_settings_macaddr_proc(const struct rocker_port *rocker_port, in rocker_cmd_get_port_settings_macaddr_proc() argument
1725 rocker_cmd_get_port_settings_phys_name_proc(const struct rocker_port *rocker_port, in rocker_cmd_get_port_settings_phys_name_proc() argument
1766 rocker_cmd_set_port_settings_ethtool_prep(const struct rocker_port *rocker_port, in rocker_cmd_set_port_settings_ethtool_prep() argument
1780 rocker_port->pport)) in rocker_cmd_set_port_settings_ethtool_prep()
1796 rocker_cmd_set_port_settings_macaddr_prep(const struct rocker_port *rocker_port, in rocker_cmd_set_port_settings_macaddr_prep() argument
1810 rocker_port->pport)) in rocker_cmd_set_port_settings_macaddr_prep()
1820 rocker_cmd_set_port_settings_mtu_prep(const struct rocker_port *rocker_port, in rocker_cmd_set_port_settings_mtu_prep() argument
1834 rocker_port->pport)) in rocker_cmd_set_port_settings_mtu_prep()
1844 rocker_cmd_set_port_learning_prep(const struct rocker_port *rocker_port, in rocker_cmd_set_port_learning_prep() argument
1857 rocker_port->pport)) in rocker_cmd_set_port_learning_prep()
1860 !!(rocker_port->brport_flags & BR_LEARNING))) in rocker_cmd_set_port_learning_prep()
1866 static int rocker_cmd_get_port_settings_ethtool(struct rocker_port *rocker_port, in rocker_cmd_get_port_settings_ethtool() argument
1869 return rocker_cmd_exec(rocker_port, NULL, 0, in rocker_cmd_get_port_settings_ethtool()
1875 static int rocker_cmd_get_port_settings_macaddr(struct rocker_port *rocker_port, in rocker_cmd_get_port_settings_macaddr() argument
1878 return rocker_cmd_exec(rocker_port, NULL, 0, in rocker_cmd_get_port_settings_macaddr()
1884 static int rocker_cmd_set_port_settings_ethtool(struct rocker_port *rocker_port, in rocker_cmd_set_port_settings_ethtool() argument
1887 return rocker_cmd_exec(rocker_port, NULL, 0, in rocker_cmd_set_port_settings_ethtool()
1892 static int rocker_cmd_set_port_settings_macaddr(struct rocker_port *rocker_port, in rocker_cmd_set_port_settings_macaddr() argument
1895 return rocker_cmd_exec(rocker_port, NULL, 0, in rocker_cmd_set_port_settings_macaddr()
1900 static int rocker_cmd_set_port_settings_mtu(struct rocker_port *rocker_port, in rocker_cmd_set_port_settings_mtu() argument
1903 return rocker_cmd_exec(rocker_port, NULL, 0, in rocker_cmd_set_port_settings_mtu()
1908 static int rocker_port_set_learning(struct rocker_port *rocker_port, in rocker_port_set_learning() argument
1911 return rocker_cmd_exec(rocker_port, trans, 0, in rocker_port_set_learning()
2117 static int rocker_cmd_flow_tbl_add(const struct rocker_port *rocker_port, in rocker_cmd_flow_tbl_add() argument
2174 static int rocker_cmd_flow_tbl_del(const struct rocker_port *rocker_port, in rocker_cmd_flow_tbl_del() argument
2283 static int rocker_cmd_group_tbl_add(const struct rocker_port *rocker_port, in rocker_cmd_group_tbl_add() argument
2328 static int rocker_cmd_group_tbl_del(const struct rocker_port *rocker_port, in rocker_cmd_group_tbl_del() argument
2426 static int rocker_flow_tbl_add(struct rocker_port *rocker_port, in rocker_flow_tbl_add() argument
2430 struct rocker *rocker = rocker_port->rocker; in rocker_flow_tbl_add()
2459 return rocker_cmd_exec(rocker_port, trans, flags, in rocker_flow_tbl_add()
2463 static int rocker_flow_tbl_del(struct rocker_port *rocker_port, in rocker_flow_tbl_del() argument
2467 struct rocker *rocker = rocker_port->rocker; in rocker_flow_tbl_del()
2490 err = rocker_cmd_exec(rocker_port, trans, flags, in rocker_flow_tbl_del()
2499 static int rocker_flow_tbl_do(struct rocker_port *rocker_port, in rocker_flow_tbl_do() argument
2504 return rocker_flow_tbl_del(rocker_port, trans, flags, entry); in rocker_flow_tbl_do()
2506 return rocker_flow_tbl_add(rocker_port, trans, flags, entry); in rocker_flow_tbl_do()
2509 static int rocker_flow_tbl_ig_port(struct rocker_port *rocker_port, in rocker_flow_tbl_ig_port() argument
2516 entry = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*entry)); in rocker_flow_tbl_ig_port()
2526 return rocker_flow_tbl_do(rocker_port, trans, flags, entry); in rocker_flow_tbl_ig_port()
2529 static int rocker_flow_tbl_vlan(struct rocker_port *rocker_port, in rocker_flow_tbl_vlan() argument
2538 entry = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*entry)); in rocker_flow_tbl_vlan()
2552 return rocker_flow_tbl_do(rocker_port, trans, flags, entry); in rocker_flow_tbl_vlan()
2555 static int rocker_flow_tbl_term_mac(struct rocker_port *rocker_port, in rocker_flow_tbl_term_mac() argument
2565 entry = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*entry)); in rocker_flow_tbl_term_mac()
2589 return rocker_flow_tbl_do(rocker_port, trans, flags, entry); in rocker_flow_tbl_term_mac()
2592 static int rocker_flow_tbl_bridge(struct rocker_port *rocker_port, in rocker_flow_tbl_bridge() argument
2605 entry = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*entry)); in rocker_flow_tbl_bridge()
2643 return rocker_flow_tbl_do(rocker_port, trans, flags, entry); in rocker_flow_tbl_bridge()
2646 static int rocker_flow_tbl_ucast4_routing(struct rocker_port *rocker_port, in rocker_flow_tbl_ucast4_routing() argument
2655 entry = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*entry)); in rocker_flow_tbl_ucast4_routing()
2669 return rocker_flow_tbl_do(rocker_port, trans, flags, entry); in rocker_flow_tbl_ucast4_routing()
2672 static int rocker_flow_tbl_acl(struct rocker_port *rocker_port, in rocker_flow_tbl_acl() argument
2685 entry = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*entry)); in rocker_flow_tbl_acl()
2720 return rocker_flow_tbl_do(rocker_port, trans, flags, entry); in rocker_flow_tbl_acl()
2752 static int rocker_group_tbl_add(struct rocker_port *rocker_port, in rocker_group_tbl_add() argument
2756 struct rocker *rocker = rocker_port->rocker; in rocker_group_tbl_add()
2780 return rocker_cmd_exec(rocker_port, trans, flags, in rocker_group_tbl_add()
2784 static int rocker_group_tbl_del(struct rocker_port *rocker_port, in rocker_group_tbl_del() argument
2788 struct rocker *rocker = rocker_port->rocker; in rocker_group_tbl_del()
2808 err = rocker_cmd_exec(rocker_port, trans, flags, in rocker_group_tbl_del()
2817 static int rocker_group_tbl_do(struct rocker_port *rocker_port, in rocker_group_tbl_do() argument
2822 return rocker_group_tbl_del(rocker_port, trans, flags, entry); in rocker_group_tbl_do()
2824 return rocker_group_tbl_add(rocker_port, trans, flags, entry); in rocker_group_tbl_do()
2827 static int rocker_group_l2_interface(struct rocker_port *rocker_port, in rocker_group_l2_interface() argument
2834 entry = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*entry)); in rocker_group_l2_interface()
2841 return rocker_group_tbl_do(rocker_port, trans, flags, entry); in rocker_group_l2_interface()
2844 static int rocker_group_l2_fan_out(struct rocker_port *rocker_port, in rocker_group_l2_fan_out() argument
2851 entry = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*entry)); in rocker_group_l2_fan_out()
2858 entry->group_ids = rocker_port_kcalloc(rocker_port, trans, flags, in rocker_group_l2_fan_out()
2866 return rocker_group_tbl_do(rocker_port, trans, flags, entry); in rocker_group_l2_fan_out()
2869 static int rocker_group_l2_flood(struct rocker_port *rocker_port, in rocker_group_l2_flood() argument
2874 return rocker_group_l2_fan_out(rocker_port, trans, flags, in rocker_group_l2_flood()
2879 static int rocker_group_l3_unicast(struct rocker_port *rocker_port, in rocker_group_l3_unicast() argument
2886 entry = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*entry)); in rocker_group_l3_unicast()
2899 return rocker_group_tbl_do(rocker_port, trans, flags, entry); in rocker_group_l3_unicast()
2951 static int rocker_port_ipv4_neigh(struct rocker_port *rocker_port, in rocker_port_ipv4_neigh() argument
2955 struct rocker *rocker = rocker_port->rocker; in rocker_port_ipv4_neigh()
2969 entry = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*entry)); in rocker_port_ipv4_neigh()
2983 entry->dev = rocker_port->dev; in rocker_port_ipv4_neigh()
3008 err = rocker_group_l3_unicast(rocker_port, trans, flags, in rocker_port_ipv4_neigh()
3010 rocker_port->dev->dev_addr, in rocker_port_ipv4_neigh()
3012 rocker_port->internal_vlan_id, in rocker_port_ipv4_neigh()
3014 rocker_port->pport); in rocker_port_ipv4_neigh()
3016 netdev_err(rocker_port->dev, in rocker_port_ipv4_neigh()
3024 err = rocker_flow_tbl_ucast4_routing(rocker_port, trans, in rocker_port_ipv4_neigh()
3031 netdev_err(rocker_port->dev, in rocker_port_ipv4_neigh()
3043 static int rocker_port_ipv4_resolve(struct rocker_port *rocker_port, in rocker_port_ipv4_resolve() argument
3047 struct net_device *dev = rocker_port->dev; in rocker_port_ipv4_resolve()
3063 err = rocker_port_ipv4_neigh(rocker_port, trans, 0, in rocker_port_ipv4_resolve()
3072 static int rocker_port_ipv4_nh(struct rocker_port *rocker_port, in rocker_port_ipv4_nh() argument
3076 struct rocker *rocker = rocker_port->rocker; in rocker_port_ipv4_nh()
3086 entry = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*entry)); in rocker_port_ipv4_nh()
3102 entry->dev = rocker_port->dev; in rocker_port_ipv4_nh()
3126 err = rocker_port_ipv4_resolve(rocker_port, trans, ip_addr); in rocker_port_ipv4_nh()
3131 static int rocker_port_vlan_flood_group(struct rocker_port *rocker_port, in rocker_port_vlan_flood_group() argument
3135 struct rocker_port *p; in rocker_port_vlan_flood_group()
3136 const struct rocker *rocker = rocker_port->rocker; in rocker_port_vlan_flood_group()
3143 group_ids = rocker_port_kcalloc(rocker_port, trans, flags, in rocker_port_vlan_flood_group()
3169 err = rocker_group_l2_flood(rocker_port, trans, flags, vlan_id, in rocker_port_vlan_flood_group()
3172 netdev_err(rocker_port->dev, in rocker_port_vlan_flood_group()
3180 static int rocker_port_vlan_l2_groups(struct rocker_port *rocker_port, in rocker_port_vlan_l2_groups() argument
3184 const struct rocker *rocker = rocker_port->rocker; in rocker_port_vlan_l2_groups()
3185 struct rocker_port *p; in rocker_port_vlan_l2_groups()
3196 if (rocker_port->stp_state == BR_STATE_LEARNING || in rocker_port_vlan_l2_groups()
3197 rocker_port->stp_state == BR_STATE_FORWARDING) { in rocker_port_vlan_l2_groups()
3198 out_pport = rocker_port->pport; in rocker_port_vlan_l2_groups()
3199 err = rocker_group_l2_interface(rocker_port, trans, flags, in rocker_port_vlan_l2_groups()
3202 netdev_err(rocker_port->dev, in rocker_port_vlan_l2_groups()
3224 err = rocker_group_l2_interface(rocker_port, trans, flags, in rocker_port_vlan_l2_groups()
3227 netdev_err(rocker_port->dev, in rocker_port_vlan_l2_groups()
3286 static int rocker_port_ctrl_vlan_acl(struct rocker_port *rocker_port, in rocker_port_ctrl_vlan_acl() argument
3290 u32 in_pport = rocker_port->pport; in rocker_port_ctrl_vlan_acl()
3303 err = rocker_flow_tbl_acl(rocker_port, trans, flags, in rocker_port_ctrl_vlan_acl()
3314 netdev_err(rocker_port->dev, "Error (%d) ctrl ACL\n", err); in rocker_port_ctrl_vlan_acl()
3319 static int rocker_port_ctrl_vlan_bridge(struct rocker_port *rocker_port, in rocker_port_ctrl_vlan_bridge() argument
3331 if (!rocker_port_is_bridged(rocker_port)) in rocker_port_ctrl_vlan_bridge()
3334 err = rocker_flow_tbl_bridge(rocker_port, trans, flags, in rocker_port_ctrl_vlan_bridge()
3340 netdev_err(rocker_port->dev, "Error (%d) ctrl FLOOD\n", err); in rocker_port_ctrl_vlan_bridge()
3345 static int rocker_port_ctrl_vlan_term(struct rocker_port *rocker_port, in rocker_port_ctrl_vlan_term() argument
3354 vlan_id = rocker_port->internal_vlan_id; in rocker_port_ctrl_vlan_term()
3356 err = rocker_flow_tbl_term_mac(rocker_port, trans, in rocker_port_ctrl_vlan_term()
3357 rocker_port->pport, in_pport_mask, in rocker_port_ctrl_vlan_term()
3364 netdev_err(rocker_port->dev, "Error (%d) ctrl term\n", err); in rocker_port_ctrl_vlan_term()
3369 static int rocker_port_ctrl_vlan(struct rocker_port *rocker_port, in rocker_port_ctrl_vlan() argument
3374 return rocker_port_ctrl_vlan_acl(rocker_port, trans, flags, in rocker_port_ctrl_vlan()
3377 return rocker_port_ctrl_vlan_bridge(rocker_port, trans, flags, in rocker_port_ctrl_vlan()
3381 return rocker_port_ctrl_vlan_term(rocker_port, trans, flags, in rocker_port_ctrl_vlan()
3387 static int rocker_port_ctrl_vlan_add(struct rocker_port *rocker_port, in rocker_port_ctrl_vlan_add() argument
3395 if (rocker_port->ctrls[i]) { in rocker_port_ctrl_vlan_add()
3396 err = rocker_port_ctrl_vlan(rocker_port, trans, flags, in rocker_port_ctrl_vlan_add()
3406 static int rocker_port_ctrl(struct rocker_port *rocker_port, in rocker_port_ctrl() argument
3414 if (!test_bit(vid, rocker_port->vlan_bitmap)) in rocker_port_ctrl()
3416 err = rocker_port_ctrl_vlan(rocker_port, trans, flags, in rocker_port_ctrl()
3425 static int rocker_port_vlan(struct rocker_port *rocker_port, in rocker_port_vlan() argument
3430 u32 in_pport = rocker_port->pport; in rocker_port_vlan()
3438 internal_vlan_id = rocker_port_vid_to_vlan(rocker_port, vid, &untagged); in rocker_port_vlan()
3441 rocker_port->vlan_bitmap)) in rocker_port_vlan()
3444 rocker_port->vlan_bitmap)) in rocker_port_vlan()
3447 change_bit(ntohs(internal_vlan_id), rocker_port->vlan_bitmap); in rocker_port_vlan()
3450 err = rocker_port_ctrl_vlan_add(rocker_port, trans, flags, in rocker_port_vlan()
3453 netdev_err(rocker_port->dev, in rocker_port_vlan()
3459 err = rocker_port_vlan_l2_groups(rocker_port, trans, flags, in rocker_port_vlan()
3462 netdev_err(rocker_port->dev, in rocker_port_vlan()
3467 err = rocker_port_vlan_flood_group(rocker_port, trans, flags, in rocker_port_vlan()
3470 netdev_err(rocker_port->dev, in rocker_port_vlan()
3475 err = rocker_flow_tbl_vlan(rocker_port, trans, flags, in rocker_port_vlan()
3479 netdev_err(rocker_port->dev, in rocker_port_vlan()
3484 change_bit(ntohs(internal_vlan_id), rocker_port->vlan_bitmap); in rocker_port_vlan()
3489 static int rocker_port_ig_tbl(struct rocker_port *rocker_port, in rocker_port_ig_tbl() argument
3505 err = rocker_flow_tbl_ig_port(rocker_port, trans, flags, in rocker_port_ig_tbl()
3509 netdev_err(rocker_port->dev, in rocker_port_ig_tbl()
3517 struct rocker_port *rocker_port; member
3538 lw->rocker_port->dev, &info.info); in rocker_port_fdb_learn_work()
3541 lw->rocker_port->dev, &info.info); in rocker_port_fdb_learn_work()
3547 static int rocker_port_fdb_learn(struct rocker_port *rocker_port, in rocker_port_fdb_learn() argument
3554 u32 out_pport = rocker_port->pport; in rocker_port_fdb_learn()
3557 bool syncing = !!(rocker_port->brport_flags & BR_LEARNING_SYNC); in rocker_port_fdb_learn()
3561 if (rocker_port_is_bridged(rocker_port)) in rocker_port_fdb_learn()
3565 err = rocker_flow_tbl_bridge(rocker_port, trans, flags, addr, in rocker_port_fdb_learn()
3575 if (!rocker_port_is_bridged(rocker_port)) in rocker_port_fdb_learn()
3578 lw = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*lw)); in rocker_port_fdb_learn()
3584 lw->rocker_port = rocker_port; in rocker_port_fdb_learn()
3588 lw->vid = rocker_port_vlan_to_vid(rocker_port, vlan_id); in rocker_port_fdb_learn()
3611 static int rocker_port_fdb(struct rocker_port *rocker_port, in rocker_port_fdb() argument
3616 struct rocker *rocker = rocker_port->rocker; in rocker_port_fdb()
3622 fdb = rocker_port_kzalloc(rocker_port, trans, flags, sizeof(*fdb)); in rocker_port_fdb()
3628 fdb->key.rocker_port = rocker_port; in rocker_port_fdb()
3661 return rocker_port_fdb_learn(rocker_port, trans, flags, addr, vlan_id); in rocker_port_fdb()
3664 static int rocker_port_fdb_flush(struct rocker_port *rocker_port, in rocker_port_fdb_flush() argument
3667 struct rocker *rocker = rocker_port->rocker; in rocker_port_fdb_flush()
3674 if (rocker_port->stp_state == BR_STATE_LEARNING || in rocker_port_fdb_flush()
3675 rocker_port->stp_state == BR_STATE_FORWARDING) in rocker_port_fdb_flush()
3683 if (found->key.rocker_port != rocker_port) in rocker_port_fdb_flush()
3687 err = rocker_port_fdb_learn(rocker_port, trans, flags, in rocker_port_fdb_flush()
3705 struct rocker_port *rocker_port; in rocker_fdb_cleanup() local
3720 rocker_port = entry->key.rocker_port; in rocker_fdb_cleanup()
3721 expires = entry->touched + rocker_port->ageing_time; in rocker_fdb_cleanup()
3723 rocker_port_fdb_learn(rocker_port, NULL, in rocker_fdb_cleanup()
3737 static int rocker_port_router_mac(struct rocker_port *rocker_port, in rocker_port_router_mac() argument
3749 vlan_id = rocker_port->internal_vlan_id; in rocker_port_router_mac()
3752 err = rocker_flow_tbl_term_mac(rocker_port, trans, in rocker_port_router_mac()
3753 rocker_port->pport, in_pport_mask, in rocker_port_router_mac()
3754 eth_type, rocker_port->dev->dev_addr, in rocker_port_router_mac()
3761 err = rocker_flow_tbl_term_mac(rocker_port, trans, in rocker_port_router_mac()
3762 rocker_port->pport, in_pport_mask, in rocker_port_router_mac()
3763 eth_type, rocker_port->dev->dev_addr, in rocker_port_router_mac()
3770 static int rocker_port_fwding(struct rocker_port *rocker_port, in rocker_port_fwding() argument
3786 if (rocker_port->stp_state != BR_STATE_LEARNING && in rocker_port_fwding()
3787 rocker_port->stp_state != BR_STATE_FORWARDING) in rocker_port_fwding()
3790 out_pport = rocker_port->pport; in rocker_port_fwding()
3792 if (!test_bit(vid, rocker_port->vlan_bitmap)) in rocker_port_fwding()
3796 err = rocker_group_l2_interface(rocker_port, trans, flags, in rocker_port_fwding()
3799 netdev_err(rocker_port->dev, in rocker_port_fwding()
3809 static int rocker_port_stp_update(struct rocker_port *rocker_port, in rocker_port_stp_update() argument
3820 memcpy(prev_ctrls, rocker_port->ctrls, sizeof(prev_ctrls)); in rocker_port_stp_update()
3821 prev_state = rocker_port->stp_state; in rocker_port_stp_update()
3824 if (rocker_port->stp_state == state) in rocker_port_stp_update()
3827 rocker_port->stp_state = state; in rocker_port_stp_update()
3839 if (!rocker_port_is_ovsed(rocker_port)) in rocker_port_stp_update()
3843 if (rocker_port_is_bridged(rocker_port)) in rocker_port_stp_update()
3845 else if (rocker_port_is_ovsed(rocker_port)) in rocker_port_stp_update()
3853 if (want[i] != rocker_port->ctrls[i]) { in rocker_port_stp_update()
3856 err = rocker_port_ctrl(rocker_port, trans, ctrl_flags, in rocker_port_stp_update()
3860 rocker_port->ctrls[i] = want[i]; in rocker_port_stp_update()
3864 err = rocker_port_fdb_flush(rocker_port, trans, flags); in rocker_port_stp_update()
3868 err = rocker_port_fwding(rocker_port, trans, flags); in rocker_port_stp_update()
3872 memcpy(rocker_port->ctrls, prev_ctrls, sizeof(prev_ctrls)); in rocker_port_stp_update()
3873 rocker_port->stp_state = prev_state; in rocker_port_stp_update()
3879 static int rocker_port_fwd_enable(struct rocker_port *rocker_port, in rocker_port_fwd_enable() argument
3882 if (rocker_port_is_bridged(rocker_port)) in rocker_port_fwd_enable()
3887 return rocker_port_stp_update(rocker_port, trans, flags, in rocker_port_fwd_enable()
3891 static int rocker_port_fwd_disable(struct rocker_port *rocker_port, in rocker_port_fwd_disable() argument
3894 if (rocker_port_is_bridged(rocker_port)) in rocker_port_fwd_disable()
3899 return rocker_port_stp_update(rocker_port, trans, flags, in rocker_port_fwd_disable()
3917 static __be16 rocker_port_internal_vlan_id_get(struct rocker_port *rocker_port, in rocker_port_internal_vlan_id_get() argument
3920 struct rocker *rocker = rocker_port->rocker; in rocker_port_internal_vlan_id_get()
3950 netdev_err(rocker_port->dev, "Out of internal VLAN IDs\n"); in rocker_port_internal_vlan_id_get()
3960 rocker_port_internal_vlan_id_put(const struct rocker_port *rocker_port, in rocker_port_internal_vlan_id_put() argument
3963 struct rocker *rocker = rocker_port->rocker; in rocker_port_internal_vlan_id_put()
3972 netdev_err(rocker_port->dev, in rocker_port_internal_vlan_id_put()
3989 static int rocker_port_fib_ipv4(struct rocker_port *rocker_port, in rocker_port_fib_ipv4() argument
3997 __be16 internal_vlan_id = rocker_port->internal_vlan_id; in rocker_port_fib_ipv4()
4010 nh_on_port = (fi->fib_dev == rocker_port->dev); in rocker_port_fib_ipv4()
4014 err = rocker_port_ipv4_nh(rocker_port, trans, flags, in rocker_port_fib_ipv4()
4025 err = rocker_flow_tbl_ucast4_routing(rocker_port, trans, eth_type, dst, in rocker_port_fib_ipv4()
4029 netdev_err(rocker_port->dev, "Error (%d) IPv4 route %pI4\n", in rocker_port_fib_ipv4()
4041 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_open() local
4044 err = rocker_port_dma_rings_init(rocker_port); in rocker_port_open()
4048 err = request_irq(rocker_msix_tx_vector(rocker_port), in rocker_port_open()
4050 rocker_driver_name, rocker_port); in rocker_port_open()
4052 netdev_err(rocker_port->dev, "cannot assign tx irq\n"); in rocker_port_open()
4056 err = request_irq(rocker_msix_rx_vector(rocker_port), in rocker_port_open()
4058 rocker_driver_name, rocker_port); in rocker_port_open()
4060 netdev_err(rocker_port->dev, "cannot assign rx irq\n"); in rocker_port_open()
4064 err = rocker_port_fwd_enable(rocker_port, NULL, 0); in rocker_port_open()
4068 napi_enable(&rocker_port->napi_tx); in rocker_port_open()
4069 napi_enable(&rocker_port->napi_rx); in rocker_port_open()
4071 rocker_port_set_enable(rocker_port, true); in rocker_port_open()
4076 free_irq(rocker_msix_rx_vector(rocker_port), rocker_port); in rocker_port_open()
4078 free_irq(rocker_msix_tx_vector(rocker_port), rocker_port); in rocker_port_open()
4080 rocker_port_dma_rings_fini(rocker_port); in rocker_port_open()
4086 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_stop() local
4089 rocker_port_set_enable(rocker_port, false); in rocker_port_stop()
4090 napi_disable(&rocker_port->napi_rx); in rocker_port_stop()
4091 napi_disable(&rocker_port->napi_tx); in rocker_port_stop()
4092 rocker_port_fwd_disable(rocker_port, NULL, in rocker_port_stop()
4094 free_irq(rocker_msix_rx_vector(rocker_port), rocker_port); in rocker_port_stop()
4095 free_irq(rocker_msix_tx_vector(rocker_port), rocker_port); in rocker_port_stop()
4096 rocker_port_dma_rings_fini(rocker_port); in rocker_port_stop()
4101 static void rocker_tx_desc_frags_unmap(const struct rocker_port *rocker_port, in rocker_tx_desc_frags_unmap() argument
4104 const struct rocker *rocker = rocker_port->rocker; in rocker_tx_desc_frags_unmap()
4131 static int rocker_tx_desc_frag_map_put(const struct rocker_port *rocker_port, in rocker_tx_desc_frag_map_put() argument
4135 const struct rocker *rocker = rocker_port->rocker; in rocker_tx_desc_frag_map_put()
4143 netdev_err(rocker_port->dev, "failed to dma map tx frag\n"); in rocker_tx_desc_frag_map_put()
4167 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_xmit() local
4168 struct rocker *rocker = rocker_port->rocker; in rocker_port_xmit()
4174 desc_info = rocker_desc_head_get(&rocker_port->tx_ring); in rocker_port_xmit()
4186 err = rocker_tx_desc_frag_map_put(rocker_port, desc_info, in rocker_port_xmit()
4199 err = rocker_tx_desc_frag_map_put(rocker_port, desc_info, in rocker_port_xmit()
4208 rocker_desc_head_set(rocker, &rocker_port->tx_ring, desc_info); in rocker_port_xmit()
4210 desc_info = rocker_desc_head_get(&rocker_port->tx_ring); in rocker_port_xmit()
4217 rocker_tx_desc_frags_unmap(rocker_port, desc_info); in rocker_port_xmit()
4230 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_set_mac_address() local
4236 err = rocker_cmd_set_port_settings_macaddr(rocker_port, addr->sa_data); in rocker_port_set_mac_address()
4245 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_change_mtu() local
4261 err = rocker_cmd_set_port_settings_mtu(rocker_port, new_mtu); in rocker_port_change_mtu()
4274 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_get_phys_port_name() local
4278 err = rocker_cmd_exec(rocker_port, NULL, 0, in rocker_port_get_phys_port_name()
4289 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_change_proto_down() local
4291 if (rocker_port->dev->flags & IFF_UP) in rocker_port_change_proto_down()
4292 rocker_port_set_enable(rocker_port, !proto_down); in rocker_port_change_proto_down()
4293 rocker_port->dev->proto_down = proto_down; in rocker_port_change_proto_down()
4299 struct rocker_port *rocker_port = netdev_priv(n->dev); in rocker_port_neigh_destroy() local
4303 rocker_port_ipv4_neigh(rocker_port, NULL, in rocker_port_neigh_destroy()
4331 const struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_attr_get() local
4332 const struct rocker *rocker = rocker_port->rocker; in rocker_port_attr_get()
4340 attr->u.brport_flags = rocker_port->brport_flags; in rocker_port_attr_get()
4349 static int rocker_port_brport_flags_set(struct rocker_port *rocker_port, in rocker_port_brport_flags_set() argument
4356 orig_flags = rocker_port->brport_flags; in rocker_port_brport_flags_set()
4357 rocker_port->brport_flags = brport_flags; in rocker_port_brport_flags_set()
4358 if ((orig_flags ^ rocker_port->brport_flags) & BR_LEARNING) in rocker_port_brport_flags_set()
4359 err = rocker_port_set_learning(rocker_port, trans); in rocker_port_brport_flags_set()
4362 rocker_port->brport_flags = orig_flags; in rocker_port_brport_flags_set()
4367 static int rocker_port_bridge_ageing_time(struct rocker_port *rocker_port, in rocker_port_bridge_ageing_time() argument
4371 struct rocker *rocker = rocker_port->rocker; in rocker_port_bridge_ageing_time()
4374 rocker_port->ageing_time = clock_t_to_jiffies(ageing_time); in rocker_port_bridge_ageing_time()
4375 if (rocker_port->ageing_time < rocker->ageing_time) in rocker_port_bridge_ageing_time()
4376 rocker->ageing_time = rocker_port->ageing_time; in rocker_port_bridge_ageing_time()
4377 mod_timer(&rocker_port->rocker->fdb_cleanup_timer, jiffies); in rocker_port_bridge_ageing_time()
4387 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_attr_set() local
4392 err = rocker_port_stp_update(rocker_port, trans, 0, in rocker_port_attr_set()
4396 err = rocker_port_brport_flags_set(rocker_port, trans, in rocker_port_attr_set()
4400 err = rocker_port_bridge_ageing_time(rocker_port, trans, in rocker_port_attr_set()
4411 static int rocker_port_vlan_add(struct rocker_port *rocker_port, in rocker_port_vlan_add() argument
4419 err = rocker_port_vlan(rocker_port, trans, 0, vid); in rocker_port_vlan_add()
4423 err = rocker_port_router_mac(rocker_port, trans, 0, htons(vid)); in rocker_port_vlan_add()
4425 rocker_port_vlan(rocker_port, trans, in rocker_port_vlan_add()
4431 static int rocker_port_vlans_add(struct rocker_port *rocker_port, in rocker_port_vlans_add() argument
4439 err = rocker_port_vlan_add(rocker_port, trans, in rocker_port_vlans_add()
4448 static int rocker_port_fdb_add(struct rocker_port *rocker_port, in rocker_port_fdb_add() argument
4452 __be16 vlan_id = rocker_port_vid_to_vlan(rocker_port, fdb->vid, NULL); in rocker_port_fdb_add()
4455 if (!rocker_port_is_bridged(rocker_port)) in rocker_port_fdb_add()
4458 return rocker_port_fdb(rocker_port, trans, fdb->addr, vlan_id, flags); in rocker_port_fdb_add()
4465 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_obj_add() local
4471 err = rocker_port_vlans_add(rocker_port, trans, in rocker_port_obj_add()
4476 err = rocker_port_fib_ipv4(rocker_port, trans, in rocker_port_obj_add()
4481 err = rocker_port_fdb_add(rocker_port, trans, in rocker_port_obj_add()
4492 static int rocker_port_vlan_del(struct rocker_port *rocker_port, in rocker_port_vlan_del() argument
4497 err = rocker_port_router_mac(rocker_port, NULL, in rocker_port_vlan_del()
4502 return rocker_port_vlan(rocker_port, NULL, in rocker_port_vlan_del()
4506 static int rocker_port_vlans_del(struct rocker_port *rocker_port, in rocker_port_vlans_del() argument
4513 err = rocker_port_vlan_del(rocker_port, vid, vlan->flags); in rocker_port_vlans_del()
4521 static int rocker_port_fdb_del(struct rocker_port *rocker_port, in rocker_port_fdb_del() argument
4525 __be16 vlan_id = rocker_port_vid_to_vlan(rocker_port, fdb->vid, NULL); in rocker_port_fdb_del()
4528 if (!rocker_port_is_bridged(rocker_port)) in rocker_port_fdb_del()
4531 return rocker_port_fdb(rocker_port, trans, fdb->addr, vlan_id, flags); in rocker_port_fdb_del()
4537 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_obj_del() local
4543 err = rocker_port_vlans_del(rocker_port, in rocker_port_obj_del()
4548 err = rocker_port_fib_ipv4(rocker_port, NULL, in rocker_port_obj_del()
4554 err = rocker_port_fdb_del(rocker_port, NULL, in rocker_port_obj_del()
4565 static int rocker_port_fdb_dump(const struct rocker_port *rocker_port, in rocker_port_fdb_dump() argument
4569 struct rocker *rocker = rocker_port->rocker; in rocker_port_fdb_dump()
4578 if (found->key.rocker_port != rocker_port) in rocker_port_fdb_dump()
4582 fdb->vid = rocker_port_vlan_to_vid(rocker_port, in rocker_port_fdb_dump()
4593 static int rocker_port_vlan_dump(const struct rocker_port *rocker_port, in rocker_port_vlan_dump() argument
4601 if (!test_bit(vid, rocker_port->vlan_bitmap)) in rocker_port_vlan_dump()
4619 const struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_obj_dump() local
4624 err = rocker_port_fdb_dump(rocker_port, in rocker_port_obj_dump()
4628 err = rocker_port_vlan_dump(rocker_port, in rocker_port_obj_dump()
4654 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_get_settings() local
4656 return rocker_cmd_get_port_settings_ethtool(rocker_port, ecmd); in rocker_port_get_settings()
4662 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_set_settings() local
4664 return rocker_cmd_set_port_settings_ethtool(rocker_port, ecmd); in rocker_port_set_settings()
4708 rocker_cmd_get_port_stats_prep(const struct rocker_port *rocker_port, in rocker_cmd_get_port_stats_prep() argument
4723 rocker_port->pport)) in rocker_cmd_get_port_stats_prep()
4732 rocker_cmd_get_port_stats_ethtool_proc(const struct rocker_port *rocker_port, in rocker_cmd_get_port_stats_ethtool_proc() argument
4755 if (pport != rocker_port->pport) in rocker_cmd_get_port_stats_ethtool_proc()
4769 static int rocker_cmd_get_port_stats_ethtool(struct rocker_port *rocker_port, in rocker_cmd_get_port_stats_ethtool() argument
4772 return rocker_cmd_exec(rocker_port, NULL, 0, in rocker_cmd_get_port_stats_ethtool()
4781 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_port_get_stats() local
4783 if (rocker_cmd_get_port_stats_ethtool(rocker_port, data) != 0) { in rocker_port_get_stats()
4815 static struct rocker_port *rocker_port_napi_tx_get(struct napi_struct *napi) in rocker_port_napi_tx_get()
4817 return container_of(napi, struct rocker_port, napi_tx); in rocker_port_napi_tx_get()
4822 struct rocker_port *rocker_port = rocker_port_napi_tx_get(napi); in rocker_port_poll_tx() local
4823 const struct rocker *rocker = rocker_port->rocker; in rocker_port_poll_tx()
4829 while ((desc_info = rocker_desc_tail_get(&rocker_port->tx_ring))) { in rocker_port_poll_tx()
4834 netdev_err(rocker_port->dev, "tx desc received with err %d\n", in rocker_port_poll_tx()
4836 rocker_tx_desc_frags_unmap(rocker_port, desc_info); in rocker_port_poll_tx()
4840 rocker_port->dev->stats.tx_packets++; in rocker_port_poll_tx()
4841 rocker_port->dev->stats.tx_bytes += skb->len; in rocker_port_poll_tx()
4843 rocker_port->dev->stats.tx_errors++; in rocker_port_poll_tx()
4850 if (credits && netif_queue_stopped(rocker_port->dev)) in rocker_port_poll_tx()
4851 netif_wake_queue(rocker_port->dev); in rocker_port_poll_tx()
4854 rocker_dma_ring_credits_set(rocker, &rocker_port->tx_ring, credits); in rocker_port_poll_tx()
4860 const struct rocker_port *rocker_port, in rocker_port_rx_proc() argument
4881 skb->protocol = eth_type_trans(skb, rocker_port->dev); in rocker_port_rx_proc()
4884 skb->offload_fwd_mark = rocker_port->dev->offload_fwd_mark; in rocker_port_rx_proc()
4886 rocker_port->dev->stats.rx_packets++; in rocker_port_rx_proc()
4887 rocker_port->dev->stats.rx_bytes += skb->len; in rocker_port_rx_proc()
4891 return rocker_dma_rx_ring_skb_alloc(rocker_port, desc_info); in rocker_port_rx_proc()
4894 static struct rocker_port *rocker_port_napi_rx_get(struct napi_struct *napi) in rocker_port_napi_rx_get()
4896 return container_of(napi, struct rocker_port, napi_rx); in rocker_port_napi_rx_get()
4901 struct rocker_port *rocker_port = rocker_port_napi_rx_get(napi); in rocker_port_poll_rx() local
4902 const struct rocker *rocker = rocker_port->rocker; in rocker_port_poll_rx()
4909 (desc_info = rocker_desc_tail_get(&rocker_port->rx_ring))) { in rocker_port_poll_rx()
4913 netdev_err(rocker_port->dev, "rx desc received with err %d\n", in rocker_port_poll_rx()
4916 err = rocker_port_rx_proc(rocker, rocker_port, in rocker_port_poll_rx()
4919 netdev_err(rocker_port->dev, "rx processing failed with err %d\n", in rocker_port_poll_rx()
4923 rocker_port->dev->stats.rx_errors++; in rocker_port_poll_rx()
4926 rocker_desc_head_set(rocker, &rocker_port->rx_ring, desc_info); in rocker_port_poll_rx()
4933 rocker_dma_ring_credits_set(rocker, &rocker_port->rx_ring, credits); in rocker_port_poll_rx()
4942 static void rocker_carrier_init(const struct rocker_port *rocker_port) in rocker_carrier_init() argument
4944 const struct rocker *rocker = rocker_port->rocker; in rocker_carrier_init()
4948 link_up = link_status & (1 << rocker_port->pport); in rocker_carrier_init()
4950 netif_carrier_on(rocker_port->dev); in rocker_carrier_init()
4952 netif_carrier_off(rocker_port->dev); in rocker_carrier_init()
4957 struct rocker_port *rocker_port; in rocker_remove_ports() local
4961 rocker_port = rocker->ports[i]; in rocker_remove_ports()
4962 if (!rocker_port) in rocker_remove_ports()
4964 rocker_port_ig_tbl(rocker_port, NULL, ROCKER_OP_FLAG_REMOVE); in rocker_remove_ports()
4965 unregister_netdev(rocker_port->dev); in rocker_remove_ports()
4966 free_netdev(rocker_port->dev); in rocker_remove_ports()
4971 static void rocker_port_dev_addr_init(struct rocker_port *rocker_port) in rocker_port_dev_addr_init() argument
4973 const struct rocker *rocker = rocker_port->rocker; in rocker_port_dev_addr_init()
4977 err = rocker_cmd_get_port_settings_macaddr(rocker_port, in rocker_port_dev_addr_init()
4978 rocker_port->dev->dev_addr); in rocker_port_dev_addr_init()
4981 eth_hw_addr_random(rocker_port->dev); in rocker_port_dev_addr_init()
4988 struct rocker_port *rocker_port; in rocker_probe_port() local
4993 dev = alloc_etherdev(sizeof(struct rocker_port)); in rocker_probe_port()
4996 rocker_port = netdev_priv(dev); in rocker_probe_port()
4997 rocker_port->dev = dev; in rocker_probe_port()
4998 rocker_port->rocker = rocker; in rocker_probe_port()
4999 rocker_port->port_number = port_number; in rocker_probe_port()
5000 rocker_port->pport = port_number + 1; in rocker_probe_port()
5001 rocker_port->brport_flags = BR_LEARNING | BR_LEARNING_SYNC; in rocker_probe_port()
5002 rocker_port->ageing_time = BR_DEFAULT_AGEING_TIME; in rocker_probe_port()
5004 rocker_port_dev_addr_init(rocker_port); in rocker_probe_port()
5008 netif_napi_add(dev, &rocker_port->napi_tx, rocker_port_poll_tx, in rocker_probe_port()
5010 netif_napi_add(dev, &rocker_port->napi_rx, rocker_port_poll_rx, in rocker_probe_port()
5012 rocker_carrier_init(rocker_port); in rocker_probe_port()
5021 rocker->ports[port_number] = rocker_port; in rocker_probe_port()
5023 switchdev_port_fwd_mark_set(rocker_port->dev, NULL, false); in rocker_probe_port()
5025 rocker_port_set_learning(rocker_port, NULL); in rocker_probe_port()
5027 err = rocker_port_ig_tbl(rocker_port, NULL, 0); in rocker_probe_port()
5029 netdev_err(rocker_port->dev, "install ig port table failed\n"); in rocker_probe_port()
5033 rocker_port->internal_vlan_id = in rocker_probe_port()
5034 rocker_port_internal_vlan_id_get(rocker_port, dev->ifindex); in rocker_probe_port()
5036 err = rocker_port_vlan_add(rocker_port, NULL, untagged_vid, 0); in rocker_probe_port()
5038 netdev_err(rocker_port->dev, "install untagged VLAN failed\n"); in rocker_probe_port()
5045 rocker_port_ig_tbl(rocker_port, NULL, ROCKER_OP_FLAG_REMOVE); in rocker_probe_port()
5060 alloc_size = sizeof(struct rocker_port *) * rocker->port_count; in rocker_probe_ports()
5291 static int rocker_port_bridge_join(struct rocker_port *rocker_port, in rocker_port_bridge_join() argument
5303 err = rocker_port_vlan_del(rocker_port, untagged_vid, 0); in rocker_port_bridge_join()
5307 rocker_port_internal_vlan_id_put(rocker_port, in rocker_port_bridge_join()
5308 rocker_port->dev->ifindex); in rocker_port_bridge_join()
5309 rocker_port->internal_vlan_id = in rocker_port_bridge_join()
5310 rocker_port_internal_vlan_id_get(rocker_port, bridge->ifindex); in rocker_port_bridge_join()
5312 rocker_port->bridge_dev = bridge; in rocker_port_bridge_join()
5313 switchdev_port_fwd_mark_set(rocker_port->dev, bridge, true); in rocker_port_bridge_join()
5315 return rocker_port_vlan_add(rocker_port, NULL, untagged_vid, 0); in rocker_port_bridge_join()
5318 static int rocker_port_bridge_leave(struct rocker_port *rocker_port) in rocker_port_bridge_leave() argument
5323 err = rocker_port_vlan_del(rocker_port, untagged_vid, 0); in rocker_port_bridge_leave()
5327 rocker_port_internal_vlan_id_put(rocker_port, in rocker_port_bridge_leave()
5328 rocker_port->bridge_dev->ifindex); in rocker_port_bridge_leave()
5329 rocker_port->internal_vlan_id = in rocker_port_bridge_leave()
5330 rocker_port_internal_vlan_id_get(rocker_port, in rocker_port_bridge_leave()
5331 rocker_port->dev->ifindex); in rocker_port_bridge_leave()
5333 switchdev_port_fwd_mark_set(rocker_port->dev, rocker_port->bridge_dev, in rocker_port_bridge_leave()
5335 rocker_port->bridge_dev = NULL; in rocker_port_bridge_leave()
5337 err = rocker_port_vlan_add(rocker_port, NULL, untagged_vid, 0); in rocker_port_bridge_leave()
5341 if (rocker_port->dev->flags & IFF_UP) in rocker_port_bridge_leave()
5342 err = rocker_port_fwd_enable(rocker_port, NULL, 0); in rocker_port_bridge_leave()
5348 static int rocker_port_ovs_changed(struct rocker_port *rocker_port, in rocker_port_ovs_changed() argument
5353 rocker_port->bridge_dev = master; in rocker_port_ovs_changed()
5355 err = rocker_port_fwd_disable(rocker_port, NULL, 0); in rocker_port_ovs_changed()
5358 err = rocker_port_fwd_enable(rocker_port, NULL, 0); in rocker_port_ovs_changed()
5363 static int rocker_port_master_linked(struct rocker_port *rocker_port, in rocker_port_master_linked() argument
5369 err = rocker_port_bridge_join(rocker_port, master); in rocker_port_master_linked()
5371 err = rocker_port_ovs_changed(rocker_port, master); in rocker_port_master_linked()
5375 static int rocker_port_master_unlinked(struct rocker_port *rocker_port) in rocker_port_master_unlinked() argument
5379 if (rocker_port_is_bridged(rocker_port)) in rocker_port_master_unlinked()
5380 err = rocker_port_bridge_leave(rocker_port); in rocker_port_master_unlinked()
5381 else if (rocker_port_is_ovsed(rocker_port)) in rocker_port_master_unlinked()
5382 err = rocker_port_ovs_changed(rocker_port, NULL); in rocker_port_master_unlinked()
5391 struct rocker_port *rocker_port; in rocker_netdevice_event() local
5402 rocker_port = netdev_priv(dev); in rocker_netdevice_event()
5404 err = rocker_port_master_linked(rocker_port, in rocker_netdevice_event()
5410 err = rocker_port_master_unlinked(rocker_port); in rocker_netdevice_event()
5431 struct rocker_port *rocker_port = netdev_priv(dev); in rocker_neigh_update() local
5436 return rocker_port_ipv4_neigh(rocker_port, NULL, flags, ip_addr, n->ha); in rocker_neigh_update()