Index: sys/dev/pci/twa.c *************** *** 448,455 **** for (i = 0; (pci_twa_products[i].product_id); i++) { entry = &pci_twa_products[i]; if (entry->product_id == PCI_PRODUCT(pa->pa_id)) { - aprint_normal("%s: (rev. 0x%02x)\n", - entry->name, PCI_REVISION(pa->pa_class)); return (1); } } --- 448,453 ---- *************** *** 698,707 **** tr_9k_cmd->command.opcode = TWA_OP_EXECUTE_SCSI_COMMAND; tr_9k_cmd->unit = lunid; ! tr_9k_cmd->request_id = tr->tr_request_id; tr_9k_cmd->status = 0; tr_9k_cmd->sgl_offset = 16; ! tr_9k_cmd->sgl_entries = 1; /* create the CDB here */ tr_9k_cmd->cdb[0] = INQUIRY; tr_9k_cmd->cdb[1] = ((lunid << 5) & 0x0e); --- 696,705 ---- tr_9k_cmd->command.opcode = TWA_OP_EXECUTE_SCSI_COMMAND; tr_9k_cmd->unit = lunid; ! tr_9k_cmd->request_id = htole16(tr->tr_request_id); tr_9k_cmd->status = 0; tr_9k_cmd->sgl_offset = 16; ! tr_9k_cmd->sgl_entries = htole16(1); /* create the CDB here */ tr_9k_cmd->cdb[0] = INQUIRY; tr_9k_cmd->cdb[1] = ((lunid << 5) & 0x0e); *************** *** 756,765 **** tr_9k_cmd->command.opcode = TWA_OP_EXECUTE_SCSI_COMMAND; tr_9k_cmd->unit = lunid; ! tr_9k_cmd->request_id = tr->tr_request_id; tr_9k_cmd->status = 0; tr_9k_cmd->sgl_offset = 16; ! tr_9k_cmd->sgl_entries = 1; /* create the CDB here */ tr_9k_cmd->cdb[0] = READ_CAPACITY_16; tr_9k_cmd->cdb[1] = ((lunid << 5) & 0x0e) | SRC16_SERVICE_ACTION; --- 754,763 ---- tr_9k_cmd->command.opcode = TWA_OP_EXECUTE_SCSI_COMMAND; tr_9k_cmd->unit = lunid; ! tr_9k_cmd->request_id = htole16(tr->tr_request_id); tr_9k_cmd->status = 0; tr_9k_cmd->sgl_offset = 16; ! tr_9k_cmd->sgl_entries = htole16(1); /* create the CDB here */ tr_9k_cmd->cdb[0] = READ_CAPACITY_16; tr_9k_cmd->cdb[1] = ((lunid << 5) & 0x0e) | SRC16_SERVICE_ACTION; *************** *** 767,779 **** error = twa_immediate_request(tr, TWA_REQUEST_TIMEOUT_PERIOD); if (error == 0) { - #if BYTE_ORDER == BIG_ENDIAN - array_size = bswap64(_8btol( - ((struct scsipi_read_capacity_16_data *)tr->tr_data->addr) + 1); - #else array_size = _8btol(((struct scsipi_read_capacity_16_data *) tr->tr_data)->addr) + 1; - #endif } return (array_size); } --- 765,772 ---- *************** *** 797,806 **** tr_9k_cmd->command.opcode = TWA_OP_EXECUTE_SCSI_COMMAND; tr_9k_cmd->unit = lunid; ! tr_9k_cmd->request_id = tr->tr_request_id; tr_9k_cmd->status = 0; tr_9k_cmd->sgl_offset = 16; ! tr_9k_cmd->sgl_entries = 1; /* create the CDB here */ tr_9k_cmd->cdb[0] = SCSI_REQUEST_SENSE; tr_9k_cmd->cdb[1] = ((lunid << 5) & 0x0e); --- 790,799 ---- tr_9k_cmd->command.opcode = TWA_OP_EXECUTE_SCSI_COMMAND; tr_9k_cmd->unit = lunid; ! tr_9k_cmd->request_id = htole16(tr->tr_request_id); tr_9k_cmd->status = 0; tr_9k_cmd->sgl_offset = 16; ! tr_9k_cmd->sgl_entries = htole16(1); /* create the CDB here */ tr_9k_cmd->cdb[0] = SCSI_REQUEST_SENSE; tr_9k_cmd->cdb[1] = ((lunid << 5) & 0x0e); *************** *** 1281,1287 **** break; cmd_hdr = (struct twa_command_header *)(tr->tr_data); ! if ((cmd_hdr->status_block.error) /* aen_code */ == TWA_AEN_QUEUE_EMPTY) break; (void)twa_enqueue_aen(sc, cmd_hdr); --- 1274,1280 ---- break; cmd_hdr = (struct twa_command_header *)(tr->tr_data); ! if (le16toh(cmd_hdr->status_block.error) /* aen_code */ == TWA_AEN_QUEUE_EMPTY) break; (void)twa_enqueue_aen(sc, cmd_hdr); *************** *** 1678,1686 **** twa_fillin_sgl(struct twa_sg *sgl, bus_dma_segment_t *segs, int nsegments) { int i; for (i = 0; i < nsegments; i++) { ! sgl[i].address = segs[i].ds_addr; ! sgl[i].length = (uint32_t)(segs[i].ds_len); } } --- 1671,1681 ---- twa_fillin_sgl(struct twa_sg *sgl, bus_dma_segment_t *segs, int nsegments) { int i; + for (i = 0; i < nsegments; i++) { ! /* XXX Should not use bus_addr_t here. */ ! sgl[i].address = htole32(segs[i].ds_addr); ! sgl[i].length = htole32(segs[i].ds_len); } } *************** *** 1727,1733 **** if (tr->tr_cmd_pkt_type & TWA_CMD_PKT_TYPE_9K) { cmd9k = &(cmdpkt->command.cmd_pkt_9k); twa_fillin_sgl(&(cmd9k->sg_list[0]), segs, nsegments); ! cmd9k->sgl_entries += nsegments - 1; } else { /* It's a 7000 command packet. */ cmd7k = &(cmdpkt->command.cmd_pkt_7k); --- 1722,1729 ---- if (tr->tr_cmd_pkt_type & TWA_CMD_PKT_TYPE_9K) { cmd9k = &(cmdpkt->command.cmd_pkt_9k); twa_fillin_sgl(&(cmd9k->sg_list[0]), segs, nsegments); ! cmd9k->sgl_entries = ! htole16(le16toh(cmd9k->sgl_entries) + nsegments - 1); } else { /* It's a 7000 command packet. */ cmd7k = &(cmdpkt->command.cmd_pkt_7k); *************** *** 2054,2063 **** user_buf->twa_drvr_pkt.status = 0; event_index = sc->twa_aen_tail; /* = 0 */ } ! if ((error = copyout(sc->twa_aen_queue[event_index], ! user_buf->pdata, sizeof(struct tw_cl_event_packet))) != 0) ! (sc->twa_aen_queue[event_index])->retrieved = ! TWA_AEN_RETRIEVED; break; case TW_CL_IOCTL_GET_LAST_EVENT: --- 2050,2058 ---- user_buf->twa_drvr_pkt.status = 0; event_index = sc->twa_aen_tail; /* = 0 */ } ! bcopy(sc->twa_aen_queue[event_index], user_buf->data_buf, ! sizeof(struct tw_cl_event_packet)); ! sc->twa_aen_queue[event_index]->retrieved = TWA_AEN_RETRIEVED; break; case TW_CL_IOCTL_GET_LAST_EVENT: *************** *** 2083,2092 **** } event_index = (sc->twa_aen_head - 1 + TWA_Q_LENGTH) % TWA_Q_LENGTH; ! if ((error = copyout(sc->twa_aen_queue[event_index], ! user_buf->pdata, sizeof(struct tw_cl_event_packet))) != 0) ! (sc->twa_aen_queue[event_index])->retrieved = ! TWA_AEN_RETRIEVED; break; case TW_CL_IOCTL_GET_NEXT_EVENT: --- 2078,2086 ---- } event_index = (sc->twa_aen_head - 1 + TWA_Q_LENGTH) % TWA_Q_LENGTH; ! bcopy(sc->twa_aen_queue[event_index], user_buf->data_buf, ! sizeof(struct tw_cl_event_packet)); ! sc->twa_aen_queue[event_index]->retrieved = TWA_AEN_RETRIEVED; break; case TW_CL_IOCTL_GET_NEXT_EVENT: *************** *** 2112,2118 **** } start_index = sc->twa_aen_tail; /* = 0 */ } ! error = copyin(user_buf->pdata, &event_buf, sizeof(struct tw_cl_event_packet)); event_index = (start_index + event_buf.sequence_id - --- 2106,2112 ---- } start_index = sc->twa_aen_tail; /* = 0 */ } ! bcopy(user_buf->data_buf, &event_buf, sizeof(struct tw_cl_event_packet)); event_index = (start_index + event_buf.sequence_id - *************** *** 2128,2137 **** user_buf->twa_drvr_pkt.status = TWA_ERROR_AEN_NO_EVENTS; break; } ! if ((error = copyout(sc->twa_aen_queue[event_index], ! user_buf->pdata, sizeof(struct tw_cl_event_packet))) != 0) ! (sc->twa_aen_queue[event_index])->retrieved = ! TWA_AEN_RETRIEVED; break; case TW_CL_IOCTL_GET_PREVIOUS_EVENT: --- 2122,2130 ---- user_buf->twa_drvr_pkt.status = TWA_ERROR_AEN_NO_EVENTS; break; } ! bcopy(sc->twa_aen_queue[event_index], user_buf->data_buf, ! sizeof(struct tw_cl_event_packet)); ! sc->twa_aen_queue[event_index]->retrieved = TWA_AEN_RETRIEVED; break; case TW_CL_IOCTL_GET_PREVIOUS_EVENT: *************** *** 2156,2163 **** } start_index = sc->twa_aen_tail; /* = 0 */ } ! if ((error = copyin(user_buf->pdata, &event_buf, ! sizeof(struct tw_cl_event_packet))) != 0) event_index = (start_index + event_buf.sequence_id - (sc->twa_aen_queue[start_index])->sequence_id - 1) --- 2149,2156 ---- } start_index = sc->twa_aen_tail; /* = 0 */ } ! bcopy(user_buf->data_buf, &event_buf, ! sizeof(struct tw_cl_event_packet)); event_index = (start_index + event_buf.sequence_id - (sc->twa_aen_queue[start_index])->sequence_id - 1) *************** *** 2172,2190 **** TWA_ERROR_AEN_NO_EVENTS; break; } ! if ((error = copyout(sc->twa_aen_queue [event_index], ! user_buf->pdata, sizeof(struct tw_cl_event_packet))) != 0) ! aprint_error_dev(&sc->twa_dv, "get_previous: Could not copyout to " ! "event_buf. error = %x\n", ! error); ! (sc->twa_aen_queue[event_index])->retrieved = TWA_AEN_RETRIEVED; break; case TW_CL_IOCTL_GET_LOCK: { struct tw_cl_lock_packet twa_lock; ! copyin(user_buf->pdata, &twa_lock, sizeof(struct tw_cl_lock_packet)); s = splbio(); if ((sc->twa_ioctl_lock.lock == TWA_LOCK_FREE) || --- 2165,2180 ---- TWA_ERROR_AEN_NO_EVENTS; break; } ! bcopy(sc->twa_aen_queue [event_index], user_buf->data_buf, ! sizeof(struct tw_cl_event_packet)); ! sc->twa_aen_queue[event_index]->retrieved = TWA_AEN_RETRIEVED; break; case TW_CL_IOCTL_GET_LOCK: { struct tw_cl_lock_packet twa_lock; ! bcopy(user_buf->data_buf, &twa_lock, sizeof(struct tw_cl_lock_packet)); s = splbio(); if ((sc->twa_ioctl_lock.lock == TWA_LOCK_FREE) || *************** *** 2204,2210 **** TWA_ERROR_IOCTL_LOCK_ALREADY_HELD; } splx(s); ! copyout(&twa_lock, user_buf->pdata, sizeof(struct tw_cl_lock_packet)); break; } --- 2194,2200 ---- TWA_ERROR_IOCTL_LOCK_ALREADY_HELD; } splx(s); ! bcopy(&twa_lock, user_buf->data_buf, sizeof(struct tw_cl_lock_packet)); break; } *************** *** 2223,2241 **** case TW_CL_IOCTL_GET_COMPATIBILITY_INFO: { ! struct tw_cl_compatibility_packet comp_pkt; ! memcpy(comp_pkt.driver_version, TWA_DRIVER_VERSION_STRING, sizeof(TWA_DRIVER_VERSION_STRING)); ! comp_pkt.working_srl = sc->working_srl; ! comp_pkt.working_branch = sc->working_branch; ! comp_pkt.working_build = sc->working_build; user_buf->twa_drvr_pkt.status = 0; - - /* Copy compatibility information to user space. */ - copyout(&comp_pkt, user_buf->pdata, - min(sizeof(struct tw_cl_compatibility_packet), - user_buf->twa_drvr_pkt.buffer_length)); break; } --- 2213,2227 ---- case TW_CL_IOCTL_GET_COMPATIBILITY_INFO: { ! struct tw_cl_compatibility_packet *comp_pkt; ! comp_pkt = (void *)user_buf->data_buf; ! memcpy(comp_pkt->driver_version, TWA_DRIVER_VERSION_STRING, sizeof(TWA_DRIVER_VERSION_STRING)); ! comp_pkt->working_srl = sc->working_srl; ! comp_pkt->working_branch = sc->working_branch; ! comp_pkt->working_build = sc->working_build; user_buf->twa_drvr_pkt.status = 0; break; } *************** *** 2323,2334 **** cmd->param.size = 2; cmd->param.request_id = tr->tr_request_id; cmd->param.unit = 0; ! cmd->param.param_count = 1; /* Specify which parameter we need. */ ! (*param)->table_id = table_id | TWA_9K_PARAM_DESCRIPTOR; (*param)->parameter_id = param_id; ! (*param)->parameter_size_bytes = param_size; /* Submit the command. */ if (callback == NULL) { --- 2309,2320 ---- cmd->param.size = 2; cmd->param.request_id = tr->tr_request_id; cmd->param.unit = 0; ! cmd->param.param_count = htole16(1); /* Specify which parameter we need. */ ! (*param)->table_id = htole16(table_id | TWA_9K_PARAM_DESCRIPTOR); (*param)->parameter_id = param_id; ! (*param)->parameter_size_bytes = htole16(param_size); /* Submit the command. */ if (callback == NULL) { *************** *** 2404,2415 **** cmd->param.size = 2; cmd->param.request_id = tr->tr_request_id; cmd->param.unit = 0; ! cmd->param.param_count = 1; /* Specify which parameter we want to set. */ ! param->table_id = table_id | TWA_9K_PARAM_DESCRIPTOR; param->parameter_id = param_id; ! param->parameter_size_bytes = param_size; memcpy(param->data, data, param_size); /* Submit the command. */ --- 2390,2401 ---- cmd->param.size = 2; cmd->param.request_id = tr->tr_request_id; cmd->param.unit = 0; ! cmd->param.param_count = htole16(1); /* Specify which parameter we want to set. */ ! param->table_id = htole16(table_id | TWA_9K_PARAM_DESCRIPTOR); param->parameter_id = param_id; ! param->parameter_size_bytes = htole16(param_size); memcpy(param->data, data, param_size); /* Submit the command. */ *************** *** 2502,2520 **** init_connect->opcode = TWA_OP_INIT_CONNECTION; init_connect->request_id = tr->tr_request_id; ! init_connect->message_credits = message_credits; ! init_connect->features = set_features; if (TWA_64BIT_ADDRESSES) ! init_connect->features |= TWA_64BIT_SG_ADDRESSES; if (set_features & TWA_EXTENDED_INIT_CONNECT) { /* * Fill in the extra fields needed for * an extended init_connect. */ init_connect->size = 6; ! init_connect->fw_srl = current_fw_srl; ! init_connect->fw_arch_id = current_fw_arch_id; ! init_connect->fw_branch = current_fw_branch; } else init_connect->size = 3; --- 2488,2506 ---- init_connect->opcode = TWA_OP_INIT_CONNECTION; init_connect->request_id = tr->tr_request_id; ! init_connect->message_credits = htole16(message_credits); ! init_connect->features = htole32(set_features); if (TWA_64BIT_ADDRESSES) ! init_connect->features |= htole32(TWA_64BIT_SG_ADDRESSES); if (set_features & TWA_EXTENDED_INIT_CONNECT) { /* * Fill in the extra fields needed for * an extended init_connect. */ init_connect->size = 6; ! init_connect->fw_srl = htole16(current_fw_srl); ! init_connect->fw_arch_id = htole16(current_fw_arch_id); ! init_connect->fw_branch = htole16(current_fw_branch); } else init_connect->size = 3; *************** *** 2529,2539 **** goto out; } if (set_features & TWA_EXTENDED_INIT_CONNECT) { ! *fw_on_ctlr_srl = init_connect->fw_srl; ! *fw_on_ctlr_arch_id = init_connect->fw_arch_id; ! *fw_on_ctlr_branch = init_connect->fw_branch; ! *fw_on_ctlr_build = init_connect->fw_build; ! *init_connect_result = init_connect->result; } twa_release_request(tr); return(error); --- 2515,2525 ---- goto out; } if (set_features & TWA_EXTENDED_INIT_CONNECT) { ! *fw_on_ctlr_srl = le16toh(init_connect->fw_srl); ! *fw_on_ctlr_arch_id = le16toh(init_connect->fw_arch_id); ! *fw_on_ctlr_branch = le16toh(init_connect->fw_branch); ! *fw_on_ctlr_build = le16toh(init_connect->fw_build); ! *init_connect_result = le32toh(init_connect->result); } twa_release_request(tr); return(error); *************** *** 2755,2761 **** unsigned long sync_time; s = splbio(); ! aen_code = cmd_hdr->status_block.error; switch (aen_code) { case TWA_AEN_SYNC_TIME_WITH_HOST: --- 2741,2747 ---- unsigned long sync_time; s = splbio(); ! aen_code = le16toh(cmd_hdr->status_block.error); switch (aen_code) { case TWA_AEN_SYNC_TIME_WITH_HOST: *************** *** 2937,2943 **** uint32_t dsize; uint8_t ports; ! memset(p, sizeof(struct twa_param_9k *), 10); /* Get the port count. */ rv |= twa_get_param(sc, TWA_PARAM_CONTROLLER, --- 2923,2929 ---- uint32_t dsize; uint8_t ports; ! bzero(p, sizeof(struct twa_param_9k *) * 10); /* Get the port count. */ rv |= twa_get_param(sc, TWA_PARAM_CONTROLLER, *************** *** 3000,3006 **** continue; } ! dsize = *(uint32_t *)(p[9]->data); aprint_verbose_dev(&sc->twa_dv, "port %d: %.40s %d MB\n", i, p[8]->data, dsize / 2048); --- 2986,2992 ---- continue; } ! dsize = le32toh(*(uint32_t *)(p[9]->data)); aprint_verbose_dev(&sc->twa_dv, "port %d: %.40s %d MB\n", i, p[8]->data, dsize / 2048); Index: sys/dev/pci/twareg.h *************** *** 246,253 **** --- 246,258 ---- /* 7000 structures. */ struct twa_command_init_connect { + #if BYTE_ORDER == BIG_ENDIAN + uint8_t res1:3; + uint8_t opcode:5; + #else uint8_t opcode:5; /* TWA_OP_INITCONNECTION */ uint8_t res1:3; + #endif uint8_t size; uint8_t request_id; uint8_t res2; *************** *** 263,270 **** --- 268,280 ---- }__packed; struct twa_command_download_firmware { + #if BYTE_ORDER == BIG_ENDIAN + uint8_t sgl_offset:3; + uint8_t opcode:5; + #else uint8_t opcode:5; /* TWA_DOWNLOAD_FIRMWARE */ uint8_t sgl_offset:3; + #endif uint8_t size; uint8_t request_id; uint8_t unit; *************** *** 276,283 **** --- 286,298 ---- struct twa_command_reset_firmware { + #if BYTE_ORDER == BIG_ENDIAN + uint8_t res1:3; + uint8_t opcode:5; + #else uint8_t opcode:5; /* TWA_OP_RESET_FIRMWARE */ uint8_t res1:3; + #endif uint8_t size; uint8_t request_id; uint8_t unit; *************** *** 289,300 **** --- 304,325 ---- struct twa_command_io { + #if BYTE_ORDER == BIG_ENDIAN + uint8_t sgl_offset:3; + uint8_t opcode:5; + #else uint8_t opcode:5; /* TWA_OP_READ/TWA_OP_WRITE */ uint8_t sgl_offset:3; + #endif uint8_t size; uint8_t request_id; + #if BYTE_ORDER == BIG_ENDIAN + uint8_t host_id:4; + uint8_t unit:4; + #else uint8_t unit:4; uint8_t host_id:4; + #endif uint8_t status; uint8_t flags; uint16_t block_count; *************** *** 304,315 **** --- 329,350 ---- struct twa_command_hotswap { + #if BYTE_ORDER == BIG_ENDIAN + uint8_t res1:3; + uint8_t opcode:5; + #else uint8_t opcode:5; /* TWA_OP_HOTSWAP */ uint8_t res1:3; + #endif uint8_t size; uint8_t request_id; + #if BYTE_ORDER == BIG_ENDIAN + uint8_t host_id:4; + uint8_t unit:4; + #else uint8_t unit:4; uint8_t host_id:4; + #endif uint8_t status; uint8_t flags; uint8_t action; *************** *** 321,332 **** --- 356,377 ---- struct twa_command_param { + #if BYTE_ORDER == BIG_ENDIAN + uint8_t sgl_offset:3; + uint8_t opcode:5; + #else uint8_t opcode:5; /* TWA_OP_GETPARAM, TWA_OP_SETPARAM */ uint8_t sgl_offset:3; + #endif uint8_t size; uint8_t request_id; + #if BYTE_ORDER == BIG_ENDIAN + uint8_t host_id:4; + uint8_t unit:4; + #else uint8_t unit:4; uint8_t host_id:4; + #endif uint8_t status; uint8_t flags; uint16_t param_count; *************** *** 335,365 **** struct twa_command_rebuildunit { uint8_t opcode:5; /* TWA_OP_REBUILDUNIT */ uint8_t res1:3; uint8_t size; uint8_t request_id; uint8_t src_unit:4; uint8_t host_id:4; uint8_t status; uint8_t flags; uint8_t action:7; #define TWA_OP_REBUILDUNIT_NOP 0 #define TWA_OP_REBUILDUNIT_STOP 2 /* stop all rebuilds */ #define TWA_OP_REBUILDUNIT_START 4 /* start rebuild with lowest unit */ #define TWA_OP_REBUILDUNIT_STARTUNIT 5 /* rebuild src_unit (not supported) */ - uint8_t cs:1; /* request state change on src_unit */ uint8_t logical_subunit; /* for RAID10 rebuild of logical subunit */ } __packed; struct twa_command_ata { uint8_t opcode:5; /* TWA_OP_ATA_PASSTHROUGH */ uint8_t sgl_offset:3; uint8_t size; uint8_t request_id; uint8_t unit:4; uint8_t host_id:4; uint8_t status; uint8_t flags; uint16_t param; --- 380,435 ---- struct twa_command_rebuildunit { + #if BYTE_ORDER == BIG_ENDIAN + uint8_t res1:3; + uint8_t opcode:5; + #else uint8_t opcode:5; /* TWA_OP_REBUILDUNIT */ uint8_t res1:3; + #endif uint8_t size; uint8_t request_id; + #if BYTE_ORDER == BIG_ENDIAN + uint8_t host_id:4; + uint8_t src_unit:4; + #else uint8_t src_unit:4; uint8_t host_id:4; + #endif uint8_t status; uint8_t flags; + #if BYTE_ORDER == BIG_ENDIAN + uint8_t cs:1; + uint8_t action:7; + #else uint8_t action:7; + uint8_t cs:1; /* request state change on src_unit */ + #endif #define TWA_OP_REBUILDUNIT_NOP 0 #define TWA_OP_REBUILDUNIT_STOP 2 /* stop all rebuilds */ #define TWA_OP_REBUILDUNIT_START 4 /* start rebuild with lowest unit */ #define TWA_OP_REBUILDUNIT_STARTUNIT 5 /* rebuild src_unit (not supported) */ uint8_t logical_subunit; /* for RAID10 rebuild of logical subunit */ } __packed; struct twa_command_ata { + #if BYTE_ORDER == BIG_ENDIAN + uint8_t sgl_offset:3; + uint8_t opcode:5; + #else uint8_t opcode:5; /* TWA_OP_ATA_PASSTHROUGH */ uint8_t sgl_offset:3; + #endif uint8_t size; uint8_t request_id; + #if BYTE_ORDER == BIG_ENDIAN + uint8_t host_id:4; + uint8_t unit:4; + #else uint8_t unit:4; uint8_t host_id:4; + #endif uint8_t status; uint8_t flags; uint16_t param; *************** *** 375,386 **** --- 445,466 ---- struct twa_command_generic { + #if BYTE_ORDER == BIG_ENDIAN + uint8_t sgl_offset:3; + uint8_t opcode:5; + #else uint8_t opcode:5; uint8_t sgl_offset:3; + #endif uint8_t size; uint8_t request_id; + #if BYTE_ORDER == BIG_ENDIAN + uint8_t host_id:4; + uint8_t unit:4; + #else uint8_t unit:4; uint8_t host_id:4; + #endif uint8_t status; uint8_t flags; #define TWA_FLAGS_SUCCESS 0x00 *************** *** 400,407 **** --- 480,492 ---- uint16_t error; uint8_t padding; struct { + #if BYTE_ORDER == BIG_ENDIAN + uint8_t reserved:5; + uint8_t severity:3; + #else uint8_t severity:3; uint8_t reserved:5; + #endif } substatus_block; } status_block; uint8_t err_specific_desc[98]; *************** *** 430,437 **** --- 515,527 ---- /* Command Packet. */ struct twa_command_9k { struct { + #if BYTE_ORDER == BIG_ENDIAN + uint8_t reserved:3; + uint8_t opcode:5; + #else uint8_t opcode:5; uint8_t reserved:3; + #endif } command; uint8_t unit; uint16_t request_id; *************** *** 458,466 **** --- 548,562 ---- /* Response queue entry. */ union twa_response_queue { struct { + #if BYTE_ORDER == BIG_ENDIAN + uint32_t undefined_2:20; + uint32_t response_id:8; + uint32_t undefined_1:4; + #else uint32_t undefined_1:4; uint32_t response_id:8; uint32_t undefined_2:20; + #endif } u; uint32_t value; } __packed; Index: sys/dev/pci/ld_twa.c *************** *** 174,182 **** tr->tr_command->command.cmd_pkt_9k.unit = sc->sc_hwunit; tr->tr_command->command.cmd_pkt_9k.request_id = ! tr->tr_request_id; tr->tr_command->command.cmd_pkt_9k.status = 0; ! tr->tr_command->command.cmd_pkt_9k.sgl_entries = 1; tr->tr_command->command.cmd_pkt_9k.sgl_offset = 16; /* offset from end of hdr = max cdb len */ --- 174,182 ---- tr->tr_command->command.cmd_pkt_9k.unit = sc->sc_hwunit; tr->tr_command->command.cmd_pkt_9k.request_id = ! htole16(tr->tr_request_id); tr->tr_command->command.cmd_pkt_9k.status = 0; ! tr->tr_command->command.cmd_pkt_9k.sgl_entries = htole16(1); tr->tr_command->command.cmd_pkt_9k.sgl_offset = 16; /* offset from end of hdr = max cdb len */ *************** *** 305,313 **** tr->tr_command->command.cmd_pkt_9k.cdb[1] = (sc->sc_hwunit << 5); /* lun for CDB */ ! _lto8b(htole64(bp->b_rawblkno), &tr->tr_command->command.cmd_pkt_9k.cdb[2]); ! _lto4b(htole32((bp->b_bcount / TWA_SECTOR_SIZE)), &tr->tr_command->command.cmd_pkt_9k.cdb[10]); tr->tr_command->command.cmd_pkt_9k.cdb[14] = 0; --- 305,313 ---- tr->tr_command->command.cmd_pkt_9k.cdb[1] = (sc->sc_hwunit << 5); /* lun for CDB */ ! _lto8b(bp->b_rawblkno, &tr->tr_command->command.cmd_pkt_9k.cdb[2]); ! _lto4b(bp->b_bcount / TWA_SECTOR_SIZE, &tr->tr_command->command.cmd_pkt_9k.cdb[10]); tr->tr_command->command.cmd_pkt_9k.cdb[14] = 0;