static void wl_cfg80211_bt_handler(struct work_struct *work) { struct btcoex_info *btcx_inf; btcx_inf = container_of(work, struct btcoex_info, work); if (btcx_inf->timer_on) { btcx_inf->timer_on = 0; del_timer_sync(&btcx_inf->timer); } switch (btcx_inf->bt_state) { case BT_DHCP_START: /* DHCP started * provide OPPORTUNITY window to get DHCP address */ WL_TRACE(("bt_dhcp stm: started \n")); btcx_inf->bt_state = BT_DHCP_OPPR_WIN; mod_timer(&btcx_inf->timer, jiffies + msecs_to_jiffies(BT_DHCP_OPPR_WIN_TIME)); btcx_inf->timer_on = 1; break; case BT_DHCP_OPPR_WIN: if (btcx_inf->dhcp_done) { WL_TRACE(("DHCP Done before T1 expiration\n")); goto btc_coex_idle; } /* DHCP is not over yet, start lowering BT priority * enforce btc_params + flags if necessary */ WL_TRACE(("DHCP T1:%d expired\n", BT_DHCP_OPPR_WIN_TIME)); if (btcx_inf->dev) wl_cfg80211_bt_setflag(btcx_inf->dev, TRUE); btcx_inf->bt_state = BT_DHCP_FLAG_FORCE_TIMEOUT; mod_timer(&btcx_inf->timer, jiffies + msecs_to_jiffies(BT_DHCP_FLAG_FORCE_TIME)); btcx_inf->timer_on = 1; break; case BT_DHCP_FLAG_FORCE_TIMEOUT: if (btcx_inf->dhcp_done) { WL_TRACE(("DHCP Done before T2 expiration\n")); } else { /* Noo dhcp during T1+T2, restore BT priority */ WL_TRACE(("DHCP wait interval T2:%d msec expired\n", BT_DHCP_FLAG_FORCE_TIME)); } /* Restoring default bt priority */ if (btcx_inf->dev) wl_cfg80211_bt_setflag(btcx_inf->dev, FALSE); btc_coex_idle: btcx_inf->bt_state = BT_DHCP_IDLE; btcx_inf->timer_on = 0; break; default: WL_ERR(("error g_status=%d !!!\n", btcx_inf->bt_state)); if (btcx_inf->dev) wl_cfg80211_bt_setflag(btcx_inf->dev, FALSE); btcx_inf->bt_state = BT_DHCP_IDLE; btcx_inf->timer_on = 0; break; } net_os_wake_unlock(btcx_inf->dev); }
static void wl_cfg80211_bt_handler(struct work_struct *work) { struct btcoex_info *btcx_inf; btcx_inf = container_of(work, struct btcoex_info, work); if (btcx_inf->timer_on) { btcx_inf->timer_on = 0; del_timer_sync(&btcx_inf->timer); } switch (btcx_inf->bt_state) { case BT_DHCP_START: WL_TRACE(("%s bt_dhcp stm: started \n", __FUNCTION__)); bt_coex_retry_cnt = 0; btcx_inf->bt_state = BT_DHCP_OPPR_WIN; mod_timer(&btcx_inf->timer, jiffies + msecs_to_jiffies(BT_DHCP_OPPR_WIN_TIME)); btcx_inf->timer_on = 1; break; case BT_DHCP_OPPR_WIN: if ((btcx_inf->dhcp_done)||(bt_coex_retry_cnt > 7)) { WL_TRACE(("%s DHCP Done before T1 expiration\n", __FUNCTION__)); goto btc_coex_idle; } WL_TRACE(("%s DHCP T1:%d expired\n", __FUNCTION__, BT_DHCP_OPPR_WIN_TIME)); if (btcx_inf->dev) wl_cfg80211_bt_setflag(btcx_inf->dev, TRUE); btcx_inf->bt_state = BT_DHCP_FLAG_FORCE_TIMEOUT; mod_timer(&btcx_inf->timer, jiffies + msecs_to_jiffies(BT_DHCP_FLAG_FORCE_TIME)); btcx_inf->timer_on = 1; break; case BT_DHCP_FLAG_FORCE_TIMEOUT: if ((btcx_inf->dhcp_done)||(++bt_coex_retry_cnt > 7)) { WL_TRACE(("%s DHCP Done before T2 expiration\n", __FUNCTION__)); if (btcx_inf->dev) wl_cfg80211_bt_setflag(btcx_inf->dev, FALSE); goto btc_coex_idle; } else { WL_TRACE(("%s DHCP wait interval T2:%d" "msec expired\n", __FUNCTION__, BT_DHCP_FLAG_FORCE_TIME)); if (btcx_inf->dev) wl_cfg80211_bt_setflag(btcx_inf->dev, FALSE); btcx_inf->bt_state = BT_DHCP_OPPR_WIN; mod_timer(&btcx_inf->timer, jiffies + msecs_to_jiffies(BT_DHCP_OPPR_WIN_TIME)); btcx_inf->timer_on = 1; } if (!(btcx_inf->dhcp_done)) { break; } btc_coex_idle: btcx_inf->bt_state = BT_DHCP_IDLE; btcx_inf->timer_on = 0; bt_coex_retry_cnt = 0; break; default: WL_ERR(("%s error g_status=%d !!!\n", __FUNCTION__, btcx_inf->bt_state)); if (btcx_inf->dev) wl_cfg80211_bt_setflag(btcx_inf->dev, FALSE); btcx_inf->bt_state = BT_DHCP_IDLE; btcx_inf->timer_on = 0; break; } net_os_wake_unlock(btcx_inf->dev); }