1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2 /* Copyright(c) 2025 Realtek Corporation 3 */ 4 5 #include <linux/usb.h> 6 #include "debug.h" 7 #include "mac.h" 8 #include "reg.h" 9 #include "txrx.h" 10 #include "usb.h" 11 12 static void rtw89_usb_read_port_complete(struct urb *urb); 13 14 static void rtw89_usb_vendorreq(struct rtw89_dev *rtwdev, u32 addr, 15 void *data, u16 len, u8 reqtype) 16 { 17 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 18 struct usb_device *udev = rtwusb->udev; 19 unsigned int pipe; 20 u16 value, index; 21 int attempt, ret; 22 23 if (test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags)) 24 return; 25 26 value = u32_get_bits(addr, GENMASK(15, 0)); 27 index = u32_get_bits(addr, GENMASK(23, 16)); 28 29 for (attempt = 0; attempt < 10; attempt++) { 30 *rtwusb->vendor_req_buf = 0; 31 32 if (reqtype == RTW89_USB_VENQT_READ) { 33 pipe = usb_rcvctrlpipe(udev, 0); 34 } else { /* RTW89_USB_VENQT_WRITE */ 35 pipe = usb_sndctrlpipe(udev, 0); 36 37 memcpy(rtwusb->vendor_req_buf, data, len); 38 } 39 40 ret = usb_control_msg(udev, pipe, RTW89_USB_VENQT, reqtype, 41 value, index, rtwusb->vendor_req_buf, 42 len, 500); 43 44 if (ret == len) { /* Success */ 45 atomic_set(&rtwusb->continual_io_error, 0); 46 47 if (reqtype == RTW89_USB_VENQT_READ) 48 memcpy(data, rtwusb->vendor_req_buf, len); 49 50 break; 51 } 52 53 if (ret == -ESHUTDOWN || ret == -ENODEV) 54 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); 55 else if (ret < 0) 56 rtw89_warn(rtwdev, 57 "usb %s%u 0x%x fail ret=%d value=0x%x attempt=%d\n", 58 reqtype == RTW89_USB_VENQT_READ ? "read" : "write", 59 len * 8, addr, ret, 60 le32_to_cpup(rtwusb->vendor_req_buf), 61 attempt); 62 else if (ret > 0 && reqtype == RTW89_USB_VENQT_READ) 63 memcpy(data, rtwusb->vendor_req_buf, len); 64 65 if (atomic_inc_return(&rtwusb->continual_io_error) > 4) { 66 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); 67 break; 68 } 69 } 70 } 71 72 static u32 rtw89_usb_read_cmac(struct rtw89_dev *rtwdev, u32 addr) 73 { 74 u32 addr32, val32, shift; 75 __le32 data = 0; 76 int count; 77 78 addr32 = addr & ~0x3; 79 shift = (addr & 0x3) * 8; 80 81 for (count = 0; ; count++) { 82 rtw89_usb_vendorreq(rtwdev, addr32, &data, 4, 83 RTW89_USB_VENQT_READ); 84 85 val32 = le32_to_cpu(data); 86 if (val32 != RTW89_R32_DEAD) 87 break; 88 89 if (count >= MAC_REG_POOL_COUNT) { 90 rtw89_warn(rtwdev, "%s: addr %#x = %#x\n", 91 __func__, addr32, val32); 92 val32 = RTW89_R32_DEAD; 93 break; 94 } 95 96 rtw89_write32(rtwdev, R_AX_CK_EN, B_AX_CMAC_ALLCKEN); 97 } 98 99 return val32 >> shift; 100 } 101 102 static u8 rtw89_usb_ops_read8(struct rtw89_dev *rtwdev, u32 addr) 103 { 104 u8 data = 0; 105 106 if (ACCESS_CMAC(addr)) 107 return rtw89_usb_read_cmac(rtwdev, addr); 108 109 rtw89_usb_vendorreq(rtwdev, addr, &data, 1, RTW89_USB_VENQT_READ); 110 111 return data; 112 } 113 114 static u16 rtw89_usb_ops_read16(struct rtw89_dev *rtwdev, u32 addr) 115 { 116 __le16 data = 0; 117 118 if (ACCESS_CMAC(addr)) 119 return rtw89_usb_read_cmac(rtwdev, addr); 120 121 rtw89_usb_vendorreq(rtwdev, addr, &data, 2, RTW89_USB_VENQT_READ); 122 123 return le16_to_cpu(data); 124 } 125 126 static u32 rtw89_usb_ops_read32(struct rtw89_dev *rtwdev, u32 addr) 127 { 128 __le32 data = 0; 129 130 if (ACCESS_CMAC(addr)) 131 return rtw89_usb_read_cmac(rtwdev, addr); 132 133 rtw89_usb_vendorreq(rtwdev, addr, &data, 4, 134 RTW89_USB_VENQT_READ); 135 136 return le32_to_cpu(data); 137 } 138 139 static void rtw89_usb_ops_write8(struct rtw89_dev *rtwdev, u32 addr, u8 val) 140 { 141 u8 data = val; 142 143 rtw89_usb_vendorreq(rtwdev, addr, &data, 1, RTW89_USB_VENQT_WRITE); 144 } 145 146 static void rtw89_usb_ops_write16(struct rtw89_dev *rtwdev, u32 addr, u16 val) 147 { 148 __le16 data = cpu_to_le16(val); 149 150 rtw89_usb_vendorreq(rtwdev, addr, &data, 2, RTW89_USB_VENQT_WRITE); 151 } 152 153 static void rtw89_usb_ops_write32(struct rtw89_dev *rtwdev, u32 addr, u32 val) 154 { 155 __le32 data = cpu_to_le32(val); 156 157 rtw89_usb_vendorreq(rtwdev, addr, &data, 4, RTW89_USB_VENQT_WRITE); 158 } 159 160 static u32 161 rtw89_usb_ops_check_and_reclaim_tx_resource(struct rtw89_dev *rtwdev, 162 u8 txch) 163 { 164 if (txch == RTW89_TXCH_CH12) 165 return 1; 166 167 return 42; /* TODO some kind of calculation? */ 168 } 169 170 static u8 rtw89_usb_get_bulkout_id(u8 ch_dma) 171 { 172 switch (ch_dma) { 173 case RTW89_DMA_ACH0: 174 return 3; 175 case RTW89_DMA_ACH1: 176 return 4; 177 case RTW89_DMA_ACH2: 178 return 5; 179 case RTW89_DMA_ACH3: 180 return 6; 181 default: 182 case RTW89_DMA_B0MG: 183 return 0; 184 case RTW89_DMA_B0HI: 185 return 1; 186 case RTW89_DMA_H2C: 187 return 2; 188 } 189 } 190 191 static void rtw89_usb_write_port_complete(struct urb *urb) 192 { 193 struct rtw89_usb_tx_ctrl_block *txcb = urb->context; 194 struct rtw89_dev *rtwdev = txcb->rtwdev; 195 struct ieee80211_tx_info *info; 196 struct rtw89_txwd_body *txdesc; 197 struct sk_buff *skb; 198 u32 txdesc_size; 199 200 while (true) { 201 skb = skb_dequeue(&txcb->tx_ack_queue); 202 if (!skb) 203 break; 204 205 if (txcb->txch == RTW89_TXCH_CH12) { 206 dev_kfree_skb_any(skb); 207 continue; 208 } 209 210 txdesc = (struct rtw89_txwd_body *)skb->data; 211 212 txdesc_size = rtwdev->chip->txwd_body_size; 213 if (le32_get_bits(txdesc->dword0, RTW89_TXWD_BODY0_WD_INFO_EN)) 214 txdesc_size += rtwdev->chip->txwd_info_size; 215 216 skb_pull(skb, txdesc_size); 217 218 info = IEEE80211_SKB_CB(skb); 219 ieee80211_tx_info_clear_status(info); 220 221 if (urb->status == 0) { 222 if (info->flags & IEEE80211_TX_CTL_NO_ACK) 223 info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED; 224 else 225 info->flags |= IEEE80211_TX_STAT_ACK; 226 } 227 228 ieee80211_tx_status_irqsafe(rtwdev->hw, skb); 229 } 230 231 switch (urb->status) { 232 case 0: 233 case -EPIPE: 234 case -EPROTO: 235 case -EINPROGRESS: 236 case -ENOENT: 237 case -ECONNRESET: 238 break; 239 default: 240 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); 241 break; 242 } 243 244 kfree(txcb); 245 usb_free_urb(urb); 246 } 247 248 static int rtw89_usb_write_port(struct rtw89_dev *rtwdev, u8 ch_dma, 249 void *data, int len, void *context) 250 { 251 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 252 struct usb_device *usbd = rtwusb->udev; 253 struct urb *urb; 254 u8 bulkout_id = rtw89_usb_get_bulkout_id(ch_dma); 255 unsigned int pipe; 256 int ret; 257 258 if (test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags)) 259 return 0; 260 261 urb = usb_alloc_urb(0, GFP_ATOMIC); 262 if (!urb) 263 return -ENOMEM; 264 265 pipe = usb_sndbulkpipe(usbd, rtwusb->out_pipe[bulkout_id]); 266 267 usb_fill_bulk_urb(urb, usbd, pipe, data, len, 268 rtw89_usb_write_port_complete, context); 269 urb->transfer_flags |= URB_ZERO_PACKET; 270 ret = usb_submit_urb(urb, GFP_ATOMIC); 271 272 if (ret) 273 usb_free_urb(urb); 274 275 if (ret == -ENODEV) 276 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); 277 278 return ret; 279 } 280 281 static void rtw89_usb_ops_tx_kick_off(struct rtw89_dev *rtwdev, u8 txch) 282 { 283 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 284 struct rtw89_usb_tx_ctrl_block *txcb; 285 struct sk_buff *skb; 286 int ret; 287 288 while (true) { 289 skb = skb_dequeue(&rtwusb->tx_queue[txch]); 290 if (!skb) 291 break; 292 293 txcb = kmalloc(sizeof(*txcb), GFP_ATOMIC); 294 if (!txcb) { 295 dev_kfree_skb_any(skb); 296 continue; 297 } 298 299 txcb->rtwdev = rtwdev; 300 txcb->txch = txch; 301 skb_queue_head_init(&txcb->tx_ack_queue); 302 303 skb_queue_tail(&txcb->tx_ack_queue, skb); 304 305 ret = rtw89_usb_write_port(rtwdev, txch, skb->data, skb->len, 306 txcb); 307 if (ret) { 308 rtw89_err(rtwdev, "write port txch %d failed: %d\n", 309 txch, ret); 310 311 skb_dequeue(&txcb->tx_ack_queue); 312 kfree(txcb); 313 dev_kfree_skb_any(skb); 314 } 315 } 316 } 317 318 static int rtw89_usb_tx_write_fwcmd(struct rtw89_dev *rtwdev, 319 struct rtw89_core_tx_request *tx_req) 320 { 321 struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info; 322 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 323 struct sk_buff *skb = tx_req->skb; 324 struct sk_buff *skb512; 325 u32 txdesc_size = rtwdev->chip->h2c_desc_size; 326 void *txdesc; 327 328 if (((desc_info->pkt_size + txdesc_size) % 512) == 0) { 329 rtw89_debug(rtwdev, RTW89_DBG_HCI, "avoiding multiple of 512\n"); 330 331 skb512 = dev_alloc_skb(txdesc_size + desc_info->pkt_size + 332 RTW89_USB_MOD512_PADDING); 333 if (!skb512) { 334 rtw89_err(rtwdev, "%s: failed to allocate skb\n", 335 __func__); 336 337 return -ENOMEM; 338 } 339 340 skb_pull(skb512, txdesc_size); 341 skb_put_data(skb512, skb->data, skb->len); 342 skb_put_zero(skb512, RTW89_USB_MOD512_PADDING); 343 344 dev_kfree_skb_any(skb); 345 skb = skb512; 346 tx_req->skb = skb512; 347 348 desc_info->pkt_size += RTW89_USB_MOD512_PADDING; 349 } 350 351 txdesc = skb_push(skb, txdesc_size); 352 memset(txdesc, 0, txdesc_size); 353 rtw89_chip_fill_txdesc_fwcmd(rtwdev, desc_info, txdesc); 354 355 skb_queue_tail(&rtwusb->tx_queue[desc_info->ch_dma], skb); 356 357 return 0; 358 } 359 360 static int rtw89_usb_ops_tx_write(struct rtw89_dev *rtwdev, 361 struct rtw89_core_tx_request *tx_req) 362 { 363 struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info; 364 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 365 struct sk_buff *skb = tx_req->skb; 366 struct rtw89_txwd_body *txdesc; 367 u32 txdesc_size; 368 369 if ((desc_info->ch_dma == RTW89_TXCH_CH12 || 370 tx_req->tx_type == RTW89_CORE_TX_TYPE_FWCMD) && 371 (desc_info->ch_dma != RTW89_TXCH_CH12 || 372 tx_req->tx_type != RTW89_CORE_TX_TYPE_FWCMD)) { 373 rtw89_err(rtwdev, "dma channel %d/TX type %d mismatch\n", 374 desc_info->ch_dma, tx_req->tx_type); 375 return -EINVAL; 376 } 377 378 if (desc_info->ch_dma == RTW89_TXCH_CH12) 379 return rtw89_usb_tx_write_fwcmd(rtwdev, tx_req); 380 381 txdesc_size = rtwdev->chip->txwd_body_size; 382 if (desc_info->en_wd_info) 383 txdesc_size += rtwdev->chip->txwd_info_size; 384 385 txdesc = skb_push(skb, txdesc_size); 386 memset(txdesc, 0, txdesc_size); 387 rtw89_chip_fill_txdesc(rtwdev, desc_info, txdesc); 388 389 le32p_replace_bits(&txdesc->dword0, 1, RTW89_TXWD_BODY0_STF_MODE); 390 391 skb_queue_tail(&rtwusb->tx_queue[desc_info->ch_dma], skb); 392 393 return 0; 394 } 395 396 static void rtw89_usb_rx_handler(struct work_struct *work) 397 { 398 struct rtw89_usb *rtwusb = container_of(work, struct rtw89_usb, rx_work); 399 struct rtw89_dev *rtwdev = rtwusb->rtwdev; 400 struct rtw89_rx_desc_info desc_info; 401 struct sk_buff *rx_skb; 402 struct sk_buff *skb; 403 u32 pkt_offset; 404 int limit; 405 406 for (limit = 0; limit < 200; limit++) { 407 rx_skb = skb_dequeue(&rtwusb->rx_queue); 408 if (!rx_skb) 409 break; 410 411 if (skb_queue_len(&rtwusb->rx_queue) >= RTW89_USB_MAX_RXQ_LEN) { 412 rtw89_warn(rtwdev, "rx_queue overflow\n"); 413 dev_kfree_skb_any(rx_skb); 414 continue; 415 } 416 417 memset(&desc_info, 0, sizeof(desc_info)); 418 rtw89_chip_query_rxdesc(rtwdev, &desc_info, rx_skb->data, 0); 419 420 skb = rtw89_alloc_skb_for_rx(rtwdev, desc_info.pkt_size); 421 if (!skb) { 422 rtw89_debug(rtwdev, RTW89_DBG_HCI, 423 "failed to allocate RX skb of size %u\n", 424 desc_info.pkt_size); 425 continue; 426 } 427 428 pkt_offset = desc_info.offset + desc_info.rxd_len; 429 430 skb_put_data(skb, rx_skb->data + pkt_offset, 431 desc_info.pkt_size); 432 433 rtw89_core_rx(rtwdev, &desc_info, skb); 434 435 if (skb_queue_len(&rtwusb->rx_free_queue) >= RTW89_USB_RX_SKB_NUM) 436 dev_kfree_skb_any(rx_skb); 437 else 438 skb_queue_tail(&rtwusb->rx_free_queue, rx_skb); 439 } 440 441 if (limit == 200) { 442 rtw89_debug(rtwdev, RTW89_DBG_HCI, 443 "left %d rx skbs in the queue for later\n", 444 skb_queue_len(&rtwusb->rx_queue)); 445 queue_work(rtwusb->rxwq, &rtwusb->rx_work); 446 } 447 } 448 449 static void rtw89_usb_rx_resubmit(struct rtw89_usb *rtwusb, 450 struct rtw89_usb_rx_ctrl_block *rxcb, 451 gfp_t gfp) 452 { 453 struct rtw89_dev *rtwdev = rtwusb->rtwdev; 454 struct sk_buff *rx_skb; 455 int ret; 456 457 rx_skb = skb_dequeue(&rtwusb->rx_free_queue); 458 if (!rx_skb) 459 rx_skb = alloc_skb(RTW89_USB_RECVBUF_SZ, gfp); 460 461 if (!rx_skb) 462 goto try_later; 463 464 skb_reset_tail_pointer(rx_skb); 465 rx_skb->len = 0; 466 467 rxcb->rx_skb = rx_skb; 468 469 usb_fill_bulk_urb(rxcb->rx_urb, rtwusb->udev, 470 usb_rcvbulkpipe(rtwusb->udev, rtwusb->in_pipe), 471 rxcb->rx_skb->data, RTW89_USB_RECVBUF_SZ, 472 rtw89_usb_read_port_complete, rxcb); 473 474 ret = usb_submit_urb(rxcb->rx_urb, gfp); 475 if (ret) { 476 skb_queue_tail(&rtwusb->rx_free_queue, rxcb->rx_skb); 477 478 if (ret == -ENODEV) 479 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); 480 else 481 rtw89_err(rtwdev, "Err sending rx data urb %d\n", ret); 482 483 if (ret == -ENOMEM) 484 goto try_later; 485 } 486 487 return; 488 489 try_later: 490 rxcb->rx_skb = NULL; 491 queue_work(rtwusb->rxwq, &rtwusb->rx_urb_work); 492 } 493 494 static void rtw89_usb_rx_resubmit_work(struct work_struct *work) 495 { 496 struct rtw89_usb *rtwusb = container_of(work, struct rtw89_usb, rx_urb_work); 497 struct rtw89_usb_rx_ctrl_block *rxcb; 498 int i; 499 500 for (i = 0; i < RTW89_USB_RXCB_NUM; i++) { 501 rxcb = &rtwusb->rx_cb[i]; 502 503 if (!rxcb->rx_skb) 504 rtw89_usb_rx_resubmit(rtwusb, rxcb, GFP_ATOMIC); 505 } 506 } 507 508 static void rtw89_usb_read_port_complete(struct urb *urb) 509 { 510 struct rtw89_usb_rx_ctrl_block *rxcb = urb->context; 511 struct rtw89_dev *rtwdev = rxcb->rtwdev; 512 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 513 struct sk_buff *skb = rxcb->rx_skb; 514 515 if (urb->status == 0) { 516 if (urb->actual_length > urb->transfer_buffer_length || 517 urb->actual_length < sizeof(struct rtw89_rxdesc_short)) { 518 rtw89_err(rtwdev, "failed to get urb length: %d\n", 519 urb->actual_length); 520 skb_queue_tail(&rtwusb->rx_free_queue, skb); 521 } else { 522 skb_put(skb, urb->actual_length); 523 skb_queue_tail(&rtwusb->rx_queue, skb); 524 queue_work(rtwusb->rxwq, &rtwusb->rx_work); 525 } 526 527 rtw89_usb_rx_resubmit(rtwusb, rxcb, GFP_ATOMIC); 528 } else { 529 skb_queue_tail(&rtwusb->rx_free_queue, skb); 530 531 if (atomic_inc_return(&rtwusb->continual_io_error) > 4) 532 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); 533 534 switch (urb->status) { 535 case -EINVAL: 536 case -EPIPE: 537 case -ENODEV: 538 case -ESHUTDOWN: 539 set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags); 540 break; 541 case -EPROTO: 542 case -EILSEQ: 543 case -ETIME: 544 case -ECOMM: 545 case -EOVERFLOW: 546 case -ENOENT: 547 break; 548 case -EINPROGRESS: 549 rtw89_info(rtwdev, "URB is in progress\n"); 550 break; 551 default: 552 rtw89_err(rtwdev, "%s status %d\n", 553 __func__, urb->status); 554 break; 555 } 556 } 557 } 558 559 static void rtw89_usb_cancel_rx_bufs(struct rtw89_usb *rtwusb) 560 { 561 struct rtw89_usb_rx_ctrl_block *rxcb; 562 int i; 563 564 for (i = 0; i < RTW89_USB_RXCB_NUM; i++) { 565 rxcb = &rtwusb->rx_cb[i]; 566 usb_kill_urb(rxcb->rx_urb); 567 } 568 } 569 570 static void rtw89_usb_free_rx_bufs(struct rtw89_usb *rtwusb) 571 { 572 struct rtw89_usb_rx_ctrl_block *rxcb; 573 int i; 574 575 for (i = 0; i < RTW89_USB_RXCB_NUM; i++) { 576 rxcb = &rtwusb->rx_cb[i]; 577 usb_free_urb(rxcb->rx_urb); 578 } 579 } 580 581 static int rtw89_usb_alloc_rx_bufs(struct rtw89_usb *rtwusb) 582 { 583 struct rtw89_usb_rx_ctrl_block *rxcb; 584 int i; 585 586 for (i = 0; i < RTW89_USB_RXCB_NUM; i++) { 587 rxcb = &rtwusb->rx_cb[i]; 588 589 rxcb->rtwdev = rtwusb->rtwdev; 590 rxcb->rx_urb = usb_alloc_urb(0, GFP_KERNEL); 591 if (!rxcb->rx_urb) { 592 rtw89_usb_free_rx_bufs(rtwusb); 593 return -ENOMEM; 594 } 595 } 596 597 return 0; 598 } 599 600 static int rtw89_usb_init_rx(struct rtw89_dev *rtwdev) 601 { 602 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 603 struct sk_buff *rx_skb; 604 int i; 605 606 rtwusb->rxwq = alloc_workqueue("rtw89_usb: rx wq", WQ_BH, 0); 607 if (!rtwusb->rxwq) { 608 rtw89_err(rtwdev, "failed to create RX work queue\n"); 609 return -ENOMEM; 610 } 611 612 skb_queue_head_init(&rtwusb->rx_queue); 613 skb_queue_head_init(&rtwusb->rx_free_queue); 614 615 INIT_WORK(&rtwusb->rx_work, rtw89_usb_rx_handler); 616 INIT_WORK(&rtwusb->rx_urb_work, rtw89_usb_rx_resubmit_work); 617 618 for (i = 0; i < RTW89_USB_RX_SKB_NUM; i++) { 619 rx_skb = alloc_skb(RTW89_USB_RECVBUF_SZ, GFP_KERNEL); 620 if (rx_skb) 621 skb_queue_tail(&rtwusb->rx_free_queue, rx_skb); 622 } 623 624 return 0; 625 } 626 627 static void rtw89_usb_deinit_rx(struct rtw89_dev *rtwdev) 628 { 629 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 630 631 skb_queue_purge(&rtwusb->rx_queue); 632 633 destroy_workqueue(rtwusb->rxwq); 634 635 skb_queue_purge(&rtwusb->rx_free_queue); 636 } 637 638 static void rtw89_usb_start_rx(struct rtw89_dev *rtwdev) 639 { 640 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 641 int i; 642 643 for (i = 0; i < RTW89_USB_RXCB_NUM; i++) 644 rtw89_usb_rx_resubmit(rtwusb, &rtwusb->rx_cb[i], GFP_KERNEL); 645 } 646 647 static void rtw89_usb_init_tx(struct rtw89_dev *rtwdev) 648 { 649 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 650 int i; 651 652 for (i = 0; i < ARRAY_SIZE(rtwusb->tx_queue); i++) 653 skb_queue_head_init(&rtwusb->tx_queue[i]); 654 } 655 656 static void rtw89_usb_deinit_tx(struct rtw89_dev *rtwdev) 657 { 658 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 659 int i; 660 661 for (i = 0; i < ARRAY_SIZE(rtwusb->tx_queue); i++) { 662 if (i == RTW89_TXCH_CH12) 663 skb_queue_purge(&rtwusb->tx_queue[i]); 664 else 665 ieee80211_purge_tx_queue(rtwdev->hw, &rtwusb->tx_queue[i]); 666 } 667 } 668 669 static void rtw89_usb_ops_reset(struct rtw89_dev *rtwdev) 670 { 671 /* TODO: anything to do here? */ 672 } 673 674 static int rtw89_usb_ops_start(struct rtw89_dev *rtwdev) 675 { 676 return 0; /* Nothing to do. */ 677 } 678 679 static void rtw89_usb_ops_stop(struct rtw89_dev *rtwdev) 680 { 681 /* Nothing to do. */ 682 } 683 684 static void rtw89_usb_ops_pause(struct rtw89_dev *rtwdev, bool pause) 685 { 686 /* Nothing to do? */ 687 } 688 689 static void rtw89_usb_ops_switch_mode(struct rtw89_dev *rtwdev, bool low_power) 690 { 691 /* Nothing to do. */ 692 } 693 694 static int rtw89_usb_ops_deinit(struct rtw89_dev *rtwdev) 695 { 696 return 0; /* Nothing to do. */ 697 } 698 699 static int rtw89_usb_ops_mac_pre_init(struct rtw89_dev *rtwdev) 700 { 701 u32 val32; 702 703 rtw89_write32_set(rtwdev, R_AX_USB_HOST_REQUEST_2, B_AX_R_USBIO_MODE); 704 705 /* fix USB IO hang suggest by chihhanli@realtek.com */ 706 rtw89_write32_clr(rtwdev, R_AX_USB_WLAN0_1, 707 B_AX_USBRX_RST | B_AX_USBTX_RST); 708 709 val32 = rtw89_read32(rtwdev, R_AX_HCI_FUNC_EN); 710 val32 &= ~(B_AX_HCI_RXDMA_EN | B_AX_HCI_TXDMA_EN); 711 rtw89_write32(rtwdev, R_AX_HCI_FUNC_EN, val32); 712 713 val32 |= B_AX_HCI_RXDMA_EN | B_AX_HCI_TXDMA_EN; 714 rtw89_write32(rtwdev, R_AX_HCI_FUNC_EN, val32); 715 /* fix USB TRX hang suggest by chihhanli@realtek.com */ 716 717 return 0; 718 } 719 720 static int rtw89_usb_ops_mac_pre_deinit(struct rtw89_dev *rtwdev) 721 { 722 return 0; /* Nothing to do. */ 723 } 724 725 static int rtw89_usb_ops_mac_post_init(struct rtw89_dev *rtwdev) 726 { 727 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 728 enum usb_device_speed speed; 729 u32 ep; 730 731 rtw89_write32_clr(rtwdev, R_AX_USB3_MAC_NPI_CONFIG_INTF_0, 732 B_AX_SSPHY_LFPS_FILTER); 733 734 speed = rtwusb->udev->speed; 735 736 if (speed == USB_SPEED_SUPER) 737 rtw89_write8(rtwdev, R_AX_RXDMA_SETTING, USB3_BULKSIZE); 738 else if (speed == USB_SPEED_HIGH) 739 rtw89_write8(rtwdev, R_AX_RXDMA_SETTING, USB2_BULKSIZE); 740 else 741 rtw89_write8(rtwdev, R_AX_RXDMA_SETTING, USB11_BULKSIZE); 742 743 for (ep = 5; ep <= 12; ep++) { 744 if (ep == 8) 745 continue; 746 747 rtw89_write8_mask(rtwdev, R_AX_USB_ENDPOINT_0, 748 B_AX_EP_IDX, ep); 749 rtw89_write8(rtwdev, R_AX_USB_ENDPOINT_2 + 1, NUMP); 750 } 751 752 return 0; 753 } 754 755 static void rtw89_usb_ops_recalc_int_mit(struct rtw89_dev *rtwdev) 756 { 757 /* Nothing to do. */ 758 } 759 760 static int rtw89_usb_ops_mac_lv1_rcvy(struct rtw89_dev *rtwdev, 761 enum rtw89_lv1_rcvy_step step) 762 { 763 u32 reg, mask; 764 765 switch (rtwdev->chip->chip_id) { 766 case RTL8851B: 767 case RTL8852A: 768 case RTL8852B: 769 reg = R_AX_USB_WLAN0_1; 770 mask = B_AX_USBRX_RST | B_AX_USBTX_RST; 771 break; 772 case RTL8852C: 773 reg = R_AX_USB_WLAN0_1_V1; 774 mask = B_AX_USBRX_RST_V1 | B_AX_USBTX_RST_V1; 775 break; 776 default: 777 rtw89_err(rtwdev, "%s: fix me\n", __func__); 778 return -EOPNOTSUPP; 779 } 780 781 switch (step) { 782 case RTW89_LV1_RCVY_STEP_1: 783 rtw89_write32_set(rtwdev, reg, mask); 784 785 msleep(30); 786 break; 787 case RTW89_LV1_RCVY_STEP_2: 788 rtw89_write32_clr(rtwdev, reg, mask); 789 break; 790 default: 791 return -EINVAL; 792 } 793 794 return 0; 795 } 796 797 static void rtw89_usb_ops_dump_err_status(struct rtw89_dev *rtwdev) 798 { 799 rtw89_warn(rtwdev, "%s TODO\n", __func__); 800 } 801 802 static const struct rtw89_hci_ops rtw89_usb_ops = { 803 .tx_write = rtw89_usb_ops_tx_write, 804 .tx_kick_off = rtw89_usb_ops_tx_kick_off, 805 .flush_queues = NULL, /* Not needed? */ 806 .reset = rtw89_usb_ops_reset, 807 .start = rtw89_usb_ops_start, 808 .stop = rtw89_usb_ops_stop, 809 .pause = rtw89_usb_ops_pause, 810 .switch_mode = rtw89_usb_ops_switch_mode, 811 .recalc_int_mit = rtw89_usb_ops_recalc_int_mit, 812 813 .read8 = rtw89_usb_ops_read8, 814 .read16 = rtw89_usb_ops_read16, 815 .read32 = rtw89_usb_ops_read32, 816 .write8 = rtw89_usb_ops_write8, 817 .write16 = rtw89_usb_ops_write16, 818 .write32 = rtw89_usb_ops_write32, 819 820 .mac_pre_init = rtw89_usb_ops_mac_pre_init, 821 .mac_pre_deinit = rtw89_usb_ops_mac_pre_deinit, 822 .mac_post_init = rtw89_usb_ops_mac_post_init, 823 .deinit = rtw89_usb_ops_deinit, 824 825 .check_and_reclaim_tx_resource = rtw89_usb_ops_check_and_reclaim_tx_resource, 826 .mac_lv1_rcvy = rtw89_usb_ops_mac_lv1_rcvy, 827 .dump_err_status = rtw89_usb_ops_dump_err_status, 828 .napi_poll = NULL, 829 830 .recovery_start = NULL, 831 .recovery_complete = NULL, 832 833 .ctrl_txdma_ch = NULL, 834 .ctrl_txdma_fw_ch = NULL, 835 .ctrl_trxhci = NULL, 836 .poll_txdma_ch_idle = NULL, 837 838 .clr_idx_all = NULL, 839 .clear = NULL, 840 .disable_intr = NULL, 841 .enable_intr = NULL, 842 .rst_bdram = NULL, 843 }; 844 845 static int rtw89_usb_parse(struct rtw89_dev *rtwdev, 846 struct usb_interface *intf) 847 { 848 struct usb_host_interface *host_interface = &intf->altsetting[0]; 849 struct usb_interface_descriptor *intf_desc = &host_interface->desc; 850 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 851 struct usb_endpoint_descriptor *endpoint; 852 int num_out_pipes = 0; 853 u8 num; 854 int i; 855 856 if (intf_desc->bNumEndpoints > RTW89_MAX_ENDPOINT_NUM) { 857 rtw89_err(rtwdev, "found %d endpoints, expected %d max\n", 858 intf_desc->bNumEndpoints, RTW89_MAX_ENDPOINT_NUM); 859 return -EINVAL; 860 } 861 862 for (i = 0; i < intf_desc->bNumEndpoints; i++) { 863 endpoint = &host_interface->endpoint[i].desc; 864 num = usb_endpoint_num(endpoint); 865 866 if (usb_endpoint_dir_in(endpoint) && 867 usb_endpoint_xfer_bulk(endpoint)) { 868 if (rtwusb->in_pipe) { 869 rtw89_err(rtwdev, 870 "found more than 1 bulk in endpoint\n"); 871 return -EINVAL; 872 } 873 874 rtwusb->in_pipe = num; 875 } 876 877 if (usb_endpoint_dir_out(endpoint) && 878 usb_endpoint_xfer_bulk(endpoint)) { 879 if (num_out_pipes >= RTW89_MAX_BULKOUT_NUM) { 880 rtw89_err(rtwdev, 881 "found more than %d bulk out endpoints\n", 882 RTW89_MAX_BULKOUT_NUM); 883 return -EINVAL; 884 } 885 886 rtwusb->out_pipe[num_out_pipes++] = num; 887 } 888 } 889 890 if (num_out_pipes < 1) { 891 rtw89_err(rtwdev, "no bulk out endpoints found\n"); 892 return -EINVAL; 893 } 894 895 return 0; 896 } 897 898 static int rtw89_usb_intf_init(struct rtw89_dev *rtwdev, 899 struct usb_interface *intf) 900 { 901 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 902 int ret; 903 904 ret = rtw89_usb_parse(rtwdev, intf); 905 if (ret) 906 return ret; 907 908 rtwusb->vendor_req_buf = kmalloc(sizeof(*rtwusb->vendor_req_buf), 909 GFP_KERNEL); 910 if (!rtwusb->vendor_req_buf) 911 return -ENOMEM; 912 913 rtwusb->udev = usb_get_dev(interface_to_usbdev(intf)); 914 915 usb_set_intfdata(intf, rtwdev->hw); 916 917 SET_IEEE80211_DEV(rtwdev->hw, &intf->dev); 918 919 return 0; 920 } 921 922 static void rtw89_usb_intf_deinit(struct rtw89_dev *rtwdev, 923 struct usb_interface *intf) 924 { 925 struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev); 926 927 usb_put_dev(rtwusb->udev); 928 kfree(rtwusb->vendor_req_buf); 929 usb_set_intfdata(intf, NULL); 930 } 931 932 int rtw89_usb_probe(struct usb_interface *intf, 933 const struct usb_device_id *id) 934 { 935 const struct rtw89_driver_info *info; 936 struct rtw89_dev *rtwdev; 937 struct rtw89_usb *rtwusb; 938 int ret; 939 940 info = (const struct rtw89_driver_info *)id->driver_info; 941 942 rtwdev = rtw89_alloc_ieee80211_hw(&intf->dev, 943 sizeof(struct rtw89_usb), 944 info->chip, info->variant); 945 if (!rtwdev) { 946 dev_err(&intf->dev, "failed to allocate hw\n"); 947 return -ENOMEM; 948 } 949 950 rtwusb = rtw89_usb_priv(rtwdev); 951 rtwusb->rtwdev = rtwdev; 952 953 rtwdev->hci.ops = &rtw89_usb_ops; 954 rtwdev->hci.type = RTW89_HCI_TYPE_USB; 955 956 ret = rtw89_usb_intf_init(rtwdev, intf); 957 if (ret) { 958 rtw89_err(rtwdev, "failed to initialise intf: %d\n", ret); 959 goto err_free_hw; 960 } 961 962 if (rtwusb->udev->speed == USB_SPEED_SUPER) 963 rtwdev->hci.dle_type = RTW89_HCI_DLE_TYPE_USB3; 964 else 965 rtwdev->hci.dle_type = RTW89_HCI_DLE_TYPE_USB2; 966 967 rtw89_usb_init_tx(rtwdev); 968 969 ret = rtw89_usb_alloc_rx_bufs(rtwusb); 970 if (ret) 971 goto err_intf_deinit; 972 973 ret = rtw89_usb_init_rx(rtwdev); 974 if (ret) 975 goto err_free_rx_bufs; 976 977 ret = rtw89_core_init(rtwdev); 978 if (ret) { 979 rtw89_err(rtwdev, "failed to initialise core: %d\n", ret); 980 goto err_deinit_rx; 981 } 982 983 ret = rtw89_chip_info_setup(rtwdev); 984 if (ret) { 985 rtw89_err(rtwdev, "failed to setup chip information\n"); 986 goto err_core_deinit; 987 } 988 989 ret = rtw89_core_register(rtwdev); 990 if (ret) { 991 rtw89_err(rtwdev, "failed to register core\n"); 992 goto err_core_deinit; 993 } 994 995 rtw89_usb_start_rx(rtwdev); 996 997 set_bit(RTW89_FLAG_PROBE_DONE, rtwdev->flags); 998 999 return 0; 1000 1001 err_core_deinit: 1002 rtw89_core_deinit(rtwdev); 1003 err_deinit_rx: 1004 rtw89_usb_deinit_rx(rtwdev); 1005 err_free_rx_bufs: 1006 rtw89_usb_free_rx_bufs(rtwusb); 1007 err_intf_deinit: 1008 rtw89_usb_intf_deinit(rtwdev, intf); 1009 err_free_hw: 1010 rtw89_free_ieee80211_hw(rtwdev); 1011 1012 return ret; 1013 } 1014 EXPORT_SYMBOL(rtw89_usb_probe); 1015 1016 void rtw89_usb_disconnect(struct usb_interface *intf) 1017 { 1018 struct ieee80211_hw *hw = usb_get_intfdata(intf); 1019 struct rtw89_dev *rtwdev; 1020 struct rtw89_usb *rtwusb; 1021 1022 if (!hw) 1023 return; 1024 1025 rtwdev = hw->priv; 1026 rtwusb = rtw89_usb_priv(rtwdev); 1027 1028 rtw89_usb_cancel_rx_bufs(rtwusb); 1029 1030 rtw89_core_unregister(rtwdev); 1031 rtw89_core_deinit(rtwdev); 1032 rtw89_usb_deinit_rx(rtwdev); 1033 rtw89_usb_free_rx_bufs(rtwusb); 1034 rtw89_usb_deinit_tx(rtwdev); 1035 rtw89_usb_intf_deinit(rtwdev, intf); 1036 rtw89_free_ieee80211_hw(rtwdev); 1037 } 1038 EXPORT_SYMBOL(rtw89_usb_disconnect); 1039 1040 MODULE_AUTHOR("Bitterblue Smith <rtl8821cerfe2@gmail.com>"); 1041 MODULE_DESCRIPTION("Realtek USB 802.11ax wireless driver"); 1042 MODULE_LICENSE("Dual BSD/GPL"); 1043