|
@@ -795,70 +795,60 @@ static int lbs_thread(void *data)
|
|
init_waitqueue_entry(&wait, current);
|
|
init_waitqueue_entry(&wait, current);
|
|
|
|
|
|
set_freezable();
|
|
set_freezable();
|
|
|
|
+
|
|
for (;;) {
|
|
for (;;) {
|
|
- lbs_deb_thread( "main-thread 111: intcounter=%d "
|
|
|
|
- "currenttxskb=%p dnld_sent=%d\n",
|
|
|
|
- adapter->intcounter,
|
|
|
|
- adapter->currenttxskb, priv->dnld_sent);
|
|
|
|
|
|
+ lbs_deb_thread( "main-thread 111: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
|
|
|
|
+ adapter->intcounter, adapter->currenttxskb, priv->dnld_sent);
|
|
|
|
|
|
add_wait_queue(&priv->waitq, &wait);
|
|
add_wait_queue(&priv->waitq, &wait);
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
spin_lock_irq(&adapter->driver_lock);
|
|
spin_lock_irq(&adapter->driver_lock);
|
|
|
|
+
|
|
if ((adapter->psstate == PS_STATE_SLEEP) ||
|
|
if ((adapter->psstate == PS_STATE_SLEEP) ||
|
|
- (!adapter->intcounter
|
|
|
|
- && (priv->dnld_sent || adapter->cur_cmd ||
|
|
|
|
- list_empty(&adapter->cmdpendingq)))) {
|
|
|
|
- lbs_deb_thread(
|
|
|
|
- "main-thread sleeping... Conn=%d IntC=%d PS_mode=%d PS_State=%d\n",
|
|
|
|
- adapter->connect_status, adapter->intcounter,
|
|
|
|
- adapter->psmode, adapter->psstate);
|
|
|
|
|
|
+ (!adapter->intcounter && (priv->dnld_sent || adapter->cur_cmd || list_empty(&adapter->cmdpendingq)))) {
|
|
|
|
+ lbs_deb_thread("main-thread sleeping... Conn=%d IntC=%d PS_mode=%d PS_State=%d\n",
|
|
|
|
+ adapter->connect_status, adapter->intcounter,
|
|
|
|
+ adapter->psmode, adapter->psstate);
|
|
spin_unlock_irq(&adapter->driver_lock);
|
|
spin_unlock_irq(&adapter->driver_lock);
|
|
schedule();
|
|
schedule();
|
|
} else
|
|
} else
|
|
spin_unlock_irq(&adapter->driver_lock);
|
|
spin_unlock_irq(&adapter->driver_lock);
|
|
|
|
|
|
- lbs_deb_thread(
|
|
|
|
- "main-thread 222 (waking up): intcounter=%d currenttxskb=%p "
|
|
|
|
- "dnld_sent=%d\n", adapter->intcounter,
|
|
|
|
- adapter->currenttxskb, priv->dnld_sent);
|
|
|
|
|
|
+ lbs_deb_thread("main-thread 222 (waking up): intcounter=%d currenttxskb=%p dnld_sent=%d\n",
|
|
|
|
+ adapter->intcounter, adapter->currenttxskb, priv->dnld_sent);
|
|
|
|
|
|
set_current_state(TASK_RUNNING);
|
|
set_current_state(TASK_RUNNING);
|
|
remove_wait_queue(&priv->waitq, &wait);
|
|
remove_wait_queue(&priv->waitq, &wait);
|
|
try_to_freeze();
|
|
try_to_freeze();
|
|
|
|
|
|
- lbs_deb_thread("main-thread 333: intcounter=%d currenttxskb=%p "
|
|
|
|
- "dnld_sent=%d\n",
|
|
|
|
- adapter->intcounter,
|
|
|
|
- adapter->currenttxskb, priv->dnld_sent);
|
|
|
|
|
|
+ lbs_deb_thread("main-thread 333: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
|
|
|
|
+ adapter->intcounter, adapter->currenttxskb, priv->dnld_sent);
|
|
|
|
|
|
- if (kthread_should_stop()
|
|
|
|
- || adapter->surpriseremoved) {
|
|
|
|
- lbs_deb_thread(
|
|
|
|
- "main-thread: break from main thread: surpriseremoved=0x%x\n",
|
|
|
|
- adapter->surpriseremoved);
|
|
|
|
|
|
+ if (kthread_should_stop() || adapter->surpriseremoved) {
|
|
|
|
+ lbs_deb_thread("main-thread: break from main thread: surpriseremoved=0x%x\n",
|
|
|
|
+ adapter->surpriseremoved);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
spin_lock_irq(&adapter->driver_lock);
|
|
spin_lock_irq(&adapter->driver_lock);
|
|
|
|
+
|
|
if (adapter->intcounter) {
|
|
if (adapter->intcounter) {
|
|
u8 int_status;
|
|
u8 int_status;
|
|
|
|
+
|
|
adapter->intcounter = 0;
|
|
adapter->intcounter = 0;
|
|
int_status = priv->hw_get_int_status(priv, &ireg);
|
|
int_status = priv->hw_get_int_status(priv, &ireg);
|
|
|
|
|
|
if (int_status) {
|
|
if (int_status) {
|
|
- lbs_deb_thread(
|
|
|
|
- "main-thread: reading HOST_INT_STATUS_REG failed\n");
|
|
|
|
|
|
+ lbs_deb_thread("main-thread: reading HOST_INT_STATUS_REG failed\n");
|
|
spin_unlock_irq(&adapter->driver_lock);
|
|
spin_unlock_irq(&adapter->driver_lock);
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
adapter->hisregcpy |= ireg;
|
|
adapter->hisregcpy |= ireg;
|
|
}
|
|
}
|
|
|
|
|
|
- lbs_deb_thread("main-thread 444: intcounter=%d currenttxskb=%p "
|
|
|
|
- "dnld_sent=%d\n",
|
|
|
|
- adapter->intcounter,
|
|
|
|
- adapter->currenttxskb, priv->dnld_sent);
|
|
|
|
|
|
+ lbs_deb_thread("main-thread 444: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
|
|
|
|
+ adapter->intcounter, adapter->currenttxskb, priv->dnld_sent);
|
|
|
|
|
|
/* command response? */
|
|
/* command response? */
|
|
if (adapter->hisregcpy & MRVDRV_CMD_UPLD_RDY) {
|
|
if (adapter->hisregcpy & MRVDRV_CMD_UPLD_RDY) {
|
|
@@ -877,8 +867,7 @@ static int lbs_thread(void *data)
|
|
adapter->hisregcpy &= ~MRVDRV_CARDEVENT;
|
|
adapter->hisregcpy &= ~MRVDRV_CARDEVENT;
|
|
|
|
|
|
if (priv->hw_read_event_cause(priv)) {
|
|
if (priv->hw_read_event_cause(priv)) {
|
|
- lbs_pr_alert(
|
|
|
|
- "main-thread: hw_read_event_cause failed\n");
|
|
|
|
|
|
+ lbs_pr_alert("main-thread: hw_read_event_cause failed\n");
|
|
spin_unlock_irq(&adapter->driver_lock);
|
|
spin_unlock_irq(&adapter->driver_lock);
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
@@ -888,30 +877,21 @@ static int lbs_thread(void *data)
|
|
spin_unlock_irq(&adapter->driver_lock);
|
|
spin_unlock_irq(&adapter->driver_lock);
|
|
|
|
|
|
/* Check if we need to confirm Sleep Request received previously */
|
|
/* Check if we need to confirm Sleep Request received previously */
|
|
- if (adapter->psstate == PS_STATE_PRE_SLEEP) {
|
|
|
|
- if (!priv->dnld_sent && !adapter->cur_cmd) {
|
|
|
|
- if (adapter->connect_status ==
|
|
|
|
- LBS_CONNECTED) {
|
|
|
|
- lbs_deb_thread(
|
|
|
|
- "main_thread: PRE_SLEEP--intcounter=%d currenttxskb=%p "
|
|
|
|
- "dnld_sent=%d cur_cmd=%p, confirm now\n",
|
|
|
|
- adapter->intcounter,
|
|
|
|
- adapter->currenttxskb,
|
|
|
|
- priv->dnld_sent,
|
|
|
|
- adapter->cur_cmd);
|
|
|
|
-
|
|
|
|
- lbs_ps_confirm_sleep(priv,
|
|
|
|
- (u16) adapter->psmode);
|
|
|
|
- } else {
|
|
|
|
- /* workaround for firmware sending
|
|
|
|
- * deauth/linkloss event immediately
|
|
|
|
- * after sleep request, remove this
|
|
|
|
- * after firmware fixes it
|
|
|
|
- */
|
|
|
|
- adapter->psstate = PS_STATE_AWAKE;
|
|
|
|
- lbs_pr_alert(
|
|
|
|
- "main-thread: ignore PS_SleepConfirm in non-connected state\n");
|
|
|
|
- }
|
|
|
|
|
|
+ if (adapter->psstate == PS_STATE_PRE_SLEEP &&
|
|
|
|
+ !priv->dnld_sent && !adapter->cur_cmd) {
|
|
|
|
+ if (adapter->connect_status == LBS_CONNECTED) {
|
|
|
|
+ lbs_deb_thread("main_thread: PRE_SLEEP--intcounter=%d currenttxskb=%p dnld_sent=%d cur_cmd=%p, confirm now\n",
|
|
|
|
+ adapter->intcounter, adapter->currenttxskb, priv->dnld_sent, adapter->cur_cmd);
|
|
|
|
+
|
|
|
|
+ lbs_ps_confirm_sleep(priv, (u16) adapter->psmode);
|
|
|
|
+ } else {
|
|
|
|
+ /* workaround for firmware sending
|
|
|
|
+ * deauth/linkloss event immediately
|
|
|
|
+ * after sleep request; remove this
|
|
|
|
+ * after firmware fixes it
|
|
|
|
+ */
|
|
|
|
+ adapter->psstate = PS_STATE_AWAKE;
|
|
|
|
+ lbs_pr_alert("main-thread: ignore PS_SleepConfirm in non-connected state\n");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|