--- os_freebsd.h.orig Sun Sep 5 09:16:07 2004 +++ os_freebsd.h Sat Aug 6 21:08:54 2005 @@ -261,6 +261,262 @@ #endif +#ifdef HAVE_SYS_TW_OSL_IOCTL_H +#include +#else +/* + * Following cut out of tw_osl_types.h + * + */ + +typedef void TW_VOID; +typedef char TW_INT8; +typedef unsigned char TW_UINT8; +typedef short TW_INT16; +typedef unsigned short TW_UINT16; +typedef int TW_INT32; +typedef unsigned int TW_UINT32; +typedef long long TW_INT64; +typedef unsigned long long TW_UINT64; + +/* + * Following cut out of tw_cl_share.h + * + */ + +#pragma pack(1) + +struct tw_cl_event_packet { + TW_UINT32 sequence_id; + TW_UINT32 time_stamp_sec; + TW_UINT16 aen_code; + TW_UINT8 severity; + TW_UINT8 retrieved; + TW_UINT8 repeat_count; + TW_UINT8 parameter_len; + TW_UINT8 parameter_data[98]; + TW_UINT32 event_src; + TW_UINT8 severity_str[20]; +}; + +#pragma pack() + +/* + * Following cut out of tw_cl_fwif.h + * + */ + +#define TWA_FW_CMD_ATA_PASSTHROUGH 0x11 + +#define TWA_SENSE_DATA_LENGTH 18 + +#pragma pack(1) +/* 7000 structures. */ +struct tw_cl_command_init_connect { + TW_UINT8 res1__opcode; /* 3:5 */ + TW_UINT8 size; + TW_UINT8 request_id; + TW_UINT8 res2; + TW_UINT8 status; + TW_UINT8 flags; + TW_UINT16 message_credits; + TW_UINT32 features; + TW_UINT16 fw_srl; + TW_UINT16 fw_arch_id; + TW_UINT16 fw_branch; + TW_UINT16 fw_build; + TW_UINT32 result; +}; + + +/* Structure for downloading firmware onto the controller. */ +struct tw_cl_command_download_firmware { + TW_UINT8 sgl_off__opcode;/* 3:5 */ + TW_UINT8 size; + TW_UINT8 request_id; + TW_UINT8 unit; + TW_UINT8 status; + TW_UINT8 flags; + TW_UINT16 param; + TW_UINT8 sgl[1]; +}; + + +/* Structure for hard resetting the controller. */ +struct tw_cl_command_reset_firmware { + TW_UINT8 res1__opcode; /* 3:5 */ + TW_UINT8 size; + TW_UINT8 request_id; + TW_UINT8 unit; + TW_UINT8 status; + TW_UINT8 flags; + TW_UINT8 res2; + TW_UINT8 param; +}; + + +/* Structure for sending get/set param commands. */ +struct tw_cl_command_param { + TW_UINT8 sgl_off__opcode;/* 3:5 */ + TW_UINT8 size; + TW_UINT8 request_id; + TW_UINT8 host_id__unit; /* 4:4 */ + TW_UINT8 status; + TW_UINT8 flags; + TW_UINT16 param_count; + TW_UINT8 sgl[1]; +}; + + +/* Generic command packet. */ +struct tw_cl_command_generic { + TW_UINT8 sgl_off__opcode;/* 3:5 */ + TW_UINT8 size; + TW_UINT8 request_id; + TW_UINT8 host_id__unit; /* 4:4 */ + TW_UINT8 status; + TW_UINT8 flags; + TW_UINT16 count; /* block cnt, parameter cnt, message credits */ +}; + + +/* Command packet header. */ +struct tw_cl_command_header { + TW_UINT8 sense_data[TWA_SENSE_DATA_LENGTH]; + struct { + TW_INT8 reserved[4]; + TW_UINT16 error; + TW_UINT8 padding; + TW_UINT8 res__severity; /* 5:3 */ + } status_block; + TW_UINT8 err_specific_desc[98]; + struct { + TW_UINT8 size_header; + TW_UINT16 reserved; + TW_UINT8 size_sense; + } header_desc; +}; + + +/* 7000 Command packet. */ +union tw_cl_command_7k { + struct tw_cl_command_init_connect init_connect; + struct tw_cl_command_download_firmware download_fw; + struct tw_cl_command_reset_firmware reset_fw; + struct tw_cl_command_param param; + struct tw_cl_command_generic generic; + TW_UINT8 padding[1024 - sizeof(struct tw_cl_command_header)]; +}; + + +/* 9000 Command Packet. */ +struct tw_cl_command_9k { + TW_UINT8 res__opcode; /* 3:5 */ + TW_UINT8 unit; + TW_UINT16 lun_l4__req_id; /* 4:12 */ + TW_UINT8 status; + TW_UINT8 sgl_offset; /* offset (in bytes) to sg_list, from the + end of sgl_entries */ + TW_UINT16 lun_h4__sgl_entries; + TW_UINT8 cdb[16]; + TW_UINT8 sg_list[872];/* total struct size = + 1024-sizeof(cmd_hdr) */ +}; + + +/* Full command packet. */ +struct tw_cl_command_packet { + struct tw_cl_command_header cmd_hdr; + union { + union tw_cl_command_7k cmd_pkt_7k; + struct tw_cl_command_9k cmd_pkt_9k; + } command; +}; + +#pragma pack() + +/* + * Following cut out of tw_cl_ioctl.h + * + */ + +#pragma pack(1) + +/* Structure used to handle GET/RELEASE LOCK ioctls. */ +struct tw_cl_lock_packet { + TW_UINT32 timeout_msec; + TW_UINT32 time_remaining_msec; + TW_UINT32 force_flag; +}; + + +/* Structure used to handle GET COMPATIBILITY INFO ioctl. */ +struct tw_cl_compatibility_packet { + TW_UINT8 driver_version[32];/* driver version */ + TW_UINT16 working_srl; /* driver & firmware negotiated srl */ + TW_UINT16 working_branch; /* branch # of the firmware that the + driver is compatible with */ + TW_UINT16 working_build; /* build # of the firmware that the + driver is compatible with */ +}; + + +/* Driver understandable part of the ioctl packet built by the API. */ +struct tw_cl_driver_packet { + TW_UINT32 control_code; + TW_UINT32 status; + TW_UINT32 unique_id; + TW_UINT32 sequence_id; + TW_UINT32 os_status; + TW_UINT32 buffer_length; +}; + +#pragma pack() + +/* + * Following cut out of tw_osl_ioctl.h + * + */ + +#pragma pack(1) +/* + * We need the structure below to ensure that the first byte of + * data_buf is not overwritten by the kernel, after we return + * from the ioctl call. Note that cmd_pkt has been reduced + * to an array of 1024 bytes even though it's actually 2048 bytes + * in size. This is because, we don't expect requests from user + * land requiring 2048 (273 sg elements) byte cmd pkts. + */ +typedef struct tw_osli_ioctl_no_data_buf { + struct tw_cl_driver_packet driver_pkt; + TW_VOID *pdata; /* points to data_buf */ + TW_INT8 padding[488 - sizeof(TW_VOID *)]; + struct tw_cl_command_packet cmd_pkt; +} TW_OSLI_IOCTL_NO_DATA_BUF; + +#pragma pack() + +#define TW_OSL_IOCTL_FIRMWARE_PASS_THROUGH \ + _IOWR('T', 202, TW_OSLI_IOCTL_NO_DATA_BUF) + +#pragma pack(1) + +typedef struct tw_osli_ioctl_with_payload { + struct tw_cl_driver_packet driver_pkt; + TW_INT8 padding[488]; + struct tw_cl_command_packet cmd_pkt; + union { + struct tw_cl_event_packet event_pkt; + struct tw_cl_lock_packet lock_pkt; + struct tw_cl_compatibility_packet compat_pkt; + TW_INT8 data_buf[1]; + } payload; +} TW_OSLI_IOCTL_WITH_PAYLOAD; + +#pragma pack() + +#endif + /* The following definitions/macros/prototypes are used for three different interfaces, referred to as "the three cases" below.