* @initialized:       Bit mask indicating endpoints initialized
  * @set_up:            Bit mask indicating endpoints set up
  * @enabled:           Bit mask indicating endpoints enabled
+ * @modem_tx_count:    Number of defined modem TX endoints
  * @endpoint:          Array of endpoint information
  * @channel_map:       Mapping of GSI channel to IPA endpoint
  * @name_map:          Mapping of IPA endpoint name to IPA endpoint
        u32 set_up;
        u32 enabled;
 
+       u32 modem_tx_count;
        struct ipa_endpoint endpoint[IPA_ENDPOINT_MAX];
        struct ipa_endpoint *channel_map[GSI_CHANNEL_COUNT_MAX];
        struct ipa_endpoint *name_map[IPA_ENDPOINT_COUNT];
 
        struct gsi_trans *trans;
        u32 count;
 
-       /* We need one command per modem TX endpoint.  We can get an upper
-        * bound on that by assuming all initialized endpoints are modem->IPA.
-        * That won't happen, and we could be more precise, but this is fine
-        * for now.  End the transaction with commands to clear the pipeline.
+       /* We need one command per modem TX endpoint, plus the commands
+        * that clear the pipeline.
         */
-       count = hweight32(initialized) + ipa_cmd_pipeline_clear_count();
+       count = ipa->modem_tx_count + ipa_cmd_pipeline_clear_count();
        trans = ipa_cmd_trans_alloc(ipa, count);
        if (!trans) {
                dev_err(&ipa->pdev->dev,
 
                if (data->endpoint.filter_support)
                        filter_map |= BIT(data->endpoint_id);
+               if (data->ee_id == GSI_EE_MODEM && data->toward_ipa)
+                       ipa->modem_tx_count++;
        }
 
        if (!ipa_filter_map_valid(ipa, filter_map))