NetBSD/sys/dev/ieee1394/sbp2reg.h
jmc 1db8069fe5 First pass (checkpoint checkin) for firewire scsi code.
There are a number of issues here for anyone trying to use this today:

1. On my test drive the command engine on the drive seems to stall after the
   inquire is done. So the mode sense times out for a long time before
   aborting. This obviously needs to be tracked down and fixed.

   However it does do a proper inquire:

scsibus0 at sbpscsi0: 1 target, 1 lun per target
sd0 at scsibus0 target 0 lun 0: <Maxtor, 1394 storage, 60> disk fixed

2. This code is quite ugly in places as debug code was added to test things.
   Definitly needs cleanup/documention in places where it's using command
   structures. The structure for alloc'ing orbs, running them through the
   command engine and getting state back is mostly set but implementation needs
   an overhaul in places.

3. For testing I use the following config options:

fwohci* at cardbus? dev ? function ?    # IEEE1394 Controller
fw*     at fwbus?
options FW_DEBUG
options FWNODE_DEBUG
options P1212_DEBUG
options SBP2_DEBUG
options SBPSCSI_DEBUG
fwnode* at fwbus?
sbpscsi* at fwnode?
scsibus* at sbpscsi?
2002-11-22 16:28:54 +00:00

244 lines
7.9 KiB
C

/* $NetBSD: sbp2reg.h,v 1.2 2002/11/22 16:28:57 jmc Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _DEV_STD_SBP2REG_H_
#define _DEV_STD_SBP2REG_H_
#define SBP2_UNIT_SPEC_ID 0x00609E /* NCITS OUI */
#define SBP2_UNIT_SW_VERSION 0x010483
/* 0x38/8, oui/24
*/
#define SBP2_KEYVALUE_Command_Set_Spec_Id 0x38 /* immediate (OUI) */
/* 0x39/8, oui/24 Unit Directory
*/
#define SBP2_KEYVALUE_Command_Set 0x39 /* immediate (OUI) */
/* 0x54/8, offset/24 Unit Directory
*/
#define SBP2_KEYVALUE_Management_Agent \
P1212_KEYVALUE_Unit_Dependent_Info /* offset */
/* 0x3A/8, reserved/8, msg_ORB_timeout/8, ORB_size/8 Unit Directory
*/
#define SBP2_KEYVALUE_Unit_Characteristics 0x3A /* immediate */
/* 0x3B/8, reserver/8, max_reconnect_hold/16 Unit Directory
*/
#define SBP2_KEYVALUE_Command_Set_Revision 0x3B /* immediate */
/* 0x3C/8, firmware_revision/24 Unit Directory
*/
#define SBP2_KEYVALUE_Firmware_Revision 0x3C /* immediate */
/* 0x3D/8, reserver/8, max_reconnect_hold/16 Unit Directory
*/
#define SBP2_KEYVALUE_Reconnect_Timeout 0x3D /* immediate */
/* 0xD4/8, indirect_offset/24 Unit Directory
*/
#define SBP2_KEYVALUE_Logical_Unit_Directory \
P1212_KEYVALUE_Unit_Dependent_Info /* directory */
/* 0x14/8, reserved/1, ordered/1, reserved/1 Unit Directory
* device_type/5, lun/16
*/
#define SBP2_KEYVALUE_Logical_Unit_Number \
P1212_KEYVALUE_Unit_Dependent_Info /* immediate */
/* 0x8D/8, indirect_offset/24 Unit Directory
*/
#define SBP2_KEYVALUE_Unit_Unique_Id \
P1212_KEYVALUE_Node_Unique_Id /* leaf */
#define SBP2_ORB_LOGIN 0
#define SBP2_ORB_QUERY_LOGINS 1
#define SBP2_ORB_RECONNECT 3
#define SBP2_ORB_LOGOUT 7
/* Max data size in a command orb (add 20 for command section) */
#define SBP2_MAX_ORB 1004
#define SBP2_CMD_ORB_SIZE 32
#define SBP2_MIN_MGMT_OFFSET 0x4000
#define SBP_READ 0x1
#define SBP_WRITE 0x2
#define SBP2_LOGGED_IN 0x1
#define SBP2_MAX_RECONNECT 0xf
#define SBP2_CMDREG_AGENT_STATE 0x00
#define SBP2_CMDREG_AGENT_RESET 0x04
#define SBP2_CMDREG_ORB_POINTER 0x08
#define SBP2_CMDREG_DOORBELL 0x10
#define SBP2_CMDREG_UNSOLICITED_STATUS_ENABLE 0x14
#define SBP2_LOGIN_MAX_RESP 16
#define SBP2_LOGIN_SIZE 32
#define SBP2_STATUS_SIZE 32
#define SBP2_LOGIN_EXCLUSIVE_MASK 0x10000000
#define SBP2_LOGIN_RECONNECT_MASK 0x00f00000
#define SBP2_LOGIN_EXCLUSIVE_SHIFT 28
#define SBP2_LOGIN_RECONNECT_SHIFT 20
#define SBP2_LOGIN_SET_EXCLUSIVE (1 << SBP2_LOGIN_EXCLUSIVE_SHIFT)
#define SBP2_LOGIN_SET_RECONNECT(x) (x << SBP2_LOGIN_RECONNECT_SHIFT)
#define SBP2_LOGINRESP_LENGTH_MASK 0xffff0000
#define SBP2_LOGINRESP_LOGINID_MASK 0x0000ffff
#define SBP2_LOGINRESP_RECONNECT_MASK 0x0000ffff
#define SBP2_LOGINRESP_LENGTH_SHIFT 16
#define SBP2_LOGINRESP_GET_LENGTH(x) ((x & SBP2_LOGINRESP_LENGTH_MASK) >> \
SBP2_LOGINRESP_LENGTH_SHIFT)
#define SBP2_LOGINRESP_GET_LOGINID(x) (x & SBP2_LOGINRESP_LOGINID_MASK)
#define SBP2_LOGINRESP_GET_RECONNECT(x) (x & SBP2_LOGINRESP_RECONNECT_MASK)
#define SBP2_LOGINRESP_CREATE_CMDREG(x,y) (((u_int64_t)x << 32) | y)
#define SBP2_STATUS_REQUEST_COMPLETE 0x0
#define SBP2_STATUS_TRANSPORT_FAIL 0x1
#define SBP2_STATUS_ILLEGAL_REQUEST 0x2
#define SBP2_STATUS_VENDOR_DEPENDENT 0x3
#define SBP2_STATUS_UNSPEC_ERROR 0xff
#define SBP2_STATUS_NOERROR 0x0
#define SBP2_NUM_ALLOC 0x8
#define SBP2_ORB_FMT_SBP2 0x0
#define SBP2_ORB_FMT_RESERVED 0x1
#define SBP2_ORB_FMT_VENDOR 0x2
#define SBP2_ORB_FMT_DUMMY 0x3
#define SBP2_ORB_FMT_SBP2_MASK 0x00000000
#define SBP2_ORB_FMT_RESERVED_MASK 0x20000000
#define SBP2_ORB_FMT_VENDOR_MASK 0x40000000
#define SBP2_ORB_FMT_DUMMY_MASK 0x60000000
#define SBP2_ORB_NULL_POINTER 0x80000000
#define SBP2_ORB_NOTIFY_MASK 0x80000000
#define SBP2_ORB_FMT_MASK 0x60000000
#define SBP2_ORB_RW_MASK 0x08000000
#define SBP2_ORB_SPD_MASK 0x07000000
#define SBP2_ORB_PAYLOAD_MASK 0x00f00000
#define SBP2_ORB_PAGETABLE_MASK 0x00080000
#define SBP2_ORB_PAGESIZE_MASK 0x00070000
#define SBP2_ORB_DATASIZE_MASK 0x0000ffff
#define SBP2_ORB_NOTIFY_SHIFT 31
#define SBP2_ORB_FMT_SHIFT 29
#define SBP2_ORB_RW_SHIFT 27
#define SBP2_ORB_SPD_SHIFT 24
#define SBP2_ORB_PAYLOAD_SHIFT 20
#define SBP2_ORB_PAGETABLE_SHIFT 19
#define SBP2_ORB_PAGESIZE_SHIFT 16
#define SBP2_ORB_DATASIZE_SHIFT 0
#define SBP2_ORB_SET_SPEED(x) ((x << SBP2_ORB_SPD_SHIFT))
#define SBP2_ORB_INIT_STATE 0
#define SBP2_ORB_SENT_STATE 1
#define SBP2_ORB_STATUS_STATE 2
#define SBP2_ORB_NEXT_ORB_STATE 3
#define SBP2_ORB_FREE_STATE 0xff
#define SBP2_STATUS_SRC_MASK 0xc0000000
#define SBP2_STATUS_RESP_MASK 0x30000000
#define SBP2_STATUS_DEAD_MASK 0x08000000
#define SBP2_STATUS_LEN_MASK 0x07000000
#define SBP2_STATUS_STATUS_MASK 0x00ff0000
#define SBP2_STATUS_ORB_HIGH_MASK 0x0000ffff
/* Contained within status if needed. */
#define SBP2_STATUS_OBJECT_MASK 0xc0
#define SBP2_STATUS_BUS_ERROR_MASK 0x0f
#define SBP2_STATUS_SRC_SHIFT 30
#define SBP2_STATUS_RESP_SHIFT 28
#define SBP2_STATUS_DEAD_SHIFT 27
#define SBP2_STATUS_LEN_SHIFT 24
#define SBP2_STATUS_STATUS_SHIFT 16
#define SBP2_STATUS_ORB_HIGH_SHIFT 0
#define SBP2_STATUS_OBJECT_SHIFT 6
#define SBP2_STATUS_BUS_ERROR_SHIFT 0
#define SBP2_STATUS_GET_SRC(x) \
(((x) & SBP2_STATUS_SRC_MASK) >> SBP2_STATUS_SRC_SHIFT)
#define SBP2_STATUS_GET_RESP(x) \
(((x) & SBP2_STATUS_RESP_MASK) >> SBP2_STATUS_RESP_SHIFT)
#define SBP2_STATUS_GET_DEAD(x) \
(((x) & SBP2_STATUS_DEAD_MASK) >> SBP2_STATUS_DEAD_SHIFT)
#define SBP2_STATUS_GET_LEN(x) \
(((x) & SBP2_STATUS_LEN_MASK) >> SBP2_STATUS_LEN_SHIFT)
#define SBP2_STATUS_GET_STATUS(x) \
(((x) & SBP2_STATUS_STATUS_MASK) >> SBP2_STATUS_STATUS_SHIFT)
#define SBP2_STATUS_GET_ORBHIGH(x) \
(((x) & SBP2_STATUS_ORB_HIGH_MASK))
#define SBP2_STATUS_GET_OBJECT(x) \
(((x) & SBP2_STATUS_OBJECT_MASK) >> SBP2_STATUS_OBJECT_SHIFT)
#define SBP2_STATUS_GET_BUS_ERROR(x) \
(((x) & SBP2_STATUS_BUS_ERROR_MASK))
#define SBP2_STATE_RESET 0x0
#define SBP2_STATE_ACTIVE 0x1
#define SBP2_STATE_SUSPENDED 0x2
#define SBP2_STATE_DEAD 0x3
struct sbp2_pte_u {
uint32_t seg_hi_length;
uint32_t seg_lo;
};
struct sbp2_pte_n {
uint32_t seg_hi_length;
uint32_t seg_lo_offset;
};
#endif /* _DEV_STD_SBP2REG_H_ */