Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 206815
b: refs/heads/master
c: 7e0e314
h: refs/heads/master
i:
  206813: 0a07eb4
  206811: 0c50f91
  206807: a64bbad
  206799: ab6751d
  206783: 0226ca6
v: v3
  • Loading branch information
Clemens Ladisch committed Jun 10, 2010
1 parent 31bb49a commit b77f95a
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 4ffb7a6a066e4be4577976d1c08e237c7479770a
refs/heads/master: 7e0e314f198d5048b74c8f0ef9f4c1c02e5ecfc9
3 changes: 2 additions & 1 deletion trunk/drivers/firewire/core-card.c
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,8 @@ static void fw_card_bm_work(struct work_struct *work)

grace = time_after(jiffies, card->reset_jiffies + DIV_ROUND_UP(HZ, 8));

if (is_next_generation(generation, card->bm_generation) ||
if ((is_next_generation(generation, card->bm_generation) &&
!card->bm_abdicate) ||
(card->bm_generation != generation && grace)) {
/*
* This first step is to figure out who is IRM and
Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/firewire/core-topology.c
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,8 @@ void fw_core_handle_bus_reset(struct fw_card *card, int node_id, int generation,
smp_wmb();
card->generation = generation;
card->reset_jiffies = jiffies;
card->bm_abdicate = card->csr_abdicate;
card->csr_abdicate = false;
fw_schedule_bm_work(card, 0);

local_node = build_tree(card, self_ids, self_id_count);
Expand Down
13 changes: 11 additions & 2 deletions trunk/drivers/firewire/core-transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -1008,6 +1008,10 @@ static u32 read_state_register(struct fw_card *card)
/* Bit 8 (cmstr): */
value |= card->driver->read_csr_reg(card, CSR_STATE_CLEAR);

/* Bit 10 (abdicate): */
if (card->csr_abdicate)
value |= CSR_STATE_BIT_ABDICATE;

return value;
}

Expand Down Expand Up @@ -1041,6 +1045,8 @@ static void handle_registers(struct fw_card *card, struct fw_request *request,
} else if (tcode == TCODE_WRITE_QUADLET_REQUEST) {
card->driver->write_csr_reg(card, CSR_STATE_CLEAR,
be32_to_cpu(*data));
if (*data & cpu_to_be32(CSR_STATE_BIT_ABDICATE))
card->csr_abdicate = false;
} else {
rcode = RCODE_TYPE_ERROR;
}
Expand All @@ -1052,7 +1058,8 @@ static void handle_registers(struct fw_card *card, struct fw_request *request,
} else if (tcode == TCODE_WRITE_QUADLET_REQUEST) {
card->driver->write_csr_reg(card, CSR_STATE_SET,
be32_to_cpu(*data));
/* FIXME: implement abdicate */
if (*data & cpu_to_be32(CSR_STATE_BIT_ABDICATE))
card->csr_abdicate = true;
} else {
rcode = RCODE_TYPE_ERROR;
}
Expand All @@ -1070,7 +1077,9 @@ static void handle_registers(struct fw_card *card, struct fw_request *request,
break;

case CSR_RESET_START:
if (tcode != TCODE_WRITE_QUADLET_REQUEST)
if (tcode == TCODE_WRITE_QUADLET_REQUEST)
card->csr_abdicate = false;
else
rcode = RCODE_TYPE_ERROR;
break;

Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/firewire/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ struct fw_packet;
#define FEATURE_PRIORITY_BUDGET 0x01

#define CSR_STATE_BIT_CMSTR (1 << 8)
#define CSR_STATE_BIT_ABDICATE (1 << 10)

struct fw_card_driver {
/*
Expand Down
2 changes: 2 additions & 0 deletions trunk/include/linux/firewire.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ struct fw_card {
int bm_retries;
int bm_generation;
__be32 bm_transaction_data[2];
bool bm_abdicate; /* value of csr_abdicate before last bus reset */
bool csr_abdicate; /* visible in CSR STATE_CLEAR/SET registers */

bool broadcast_channel_allocated;
u32 broadcast_channel;
Expand Down

0 comments on commit b77f95a

Please sign in to comment.