Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h +1 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ struct rmnet_port { /* dl marker elements */ struct list_head dl_list; struct rmnet_port_priv_stats stats; int dl_marker_flush; }; extern struct rtnl_link_ops rmnet_link_ops; Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c +17 −5 Original line number Diff line number Diff line Loading @@ -77,8 +77,8 @@ EXPORT_SYMBOL(rmnet_shs_skb_entry); void rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port) { struct rmnet_priv *priv = netdev_priv(skb->dev); int (*rmnet_shs_stamp)(struct sk_buff *skb, struct rmnet_port *port); struct rmnet_priv *priv = netdev_priv(skb->dev); skb_reset_transport_header(skb); skb_reset_network_header(skb); Loading @@ -93,11 +93,23 @@ rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port) return; } if (port->data_format & RMNET_INGRESS_FORMAT_DL_MARKER) { if (!rmnet_check_skb_can_gro(skb) && port->dl_marker_flush >= 0) { struct napi_struct *napi = get_current_napi_context(); napi_gro_receive(napi, skb); port->dl_marker_flush++; } else { netif_receive_skb(skb); } } else { if (!rmnet_check_skb_can_gro(skb)) gro_cells_receive(&priv->gro_cells, skb); else netif_receive_skb(skb); } } EXPORT_SYMBOL(rmnet_deliver_skb); /* MAP handler */ Loading drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c +12 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,8 @@ static void rmnet_map_dl_hdr_notify(struct rmnet_port *port, { struct rmnet_map_dl_ind *tmp; port->dl_marker_flush = 0; list_for_each_entry(tmp, &port->dl_list, list) tmp->dl_hdr_handler(dlhdr); } Loading @@ -107,9 +109,17 @@ static void rmnet_map_dl_trl_notify(struct rmnet_port *port, struct rmnet_map_dl_ind_trl *dltrl) { struct rmnet_map_dl_ind *tmp; struct napi_struct *napi; list_for_each_entry(tmp, &port->dl_list, list) tmp->dl_trl_handler(dltrl); if (port->dl_marker_flush) { napi = get_current_napi_context(); napi_gro_flush(napi, false); } port->dl_marker_flush = -1; } static void rmnet_map_process_flow_start(struct sk_buff *skb, Loading Loading @@ -253,6 +263,8 @@ void rmnet_map_cmd_exit(struct rmnet_port *port) void rmnet_map_cmd_init(struct rmnet_port *port) { INIT_LIST_HEAD(&port->dl_list); port->dl_marker_flush = -1; } int rmnet_map_dl_ind_register(struct rmnet_port *port, Loading Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h +1 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ struct rmnet_port { /* dl marker elements */ struct list_head dl_list; struct rmnet_port_priv_stats stats; int dl_marker_flush; }; extern struct rtnl_link_ops rmnet_link_ops; Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.c +17 −5 Original line number Diff line number Diff line Loading @@ -77,8 +77,8 @@ EXPORT_SYMBOL(rmnet_shs_skb_entry); void rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port) { struct rmnet_priv *priv = netdev_priv(skb->dev); int (*rmnet_shs_stamp)(struct sk_buff *skb, struct rmnet_port *port); struct rmnet_priv *priv = netdev_priv(skb->dev); skb_reset_transport_header(skb); skb_reset_network_header(skb); Loading @@ -93,11 +93,23 @@ rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port) return; } if (port->data_format & RMNET_INGRESS_FORMAT_DL_MARKER) { if (!rmnet_check_skb_can_gro(skb) && port->dl_marker_flush >= 0) { struct napi_struct *napi = get_current_napi_context(); napi_gro_receive(napi, skb); port->dl_marker_flush++; } else { netif_receive_skb(skb); } } else { if (!rmnet_check_skb_can_gro(skb)) gro_cells_receive(&priv->gro_cells, skb); else netif_receive_skb(skb); } } EXPORT_SYMBOL(rmnet_deliver_skb); /* MAP handler */ Loading
drivers/net/ethernet/qualcomm/rmnet/rmnet_map_command.c +12 −0 Original line number Diff line number Diff line Loading @@ -99,6 +99,8 @@ static void rmnet_map_dl_hdr_notify(struct rmnet_port *port, { struct rmnet_map_dl_ind *tmp; port->dl_marker_flush = 0; list_for_each_entry(tmp, &port->dl_list, list) tmp->dl_hdr_handler(dlhdr); } Loading @@ -107,9 +109,17 @@ static void rmnet_map_dl_trl_notify(struct rmnet_port *port, struct rmnet_map_dl_ind_trl *dltrl) { struct rmnet_map_dl_ind *tmp; struct napi_struct *napi; list_for_each_entry(tmp, &port->dl_list, list) tmp->dl_trl_handler(dltrl); if (port->dl_marker_flush) { napi = get_current_napi_context(); napi_gro_flush(napi, false); } port->dl_marker_flush = -1; } static void rmnet_map_process_flow_start(struct sk_buff *skb, Loading Loading @@ -253,6 +263,8 @@ void rmnet_map_cmd_exit(struct rmnet_port *port) void rmnet_map_cmd_init(struct rmnet_port *port) { INIT_LIST_HEAD(&port->dl_list); port->dl_marker_flush = -1; } int rmnet_map_dl_ind_register(struct rmnet_port *port, Loading