* enum ipa_power_flag - IPA power flags
* @IPA_POWER_FLAG_RESUMED: Whether resume from suspend has been signaled
* @IPA_POWER_FLAG_SYSTEM: Hardware is system (not runtime) suspended
- * @IPA_POWER_FLAG_STOPPED: Modem TX is disabled by ipa_start_xmit()
* @IPA_POWER_FLAG_COUNT: Number of defined power flags
*/
enum ipa_power_flag {
IPA_POWER_FLAG_RESUMED,
IPA_POWER_FLAG_SYSTEM,
- IPA_POWER_FLAG_STOPPED,
IPA_POWER_FLAG_COUNT, /* Last; not a flag */
};
* @dev: IPA device pointer
* @core: IPA core clock
* @qmp: QMP handle for AOSS communication
- * @spinlock: Protects modem TX queue enable/disable
* @flags: Boolean state flags
* @interconnect_count: Number of elements in interconnect[]
* @interconnect: Interconnect array
struct device *dev;
struct clk *core;
struct qmp *qmp;
- spinlock_t spinlock; /* used with STOPPED power flag */
DECLARE_BITMAP(flags, IPA_POWER_FLAG_COUNT);
u32 interconnect_count;
struct icc_bulk_data interconnect[] __counted_by(interconnect_count);
* gets sent (or dropped). If power is not ACTIVE, it will eventually
* be, and transmits stay disabled until after it is.
*
- * A flag and a spinlock are used when managing this. If the queue gets
- * stopped, the STOPPED power flag is set.
- *
* The first function stops the modem netdev transmit queue. The second
- * function starts the transmit queue, but only if the STOPPED flag is
- * set. This avoids enabling transmits repeatedly immediately after
- * power has become ACTIVE (not really a big deal). If the STOPPED flag
- * was set, it is cleared by this function.
- *
- * The third function just enables transmits again.
+ * function starts the transmit queue and is used in the power resume
+ * path after power has become ACTIVE. The third function also enables
+ * transmits again, and is used by ipa_start_xmit() once it knows power
+ * is active.
*/
void ipa_power_modem_queue_stop(struct ipa *ipa)
{
- struct ipa_power *power = ipa->power;
- unsigned long flags;
-
- spin_lock_irqsave(&power->spinlock, flags);
-
netif_stop_queue(ipa->modem_netdev);
- __set_bit(IPA_POWER_FLAG_STOPPED, power->flags);
-
- spin_unlock_irqrestore(&power->spinlock, flags);
}
-/* This function starts the modem netdev transmit queue, but only if the
- * STOPPED flag is set. That flag is cleared if it was set.
- */
void ipa_power_modem_queue_wake(struct ipa *ipa)
{
- struct ipa_power *power = ipa->power;
- unsigned long flags;
-
- spin_lock_irqsave(&power->spinlock, flags);
-
- if (__test_and_clear_bit(IPA_POWER_FLAG_STOPPED, power->flags))
- netif_wake_queue(ipa->modem_netdev);
-
- spin_unlock_irqrestore(&power->spinlock, flags);
+ netif_wake_queue(ipa->modem_netdev);
}
-/* This function enables transmits again after power has become ACTIVE. */
void ipa_power_modem_queue_active(struct ipa *ipa)
{
netif_wake_queue(ipa->modem_netdev);
}
power->dev = dev;
power->core = clk;
- spin_lock_init(&power->spinlock);
power->interconnect_count = data->interconnect_count;
ret = ipa_interconnect_init(power, data->interconnect_data);