Lines Matching +full:aac +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Adaptec AAC series RAID controller driver
9 * Copyright (c) 2000-2010 Adaptec, Inc.
10 * 2010-2015 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
11 * 2016-2017 Microsemi Corp. (aacraid@microsemi.com)
40 #define INQD_PDT_DA 0x00 /* Direct-access (DISK) device */
143 /*------------------------------------------------------------------------------
145 *----------------------------------------------------------------------------*/
150 u8 inqd_ver; /* ISO version | ECMA version | ANSI-approved version */
152 u8 inqd_len; /* Additional length (n-4) */
153 u8 inqd_pad1[2];/* Reserved - must be zero */
237 static int nondasd = -1;
239 static int dacmode = -1;
241 int aac_commit = -1;
244 int aac_sync_mode; /* Only Sync. transfer - disabled */
245 static int aac_convert_sgl = 1; /* convert non-conformable s/g list - enabled */
248 MODULE_PARM_DESC(aac_sync_mode, "Force sync. transfer mode"
251 MODULE_PARM_DESC(aac_convert_sgl, "Convert non-conformable s/g list"
258 "\tbit 0 - Disable FUA in WRITE SCSI commands\n"
259 "\tbit 1 - Disable SYNCHRONIZE_CACHE SCSI command\n"
260 "\tbit 2 - Disable only if Battery is protecting Cache");
271 " 0=PIC(default), 1=MSI, 2=MSI-X)");
287 int numacb = -1;
293 static int acbsize = -1;
312 " adapter. a value of -1 forces the reset to adapters programmed to"
315 int expose_physicals = -1;
318 " -1=protect 0=off, 1=on");
327 "\t0 - Disable\n"
328 "\t1 - Array Meta Data Signature (default)\n"
329 "\t2 - Adapter Serial Number");
341 aac_priv(scsicmd)->owner = AAC_OWNER_MIDLEVEL; in aac_valid_context()
342 device = scsicmd->device; in aac_valid_context()
352 * aac_get_config_status - check the adapter configuration
353 * @dev: aac driver data
364 return -ENOMEM; in aac_get_config_status()
371 dinfo->command = cpu_to_le32(VM_ContainerConfig); in aac_get_config_status()
372 dinfo->type = cpu_to_le32(CT_GET_CONFIG_STATUS); in aac_get_config_status()
373 dinfo->count = cpu_to_le32(sizeof(((struct aac_get_config_status_resp *)NULL)->data)); in aac_get_config_status()
389 le32_to_cpu(reply->response), in aac_get_config_status()
390 le32_to_cpu(reply->status), in aac_get_config_status()
391 le32_to_cpu(reply->data.action))); in aac_get_config_status()
392 if ((le32_to_cpu(reply->response) != ST_OK) || in aac_get_config_status()
393 (le32_to_cpu(reply->status) != CT_OK) || in aac_get_config_status()
394 (le32_to_cpu(reply->data.action) > CFACT_PAUSE)) { in aac_get_config_status()
396 status = -EINVAL; in aac_get_config_status()
410 dinfo->command = cpu_to_le32(VM_ContainerConfig); in aac_get_config_status()
411 dinfo->type = cpu_to_le32(CT_COMMIT_CONFIG); in aac_get_config_status()
429 if (status != -ERESTARTSYS) in aac_get_config_status()
445 * aac_get_containers - list containers
446 * @dev: aac driver data
461 return -ENOMEM; in aac_get_containers()
465 dinfo->command = cpu_to_le32(VM_ContainerConfig); in aac_get_containers()
466 dinfo->type = cpu_to_le32(CT_GET_CONTAINER_COUNT); in aac_get_containers()
476 maximum_num_containers = le32_to_cpu(dresp->ContainerSwitchEntries); in aac_get_containers()
477 if (fibptr->dev->supplement_adapter_info.supported_options2 & in aac_get_containers()
480 le32_to_cpu(dresp->MaxSimpleVolumes); in aac_get_containers()
485 if (status != -ERESTARTSYS) in aac_get_containers()
490 if (dev->fsa_dev == NULL || in aac_get_containers()
491 dev->maximum_num_containers != maximum_num_containers) { in aac_get_containers()
493 fsa_dev_ptr = dev->fsa_dev; in aac_get_containers()
495 dev->fsa_dev = kcalloc(maximum_num_containers, in aac_get_containers()
502 if (!dev->fsa_dev) in aac_get_containers()
503 return -ENOMEM; in aac_get_containers()
505 dev->maximum_num_containers = maximum_num_containers; in aac_get_containers()
507 for (index = 0; index < dev->maximum_num_containers; index++) { in aac_get_containers()
508 dev->fsa_dev[index].devname[0] = '\0'; in aac_get_containers()
509 dev->fsa_dev[index].valid = 0; in aac_get_containers()
523 if (scmd->device->request_queue) { in aac_scsi_done()
524 /* SCSI command has been submitted by the SCSI mid-layer. */ in aac_scsi_done()
547 if ((le32_to_cpu(get_name_reply->status) == CT_OK) in get_container_name_callback()
548 && (get_name_reply->data[0] != '\0')) { in get_container_name_callback()
549 char *sp = get_name_reply->data; in get_container_name_callback()
552 sp[data_size - 1] = '\0'; in get_container_name_callback()
557 char d[sizeof(((struct inquiry_data *)NULL)->inqd_pid)]; in get_container_name_callback()
562 } while (--count > 0); in get_container_name_callback()
570 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in get_container_name_callback()
577 * aac_get_container_name - get container name, none blocking.
587 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in aac_get_container_name()
595 aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE; in aac_get_container_name()
597 dinfo->command = cpu_to_le32(VM_ContainerConfig); in aac_get_container_name()
598 dinfo->type = cpu_to_le32(CT_READ_NAME); in aac_get_container_name()
599 dinfo->cid = cpu_to_le32(scmd_id(scsicmd)); in aac_get_container_name()
600 dinfo->count = cpu_to_le32(data_size - 1); in aac_get_container_name()
613 if (status == -EINPROGRESS) in aac_get_container_name()
618 return -1; in aac_get_container_name()
623 struct fsa_dev_info *fsa_dev_ptr = ((struct aac_dev *)(scsicmd->device->host->hostdata))->fsa_dev; in aac_probe_container_callback2()
628 scsicmd->result = DID_NO_CONNECT << 16; in aac_probe_container_callback2()
645 cmd_priv->status = 0; in _aac_probe_container2()
646 fsa_dev_ptr = fibptr->dev->fsa_dev; in _aac_probe_container2()
653 fibptr->dev->supplement_adapter_info.supported_options2; in _aac_probe_container2()
655 if ((le32_to_cpu(dresp->status) == ST_OK) && in _aac_probe_container2()
656 (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE) && in _aac_probe_container2()
657 (le32_to_cpu(dresp->mnt[0].state) != FSCS_HIDDEN)) { in _aac_probe_container2()
659 dresp->mnt[0].fileinfo.bdevinfo.block_size = 0x200; in _aac_probe_container2()
660 fsa_dev_ptr->block_size = 0x200; in _aac_probe_container2()
662 fsa_dev_ptr->block_size = in _aac_probe_container2()
663 le32_to_cpu(dresp->mnt[0].fileinfo.bdevinfo.block_size); in _aac_probe_container2()
666 fsa_dev_ptr->identifier[i] = in _aac_probe_container2()
667 dresp->mnt[0].fileinfo.bdevinfo in _aac_probe_container2()
669 fsa_dev_ptr->valid = 1; in _aac_probe_container2()
670 /* sense_key holds the current state of the spin-up */ in _aac_probe_container2()
671 if (dresp->mnt[0].state & cpu_to_le32(FSCS_NOT_READY)) in _aac_probe_container2()
672 fsa_dev_ptr->sense_data.sense_key = NOT_READY; in _aac_probe_container2()
673 else if (fsa_dev_ptr->sense_data.sense_key == NOT_READY) in _aac_probe_container2()
674 fsa_dev_ptr->sense_data.sense_key = NO_SENSE; in _aac_probe_container2()
675 fsa_dev_ptr->type = le32_to_cpu(dresp->mnt[0].vol); in _aac_probe_container2()
676 fsa_dev_ptr->size in _aac_probe_container2()
677 = ((u64)le32_to_cpu(dresp->mnt[0].capacity)) + in _aac_probe_container2()
678 (((u64)le32_to_cpu(dresp->mnt[0].capacityhigh)) << 32); in _aac_probe_container2()
679 fsa_dev_ptr->ro = ((le32_to_cpu(dresp->mnt[0].state) & FSCS_READONLY) != 0); in _aac_probe_container2()
681 if ((fsa_dev_ptr->valid & 1) == 0) in _aac_probe_container2()
682 fsa_dev_ptr->valid = 0; in _aac_probe_container2()
683 cmd_priv->status = le32_to_cpu(dresp->count); in _aac_probe_container2()
687 callback = cmd_priv->callback; in _aac_probe_container2()
688 cmd_priv->callback = NULL; in _aac_probe_container2()
701 if (!aac_supports_2T(fibptr->dev)) { in _aac_probe_container1()
702 dresp->mnt[0].capacityhigh = 0; in _aac_probe_container1()
703 if ((le32_to_cpu(dresp->status) == ST_OK) && in _aac_probe_container1()
704 (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) { in _aac_probe_container1()
718 if (fibptr->dev->supplement_adapter_info.supported_options2 & in _aac_probe_container1()
720 dinfo->command = cpu_to_le32(VM_NameServeAllBlk); in _aac_probe_container1()
722 dinfo->command = cpu_to_le32(VM_NameServe64); in _aac_probe_container1()
724 dinfo->count = cpu_to_le32(scmd_id(scsicmd)); in _aac_probe_container1()
725 dinfo->type = cpu_to_le32(FT_FILESYS); in _aac_probe_container1()
726 aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE; in _aac_probe_container1()
738 if (status < 0 && status != -EINPROGRESS) { in _aac_probe_container1()
740 dresp->status = cpu_to_le32(ST_OK); in _aac_probe_container1()
749 int status = -ENOMEM; in _aac_probe_container()
751 if ((fibptr = aac_fib_alloc((struct aac_dev *)scsicmd->device->host->hostdata))) { in _aac_probe_container()
758 if (fibptr->dev->supplement_adapter_info.supported_options2 & in _aac_probe_container()
760 dinfo->command = cpu_to_le32(VM_NameServeAllBlk); in _aac_probe_container()
762 dinfo->command = cpu_to_le32(VM_NameServe); in _aac_probe_container()
764 dinfo->count = cpu_to_le32(scmd_id(scsicmd)); in _aac_probe_container()
765 dinfo->type = cpu_to_le32(FT_FILESYS); in _aac_probe_container()
766 cmd_priv->callback = callback; in _aac_probe_container()
767 cmd_priv->owner = AAC_OWNER_FIRMWARE; in _aac_probe_container()
779 if (status == -EINPROGRESS) in _aac_probe_container()
783 cmd_priv->callback = NULL; in _aac_probe_container()
789 struct fsa_dev_info *fsa_dev_ptr = ((struct aac_dev *)(scsicmd->device->host->hostdata))->fsa_dev; in _aac_probe_container()
792 if ((fsa_dev_ptr->valid & 1) == 0) { in _aac_probe_container()
793 fsa_dev_ptr->valid = 0; in _aac_probe_container()
802 * aac_probe_container_callback1 - query a logical volume
810 scsicmd->device = NULL; in aac_probe_container_callback1()
829 return -ENOMEM; in aac_probe_container()
832 scsicmd->device = scsidev; in aac_probe_container()
833 scsidev->sdev_state = 0; in aac_probe_container()
834 scsidev->id = cid; in aac_probe_container()
835 scsidev->host = dev->scsi_host_ptr; in aac_probe_container()
838 while (scsicmd->device == scsidev) in aac_probe_container()
842 status = cmd_priv->status; in aac_probe_container()
855 * inqstrcpy - string merge
883 "V-MIRRORS",
897 tindex = ARRAY_SIZE(container_types) - 1; in get_container_type()
915 sup_adap_info = &dev->supplement_adapter_info; in setinqstr()
919 if (sup_adap_info->adapter_type_text[0]) { in setinqstr()
922 char *cname = kmemdup(sup_adap_info->adapter_type_text, in setinqstr()
923 sizeof(sup_adap_info->adapter_type_text), in setinqstr()
930 inqstrcpy("SMC", str->vid); in setinqstr()
932 c = sizeof(str->vid); in setinqstr()
933 while (*cp && *cp != ' ' && --c) in setinqstr()
937 inqstrcpy(cname, str->vid); in setinqstr()
945 if (strlen(cp) > sizeof(str->pid)) in setinqstr()
946 cp[sizeof(str->pid)] = '\0'; in setinqstr()
947 inqstrcpy (cp, str->pid); in setinqstr()
951 struct aac_driver_ident *mp = aac_get_driver_ident(dev->cardtype); in setinqstr()
953 inqstrcpy (mp->vname, str->vid); in setinqstr()
955 inqstrcpy (mp->model, str->pid); in setinqstr()
959 char *findit = str->pid; in setinqstr()
963 if (memcmp(findit-4, "RAID", 4) == 0) in setinqstr()
964 *(findit -= 4) = ' '; in setinqstr()
965 if (((findit - str->pid) + strlen(container_types[tindex])) in setinqstr()
966 < (sizeof(str->pid) + sizeof(str->prl))) in setinqstr()
969 inqstrcpy ("V1.0", str->prl); in setinqstr()
977 vpdpage83data->type3.codeset = 1; in build_vpd83_type3()
978 vpdpage83data->type3.identifiertype = 3; in build_vpd83_type3()
979 vpdpage83data->type3.identifierlength = sizeof(vpdpage83data->type3) in build_vpd83_type3()
980 - 4; in build_vpd83_type3()
982 for (container = 0; container < dev->maximum_num_containers; in build_vpd83_type3()
986 memcpy(vpdpage83data->type3.Identifier, in build_vpd83_type3()
987 dev->fsa_dev[container].identifier, in build_vpd83_type3()
1007 if (le32_to_cpu(get_serial_reply->status) == CT_OK) { in get_container_serial_callback()
1009 if (scsicmd->cmnd[2] == 0x83) { in get_container_serial_callback()
1010 /* vpd page 0x83 - Device Identification Page */ in get_container_serial_callback()
1015 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in get_container_serial_callback()
1032 if (dev->sa_firmware) in get_container_serial_callback()
1042 sizeof(vpdpage83data.type1) - 4; in get_container_serial_callback()
1058 (u8)((get_serial_reply->uid >> ((7 - i) * 4)) & 0xF); in get_container_serial_callback()
1061 'A' + (temp - 0xA); in get_container_serial_callback()
1073 sizeof(vpdpage83data.type2) - 4; in get_container_serial_callback()
1080 get_serial_reply->uid; in get_container_serial_callback()
1087 if (dev->sa_firmware) { in get_container_serial_callback()
1100 sp[1] = scsicmd->cmnd[2]; in get_container_serial_callback()
1102 sp[3] = snprintf(sp+4, sizeof(sp)-4, "%08X", in get_container_serial_callback()
1103 le32_to_cpu(get_serial_reply->uid)); in get_container_serial_callback()
1109 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in get_container_serial_callback()
1116 * aac_get_container_serial - get container serial, none blocking.
1125 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in aac_get_container_serial()
1132 dinfo->command = cpu_to_le32(VM_ContainerConfig); in aac_get_container_serial()
1133 dinfo->type = cpu_to_le32(CT_CID_TO_32BITS_UID); in aac_get_container_serial()
1134 dinfo->cid = cpu_to_le32(scmd_id(scsicmd)); in aac_get_container_serial()
1135 aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE; in aac_get_container_serial()
1148 if (status == -EINPROGRESS) in aac_get_container_serial()
1153 return -1; in aac_get_container_serial()
1163 * without docs it's quite hard to do it :-)
1172 return snprintf((char *)(data), sizeof(struct scsi_inq) - 4, "%08X%02X", in setinqserial()
1173 le32_to_cpu(dev->adapter_info.serial[0]), cid); in setinqserial()
1208 cmd->result = DID_OK << 16 | SAM_STAT_CHECK_CONDITION; in aac_bounds_32()
1209 set_sense(&dev->fsa_dev[cid].sense_data, in aac_bounds_32()
1212 memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in aac_bounds_32()
1213 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in aac_bounds_32()
1230 struct aac_dev *dev = fib->dev; in aac_read_raw_io()
1235 if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 || in aac_read_raw_io()
1236 dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) && in aac_read_raw_io()
1237 !dev->sync_mode) { in aac_read_raw_io()
1241 readcmd2->blockLow = cpu_to_le32((u32)(lba&0xffffffff)); in aac_read_raw_io()
1242 readcmd2->blockHigh = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32)); in aac_read_raw_io()
1243 readcmd2->byteCount = cpu_to_le32(count * in aac_read_raw_io()
1244 dev->fsa_dev[scmd_id(cmd)].block_size); in aac_read_raw_io()
1245 readcmd2->cid = cpu_to_le16(scmd_id(cmd)); in aac_read_raw_io()
1246 readcmd2->flags = cpu_to_le16(RIO2_IO_TYPE_READ); in aac_read_raw_io()
1248 dev->scsi_host_ptr->sg_tablesize); in aac_read_raw_io()
1253 le32_to_cpu(readcmd2->sgeCnt)); in aac_read_raw_io()
1257 readcmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff)); in aac_read_raw_io()
1258 readcmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32)); in aac_read_raw_io()
1259 readcmd->count = cpu_to_le32(count * in aac_read_raw_io()
1260 dev->fsa_dev[scmd_id(cmd)].block_size); in aac_read_raw_io()
1261 readcmd->cid = cpu_to_le16(scmd_id(cmd)); in aac_read_raw_io()
1262 readcmd->flags = cpu_to_le16(RIO_TYPE_READ); in aac_read_raw_io()
1263 readcmd->bpTotal = 0; in aac_read_raw_io()
1264 readcmd->bpComplete = 0; in aac_read_raw_io()
1265 ret = aac_build_sgraw(cmd, &readcmd->sg); in aac_read_raw_io()
1270 ((le32_to_cpu(readcmd->sg.count)-1) * sizeof(struct sgentryraw)); in aac_read_raw_io()
1273 BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr))); in aac_read_raw_io()
1294 readcmd->command = cpu_to_le32(VM_CtHostRead64); in aac_read_block64()
1295 readcmd->cid = cpu_to_le16(scmd_id(cmd)); in aac_read_block64()
1296 readcmd->sector_count = cpu_to_le16(count); in aac_read_block64()
1297 readcmd->block = cpu_to_le32((u32)(lba&0xffffffff)); in aac_read_block64()
1298 readcmd->pad = 0; in aac_read_block64()
1299 readcmd->flags = 0; in aac_read_block64()
1301 ret = aac_build_sg64(cmd, &readcmd->sg); in aac_read_block64()
1305 ((le32_to_cpu(readcmd->sg.count) - 1) * in aac_read_block64()
1307 BUG_ON (fibsize > (fib->dev->max_fib_size - in aac_read_block64()
1325 struct aac_dev *dev = fib->dev; in aac_read_block()
1330 readcmd->command = cpu_to_le32(VM_CtBlockRead); in aac_read_block()
1331 readcmd->cid = cpu_to_le32(scmd_id(cmd)); in aac_read_block()
1332 readcmd->block = cpu_to_le32((u32)(lba&0xffffffff)); in aac_read_block()
1333 readcmd->count = cpu_to_le32(count * in aac_read_block()
1334 dev->fsa_dev[scmd_id(cmd)].block_size); in aac_read_block()
1336 ret = aac_build_sg(cmd, &readcmd->sg); in aac_read_block()
1340 ((le32_to_cpu(readcmd->sg.count) - 1) * in aac_read_block()
1342 BUG_ON (fibsize > (fib->dev->max_fib_size - in aac_read_block()
1358 struct aac_dev *dev = fib->dev; in aac_write_raw_io()
1363 if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 || in aac_write_raw_io()
1364 dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) && in aac_write_raw_io()
1365 !dev->sync_mode) { in aac_write_raw_io()
1369 writecmd2->blockLow = cpu_to_le32((u32)(lba&0xffffffff)); in aac_write_raw_io()
1370 writecmd2->blockHigh = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32)); in aac_write_raw_io()
1371 writecmd2->byteCount = cpu_to_le32(count * in aac_write_raw_io()
1372 dev->fsa_dev[scmd_id(cmd)].block_size); in aac_write_raw_io()
1373 writecmd2->cid = cpu_to_le16(scmd_id(cmd)); in aac_write_raw_io()
1374 writecmd2->flags = (fua && ((aac_cache & 5) != 1) && in aac_write_raw_io()
1375 (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ? in aac_write_raw_io()
1379 dev->scsi_host_ptr->sg_tablesize); in aac_write_raw_io()
1384 le32_to_cpu(writecmd2->sgeCnt)); in aac_write_raw_io()
1388 writecmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff)); in aac_write_raw_io()
1389 writecmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32)); in aac_write_raw_io()
1390 writecmd->count = cpu_to_le32(count * in aac_write_raw_io()
1391 dev->fsa_dev[scmd_id(cmd)].block_size); in aac_write_raw_io()
1392 writecmd->cid = cpu_to_le16(scmd_id(cmd)); in aac_write_raw_io()
1393 writecmd->flags = (fua && ((aac_cache & 5) != 1) && in aac_write_raw_io()
1394 (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ? in aac_write_raw_io()
1397 writecmd->bpTotal = 0; in aac_write_raw_io()
1398 writecmd->bpComplete = 0; in aac_write_raw_io()
1399 ret = aac_build_sgraw(cmd, &writecmd->sg); in aac_write_raw_io()
1404 ((le32_to_cpu(writecmd->sg.count)-1) * sizeof (struct sgentryraw)); in aac_write_raw_io()
1407 BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr))); in aac_write_raw_io()
1428 writecmd->command = cpu_to_le32(VM_CtHostWrite64); in aac_write_block64()
1429 writecmd->cid = cpu_to_le16(scmd_id(cmd)); in aac_write_block64()
1430 writecmd->sector_count = cpu_to_le16(count); in aac_write_block64()
1431 writecmd->block = cpu_to_le32((u32)(lba&0xffffffff)); in aac_write_block64()
1432 writecmd->pad = 0; in aac_write_block64()
1433 writecmd->flags = 0; in aac_write_block64()
1435 ret = aac_build_sg64(cmd, &writecmd->sg); in aac_write_block64()
1439 ((le32_to_cpu(writecmd->sg.count) - 1) * in aac_write_block64()
1441 BUG_ON (fibsize > (fib->dev->max_fib_size - in aac_write_block64()
1459 struct aac_dev *dev = fib->dev; in aac_write_block()
1464 writecmd->command = cpu_to_le32(VM_CtBlockWrite); in aac_write_block()
1465 writecmd->cid = cpu_to_le32(scmd_id(cmd)); in aac_write_block()
1466 writecmd->block = cpu_to_le32((u32)(lba&0xffffffff)); in aac_write_block()
1467 writecmd->count = cpu_to_le32(count * in aac_write_block()
1468 dev->fsa_dev[scmd_id(cmd)].block_size); in aac_write_block()
1469 writecmd->sg.count = cpu_to_le32(1); in aac_write_block()
1470 /* ->stable is not used - it did mean which type of write */ in aac_write_block()
1472 ret = aac_build_sg(cmd, &writecmd->sg); in aac_write_block()
1476 ((le32_to_cpu(writecmd->sg.count) - 1) * in aac_write_block()
1478 BUG_ON (fibsize > (fib->dev->max_fib_size - in aac_write_block()
1497 struct aac_dev *dev = fib->dev; in aac_scsi_common()
1500 switch(cmd->sc_data_direction){ in aac_scsi_common()
1517 srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); in aac_scsi_common()
1518 srbcmd->channel = cpu_to_le32(aac_logical_to_phys(scmd_channel(cmd))); in aac_scsi_common()
1519 srbcmd->id = cpu_to_le32(scmd_id(cmd)); in aac_scsi_common()
1520 srbcmd->lun = cpu_to_le32(cmd->device->lun); in aac_scsi_common()
1521 srbcmd->flags = cpu_to_le32(flag); in aac_scsi_common()
1522 timeout = scsi_cmd_to_rq(cmd)->timeout / HZ; in aac_scsi_common()
1524 timeout = (dev->sa_firmware ? AAC_SA_TIMEOUT : AAC_ARC_TIMEOUT); in aac_scsi_common()
1525 srbcmd->timeout = cpu_to_le32(timeout); // timeout in seconds in aac_scsi_common()
1526 srbcmd->retry_limit = 0; /* Obsolete parameter */ in aac_scsi_common()
1527 srbcmd->cdb_size = cpu_to_le32(cmd->cmd_len); in aac_scsi_common()
1539 dev = (struct aac_dev *)cmd->device->host->hostdata; in aac_construct_hbacmd()
1541 hbacmd = (struct aac_hba_cmd_req *)fib->hw_fib_va; in aac_construct_hbacmd()
1544 switch (cmd->sc_data_direction) { in aac_construct_hbacmd()
1546 hbacmd->byte1 = 2; in aac_construct_hbacmd()
1550 hbacmd->byte1 = 1; in aac_construct_hbacmd()
1556 hbacmd->lun[1] = cpu_to_le32(cmd->device->lun); in aac_construct_hbacmd()
1560 hbacmd->it_nexus = dev->hba_map[bus][target].rmw_nexus; in aac_construct_hbacmd()
1566 memcpy(hbacmd->cdb, cmd->cmnd, cmd->cmd_len); in aac_construct_hbacmd()
1567 hbacmd->data_length = cpu_to_le32(scsi_bufflen(cmd)); in aac_construct_hbacmd()
1569 address = (u64)fib->hw_error_pa; in aac_construct_hbacmd()
1570 hbacmd->error_ptr_hi = cpu_to_le32((u32)(address >> 32)); in aac_construct_hbacmd()
1571 hbacmd->error_ptr_lo = cpu_to_le32((u32)(address & 0xffffffff)); in aac_construct_hbacmd()
1572 hbacmd->error_length = cpu_to_le32(FW_ERROR_BUFFER_SIZE); in aac_construct_hbacmd()
1585 ret = aac_build_sg64(cmd, (struct sgmap64 *) &srbcmd->sg); in aac_scsi_64()
1588 srbcmd->count = cpu_to_le32(scsi_bufflen(cmd)); in aac_scsi_64()
1590 memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb)); in aac_scsi_64()
1591 memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len); in aac_scsi_64()
1595 fibsize = sizeof (struct aac_srb) - sizeof (struct sgentry) + in aac_scsi_64()
1596 ((le32_to_cpu(srbcmd->sg.count) & 0xff) * in aac_scsi_64()
1598 BUG_ON (fibsize > (fib->dev->max_fib_size - in aac_scsi_64()
1616 ret = aac_build_sg(cmd, (struct sgmap *)&srbcmd->sg); in aac_scsi_32()
1619 srbcmd->count = cpu_to_le32(scsi_bufflen(cmd)); in aac_scsi_32()
1621 memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb)); in aac_scsi_32()
1622 memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len); in aac_scsi_32()
1627 (((le32_to_cpu(srbcmd->sg.count) & 0xff) - 1) * in aac_scsi_32()
1629 BUG_ON (fibsize > (fib->dev->max_fib_size - in aac_scsi_32()
1641 if ((sizeof(dma_addr_t) > 4) && fib->dev->needs_dac && in aac_scsi_32_64()
1642 (fib->dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)) in aac_scsi_32_64()
1653 dev = (struct aac_dev *)cmd->device->host->hostdata; in aac_adapter_hba()
1656 dev->scsi_host_ptr->sg_tablesize, (u64)fib->hw_sgl_pa); in aac_adapter_hba()
1663 fib->hbacmd_size = 64 + le32_to_cpu(hbacmd->emb_data_desc_count) * in aac_adapter_hba()
1684 if (!dev->sa_firmware) in aac_send_safw_bmic_cmd()
1690 return -ENOMEM; in aac_send_safw_bmic_cmd()
1693 fibptr->hw_fib_va->header.XferState &= in aac_send_safw_bmic_cmd()
1696 fibsize = sizeof(struct aac_srb) - sizeof(struct sgentry) + in aac_send_safw_bmic_cmd()
1700 addr = dma_map_single(&dev->pdev->dev, xfer_buf, xfer_len, in aac_send_safw_bmic_cmd()
1702 if (dma_mapping_error(&dev->pdev->dev, addr)) { in aac_send_safw_bmic_cmd()
1703 rcode = -ENOMEM; in aac_send_safw_bmic_cmd()
1708 memcpy(srb, &srbu->srb, sizeof(struct aac_srb)); in aac_send_safw_bmic_cmd()
1711 dev->supplement_adapter_info.virt_device_bus); in aac_send_safw_bmic_cmd()
1713 dev->supplement_adapter_info.virt_device_target); in aac_send_safw_bmic_cmd()
1716 srb->channel = cpu_to_le32(vbus); in aac_send_safw_bmic_cmd()
1717 srb->id = cpu_to_le32(vid); in aac_send_safw_bmic_cmd()
1718 srb->lun = 0; in aac_send_safw_bmic_cmd()
1719 srb->function = cpu_to_le32(SRBF_ExecuteScsi); in aac_send_safw_bmic_cmd()
1720 srb->timeout = 0; in aac_send_safw_bmic_cmd()
1721 srb->retry_limit = 0; in aac_send_safw_bmic_cmd()
1722 srb->cdb_size = cpu_to_le32(16); in aac_send_safw_bmic_cmd()
1723 srb->count = cpu_to_le32(xfer_len); in aac_send_safw_bmic_cmd()
1725 sg64 = (struct sgmap64 *)&srb->sg; in aac_send_safw_bmic_cmd()
1726 sg64->count = cpu_to_le32(1); in aac_send_safw_bmic_cmd()
1727 sg64->sg[0].addr[1] = cpu_to_le32(upper_32_bits(addr)); in aac_send_safw_bmic_cmd()
1728 sg64->sg[0].addr[0] = cpu_to_le32(lower_32_bits(addr)); in aac_send_safw_bmic_cmd()
1729 sg64->sg[0].count = cpu_to_le32(xfer_len); in aac_send_safw_bmic_cmd()
1734 memcpy(&srbu->srb, srb, sizeof(struct aac_srb)); in aac_send_safw_bmic_cmd()
1740 if (rcode == -ERESTARTSYS) in aac_send_safw_bmic_cmd()
1741 rcode = -ERESTART; in aac_send_safw_bmic_cmd()
1747 memcpy(&srbu->srb_reply, srb_reply, sizeof(struct aac_srb_reply)); in aac_send_safw_bmic_cmd()
1750 dma_unmap_single(&dev->pdev->dev, addr, xfer_len, DMA_BIDIRECTIONAL); in aac_send_safw_bmic_cmd()
1762 if (dev->hba_map[bus][target].devtype != AAC_DEVTYPE_NATIVE_RAW) in aac_set_safw_target_qd()
1765 identify_resp = dev->hba_map[bus][target].safw_identify_resp; in aac_set_safw_target_qd()
1767 dev->hba_map[bus][target].qd_limit = 32; in aac_set_safw_target_qd()
1771 if (identify_resp->current_queue_depth_limit <= 0 || in aac_set_safw_target_qd()
1772 identify_resp->current_queue_depth_limit > 255) in aac_set_safw_target_qd()
1773 dev->hba_map[bus][target].qd_limit = 32; in aac_set_safw_target_qd()
1775 dev->hba_map[bus][target].qd_limit = in aac_set_safw_target_qd()
1776 identify_resp->current_queue_depth_limit; in aac_set_safw_target_qd()
1782 int rcode = -ENOMEM; in aac_issue_safw_bmic_identify()
1796 srbcmd->flags = cpu_to_le32(SRB_DataIn); in aac_issue_safw_bmic_identify()
1797 srbcmd->cdb[0] = 0x26; in aac_issue_safw_bmic_identify()
1798 srbcmd->cdb[2] = (u8)((AAC_MAX_LUN + target) & 0x00FF); in aac_issue_safw_bmic_identify()
1799 srbcmd->cdb[6] = CISS_IDENTIFY_PHYSICAL_DEVICE; in aac_issue_safw_bmic_identify()
1816 kfree(dev->safw_phys_luns); in aac_free_safw_ciss_luns()
1817 dev->safw_phys_luns = NULL; in aac_free_safw_ciss_luns()
1821 * aac_get_safw_ciss_luns() - Process topology change
1829 int rcode = -ENOMEM; in aac_get_safw_ciss_luns()
1836 (AAC_MAX_TARGETS - 1) * sizeof(struct _ciss_lun); in aac_get_safw_ciss_luns()
1844 srbcmd->flags = cpu_to_le32(SRB_DataIn); in aac_get_safw_ciss_luns()
1845 srbcmd->cdb[0] = CISS_REPORT_PHYSICAL_LUNS; in aac_get_safw_ciss_luns()
1846 srbcmd->cdb[1] = 2; /* extended reporting */ in aac_get_safw_ciss_luns()
1847 srbcmd->cdb[8] = (u8)(datasize >> 8); in aac_get_safw_ciss_luns()
1848 srbcmd->cdb[9] = (u8)(datasize); in aac_get_safw_ciss_luns()
1854 if (phys_luns->resp_flag != 2) { in aac_get_safw_ciss_luns()
1855 rcode = -ENOMSG; in aac_get_safw_ciss_luns()
1859 dev->safw_phys_luns = phys_luns; in aac_get_safw_ciss_luns()
1870 return get_unaligned_be32(&dev->safw_phys_luns->list_length[0])/24; in aac_get_safw_phys_lun_count()
1875 return dev->safw_phys_luns->lun[lun].level2[1] & 0x3f; in aac_get_safw_phys_bus()
1880 return dev->safw_phys_luns->lun[lun].level2[0]; in aac_get_safw_phys_target()
1885 return dev->safw_phys_luns->lun[lun].bus >> 6; in aac_get_safw_phys_expose_flag()
1890 return dev->safw_phys_luns->lun[lun].node_ident[9]; in aac_get_safw_phys_attribs()
1895 return *((u32 *)&dev->safw_phys_luns->lun[lun].node_ident[12]); in aac_get_safw_phys_nexus()
1901 kfree(dev->hba_map[bus][target].safw_identify_resp); in aac_free_safw_identify_resp()
1902 dev->hba_map[bus][target].safw_identify_resp = NULL; in aac_free_safw_identify_resp()
1950 dev->hba_map[bus][target].safw_identify_resp = identify_resp; in aac_get_safw_attr_all_targets()
1961 * aac_set_safw_attr_all_targets- update current hba map with data from FW
1975 dev->scan_counter++; in aac_set_safw_attr_all_targets()
1989 dev->hba_map[bus][target].devtype = in aac_set_safw_attr_all_targets()
1995 dev->hba_map[bus][target].devtype = in aac_set_safw_attr_all_targets()
1997 dev->hba_map[bus][target].rmw_nexus = in aac_set_safw_attr_all_targets()
2000 dev->hba_map[bus][target].devtype = in aac_set_safw_attr_all_targets()
2003 dev->hba_map[bus][target].scan_counter = dev->scan_counter; in aac_set_safw_attr_all_targets()
2027 aac_free_safw_all_identify_resp(dev, -1); in aac_setup_safw_targets()
2049 return -ENOMEM; in aac_get_adapter_info()
2059 -1, 1, /* First `interrupt' command uses special wait */ in aac_get_adapter_info()
2066 if (rcode != -ERESTARTSYS) { in aac_get_adapter_info()
2072 memcpy(&dev->adapter_info, info, sizeof(*info)); in aac_get_adapter_info()
2074 dev->supplement_adapter_info.virt_device_bus = 0xffff; in aac_get_adapter_info()
2075 if (dev->adapter_info.options & AAC_OPT_SUPPLEMENT_ADAPTER_INFO) { in aac_get_adapter_info()
2093 memcpy(&dev->supplement_adapter_info, sinfo, sizeof(*sinfo)); in aac_get_adapter_info()
2094 if (rcode == -ERESTARTSYS) { in aac_get_adapter_info()
2097 return -ENOMEM; in aac_get_adapter_info()
2105 dev->hba_map[bus][target].devtype = 0; in aac_get_adapter_info()
2106 dev->hba_map[bus][target].qd_limit = 0; in aac_get_adapter_info()
2122 command->Command = cpu_to_le32(VM_Ioctl); in aac_get_adapter_info()
2123 command->ObjType = cpu_to_le32(FT_DRIVE); in aac_get_adapter_info()
2124 command->MethodId = cpu_to_le32(1); in aac_get_adapter_info()
2125 command->CtlCmd = cpu_to_le32(GetBusInfo); in aac_get_adapter_info()
2135 dev->maximum_num_physicals = 16; in aac_get_adapter_info()
2136 if (rcode >= 0 && le32_to_cpu(bus_info->Status) == ST_OK) { in aac_get_adapter_info()
2137 dev->maximum_num_physicals = le32_to_cpu(bus_info->TargetsPerBus); in aac_get_adapter_info()
2138 dev->maximum_num_channels = le32_to_cpu(bus_info->BusCount); in aac_get_adapter_info()
2141 if (!dev->in_reset) { in aac_get_adapter_info()
2143 tmp = le32_to_cpu(dev->adapter_info.kernelrev); in aac_get_adapter_info()
2144 printk(KERN_INFO "%s%d: kernel %d.%d-%d[%d] %.*s\n", in aac_get_adapter_info()
2145 dev->name, in aac_get_adapter_info()
2146 dev->id, in aac_get_adapter_info()
2150 le32_to_cpu(dev->adapter_info.kernelbuild), in aac_get_adapter_info()
2151 (int)sizeof(dev->supplement_adapter_info.build_date), in aac_get_adapter_info()
2152 dev->supplement_adapter_info.build_date); in aac_get_adapter_info()
2153 tmp = le32_to_cpu(dev->adapter_info.monitorrev); in aac_get_adapter_info()
2154 printk(KERN_INFO "%s%d: monitor %d.%d-%d[%d]\n", in aac_get_adapter_info()
2155 dev->name, dev->id, in aac_get_adapter_info()
2157 le32_to_cpu(dev->adapter_info.monitorbuild)); in aac_get_adapter_info()
2158 tmp = le32_to_cpu(dev->adapter_info.biosrev); in aac_get_adapter_info()
2159 printk(KERN_INFO "%s%d: bios %d.%d-%d[%d]\n", in aac_get_adapter_info()
2160 dev->name, dev->id, in aac_get_adapter_info()
2162 le32_to_cpu(dev->adapter_info.biosbuild)); in aac_get_adapter_info()
2165 shost_to_class(dev->scsi_host_ptr), buffer)) in aac_get_adapter_info()
2167 dev->name, dev->id, buffer); in aac_get_adapter_info()
2168 if (dev->supplement_adapter_info.vpd_info.tsid[0]) { in aac_get_adapter_info()
2170 dev->name, dev->id, in aac_get_adapter_info()
2171 (int)sizeof(dev->supplement_adapter_info in aac_get_adapter_info()
2173 dev->supplement_adapter_info.vpd_info.tsid); in aac_get_adapter_info()
2176 (dev->supplement_adapter_info.supported_options2 & in aac_get_adapter_info()
2179 dev->name, dev->id); in aac_get_adapter_info()
2183 dev->cache_protected = 0; in aac_get_adapter_info()
2184 dev->jbod = ((dev->supplement_adapter_info.feature_bits & in aac_get_adapter_info()
2186 dev->nondasd_support = 0; in aac_get_adapter_info()
2187 dev->raid_scsi_mode = 0; in aac_get_adapter_info()
2188 if(dev->adapter_info.options & AAC_OPT_NONDASD) in aac_get_adapter_info()
2189 dev->nondasd_support = 1; in aac_get_adapter_info()
2192 * If the firmware supports ROMB RAID/SCSI mode and we are currently in aac_get_adapter_info()
2193 * in RAID/SCSI mode, set the flag. For now if in this mode we will in aac_get_adapter_info()
2194 * force nondasd support on. If we decide to allow the non-dasd flag in aac_get_adapter_info()
2197 * changed to support the new dev->raid_scsi_mode flag instead of in aac_get_adapter_info()
2198 * leaching off of the dev->nondasd_support flag. Also in linit.c the in aac_get_adapter_info()
2200 * max number of channels based on the aac->nondasd_support flag only. in aac_get_adapter_info()
2202 if ((dev->adapter_info.options & AAC_OPT_SCSI_MANAGED) && in aac_get_adapter_info()
2203 (dev->adapter_info.options & AAC_OPT_RAID_SCSI_MODE)) { in aac_get_adapter_info()
2204 dev->nondasd_support = 1; in aac_get_adapter_info()
2205 dev->raid_scsi_mode = 1; in aac_get_adapter_info()
2207 if (dev->raid_scsi_mode != 0) in aac_get_adapter_info()
2208 printk(KERN_INFO "%s%d: ROMB RAID/SCSI mode enabled\n", in aac_get_adapter_info()
2209 dev->name, dev->id); in aac_get_adapter_info()
2211 if (nondasd != -1) in aac_get_adapter_info()
2212 dev->nondasd_support = (nondasd!=0); in aac_get_adapter_info()
2213 if (dev->nondasd_support && !dev->in_reset) in aac_get_adapter_info()
2214 printk(KERN_INFO "%s%d: Non-DASD support enabled.\n",dev->name, dev->id); in aac_get_adapter_info()
2216 if (dma_get_required_mask(&dev->pdev->dev) > DMA_BIT_MASK(32)) in aac_get_adapter_info()
2217 dev->needs_dac = 1; in aac_get_adapter_info()
2218 dev->dac_support = 0; in aac_get_adapter_info()
2219 if ((sizeof(dma_addr_t) > 4) && dev->needs_dac && in aac_get_adapter_info()
2220 (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)) { in aac_get_adapter_info()
2221 if (!dev->in_reset) in aac_get_adapter_info()
2223 dev->name, dev->id); in aac_get_adapter_info()
2224 dev->dac_support = 1; in aac_get_adapter_info()
2227 if(dacmode != -1) { in aac_get_adapter_info()
2228 dev->dac_support = (dacmode!=0); in aac_get_adapter_info()
2232 if (dev->dac_support && (aac_get_driver_ident(dev->cardtype)->quirks in aac_get_adapter_info()
2234 dev->nondasd_support = 0; in aac_get_adapter_info()
2235 dev->jbod = 0; in aac_get_adapter_info()
2239 if (dev->dac_support) { in aac_get_adapter_info()
2240 if (!dma_set_mask(&dev->pdev->dev, DMA_BIT_MASK(64))) { in aac_get_adapter_info()
2241 if (!dev->in_reset) in aac_get_adapter_info()
2242 dev_info(&dev->pdev->dev, "64 Bit DAC enabled\n"); in aac_get_adapter_info()
2243 } else if (!dma_set_mask(&dev->pdev->dev, DMA_BIT_MASK(32))) { in aac_get_adapter_info()
2244 dev_info(&dev->pdev->dev, "DMA mask set failed, 64 Bit DAC disabled\n"); in aac_get_adapter_info()
2245 dev->dac_support = 0; in aac_get_adapter_info()
2247 dev_info(&dev->pdev->dev, "No suitable DMA available\n"); in aac_get_adapter_info()
2248 rcode = -ENOMEM; in aac_get_adapter_info()
2255 dev->a_ops.adapter_scsi = (dev->dac_support) in aac_get_adapter_info()
2256 ? ((aac_get_driver_ident(dev->cardtype)->quirks & AAC_QUIRK_SCSI_32) in aac_get_adapter_info()
2260 if (dev->raw_io_interface) { in aac_get_adapter_info()
2261 dev->a_ops.adapter_bounds = (dev->raw_io_64) in aac_get_adapter_info()
2264 dev->a_ops.adapter_read = aac_read_raw_io; in aac_get_adapter_info()
2265 dev->a_ops.adapter_write = aac_write_raw_io; in aac_get_adapter_info()
2267 dev->a_ops.adapter_bounds = aac_bounds_32; in aac_get_adapter_info()
2268 dev->scsi_host_ptr->sg_tablesize = (dev->max_fib_size - in aac_get_adapter_info()
2269 sizeof(struct aac_fibhdr) - in aac_get_adapter_info()
2272 if (dev->dac_support) { in aac_get_adapter_info()
2273 dev->a_ops.adapter_read = aac_read_block64; in aac_get_adapter_info()
2274 dev->a_ops.adapter_write = aac_write_block64; in aac_get_adapter_info()
2278 dev->scsi_host_ptr->sg_tablesize = in aac_get_adapter_info()
2279 (dev->max_fib_size - in aac_get_adapter_info()
2280 sizeof(struct aac_fibhdr) - in aac_get_adapter_info()
2285 dev->a_ops.adapter_read = aac_read_block; in aac_get_adapter_info()
2286 dev->a_ops.adapter_write = aac_write_block; in aac_get_adapter_info()
2288 dev->scsi_host_ptr->max_sectors = AAC_MAX_32BIT_SGBCOUNT; in aac_get_adapter_info()
2289 if (!(dev->adapter_info.options & AAC_OPT_NEW_COMM)) { in aac_get_adapter_info()
2295 * (sg_tablesize-1) 4KB elements with one 64KB in aac_get_adapter_info()
2297 * 32bit -> 468 or 238KB 64bit -> 424 or 212KB in aac_get_adapter_info()
2299 dev->scsi_host_ptr->max_sectors = in aac_get_adapter_info()
2300 (dev->scsi_host_ptr->sg_tablesize * 8) + 112; in aac_get_adapter_info()
2303 if (!dev->sync_mode && dev->sa_firmware && in aac_get_adapter_info()
2304 dev->scsi_host_ptr->sg_tablesize > HBA_MAX_SG_SEPARATE) in aac_get_adapter_info()
2305 dev->scsi_host_ptr->sg_tablesize = dev->sg_tablesize = in aac_get_adapter_info()
2309 if (rcode != -ERESTARTSYS) { in aac_get_adapter_info()
2330 dev = fibptr->dev; in io_callback()
2335 switch (scsicmd->cmnd[0]) { in io_callback()
2338 lba = ((scsicmd->cmnd[1] & 0x1F) << 16) | in io_callback()
2339 (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3]; in io_callback()
2343 lba = ((u64)scsicmd->cmnd[2] << 56) | in io_callback()
2344 ((u64)scsicmd->cmnd[3] << 48) | in io_callback()
2345 ((u64)scsicmd->cmnd[4] << 40) | in io_callback()
2346 ((u64)scsicmd->cmnd[5] << 32) | in io_callback()
2347 ((u64)scsicmd->cmnd[6] << 24) | in io_callback()
2348 (scsicmd->cmnd[7] << 16) | in io_callback()
2349 (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; in io_callback()
2353 lba = ((u64)scsicmd->cmnd[2] << 24) | in io_callback()
2354 (scsicmd->cmnd[3] << 16) | in io_callback()
2355 (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; in io_callback()
2358 lba = ((u64)scsicmd->cmnd[2] << 24) | in io_callback()
2359 (scsicmd->cmnd[3] << 16) | in io_callback()
2360 (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; in io_callback()
2373 switch (le32_to_cpu(readreply->status)) { in io_callback()
2375 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in io_callback()
2376 dev->fsa_dev[cid].sense_data.sense_key = NO_SENSE; in io_callback()
2379 scsicmd->result = DID_OK << 16 | SAM_STAT_CHECK_CONDITION; in io_callback()
2380 set_sense(&dev->fsa_dev[cid].sense_data, NOT_READY, in io_callback()
2382 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in io_callback()
2383 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in io_callback()
2387 scsicmd->result = DID_OK << 16 | SAM_STAT_CHECK_CONDITION; in io_callback()
2388 set_sense(&dev->fsa_dev[cid].sense_data, MEDIUM_ERROR, in io_callback()
2390 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in io_callback()
2391 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in io_callback()
2397 le32_to_cpu(readreply->status)); in io_callback()
2399 scsicmd->result = DID_OK << 16 | SAM_STAT_CHECK_CONDITION; in io_callback()
2400 set_sense(&dev->fsa_dev[cid].sense_data, in io_callback()
2403 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in io_callback()
2404 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in io_callback()
2422 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in aac_read()
2426 switch (scsicmd->cmnd[0]) { in aac_read()
2430 lba = ((scsicmd->cmnd[1] & 0x1F) << 16) | in aac_read()
2431 (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3]; in aac_read()
2432 count = scsicmd->cmnd[4]; in aac_read()
2440 lba = ((u64)scsicmd->cmnd[2] << 56) | in aac_read()
2441 ((u64)scsicmd->cmnd[3] << 48) | in aac_read()
2442 ((u64)scsicmd->cmnd[4] << 40) | in aac_read()
2443 ((u64)scsicmd->cmnd[5] << 32) | in aac_read()
2444 ((u64)scsicmd->cmnd[6] << 24) | in aac_read()
2445 (scsicmd->cmnd[7] << 16) | in aac_read()
2446 (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; in aac_read()
2447 count = (scsicmd->cmnd[10] << 24) | in aac_read()
2448 (scsicmd->cmnd[11] << 16) | in aac_read()
2449 (scsicmd->cmnd[12] << 8) | scsicmd->cmnd[13]; in aac_read()
2454 lba = ((u64)scsicmd->cmnd[2] << 24) | in aac_read()
2455 (scsicmd->cmnd[3] << 16) | in aac_read()
2456 (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; in aac_read()
2457 count = (scsicmd->cmnd[6] << 24) | in aac_read()
2458 (scsicmd->cmnd[7] << 16) | in aac_read()
2459 (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; in aac_read()
2464 lba = ((u64)scsicmd->cmnd[2] << 24) | in aac_read()
2465 (scsicmd->cmnd[3] << 16) | in aac_read()
2466 (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; in aac_read()
2467 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8]; in aac_read()
2471 if ((lba + count) > (dev->fsa_dev[scmd_id(scsicmd)].size)) { in aac_read()
2474 scsicmd->result = DID_OK << 16 | SAM_STAT_CHECK_CONDITION; in aac_read()
2475 set_sense(&dev->fsa_dev[cid].sense_data, in aac_read()
2478 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in aac_read()
2479 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in aac_read()
2493 aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE; in aac_read()
2499 if (status == -EINPROGRESS) in aac_read()
2506 scsicmd->result = DID_OK << 16 | SAM_STAT_TASK_SET_FULL; in aac_read()
2523 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in aac_write()
2527 if (scsicmd->cmnd[0] == WRITE_6) /* 6 byte command */ in aac_write()
2529 lba = ((scsicmd->cmnd[1] & 0x1F) << 16) | (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3]; in aac_write()
2530 count = scsicmd->cmnd[4]; in aac_write()
2534 } else if (scsicmd->cmnd[0] == WRITE_16) { /* 16 byte command */ in aac_write()
2537 lba = ((u64)scsicmd->cmnd[2] << 56) | in aac_write()
2538 ((u64)scsicmd->cmnd[3] << 48) | in aac_write()
2539 ((u64)scsicmd->cmnd[4] << 40) | in aac_write()
2540 ((u64)scsicmd->cmnd[5] << 32) | in aac_write()
2541 ((u64)scsicmd->cmnd[6] << 24) | in aac_write()
2542 (scsicmd->cmnd[7] << 16) | in aac_write()
2543 (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; in aac_write()
2544 count = (scsicmd->cmnd[10] << 24) | (scsicmd->cmnd[11] << 16) | in aac_write()
2545 (scsicmd->cmnd[12] << 8) | scsicmd->cmnd[13]; in aac_write()
2546 fua = scsicmd->cmnd[1] & 0x8; in aac_write()
2547 } else if (scsicmd->cmnd[0] == WRITE_12) { /* 12 byte command */ in aac_write()
2550 lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) in aac_write()
2551 | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; in aac_write()
2552 count = (scsicmd->cmnd[6] << 24) | (scsicmd->cmnd[7] << 16) in aac_write()
2553 | (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; in aac_write()
2554 fua = scsicmd->cmnd[1] & 0x8; in aac_write()
2557 …lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) | (scsicmd->cmnd[4] << 8) | scsicmd… in aac_write()
2558 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8]; in aac_write()
2559 fua = scsicmd->cmnd[1] & 0x8; in aac_write()
2562 if ((lba + count) > (dev->fsa_dev[scmd_id(scsicmd)].size)) { in aac_write()
2565 scsicmd->result = DID_OK << 16 | SAM_STAT_CHECK_CONDITION; in aac_write()
2566 set_sense(&dev->fsa_dev[cid].sense_data, in aac_write()
2569 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in aac_write()
2570 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in aac_write()
2584 aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE; in aac_write()
2590 if (status == -EINPROGRESS) in aac_write()
2597 scsicmd->result = DID_OK << 16 | SAM_STAT_TASK_SET_FULL; in aac_write()
2619 if (le32_to_cpu(synchronizereply->status) == CT_OK) in synchronize_callback()
2620 cmd->result = DID_OK << 16 | SAM_STAT_GOOD; in synchronize_callback()
2622 struct scsi_device *sdev = cmd->device; in synchronize_callback()
2623 struct aac_dev *dev = fibptr->dev; in synchronize_callback()
2627 le32_to_cpu(synchronizereply->status)); in synchronize_callback()
2628 cmd->result = DID_OK << 16 | SAM_STAT_CHECK_CONDITION; in synchronize_callback()
2629 set_sense(&dev->fsa_dev[cid].sense_data, in synchronize_callback()
2632 memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in synchronize_callback()
2633 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in synchronize_callback()
2647 struct scsi_device *sdev = scsicmd->device; in aac_synchronize()
2648 struct aac_dev *aac; in aac_synchronize() local
2650 aac = (struct aac_dev *)sdev->host->hostdata; in aac_synchronize()
2651 if (aac->in_reset) in aac_synchronize()
2657 cmd_fibcontext = aac_fib_alloc_tag(aac, scsicmd); in aac_synchronize()
2662 synchronizecmd->command = cpu_to_le32(VM_ContainerConfig); in aac_synchronize()
2663 synchronizecmd->type = cpu_to_le32(CT_FLUSH_CACHE); in aac_synchronize()
2664 synchronizecmd->cid = cpu_to_le32(scmd_id(scsicmd)); in aac_synchronize()
2665 synchronizecmd->count = in aac_synchronize()
2666 cpu_to_le32(sizeof(((struct aac_synchronize_reply *)NULL)->data)); in aac_synchronize()
2667 aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE; in aac_synchronize()
2683 if (status == -EINPROGRESS) in aac_synchronize()
2702 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_start_stop_callback()
2714 struct scsi_device *sdev = scsicmd->device; in aac_start_stop()
2715 struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata; in aac_start_stop() local
2717 if (!(aac->supplement_adapter_info.supported_options2 & in aac_start_stop()
2719 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_start_stop()
2724 if (aac->in_reset) in aac_start_stop()
2730 cmd_fibcontext = aac_fib_alloc_tag(aac, scsicmd); in aac_start_stop()
2735 pmcmd->command = cpu_to_le32(VM_ContainerConfig); in aac_start_stop()
2736 pmcmd->type = cpu_to_le32(CT_POWER_MANAGEMENT); in aac_start_stop()
2738 pmcmd->sub = (scsicmd->cmnd[4] & 1) ? in aac_start_stop()
2740 pmcmd->cid = cpu_to_le32(sdev_id(sdev)); in aac_start_stop()
2741 pmcmd->parm = (scsicmd->cmnd[1] & 1) ? in aac_start_stop()
2743 aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE; in aac_start_stop()
2759 if (status == -EINPROGRESS) in aac_start_stop()
2768 * aac_scsi_cmd() - Process SCSI command
2778 struct Scsi_Host *host = scsicmd->device->host; in aac_scsi_cmd()
2779 struct aac_dev *dev = (struct aac_dev *)host->hostdata; in aac_scsi_cmd()
2780 struct fsa_dev_info *fsa_dev_ptr = dev->fsa_dev; in aac_scsi_cmd()
2783 return -1; in aac_scsi_cmd()
2790 if (cid != host->this_id) { in aac_scsi_cmd()
2792 if((cid >= dev->maximum_num_containers) || in aac_scsi_cmd()
2793 (scsicmd->device->lun != 0)) { in aac_scsi_cmd()
2794 scsicmd->result = DID_NO_CONNECT << 16; in aac_scsi_cmd()
2805 switch (scsicmd->cmnd[0]) { in aac_scsi_cmd()
2807 if (!(dev->raw_io_interface) || in aac_scsi_cmd()
2808 !(dev->raw_io_64) || in aac_scsi_cmd()
2809 ((scsicmd->cmnd[1] & 0x1f) != SAI_READ_CAPACITY_16)) in aac_scsi_cmd()
2815 if (dev->in_reset) in aac_scsi_cmd()
2816 return -1; in aac_scsi_cmd()
2823 } else { /* check for physical non-dasd devices */ in aac_scsi_cmd()
2827 dev->hba_map[bus][cid].devtype in aac_scsi_cmd()
2829 if (dev->in_reset) in aac_scsi_cmd()
2830 return -1; in aac_scsi_cmd()
2832 } else if (dev->nondasd_support || expose_physicals || in aac_scsi_cmd()
2833 dev->jbod) { in aac_scsi_cmd()
2834 if (dev->in_reset) in aac_scsi_cmd()
2835 return -1; in aac_scsi_cmd()
2838 scsicmd->result = DID_NO_CONNECT << 16; in aac_scsi_cmd()
2846 else if ((scsicmd->cmnd[0] != INQUIRY) && /* only INQUIRY & TUR cmnd supported for controller */ in aac_scsi_cmd()
2847 (scsicmd->cmnd[0] != TEST_UNIT_READY)) in aac_scsi_cmd()
2849 …_WARNING "Only INQUIRY & TUR command supported for controller, rcvd = 0x%x.\n", scsicmd->cmnd[0])); in aac_scsi_cmd()
2850 scsicmd->result = DID_OK << 16 | SAM_STAT_CHECK_CONDITION; in aac_scsi_cmd()
2851 set_sense(&dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
2854 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
2855 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in aac_scsi_cmd()
2860 switch (scsicmd->cmnd[0]) { in aac_scsi_cmd()
2865 if (dev->in_reset) in aac_scsi_cmd()
2866 return -1; in aac_scsi_cmd()
2873 if (dev->in_reset) in aac_scsi_cmd()
2874 return -1; in aac_scsi_cmd()
2878 if (((aac_cache & 6) == 6) && dev->cache_protected) { in aac_scsi_cmd()
2879 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_scsi_cmd()
2893 if ((scsicmd->cmnd[1] & 0x1) && aac_wwn) { in aac_scsi_cmd()
2897 arr[0] = (scmd_id(scsicmd) == host->this_id) ? in aac_scsi_cmd()
2899 if (scsicmd->cmnd[2] == 0) { in aac_scsi_cmd()
2905 arr[1] = scsicmd->cmnd[2]; in aac_scsi_cmd()
2908 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_scsi_cmd()
2909 } else if (scsicmd->cmnd[2] == 0x80) { in aac_scsi_cmd()
2913 arr[1] = scsicmd->cmnd[2]; in aac_scsi_cmd()
2919 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_scsi_cmd()
2920 } else if (scsicmd->cmnd[2] == 0x83) { in aac_scsi_cmd()
2921 /* vpd page 0x83 - Device Identification Page */ in aac_scsi_cmd()
2928 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_scsi_cmd()
2931 scsicmd->result = DID_OK << 16 | SAM_STAT_CHECK_CONDITION; in aac_scsi_cmd()
2932 set_sense(&dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
2935 memcpy(scsicmd->sense_buffer, in aac_scsi_cmd()
2936 &dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
2938 sizeof(dev->fsa_dev[cid].sense_data), in aac_scsi_cmd()
2943 inq_data.inqd_ver = 2; /* claim compliance to SCSI-2 */ in aac_scsi_cmd()
2944 …onse data format value of two indicates that the data shall be in the format specified in SCSI-2 */ in aac_scsi_cmd()
2950 * see: <vendor>.c i.e. aac.c in aac_scsi_cmd()
2952 if (cid == host->this_id) { in aac_scsi_cmd()
2957 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_scsi_cmd()
2960 if (dev->in_reset) in aac_scsi_cmd()
2961 return -1; in aac_scsi_cmd()
2968 if (!(dev->raw_io_interface) || in aac_scsi_cmd()
2969 !(dev->raw_io_64) || in aac_scsi_cmd()
2970 ((scsicmd->cmnd[1] & 0x1f) != SAI_READ_CAPACITY_16)) in aac_scsi_cmd()
2978 capacity = fsa_dev_ptr[cid].size - 1; in aac_scsi_cmd()
2993 alloc_len = ((scsicmd->cmnd[10] << 24) in aac_scsi_cmd()
2994 + (scsicmd->cmnd[11] << 16) in aac_scsi_cmd()
2995 + (scsicmd->cmnd[12] << 8) + scsicmd->cmnd[13]); in aac_scsi_cmd()
3001 scsi_bufflen(scsicmd) - alloc_len); in aac_scsi_cmd()
3004 scsicmd->device->removable = 1; in aac_scsi_cmd()
3006 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_scsi_cmd()
3017 capacity = fsa_dev_ptr[cid].size - 1; in aac_scsi_cmd()
3019 capacity = (u32)-1; in aac_scsi_cmd()
3031 scsicmd->device->removable = 1; in aac_scsi_cmd()
3032 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_scsi_cmd()
3043 capacity = fsa_dev_ptr[cid].size - 1; in aac_scsi_cmd()
3045 capacity = (u32)-1; in aac_scsi_cmd()
3047 dprintk((KERN_DEBUG "MODE SENSE command.\n")); in aac_scsi_cmd()
3050 /* Mode data length */ in aac_scsi_cmd()
3051 mpd.hd.data_length = sizeof(mpd.hd) - 1; in aac_scsi_cmd()
3052 /* Medium type - default */ in aac_scsi_cmd()
3054 /* Device-specific param, in aac_scsi_cmd()
3059 if (dev->raw_io_interface && ((aac_cache & 5) != 1)) in aac_scsi_cmd()
3061 if (scsicmd->cmnd[1] & 0x8) in aac_scsi_cmd()
3073 mpd.mpc_buf[0] = scsicmd->cmnd[2]; in aac_scsi_cmd()
3074 if (scsicmd->cmnd[2] == 0x1C) { in aac_scsi_cmd()
3077 /* Mode data length */ in aac_scsi_cmd()
3080 /* Mode data length */ in aac_scsi_cmd()
3094 if (((scsicmd->cmnd[2] & 0x3f) == 8) || in aac_scsi_cmd()
3095 ((scsicmd->cmnd[2] & 0x3f) == 0x3f)) { in aac_scsi_cmd()
3104 if (mode_buf_length > scsicmd->cmnd[4]) in aac_scsi_cmd()
3105 mode_buf_length = scsicmd->cmnd[4]; in aac_scsi_cmd()
3111 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_scsi_cmd()
3121 capacity = fsa_dev_ptr[cid].size - 1; in aac_scsi_cmd()
3123 capacity = (u32)-1; in aac_scsi_cmd()
3125 dprintk((KERN_DEBUG "MODE SENSE 10 byte command.\n")); in aac_scsi_cmd()
3127 /* Mode data length (MSB) */ in aac_scsi_cmd()
3129 /* Mode data length (LSB) */ in aac_scsi_cmd()
3130 mpd10.hd.data_length[1] = sizeof(mpd10.hd) - 1; in aac_scsi_cmd()
3131 /* Medium type - default */ in aac_scsi_cmd()
3133 /* Device-specific param, in aac_scsi_cmd()
3138 if (dev->raw_io_interface && ((aac_cache & 5) != 1)) in aac_scsi_cmd()
3142 if (scsicmd->cmnd[1] & 0x8) { in aac_scsi_cmd()
3173 if (((scsicmd->cmnd[2] & 0x3f) == 8) || in aac_scsi_cmd()
3174 ((scsicmd->cmnd[2] & 0x3f) == 0x3f)) { in aac_scsi_cmd()
3181 if (mode_buf_length > scsicmd->cmnd[8]) in aac_scsi_cmd()
3182 mode_buf_length = scsicmd->cmnd[8]; in aac_scsi_cmd()
3188 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_scsi_cmd()
3193 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
3195 memset(&dev->fsa_dev[cid].sense_data, 0, in aac_scsi_cmd()
3197 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_scsi_cmd()
3202 if (scsicmd->cmnd[4]) in aac_scsi_cmd()
3207 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_scsi_cmd()
3210 * These commands are all No-Ops in aac_scsi_cmd()
3214 scsicmd->result = DID_OK << 16 | SAM_STAT_CHECK_CONDITION; in aac_scsi_cmd()
3215 set_sense(&dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
3218 memcpy(scsicmd->sense_buffer, in aac_scsi_cmd()
3219 &dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
3221 sizeof(dev->fsa_dev[cid].sense_data), in aac_scsi_cmd()
3231 scsicmd->result = DID_OK << 16 | SAM_STAT_GOOD; in aac_scsi_cmd()
3242 scsicmd->cmnd[0])); in aac_scsi_cmd()
3243 scsicmd->result = DID_OK << 16 | SAM_STAT_CHECK_CONDITION; in aac_scsi_cmd()
3244 set_sense(&dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
3247 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
3249 sizeof(dev->fsa_dev[cid].sense_data), in aac_scsi_cmd()
3264 fsa_dev_ptr = dev->fsa_dev; in query_disk()
3266 return -EBUSY; in query_disk()
3268 return -EFAULT; in query_disk()
3269 if (qd.cnum == -1) { in query_disk()
3270 if (qd.id < 0 || qd.id >= dev->maximum_num_containers) in query_disk()
3271 return -EINVAL; in query_disk()
3273 } else if ((qd.bus == -1) && (qd.id == -1) && (qd.lun == -1)) { in query_disk()
3274 if (qd.cnum < 0 || qd.cnum >= dev->maximum_num_containers) in query_disk()
3275 return -EINVAL; in query_disk()
3276 qd.instance = dev->scsi_host_ptr->host_no; in query_disk()
3281 else return -EINVAL; in query_disk()
3296 return -EFAULT; in query_disk()
3305 fsa_dev_ptr = dev->fsa_dev; in force_delete_disk()
3307 return -EBUSY; in force_delete_disk()
3310 return -EFAULT; in force_delete_disk()
3312 if (dd.cnum >= dev->maximum_num_containers) in force_delete_disk()
3313 return -EINVAL; in force_delete_disk()
3330 fsa_dev_ptr = dev->fsa_dev; in delete_disk()
3332 return -EBUSY; in delete_disk()
3335 return -EFAULT; in delete_disk()
3337 if (dd.cnum >= dev->maximum_num_containers) in delete_disk()
3338 return -EINVAL; in delete_disk()
3343 return -EBUSY; in delete_disk()
3366 return -ENOTTY; in aac_dev_ioctl()
3372 * @context: the context set in the fib - here it is scsi cmd
3391 scsicmd->sense_buffer[0] = '\0'; /* Initialize sense valid flag to false */ in aac_srb_callback()
3393 if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) { in aac_srb_callback()
3395 srbreply->srb_status = cpu_to_le32(SRB_STATUS_SUCCESS); in aac_srb_callback()
3396 srbreply->scsi_status = cpu_to_le32(SAM_STAT_GOOD); in aac_srb_callback()
3402 - le32_to_cpu(srbreply->data_xfer_length)); in aac_srb_callback()
3409 if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01) in aac_srb_callback()
3417 if (le32_to_cpu(srbreply->status) != ST_OK) { in aac_srb_callback()
3421 le32_to_cpu(srbreply->status)); in aac_srb_callback()
3422 len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), in aac_srb_callback()
3424 scsicmd->result = DID_ERROR << 16 | SAM_STAT_CHECK_CONDITION; in aac_srb_callback()
3425 memcpy(scsicmd->sense_buffer, in aac_srb_callback()
3426 srbreply->sense_data, len); in aac_srb_callback()
3432 switch ((le32_to_cpu(srbreply->srb_status))&0x3f) { in aac_srb_callback()
3436 scsicmd->result = DID_OK << 16; in aac_srb_callback()
3439 switch (scsicmd->cmnd[0]) { in aac_srb_callback()
3448 if (le32_to_cpu(srbreply->data_xfer_length) in aac_srb_callback()
3449 < scsicmd->underflow) in aac_srb_callback()
3453 scsicmd->result = DID_ERROR << 16; in aac_srb_callback()
3456 scsicmd->result = DID_OK << 16; in aac_srb_callback()
3459 scsicmd->result = DID_OK << 16; in aac_srb_callback()
3464 scsicmd->result = DID_ABORT << 16; in aac_srb_callback()
3468 * Not sure about this one - but assuming the in aac_srb_callback()
3471 scsicmd->result = DID_ERROR << 16; in aac_srb_callback()
3474 scsicmd->result = DID_PARITY << 16; in aac_srb_callback()
3481 scsicmd->result = DID_NO_CONNECT << 16; in aac_srb_callback()
3486 scsicmd->result = DID_TIME_OUT << 16; in aac_srb_callback()
3490 scsicmd->result = DID_BUS_BUSY << 16; in aac_srb_callback()
3494 scsicmd->result = DID_RESET << 16; in aac_srb_callback()
3498 scsicmd->result = DID_ERROR << 16; in aac_srb_callback()
3516 pr_info("aacraid: SRB ERROR(%u) %s scsi cmd 0x%x -scsi status 0x%x\n", in aac_srb_callback()
3517 le32_to_cpu(srbreply->srb_status) & 0x3F, in aac_srb_callback()
3519 le32_to_cpu(srbreply->srb_status) & 0x3F), in aac_srb_callback()
3520 scsicmd->cmnd[0], in aac_srb_callback()
3521 le32_to_cpu(srbreply->scsi_status)); in aac_srb_callback()
3530 if ((scsicmd->cmnd[0] == ATA_12) in aac_srb_callback()
3531 || (scsicmd->cmnd[0] == ATA_16)) { in aac_srb_callback()
3533 if (scsicmd->cmnd[2] & (0x01 << 5)) { in aac_srb_callback()
3534 scsicmd->result = DID_OK << 16; in aac_srb_callback()
3536 scsicmd->result = DID_ERROR << 16; in aac_srb_callback()
3539 scsicmd->result = DID_ERROR << 16; in aac_srb_callback()
3543 if (le32_to_cpu(srbreply->scsi_status) in aac_srb_callback()
3547 scsicmd->result |= SAM_STAT_CHECK_CONDITION; in aac_srb_callback()
3548 len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), in aac_srb_callback()
3552 le32_to_cpu(srbreply->status), len); in aac_srb_callback()
3554 memcpy(scsicmd->sense_buffer, in aac_srb_callback()
3555 srbreply->sense_data, len); in aac_srb_callback()
3561 scsicmd->result |= le32_to_cpu(srbreply->scsi_status); in aac_srb_callback()
3571 scsicmd->result = err->status; in hba_resp_task_complete()
3573 scsi_set_resid(scsicmd, le32_to_cpu(err->residual_count)); in hba_resp_task_complete()
3575 switch (err->status) { in hba_resp_task_complete()
3577 scsicmd->result |= DID_OK << 16; in hba_resp_task_complete()
3583 len = min_t(u8, err->sense_response_data_len, in hba_resp_task_complete()
3586 memcpy(scsicmd->sense_buffer, in hba_resp_task_complete()
3587 err->sense_response_buf, len); in hba_resp_task_complete()
3588 scsicmd->result |= DID_OK << 16; in hba_resp_task_complete()
3592 scsicmd->result |= DID_BUS_BUSY << 16; in hba_resp_task_complete()
3595 scsicmd->result |= DID_ABORT << 16; in hba_resp_task_complete()
3600 scsicmd->result |= DID_ERROR << 16; in hba_resp_task_complete()
3609 switch (err->status) { in hba_resp_task_failure()
3616 if (dev->hba_map[bus][cid].devtype == AAC_DEVTYPE_NATIVE_RAW) { in hba_resp_task_failure()
3617 dev->hba_map[bus][cid].devtype = AAC_DEVTYPE_ARC_RAW; in hba_resp_task_failure()
3618 dev->hba_map[bus][cid].rmw_nexus = 0xffffffff; in hba_resp_task_failure()
3620 scsicmd->result = DID_NO_CONNECT << 16; in hba_resp_task_failure()
3625 scsicmd->result = DID_OK << 16 | SAM_STAT_BUSY; in hba_resp_task_failure()
3628 scsicmd->result = DID_ABORT << 16; in hba_resp_task_failure()
3631 scsicmd->result = DID_NO_CONNECT << 16; in hba_resp_task_failure()
3635 scsicmd->result = DID_OK << 16; in hba_resp_task_failure()
3639 scsicmd->result = DID_ERROR << 16; in hba_resp_task_failure()
3646 * @context: the context set in the fib - here it is scsi cmd
3657 &((struct aac_native_hba *)fibptr->hw_fib_va)->resp.err; in aac_hba_callback()
3665 dev = fibptr->dev; in aac_hba_callback()
3667 if (!(fibptr->flags & FIB_CONTEXT_FLAG_NATIVE_HBA_TMF)) in aac_hba_callback()
3670 if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) { in aac_hba_callback()
3672 scsicmd->result = DID_OK << 16; in aac_hba_callback()
3676 switch (err->service_response) { in aac_hba_callback()
3684 scsicmd->result = DID_ERROR << 16; in aac_hba_callback()
3687 scsicmd->result = DID_NO_CONNECT << 16; in aac_hba_callback()
3691 scsicmd->result = DID_OK << 16; in aac_hba_callback()
3694 scsicmd->result = DID_ERROR << 16; in aac_hba_callback()
3701 if (fibptr->flags & FIB_CONTEXT_FLAG_NATIVE_HBA_TMF) in aac_hba_callback()
3702 aac_priv(scsicmd)->sent_command = 1; in aac_hba_callback()
3720 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in aac_send_srb_fib()
3721 if (scmd_id(scsicmd) >= dev->maximum_num_physicals || in aac_send_srb_fib()
3722 scsicmd->device->lun > 7) { in aac_send_srb_fib()
3723 scsicmd->result = DID_NO_CONNECT << 16; in aac_send_srb_fib()
3732 aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE; in aac_send_srb_fib()
3738 if (status == -EINPROGRESS) in aac_send_srb_fib()
3745 return -1; in aac_send_srb_fib()
3761 dev = shost_priv(scsicmd->device->host); in aac_send_hba_fib()
3762 if (scmd_id(scsicmd) >= dev->maximum_num_physicals || in aac_send_hba_fib()
3763 scsicmd->device->lun > AAC_MAX_LUN - 1) { in aac_send_hba_fib()
3764 scsicmd->result = DID_NO_CONNECT << 16; in aac_send_hba_fib()
3774 return -1; in aac_send_hba_fib()
3776 aac_priv(scsicmd)->owner = AAC_OWNER_FIRMWARE; in aac_send_hba_fib()
3782 if (status == -EINPROGRESS) in aac_send_hba_fib()
3790 return -1; in aac_send_hba_fib()
3802 psg->count = 0; in aac_build_sg()
3803 psg->sg[0].addr = 0; in aac_build_sg()
3804 psg->sg[0].count = 0; in aac_build_sg()
3810 psg->count = cpu_to_le32(nseg); in aac_build_sg()
3813 psg->sg[i].addr = cpu_to_le32(sg_dma_address(sg)); in aac_build_sg()
3814 psg->sg[i].count = cpu_to_le32(sg_dma_len(sg)); in aac_build_sg()
3819 u32 temp = le32_to_cpu(psg->sg[i-1].count) - in aac_build_sg()
3820 (byte_count - scsi_bufflen(scsicmd)); in aac_build_sg()
3821 psg->sg[i-1].count = cpu_to_le32(temp); in aac_build_sg()
3825 if (scsicmd->underflow && (byte_count < scsicmd->underflow)) { in aac_build_sg()
3827 byte_count, scsicmd->underflow); in aac_build_sg()
3843 psg->count = 0; in aac_build_sg64()
3844 psg->sg[0].addr[0] = 0; in aac_build_sg64()
3845 psg->sg[0].addr[1] = 0; in aac_build_sg64()
3846 psg->sg[0].count = 0; in aac_build_sg64()
3855 psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff); in aac_build_sg64()
3856 psg->sg[i].addr[1] = cpu_to_le32(addr>>32); in aac_build_sg64()
3857 psg->sg[i].count = cpu_to_le32(count); in aac_build_sg64()
3860 psg->count = cpu_to_le32(nseg); in aac_build_sg64()
3863 u32 temp = le32_to_cpu(psg->sg[i-1].count) - in aac_build_sg64()
3864 (byte_count - scsi_bufflen(scsicmd)); in aac_build_sg64()
3865 psg->sg[i-1].count = cpu_to_le32(temp); in aac_build_sg64()
3869 if (scsicmd->underflow && (byte_count < scsicmd->underflow)) { in aac_build_sg64()
3871 byte_count, scsicmd->underflow); in aac_build_sg64()
3885 psg->count = 0; in aac_build_sgraw()
3886 psg->sg[0].next = 0; in aac_build_sgraw()
3887 psg->sg[0].prev = 0; in aac_build_sgraw()
3888 psg->sg[0].addr[0] = 0; in aac_build_sgraw()
3889 psg->sg[0].addr[1] = 0; in aac_build_sgraw()
3890 psg->sg[0].count = 0; in aac_build_sgraw()
3891 psg->sg[0].flags = 0; in aac_build_sgraw()
3900 psg->sg[i].next = 0; in aac_build_sgraw()
3901 psg->sg[i].prev = 0; in aac_build_sgraw()
3902 psg->sg[i].addr[1] = cpu_to_le32((u32)(addr>>32)); in aac_build_sgraw()
3903 psg->sg[i].addr[0] = cpu_to_le32((u32)(addr & 0xffffffff)); in aac_build_sgraw()
3904 psg->sg[i].count = cpu_to_le32(count); in aac_build_sgraw()
3905 psg->sg[i].flags = 0; in aac_build_sgraw()
3908 psg->count = cpu_to_le32(nseg); in aac_build_sgraw()
3911 u32 temp = le32_to_cpu(psg->sg[i-1].count) - in aac_build_sgraw()
3912 (byte_count - scsi_bufflen(scsicmd)); in aac_build_sgraw()
3913 psg->sg[i-1].count = cpu_to_le32(temp); in aac_build_sgraw()
3917 if (scsicmd->underflow && (byte_count < scsicmd->underflow)) { in aac_build_sgraw()
3919 byte_count, scsicmd->underflow); in aac_build_sgraw()
3943 rio2->sge[i].addrHigh = cpu_to_le32((u32)(addr>>32)); in aac_build_sgraw2()
3944 rio2->sge[i].addrLow = cpu_to_le32((u32)(addr & 0xffffffff)); in aac_build_sgraw2()
3946 rio2->sge[i].length = cur_size; in aac_build_sgraw2()
3947 rio2->sge[i].flags = 0; in aac_build_sgraw2()
3950 rio2->sgeFirstSize = cur_size; in aac_build_sgraw2()
3952 rio2->sgeNominalSize = cur_size; in aac_build_sgraw2()
3954 } else if ((i+1) < nseg && cur_size != rio2->sgeNominalSize) { in aac_build_sgraw2()
3964 u32 temp = le32_to_cpu(rio2->sge[i-1].length) - in aac_build_sgraw2()
3965 (byte_count - scsi_bufflen(scsicmd)); in aac_build_sgraw2()
3966 rio2->sge[i-1].length = cpu_to_le32(temp); in aac_build_sgraw2()
3970 rio2->sgeCnt = cpu_to_le32(nseg); in aac_build_sgraw2()
3971 rio2->flags |= cpu_to_le16(RIO2_SG_FORMAT_IEEE1212); in aac_build_sgraw2()
3975 for (i = min_size / PAGE_SIZE; i >= 1; --i) { in aac_build_sgraw2()
3978 for (j = 1; j < nseg - 1; ++j) { in aac_build_sgraw2()
3979 if (rio2->sge[j].length % (i*PAGE_SIZE)) { in aac_build_sgraw2()
3983 nseg_new += (rio2->sge[j].length / (i*PAGE_SIZE)); in aac_build_sgraw2()
3995 rio2->flags |= cpu_to_le16(RIO2_SGL_CONFORMANT); in aac_build_sgraw2()
3998 if (scsicmd->underflow && (byte_count < scsicmd->underflow)) { in aac_build_sgraw2()
4000 byte_count, scsicmd->underflow); in aac_build_sgraw2()
4017 return -ENOMEM; in aac_convert_sgraw2()
4019 for (i = 1, pos = 1; i < nseg-1; ++i) { in aac_convert_sgraw2()
4020 for (j = 0; j < rio2->sge[i].length / (pages * PAGE_SIZE); ++j) { in aac_convert_sgraw2()
4021 addr_low = rio2->sge[i].addrLow + j * pages * PAGE_SIZE; in aac_convert_sgraw2()
4023 sge[pos].addrHigh = rio2->sge[i].addrHigh; in aac_convert_sgraw2()
4024 if (addr_low < rio2->sge[i].addrLow) in aac_convert_sgraw2()
4031 sge[pos] = rio2->sge[nseg-1]; in aac_convert_sgraw2()
4032 memcpy(&rio2->sge[1], &sge[1], (nseg_new-1)*sizeof(struct sge_ieee1212)); in aac_convert_sgraw2()
4035 rio2->sgeCnt = cpu_to_le32(nseg_new); in aac_convert_sgraw2()
4036 rio2->flags |= cpu_to_le16(RIO2_SGL_CONFORMANT); in aac_convert_sgraw2()
4037 rio2->sgeNominalSize = pages * PAGE_SIZE; in aac_convert_sgraw2()
4060 sge = &hbacmd->sge[2]; in aac_build_sghba()
4062 sge = &hbacmd->sge[0]; in aac_build_sghba()
4069 sge->addr_hi = cpu_to_le32((u32)(addr>>32)); in aac_build_sghba()
4070 sge->addr_lo = cpu_to_le32((u32)(addr & 0xffffffff)); in aac_build_sghba()
4072 sge->len = cur_size; in aac_build_sghba()
4073 sge->flags = 0; in aac_build_sghba()
4078 sge--; in aac_build_sghba()
4083 temp = le32_to_cpu(sge->len) - byte_count in aac_build_sghba()
4084 - scsi_bufflen(scsicmd); in aac_build_sghba()
4085 sge->len = cpu_to_le32(temp); in aac_build_sghba()
4090 hbacmd->emb_data_desc_count = cpu_to_le32(nseg); in aac_build_sghba()
4091 sge->flags = cpu_to_le32(0x40000000); in aac_build_sghba()
4094 hbacmd->sge[0].flags = cpu_to_le32(0x80000000); in aac_build_sghba()
4095 hbacmd->emb_data_desc_count = (u8)cpu_to_le32(1); in aac_build_sghba()
4096 hbacmd->sge[0].addr_hi = (u32)cpu_to_le32(sg_address >> 32); in aac_build_sghba()
4097 hbacmd->sge[0].addr_lo = in aac_build_sghba()
4102 if (scsicmd->underflow && (byte_count < scsicmd->underflow)) { in aac_build_sghba()
4104 byte_count, scsicmd->underflow); in aac_build_sghba()