The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/hptmv/command.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
    3  *
    4  * Copyright (c) 2004-2005 HighPoint Technologies, Inc.
    5  * All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  *
   16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   26  * SUCH DAMAGE.
   27  *
   28  * $FreeBSD$
   29  */
   30 #ifndef _COMMAND_H_
   31 #define _COMMAND_H_
   32 
   33 /***************************************************************************
   34  * Description: Command
   35  ***************************************************************************/
   36 typedef struct _AtaCommand
   37 {
   38         LBA_T            Lba;          /* Current Logic Disk command: LBA   */
   39         USHORT           nSectors;     /* sector count. May great than 0x80 */  
   40         UCHAR            Command;      /* IDE_COMMAND_READ, _WRITE, _VERIFY */
   41         UCHAR            QueueTag;
   42 } AtaComm, *PAtaComm;
   43 
   44 typedef struct _PassthroughCmd {
   45         BYTE     bFeaturesReg;     /* feature register */
   46         BYTE     bSectorCountReg;  /* IDE sector count register. */
   47         BYTE     bLbaLowReg; /* IDE sector number register. */
   48         BYTE     bLbaMidReg;       /* IDE low order cylinder value. */
   49         BYTE     bLbaHighReg;      /* IDE high order cylinder value. */
   50         BYTE     bDriveHeadReg;    /* IDE drive/head register. */
   51         BYTE     bCommandReg;      /* Actual IDE command. Checked for validity by driver. */
   52         BYTE     nSectors;         /* data transfer */
   53         ADDRESS  pDataBuffer;      /* data buffer */
   54 }
   55 PassthroughCmd;
   56 
   57 /* control commands */
   58 #define CTRL_CMD_REBUILD 1
   59 #define CTRL_CMD_VERIFY  2
   60 #define CTRL_CMD_INIT    3
   61 
   62 /* 
   63  * RAID5 rebuild/verify
   64  *   Rebuild/verify one stripe line.
   65  *   The caller needn't supply a buffer for rebuild.
   66  *   RebuildSectors member will be updated if its previous location is the 
   67  *   begin of this stripe line.
   68  */
   69 typedef struct _R5ControlCmd {
   70         LBA_T  StripeLine;   /* _physical_ stripe line on array */
   71         USHORT Offset;       /* internal use, don't set */
   72         UCHAR  Command;      /* CTRL_CMD_XXX */
   73         UCHAR  reserve1;
   74 }
   75 R5ControlCmd, *PR5ControlCmd;
   76 
   77 /* 
   78  * RAID1 rebuild/verify 
   79  *   Rebuild/verify specified sectors.
   80  *   The caller must supply a valid buffer and a physical SG table (or a
   81  *   pfnBuildSgl routine).
   82  *   For rebuild/initialize, the buffer size should be nSectors<<9;
   83  *   For verify, the buffer size should be (nSectors*2)<<9.
   84  *   RebuildSectors member will be updated if its previous value equals Lba.
   85  */
   86 typedef struct _R1ControlCmd {
   87         LBA_T  Lba;
   88         USHORT nSectors;
   89         UCHAR  Command;      /* CTRL_CMD_XXX */
   90         UCHAR  reserve1;
   91         ADDRESS Buffer;  /* buffer logical address */
   92 #ifdef _MACOSX_
   93         ADDRESS PhysicalAddress;
   94 #endif
   95 }
   96 R1ControlCmd, *PR1ControlCmd;
   97 
   98 typedef struct _Command
   99 {
  100         PVDevice pVDevice;
  101         union{
  102                 /* Ide Command */
  103                 AtaComm Ide;
  104                 PassthroughCmd Passthrough;
  105                 /* Atapi Command */
  106                 UCHAR Atapi[12];
  107                 /* Control command */
  108                 R5ControlCmd R5Control;
  109                 R1ControlCmd R1Control;
  110         } uCmd;
  111         
  112         USHORT  cf_physical_sg: 1;
  113         USHORT  cf_data_in: 1;
  114         USHORT  cf_data_out: 1;
  115         USHORT  cf_atapi: 1;
  116         USHORT  cf_ide_passthrough: 1;
  117         USHORT  cf_control: 1;
  118 
  119         /* return status */
  120         UCHAR   Result;
  121         /* retry count */
  122         UCHAR   RetryCount;
  123 
  124         /* S/G table address, if already prepared */
  125         FPSCAT_GATH pSgTable;
  126         
  127         /* called if pSgTable is invalid. */
  128         int (* HPTLIBAPI pfnBuildSgl)(_VBUS_ARG PCommand pCmd, FPSCAT_GATH pSgTable, int logical);
  129         
  130         /* called when this command is finished */
  131         void (* HPTLIBAPI pfnCompletion)(_VBUS_ARG PCommand pCmd);
  132         
  133         /* pointer to original command */
  134         void *pOrgCommand;
  135 
  136 
  137         /* scratch data area */
  138         union {
  139                 struct {
  140                         LBA_T      StartLBA;
  141                         UCHAR      FirstMember;    /* the sequence number of the first member */
  142                         UCHAR      LastMember;     /* the sequence number of the last member */
  143                         USHORT     LastSectors;    /* the number of sectors for the last member */
  144                         USHORT     FirstSectors;   /* the number of sectors for the first member */
  145                         USHORT     FirstOffset;    /* the offset from the StartLBA for the first member */
  146                         USHORT     AllMemberBlocks;/* the number of sectors for all member */
  147                         USHORT     WaitInterrupt;  /* bit map the members who wait interrupt */
  148                         UCHAR      InSameLine;     /* if the start and end on the same line */
  149                         UCHAR      pad1;
  150                 } array;
  151                 struct {
  152                         LBA_T      StartLBA;
  153                         USHORT     FirstSectors;   /* the number of sectors for the first member */
  154                         USHORT     FirstOffset;    /* the offset from the StartLBA for the first member */
  155                         USHORT     WaitInterrupt;  /* bit map the members who wait interrupt */
  156                         USHORT     r5_gap;         /* see raid5.c */
  157                         UCHAR      ParDiskNo;      /* parity for startLba */
  158                         UCHAR      BadDiskNo;
  159                         UCHAR      FirstMember;
  160                         UCHAR      pad1;
  161                 } r5;
  162                 struct {
  163                         PCommand pCmd1;
  164                         PCommand pCmd2;
  165                 } r5split;
  166 #ifdef _RAID5N_
  167                 struct {
  168                         ULONG dummy[2]; /* uScratch.wait shall be moved out uScratch.
  169                                                            now just fix it thisway */
  170                         struct range_lock *range_lock;
  171                         struct stripe *stripes[5]; 
  172                         UCHAR nstripes;
  173                         UCHAR finished_stripes;
  174                         USHORT pad2;
  175                         /* for direct-read: */
  176                         struct {
  177                                 UCHAR  cmds;
  178                                 UCHAR  finished;
  179                                 UCHAR  first;
  180                                 UCHAR  parity;
  181                                 LBA_T  base;
  182                                 USHORT firstoffset;
  183                                 USHORT firstsectors;
  184                         } dr;
  185                 } r5n2;
  186 #endif
  187                 struct {
  188                         ULONG WordsLeft;
  189                         FPSCAT_GATH pPIOSg;
  190                         void (* HPTLIBAPI pfnOrgDone)(_VBUS_ARG PCommand pCmd);
  191 #ifdef SUPPORT_HPT584
  192                         UCHAR cmd;
  193 #endif
  194                 } disk;
  195                 struct {
  196                         PCommand pNext;
  197                         void (* HPTLIBAPI WaitEntry)(_VBUS_ARG PCommand pCmd);
  198                 } wait;
  199                 
  200                 struct {
  201                         PVOID prdAddr;
  202                         ULONG cmd_priv;
  203                         USHORT responseFlags;
  204                         UCHAR  bIdeStatus;
  205                         UCHAR  errorRegister;
  206                 } sata_param;
  207         } uScratch;
  208 } Command;
  209 
  210 /***************************************************************************
  211  * command return value
  212  ***************************************************************************/
  213 #define   RETURN_PENDING             0
  214 #define   RETURN_SUCCESS             1
  215 #define   RETURN_BAD_DEVICE          2
  216 #define   RETURN_BAD_PARAMETER       3
  217 #define   RETURN_WRITE_NO_DRQ        4
  218 #define   RETURN_DEVICE_BUSY         5
  219 #define   RETURN_INVALID_REQUEST     6
  220 #define   RETURN_SELECTION_TIMEOUT   7
  221 #define   RETURN_IDE_ERROR           8
  222 #define   RETURN_NEED_LOGICAL_SG     9
  223 #define   RETURN_NEED_PHYSICAL_SG    10
  224 #define   RETURN_RETRY               11
  225 #define   RETURN_DATA_ERROR          12
  226 #define   RETURN_BUS_RESET           13
  227 #define   RETURN_BAD_TRANSFER_LENGTH 14
  228 
  229 typedef void (* HPTLIBAPI DPC_PROC)(_VBUS_ARG void *);
  230 typedef struct _dpc_routine {
  231         DPC_PROC proc;
  232         void *arg;
  233 }
  234 DPC_ROUTINE;
  235 
  236 /*
  237  * MAX_QUEUE_COMM is defined in platform related compiler.h
  238  * to specify the maximum requests allowed (for each VBus) from system.
  239  *
  240  * Maximum command blocks needed for each VBus:
  241  *   Each OS command requests 1+MAX_MEMBERS*2 command blocks (RAID1/0 case)
  242  *   This space is allocated by platform dependent part, either static or 
  243  *   dynamic, continuous or non-continuous.
  244  *   The code only needs _vbus_(pFreeCommands) to be set.
  245  *
  246  * PendingRoutines[] size:
  247  *   Each command may invoke CallAfterReturn once.
  248  *
  249  * IdleRoutines[] size:
  250  *   Each command may invoke CallWhenIdle once.
  251  */
  252 #define MAX_COMMAND_BLOCKS_FOR_EACH_VBUS (MAX_QUEUE_COMM * (1+MAX_MEMBERS*2) + 1)
  253 #define MAX_PENDING_ROUTINES  (MAX_COMMAND_BLOCKS_FOR_EACH_VBUS+1)
  254 #define MAX_IDLE_ROUTINES     (MAX_COMMAND_BLOCKS_FOR_EACH_VBUS+1)
  255 
  256 #define mWaitingForIdle(pVBus) ((pVBus)->IdleRoutinesFirst!=(pVBus)->IdleRoutinesLast)
  257 
  258 PCommand HPTLIBAPI AllocateCommand(_VBUS_ARG0);
  259 void FASTCALL FreeCommand(_VBUS_ARG PCommand pCmd);
  260 
  261 void FASTCALL CallAfterReturn(_VBUS_ARG DPC_PROC proc, void *arg);
  262 void HPTLIBAPI CheckPendingCall(_VBUS_ARG0);
  263 void FASTCALL CallWhenIdle(_VBUS_ARG DPC_PROC proc, void *arg);
  264 void HPTLIBAPI CheckIdleCall(_VBUS_ARG0);
  265 
  266 void HPTLIBAPI AddToWaitingList(PCommand *ppList, PCommand pCmd);
  267 void HPTLIBAPI DoWaitingList(_VBUS_ARG PCommand *ppList);
  268 
  269 #endif

Cache object: 613ed257d504e0f0b208496e799329ff


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.