Skip to content

Commit df8f348

Browse files
committed
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 <[email protected]>
2 parents b7052ba + a2003b3 commit df8f348

File tree

2 files changed

+59
-38
lines changed

2 files changed

+59
-38
lines changed

drivers/net/ipa/gsi.c

Lines changed: 58 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -415,13 +415,14 @@ static void gsi_evt_ring_de_alloc_command(struct gsi *gsi, u32 evt_ring_id)
415415
evt_ring->state);
416416
}
417417

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)
421420
{
421+
u32 channel_id = gsi_channel_id(channel);
422+
void *virt = channel->gsi->virt;
422423
u32 val;
423424

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));
425426

426427
return u32_get_bits(val, CHSTATE_FMASK);
427428
}
@@ -432,16 +433,18 @@ gsi_channel_command(struct gsi_channel *channel, enum gsi_ch_cmd_opcode opcode)
432433
{
433434
struct completion *completion = &channel->completion;
434435
u32 channel_id = gsi_channel_id(channel);
436+
struct gsi *gsi = channel->gsi;
435437
u32 val;
436438

437439
val = u32_encode_bits(channel_id, CH_CHID_FMASK);
438440
val |= u32_encode_bits(opcode, CH_OPCODE_FMASK);
439441

440-
if (gsi_command(channel->gsi, GSI_CH_CMD_OFFSET, val, completion))
442+
if (gsi_command(gsi, GSI_CH_CMD_OFFSET, val, completion))
441443
return 0; /* Success! */
442444

443-
dev_err(channel->gsi->dev, "GSI command %u to channel %u timed out "
444-
"(state is %u)\n", opcode, channel_id, channel->state);
445+
dev_err(gsi->dev,
446+
"GSI command %u to channel %u timed out (state is %u)\n",
447+
opcode, channel_id, gsi_channel_state(channel));
445448

446449
return -ETIMEDOUT;
447450
}
@@ -450,18 +453,21 @@ gsi_channel_command(struct gsi_channel *channel, enum gsi_ch_cmd_opcode opcode)
450453
static int gsi_channel_alloc_command(struct gsi *gsi, u32 channel_id)
451454
{
452455
struct gsi_channel *channel = &gsi->channel[channel_id];
456+
enum gsi_channel_state state;
453457
int ret;
454458

455459
/* Get initial channel state */
456-
channel->state = gsi_channel_state(gsi, channel_id);
457-
458-
if (channel->state != GSI_CHANNEL_STATE_NOT_ALLOCATED)
460+
state = gsi_channel_state(channel);
461+
if (state != GSI_CHANNEL_STATE_NOT_ALLOCATED)
459462
return -EINVAL;
460463

461464
ret = gsi_channel_command(channel, GSI_CH_ALLOCATE);
462-
if (!ret && channel->state != GSI_CHANNEL_STATE_ALLOCATED) {
465+
466+
/* Channel state will normally have been updated */
467+
state = gsi_channel_state(channel);
468+
if (!ret && state != GSI_CHANNEL_STATE_ALLOCATED) {
463469
dev_err(gsi->dev, "bad channel state (%u) after alloc\n",
464-
channel->state);
470+
state);
465471
ret = -EIO;
466472
}
467473

@@ -471,18 +477,21 @@ static int gsi_channel_alloc_command(struct gsi *gsi, u32 channel_id)
471477
/* Start an ALLOCATED channel */
472478
static int gsi_channel_start_command(struct gsi_channel *channel)
473479
{
474-
enum gsi_channel_state state = channel->state;
480+
enum gsi_channel_state state;
475481
int ret;
476482

483+
state = gsi_channel_state(channel);
477484
if (state != GSI_CHANNEL_STATE_ALLOCATED &&
478485
state != GSI_CHANNEL_STATE_STOPPED)
479486
return -EINVAL;
480487

481488
ret = gsi_channel_command(channel, GSI_CH_START);
482-
if (!ret && channel->state != GSI_CHANNEL_STATE_STARTED) {
489+
490+
/* Channel state will normally have been updated */
491+
state = gsi_channel_state(channel);
492+
if (!ret && state != GSI_CHANNEL_STATE_STARTED) {
483493
dev_err(channel->gsi->dev,
484-
"bad channel state (%u) after start\n",
485-
channel->state);
494+
"bad channel state (%u) after start\n", state);
486495
ret = -EIO;
487496
}
488497

@@ -492,65 +501,77 @@ static int gsi_channel_start_command(struct gsi_channel *channel)
492501
/* Stop a GSI channel in STARTED state */
493502
static int gsi_channel_stop_command(struct gsi_channel *channel)
494503
{
495-
enum gsi_channel_state state = channel->state;
504+
enum gsi_channel_state state;
496505
int ret;
497506

507+
state = gsi_channel_state(channel);
498508
if (state != GSI_CHANNEL_STATE_STARTED &&
499509
state != GSI_CHANNEL_STATE_STOP_IN_PROC)
500510
return -EINVAL;
501511

502512
ret = gsi_channel_command(channel, GSI_CH_STOP);
503-
if (ret || channel->state == GSI_CHANNEL_STATE_STOPPED)
513+
514+
/* Channel state will normally have been updated */
515+
state = gsi_channel_state(channel);
516+
if (ret || state == GSI_CHANNEL_STATE_STOPPED)
504517
return ret;
505518

506519
/* We may have to try again if stop is in progress */
507-
if (channel->state == GSI_CHANNEL_STATE_STOP_IN_PROC)
520+
if (state == GSI_CHANNEL_STATE_STOP_IN_PROC)
508521
return -EAGAIN;
509522

510-
dev_err(channel->gsi->dev, "bad channel state (%u) after stop\n",
511-
channel->state);
523+
dev_err(channel->gsi->dev,
524+
"bad channel state (%u) after stop\n", state);
512525

513526
return -EIO;
514527
}
515528

516529
/* Reset a GSI channel in ALLOCATED or ERROR state. */
517530
static void gsi_channel_reset_command(struct gsi_channel *channel)
518531
{
532+
enum gsi_channel_state state;
519533
int ret;
520534

521535
msleep(1); /* A short delay is required before a RESET command */
522536

523-
if (channel->state != GSI_CHANNEL_STATE_STOPPED &&
524-
channel->state != GSI_CHANNEL_STATE_ERROR) {
537+
state = gsi_channel_state(channel);
538+
if (state != GSI_CHANNEL_STATE_STOPPED &&
539+
state != GSI_CHANNEL_STATE_ERROR) {
525540
dev_err(channel->gsi->dev,
526-
"bad channel state (%u) before reset\n",
527-
channel->state);
541+
"bad channel state (%u) before reset\n", state);
528542
return;
529543
}
530544

531545
ret = gsi_channel_command(channel, GSI_CH_RESET);
532-
if (!ret && channel->state != GSI_CHANNEL_STATE_ALLOCATED)
546+
547+
/* Channel state will normally have been updated */
548+
state = gsi_channel_state(channel);
549+
if (!ret && state != GSI_CHANNEL_STATE_ALLOCATED)
533550
dev_err(channel->gsi->dev,
534-
"bad channel state (%u) after reset\n",
535-
channel->state);
551+
"bad channel state (%u) after reset\n", state);
536552
}
537553

538554
/* Deallocate an ALLOCATED GSI channel */
539555
static void gsi_channel_de_alloc_command(struct gsi *gsi, u32 channel_id)
540556
{
541557
struct gsi_channel *channel = &gsi->channel[channel_id];
558+
enum gsi_channel_state state;
542559
int ret;
543560

544-
if (channel->state != GSI_CHANNEL_STATE_ALLOCATED) {
545-
dev_err(gsi->dev, "bad channel state (%u) before dealloc\n",
546-
channel->state);
561+
state = gsi_channel_state(channel);
562+
if (state != GSI_CHANNEL_STATE_ALLOCATED) {
563+
dev_err(gsi->dev,
564+
"bad channel state (%u) before dealloc\n", state);
547565
return;
548566
}
549567

550568
ret = gsi_channel_command(channel, GSI_CH_DE_ALLOC);
551-
if (!ret && channel->state != GSI_CHANNEL_STATE_NOT_ALLOCATED)
552-
dev_err(gsi->dev, "bad channel state (%u) after dealloc\n",
553-
channel->state);
569+
570+
/* Channel state will normally have been updated */
571+
state = gsi_channel_state(channel);
572+
if (!ret && state != GSI_CHANNEL_STATE_NOT_ALLOCATED)
573+
dev_err(gsi->dev,
574+
"bad channel state (%u) after dealloc\n", state);
554575
}
555576

556577
/* Ring an event ring doorbell, reporting the last entry processed by the AP.
@@ -777,6 +798,7 @@ int gsi_channel_start(struct gsi *gsi, u32 channel_id)
777798
int gsi_channel_stop(struct gsi *gsi, u32 channel_id)
778799
{
779800
struct gsi_channel *channel = &gsi->channel[channel_id];
801+
enum gsi_channel_state state;
780802
u32 retries;
781803
int ret;
782804

@@ -786,7 +808,8 @@ int gsi_channel_stop(struct gsi *gsi, u32 channel_id)
786808
* STOP command timed out. We won't stop a channel if stopping it
787809
* was successful previously (so we still want the freeze above).
788810
*/
789-
if (channel->state == GSI_CHANNEL_STATE_STOPPED)
811+
state = gsi_channel_state(channel);
812+
if (state == GSI_CHANNEL_STATE_STOPPED)
790813
return 0;
791814

792815
/* RX channels might require a little time to enter STOPPED state */
@@ -940,7 +963,6 @@ static void gsi_isr_chan_ctrl(struct gsi *gsi)
940963
channel_mask ^= BIT(channel_id);
941964

942965
channel = &gsi->channel[channel_id];
943-
channel->state = gsi_channel_state(gsi, channel_id);
944966

945967
complete(&channel->completion);
946968
}

drivers/net/ipa/gsi.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,7 @@ struct gsi_channel {
113113
u16 tre_count;
114114
u16 event_count;
115115

116-
struct completion completion; /* signals channel state changes */
117-
enum gsi_channel_state state;
116+
struct completion completion; /* signals channel command completion */
118117

119118
struct gsi_ring tre_ring;
120119
u32 evt_ring_id;

0 commit comments

Comments
 (0)