/*      $NetBSD: rf_desc.h,v 1.22 2021/07/23 02:35:14 oster Exp $       */
/*
* Copyright (c) 1995 Carnegie-Mellon University.
* All rights reserved.
*
* Author: Mark Holland
*
* Permission to use, copy, modify and distribute this software and
* its documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
* FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
*  Software Distribution Coordinator  or  [email protected]
*  School of Computer Science
*  Carnegie Mellon University
*  Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*/

#ifndef _RF__RF_DESC_H_
#define _RF__RF_DESC_H_

#include <dev/raidframe/raidframevar.h>

#include "rf_archs.h"
#include "rf_etimer.h"
#include "rf_dag.h"
#include "rf_layout.h"

struct RF_RaidReconDesc_s {
       RF_Raid_t *raidPtr;     /* raid device descriptor */
       RF_RowCol_t col;        /* col of failed disk */
       RF_RaidDisk_t *spareDiskPtr;    /* describes target disk for recon
                                        * (not used in dist sparing) */
       int     numDisksDone;   /* the number of surviving disks that have
                                * completed their work */
       RF_RowCol_t scol;       /* col ID of the spare disk (not used in dist
                                * sparing) */
       /*
        * Prevent recon from hogging CPU
        */
       RF_Etimer_t recon_exec_timer;
       RF_uint64 reconExecTimerRunning;
       RF_uint64 reconExecTicks;
       RF_uint64 maxReconExecTicks;

#if RF_RECON_STATS > 0
       RF_uint64 hsStallCount; /* head sep stall count */
       RF_uint64 numReconExecDelays;
       RF_uint64 numReconEventWaits;
#endif                          /* RF_RECON_STATS > 0 */
       RF_RaidReconDesc_t *next;
};

struct RF_RaidAccessDesc_s {
       RF_Raid_t *raidPtr;     /* raid device descriptor */
       RF_IoType_t type;       /* read or write */
       RF_RaidAddr_t raidAddress;      /* starting address in raid address
                                        * space */
       RF_SectorCount_t numBlocks;     /* number of blocks (sectors) to
                                        * transfer */
       RF_StripeCount_t numStripes;    /* number of stripes involved in
                                        * access */
       void *bufPtr;           /* pointer to data buffer */
       RF_RaidAccessFlags_t flags;     /* flags controlling operation */
       int     state;          /* index into states telling how far along the
                                * RAID operation has gotten */
       const RF_AccessState_t *states; /* array of states to be run */
       int     status;         /* pass/fail status of the last operation */
       int     numRetries;     /* number of times this IO has been attempted */
       RF_DagList_t *dagList;  /* list of dag lists, one list per stripe */
       RF_VoidPointerListElem_t *iobufs; /* iobufs that need to be cleaned
                                            up at the end of this IO */
       RF_VoidPointerListElem_t *stripebufs; /* stripe buffers that need to
                                                be cleaned up at the end of
                                                this IO */
       RF_AccessStripeMapHeader_t *asmap;      /* the asm for this I/O */
       struct buf *bp;         /* buf pointer for this RAID acc */
       RF_AccTraceEntry_t tracerec;    /* perf monitoring information for a
                                        * user access (not for dag stats) */
       void    (*callbackFunc) (void *);       /* callback function for this
                                                * I/O */
       void   *callbackArg;    /* arg to give to callback func */
       RF_RaidAccessDesc_t *next;
       RF_Etimer_t timer;      /* used for timing this access */
};
#endif                          /* !_RF__RF_DESC_H_ */