···5656 ath10k_dbg(ar, ATH10K_DBG_HTC, "%s: ep %d skb %pK\n", __func__,5757 ep->eid, skb);58585959+ /* A corner case where the copy completion is reaching to host but still6060+ * copy engine is processing it due to which host unmaps corresponding6161+ * memory and causes SMMU fault, hence as workaround adding delay6262+ * the unmapping memory to avoid SMMU faults.6363+ */6464+ if (ar->hw_params.delay_unmap_buffer &&6565+ ep->ul_pipe_id == 3)6666+ mdelay(2);6767+5968 hdr = (struct ath10k_htc_hdr *)skb->data;6069 ath10k_htc_restore_tx_skb(ep->htc, skb);6170
···241241#define ath11k_a_rates (ath11k_legacy_rates + 4)242242#define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4)243243244244-#define ATH11K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */244244+#define ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD 200 /* in msecs */245245+246246+/* Overhead due to the processing of channel switch events from FW */247247+#define ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD 10 /* in msecs */245248246249static const u32 ath11k_smps_map[] = {247250 [WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,···36153612 struct scan_req_params arg;36163613 int ret = 0;36173614 int i;36153615+ u32 scan_timeout;3618361636193617 mutex_lock(&ar->conf_mutex);36203618···36853681 ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask);36863682 }3687368336843684+ /* if duration is set, default dwell times will be overwritten */36853685+ if (req->duration) {36863686+ arg.dwell_time_active = req->duration;36873687+ arg.dwell_time_active_2g = req->duration;36883688+ arg.dwell_time_active_6g = req->duration;36893689+ arg.dwell_time_passive = req->duration;36903690+ arg.dwell_time_passive_6g = req->duration;36913691+ arg.burst_duration = req->duration;36923692+36933693+ scan_timeout = min_t(u32, arg.max_rest_time *36943694+ (arg.num_chan - 1) + (req->duration +36953695+ ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) *36963696+ arg.num_chan, arg.max_scan_time);36973697+ } else {36983698+ scan_timeout = arg.max_scan_time;36993699+ }37003700+37013701+ /* Add a margin to account for event/command processing */37023702+ scan_timeout += ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD;37033703+36883704 ret = ath11k_start_scan(ar, &arg);36893705 if (ret) {36903706 ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret);···37133689 spin_unlock_bh(&ar->data_lock);37143690 }3715369137163716- /* Add a 200ms margin to account for event/command processing */37173692 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,37183718- msecs_to_jiffies(arg.max_scan_time +37193719- ATH11K_MAC_SCAN_TIMEOUT_MSECS));36933693+ msecs_to_jiffies(scan_timeout));3720369437213695exit:37223696 kfree(arg.chan_list);···42374215 const u8 *ht_mcs_mask;42384216 const u16 *vht_mcs_mask;42394217 const u16 *he_mcs_mask;42404240- u32 changed, bw, nss, smps;42184218+ u32 changed, bw, nss, smps, bw_prev;42414219 int err, num_vht_rates, num_he_rates;42424220 const struct cfg80211_bitrate_mask *mask;42434221 struct peer_assoc_params peer_arg;42224222+ enum wmi_phy_mode peer_phymode;4244422342454224 arsta = container_of(wk, struct ath11k_sta, update_wk);42464225 sta = container_of((void *)arsta, struct ieee80211_sta, drv_priv);···42624239 arsta->changed = 0;4263424042644241 bw = arsta->bw;42424242+ bw_prev = arsta->bw_prev;42654243 nss = arsta->nss;42664244 smps = arsta->smps;42674245···42764252 ath11k_mac_max_he_nss(he_mcs_mask)));4277425342784254 if (changed & IEEE80211_RC_BW_CHANGED) {42794279- /* Send peer assoc command before set peer bandwidth param to42804280- * avoid the mismatch between the peer phymode and the peer42814281- * bandwidth.42824282- */42834283- ath11k_peer_assoc_prepare(ar, arvif->vif, sta, &peer_arg, true);42554255+ /* Get the peer phymode */42564256+ ath11k_peer_assoc_h_phymode(ar, arvif->vif, sta, &peer_arg);42574257+ peer_phymode = peer_arg.peer_phymode;4284425842854285- peer_arg.is_assoc = false;42864286- err = ath11k_wmi_send_peer_assoc_cmd(ar, &peer_arg);42874287- if (err) {42884288- ath11k_warn(ar->ab, "failed to send peer assoc for STA %pM vdev %i: %d\n",42894289- sta->addr, arvif->vdev_id, err);42904290- } else if (wait_for_completion_timeout(&ar->peer_assoc_done, 1 * HZ)) {42594259+ ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac update sta %pM peer bw %d phymode %d\n",42604260+ sta->addr, bw, peer_phymode);42614261+42624262+ if (bw > bw_prev) {42634263+ /* BW is upgraded. In this case we send WMI_PEER_PHYMODE42644264+ * followed by WMI_PEER_CHWIDTH42654265+ */42664266+ ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac BW upgrade for sta %pM new BW %d, old BW %d\n",42674267+ sta->addr, bw, bw_prev);42684268+42694269+ err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,42704270+ WMI_PEER_PHYMODE, peer_phymode);42714271+42724272+ if (err) {42734273+ ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n",42744274+ sta->addr, peer_phymode, err);42754275+ goto err_rc_bw_changed;42764276+ }42774277+42914278 err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,42924279 WMI_PEER_CHWIDTH, bw);42804280+42934281 if (err)42944282 ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",42954283 sta->addr, bw, err);42964284 } else {42974297- ath11k_warn(ar->ab, "failed to get peer assoc conf event for %pM vdev %i\n",42984298- sta->addr, arvif->vdev_id);42854285+ /* BW is downgraded. In this case we send WMI_PEER_CHWIDTH42864286+ * followed by WMI_PEER_PHYMODE42874287+ */42884288+ ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac BW downgrade for sta %pM new BW %d,old BW %d\n",42894289+ sta->addr, bw, bw_prev);42904290+42914291+ err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,42924292+ WMI_PEER_CHWIDTH, bw);42934293+42944294+ if (err) {42954295+ ath11k_warn(ar->ab, "failed to update STA %pM peer bw %d: %d\n",42964296+ sta->addr, bw, err);42974297+ goto err_rc_bw_changed;42984298+ }42994299+43004300+ err = ath11k_wmi_set_peer_param(ar, sta->addr, arvif->vdev_id,43014301+ WMI_PEER_PHYMODE, peer_phymode);43024302+43034303+ if (err)43044304+ ath11k_warn(ar->ab, "failed to update STA %pM peer phymode %d: %d\n",43054305+ sta->addr, peer_phymode, err);42994306 }43004307 }43014308···44074352 }44084353 }4409435443554355+err_rc_bw_changed:44104356 mutex_unlock(&ar->conf_mutex);44114357}44124358···45614505 return ret;45624506}4563450745084508+static u32 ath11k_mac_ieee80211_sta_bw_to_wmi(struct ath11k *ar,45094509+ struct ieee80211_sta *sta)45104510+{45114511+ u32 bw = WMI_PEER_CHWIDTH_20MHZ;45124512+45134513+ switch (sta->deflink.bandwidth) {45144514+ case IEEE80211_STA_RX_BW_20:45154515+ bw = WMI_PEER_CHWIDTH_20MHZ;45164516+ break;45174517+ case IEEE80211_STA_RX_BW_40:45184518+ bw = WMI_PEER_CHWIDTH_40MHZ;45194519+ break;45204520+ case IEEE80211_STA_RX_BW_80:45214521+ bw = WMI_PEER_CHWIDTH_80MHZ;45224522+ break;45234523+ case IEEE80211_STA_RX_BW_160:45244524+ bw = WMI_PEER_CHWIDTH_160MHZ;45254525+ break;45264526+ default:45274527+ ath11k_warn(ar->ab, "Invalid bandwidth %d for %pM\n",45284528+ sta->deflink.bandwidth, sta->addr);45294529+ bw = WMI_PEER_CHWIDTH_20MHZ;45304530+ break;45314531+ }45324532+45334533+ return bw;45344534+}45354535+45644536static int ath11k_mac_op_sta_state(struct ieee80211_hw *hw,45654537 struct ieee80211_vif *vif,45664538 struct ieee80211_sta *sta,···46744590 if (ret)46754591 ath11k_warn(ar->ab, "Failed to associate station: %pM\n",46764592 sta->addr);45934593+45944594+ spin_lock_bh(&ar->data_lock);45954595+ /* Set arsta bw and prev bw */45964596+ arsta->bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta);45974597+ arsta->bw_prev = arsta->bw;45984598+ spin_unlock_bh(&ar->data_lock);46774599 } else if (old_state == IEEE80211_STA_ASSOC &&46784600 new_state == IEEE80211_STA_AUTHORIZED) {46794601 spin_lock_bh(&ar->ab->base_lock);···48034713 spin_lock_bh(&ar->data_lock);4804471448054715 if (changed & IEEE80211_RC_BW_CHANGED) {48064806- bw = WMI_PEER_CHWIDTH_20MHZ;48074807-48084808- switch (sta->deflink.bandwidth) {48094809- case IEEE80211_STA_RX_BW_20:48104810- bw = WMI_PEER_CHWIDTH_20MHZ;48114811- break;48124812- case IEEE80211_STA_RX_BW_40:48134813- bw = WMI_PEER_CHWIDTH_40MHZ;48144814- break;48154815- case IEEE80211_STA_RX_BW_80:48164816- bw = WMI_PEER_CHWIDTH_80MHZ;48174817- break;48184818- case IEEE80211_STA_RX_BW_160:48194819- bw = WMI_PEER_CHWIDTH_160MHZ;48204820- break;48214821- default:48224822- ath11k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",48234823- sta->deflink.bandwidth, sta->addr);48244824- bw = WMI_PEER_CHWIDTH_20MHZ;48254825- break;48264826- }48274827-47164716+ bw = ath11k_mac_ieee80211_sta_bw_to_wmi(ar, sta);47174717+ arsta->bw_prev = arsta->bw;48284718 arsta->bw = bw;48294719 }48304720···62336163 }62346164}6235616561666166+static int ath11k_mac_vdev_delete(struct ath11k *ar, struct ath11k_vif *arvif)61676167+{61686168+ unsigned long time_left;61696169+ struct ieee80211_vif *vif = arvif->vif;61706170+ int ret = 0;61716171+61726172+ lockdep_assert_held(&ar->conf_mutex);61736173+61746174+ reinit_completion(&ar->vdev_delete_done);61756175+61766176+ ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id);61776177+ if (ret) {61786178+ ath11k_warn(ar->ab, "failed to delete WMI vdev %d: %d\n",61796179+ arvif->vdev_id, ret);61806180+ return ret;61816181+ }61826182+61836183+ time_left = wait_for_completion_timeout(&ar->vdev_delete_done,61846184+ ATH11K_VDEV_DELETE_TIMEOUT_HZ);61856185+ if (time_left == 0) {61866186+ ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n");61876187+ return -ETIMEDOUT;61886188+ }61896189+61906190+ ar->ab->free_vdev_map |= 1LL << (arvif->vdev_id);61916191+ ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);61926192+ ar->num_created_vdevs--;61936193+61946194+ ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",61956195+ vif->addr, arvif->vdev_id);61966196+61976197+ return ret;61986198+}61996199+62366200static int ath11k_mac_op_add_interface(struct ieee80211_hw *hw,62376201 struct ieee80211_vif *vif)62386202{···6477637364786374 ath11k_dp_vdev_tx_attach(ar, arvif);6479637563766376+ ath11k_debugfs_add_interface(arvif);63776377+64806378 if (vif->type != NL80211_IFTYPE_MONITOR &&64816379 test_bit(ATH11K_FLAG_MONITOR_CONF_ENABLED, &ar->monitor_flags)) {64826380 ret = ath11k_mac_monitor_vdev_create(ar);64836483- if (ret) {63816381+ if (ret)64846382 ath11k_warn(ar->ab, "failed to create monitor vdev during add interface: %d",64856383 ret);64866486- goto err_peer_del;64876487- }64886384 }64896489-64906490- ath11k_debugfs_add_interface(arvif);6491638564926386 mutex_unlock(&ar->conf_mutex);64936387···65026400 }6503640165046402err_vdev_del:65056505- ath11k_wmi_vdev_delete(ar, arvif->vdev_id);65066506- ar->num_created_vdevs--;65076507- ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);65086508- ab->free_vdev_map |= 1LL << arvif->vdev_id;64036403+ ath11k_mac_vdev_delete(ar, arvif);65096404 spin_lock_bh(&ar->data_lock);65106405 list_del(&arvif->list);65116406 spin_unlock_bh(&ar->data_lock);6512640765136408err:65146514- ath11k_debugfs_remove_interface(arvif);65156409 mutex_unlock(&ar->conf_mutex);6516641065176411 return ret;···65306432 struct ath11k *ar = hw->priv;65316433 struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);65326434 struct ath11k_base *ab = ar->ab;65336533- unsigned long time_left;65346435 int ret;65356436 int i;65366437···65506453 arvif->vdev_id, ret);65516454 }6552645565536553- reinit_completion(&ar->vdev_delete_done);65546554-65556555- ret = ath11k_wmi_vdev_delete(ar, arvif->vdev_id);64566456+ ret = ath11k_mac_vdev_delete(ar, arvif);65566457 if (ret) {65576557- ath11k_warn(ab, "failed to delete WMI vdev %d: %d\n",64586458+ ath11k_warn(ab, "failed to delete vdev %d: %d\n",65586459 arvif->vdev_id, ret);65596460 goto err_vdev_del;65606461 }65616561-65626562- time_left = wait_for_completion_timeout(&ar->vdev_delete_done,65636563- ATH11K_VDEV_DELETE_TIMEOUT_HZ);65646564- if (time_left == 0) {65656565- ath11k_warn(ab, "Timeout in receiving vdev delete response\n");65666566- goto err_vdev_del;65676567- }65686568-65696569- ab->free_vdev_map |= 1LL << (arvif->vdev_id);65706570- ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);65716571- ar->num_created_vdevs--;65726572-65736573- ath11k_dbg(ab, ATH11K_DBG_MAC, "vdev %pM deleted, vdev_id %d\n",65746574- vif->addr, arvif->vdev_id);6575646265766463 if (arvif->vdev_type == WMI_VDEV_TYPE_MONITOR) {65776464 clear_bit(ATH11K_FLAG_MONITOR_VDEV_CREATED, &ar->monitor_flags);···90959014 wiphy_ext_feature_set(ar->hw->wiphy,90969015 NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);90979016 }90179017+90189018+ wiphy_ext_feature_set(ar->hw->wiphy,90199019+ NL80211_EXT_FEATURE_SET_SCAN_DWELL);9098902090999021 ath11k_reg_init(ar);91009022
+10-3
drivers/net/wireless/ath/ath11k/pcic.c
···218218 if (wakeup_required && ab->pci.ops->wakeup) {219219 ret = ab->pci.ops->wakeup(ab);220220 if (ret) {221221- ath11k_warn(ab, "failed to wakeup for read from 0x%x: %d\n",222222- start, ret);223223- return ret;221221+ ath11k_warn(ab,222222+ "wakeup failed, data may be invalid: %d",223223+ ret);224224+ /* Even though wakeup() failed, continue processing rather225225+ * than returning because some parts of the data may still226226+ * be valid and useful in some cases, e.g. could give us227227+ * some clues on firmware crash.228228+ * Mislead due to invalid data could be avoided because we229229+ * are aware of the wakeup failure.230230+ */224231 }225232 }226233
+9-3
drivers/net/wireless/ath/ath11k/qmi.c
···1919#define SLEEP_CLOCK_SELECT_INTERNAL_BIT 0x022020#define HOST_CSTATE_BIT 0x042121#define PLATFORM_CAP_PCIE_GLOBAL_RESET 0x082222+#define PLATFORM_CAP_PCIE_PME_D3COLD 0x1022232324#define FW_BUILD_ID_MASK "QC_IMAGE_VERSION_STRING="2425···17531752 if (ab->hw_params.global_reset)17541753 req.nm_modem |= PLATFORM_CAP_PCIE_GLOBAL_RESET;1755175417551755+ req.nm_modem |= PLATFORM_CAP_PCIE_PME_D3COLD;17561756+17561757 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi host cap request\n");1757175817581759 ret = qmi_txn_init(&ab->qmi.handle, &txn,···19641961 continue;1965196219661963 dma_free_coherent(ab->dev,19671967- ab->qmi.target_mem[i].size,19641964+ ab->qmi.target_mem[i].prev_size,19681965 ab->qmi.target_mem[i].vaddr,19691966 ab->qmi.target_mem[i].paddr);19701967 ab->qmi.target_mem[i].vaddr = NULL;···19851982 * in such case, no need to allocate memory for FW again.19861983 */19871984 if (chunk->vaddr) {19881988- if (chunk->prev_type == chunk->type ||19851985+ if (chunk->prev_type == chunk->type &&19891986 chunk->prev_size == chunk->size)19901987 continue;1991198819921989 /* cannot reuse the existing chunk */19931993- dma_free_coherent(ab->dev, chunk->size,19901990+ dma_free_coherent(ab->dev, chunk->prev_size,19941991 chunk->vaddr, chunk->paddr);19951992 chunk->vaddr = NULL;19961993 }···31613158 case ATH11K_QMI_EVENT_SERVER_EXIT:31623159 set_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags);31633160 set_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags);31613161+31623162+ if (!ab->is_reset)31633163+ ath11k_core_pre_reconfigure_recovery(ab);31643164 break;31653165 case ATH11K_QMI_EVENT_REQUEST_MEM:31663166 ret = ath11k_qmi_event_mem_request(qmi);
+1-5
drivers/net/wireless/ath/ath11k/reg.c
···287287 goto err;288288 }289289290290- rtnl_lock();291291- wiphy_lock(ar->hw->wiphy);292292- ret = regulatory_set_wiphy_regd_sync(ar->hw->wiphy, regd_copy);293293- wiphy_unlock(ar->hw->wiphy);294294- rtnl_unlock();290290+ ret = regulatory_set_wiphy_regd(ar->hw->wiphy, regd_copy);295291296292 kfree(regd_copy);297293
+1-1
drivers/net/wireless/ath/ath11k/wmi.c
···68296829 }6830683068316831 ath11k_dbg(ab, ATH11K_DBG_WMI,68326832- "peer sta ps chnange ev addr %pM state %u sup_bitmap %x ps_valid %u ts %u\n",68326832+ "peer sta ps change ev addr %pM state %u sup_bitmap %x ps_valid %u ts %u\n",68336833 ev->peer_macaddr.addr, ev->peer_ps_state,68346834 ev->ps_supported_bitmap, ev->peer_ps_valid,68356835 ev->peer_ps_timestamp);
-5
drivers/net/wireless/ath/ath9k/Makefile
···4545 ar9003_eeprom.o \4646 ar9003_paprd.o47474848-# FIXME: temporarily silence -Warray-bounds on non W=1+ builds4949-ifndef KBUILD_EXTRA_WARN5050-CFLAGS_mac.o += -Wno-array-bounds5151-endif5252-5348ath9k_hw-$(CONFIG_ATH9K_WOW) += ar9003_wow.o54495550ath9k_hw-$(CONFIG_ATH9K_BTCOEX_SUPPORT) += btcoex.o \
+29-17
drivers/net/wireless/ath/ath9k/hif_usb.c
···708708 struct rx_buf *rx_buf = (struct rx_buf *)urb->context;709709 struct hif_device_usb *hif_dev = rx_buf->hif_dev;710710 struct sk_buff *skb = rx_buf->skb;711711- struct sk_buff *nskb;712711 int ret;713712714713 if (!skb)715714 return;716715717716 if (!hif_dev)718718- goto free;717717+ goto free_skb;719718720719 switch (urb->status) {721720 case 0:···723724 case -ECONNRESET:724725 case -ENODEV:725726 case -ESHUTDOWN:726726- goto free;727727+ goto free_skb;727728 default:728729 skb_reset_tail_pointer(skb);729730 skb_trim(skb, 0);···734735 if (likely(urb->actual_length != 0)) {735736 skb_put(skb, urb->actual_length);736737737737- /* Process the command first */738738+ /*739739+ * Process the command first.740740+ * skb is either freed here or passed to be741741+ * managed to another callback function.742742+ */738743 ath9k_htc_rx_msg(hif_dev->htc_handle, skb,739744 skb->len, USB_REG_IN_PIPE);740745741741-742742- nskb = alloc_skb(MAX_REG_IN_BUF_SIZE, GFP_ATOMIC);743743- if (!nskb) {746746+ skb = alloc_skb(MAX_REG_IN_BUF_SIZE, GFP_ATOMIC);747747+ if (!skb) {744748 dev_err(&hif_dev->udev->dev,745749 "ath9k_htc: REG_IN memory allocation failure\n");746746- urb->context = NULL;747747- return;750750+ goto free_rx_buf;748751 }749752750750- rx_buf->skb = nskb;753753+ rx_buf->skb = skb;751754752755 usb_fill_int_urb(urb, hif_dev->udev,753756 usb_rcvintpipe(hif_dev->udev,754757 USB_REG_IN_PIPE),755755- nskb->data, MAX_REG_IN_BUF_SIZE,758758+ skb->data, MAX_REG_IN_BUF_SIZE,756759 ath9k_hif_usb_reg_in_cb, rx_buf, 1);757760 }758761···763762 ret = usb_submit_urb(urb, GFP_ATOMIC);764763 if (ret) {765764 usb_unanchor_urb(urb);766766- goto free;765765+ goto free_skb;767766 }768767769768 return;770770-free:769769+free_skb:771770 kfree_skb(skb);771771+free_rx_buf:772772 kfree(rx_buf);773773 urb->context = NULL;774774}···782780 spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);783781 list_for_each_entry_safe(tx_buf, tx_buf_tmp,784782 &hif_dev->tx.tx_buf, list) {785785- usb_get_urb(tx_buf->urb);786786- spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);787787- usb_kill_urb(tx_buf->urb);788783 list_del(&tx_buf->list);789784 usb_free_urb(tx_buf->urb);790785 kfree(tx_buf->buf);791786 kfree(tx_buf);792792- spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);793787 }794788 spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);795789···13271329static int ath9k_hif_usb_probe(struct usb_interface *interface,13281330 const struct usb_device_id *id)13291331{13321332+ struct usb_endpoint_descriptor *bulk_in, *bulk_out, *int_in, *int_out;13301333 struct usb_device *udev = interface_to_usbdev(interface);13341334+ struct usb_host_interface *alt;13311335 struct hif_device_usb *hif_dev;13321336 int ret = 0;13371337+13381338+ /* Verify the expected endpoints are present */13391339+ alt = interface->cur_altsetting;13401340+ if (usb_find_common_endpoints(alt, &bulk_in, &bulk_out, &int_in, &int_out) < 0 ||13411341+ usb_endpoint_num(bulk_in) != USB_WLAN_RX_PIPE ||13421342+ usb_endpoint_num(bulk_out) != USB_WLAN_TX_PIPE ||13431343+ usb_endpoint_num(int_in) != USB_REG_IN_PIPE ||13441344+ usb_endpoint_num(int_out) != USB_REG_OUT_PIPE) {13451345+ dev_err(&udev->dev,13461346+ "ath9k_htc: Device endpoint numbers are not the expected ones\n");13471347+ return -ENODEV;13481348+ }1333134913341350 if (id->driver_info == STORAGE_DEVICE)13351351 return send_eject_command(interface);