Lines Matching +full:txrx +full:- +full:2

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
9 #include "txrx.h"
18 struct usb_device *udev = rtwusb->udev; in rtw89_usb_vendorreq()
23 if (test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags)) in rtw89_usb_vendorreq()
30 *rtwusb->vendor_req_buf = 0; in rtw89_usb_vendorreq()
37 memcpy(rtwusb->vendor_req_buf, data, len); in rtw89_usb_vendorreq()
41 value, index, rtwusb->vendor_req_buf, in rtw89_usb_vendorreq()
45 atomic_set(&rtwusb->continual_io_error, 0); in rtw89_usb_vendorreq()
48 memcpy(data, rtwusb->vendor_req_buf, len); in rtw89_usb_vendorreq()
53 if (ret == -ESHUTDOWN || ret == -ENODEV) in rtw89_usb_vendorreq()
54 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); in rtw89_usb_vendorreq()
60 le32_to_cpup(rtwusb->vendor_req_buf), in rtw89_usb_vendorreq()
63 memcpy(data, rtwusb->vendor_req_buf, len); in rtw89_usb_vendorreq()
65 if (atomic_inc_return(&rtwusb->continual_io_error) > 4) { in rtw89_usb_vendorreq()
66 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); in rtw89_usb_vendorreq()
121 rtw89_usb_vendorreq(rtwdev, addr, &data, 2, RTW89_USB_VENQT_READ); in rtw89_usb_ops_read16()
150 rtw89_usb_vendorreq(rtwdev, addr, &data, 2, RTW89_USB_VENQT_WRITE); in rtw89_usb_ops_write16()
187 return 2; in rtw89_usb_get_bulkout_id()
193 struct rtw89_usb_tx_ctrl_block *txcb = urb->context; in rtw89_usb_write_port_complete()
194 struct rtw89_dev *rtwdev = txcb->rtwdev; in rtw89_usb_write_port_complete()
201 skb = skb_dequeue(&txcb->tx_ack_queue); in rtw89_usb_write_port_complete()
205 if (txcb->txch == RTW89_TXCH_CH12) { in rtw89_usb_write_port_complete()
210 txdesc = (struct rtw89_txwd_body *)skb->data; in rtw89_usb_write_port_complete()
212 txdesc_size = rtwdev->chip->txwd_body_size; in rtw89_usb_write_port_complete()
213 if (le32_get_bits(txdesc->dword0, RTW89_TXWD_BODY0_WD_INFO_EN)) in rtw89_usb_write_port_complete()
214 txdesc_size += rtwdev->chip->txwd_info_size; in rtw89_usb_write_port_complete()
221 if (urb->status == 0) { in rtw89_usb_write_port_complete()
222 if (info->flags & IEEE80211_TX_CTL_NO_ACK) in rtw89_usb_write_port_complete()
223 info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED; in rtw89_usb_write_port_complete()
225 info->flags |= IEEE80211_TX_STAT_ACK; in rtw89_usb_write_port_complete()
228 ieee80211_tx_status_irqsafe(rtwdev->hw, skb); in rtw89_usb_write_port_complete()
231 switch (urb->status) { in rtw89_usb_write_port_complete()
233 case -EPIPE: in rtw89_usb_write_port_complete()
234 case -EPROTO: in rtw89_usb_write_port_complete()
235 case -EINPROGRESS: in rtw89_usb_write_port_complete()
236 case -ENOENT: in rtw89_usb_write_port_complete()
237 case -ECONNRESET: in rtw89_usb_write_port_complete()
240 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); in rtw89_usb_write_port_complete()
252 struct usb_device *usbd = rtwusb->udev; in rtw89_usb_write_port()
258 if (test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags)) in rtw89_usb_write_port()
263 return -ENOMEM; in rtw89_usb_write_port()
265 pipe = usb_sndbulkpipe(usbd, rtwusb->out_pipe[bulkout_id]); in rtw89_usb_write_port()
269 urb->transfer_flags |= URB_ZERO_PACKET; in rtw89_usb_write_port()
275 if (ret == -ENODEV) in rtw89_usb_write_port()
276 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); in rtw89_usb_write_port()
289 skb = skb_dequeue(&rtwusb->tx_queue[txch]); in rtw89_usb_ops_tx_kick_off()
299 txcb->rtwdev = rtwdev; in rtw89_usb_ops_tx_kick_off()
300 txcb->txch = txch; in rtw89_usb_ops_tx_kick_off()
301 skb_queue_head_init(&txcb->tx_ack_queue); in rtw89_usb_ops_tx_kick_off()
303 skb_queue_tail(&txcb->tx_ack_queue, skb); in rtw89_usb_ops_tx_kick_off()
305 ret = rtw89_usb_write_port(rtwdev, txch, skb->data, skb->len, in rtw89_usb_ops_tx_kick_off()
311 skb_dequeue(&txcb->tx_ack_queue); in rtw89_usb_ops_tx_kick_off()
321 struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info; in rtw89_usb_tx_write_fwcmd()
323 struct sk_buff *skb = tx_req->skb; in rtw89_usb_tx_write_fwcmd()
325 u32 txdesc_size = rtwdev->chip->h2c_desc_size; in rtw89_usb_tx_write_fwcmd()
328 if (((desc_info->pkt_size + txdesc_size) % 512) == 0) { in rtw89_usb_tx_write_fwcmd()
331 skb512 = dev_alloc_skb(txdesc_size + desc_info->pkt_size + in rtw89_usb_tx_write_fwcmd()
337 return -ENOMEM; in rtw89_usb_tx_write_fwcmd()
341 skb_put_data(skb512, skb->data, skb->len); in rtw89_usb_tx_write_fwcmd()
346 tx_req->skb = skb512; in rtw89_usb_tx_write_fwcmd()
348 desc_info->pkt_size += RTW89_USB_MOD512_PADDING; in rtw89_usb_tx_write_fwcmd()
355 skb_queue_tail(&rtwusb->tx_queue[desc_info->ch_dma], skb); in rtw89_usb_tx_write_fwcmd()
363 struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info; in rtw89_usb_ops_tx_write()
365 struct sk_buff *skb = tx_req->skb; in rtw89_usb_ops_tx_write()
369 if ((desc_info->ch_dma == RTW89_TXCH_CH12 || in rtw89_usb_ops_tx_write()
370 tx_req->tx_type == RTW89_CORE_TX_TYPE_FWCMD) && in rtw89_usb_ops_tx_write()
371 (desc_info->ch_dma != RTW89_TXCH_CH12 || in rtw89_usb_ops_tx_write()
372 tx_req->tx_type != RTW89_CORE_TX_TYPE_FWCMD)) { in rtw89_usb_ops_tx_write()
374 desc_info->ch_dma, tx_req->tx_type); in rtw89_usb_ops_tx_write()
375 return -EINVAL; in rtw89_usb_ops_tx_write()
378 if (desc_info->ch_dma == RTW89_TXCH_CH12) in rtw89_usb_ops_tx_write()
381 txdesc_size = rtwdev->chip->txwd_body_size; in rtw89_usb_ops_tx_write()
382 if (desc_info->en_wd_info) in rtw89_usb_ops_tx_write()
383 txdesc_size += rtwdev->chip->txwd_info_size; in rtw89_usb_ops_tx_write()
389 le32p_replace_bits(&txdesc->dword0, 1, RTW89_TXWD_BODY0_STF_MODE); in rtw89_usb_ops_tx_write()
391 skb_queue_tail(&rtwusb->tx_queue[desc_info->ch_dma], skb); in rtw89_usb_ops_tx_write()
399 struct rtw89_dev *rtwdev = rtwusb->rtwdev; in rtw89_usb_rx_handler()
407 rx_skb = skb_dequeue(&rtwusb->rx_queue); in rtw89_usb_rx_handler()
411 if (skb_queue_len(&rtwusb->rx_queue) >= RTW89_USB_MAX_RXQ_LEN) { in rtw89_usb_rx_handler()
418 rtw89_chip_query_rxdesc(rtwdev, &desc_info, rx_skb->data, 0); in rtw89_usb_rx_handler()
430 skb_put_data(skb, rx_skb->data + pkt_offset, in rtw89_usb_rx_handler()
435 if (skb_queue_len(&rtwusb->rx_free_queue) >= RTW89_USB_RX_SKB_NUM) in rtw89_usb_rx_handler()
438 skb_queue_tail(&rtwusb->rx_free_queue, rx_skb); in rtw89_usb_rx_handler()
444 skb_queue_len(&rtwusb->rx_queue)); in rtw89_usb_rx_handler()
445 queue_work(rtwusb->rxwq, &rtwusb->rx_work); in rtw89_usb_rx_handler()
453 struct rtw89_dev *rtwdev = rtwusb->rtwdev; in rtw89_usb_rx_resubmit()
457 rx_skb = skb_dequeue(&rtwusb->rx_free_queue); in rtw89_usb_rx_resubmit()
465 rx_skb->len = 0; in rtw89_usb_rx_resubmit()
467 rxcb->rx_skb = rx_skb; in rtw89_usb_rx_resubmit()
469 usb_fill_bulk_urb(rxcb->rx_urb, rtwusb->udev, in rtw89_usb_rx_resubmit()
470 usb_rcvbulkpipe(rtwusb->udev, rtwusb->in_pipe), in rtw89_usb_rx_resubmit()
471 rxcb->rx_skb->data, RTW89_USB_RECVBUF_SZ, in rtw89_usb_rx_resubmit()
474 ret = usb_submit_urb(rxcb->rx_urb, gfp); in rtw89_usb_rx_resubmit()
476 skb_queue_tail(&rtwusb->rx_free_queue, rxcb->rx_skb); in rtw89_usb_rx_resubmit()
478 if (ret == -ENODEV) in rtw89_usb_rx_resubmit()
479 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); in rtw89_usb_rx_resubmit()
483 if (ret == -ENOMEM) in rtw89_usb_rx_resubmit()
490 rxcb->rx_skb = NULL; in rtw89_usb_rx_resubmit()
491 queue_work(rtwusb->rxwq, &rtwusb->rx_urb_work); in rtw89_usb_rx_resubmit()
501 rxcb = &rtwusb->rx_cb[i]; in rtw89_usb_rx_resubmit_work()
503 if (!rxcb->rx_skb) in rtw89_usb_rx_resubmit_work()
510 struct rtw89_usb_rx_ctrl_block *rxcb = urb->context; in rtw89_usb_read_port_complete()
511 struct rtw89_dev *rtwdev = rxcb->rtwdev; in rtw89_usb_read_port_complete()
513 struct sk_buff *skb = rxcb->rx_skb; in rtw89_usb_read_port_complete()
515 if (urb->status == 0) { in rtw89_usb_read_port_complete()
516 if (urb->actual_length > urb->transfer_buffer_length || in rtw89_usb_read_port_complete()
517 urb->actual_length < sizeof(struct rtw89_rxdesc_short)) { in rtw89_usb_read_port_complete()
519 urb->actual_length); in rtw89_usb_read_port_complete()
520 skb_queue_tail(&rtwusb->rx_free_queue, skb); in rtw89_usb_read_port_complete()
522 skb_put(skb, urb->actual_length); in rtw89_usb_read_port_complete()
523 skb_queue_tail(&rtwusb->rx_queue, skb); in rtw89_usb_read_port_complete()
524 queue_work(rtwusb->rxwq, &rtwusb->rx_work); in rtw89_usb_read_port_complete()
529 skb_queue_tail(&rtwusb->rx_free_queue, skb); in rtw89_usb_read_port_complete()
531 if (atomic_inc_return(&rtwusb->continual_io_error) > 4) in rtw89_usb_read_port_complete()
532 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); in rtw89_usb_read_port_complete()
534 switch (urb->status) { in rtw89_usb_read_port_complete()
535 case -EINVAL: in rtw89_usb_read_port_complete()
536 case -EPIPE: in rtw89_usb_read_port_complete()
537 case -ENODEV: in rtw89_usb_read_port_complete()
538 case -ESHUTDOWN: in rtw89_usb_read_port_complete()
539 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); in rtw89_usb_read_port_complete()
541 case -EPROTO: in rtw89_usb_read_port_complete()
542 case -EILSEQ: in rtw89_usb_read_port_complete()
543 case -ETIME: in rtw89_usb_read_port_complete()
544 case -ECOMM: in rtw89_usb_read_port_complete()
545 case -EOVERFLOW: in rtw89_usb_read_port_complete()
546 case -ENOENT: in rtw89_usb_read_port_complete()
548 case -EINPROGRESS: in rtw89_usb_read_port_complete()
553 __func__, urb->status); in rtw89_usb_read_port_complete()
565 rxcb = &rtwusb->rx_cb[i]; in rtw89_usb_cancel_rx_bufs()
566 usb_kill_urb(rxcb->rx_urb); in rtw89_usb_cancel_rx_bufs()
576 rxcb = &rtwusb->rx_cb[i]; in rtw89_usb_free_rx_bufs()
577 usb_free_urb(rxcb->rx_urb); in rtw89_usb_free_rx_bufs()
587 rxcb = &rtwusb->rx_cb[i]; in rtw89_usb_alloc_rx_bufs()
589 rxcb->rtwdev = rtwusb->rtwdev; in rtw89_usb_alloc_rx_bufs()
590 rxcb->rx_urb = usb_alloc_urb(0, GFP_KERNEL); in rtw89_usb_alloc_rx_bufs()
591 if (!rxcb->rx_urb) { in rtw89_usb_alloc_rx_bufs()
593 return -ENOMEM; in rtw89_usb_alloc_rx_bufs()
606 rtwusb->rxwq = alloc_workqueue("rtw89_usb: rx wq", WQ_BH, 0); in rtw89_usb_init_rx()
607 if (!rtwusb->rxwq) { in rtw89_usb_init_rx()
609 return -ENOMEM; in rtw89_usb_init_rx()
612 skb_queue_head_init(&rtwusb->rx_queue); in rtw89_usb_init_rx()
613 skb_queue_head_init(&rtwusb->rx_free_queue); in rtw89_usb_init_rx()
615 INIT_WORK(&rtwusb->rx_work, rtw89_usb_rx_handler); in rtw89_usb_init_rx()
616 INIT_WORK(&rtwusb->rx_urb_work, rtw89_usb_rx_resubmit_work); in rtw89_usb_init_rx()
621 skb_queue_tail(&rtwusb->rx_free_queue, rx_skb); in rtw89_usb_init_rx()
631 skb_queue_purge(&rtwusb->rx_queue); in rtw89_usb_deinit_rx()
633 destroy_workqueue(rtwusb->rxwq); in rtw89_usb_deinit_rx()
635 skb_queue_purge(&rtwusb->rx_free_queue); in rtw89_usb_deinit_rx()
644 rtw89_usb_rx_resubmit(rtwusb, &rtwusb->rx_cb[i], GFP_KERNEL); in rtw89_usb_start_rx()
652 for (i = 0; i < ARRAY_SIZE(rtwusb->tx_queue); i++) in rtw89_usb_init_tx()
653 skb_queue_head_init(&rtwusb->tx_queue[i]); in rtw89_usb_init_tx()
661 for (i = 0; i < ARRAY_SIZE(rtwusb->tx_queue); i++) { in rtw89_usb_deinit_tx()
663 skb_queue_purge(&rtwusb->tx_queue[i]); in rtw89_usb_deinit_tx()
665 ieee80211_purge_tx_queue(rtwdev->hw, &rtwusb->tx_queue[i]); in rtw89_usb_deinit_tx()
734 speed = rtwusb->udev->speed; in rtw89_usb_ops_mac_post_init()
765 switch (rtwdev->chip->chip_id) { in rtw89_usb_ops_mac_lv1_rcvy()
778 return -EOPNOTSUPP; in rtw89_usb_ops_mac_lv1_rcvy()
791 return -EINVAL; in rtw89_usb_ops_mac_lv1_rcvy()
848 struct usb_host_interface *host_interface = &intf->altsetting[0]; in rtw89_usb_parse()
849 struct usb_interface_descriptor *intf_desc = &host_interface->desc; in rtw89_usb_parse()
856 if (intf_desc->bNumEndpoints > RTW89_MAX_ENDPOINT_NUM) { in rtw89_usb_parse()
858 intf_desc->bNumEndpoints, RTW89_MAX_ENDPOINT_NUM); in rtw89_usb_parse()
859 return -EINVAL; in rtw89_usb_parse()
862 for (i = 0; i < intf_desc->bNumEndpoints; i++) { in rtw89_usb_parse()
863 endpoint = &host_interface->endpoint[i].desc; in rtw89_usb_parse()
868 if (rtwusb->in_pipe) { in rtw89_usb_parse()
871 return -EINVAL; in rtw89_usb_parse()
874 rtwusb->in_pipe = num; in rtw89_usb_parse()
883 return -EINVAL; in rtw89_usb_parse()
886 rtwusb->out_pipe[num_out_pipes++] = num; in rtw89_usb_parse()
892 return -EINVAL; in rtw89_usb_parse()
908 rtwusb->vendor_req_buf = kmalloc(sizeof(*rtwusb->vendor_req_buf), in rtw89_usb_intf_init()
910 if (!rtwusb->vendor_req_buf) in rtw89_usb_intf_init()
911 return -ENOMEM; in rtw89_usb_intf_init()
913 rtwusb->udev = usb_get_dev(interface_to_usbdev(intf)); in rtw89_usb_intf_init()
915 usb_set_intfdata(intf, rtwdev->hw); in rtw89_usb_intf_init()
917 SET_IEEE80211_DEV(rtwdev->hw, &intf->dev); in rtw89_usb_intf_init()
927 usb_put_dev(rtwusb->udev); in rtw89_usb_intf_deinit()
928 kfree(rtwusb->vendor_req_buf); in rtw89_usb_intf_deinit()
940 info = (const struct rtw89_driver_info *)id->driver_info; in rtw89_usb_probe()
942 rtwdev = rtw89_alloc_ieee80211_hw(&intf->dev, in rtw89_usb_probe()
944 info->chip, info->variant); in rtw89_usb_probe()
946 dev_err(&intf->dev, "failed to allocate hw\n"); in rtw89_usb_probe()
947 return -ENOMEM; in rtw89_usb_probe()
951 rtwusb->rtwdev = rtwdev; in rtw89_usb_probe()
953 rtwdev->hci.ops = &rtw89_usb_ops; in rtw89_usb_probe()
954 rtwdev->hci.type = RTW89_HCI_TYPE_USB; in rtw89_usb_probe()
962 if (rtwusb->udev->speed == USB_SPEED_SUPER) in rtw89_usb_probe()
963 rtwdev->hci.dle_type = RTW89_HCI_DLE_TYPE_USB3; in rtw89_usb_probe()
965 rtwdev->hci.dle_type = RTW89_HCI_DLE_TYPE_USB2; in rtw89_usb_probe()
997 set_bit(RTW89_FLAG_PROBE_DONE, rtwdev->flags); in rtw89_usb_probe()
1025 rtwdev = hw->priv; in rtw89_usb_disconnect()