Преглед изворни кода

Merge "core: Fully complete port init before netdev reg"

qctecmdr пре 2 година
родитељ
комит
e43b2d12d5
3 измењених фајлова са 25 додато и 18 уклоњено
  1. 16 11
      core/rmnet_config.c
  2. 7 5
      core/rmnet_descriptor.c
  3. 2 2
      core/rmnet_map_command.c

+ 16 - 11
core/rmnet_config.c

@@ -136,28 +136,33 @@ static int rmnet_register_real_device(struct net_device *real_dev)
 	port->phy_shs_cfg.map_mask = QMAP_SHS_MASK;
 	port->phy_shs_cfg.max_pkts = QMAP_SHS_PKT_LIMIT;
 
-	rc = netdev_rx_handler_register(real_dev, rmnet_rx_handler, port);
-	if (rc) {
-		kfree(port);
-		return -EBUSY;
-	}
-	/* hold on to real dev for MAP data */
-	dev_hold(real_dev);
+
+	rmnet_map_tx_aggregate_init(port);
+	rmnet_map_cmd_init(port);
+
 
 	for (entry = 0; entry < RMNET_MAX_LOGICAL_EP; entry++)
 		INIT_HLIST_HEAD(&port->muxed_ep[entry]);
 
 	rc = rmnet_descriptor_init(port);
 	if (rc) {
-		rmnet_descriptor_deinit(port);
-		return rc;
+		goto err;
 	}
 
-	rmnet_map_tx_aggregate_init(port);
-	rmnet_map_cmd_init(port);
+	rc = netdev_rx_handler_register(real_dev, rmnet_rx_handler, port);
+	if (rc) {
+		rc = -EBUSY;
+		goto err;
+	}
+	/* hold on to real dev for MAP data */
+	dev_hold(real_dev);
 
 	netdev_dbg(real_dev, "registered with rmnet\n");
 	return 0;
+err:
+	rmnet_descriptor_deinit(port);
+	kfree(port);
+	return rc;
 }
 
 static void rmnet_unregister_bridge(struct net_device *dev,

+ 7 - 5
core/rmnet_descriptor.c

@@ -2006,13 +2006,15 @@ void rmnet_descriptor_deinit(struct rmnet_port *port)
 	struct rmnet_frag_descriptor *frag_desc, *tmp;
 
 	pool = port->frag_desc_pool;
+	if (pool) {
+		list_for_each_entry_safe(frag_desc, tmp, &pool->free_list, list) {
+			kfree(frag_desc);
+			pool->pool_size--;
+		}
 
-	list_for_each_entry_safe(frag_desc, tmp, &pool->free_list, list) {
-		kfree(frag_desc);
-		pool->pool_size--;
+		kfree(pool);
+		port->frag_desc_pool = NULL;
 	}
-
-	kfree(pool);
 }
 
 int rmnet_descriptor_init(struct rmnet_port *port)

+ 2 - 2
core/rmnet_map_command.c

@@ -388,7 +388,7 @@ int rmnet_map_dl_ind_deregister(struct rmnet_port *port,
 {
 	struct rmnet_map_dl_ind *tmp;
 
-	if (!port || !dl_ind)
+	if (!port || !dl_ind || !(port->dl_list.next))
 		return -EINVAL;
 
 	list_for_each_entry(tmp, &port->dl_list, list) {
@@ -447,7 +447,7 @@ int rmnet_map_pb_ind_deregister(struct rmnet_port *port,
 {
 	struct rmnet_map_pb_ind *tmp;
 
-	if (!port || !pb_ind)
+	if (!port || !pb_ind || !(port->pb_list.next))
 		return -EINVAL;
 
 	list_for_each_entry(tmp, &port->pb_list, list) {