qcom_bam_dmux.c (21732B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Qualcomm BAM-DMUX WWAN network driver 4 * Copyright (c) 2020, Stephan Gerhold <stephan@gerhold.net> 5 */ 6 7#include <linux/atomic.h> 8#include <linux/bitops.h> 9#include <linux/completion.h> 10#include <linux/dma-mapping.h> 11#include <linux/dmaengine.h> 12#include <linux/if_arp.h> 13#include <linux/interrupt.h> 14#include <linux/mod_devicetable.h> 15#include <linux/module.h> 16#include <linux/netdevice.h> 17#include <linux/platform_device.h> 18#include <linux/pm_runtime.h> 19#include <linux/soc/qcom/smem_state.h> 20#include <linux/spinlock.h> 21#include <linux/wait.h> 22#include <linux/workqueue.h> 23#include <net/pkt_sched.h> 24 25#define BAM_DMUX_BUFFER_SIZE SZ_2K 26#define BAM_DMUX_HDR_SIZE sizeof(struct bam_dmux_hdr) 27#define BAM_DMUX_MAX_DATA_SIZE (BAM_DMUX_BUFFER_SIZE - BAM_DMUX_HDR_SIZE) 28#define BAM_DMUX_NUM_SKB 32 29 30#define BAM_DMUX_HDR_MAGIC 0x33fc 31 32#define BAM_DMUX_AUTOSUSPEND_DELAY 1000 33#define BAM_DMUX_REMOTE_TIMEOUT msecs_to_jiffies(2000) 34 35enum { 36 BAM_DMUX_CMD_DATA, 37 BAM_DMUX_CMD_OPEN, 38 BAM_DMUX_CMD_CLOSE, 39}; 40 41enum { 42 BAM_DMUX_CH_DATA_0, 43 BAM_DMUX_CH_DATA_1, 44 BAM_DMUX_CH_DATA_2, 45 BAM_DMUX_CH_DATA_3, 46 BAM_DMUX_CH_DATA_4, 47 BAM_DMUX_CH_DATA_5, 48 BAM_DMUX_CH_DATA_6, 49 BAM_DMUX_CH_DATA_7, 50 BAM_DMUX_NUM_CH 51}; 52 53struct bam_dmux_hdr { 54 u16 magic; 55 u8 signal; 56 u8 cmd; 57 u8 pad; 58 u8 ch; 59 u16 len; 60}; 61 62struct bam_dmux_skb_dma { 63 struct bam_dmux *dmux; 64 struct sk_buff *skb; 65 dma_addr_t addr; 66}; 67 68struct bam_dmux { 69 struct device *dev; 70 71 int pc_irq; 72 bool pc_state, pc_ack_state; 73 struct qcom_smem_state *pc, *pc_ack; 74 u32 pc_mask, pc_ack_mask; 75 wait_queue_head_t pc_wait; 76 struct completion pc_ack_completion; 77 78 struct dma_chan *rx, *tx; 79 struct bam_dmux_skb_dma rx_skbs[BAM_DMUX_NUM_SKB]; 80 struct bam_dmux_skb_dma tx_skbs[BAM_DMUX_NUM_SKB]; 81 spinlock_t tx_lock; /* Protect tx_skbs, tx_next_skb */ 82 unsigned int tx_next_skb; 83 atomic_long_t tx_deferred_skb; 84 struct work_struct tx_wakeup_work; 85 86 DECLARE_BITMAP(remote_channels, BAM_DMUX_NUM_CH); 87 struct work_struct register_netdev_work; 88 struct net_device *netdevs[BAM_DMUX_NUM_CH]; 89}; 90 91struct bam_dmux_netdev { 92 struct bam_dmux *dmux; 93 u8 ch; 94}; 95 96static void bam_dmux_pc_vote(struct bam_dmux *dmux, bool enable) 97{ 98 reinit_completion(&dmux->pc_ack_completion); 99 qcom_smem_state_update_bits(dmux->pc, dmux->pc_mask, 100 enable ? dmux->pc_mask : 0); 101} 102 103static void bam_dmux_pc_ack(struct bam_dmux *dmux) 104{ 105 qcom_smem_state_update_bits(dmux->pc_ack, dmux->pc_ack_mask, 106 dmux->pc_ack_state ? 0 : dmux->pc_ack_mask); 107 dmux->pc_ack_state = !dmux->pc_ack_state; 108} 109 110static bool bam_dmux_skb_dma_map(struct bam_dmux_skb_dma *skb_dma, 111 enum dma_data_direction dir) 112{ 113 struct device *dev = skb_dma->dmux->dev; 114 115 skb_dma->addr = dma_map_single(dev, skb_dma->skb->data, skb_dma->skb->len, dir); 116 if (dma_mapping_error(dev, skb_dma->addr)) { 117 dev_err(dev, "Failed to DMA map buffer\n"); 118 skb_dma->addr = 0; 119 return false; 120 } 121 122 return true; 123} 124 125static void bam_dmux_skb_dma_unmap(struct bam_dmux_skb_dma *skb_dma, 126 enum dma_data_direction dir) 127{ 128 dma_unmap_single(skb_dma->dmux->dev, skb_dma->addr, skb_dma->skb->len, dir); 129 skb_dma->addr = 0; 130} 131 132static void bam_dmux_tx_wake_queues(struct bam_dmux *dmux) 133{ 134 int i; 135 136 dev_dbg(dmux->dev, "wake queues\n"); 137 138 for (i = 0; i < BAM_DMUX_NUM_CH; ++i) { 139 struct net_device *netdev = dmux->netdevs[i]; 140 141 if (netdev && netif_running(netdev)) 142 netif_wake_queue(netdev); 143 } 144} 145 146static void bam_dmux_tx_stop_queues(struct bam_dmux *dmux) 147{ 148 int i; 149 150 dev_dbg(dmux->dev, "stop queues\n"); 151 152 for (i = 0; i < BAM_DMUX_NUM_CH; ++i) { 153 struct net_device *netdev = dmux->netdevs[i]; 154 155 if (netdev) 156 netif_stop_queue(netdev); 157 } 158} 159 160static void bam_dmux_tx_done(struct bam_dmux_skb_dma *skb_dma) 161{ 162 struct bam_dmux *dmux = skb_dma->dmux; 163 unsigned long flags; 164 165 pm_runtime_mark_last_busy(dmux->dev); 166 pm_runtime_put_autosuspend(dmux->dev); 167 168 if (skb_dma->addr) 169 bam_dmux_skb_dma_unmap(skb_dma, DMA_TO_DEVICE); 170 171 spin_lock_irqsave(&dmux->tx_lock, flags); 172 skb_dma->skb = NULL; 173 if (skb_dma == &dmux->tx_skbs[dmux->tx_next_skb % BAM_DMUX_NUM_SKB]) 174 bam_dmux_tx_wake_queues(dmux); 175 spin_unlock_irqrestore(&dmux->tx_lock, flags); 176} 177 178static void bam_dmux_tx_callback(void *data) 179{ 180 struct bam_dmux_skb_dma *skb_dma = data; 181 struct sk_buff *skb = skb_dma->skb; 182 183 bam_dmux_tx_done(skb_dma); 184 dev_consume_skb_any(skb); 185} 186 187static bool bam_dmux_skb_dma_submit_tx(struct bam_dmux_skb_dma *skb_dma) 188{ 189 struct bam_dmux *dmux = skb_dma->dmux; 190 struct dma_async_tx_descriptor *desc; 191 192 desc = dmaengine_prep_slave_single(dmux->tx, skb_dma->addr, 193 skb_dma->skb->len, DMA_MEM_TO_DEV, 194 DMA_PREP_INTERRUPT); 195 if (!desc) { 196 dev_err(dmux->dev, "Failed to prepare TX DMA buffer\n"); 197 return false; 198 } 199 200 desc->callback = bam_dmux_tx_callback; 201 desc->callback_param = skb_dma; 202 desc->cookie = dmaengine_submit(desc); 203 return true; 204} 205 206static struct bam_dmux_skb_dma * 207bam_dmux_tx_queue(struct bam_dmux *dmux, struct sk_buff *skb) 208{ 209 struct bam_dmux_skb_dma *skb_dma; 210 unsigned long flags; 211 212 spin_lock_irqsave(&dmux->tx_lock, flags); 213 214 skb_dma = &dmux->tx_skbs[dmux->tx_next_skb % BAM_DMUX_NUM_SKB]; 215 if (skb_dma->skb) { 216 bam_dmux_tx_stop_queues(dmux); 217 spin_unlock_irqrestore(&dmux->tx_lock, flags); 218 return NULL; 219 } 220 skb_dma->skb = skb; 221 222 dmux->tx_next_skb++; 223 if (dmux->tx_skbs[dmux->tx_next_skb % BAM_DMUX_NUM_SKB].skb) 224 bam_dmux_tx_stop_queues(dmux); 225 226 spin_unlock_irqrestore(&dmux->tx_lock, flags); 227 return skb_dma; 228} 229 230static int bam_dmux_send_cmd(struct bam_dmux_netdev *bndev, u8 cmd) 231{ 232 struct bam_dmux *dmux = bndev->dmux; 233 struct bam_dmux_skb_dma *skb_dma; 234 struct bam_dmux_hdr *hdr; 235 struct sk_buff *skb; 236 int ret; 237 238 skb = alloc_skb(sizeof(*hdr), GFP_KERNEL); 239 if (!skb) 240 return -ENOMEM; 241 242 hdr = skb_put_zero(skb, sizeof(*hdr)); 243 hdr->magic = BAM_DMUX_HDR_MAGIC; 244 hdr->cmd = cmd; 245 hdr->ch = bndev->ch; 246 247 skb_dma = bam_dmux_tx_queue(dmux, skb); 248 if (!skb_dma) { 249 ret = -EAGAIN; 250 goto free_skb; 251 } 252 253 ret = pm_runtime_get_sync(dmux->dev); 254 if (ret < 0) 255 goto tx_fail; 256 257 if (!bam_dmux_skb_dma_map(skb_dma, DMA_TO_DEVICE)) { 258 ret = -ENOMEM; 259 goto tx_fail; 260 } 261 262 if (!bam_dmux_skb_dma_submit_tx(skb_dma)) { 263 ret = -EIO; 264 goto tx_fail; 265 } 266 267 dma_async_issue_pending(dmux->tx); 268 return 0; 269 270tx_fail: 271 bam_dmux_tx_done(skb_dma); 272free_skb: 273 dev_kfree_skb(skb); 274 return ret; 275} 276 277static int bam_dmux_netdev_open(struct net_device *netdev) 278{ 279 struct bam_dmux_netdev *bndev = netdev_priv(netdev); 280 int ret; 281 282 ret = bam_dmux_send_cmd(bndev, BAM_DMUX_CMD_OPEN); 283 if (ret) 284 return ret; 285 286 netif_start_queue(netdev); 287 return 0; 288} 289 290static int bam_dmux_netdev_stop(struct net_device *netdev) 291{ 292 struct bam_dmux_netdev *bndev = netdev_priv(netdev); 293 294 netif_stop_queue(netdev); 295 bam_dmux_send_cmd(bndev, BAM_DMUX_CMD_CLOSE); 296 return 0; 297} 298 299static unsigned int needed_room(unsigned int avail, unsigned int needed) 300{ 301 if (avail >= needed) 302 return 0; 303 return needed - avail; 304} 305 306static int bam_dmux_tx_prepare_skb(struct bam_dmux_netdev *bndev, 307 struct sk_buff *skb) 308{ 309 unsigned int head = needed_room(skb_headroom(skb), BAM_DMUX_HDR_SIZE); 310 unsigned int pad = sizeof(u32) - skb->len % sizeof(u32); 311 unsigned int tail = needed_room(skb_tailroom(skb), pad); 312 struct bam_dmux_hdr *hdr; 313 int ret; 314 315 if (head || tail || skb_cloned(skb)) { 316 ret = pskb_expand_head(skb, head, tail, GFP_ATOMIC); 317 if (ret) 318 return ret; 319 } 320 321 hdr = skb_push(skb, sizeof(*hdr)); 322 hdr->magic = BAM_DMUX_HDR_MAGIC; 323 hdr->signal = 0; 324 hdr->cmd = BAM_DMUX_CMD_DATA; 325 hdr->pad = pad; 326 hdr->ch = bndev->ch; 327 hdr->len = skb->len - sizeof(*hdr); 328 if (pad) 329 skb_put_zero(skb, pad); 330 331 return 0; 332} 333 334static netdev_tx_t bam_dmux_netdev_start_xmit(struct sk_buff *skb, 335 struct net_device *netdev) 336{ 337 struct bam_dmux_netdev *bndev = netdev_priv(netdev); 338 struct bam_dmux *dmux = bndev->dmux; 339 struct bam_dmux_skb_dma *skb_dma; 340 int active, ret; 341 342 skb_dma = bam_dmux_tx_queue(dmux, skb); 343 if (!skb_dma) 344 return NETDEV_TX_BUSY; 345 346 active = pm_runtime_get(dmux->dev); 347 if (active < 0 && active != -EINPROGRESS) 348 goto drop; 349 350 ret = bam_dmux_tx_prepare_skb(bndev, skb); 351 if (ret) 352 goto drop; 353 354 if (!bam_dmux_skb_dma_map(skb_dma, DMA_TO_DEVICE)) 355 goto drop; 356 357 if (active <= 0) { 358 /* Cannot sleep here so mark skb for wakeup handler and return */ 359 if (!atomic_long_fetch_or(BIT(skb_dma - dmux->tx_skbs), 360 &dmux->tx_deferred_skb)) 361 queue_pm_work(&dmux->tx_wakeup_work); 362 return NETDEV_TX_OK; 363 } 364 365 if (!bam_dmux_skb_dma_submit_tx(skb_dma)) 366 goto drop; 367 368 dma_async_issue_pending(dmux->tx); 369 return NETDEV_TX_OK; 370 371drop: 372 bam_dmux_tx_done(skb_dma); 373 dev_kfree_skb_any(skb); 374 return NETDEV_TX_OK; 375} 376 377static void bam_dmux_tx_wakeup_work(struct work_struct *work) 378{ 379 struct bam_dmux *dmux = container_of(work, struct bam_dmux, tx_wakeup_work); 380 unsigned long pending; 381 int ret, i; 382 383 ret = pm_runtime_resume_and_get(dmux->dev); 384 if (ret < 0) { 385 dev_err(dmux->dev, "Failed to resume: %d\n", ret); 386 return; 387 } 388 389 pending = atomic_long_xchg(&dmux->tx_deferred_skb, 0); 390 if (!pending) 391 goto out; 392 393 dev_dbg(dmux->dev, "pending skbs after wakeup: %#lx\n", pending); 394 for_each_set_bit(i, &pending, BAM_DMUX_NUM_SKB) { 395 bam_dmux_skb_dma_submit_tx(&dmux->tx_skbs[i]); 396 } 397 dma_async_issue_pending(dmux->tx); 398 399out: 400 pm_runtime_mark_last_busy(dmux->dev); 401 pm_runtime_put_autosuspend(dmux->dev); 402} 403 404static const struct net_device_ops bam_dmux_ops = { 405 .ndo_open = bam_dmux_netdev_open, 406 .ndo_stop = bam_dmux_netdev_stop, 407 .ndo_start_xmit = bam_dmux_netdev_start_xmit, 408}; 409 410static const struct device_type wwan_type = { 411 .name = "wwan", 412}; 413 414static void bam_dmux_netdev_setup(struct net_device *dev) 415{ 416 dev->netdev_ops = &bam_dmux_ops; 417 418 dev->type = ARPHRD_RAWIP; 419 SET_NETDEV_DEVTYPE(dev, &wwan_type); 420 dev->flags = IFF_POINTOPOINT | IFF_NOARP; 421 422 dev->mtu = ETH_DATA_LEN; 423 dev->max_mtu = BAM_DMUX_MAX_DATA_SIZE; 424 dev->needed_headroom = sizeof(struct bam_dmux_hdr); 425 dev->needed_tailroom = sizeof(u32); /* word-aligned */ 426 dev->tx_queue_len = DEFAULT_TX_QUEUE_LEN; 427 428 /* This perm addr will be used as interface identifier by IPv6 */ 429 dev->addr_assign_type = NET_ADDR_RANDOM; 430 eth_random_addr(dev->perm_addr); 431} 432 433static void bam_dmux_register_netdev_work(struct work_struct *work) 434{ 435 struct bam_dmux *dmux = container_of(work, struct bam_dmux, register_netdev_work); 436 struct bam_dmux_netdev *bndev; 437 struct net_device *netdev; 438 int ch, ret; 439 440 for_each_set_bit(ch, dmux->remote_channels, BAM_DMUX_NUM_CH) { 441 if (dmux->netdevs[ch]) 442 continue; 443 444 netdev = alloc_netdev(sizeof(*bndev), "wwan%d", NET_NAME_ENUM, 445 bam_dmux_netdev_setup); 446 if (!netdev) 447 return; 448 449 SET_NETDEV_DEV(netdev, dmux->dev); 450 netdev->dev_port = ch; 451 452 bndev = netdev_priv(netdev); 453 bndev->dmux = dmux; 454 bndev->ch = ch; 455 456 ret = register_netdev(netdev); 457 if (ret) { 458 dev_err(dmux->dev, "Failed to register netdev for channel %u: %d\n", 459 ch, ret); 460 free_netdev(netdev); 461 return; 462 } 463 464 dmux->netdevs[ch] = netdev; 465 } 466} 467 468static void bam_dmux_rx_callback(void *data); 469 470static bool bam_dmux_skb_dma_submit_rx(struct bam_dmux_skb_dma *skb_dma) 471{ 472 struct bam_dmux *dmux = skb_dma->dmux; 473 struct dma_async_tx_descriptor *desc; 474 475 desc = dmaengine_prep_slave_single(dmux->rx, skb_dma->addr, 476 skb_dma->skb->len, DMA_DEV_TO_MEM, 477 DMA_PREP_INTERRUPT); 478 if (!desc) { 479 dev_err(dmux->dev, "Failed to prepare RX DMA buffer\n"); 480 return false; 481 } 482 483 desc->callback = bam_dmux_rx_callback; 484 desc->callback_param = skb_dma; 485 desc->cookie = dmaengine_submit(desc); 486 return true; 487} 488 489static bool bam_dmux_skb_dma_queue_rx(struct bam_dmux_skb_dma *skb_dma, gfp_t gfp) 490{ 491 if (!skb_dma->skb) { 492 skb_dma->skb = __netdev_alloc_skb(NULL, BAM_DMUX_BUFFER_SIZE, gfp); 493 if (!skb_dma->skb) 494 return false; 495 skb_put(skb_dma->skb, BAM_DMUX_BUFFER_SIZE); 496 } 497 498 return bam_dmux_skb_dma_map(skb_dma, DMA_FROM_DEVICE) && 499 bam_dmux_skb_dma_submit_rx(skb_dma); 500} 501 502static void bam_dmux_cmd_data(struct bam_dmux_skb_dma *skb_dma) 503{ 504 struct bam_dmux *dmux = skb_dma->dmux; 505 struct sk_buff *skb = skb_dma->skb; 506 struct bam_dmux_hdr *hdr = (struct bam_dmux_hdr *)skb->data; 507 struct net_device *netdev = dmux->netdevs[hdr->ch]; 508 509 if (!netdev || !netif_running(netdev)) { 510 dev_warn(dmux->dev, "Data for inactive channel %u\n", hdr->ch); 511 return; 512 } 513 514 if (hdr->len > BAM_DMUX_MAX_DATA_SIZE) { 515 dev_err(dmux->dev, "Data larger than buffer? (%u > %u)\n", 516 hdr->len, (u16)BAM_DMUX_MAX_DATA_SIZE); 517 return; 518 } 519 520 skb_dma->skb = NULL; /* Hand over to network stack */ 521 522 skb_pull(skb, sizeof(*hdr)); 523 skb_trim(skb, hdr->len); 524 skb->dev = netdev; 525 526 /* Only Raw-IP/QMAP is supported by this driver */ 527 switch (skb->data[0] & 0xf0) { 528 case 0x40: 529 skb->protocol = htons(ETH_P_IP); 530 break; 531 case 0x60: 532 skb->protocol = htons(ETH_P_IPV6); 533 break; 534 default: 535 skb->protocol = htons(ETH_P_MAP); 536 break; 537 } 538 539 netif_receive_skb(skb); 540} 541 542static void bam_dmux_cmd_open(struct bam_dmux *dmux, struct bam_dmux_hdr *hdr) 543{ 544 struct net_device *netdev = dmux->netdevs[hdr->ch]; 545 546 dev_dbg(dmux->dev, "open channel: %u\n", hdr->ch); 547 548 if (__test_and_set_bit(hdr->ch, dmux->remote_channels)) { 549 dev_warn(dmux->dev, "Channel already open: %u\n", hdr->ch); 550 return; 551 } 552 553 if (netdev) { 554 netif_device_attach(netdev); 555 } else { 556 /* Cannot sleep here, schedule work to register the netdev */ 557 schedule_work(&dmux->register_netdev_work); 558 } 559} 560 561static void bam_dmux_cmd_close(struct bam_dmux *dmux, struct bam_dmux_hdr *hdr) 562{ 563 struct net_device *netdev = dmux->netdevs[hdr->ch]; 564 565 dev_dbg(dmux->dev, "close channel: %u\n", hdr->ch); 566 567 if (!__test_and_clear_bit(hdr->ch, dmux->remote_channels)) { 568 dev_err(dmux->dev, "Channel not open: %u\n", hdr->ch); 569 return; 570 } 571 572 if (netdev) 573 netif_device_detach(netdev); 574} 575 576static void bam_dmux_rx_callback(void *data) 577{ 578 struct bam_dmux_skb_dma *skb_dma = data; 579 struct bam_dmux *dmux = skb_dma->dmux; 580 struct sk_buff *skb = skb_dma->skb; 581 struct bam_dmux_hdr *hdr = (struct bam_dmux_hdr *)skb->data; 582 583 bam_dmux_skb_dma_unmap(skb_dma, DMA_FROM_DEVICE); 584 585 if (hdr->magic != BAM_DMUX_HDR_MAGIC) { 586 dev_err(dmux->dev, "Invalid magic in header: %#x\n", hdr->magic); 587 goto out; 588 } 589 590 if (hdr->ch >= BAM_DMUX_NUM_CH) { 591 dev_dbg(dmux->dev, "Unsupported channel: %u\n", hdr->ch); 592 goto out; 593 } 594 595 switch (hdr->cmd) { 596 case BAM_DMUX_CMD_DATA: 597 bam_dmux_cmd_data(skb_dma); 598 break; 599 case BAM_DMUX_CMD_OPEN: 600 bam_dmux_cmd_open(dmux, hdr); 601 break; 602 case BAM_DMUX_CMD_CLOSE: 603 bam_dmux_cmd_close(dmux, hdr); 604 break; 605 default: 606 dev_err(dmux->dev, "Unsupported command %u on channel %u\n", 607 hdr->cmd, hdr->ch); 608 break; 609 } 610 611out: 612 if (bam_dmux_skb_dma_queue_rx(skb_dma, GFP_ATOMIC)) 613 dma_async_issue_pending(dmux->rx); 614} 615 616static bool bam_dmux_power_on(struct bam_dmux *dmux) 617{ 618 struct device *dev = dmux->dev; 619 struct dma_slave_config dma_rx_conf = { 620 .direction = DMA_DEV_TO_MEM, 621 .src_maxburst = BAM_DMUX_BUFFER_SIZE, 622 }; 623 int i; 624 625 dmux->rx = dma_request_chan(dev, "rx"); 626 if (IS_ERR(dmux->rx)) { 627 dev_err(dev, "Failed to request RX DMA channel: %pe\n", dmux->rx); 628 dmux->rx = NULL; 629 return false; 630 } 631 dmaengine_slave_config(dmux->rx, &dma_rx_conf); 632 633 for (i = 0; i < BAM_DMUX_NUM_SKB; i++) { 634 if (!bam_dmux_skb_dma_queue_rx(&dmux->rx_skbs[i], GFP_KERNEL)) 635 return false; 636 } 637 dma_async_issue_pending(dmux->rx); 638 639 return true; 640} 641 642static void bam_dmux_free_skbs(struct bam_dmux_skb_dma skbs[], 643 enum dma_data_direction dir) 644{ 645 int i; 646 647 for (i = 0; i < BAM_DMUX_NUM_SKB; i++) { 648 struct bam_dmux_skb_dma *skb_dma = &skbs[i]; 649 650 if (skb_dma->addr) 651 bam_dmux_skb_dma_unmap(skb_dma, dir); 652 if (skb_dma->skb) { 653 dev_kfree_skb(skb_dma->skb); 654 skb_dma->skb = NULL; 655 } 656 } 657} 658 659static void bam_dmux_power_off(struct bam_dmux *dmux) 660{ 661 if (dmux->tx) { 662 dmaengine_terminate_sync(dmux->tx); 663 dma_release_channel(dmux->tx); 664 dmux->tx = NULL; 665 } 666 667 if (dmux->rx) { 668 dmaengine_terminate_sync(dmux->rx); 669 dma_release_channel(dmux->rx); 670 dmux->rx = NULL; 671 } 672 673 bam_dmux_free_skbs(dmux->rx_skbs, DMA_FROM_DEVICE); 674} 675 676static irqreturn_t bam_dmux_pc_irq(int irq, void *data) 677{ 678 struct bam_dmux *dmux = data; 679 bool new_state = !dmux->pc_state; 680 681 dev_dbg(dmux->dev, "pc: %u\n", new_state); 682 683 if (new_state) { 684 if (bam_dmux_power_on(dmux)) 685 bam_dmux_pc_ack(dmux); 686 else 687 bam_dmux_power_off(dmux); 688 } else { 689 bam_dmux_power_off(dmux); 690 bam_dmux_pc_ack(dmux); 691 } 692 693 dmux->pc_state = new_state; 694 wake_up_all(&dmux->pc_wait); 695 696 return IRQ_HANDLED; 697} 698 699static irqreturn_t bam_dmux_pc_ack_irq(int irq, void *data) 700{ 701 struct bam_dmux *dmux = data; 702 703 dev_dbg(dmux->dev, "pc ack\n"); 704 complete_all(&dmux->pc_ack_completion); 705 706 return IRQ_HANDLED; 707} 708 709static int bam_dmux_runtime_suspend(struct device *dev) 710{ 711 struct bam_dmux *dmux = dev_get_drvdata(dev); 712 713 dev_dbg(dev, "runtime suspend\n"); 714 bam_dmux_pc_vote(dmux, false); 715 716 return 0; 717} 718 719static int __maybe_unused bam_dmux_runtime_resume(struct device *dev) 720{ 721 struct bam_dmux *dmux = dev_get_drvdata(dev); 722 723 dev_dbg(dev, "runtime resume\n"); 724 725 /* Wait until previous power down was acked */ 726 if (!wait_for_completion_timeout(&dmux->pc_ack_completion, 727 BAM_DMUX_REMOTE_TIMEOUT)) 728 return -ETIMEDOUT; 729 730 /* Vote for power state */ 731 bam_dmux_pc_vote(dmux, true); 732 733 /* Wait for ack */ 734 if (!wait_for_completion_timeout(&dmux->pc_ack_completion, 735 BAM_DMUX_REMOTE_TIMEOUT)) { 736 bam_dmux_pc_vote(dmux, false); 737 return -ETIMEDOUT; 738 } 739 740 /* Wait until we're up */ 741 if (!wait_event_timeout(dmux->pc_wait, dmux->pc_state, 742 BAM_DMUX_REMOTE_TIMEOUT)) { 743 bam_dmux_pc_vote(dmux, false); 744 return -ETIMEDOUT; 745 } 746 747 /* Ensure that we actually initialized successfully */ 748 if (!dmux->rx) { 749 bam_dmux_pc_vote(dmux, false); 750 return -ENXIO; 751 } 752 753 /* Request TX channel if necessary */ 754 if (dmux->tx) 755 return 0; 756 757 dmux->tx = dma_request_chan(dev, "tx"); 758 if (IS_ERR(dmux->tx)) { 759 dev_err(dev, "Failed to request TX DMA channel: %pe\n", dmux->tx); 760 dmux->tx = NULL; 761 bam_dmux_runtime_suspend(dev); 762 return -ENXIO; 763 } 764 765 return 0; 766} 767 768static int bam_dmux_probe(struct platform_device *pdev) 769{ 770 struct device *dev = &pdev->dev; 771 struct bam_dmux *dmux; 772 int ret, pc_ack_irq, i; 773 unsigned int bit; 774 775 dmux = devm_kzalloc(dev, sizeof(*dmux), GFP_KERNEL); 776 if (!dmux) 777 return -ENOMEM; 778 779 dmux->dev = dev; 780 platform_set_drvdata(pdev, dmux); 781 782 dmux->pc_irq = platform_get_irq_byname(pdev, "pc"); 783 if (dmux->pc_irq < 0) 784 return dmux->pc_irq; 785 786 pc_ack_irq = platform_get_irq_byname(pdev, "pc-ack"); 787 if (pc_ack_irq < 0) 788 return pc_ack_irq; 789 790 dmux->pc = devm_qcom_smem_state_get(dev, "pc", &bit); 791 if (IS_ERR(dmux->pc)) 792 return dev_err_probe(dev, PTR_ERR(dmux->pc), 793 "Failed to get pc state\n"); 794 dmux->pc_mask = BIT(bit); 795 796 dmux->pc_ack = devm_qcom_smem_state_get(dev, "pc-ack", &bit); 797 if (IS_ERR(dmux->pc_ack)) 798 return dev_err_probe(dev, PTR_ERR(dmux->pc_ack), 799 "Failed to get pc-ack state\n"); 800 dmux->pc_ack_mask = BIT(bit); 801 802 init_waitqueue_head(&dmux->pc_wait); 803 init_completion(&dmux->pc_ack_completion); 804 complete_all(&dmux->pc_ack_completion); 805 806 spin_lock_init(&dmux->tx_lock); 807 INIT_WORK(&dmux->tx_wakeup_work, bam_dmux_tx_wakeup_work); 808 INIT_WORK(&dmux->register_netdev_work, bam_dmux_register_netdev_work); 809 810 for (i = 0; i < BAM_DMUX_NUM_SKB; i++) { 811 dmux->rx_skbs[i].dmux = dmux; 812 dmux->tx_skbs[i].dmux = dmux; 813 } 814 815 /* Runtime PM manages our own power vote. 816 * Note that the RX path may be active even if we are runtime suspended, 817 * since it is controlled by the remote side. 818 */ 819 pm_runtime_set_autosuspend_delay(dev, BAM_DMUX_AUTOSUSPEND_DELAY); 820 pm_runtime_use_autosuspend(dev); 821 pm_runtime_enable(dev); 822 823 ret = devm_request_threaded_irq(dev, pc_ack_irq, NULL, bam_dmux_pc_ack_irq, 824 IRQF_ONESHOT, NULL, dmux); 825 if (ret) 826 return ret; 827 828 ret = devm_request_threaded_irq(dev, dmux->pc_irq, NULL, bam_dmux_pc_irq, 829 IRQF_ONESHOT, NULL, dmux); 830 if (ret) 831 return ret; 832 833 ret = irq_get_irqchip_state(dmux->pc_irq, IRQCHIP_STATE_LINE_LEVEL, 834 &dmux->pc_state); 835 if (ret) 836 return ret; 837 838 /* Check if remote finished initialization before us */ 839 if (dmux->pc_state) { 840 if (bam_dmux_power_on(dmux)) 841 bam_dmux_pc_ack(dmux); 842 else 843 bam_dmux_power_off(dmux); 844 } 845 846 return 0; 847} 848 849static int bam_dmux_remove(struct platform_device *pdev) 850{ 851 struct bam_dmux *dmux = platform_get_drvdata(pdev); 852 struct device *dev = dmux->dev; 853 LIST_HEAD(list); 854 int i; 855 856 /* Unregister network interfaces */ 857 cancel_work_sync(&dmux->register_netdev_work); 858 rtnl_lock(); 859 for (i = 0; i < BAM_DMUX_NUM_CH; ++i) 860 if (dmux->netdevs[i]) 861 unregister_netdevice_queue(dmux->netdevs[i], &list); 862 unregister_netdevice_many(&list); 863 rtnl_unlock(); 864 cancel_work_sync(&dmux->tx_wakeup_work); 865 866 /* Drop our own power vote */ 867 pm_runtime_disable(dev); 868 pm_runtime_dont_use_autosuspend(dev); 869 bam_dmux_runtime_suspend(dev); 870 pm_runtime_set_suspended(dev); 871 872 /* Try to wait for remote side to drop power vote */ 873 if (!wait_event_timeout(dmux->pc_wait, !dmux->rx, BAM_DMUX_REMOTE_TIMEOUT)) 874 dev_err(dev, "Timed out waiting for remote side to suspend\n"); 875 876 /* Make sure everything is cleaned up before we return */ 877 disable_irq(dmux->pc_irq); 878 bam_dmux_power_off(dmux); 879 bam_dmux_free_skbs(dmux->tx_skbs, DMA_TO_DEVICE); 880 881 return 0; 882} 883 884static const struct dev_pm_ops bam_dmux_pm_ops = { 885 SET_RUNTIME_PM_OPS(bam_dmux_runtime_suspend, bam_dmux_runtime_resume, NULL) 886}; 887 888static const struct of_device_id bam_dmux_of_match[] = { 889 { .compatible = "qcom,bam-dmux" }, 890 { /* sentinel */ } 891}; 892MODULE_DEVICE_TABLE(of, bam_dmux_of_match); 893 894static struct platform_driver bam_dmux_driver = { 895 .probe = bam_dmux_probe, 896 .remove = bam_dmux_remove, 897 .driver = { 898 .name = "bam-dmux", 899 .pm = &bam_dmux_pm_ops, 900 .of_match_table = bam_dmux_of_match, 901 }, 902}; 903module_platform_driver(bam_dmux_driver); 904 905MODULE_LICENSE("GPL v2"); 906MODULE_DESCRIPTION("Qualcomm BAM-DMUX WWAN Network Driver"); 907MODULE_AUTHOR("Stephan Gerhold <stephan@gerhold.net>");