/* -*- c++ -*- */ /* * Copyright 2007 Free Software Foundation, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef INCLUDED_DBSM_H #define INCLUDED_DBSM_H /* * Double Buffering State Machine */ #include #include struct _dbsm; typedef struct _dbsm dbsm_t; /* * pointer to function that does packet inspection. * * If one of these returns true, it means that the s/w * handled that packet, and that it should NOT be passed * on to the normal destination port. */ typedef bool (*inspector_t)(dbsm_t *sm, int buf_this); bool dbsm_nop_inspector(dbsm_t *sm, int buf_this); // returns false typedef struct { uint16_t port; uint16_t first_line; uint16_t last_line; } buf_cmd_args_t; /*! * double buffer state machine */ struct _dbsm { uint8_t buf0; // Must be even. This machine uses buf0 and buf0+1 uint8_t running; uint8_t rx_idle; uint8_t tx_idle; buf_cmd_args_t recv_args; buf_cmd_args_t send_args; inspector_t inspect; uint32_t precomputed_receive_to_buf_ctrl_word[2]; uint32_t precomputed_send_from_buf_ctrl_word[2]; int last_line_adj; }; void dbsm_init(dbsm_t *sm, int buf0, const buf_cmd_args_t *recv, const buf_cmd_args_t *send, inspector_t inspect); void dbsm_start(dbsm_t *sm); void dbsm_stop(dbsm_t *sm); void dbsm_process_status(dbsm_t *sm, uint32_t status); void dbsm_handle_tx_underrun(dbsm_t *sm); void dbsm_handle_rx_overrun(dbsm_t *sm); /* * The cpu calls this when it want to ensure that it can send a buffer * to the same destination being used by this state machine. * * If neither buffer is EMPTYING it returns immediately. If a buffer * is EMPYTING, it waits for the h/w to transition to the DONE or * ERROR state. * * When this function returns, the caller queues it's buffer and busy * waits for it to complete. */ void dbsm_wait_for_opening(dbsm_t *sm); #endif /* INCLUDED_DBSM_H */