1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Copyright (C) 2020-21 Intel Corporation. 4 */ 5 6 #include <linux/nospec.h> 7 8 #include "iosm_ipc_imem_ops.h" 9 #include "iosm_ipc_mux_codec.h" 10 #include "iosm_ipc_task_queue.h" 11 12 /* Test the link power state and send a MUX command in blocking mode. */ 13 static int ipc_mux_tq_cmd_send(struct iosm_imem *ipc_imem, int arg, void *msg, 14 size_t size) 15 { 16 struct iosm_mux *ipc_mux = ipc_imem->mux; 17 const struct mux_acb *acb = msg; 18 19 skb_queue_tail(&ipc_mux->channel->ul_list, acb->skb); 20 ipc_imem_ul_send(ipc_mux->imem); 21 22 return 0; 23 } 24 25 static int ipc_mux_acb_send(struct iosm_mux *ipc_mux, bool blocking) 26 { 27 struct completion *completion = &ipc_mux->channel->ul_sem; 28 int ret = ipc_task_queue_send_task(ipc_mux->imem, ipc_mux_tq_cmd_send, 29 0, &ipc_mux->acb, 30 sizeof(ipc_mux->acb), false); 31 if (ret) { 32 dev_err(ipc_mux->dev, "unable to send mux command"); 33 return ret; 34 } 35 36 /* if blocking, suspend the app and wait for irq in the flash or 37 * crash phase. return false on timeout to indicate failure. 38 */ 39 if (blocking) { 40 u32 wait_time_milliseconds = IPC_MUX_CMD_RUN_DEFAULT_TIMEOUT; 41 42 reinit_completion(completion); 43 44 if (wait_for_completion_interruptible_timeout 45 (completion, msecs_to_jiffies(wait_time_milliseconds)) == 46 0) { 47 dev_err(ipc_mux->dev, "ch[%d] timeout", 48 ipc_mux->channel_id); 49 ipc_uevent_send(ipc_mux->imem->dev, UEVENT_MDM_TIMEOUT); 50 return -ETIMEDOUT; 51 } 52 } 53 54 return 0; 55 } 56 57 /* Prepare mux Command */ 58 static struct mux_lite_cmdh *ipc_mux_lite_add_cmd(struct iosm_mux *ipc_mux, 59 u32 cmd, struct mux_acb *acb, 60 void *param, u32 param_size) 61 { 62 struct mux_lite_cmdh *cmdh = (struct mux_lite_cmdh *)acb->skb->data; 63 64 cmdh->signature = cpu_to_le32(MUX_SIG_CMDH); 65 cmdh->command_type = cpu_to_le32(cmd); 66 cmdh->if_id = acb->if_id; 67 68 acb->cmd = cmd; 69 70 cmdh->cmd_len = cpu_to_le16(offsetof(struct mux_lite_cmdh, param) + 71 param_size); 72 cmdh->transaction_id = cpu_to_le32(ipc_mux->tx_transaction_id++); 73 74 if (param) 75 memcpy(&cmdh->param, param, param_size); 76 77 skb_put(acb->skb, le16_to_cpu(cmdh->cmd_len)); 78 79 return cmdh; 80 } 81 82 static int ipc_mux_acb_alloc(struct iosm_mux *ipc_mux) 83 { 84 struct mux_acb *acb = &ipc_mux->acb; 85 struct sk_buff *skb; 86 dma_addr_t mapping; 87 88 /* Allocate skb memory for the uplink buffer. */ 89 skb = ipc_pcie_alloc_skb(ipc_mux->pcie, MUX_MAX_UL_ACB_BUF_SIZE, 90 GFP_ATOMIC, &mapping, DMA_TO_DEVICE, 0); 91 if (!skb) 92 return -ENOMEM; 93 94 /* Save the skb address. */ 95 acb->skb = skb; 96 97 memset(skb->data, 0, MUX_MAX_UL_ACB_BUF_SIZE); 98 99 return 0; 100 } 101 102 int ipc_mux_dl_acb_send_cmds(struct iosm_mux *ipc_mux, u32 cmd_type, u8 if_id, 103 u32 transaction_id, union mux_cmd_param *param, 104 size_t res_size, bool blocking, bool respond) 105 { 106 struct mux_acb *acb = &ipc_mux->acb; 107 struct mux_lite_cmdh *ack_lite; 108 int ret = 0; 109 110 acb->if_id = if_id; 111 ret = ipc_mux_acb_alloc(ipc_mux); 112 if (ret) 113 return ret; 114 115 ack_lite = ipc_mux_lite_add_cmd(ipc_mux, cmd_type, acb, param, 116 res_size); 117 if (respond) 118 ack_lite->transaction_id = cpu_to_le32(transaction_id); 119 120 ret = ipc_mux_acb_send(ipc_mux, blocking); 121 122 return ret; 123 } 124 125 void ipc_mux_netif_tx_flowctrl(struct mux_session *session, int idx, bool on) 126 { 127 /* Inform the network interface to start/stop flow ctrl */ 128 ipc_wwan_tx_flowctrl(session->wwan, idx, on); 129 } 130 131 static int ipc_mux_dl_cmdresps_decode_process(struct iosm_mux *ipc_mux, 132 struct mux_lite_cmdh *cmdh) 133 { 134 struct mux_acb *acb = &ipc_mux->acb; 135 136 switch (le32_to_cpu(cmdh->command_type)) { 137 case MUX_CMD_OPEN_SESSION_RESP: 138 case MUX_CMD_CLOSE_SESSION_RESP: 139 /* Resume the control application. */ 140 acb->got_param = cmdh->param; 141 break; 142 143 case MUX_LITE_CMD_FLOW_CTL_ACK: 144 /* This command type is not expected as response for 145 * Aggregation version of the protocol. So return non-zero. 146 */ 147 if (ipc_mux->protocol != MUX_LITE) 148 return -EINVAL; 149 150 dev_dbg(ipc_mux->dev, "if %u FLOW_CTL_ACK %u received", 151 cmdh->if_id, le32_to_cpu(cmdh->transaction_id)); 152 break; 153 154 default: 155 return -EINVAL; 156 } 157 158 acb->wanted_response = MUX_CMD_INVALID; 159 acb->got_response = le32_to_cpu(cmdh->command_type); 160 complete(&ipc_mux->channel->ul_sem); 161 162 return 0; 163 } 164 165 static int ipc_mux_dl_dlcmds_decode_process(struct iosm_mux *ipc_mux, 166 struct mux_lite_cmdh *cmdh) 167 { 168 union mux_cmd_param *param = &cmdh->param; 169 struct mux_session *session; 170 int new_size; 171 172 dev_dbg(ipc_mux->dev, "if_id[%d]: dlcmds decode process %d", 173 cmdh->if_id, le32_to_cpu(cmdh->command_type)); 174 175 switch (le32_to_cpu(cmdh->command_type)) { 176 case MUX_LITE_CMD_FLOW_CTL: 177 178 if (cmdh->if_id >= ipc_mux->nr_sessions) { 179 dev_err(ipc_mux->dev, "if_id [%d] not valid", 180 cmdh->if_id); 181 return -EINVAL; /* No session interface id. */ 182 } 183 184 session = &ipc_mux->session[cmdh->if_id]; 185 186 new_size = offsetof(struct mux_lite_cmdh, param) + 187 sizeof(param->flow_ctl); 188 if (param->flow_ctl.mask == cpu_to_le32(0xFFFFFFFF)) { 189 /* Backward Compatibility */ 190 if (cmdh->cmd_len == cpu_to_le16(new_size)) 191 session->flow_ctl_mask = 192 le32_to_cpu(param->flow_ctl.mask); 193 else 194 session->flow_ctl_mask = ~0; 195 /* if CP asks for FLOW CTRL Enable 196 * then set our internal flow control Tx flag 197 * to limit uplink session queueing 198 */ 199 session->net_tx_stop = true; 200 /* Update the stats */ 201 session->flow_ctl_en_cnt++; 202 } else if (param->flow_ctl.mask == 0) { 203 /* Just reset the Flow control mask and let 204 * mux_flow_ctrl_low_thre_b take control on 205 * our internal Tx flag and enabling kernel 206 * flow control 207 */ 208 /* Backward Compatibility */ 209 if (cmdh->cmd_len == cpu_to_le16(new_size)) 210 session->flow_ctl_mask = 211 le32_to_cpu(param->flow_ctl.mask); 212 else 213 session->flow_ctl_mask = 0; 214 /* Update the stats */ 215 session->flow_ctl_dis_cnt++; 216 } else { 217 break; 218 } 219 220 dev_dbg(ipc_mux->dev, "if[%u] FLOW CTRL 0x%08X", cmdh->if_id, 221 le32_to_cpu(param->flow_ctl.mask)); 222 break; 223 224 case MUX_LITE_CMD_LINK_STATUS_REPORT: 225 break; 226 227 default: 228 return -EINVAL; 229 } 230 return 0; 231 } 232 233 /* Decode and Send appropriate response to a command block. */ 234 static void ipc_mux_dl_cmd_decode(struct iosm_mux *ipc_mux, struct sk_buff *skb) 235 { 236 struct mux_lite_cmdh *cmdh = (struct mux_lite_cmdh *)skb->data; 237 __le32 trans_id = cmdh->transaction_id; 238 239 if (ipc_mux_dl_cmdresps_decode_process(ipc_mux, cmdh)) { 240 /* Unable to decode command response indicates the cmd_type 241 * may be a command instead of response. So try to decoding it. 242 */ 243 if (!ipc_mux_dl_dlcmds_decode_process(ipc_mux, cmdh)) { 244 /* Decoded command may need a response. Give the 245 * response according to the command type. 246 */ 247 union mux_cmd_param *mux_cmd = NULL; 248 size_t size = 0; 249 u32 cmd = MUX_LITE_CMD_LINK_STATUS_REPORT_RESP; 250 251 if (cmdh->command_type == 252 cpu_to_le32(MUX_LITE_CMD_LINK_STATUS_REPORT)) { 253 mux_cmd = &cmdh->param; 254 mux_cmd->link_status_resp.response = 255 cpu_to_le32(MUX_CMD_RESP_SUCCESS); 256 /* response field is u32 */ 257 size = sizeof(u32); 258 } else if (cmdh->command_type == 259 cpu_to_le32(MUX_LITE_CMD_FLOW_CTL)) { 260 cmd = MUX_LITE_CMD_FLOW_CTL_ACK; 261 } else { 262 return; 263 } 264 265 if (ipc_mux_dl_acb_send_cmds(ipc_mux, cmd, cmdh->if_id, 266 le32_to_cpu(trans_id), 267 mux_cmd, size, false, 268 true)) 269 dev_err(ipc_mux->dev, 270 "if_id %d: cmd send failed", 271 cmdh->if_id); 272 } 273 } 274 } 275 276 /* Pass the DL packet to the netif layer. */ 277 static int ipc_mux_net_receive(struct iosm_mux *ipc_mux, int if_id, 278 struct iosm_wwan *wwan, u32 offset, 279 u8 service_class, struct sk_buff *skb) 280 { 281 struct sk_buff *dest_skb = skb_clone(skb, GFP_ATOMIC); 282 283 if (!dest_skb) 284 return -ENOMEM; 285 286 skb_pull(dest_skb, offset); 287 skb_set_tail_pointer(dest_skb, dest_skb->len); 288 /* Pass the packet to the netif layer. */ 289 dest_skb->priority = service_class; 290 291 return ipc_wwan_receive(wwan, dest_skb, false, if_id); 292 } 293 294 /* Decode Flow Credit Table in the block */ 295 static void ipc_mux_dl_fcth_decode(struct iosm_mux *ipc_mux, 296 unsigned char *block) 297 { 298 struct ipc_mem_lite_gen_tbl *fct = (struct ipc_mem_lite_gen_tbl *)block; 299 struct iosm_wwan *wwan; 300 int ul_credits; 301 int if_id; 302 303 if (fct->vfl_length != sizeof(fct->vfl.nr_of_bytes)) { 304 dev_err(ipc_mux->dev, "unexpected FCT length: %d", 305 fct->vfl_length); 306 return; 307 } 308 309 if_id = fct->if_id; 310 if (if_id >= ipc_mux->nr_sessions) { 311 dev_err(ipc_mux->dev, "not supported if_id: %d", if_id); 312 return; 313 } 314 315 /* Is the session active ? */ 316 if_id = array_index_nospec(if_id, ipc_mux->nr_sessions); 317 wwan = ipc_mux->session[if_id].wwan; 318 if (!wwan) { 319 dev_err(ipc_mux->dev, "session Net ID is NULL"); 320 return; 321 } 322 323 ul_credits = le32_to_cpu(fct->vfl.nr_of_bytes); 324 325 dev_dbg(ipc_mux->dev, "Flow_Credit:: if_id[%d] Old: %d Grants: %d", 326 if_id, ipc_mux->session[if_id].ul_flow_credits, ul_credits); 327 328 /* Update the Flow Credit information from ADB */ 329 ipc_mux->session[if_id].ul_flow_credits += ul_credits; 330 331 /* Check whether the TX can be started */ 332 if (ipc_mux->session[if_id].ul_flow_credits > 0) { 333 ipc_mux->session[if_id].net_tx_stop = false; 334 ipc_mux_netif_tx_flowctrl(&ipc_mux->session[if_id], 335 ipc_mux->session[if_id].if_id, false); 336 } 337 } 338 339 /* Decode non-aggregated datagram */ 340 static void ipc_mux_dl_adgh_decode(struct iosm_mux *ipc_mux, 341 struct sk_buff *skb) 342 { 343 u32 pad_len, packet_offset; 344 struct iosm_wwan *wwan; 345 struct mux_adgh *adgh; 346 u8 *block = skb->data; 347 int rc = 0; 348 u8 if_id; 349 350 adgh = (struct mux_adgh *)block; 351 352 if (adgh->signature != cpu_to_le32(MUX_SIG_ADGH)) { 353 dev_err(ipc_mux->dev, "invalid ADGH signature received"); 354 return; 355 } 356 357 if_id = adgh->if_id; 358 if (if_id >= ipc_mux->nr_sessions) { 359 dev_err(ipc_mux->dev, "invalid if_id while decoding %d", if_id); 360 return; 361 } 362 363 /* Is the session active ? */ 364 if_id = array_index_nospec(if_id, ipc_mux->nr_sessions); 365 wwan = ipc_mux->session[if_id].wwan; 366 if (!wwan) { 367 dev_err(ipc_mux->dev, "session Net ID is NULL"); 368 return; 369 } 370 371 /* Store the pad len for the corresponding session 372 * Pad bytes as negotiated in the open session less the header size 373 * (see session management chapter for details). 374 * If resulting padding is zero or less, the additional head padding is 375 * omitted. For e.g., if HEAD_PAD_LEN = 16 or less, this field is 376 * omitted if HEAD_PAD_LEN = 20, then this field will have 4 bytes 377 * set to zero 378 */ 379 pad_len = 380 ipc_mux->session[if_id].dl_head_pad_len - IPC_MEM_DL_ETH_OFFSET; 381 packet_offset = sizeof(*adgh) + pad_len; 382 383 if_id += ipc_mux->wwan_q_offset; 384 385 /* Pass the packet to the netif layer */ 386 rc = ipc_mux_net_receive(ipc_mux, if_id, wwan, packet_offset, 387 adgh->service_class, skb); 388 if (rc) { 389 dev_err(ipc_mux->dev, "mux adgh decoding error"); 390 return; 391 } 392 ipc_mux->session[if_id].flush = 1; 393 } 394 395 void ipc_mux_dl_decode(struct iosm_mux *ipc_mux, struct sk_buff *skb) 396 { 397 u32 signature; 398 399 if (!skb->data) 400 return; 401 402 /* Decode the MUX header type. */ 403 signature = le32_to_cpup((__le32 *)skb->data); 404 405 switch (signature) { 406 case MUX_SIG_ADGH: 407 ipc_mux_dl_adgh_decode(ipc_mux, skb); 408 break; 409 410 case MUX_SIG_FCTH: 411 ipc_mux_dl_fcth_decode(ipc_mux, skb->data); 412 break; 413 414 case MUX_SIG_CMDH: 415 ipc_mux_dl_cmd_decode(ipc_mux, skb); 416 break; 417 418 default: 419 dev_err(ipc_mux->dev, "invalid ABH signature"); 420 } 421 422 ipc_pcie_kfree_skb(ipc_mux->pcie, skb); 423 } 424 425 static int ipc_mux_ul_skb_alloc(struct iosm_mux *ipc_mux, 426 struct mux_adb *ul_adb, u32 type) 427 { 428 /* Take the first element of the free list. */ 429 struct sk_buff *skb = skb_dequeue(&ul_adb->free_list); 430 int qlt_size; 431 432 if (!skb) 433 return -EBUSY; /* Wait for a free ADB skb. */ 434 435 /* Mark it as UL ADB to select the right free operation. */ 436 IPC_CB(skb)->op_type = (u8)UL_MUX_OP_ADB; 437 438 switch (type) { 439 case MUX_SIG_ADGH: 440 /* Save the ADB memory settings. */ 441 ul_adb->dest_skb = skb; 442 ul_adb->buf = skb->data; 443 ul_adb->size = IPC_MEM_MAX_DL_MUX_LITE_BUF_SIZE; 444 /* reset statistic counter */ 445 ul_adb->if_cnt = 0; 446 ul_adb->payload_size = 0; 447 ul_adb->dg_cnt_total = 0; 448 449 ul_adb->adgh = (struct mux_adgh *)skb->data; 450 memset(ul_adb->adgh, 0, sizeof(struct mux_adgh)); 451 break; 452 453 case MUX_SIG_QLTH: 454 qlt_size = offsetof(struct ipc_mem_lite_gen_tbl, vfl) + 455 (MUX_QUEUE_LEVEL * sizeof(struct mux_lite_vfl)); 456 457 if (qlt_size > IPC_MEM_MAX_DL_MUX_LITE_BUF_SIZE) { 458 dev_err(ipc_mux->dev, 459 "can't support. QLT size:%d SKB size: %d", 460 qlt_size, IPC_MEM_MAX_DL_MUX_LITE_BUF_SIZE); 461 return -ERANGE; 462 } 463 464 ul_adb->qlth_skb = skb; 465 memset((ul_adb->qlth_skb)->data, 0, qlt_size); 466 skb_put(skb, qlt_size); 467 break; 468 } 469 470 return 0; 471 } 472 473 static void ipc_mux_ul_adgh_finish(struct iosm_mux *ipc_mux) 474 { 475 struct mux_adb *ul_adb = &ipc_mux->ul_adb; 476 u16 adgh_len; 477 long long bytes; 478 char *str; 479 480 if (!ul_adb->dest_skb) { 481 dev_err(ipc_mux->dev, "no dest skb"); 482 return; 483 } 484 485 adgh_len = le16_to_cpu(ul_adb->adgh->length); 486 skb_put(ul_adb->dest_skb, adgh_len); 487 skb_queue_tail(&ipc_mux->channel->ul_list, ul_adb->dest_skb); 488 ul_adb->dest_skb = NULL; 489 490 if (ipc_mux->ul_flow == MUX_UL_ON_CREDITS) { 491 struct mux_session *session; 492 493 session = &ipc_mux->session[ul_adb->adgh->if_id]; 494 str = "available_credits"; 495 bytes = (long long)session->ul_flow_credits; 496 497 } else { 498 str = "pend_bytes"; 499 bytes = ipc_mux->ul_data_pend_bytes; 500 ipc_mux->ul_data_pend_bytes = ipc_mux->ul_data_pend_bytes + 501 adgh_len; 502 } 503 504 dev_dbg(ipc_mux->dev, "UL ADGH: size=%u, if_id=%d, payload=%d, %s=%lld", 505 adgh_len, ul_adb->adgh->if_id, ul_adb->payload_size, 506 str, bytes); 507 } 508 509 /* Allocates an ADB from the free list and initializes it with ADBH */ 510 static bool ipc_mux_ul_adb_allocate(struct iosm_mux *ipc_mux, 511 struct mux_adb *adb, int *size_needed, 512 u32 type) 513 { 514 bool ret_val = false; 515 int status; 516 517 if (!adb->dest_skb) { 518 /* Allocate memory for the ADB including of the 519 * datagram table header. 520 */ 521 status = ipc_mux_ul_skb_alloc(ipc_mux, adb, type); 522 if (status) 523 /* Is a pending ADB available ? */ 524 ret_val = true; /* None. */ 525 526 /* Update size need to zero only for new ADB memory */ 527 *size_needed = 0; 528 } 529 530 return ret_val; 531 } 532 533 /* Informs the network stack to stop sending further packets for all opened 534 * sessions 535 */ 536 static void ipc_mux_stop_tx_for_all_sessions(struct iosm_mux *ipc_mux) 537 { 538 struct mux_session *session; 539 int idx; 540 541 for (idx = 0; idx < ipc_mux->nr_sessions; idx++) { 542 session = &ipc_mux->session[idx]; 543 544 if (!session->wwan) 545 continue; 546 547 session->net_tx_stop = true; 548 } 549 } 550 551 /* Sends Queue Level Table of all opened sessions */ 552 static bool ipc_mux_lite_send_qlt(struct iosm_mux *ipc_mux) 553 { 554 struct ipc_mem_lite_gen_tbl *qlt; 555 struct mux_session *session; 556 bool qlt_updated = false; 557 int i; 558 int qlt_size; 559 560 if (!ipc_mux->initialized || ipc_mux->state != MUX_S_ACTIVE) 561 return qlt_updated; 562 563 qlt_size = offsetof(struct ipc_mem_lite_gen_tbl, vfl) + 564 MUX_QUEUE_LEVEL * sizeof(struct mux_lite_vfl); 565 566 for (i = 0; i < ipc_mux->nr_sessions; i++) { 567 session = &ipc_mux->session[i]; 568 569 if (!session->wwan || session->flow_ctl_mask) 570 continue; 571 572 if (ipc_mux_ul_skb_alloc(ipc_mux, &ipc_mux->ul_adb, 573 MUX_SIG_QLTH)) { 574 dev_err(ipc_mux->dev, 575 "no reserved mem to send QLT of if_id: %d", i); 576 break; 577 } 578 579 /* Prepare QLT */ 580 qlt = (struct ipc_mem_lite_gen_tbl *)(ipc_mux->ul_adb.qlth_skb) 581 ->data; 582 qlt->signature = cpu_to_le32(MUX_SIG_QLTH); 583 qlt->length = cpu_to_le16(qlt_size); 584 qlt->if_id = i; 585 qlt->vfl_length = MUX_QUEUE_LEVEL * sizeof(struct mux_lite_vfl); 586 qlt->reserved[0] = 0; 587 qlt->reserved[1] = 0; 588 589 qlt->vfl.nr_of_bytes = cpu_to_le32(session->ul_list.qlen); 590 591 /* Add QLT to the transfer list. */ 592 skb_queue_tail(&ipc_mux->channel->ul_list, 593 ipc_mux->ul_adb.qlth_skb); 594 595 qlt_updated = true; 596 ipc_mux->ul_adb.qlth_skb = NULL; 597 } 598 599 if (qlt_updated) 600 /* Updates the TDs with ul_list */ 601 (void)ipc_imem_ul_write_td(ipc_mux->imem); 602 603 return qlt_updated; 604 } 605 606 /* Checks the available credits for the specified session and returns 607 * number of packets for which credits are available. 608 */ 609 static int ipc_mux_ul_bytes_credits_check(struct iosm_mux *ipc_mux, 610 struct mux_session *session, 611 struct sk_buff_head *ul_list, 612 int max_nr_of_pkts) 613 { 614 int pkts_to_send = 0; 615 struct sk_buff *skb; 616 int credits = 0; 617 618 if (ipc_mux->ul_flow == MUX_UL_ON_CREDITS) { 619 credits = session->ul_flow_credits; 620 if (credits <= 0) { 621 dev_dbg(ipc_mux->dev, 622 "FC::if_id[%d] Insuff.Credits/Qlen:%d/%u", 623 session->if_id, session->ul_flow_credits, 624 session->ul_list.qlen); /* nr_of_bytes */ 625 return 0; 626 } 627 } else { 628 credits = IPC_MEM_MUX_UL_FLOWCTRL_HIGH_B - 629 ipc_mux->ul_data_pend_bytes; 630 if (credits <= 0) { 631 ipc_mux_stop_tx_for_all_sessions(ipc_mux); 632 633 dev_dbg(ipc_mux->dev, 634 "if_id[%d] encod. fail Bytes: %llu, thresh: %d", 635 session->if_id, ipc_mux->ul_data_pend_bytes, 636 IPC_MEM_MUX_UL_FLOWCTRL_HIGH_B); 637 return 0; 638 } 639 } 640 641 /* Check if there are enough credits/bytes available to send the 642 * requested max_nr_of_pkts. Otherwise restrict the nr_of_pkts 643 * depending on available credits. 644 */ 645 skb_queue_walk(ul_list, skb) 646 { 647 if (!(credits >= skb->len && pkts_to_send < max_nr_of_pkts)) 648 break; 649 credits -= skb->len; 650 pkts_to_send++; 651 } 652 653 return pkts_to_send; 654 } 655 656 /* Encode the UL IP packet according to Lite spec. */ 657 static int ipc_mux_ul_adgh_encode(struct iosm_mux *ipc_mux, int session_id, 658 struct mux_session *session, 659 struct sk_buff_head *ul_list, 660 struct mux_adb *adb, int nr_of_pkts) 661 { 662 int offset = sizeof(struct mux_adgh); 663 int adb_updated = -EINVAL; 664 struct sk_buff *src_skb; 665 int aligned_size = 0; 666 int nr_of_skb = 0; 667 u32 pad_len = 0; 668 669 /* Re-calculate the number of packets depending on number of bytes to be 670 * processed/available credits. 671 */ 672 nr_of_pkts = ipc_mux_ul_bytes_credits_check(ipc_mux, session, ul_list, 673 nr_of_pkts); 674 675 /* If calculated nr_of_pkts from available credits is <= 0 676 * then nothing to do. 677 */ 678 if (nr_of_pkts <= 0) 679 return 0; 680 681 /* Read configured UL head_pad_length for session.*/ 682 if (session->ul_head_pad_len > IPC_MEM_DL_ETH_OFFSET) 683 pad_len = session->ul_head_pad_len - IPC_MEM_DL_ETH_OFFSET; 684 685 /* Process all pending UL packets for this session 686 * depending on the allocated datagram table size. 687 */ 688 while (nr_of_pkts > 0) { 689 /* get destination skb allocated */ 690 if (ipc_mux_ul_adb_allocate(ipc_mux, adb, &ipc_mux->size_needed, 691 MUX_SIG_ADGH)) { 692 dev_err(ipc_mux->dev, "no reserved memory for ADGH"); 693 return -ENOMEM; 694 } 695 696 /* Peek at the head of the list. */ 697 src_skb = skb_peek(ul_list); 698 if (!src_skb) { 699 dev_err(ipc_mux->dev, 700 "skb peek return NULL with count : %d", 701 nr_of_pkts); 702 break; 703 } 704 705 /* Calculate the memory value. */ 706 aligned_size = ALIGN((pad_len + src_skb->len), 4); 707 708 ipc_mux->size_needed = sizeof(struct mux_adgh) + aligned_size; 709 710 if (ipc_mux->size_needed > adb->size) { 711 dev_dbg(ipc_mux->dev, "size needed %d, adgh size %d", 712 ipc_mux->size_needed, adb->size); 713 /* Return 1 if any IP packet is added to the transfer 714 * list. 715 */ 716 return nr_of_skb ? 1 : 0; 717 } 718 719 /* Add buffer (without head padding to next pending transfer) */ 720 memcpy(adb->buf + offset + pad_len, src_skb->data, 721 src_skb->len); 722 723 adb->adgh->signature = cpu_to_le32(MUX_SIG_ADGH); 724 adb->adgh->if_id = session_id; 725 adb->adgh->length = 726 cpu_to_le16(sizeof(struct mux_adgh) + pad_len + 727 src_skb->len); 728 adb->adgh->service_class = src_skb->priority; 729 adb->adgh->next_count = --nr_of_pkts; 730 adb->dg_cnt_total++; 731 adb->payload_size += src_skb->len; 732 733 if (ipc_mux->ul_flow == MUX_UL_ON_CREDITS) 734 /* Decrement the credit value as we are processing the 735 * datagram from the UL list. 736 */ 737 session->ul_flow_credits -= src_skb->len; 738 739 /* Remove the processed elements and free it. */ 740 src_skb = skb_dequeue(ul_list); 741 dev_kfree_skb(src_skb); 742 nr_of_skb++; 743 744 ipc_mux_ul_adgh_finish(ipc_mux); 745 } 746 747 if (nr_of_skb) { 748 /* Send QLT info to modem if pending bytes > high watermark 749 * in case of mux lite 750 */ 751 if (ipc_mux->ul_flow == MUX_UL_ON_CREDITS || 752 ipc_mux->ul_data_pend_bytes >= 753 IPC_MEM_MUX_UL_FLOWCTRL_LOW_B) 754 adb_updated = ipc_mux_lite_send_qlt(ipc_mux); 755 else 756 adb_updated = 1; 757 758 /* Updates the TDs with ul_list */ 759 (void)ipc_imem_ul_write_td(ipc_mux->imem); 760 } 761 762 return adb_updated; 763 } 764 765 bool ipc_mux_ul_data_encode(struct iosm_mux *ipc_mux) 766 { 767 struct sk_buff_head *ul_list; 768 struct mux_session *session; 769 int updated = 0; 770 int session_id; 771 int dg_n; 772 int i; 773 774 if (!ipc_mux || ipc_mux->state != MUX_S_ACTIVE || 775 ipc_mux->adb_prep_ongoing) 776 return false; 777 778 ipc_mux->adb_prep_ongoing = true; 779 780 for (i = 0; i < ipc_mux->nr_sessions; i++) { 781 session_id = ipc_mux->rr_next_session; 782 session = &ipc_mux->session[session_id]; 783 784 /* Go to next handle rr_next_session overflow */ 785 ipc_mux->rr_next_session++; 786 if (ipc_mux->rr_next_session >= ipc_mux->nr_sessions) 787 ipc_mux->rr_next_session = 0; 788 789 if (!session->wwan || session->flow_ctl_mask || 790 session->net_tx_stop) 791 continue; 792 793 ul_list = &session->ul_list; 794 795 /* Is something pending in UL and flow ctrl off */ 796 dg_n = skb_queue_len(ul_list); 797 if (dg_n > MUX_MAX_UL_DG_ENTRIES) 798 dg_n = MUX_MAX_UL_DG_ENTRIES; 799 800 if (dg_n == 0) 801 /* Nothing to do for ipc_mux session 802 * -> try next session id. 803 */ 804 continue; 805 806 updated = ipc_mux_ul_adgh_encode(ipc_mux, session_id, session, 807 ul_list, &ipc_mux->ul_adb, 808 dg_n); 809 } 810 811 ipc_mux->adb_prep_ongoing = false; 812 return updated == 1; 813 } 814 815 void ipc_mux_ul_encoded_process(struct iosm_mux *ipc_mux, struct sk_buff *skb) 816 { 817 struct mux_adgh *adgh; 818 u16 adgh_len; 819 820 adgh = (struct mux_adgh *)skb->data; 821 adgh_len = le16_to_cpu(adgh->length); 822 823 if (adgh->signature == cpu_to_le32(MUX_SIG_ADGH) && 824 ipc_mux->ul_flow == MUX_UL) 825 ipc_mux->ul_data_pend_bytes = ipc_mux->ul_data_pend_bytes - 826 adgh_len; 827 828 if (ipc_mux->ul_flow == MUX_UL) 829 dev_dbg(ipc_mux->dev, "ul_data_pend_bytes: %lld", 830 ipc_mux->ul_data_pend_bytes); 831 832 /* Reset the skb settings. */ 833 skb->tail = 0; 834 skb->len = 0; 835 836 /* Add the consumed ADB to the free list. */ 837 skb_queue_tail((&ipc_mux->ul_adb.free_list), skb); 838 } 839 840 /* Start the NETIF uplink send transfer in MUX mode. */ 841 static int ipc_mux_tq_ul_trigger_encode(struct iosm_imem *ipc_imem, int arg, 842 void *msg, size_t size) 843 { 844 struct iosm_mux *ipc_mux = ipc_imem->mux; 845 bool ul_data_pend = false; 846 847 /* Add session UL data to a ADB and ADGH */ 848 ul_data_pend = ipc_mux_ul_data_encode(ipc_mux); 849 if (ul_data_pend) 850 /* Delay the doorbell irq */ 851 ipc_imem_td_update_timer_start(ipc_mux->imem); 852 853 /* reset the debounce flag */ 854 ipc_mux->ev_mux_net_transmit_pending = false; 855 856 return 0; 857 } 858 859 int ipc_mux_ul_trigger_encode(struct iosm_mux *ipc_mux, int if_id, 860 struct sk_buff *skb) 861 { 862 struct mux_session *session = &ipc_mux->session[if_id]; 863 int ret = -EINVAL; 864 865 if (ipc_mux->channel && 866 ipc_mux->channel->state != IMEM_CHANNEL_ACTIVE) { 867 dev_err(ipc_mux->dev, 868 "channel state is not IMEM_CHANNEL_ACTIVE"); 869 goto out; 870 } 871 872 if (!session->wwan) { 873 dev_err(ipc_mux->dev, "session net ID is NULL"); 874 ret = -EFAULT; 875 goto out; 876 } 877 878 /* Session is under flow control. 879 * Check if packet can be queued in session list, if not 880 * suspend net tx 881 */ 882 if (skb_queue_len(&session->ul_list) >= 883 (session->net_tx_stop ? 884 IPC_MEM_MUX_UL_SESS_FCON_THRESHOLD : 885 (IPC_MEM_MUX_UL_SESS_FCON_THRESHOLD * 886 IPC_MEM_MUX_UL_SESS_FCOFF_THRESHOLD_FACTOR))) { 887 ipc_mux_netif_tx_flowctrl(session, session->if_id, true); 888 ret = -EBUSY; 889 goto out; 890 } 891 892 /* Add skb to the uplink skb accumulator. */ 893 skb_queue_tail(&session->ul_list, skb); 894 895 /* Inform the IPC kthread to pass uplink IP packets to CP. */ 896 if (!ipc_mux->ev_mux_net_transmit_pending) { 897 ipc_mux->ev_mux_net_transmit_pending = true; 898 ret = ipc_task_queue_send_task(ipc_mux->imem, 899 ipc_mux_tq_ul_trigger_encode, 0, 900 NULL, 0, false); 901 if (ret) 902 goto out; 903 } 904 dev_dbg(ipc_mux->dev, "mux ul if[%d] qlen=%d/%u, len=%d/%d, prio=%d", 905 if_id, skb_queue_len(&session->ul_list), session->ul_list.qlen, 906 skb->len, skb->truesize, skb->priority); 907 ret = 0; 908 out: 909 return ret; 910 } 911