diff options
Diffstat (limited to 'drivers/firewire/core-transaction.c')
-rw-r--r-- | drivers/firewire/core-transaction.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-transaction.c index e0c6cce894cf..85a54da243e2 100644 --- a/drivers/firewire/core-transaction.c +++ b/drivers/firewire/core-transaction.c | |||
@@ -1008,6 +1008,10 @@ static u32 read_state_register(struct fw_card *card) | |||
1008 | /* Bit 8 (cmstr): */ | 1008 | /* Bit 8 (cmstr): */ |
1009 | value |= card->driver->read_csr_reg(card, CSR_STATE_CLEAR); | 1009 | value |= card->driver->read_csr_reg(card, CSR_STATE_CLEAR); |
1010 | 1010 | ||
1011 | /* Bit 10 (abdicate): */ | ||
1012 | if (card->csr_abdicate) | ||
1013 | value |= CSR_STATE_BIT_ABDICATE; | ||
1014 | |||
1011 | return value; | 1015 | return value; |
1012 | } | 1016 | } |
1013 | 1017 | ||
@@ -1041,6 +1045,8 @@ static void handle_registers(struct fw_card *card, struct fw_request *request, | |||
1041 | } else if (tcode == TCODE_WRITE_QUADLET_REQUEST) { | 1045 | } else if (tcode == TCODE_WRITE_QUADLET_REQUEST) { |
1042 | card->driver->write_csr_reg(card, CSR_STATE_CLEAR, | 1046 | card->driver->write_csr_reg(card, CSR_STATE_CLEAR, |
1043 | be32_to_cpu(*data)); | 1047 | be32_to_cpu(*data)); |
1048 | if (*data & cpu_to_be32(CSR_STATE_BIT_ABDICATE)) | ||
1049 | card->csr_abdicate = false; | ||
1044 | } else { | 1050 | } else { |
1045 | rcode = RCODE_TYPE_ERROR; | 1051 | rcode = RCODE_TYPE_ERROR; |
1046 | } | 1052 | } |
@@ -1052,7 +1058,8 @@ static void handle_registers(struct fw_card *card, struct fw_request *request, | |||
1052 | } else if (tcode == TCODE_WRITE_QUADLET_REQUEST) { | 1058 | } else if (tcode == TCODE_WRITE_QUADLET_REQUEST) { |
1053 | card->driver->write_csr_reg(card, CSR_STATE_SET, | 1059 | card->driver->write_csr_reg(card, CSR_STATE_SET, |
1054 | be32_to_cpu(*data)); | 1060 | be32_to_cpu(*data)); |
1055 | /* FIXME: implement abdicate */ | 1061 | if (*data & cpu_to_be32(CSR_STATE_BIT_ABDICATE)) |
1062 | card->csr_abdicate = true; | ||
1056 | } else { | 1063 | } else { |
1057 | rcode = RCODE_TYPE_ERROR; | 1064 | rcode = RCODE_TYPE_ERROR; |
1058 | } | 1065 | } |
@@ -1070,7 +1077,9 @@ static void handle_registers(struct fw_card *card, struct fw_request *request, | |||
1070 | break; | 1077 | break; |
1071 | 1078 | ||
1072 | case CSR_RESET_START: | 1079 | case CSR_RESET_START: |
1073 | if (tcode != TCODE_WRITE_QUADLET_REQUEST) | 1080 | if (tcode == TCODE_WRITE_QUADLET_REQUEST) |
1081 | card->csr_abdicate = false; | ||
1082 | else | ||
1074 | rcode = RCODE_TYPE_ERROR; | 1083 | rcode = RCODE_TYPE_ERROR; |
1075 | break; | 1084 | break; |
1076 | 1085 | ||