mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 20:51:44 +00:00
firewire: sbp2: fix status reception
Per SBP-2 clause 5.3, a target shall store 8...32 bytes of status information. Trailing zeros after the first 8 bytes don't need to be stored, they are implicit. Fix the status write handler to clear all unwritten status data. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
This commit is contained in:
parent
85cb9b6864
commit
094614fc14
@ -425,19 +425,20 @@ static void sbp2_status_write(struct fw_card *card, struct fw_request *request,
|
||||
struct sbp2_logical_unit *lu = callback_data;
|
||||
struct sbp2_orb *orb;
|
||||
struct sbp2_status status;
|
||||
size_t header_size;
|
||||
unsigned long flags;
|
||||
|
||||
if (tcode != TCODE_WRITE_BLOCK_REQUEST ||
|
||||
length == 0 || length > sizeof(status)) {
|
||||
length < 8 || length > sizeof(status)) {
|
||||
fw_send_response(card, request, RCODE_TYPE_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
header_size = min(length, 2 * sizeof(u32));
|
||||
fw_memcpy_from_be32(&status, payload, header_size);
|
||||
if (length > header_size)
|
||||
memcpy(status.data, payload + 8, length - header_size);
|
||||
status.status = be32_to_cpup(payload);
|
||||
status.orb_low = be32_to_cpup(payload + 4);
|
||||
memset(status.data, 0, sizeof(status.data));
|
||||
if (length > 8)
|
||||
memcpy(status.data, payload + 8, length - 8);
|
||||
|
||||
if (STATUS_GET_SOURCE(status) == 2 || STATUS_GET_SOURCE(status) == 3) {
|
||||
fw_notify("non-orb related status write, not handled\n");
|
||||
fw_send_response(card, request, RCODE_COMPLETE);
|
||||
|
Loading…
Reference in New Issue
Block a user