From: SVN U. <dm...@li...> - 2002-11-07 02:07:06
|
Author: dmaas Date: 2002-11-06 21:06:56 -0500 (Wed, 06 Nov 2002) New Revision: 92 Modified: branches/rawiso/src/eventloop.c branches/rawiso/src/iso.c branches/rawiso/src/kernel-raw1394.h branches/rawiso/src/raw1394.h Log: rawiso update - switch to read() event for isochronous activity Modified: branches/rawiso/src/raw1394.h ============================================================================== --- branches/rawiso/src/raw1394.h (original) +++ branches/rawiso/src/raw1394.h 2002-11-06 21:06:58.000000000 -0500 @@ -89,13 +89,6 @@ int raw1394_loop_iterate(raw1394handle_t handle); /* - * Same as raw1394_loop_iterate, except return after 'timeout' - * milliseconds if no activity has occurred. A timeout of 0 returns - * immediately; a timeout of -1 blocks indefinitely. - */ -int raw1394_loop_iterate_timeout(raw1394handle_t handle, int timeout); - -/* * Set the handler that will be called when a bus reset message is encountered. * The default action is to just call raw1394_update_generation(). Returns old * handler. @@ -238,7 +231,7 @@ /* return from raw1394_loop_iterate() immediately, which will return an error */ RAW1394_ISO_ERROR = 2, }; - + typedef int (*raw1394_iso_xmit_handler_t)(raw1394handle_t, unsigned char *data, unsigned int *len, Modified: branches/rawiso/src/iso.c ============================================================================== --- branches/rawiso/src/iso.c (original) +++ branches/rawiso/src/iso.c 2002-11-06 21:06:58.000000000 -0500 @@ -226,7 +226,7 @@ } -static int _raw1394_iso_xmit_queue_packets(raw1394handle_t handle, unsigned int n_packets) +static int _raw1394_iso_xmit_queue_packets(raw1394handle_t handle) { struct raw1394_iso_status *stat = &handle->iso_status; int retval = 0, packets_done = 0; @@ -237,10 +237,8 @@ if(!handle->iso_xmit_handler) return -1; - if(stat->n_packets < n_packets) - return -1; - - for(packets_done = 0; packets_done < n_packets; packets_done++) { + while(stat->n_packets > 0) { + enum raw1394_iso_disposition disp; unsigned char *packet_data; struct raw1394_iso_packet_info *info; unsigned int len; @@ -254,14 +252,11 @@ + stat->packet_info_offset); /* call handler */ - if(handle->iso_xmit_handler(handle, - packet_data, - &len, &tag, &sy, - info->cycle, - _raw1394_iso_dropped(handle))) { - retval = -1; - break; - } + disp = handle->iso_xmit_handler(handle, + packet_data, + &len, &tag, &sy, + info->cycle, + _raw1394_iso_dropped(handle)); /* check if packet is too long */ if(len > stat->config.max_packet_size) { @@ -277,6 +272,14 @@ /* advance packet cursors and cycle counter */ stat->n_packets--; stat->first_packet = (stat->first_packet + 1) % stat->config.buf_packets; + packets_done++; + + if(disp == RAW1394_ISO_DEFER) { + break; + } else if(disp == RAW1394_ISO_ERROR) { + retval = -1; + break; + } } if(packets_done > 0) { @@ -335,7 +338,7 @@ } } -static int _raw1394_iso_recv_packets(raw1394handle_t handle, unsigned int n_packets) +static int _raw1394_iso_recv_packets(raw1394handle_t handle) { struct raw1394_iso_status *stat = &handle->iso_status; struct raw1394_iso_packet_info *info; @@ -348,13 +351,11 @@ if(!handle->iso_recv_handler) return -1; - if(stat->n_packets < n_packets) - return -1; - - for(packets_done = 0; packets_done < n_packets; packets_done++) { + while(stat->n_packets > 0) { unsigned char *packet_data; struct raw1394_iso_packet_info *info; - + enum raw1394_iso_disposition disp; + packet_data = handle->iso_buffer + stat->first_packet * stat->buf_stride + stat->packet_data_offset; @@ -363,19 +364,24 @@ + stat->packet_info_offset); /* call handler */ - if(handle->iso_recv_handler(handle, - packet_data, - info->len, info->channel, - info->tag, info->sy, - info->cycle, - _raw1394_iso_dropped(handle))) { - retval = -1; - break; - } - + disp = handle->iso_recv_handler(handle, + packet_data, + info->len, info->channel, + info->tag, info->sy, + info->cycle, + _raw1394_iso_dropped(handle)); + /* advance packet cursors */ stat->n_packets--; stat->first_packet = (stat->first_packet + 1) % stat->config.buf_packets; + packets_done++; + + if(disp == RAW1394_ISO_DEFER) { + break; + } else if(disp == RAW1394_ISO_ERROR) { + retval = -1; + break; + } } if(packets_done > 0) { @@ -401,9 +407,9 @@ handle->iso_packets_dropped += handle->iso_status.overflows; if(handle->iso_xmit_handler) { - return _raw1394_iso_xmit_queue_packets(handle, handle->iso_status.n_packets); + return _raw1394_iso_xmit_queue_packets(handle); } else if(handle->iso_recv_handler) { - return _raw1394_iso_recv_packets(handle, handle->iso_status.n_packets); + return _raw1394_iso_recv_packets(handle); } return 0; Modified: branches/rawiso/src/eventloop.c ============================================================================== --- branches/rawiso/src/eventloop.c (original) +++ branches/rawiso/src/eventloop.c 2002-11-06 21:06:58.000000000 -0500 @@ -2,59 +2,33 @@ * libraw1394 - library for raw access to the 1394 bus with the Linux subsystem. * * Copyright (C) 1999,2000,2001,2002 Andreas Bombe + * 2002 Manfred Weihs <we...@ic...> + * 2002 Christian Toegel <chr...@gm...> * * 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. + * + * + * Contributions: + * + * Manfred Weihs <we...@ic...> + * address range mapping + * Christian Toegel <chr...@gm...> + * address range mapping */ #include <config.h> #include <unistd.h> #include <byteswap.h> -#include <sys/poll.h> - #include "raw1394.h" #include "kernel-raw1394.h" #include "raw1394_private.h" -/* - * This is a bit complicated because the read/write interface and the ISO - * interface are essentially two independent streams of input. - * - * poll() on the fd will return POLLIN for pending read activity, and - * POLLPRI for pending ISO activity. - */ - -static int do_poll(struct raw1394_handle *handle, int timeout, int *read_event, int *iso_event) -{ - int ret; - struct pollfd pfd[1]; - - pfd[0].fd = handle->fd; - pfd[0].events = POLLIN | POLLPRI; - pfd[0].revents = 0; - - *read_event = 0; - *iso_event = 0; - - if(poll(pfd, 1, timeout) < 0) - return -1; - - if(pfd[0].revents & POLLIN) { - *read_event = 1; - } - - if(pfd[0].revents & POLLPRI) { - *iso_event = 1; - } - - return 0; -} - /** - * raw1394_loop_iterate_timeout - get and process one event message + * raw1394_loop_iterate - get and process one event message * * Get one new message through handle and process it with the registered message * handler. This function will return %-1 for an error or the return value of @@ -64,84 +38,67 @@ * to wait for their completion, some handler return values may get lost if you * use these. **/ -int raw1394_loop_iterate_timeout(struct raw1394_handle *handle, int timeout) +int raw1394_loop_iterate(struct raw1394_handle *handle) { - int read_event, iso_event; - - /* see what kind of input is pending */ - if(do_poll(handle, timeout, &read_event, &iso_event)) + struct raw1394_request *req = &handle->req; + int retval = 0, channel; + + if (read(handle->fd, req, sizeof(*req)) < 0) { return -1; - - /* handle isochronous processing */ - if(iso_event) - return _raw1394_iso_iterate(handle); - - /* handle asynchronous event */ - if(read_event) { - struct raw1394_request *req = &handle->req; - int retval = 0, channel; + } - if (read(handle->fd, req, sizeof(*req)) < 0) { - return -1; + switch (req->type) { + case RAW1394_REQ_BUS_RESET: + if (handle->protocol_version == 3) { + handle->num_of_nodes = req->misc & 0xffff; + handle->local_id = req->misc >> 16; + } else { + handle->num_of_nodes = req->misc & 0xff; + handle->irm_id = ((req->misc >> 8) & 0xff) | 0xffc0; + handle->local_id = req->misc >> 16; } - - switch (req->type) { - case RAW1394_REQ_BUS_RESET: - if (handle->protocol_version == 3) { - handle->num_of_nodes = req->misc & 0xffff; - handle->local_id = req->misc >> 16; - } else { - handle->num_of_nodes = req->misc & 0xff; - handle->irm_id = ((req->misc >> 8) & 0xff) | 0xffc0; - handle->local_id = req->misc >> 16; - } - - if (handle->bus_reset_handler) { - retval = handle->bus_reset_handler(handle, - req->generation); - } - break; - - case RAW1394_REQ_ISO_RECEIVE: - channel = (handle->buffer[0] >> 8) & 0x3f; + + if (handle->bus_reset_handler) { + retval = handle->bus_reset_handler(handle, + req->generation); + } + break; + + case RAW1394_REQ_ISO_RECEIVE: + channel = (handle->buffer[0] >> 8) & 0x3f; #ifndef WORDS_BIGENDIAN - handle->buffer[0] = bswap_32(handle->buffer[0]); + handle->buffer[0] = bswap_32(handle->buffer[0]); #endif + + if (handle->iso_handler[channel]) { + retval = handle->iso_handler[channel](handle, channel, + req->length, + handle->buffer); + } + break; - if (handle->iso_handler[channel]) { - retval = handle->iso_handler[channel](handle, channel, - req->length, - handle->buffer); - } - break; - - case RAW1394_REQ_FCP_REQUEST: - if (handle->fcp_handler) { - retval = handle->fcp_handler(handle, req->misc & 0xffff, - req->misc >> 16, - req->length, - (char *)handle->buffer); - } - break; - - default: - if (handle->tag_handler) { - retval = handle->tag_handler(handle, req->tag, - req->error); - } - break; + case RAW1394_REQ_FCP_REQUEST: + if (handle->fcp_handler) { + retval = handle->fcp_handler(handle, req->misc & 0xffff, + req->misc >> 16, + req->length, + (char *)handle->buffer); } - - return retval; + break; + + case RAW1394_REQ_RAWISO_ACTIVITY: + retval = _raw1394_iso_iterate(handle); + break; + + default: + if (handle->tag_handler) { + retval = handle->tag_handler(handle, req->tag, + req->error); + } + break; } - - return 0; -} - -int raw1394_loop_iterate(struct raw1394_handle *handle) -{ - /* block indefinitely */ - return raw1394_loop_iterate_timeout(handle, -1); + + return retval; } /** Modified: branches/rawiso/src/kernel-raw1394.h ============================================================================== --- branches/rawiso/src/kernel-raw1394.h (original) +++ branches/rawiso/src/kernel-raw1394.h 2002-11-06 21:06:58.000000000 -0500 @@ -36,10 +36,11 @@ #define RAW1394_REQ_PHYPACKET 500 /* kernel to user */ -#define RAW1394_REQ_BUS_RESET 10000 -#define RAW1394_REQ_ISO_RECEIVE 10001 -#define RAW1394_REQ_FCP_REQUEST 10002 -#define RAW1394_REQ_ARM 10003 +#define RAW1394_REQ_BUS_RESET 10000 +#define RAW1394_REQ_ISO_RECEIVE 10001 +#define RAW1394_REQ_FCP_REQUEST 10002 +#define RAW1394_REQ_ARM 10003 +#define RAW1394_REQ_RAWISO_ACTIVITY 10004 /* error codes */ #define RAW1394_ERROR_NONE 0 @@ -92,28 +93,30 @@ __u8 name[32]; }; +#ifdef __KERNEL__ typedef struct arm_request { nodeid_t destination_nodeid; nodeid_t source_nodeid; nodeaddr_t destination_offset; - unsigned char tlabel; - unsigned char tcode; + u8 tlabel; + u8 tcode; u_int8_t extended_transaction_code; u_int32_t generation; - unsigned short buffer_length; - unsigned char *buffer; + arm_length_t buffer_length; + byte_t *buffer; } *arm_request_t; typedef struct arm_response { int response_code; - unsigned short buffer_length; - unsigned char *buffer; + arm_length_t buffer_length; + byte_t *buffer; } *arm_response_t; typedef struct arm_request_response { struct arm_request *request; struct arm_response *response; } *arm_request_response_t; +#endif /* rawiso API */ |