/* * 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 #include #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; } }