Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'net-ipa-dont-cache-channel-state'

Alex Elder says:

====================
net: ipa: don't cache channel state

This series removes a field that holds a copy of a channel's state
at the time it was last fetched. In principle the state can change
at any time, so it's better to just fetch it whenever needed. The
first patch is just preparatory, simplifying the arguments to
gsi_channel_state().
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+59 -38
+58 -36
drivers/net/ipa/gsi.c
··· 415 415 evt_ring->state); 416 416 } 417 417 418 - /* Return the hardware's notion of the current state of a channel */ 419 - static enum gsi_channel_state 420 - gsi_channel_state(struct gsi *gsi, u32 channel_id) 418 + /* Fetch the current state of a channel from hardware */ 419 + static enum gsi_channel_state gsi_channel_state(struct gsi_channel *channel) 421 420 { 421 + u32 channel_id = gsi_channel_id(channel); 422 + void *virt = channel->gsi->virt; 422 423 u32 val; 423 424 424 - val = ioread32(gsi->virt + GSI_CH_C_CNTXT_0_OFFSET(channel_id)); 425 + val = ioread32(virt + GSI_CH_C_CNTXT_0_OFFSET(channel_id)); 425 426 426 427 return u32_get_bits(val, CHSTATE_FMASK); 427 428 } ··· 433 432 { 434 433 struct completion *completion = &channel->completion; 435 434 u32 channel_id = gsi_channel_id(channel); 435 + struct gsi *gsi = channel->gsi; 436 436 u32 val; 437 437 438 438 val = u32_encode_bits(channel_id, CH_CHID_FMASK); 439 439 val |= u32_encode_bits(opcode, CH_OPCODE_FMASK); 440 440 441 - if (gsi_command(channel->gsi, GSI_CH_CMD_OFFSET, val, completion)) 441 + if (gsi_command(gsi, GSI_CH_CMD_OFFSET, val, completion)) 442 442 return 0; /* Success! */ 443 443 444 - dev_err(channel->gsi->dev, "GSI command %u to channel %u timed out " 445 - "(state is %u)\n", opcode, channel_id, channel->state); 444 + dev_err(gsi->dev, 445 + "GSI command %u to channel %u timed out (state is %u)\n", 446 + opcode, channel_id, gsi_channel_state(channel)); 446 447 447 448 return -ETIMEDOUT; 448 449 } ··· 453 450 static int gsi_channel_alloc_command(struct gsi *gsi, u32 channel_id) 454 451 { 455 452 struct gsi_channel *channel = &gsi->channel[channel_id]; 453 + enum gsi_channel_state state; 456 454 int ret; 457 455 458 456 /* Get initial channel state */ 459 - channel->state = gsi_channel_state(gsi, channel_id); 460 - 461 - if (channel->state != GSI_CHANNEL_STATE_NOT_ALLOCATED) 457 + state = gsi_channel_state(channel); 458 + if (state != GSI_CHANNEL_STATE_NOT_ALLOCATED) 462 459 return -EINVAL; 463 460 464 461 ret = gsi_channel_command(channel, GSI_CH_ALLOCATE); 465 - if (!ret && channel->state != GSI_CHANNEL_STATE_ALLOCATED) { 462 + 463 + /* Channel state will normally have been updated */ 464 + state = gsi_channel_state(channel); 465 + if (!ret && state != GSI_CHANNEL_STATE_ALLOCATED) { 466 466 dev_err(gsi->dev, "bad channel state (%u) after alloc\n", 467 - channel->state); 467 + state); 468 468 ret = -EIO; 469 469 } 470 470 ··· 477 471 /* Start an ALLOCATED channel */ 478 472 static int gsi_channel_start_command(struct gsi_channel *channel) 479 473 { 480 - enum gsi_channel_state state = channel->state; 474 + enum gsi_channel_state state; 481 475 int ret; 482 476 477 + state = gsi_channel_state(channel); 483 478 if (state != GSI_CHANNEL_STATE_ALLOCATED && 484 479 state != GSI_CHANNEL_STATE_STOPPED) 485 480 return -EINVAL; 486 481 487 482 ret = gsi_channel_command(channel, GSI_CH_START); 488 - if (!ret && channel->state != GSI_CHANNEL_STATE_STARTED) { 483 + 484 + /* Channel state will normally have been updated */ 485 + state = gsi_channel_state(channel); 486 + if (!ret && state != GSI_CHANNEL_STATE_STARTED) { 489 487 dev_err(channel->gsi->dev, 490 - "bad channel state (%u) after start\n", 491 - channel->state); 488 + "bad channel state (%u) after start\n", state); 492 489 ret = -EIO; 493 490 } 494 491 ··· 501 492 /* Stop a GSI channel in STARTED state */ 502 493 static int gsi_channel_stop_command(struct gsi_channel *channel) 503 494 { 504 - enum gsi_channel_state state = channel->state; 495 + enum gsi_channel_state state; 505 496 int ret; 506 497 498 + state = gsi_channel_state(channel); 507 499 if (state != GSI_CHANNEL_STATE_STARTED && 508 500 state != GSI_CHANNEL_STATE_STOP_IN_PROC) 509 501 return -EINVAL; 510 502 511 503 ret = gsi_channel_command(channel, GSI_CH_STOP); 512 - if (ret || channel->state == GSI_CHANNEL_STATE_STOPPED) 504 + 505 + /* Channel state will normally have been updated */ 506 + state = gsi_channel_state(channel); 507 + if (ret || state == GSI_CHANNEL_STATE_STOPPED) 513 508 return ret; 514 509 515 510 /* We may have to try again if stop is in progress */ 516 - if (channel->state == GSI_CHANNEL_STATE_STOP_IN_PROC) 511 + if (state == GSI_CHANNEL_STATE_STOP_IN_PROC) 517 512 return -EAGAIN; 518 513 519 - dev_err(channel->gsi->dev, "bad channel state (%u) after stop\n", 520 - channel->state); 514 + dev_err(channel->gsi->dev, 515 + "bad channel state (%u) after stop\n", state); 521 516 522 517 return -EIO; 523 518 } ··· 529 516 /* Reset a GSI channel in ALLOCATED or ERROR state. */ 530 517 static void gsi_channel_reset_command(struct gsi_channel *channel) 531 518 { 519 + enum gsi_channel_state state; 532 520 int ret; 533 521 534 522 msleep(1); /* A short delay is required before a RESET command */ 535 523 536 - if (channel->state != GSI_CHANNEL_STATE_STOPPED && 537 - channel->state != GSI_CHANNEL_STATE_ERROR) { 524 + state = gsi_channel_state(channel); 525 + if (state != GSI_CHANNEL_STATE_STOPPED && 526 + state != GSI_CHANNEL_STATE_ERROR) { 538 527 dev_err(channel->gsi->dev, 539 - "bad channel state (%u) before reset\n", 540 - channel->state); 528 + "bad channel state (%u) before reset\n", state); 541 529 return; 542 530 } 543 531 544 532 ret = gsi_channel_command(channel, GSI_CH_RESET); 545 - if (!ret && channel->state != GSI_CHANNEL_STATE_ALLOCATED) 533 + 534 + /* Channel state will normally have been updated */ 535 + state = gsi_channel_state(channel); 536 + if (!ret && state != GSI_CHANNEL_STATE_ALLOCATED) 546 537 dev_err(channel->gsi->dev, 547 - "bad channel state (%u) after reset\n", 548 - channel->state); 538 + "bad channel state (%u) after reset\n", state); 549 539 } 550 540 551 541 /* Deallocate an ALLOCATED GSI channel */ 552 542 static void gsi_channel_de_alloc_command(struct gsi *gsi, u32 channel_id) 553 543 { 554 544 struct gsi_channel *channel = &gsi->channel[channel_id]; 545 + enum gsi_channel_state state; 555 546 int ret; 556 547 557 - if (channel->state != GSI_CHANNEL_STATE_ALLOCATED) { 558 - dev_err(gsi->dev, "bad channel state (%u) before dealloc\n", 559 - channel->state); 548 + state = gsi_channel_state(channel); 549 + if (state != GSI_CHANNEL_STATE_ALLOCATED) { 550 + dev_err(gsi->dev, 551 + "bad channel state (%u) before dealloc\n", state); 560 552 return; 561 553 } 562 554 563 555 ret = gsi_channel_command(channel, GSI_CH_DE_ALLOC); 564 - if (!ret && channel->state != GSI_CHANNEL_STATE_NOT_ALLOCATED) 565 - dev_err(gsi->dev, "bad channel state (%u) after dealloc\n", 566 - channel->state); 556 + 557 + /* Channel state will normally have been updated */ 558 + state = gsi_channel_state(channel); 559 + if (!ret && state != GSI_CHANNEL_STATE_NOT_ALLOCATED) 560 + dev_err(gsi->dev, 561 + "bad channel state (%u) after dealloc\n", state); 567 562 } 568 563 569 564 /* Ring an event ring doorbell, reporting the last entry processed by the AP. ··· 798 777 int gsi_channel_stop(struct gsi *gsi, u32 channel_id) 799 778 { 800 779 struct gsi_channel *channel = &gsi->channel[channel_id]; 780 + enum gsi_channel_state state; 801 781 u32 retries; 802 782 int ret; 803 783 ··· 808 786 * STOP command timed out. We won't stop a channel if stopping it 809 787 * was successful previously (so we still want the freeze above). 810 788 */ 811 - if (channel->state == GSI_CHANNEL_STATE_STOPPED) 789 + state = gsi_channel_state(channel); 790 + if (state == GSI_CHANNEL_STATE_STOPPED) 812 791 return 0; 813 792 814 793 /* RX channels might require a little time to enter STOPPED state */ ··· 963 940 channel_mask ^= BIT(channel_id); 964 941 965 942 channel = &gsi->channel[channel_id]; 966 - channel->state = gsi_channel_state(gsi, channel_id); 967 943 968 944 complete(&channel->completion); 969 945 }
+1 -2
drivers/net/ipa/gsi.h
··· 113 113 u16 tre_count; 114 114 u16 event_count; 115 115 116 - struct completion completion; /* signals channel state changes */ 117 - enum gsi_channel_state state; 116 + struct completion completion; /* signals channel command completion */ 118 117 119 118 struct gsi_ring tre_ring; 120 119 u32 evt_ring_id;