blob: 10f1a32751db3e33ab6600b0b9d7c3a63e489d79 [file] [log] [blame]
/*
* libraw1394 - library for raw access to the 1394 bus with the Linux subsystem.
*
* Copyright (C) 1999,2000,2001,2002 Andreas Bombe
*
* This library is licensed under the GNU Lesser General Public License (LGPL),
* version 2.1 or later. See the file COPYING.LIB in the distribution for
* details.
*/
#include <config.h>
#include <errno.h>
#include "raw1394.h"
#include "kernel-raw1394.h"
#include "raw1394_private.h"
#include "ieee1394.h"
raw1394_errcode_t raw1394_get_errcode(struct raw1394_handle *handle)
{
if (!handle) {
return RAW1394_ERROR_INVALID_ARG;
}
if (handle->is_fw)
return handle->mode.fw->err;
else
return handle->mode.ieee1394->err;
}
int ieee1394_errcode_to_errno(raw1394_errcode_t errcode)
{
static const int ack2errno[16] = {
0xdead, /* invalid ack code */
0, /* ack_complete */
0xdead, /* ack_pending, should not be used here */
EAGAIN, /* busy_x, busy_a and busy_b acks */
EAGAIN,
EAGAIN,
0xdead, /* invalid ack codes */
0xdead,
0xdead,
0xdead,
0xdead,
0xdead,
0xdead,
EREMOTEIO, /* ack_data_error */
EPERM, /* ack_type_error */
0xdead /* invalid ack code */
};
static const int rcode2errno[16] = {
0, /* rcode_complete */
0xdead, /* invalid rcodes */
0xdead,
0xdead,
EAGAIN, /* rcode_conflict_error */
EREMOTEIO, /* rcode_data_error */
EPERM, /* rcode_type_error */
EINVAL, /* rcode_address_error */
0xdead, /* invalid rcodes */
0xdead,
0xdead,
0xdead,
0xdead,
0xdead,
0xdead,
0xdead
};
if (!raw1394_internal_err(errcode)) {
if (raw1394_get_ack(errcode) == 0x10
|| raw1394_get_ack(errcode) == L1394_ACK_PENDING)
return rcode2errno[raw1394_get_rcode(errcode)];
else
return ack2errno[raw1394_get_ack(errcode)];
}
switch (raw1394_get_internal(errcode)) {
case RAW1394_ERROR_GENERATION:
case RAW1394_ERROR_SEND_ERROR:
case RAW1394_ERROR_ABORTED:
case RAW1394_ERROR_TIMEOUT:
return EAGAIN;
case RAW1394_ERROR_MEMFAULT:
return EFAULT;
case RAW1394_ERROR_COMPAT:
case RAW1394_ERROR_STATE_ORDER:
case RAW1394_ERROR_INVALID_ARG:
case RAW1394_ERROR_ALREADY:
case RAW1394_ERROR_EXCESSIVE:
case RAW1394_ERROR_UNTIDY_LEN:
default:
return EINVAL;
}
}