• Home
  • Raw
  • Download

Lines Matching +full:aac +full:- +full:mode

2  *	Adaptec AAC series RAID controller driver
8 * Copyright (c) 2000-2010 Adaptec, Inc.
9 * 2010-2015 PMC-Sierra, Inc. (aacraid@pmc-sierra.com)
10 * 2016-2017 Microsemi Corp. (aacraid@microsemi.com)
55 #define INQD_PDT_DA 0x00 /* Direct-access (DISK) device */
158 /*------------------------------------------------------------------------------
160 *----------------------------------------------------------------------------*/
165 u8 inqd_ver; /* ISO version | ECMA version | ANSI-approved version */
167 u8 inqd_len; /* Additional length (n-4) */
168 u8 inqd_pad1[2];/* Reserved - must be zero */
251 static int nondasd = -1;
253 static int dacmode = -1;
255 int aac_commit = -1;
258 int aac_sync_mode; /* Only Sync. transfer - disabled */
259 int aac_convert_sgl = 1; /* convert non-conformable s/g list - enabled */
262 MODULE_PARM_DESC(aac_sync_mode, "Force sync. transfer mode"
265 MODULE_PARM_DESC(aac_convert_sgl, "Convert non-conformable s/g list"
272 "\tbit 0 - Disable FUA in WRITE SCSI commands\n"
273 "\tbit 1 - Disable SYNCHRONIZE_CACHE SCSI command\n"
274 "\tbit 2 - Disable only if Battery is protecting Cache");
285 " 0=PIC(default), 1=MSI, 2=MSI-X)");
301 int numacb = -1;
307 int acbsize = -1;
326 " adapter. a value of -1 forces the reset to adapters programmed to"
329 int expose_physicals = -1;
332 " -1=protect 0=off, 1=on");
341 "\t0 - Disable\n"
342 "\t1 - Array Meta Data Signature (default)\n"
343 "\t2 - Adapter Serial Number");
350 if (unlikely(!scsicmd || !scsicmd->scsi_done)) { in aac_valid_context()
355 scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL; in aac_valid_context()
356 device = scsicmd->device; in aac_valid_context()
366 * aac_get_config_status - check the adapter configuration
377 return -ENOMEM; in aac_get_config_status()
384 dinfo->command = cpu_to_le32(VM_ContainerConfig); in aac_get_config_status()
385 dinfo->type = cpu_to_le32(CT_GET_CONFIG_STATUS); in aac_get_config_status()
386 dinfo->count = cpu_to_le32(sizeof(((struct aac_get_config_status_resp *)NULL)->data)); in aac_get_config_status()
402 le32_to_cpu(reply->response), in aac_get_config_status()
403 le32_to_cpu(reply->status), in aac_get_config_status()
404 le32_to_cpu(reply->data.action))); in aac_get_config_status()
405 if ((le32_to_cpu(reply->response) != ST_OK) || in aac_get_config_status()
406 (le32_to_cpu(reply->status) != CT_OK) || in aac_get_config_status()
407 (le32_to_cpu(reply->data.action) > CFACT_PAUSE)) { in aac_get_config_status()
409 status = -EINVAL; in aac_get_config_status()
423 dinfo->command = cpu_to_le32(VM_ContainerConfig); in aac_get_config_status()
424 dinfo->type = cpu_to_le32(CT_COMMIT_CONFIG); in aac_get_config_status()
442 if (status != -ERESTARTSYS) in aac_get_config_status()
458 * aac_get_containers - list containers
474 return -ENOMEM; in aac_get_containers()
478 dinfo->command = cpu_to_le32(VM_ContainerConfig); in aac_get_containers()
479 dinfo->type = cpu_to_le32(CT_GET_CONTAINER_COUNT); in aac_get_containers()
489 maximum_num_containers = le32_to_cpu(dresp->ContainerSwitchEntries); in aac_get_containers()
490 if (fibptr->dev->supplement_adapter_info.supported_options2 & in aac_get_containers()
493 le32_to_cpu(dresp->MaxSimpleVolumes); in aac_get_containers()
498 if (status != -ERESTARTSYS) in aac_get_containers()
503 if (dev->fsa_dev == NULL || in aac_get_containers()
504 dev->maximum_num_containers != maximum_num_containers) { in aac_get_containers()
506 fsa_dev_ptr = dev->fsa_dev; in aac_get_containers()
508 dev->fsa_dev = kcalloc(maximum_num_containers, in aac_get_containers()
515 if (!dev->fsa_dev) in aac_get_containers()
516 return -ENOMEM; in aac_get_containers()
518 dev->maximum_num_containers = maximum_num_containers; in aac_get_containers()
520 for (index = 0; index < dev->maximum_num_containers; index++) { in aac_get_containers()
521 dev->fsa_dev[index].devname[0] = '\0'; in aac_get_containers()
522 dev->fsa_dev[index].valid = 0; in aac_get_containers()
549 if ((le32_to_cpu(get_name_reply->status) == CT_OK) in get_container_name_callback()
550 && (get_name_reply->data[0] != '\0')) { in get_container_name_callback()
551 char *sp = get_name_reply->data; in get_container_name_callback()
554 sp[data_size - 1] = '\0'; in get_container_name_callback()
559 char d[sizeof(((struct inquiry_data *)NULL)->inqd_pid)]; in get_container_name_callback()
564 } while (--count > 0); in get_container_name_callback()
572 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; in get_container_name_callback()
575 scsicmd->scsi_done(scsicmd); in get_container_name_callback()
579 * aac_get_container_name - get container name, none blocking.
589 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in aac_get_container_name()
597 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; in aac_get_container_name()
599 dinfo->command = cpu_to_le32(VM_ContainerConfig); in aac_get_container_name()
600 dinfo->type = cpu_to_le32(CT_READ_NAME); in aac_get_container_name()
601 dinfo->cid = cpu_to_le32(scmd_id(scsicmd)); in aac_get_container_name()
602 dinfo->count = cpu_to_le32(data_size - 1); in aac_get_container_name()
615 if (status == -EINPROGRESS) in aac_get_container_name()
620 return -1; in aac_get_container_name()
625 struct fsa_dev_info *fsa_dev_ptr = ((struct aac_dev *)(scsicmd->device->host->hostdata))->fsa_dev; in aac_probe_container_callback2()
630 scsicmd->result = DID_NO_CONNECT << 16; in aac_probe_container_callback2()
631 scsicmd->scsi_done(scsicmd); in aac_probe_container_callback2()
646 scsicmd->SCp.Status = 0; in _aac_probe_container2()
647 fsa_dev_ptr = fibptr->dev->fsa_dev; in _aac_probe_container2()
654 fibptr->dev->supplement_adapter_info.supported_options2; in _aac_probe_container2()
656 if ((le32_to_cpu(dresp->status) == ST_OK) && in _aac_probe_container2()
657 (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE) && in _aac_probe_container2()
658 (le32_to_cpu(dresp->mnt[0].state) != FSCS_HIDDEN)) { in _aac_probe_container2()
660 dresp->mnt[0].fileinfo.bdevinfo.block_size = 0x200; in _aac_probe_container2()
661 fsa_dev_ptr->block_size = 0x200; in _aac_probe_container2()
663 fsa_dev_ptr->block_size = in _aac_probe_container2()
664 le32_to_cpu(dresp->mnt[0].fileinfo.bdevinfo.block_size); in _aac_probe_container2()
667 fsa_dev_ptr->identifier[i] = in _aac_probe_container2()
668 dresp->mnt[0].fileinfo.bdevinfo in _aac_probe_container2()
670 fsa_dev_ptr->valid = 1; in _aac_probe_container2()
671 /* sense_key holds the current state of the spin-up */ in _aac_probe_container2()
672 if (dresp->mnt[0].state & cpu_to_le32(FSCS_NOT_READY)) in _aac_probe_container2()
673 fsa_dev_ptr->sense_data.sense_key = NOT_READY; in _aac_probe_container2()
674 else if (fsa_dev_ptr->sense_data.sense_key == NOT_READY) in _aac_probe_container2()
675 fsa_dev_ptr->sense_data.sense_key = NO_SENSE; in _aac_probe_container2()
676 fsa_dev_ptr->type = le32_to_cpu(dresp->mnt[0].vol); in _aac_probe_container2()
677 fsa_dev_ptr->size in _aac_probe_container2()
678 = ((u64)le32_to_cpu(dresp->mnt[0].capacity)) + in _aac_probe_container2()
679 (((u64)le32_to_cpu(dresp->mnt[0].capacityhigh)) << 32); in _aac_probe_container2()
680 fsa_dev_ptr->ro = ((le32_to_cpu(dresp->mnt[0].state) & FSCS_READONLY) != 0); in _aac_probe_container2()
682 if ((fsa_dev_ptr->valid & 1) == 0) in _aac_probe_container2()
683 fsa_dev_ptr->valid = 0; in _aac_probe_container2()
684 scsicmd->SCp.Status = le32_to_cpu(dresp->count); in _aac_probe_container2()
688 callback = (int (*)(struct scsi_cmnd *))(scsicmd->SCp.ptr); in _aac_probe_container2()
689 scsicmd->SCp.ptr = NULL; in _aac_probe_container2()
702 if (!aac_supports_2T(fibptr->dev)) { in _aac_probe_container1()
703 dresp->mnt[0].capacityhigh = 0; in _aac_probe_container1()
704 if ((le32_to_cpu(dresp->status) == ST_OK) && in _aac_probe_container1()
705 (le32_to_cpu(dresp->mnt[0].vol) != CT_NONE)) { in _aac_probe_container1()
719 if (fibptr->dev->supplement_adapter_info.supported_options2 & in _aac_probe_container1()
721 dinfo->command = cpu_to_le32(VM_NameServeAllBlk); in _aac_probe_container1()
723 dinfo->command = cpu_to_le32(VM_NameServe64); in _aac_probe_container1()
725 dinfo->count = cpu_to_le32(scmd_id(scsicmd)); in _aac_probe_container1()
726 dinfo->type = cpu_to_le32(FT_FILESYS); in _aac_probe_container1()
727 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; in _aac_probe_container1()
739 if (status < 0 && status != -EINPROGRESS) { in _aac_probe_container1()
741 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 scsicmd->SCp.ptr = (char *)callback; in _aac_probe_container()
767 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; in _aac_probe_container()
779 if (status == -EINPROGRESS) in _aac_probe_container()
783 scsicmd->SCp.ptr = 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 - query a logical volume
811 scsicmd->device = NULL; in aac_probe_container_callback1()
824 return -ENOMEM; in aac_probe_container()
826 scsicmd->list.next = NULL; in aac_probe_container()
827 scsicmd->scsi_done = (void (*)(struct scsi_cmnd*))aac_probe_container_callback1; in aac_probe_container()
829 scsicmd->device = scsidev; in aac_probe_container()
830 scsidev->sdev_state = 0; in aac_probe_container()
831 scsidev->id = cid; in aac_probe_container()
832 scsidev->host = dev->scsi_host_ptr; in aac_probe_container()
835 while (scsicmd->device == scsidev) in aac_probe_container()
838 status = scsicmd->SCp.Status; in aac_probe_container()
851 * InqStrCopy - string merge
879 "V-MIRRORS",
893 tindex = ARRAY_SIZE(container_types) - 1; in get_container_type()
911 sup_adap_info = &dev->supplement_adapter_info; in setinqstr()
915 if (sup_adap_info->adapter_type_text[0]) { in setinqstr()
918 char *cname = kmemdup(sup_adap_info->adapter_type_text, in setinqstr()
919 sizeof(sup_adap_info->adapter_type_text), in setinqstr()
926 inqstrcpy("SMC", str->vid); in setinqstr()
928 c = sizeof(str->vid); in setinqstr()
929 while (*cp && *cp != ' ' && --c) in setinqstr()
933 inqstrcpy(cname, str->vid); in setinqstr()
941 if (strlen(cp) > sizeof(str->pid)) in setinqstr()
942 cp[sizeof(str->pid)] = '\0'; in setinqstr()
943 inqstrcpy (cp, str->pid); in setinqstr()
947 struct aac_driver_ident *mp = aac_get_driver_ident(dev->cardtype); in setinqstr()
949 inqstrcpy (mp->vname, str->vid); in setinqstr()
951 inqstrcpy (mp->model, str->pid); in setinqstr()
955 char *findit = str->pid; in setinqstr()
959 if (memcmp(findit-4, "RAID", 4) == 0) in setinqstr()
960 *(findit -= 4) = ' '; in setinqstr()
961 if (((findit - str->pid) + strlen(container_types[tindex])) in setinqstr()
962 < (sizeof(str->pid) + sizeof(str->prl))) in setinqstr()
965 inqstrcpy ("V1.0", str->prl); in setinqstr()
973 vpdpage83data->type3.codeset = 1; in build_vpd83_type3()
974 vpdpage83data->type3.identifiertype = 3; in build_vpd83_type3()
975 vpdpage83data->type3.identifierlength = sizeof(vpdpage83data->type3) in build_vpd83_type3()
976 - 4; in build_vpd83_type3()
978 for (container = 0; container < dev->maximum_num_containers; in build_vpd83_type3()
982 memcpy(vpdpage83data->type3.Identifier, in build_vpd83_type3()
983 dev->fsa_dev[container].identifier, in build_vpd83_type3()
1003 if (le32_to_cpu(get_serial_reply->status) == CT_OK) { in get_container_serial_callback()
1005 if (scsicmd->cmnd[2] == 0x83) { in get_container_serial_callback()
1006 /* vpd page 0x83 - Device Identification Page */ in get_container_serial_callback()
1011 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in get_container_serial_callback()
1028 if (dev->sa_firmware) in get_container_serial_callback()
1038 sizeof(vpdpage83data.type1) - 4; in get_container_serial_callback()
1054 (u8)((get_serial_reply->uid >> ((7 - i) * 4)) & 0xF); in get_container_serial_callback()
1057 'A' + (temp - 0xA); in get_container_serial_callback()
1069 sizeof(vpdpage83data.type2) - 4; in get_container_serial_callback()
1076 get_serial_reply->uid; in get_container_serial_callback()
1083 if (dev->sa_firmware) { in get_container_serial_callback()
1096 sp[1] = scsicmd->cmnd[2]; in get_container_serial_callback()
1098 sp[3] = snprintf(sp+4, sizeof(sp)-4, "%08X", in get_container_serial_callback()
1099 le32_to_cpu(get_serial_reply->uid)); in get_container_serial_callback()
1105 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; in get_container_serial_callback()
1108 scsicmd->scsi_done(scsicmd); in get_container_serial_callback()
1112 * aac_get_container_serial - get container serial, none blocking.
1121 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in aac_get_container_serial()
1128 dinfo->command = cpu_to_le32(VM_ContainerConfig); in aac_get_container_serial()
1129 dinfo->type = cpu_to_le32(CT_CID_TO_32BITS_UID); in aac_get_container_serial()
1130 dinfo->cid = cpu_to_le32(scmd_id(scsicmd)); in aac_get_container_serial()
1131 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; in aac_get_container_serial()
1144 if (status == -EINPROGRESS) in aac_get_container_serial()
1149 return -1; in aac_get_container_serial()
1159 * without docs it's quite hard to do it :-)
1168 return snprintf((char *)(data), sizeof(struct scsi_inq) - 4, "%08X%02X", in setinqserial()
1169 le32_to_cpu(dev->adapter_info.serial[0]), cid); in setinqserial()
1204 cmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_bounds_32()
1206 set_sense(&dev->fsa_dev[cid].sense_data, in aac_bounds_32()
1209 memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in aac_bounds_32()
1210 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in aac_bounds_32()
1212 cmd->scsi_done(cmd); in aac_bounds_32()
1227 struct aac_dev *dev = fib->dev; in aac_read_raw_io()
1232 if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 || in aac_read_raw_io()
1233 dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) && in aac_read_raw_io()
1234 !dev->sync_mode) { in aac_read_raw_io()
1238 readcmd2->blockLow = cpu_to_le32((u32)(lba&0xffffffff)); in aac_read_raw_io()
1239 readcmd2->blockHigh = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32)); in aac_read_raw_io()
1240 readcmd2->byteCount = cpu_to_le32(count * in aac_read_raw_io()
1241 dev->fsa_dev[scmd_id(cmd)].block_size); in aac_read_raw_io()
1242 readcmd2->cid = cpu_to_le16(scmd_id(cmd)); in aac_read_raw_io()
1243 readcmd2->flags = cpu_to_le16(RIO2_IO_TYPE_READ); in aac_read_raw_io()
1245 dev->scsi_host_ptr->sg_tablesize); in aac_read_raw_io()
1250 ((le32_to_cpu(readcmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212)); in aac_read_raw_io()
1254 readcmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff)); in aac_read_raw_io()
1255 readcmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32)); in aac_read_raw_io()
1256 readcmd->count = cpu_to_le32(count * in aac_read_raw_io()
1257 dev->fsa_dev[scmd_id(cmd)].block_size); in aac_read_raw_io()
1258 readcmd->cid = cpu_to_le16(scmd_id(cmd)); in aac_read_raw_io()
1259 readcmd->flags = cpu_to_le16(RIO_TYPE_READ); in aac_read_raw_io()
1260 readcmd->bpTotal = 0; in aac_read_raw_io()
1261 readcmd->bpComplete = 0; in aac_read_raw_io()
1262 ret = aac_build_sgraw(cmd, &readcmd->sg); in aac_read_raw_io()
1267 ((le32_to_cpu(readcmd->sg.count)-1) * sizeof(struct sgentryraw)); in aac_read_raw_io()
1270 BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr))); in aac_read_raw_io()
1291 readcmd->command = cpu_to_le32(VM_CtHostRead64); in aac_read_block64()
1292 readcmd->cid = cpu_to_le16(scmd_id(cmd)); in aac_read_block64()
1293 readcmd->sector_count = cpu_to_le16(count); in aac_read_block64()
1294 readcmd->block = cpu_to_le32((u32)(lba&0xffffffff)); in aac_read_block64()
1295 readcmd->pad = 0; in aac_read_block64()
1296 readcmd->flags = 0; in aac_read_block64()
1298 ret = aac_build_sg64(cmd, &readcmd->sg); in aac_read_block64()
1302 ((le32_to_cpu(readcmd->sg.count) - 1) * in aac_read_block64()
1304 BUG_ON (fibsize > (fib->dev->max_fib_size - in aac_read_block64()
1322 struct aac_dev *dev = fib->dev; in aac_read_block()
1327 readcmd->command = cpu_to_le32(VM_CtBlockRead); in aac_read_block()
1328 readcmd->cid = cpu_to_le32(scmd_id(cmd)); in aac_read_block()
1329 readcmd->block = cpu_to_le32((u32)(lba&0xffffffff)); in aac_read_block()
1330 readcmd->count = cpu_to_le32(count * in aac_read_block()
1331 dev->fsa_dev[scmd_id(cmd)].block_size); in aac_read_block()
1333 ret = aac_build_sg(cmd, &readcmd->sg); in aac_read_block()
1337 ((le32_to_cpu(readcmd->sg.count) - 1) * in aac_read_block()
1339 BUG_ON (fibsize > (fib->dev->max_fib_size - in aac_read_block()
1355 struct aac_dev *dev = fib->dev; in aac_write_raw_io()
1360 if ((dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 || in aac_write_raw_io()
1361 dev->comm_interface == AAC_COMM_MESSAGE_TYPE3) && in aac_write_raw_io()
1362 !dev->sync_mode) { in aac_write_raw_io()
1366 writecmd2->blockLow = cpu_to_le32((u32)(lba&0xffffffff)); in aac_write_raw_io()
1367 writecmd2->blockHigh = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32)); in aac_write_raw_io()
1368 writecmd2->byteCount = cpu_to_le32(count * in aac_write_raw_io()
1369 dev->fsa_dev[scmd_id(cmd)].block_size); in aac_write_raw_io()
1370 writecmd2->cid = cpu_to_le16(scmd_id(cmd)); in aac_write_raw_io()
1371 writecmd2->flags = (fua && ((aac_cache & 5) != 1) && in aac_write_raw_io()
1372 (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ? in aac_write_raw_io()
1376 dev->scsi_host_ptr->sg_tablesize); in aac_write_raw_io()
1381 ((le32_to_cpu(writecmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212)); in aac_write_raw_io()
1385 writecmd->block[0] = cpu_to_le32((u32)(lba&0xffffffff)); in aac_write_raw_io()
1386 writecmd->block[1] = cpu_to_le32((u32)((lba&0xffffffff00000000LL)>>32)); in aac_write_raw_io()
1387 writecmd->count = cpu_to_le32(count * in aac_write_raw_io()
1388 dev->fsa_dev[scmd_id(cmd)].block_size); in aac_write_raw_io()
1389 writecmd->cid = cpu_to_le16(scmd_id(cmd)); in aac_write_raw_io()
1390 writecmd->flags = (fua && ((aac_cache & 5) != 1) && in aac_write_raw_io()
1391 (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ? in aac_write_raw_io()
1394 writecmd->bpTotal = 0; in aac_write_raw_io()
1395 writecmd->bpComplete = 0; in aac_write_raw_io()
1396 ret = aac_build_sgraw(cmd, &writecmd->sg); in aac_write_raw_io()
1401 ((le32_to_cpu(writecmd->sg.count)-1) * sizeof (struct sgentryraw)); in aac_write_raw_io()
1404 BUG_ON(fibsize > (fib->dev->max_fib_size - sizeof(struct aac_fibhdr))); in aac_write_raw_io()
1425 writecmd->command = cpu_to_le32(VM_CtHostWrite64); in aac_write_block64()
1426 writecmd->cid = cpu_to_le16(scmd_id(cmd)); in aac_write_block64()
1427 writecmd->sector_count = cpu_to_le16(count); in aac_write_block64()
1428 writecmd->block = cpu_to_le32((u32)(lba&0xffffffff)); in aac_write_block64()
1429 writecmd->pad = 0; in aac_write_block64()
1430 writecmd->flags = 0; in aac_write_block64()
1432 ret = aac_build_sg64(cmd, &writecmd->sg); in aac_write_block64()
1436 ((le32_to_cpu(writecmd->sg.count) - 1) * in aac_write_block64()
1438 BUG_ON (fibsize > (fib->dev->max_fib_size - in aac_write_block64()
1456 struct aac_dev *dev = fib->dev; in aac_write_block()
1461 writecmd->command = cpu_to_le32(VM_CtBlockWrite); in aac_write_block()
1462 writecmd->cid = cpu_to_le32(scmd_id(cmd)); in aac_write_block()
1463 writecmd->block = cpu_to_le32((u32)(lba&0xffffffff)); in aac_write_block()
1464 writecmd->count = cpu_to_le32(count * in aac_write_block()
1465 dev->fsa_dev[scmd_id(cmd)].block_size); in aac_write_block()
1466 writecmd->sg.count = cpu_to_le32(1); in aac_write_block()
1467 /* ->stable is not used - it did mean which type of write */ in aac_write_block()
1469 ret = aac_build_sg(cmd, &writecmd->sg); in aac_write_block()
1473 ((le32_to_cpu(writecmd->sg.count) - 1) * in aac_write_block()
1475 BUG_ON (fibsize > (fib->dev->max_fib_size - in aac_write_block()
1496 switch(cmd->sc_data_direction){ in aac_scsi_common()
1513 srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); in aac_scsi_common()
1514 srbcmd->channel = cpu_to_le32(aac_logical_to_phys(scmd_channel(cmd))); in aac_scsi_common()
1515 srbcmd->id = cpu_to_le32(scmd_id(cmd)); in aac_scsi_common()
1516 srbcmd->lun = cpu_to_le32(cmd->device->lun); in aac_scsi_common()
1517 srbcmd->flags = cpu_to_le32(flag); in aac_scsi_common()
1518 timeout = cmd->request->timeout/HZ; in aac_scsi_common()
1521 srbcmd->timeout = cpu_to_le32(timeout); // timeout in seconds in aac_scsi_common()
1522 srbcmd->retry_limit = 0; /* Obsolete parameter */ in aac_scsi_common()
1523 srbcmd->cdb_size = cpu_to_le32(cmd->cmd_len); in aac_scsi_common()
1535 dev = (struct aac_dev *)cmd->device->host->hostdata; in aac_construct_hbacmd()
1537 hbacmd = (struct aac_hba_cmd_req *)fib->hw_fib_va; in aac_construct_hbacmd()
1540 switch (cmd->sc_data_direction) { in aac_construct_hbacmd()
1542 hbacmd->byte1 = 2; in aac_construct_hbacmd()
1546 hbacmd->byte1 = 1; in aac_construct_hbacmd()
1552 hbacmd->lun[1] = cpu_to_le32(cmd->device->lun); in aac_construct_hbacmd()
1556 hbacmd->it_nexus = dev->hba_map[bus][target].rmw_nexus; in aac_construct_hbacmd()
1562 memcpy(hbacmd->cdb, cmd->cmnd, cmd->cmd_len); in aac_construct_hbacmd()
1563 hbacmd->data_length = cpu_to_le32(scsi_bufflen(cmd)); in aac_construct_hbacmd()
1565 address = (u64)fib->hw_error_pa; in aac_construct_hbacmd()
1566 hbacmd->error_ptr_hi = cpu_to_le32((u32)(address >> 32)); in aac_construct_hbacmd()
1567 hbacmd->error_ptr_lo = cpu_to_le32((u32)(address & 0xffffffff)); in aac_construct_hbacmd()
1568 hbacmd->error_length = cpu_to_le32(FW_ERROR_BUFFER_SIZE); in aac_construct_hbacmd()
1581 ret = aac_build_sg64(cmd, (struct sgmap64 *) &srbcmd->sg); in aac_scsi_64()
1584 srbcmd->count = cpu_to_le32(scsi_bufflen(cmd)); in aac_scsi_64()
1586 memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb)); in aac_scsi_64()
1587 memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len); in aac_scsi_64()
1591 fibsize = sizeof (struct aac_srb) - sizeof (struct sgentry) + in aac_scsi_64()
1592 ((le32_to_cpu(srbcmd->sg.count) & 0xff) * in aac_scsi_64()
1594 BUG_ON (fibsize > (fib->dev->max_fib_size - in aac_scsi_64()
1612 ret = aac_build_sg(cmd, (struct sgmap *)&srbcmd->sg); in aac_scsi_32()
1615 srbcmd->count = cpu_to_le32(scsi_bufflen(cmd)); in aac_scsi_32()
1617 memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb)); in aac_scsi_32()
1618 memcpy(srbcmd->cdb, cmd->cmnd, cmd->cmd_len); in aac_scsi_32()
1623 (((le32_to_cpu(srbcmd->sg.count) & 0xff) - 1) * in aac_scsi_32()
1625 BUG_ON (fibsize > (fib->dev->max_fib_size - in aac_scsi_32()
1637 if ((sizeof(dma_addr_t) > 4) && fib->dev->needs_dac && in aac_scsi_32_64()
1638 (fib->dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)) in aac_scsi_32_64()
1649 dev = (struct aac_dev *)cmd->device->host->hostdata; in aac_adapter_hba()
1652 dev->scsi_host_ptr->sg_tablesize, (u64)fib->hw_sgl_pa); in aac_adapter_hba()
1659 fib->hbacmd_size = 64 + le32_to_cpu(hbacmd->emb_data_desc_count) * in aac_adapter_hba()
1680 if (!dev->sa_firmware) in aac_send_safw_bmic_cmd()
1686 return -ENOMEM; in aac_send_safw_bmic_cmd()
1689 fibptr->hw_fib_va->header.XferState &= in aac_send_safw_bmic_cmd()
1692 fibsize = sizeof(struct aac_srb) - sizeof(struct sgentry) + in aac_send_safw_bmic_cmd()
1696 addr = dma_map_single(&dev->pdev->dev, xfer_buf, xfer_len, in aac_send_safw_bmic_cmd()
1698 if (dma_mapping_error(&dev->pdev->dev, addr)) { in aac_send_safw_bmic_cmd()
1699 rcode = -ENOMEM; in aac_send_safw_bmic_cmd()
1704 memcpy(srb, &srbu->srb, sizeof(struct aac_srb)); in aac_send_safw_bmic_cmd()
1707 dev->supplement_adapter_info.virt_device_bus); in aac_send_safw_bmic_cmd()
1709 dev->supplement_adapter_info.virt_device_target); in aac_send_safw_bmic_cmd()
1712 srb->channel = cpu_to_le32(vbus); in aac_send_safw_bmic_cmd()
1713 srb->id = cpu_to_le32(vid); in aac_send_safw_bmic_cmd()
1714 srb->lun = 0; in aac_send_safw_bmic_cmd()
1715 srb->function = cpu_to_le32(SRBF_ExecuteScsi); in aac_send_safw_bmic_cmd()
1716 srb->timeout = 0; in aac_send_safw_bmic_cmd()
1717 srb->retry_limit = 0; in aac_send_safw_bmic_cmd()
1718 srb->cdb_size = cpu_to_le32(16); in aac_send_safw_bmic_cmd()
1719 srb->count = cpu_to_le32(xfer_len); in aac_send_safw_bmic_cmd()
1721 sg64 = (struct sgmap64 *)&srb->sg; in aac_send_safw_bmic_cmd()
1722 sg64->count = cpu_to_le32(1); in aac_send_safw_bmic_cmd()
1723 sg64->sg[0].addr[1] = cpu_to_le32(upper_32_bits(addr)); in aac_send_safw_bmic_cmd()
1724 sg64->sg[0].addr[0] = cpu_to_le32(lower_32_bits(addr)); in aac_send_safw_bmic_cmd()
1725 sg64->sg[0].count = cpu_to_le32(xfer_len); in aac_send_safw_bmic_cmd()
1730 memcpy(&srbu->srb, srb, sizeof(struct aac_srb)); in aac_send_safw_bmic_cmd()
1736 if (rcode == -ERESTARTSYS) in aac_send_safw_bmic_cmd()
1737 rcode = -ERESTART; in aac_send_safw_bmic_cmd()
1743 memcpy(&srbu->srb_reply, srb_reply, sizeof(struct aac_srb_reply)); in aac_send_safw_bmic_cmd()
1746 dma_unmap_single(&dev->pdev->dev, addr, xfer_len, DMA_BIDIRECTIONAL); in aac_send_safw_bmic_cmd()
1758 if (dev->hba_map[bus][target].devtype != AAC_DEVTYPE_NATIVE_RAW) in aac_set_safw_target_qd()
1761 identify_resp = dev->hba_map[bus][target].safw_identify_resp; in aac_set_safw_target_qd()
1763 dev->hba_map[bus][target].qd_limit = 32; in aac_set_safw_target_qd()
1767 if (identify_resp->current_queue_depth_limit <= 0 || in aac_set_safw_target_qd()
1768 identify_resp->current_queue_depth_limit > 255) in aac_set_safw_target_qd()
1769 dev->hba_map[bus][target].qd_limit = 32; in aac_set_safw_target_qd()
1771 dev->hba_map[bus][target].qd_limit = in aac_set_safw_target_qd()
1772 identify_resp->current_queue_depth_limit; in aac_set_safw_target_qd()
1778 int rcode = -ENOMEM; in aac_issue_safw_bmic_identify()
1792 srbcmd->flags = cpu_to_le32(SRB_DataIn); in aac_issue_safw_bmic_identify()
1793 srbcmd->cdb[0] = 0x26; in aac_issue_safw_bmic_identify()
1794 srbcmd->cdb[2] = (u8)((AAC_MAX_LUN + target) & 0x00FF); in aac_issue_safw_bmic_identify()
1795 srbcmd->cdb[6] = CISS_IDENTIFY_PHYSICAL_DEVICE; in aac_issue_safw_bmic_identify()
1812 kfree(dev->safw_phys_luns); in aac_free_safw_ciss_luns()
1813 dev->safw_phys_luns = NULL; in aac_free_safw_ciss_luns()
1825 int rcode = -ENOMEM; in aac_get_safw_ciss_luns()
1832 (AAC_MAX_TARGETS - 1) * sizeof(struct _ciss_lun); in aac_get_safw_ciss_luns()
1840 srbcmd->flags = cpu_to_le32(SRB_DataIn); in aac_get_safw_ciss_luns()
1841 srbcmd->cdb[0] = CISS_REPORT_PHYSICAL_LUNS; in aac_get_safw_ciss_luns()
1842 srbcmd->cdb[1] = 2; /* extended reporting */ in aac_get_safw_ciss_luns()
1843 srbcmd->cdb[8] = (u8)(datasize >> 8); in aac_get_safw_ciss_luns()
1844 srbcmd->cdb[9] = (u8)(datasize); in aac_get_safw_ciss_luns()
1850 if (phys_luns->resp_flag != 2) { in aac_get_safw_ciss_luns()
1851 rcode = -ENOMSG; in aac_get_safw_ciss_luns()
1855 dev->safw_phys_luns = phys_luns; in aac_get_safw_ciss_luns()
1866 return get_unaligned_be32(&dev->safw_phys_luns->list_length[0])/24; in aac_get_safw_phys_lun_count()
1871 return dev->safw_phys_luns->lun[lun].level2[1] & 0x3f; in aac_get_safw_phys_bus()
1876 return dev->safw_phys_luns->lun[lun].level2[0]; in aac_get_safw_phys_target()
1881 return dev->safw_phys_luns->lun[lun].bus >> 6; in aac_get_safw_phys_expose_flag()
1886 return dev->safw_phys_luns->lun[lun].node_ident[9]; in aac_get_safw_phys_attribs()
1891 return *((u32 *)&dev->safw_phys_luns->lun[lun].node_ident[12]); in aac_get_safw_phys_nexus()
1896 return dev->safw_phys_luns->lun[lun].node_ident[8]; in aac_get_safw_phys_device_type()
1902 kfree(dev->hba_map[bus][target].safw_identify_resp); in aac_free_safw_identify_resp()
1903 dev->hba_map[bus][target].safw_identify_resp = NULL; in aac_free_safw_identify_resp()
1951 dev->hba_map[bus][target].safw_identify_resp = identify_resp; in aac_get_safw_attr_all_targets()
1962 * aac_set_safw_attr_all_targets- update current hba map with data from FW
1978 dev->scan_counter++; in aac_set_safw_attr_all_targets()
1992 dev->hba_map[bus][target].devtype = in aac_set_safw_attr_all_targets()
1998 dev->hba_map[bus][target].devtype = in aac_set_safw_attr_all_targets()
2000 dev->hba_map[bus][target].rmw_nexus = in aac_set_safw_attr_all_targets()
2003 dev->hba_map[bus][target].devtype = in aac_set_safw_attr_all_targets()
2006 dev->hba_map[bus][target].scan_counter = dev->scan_counter; in aac_set_safw_attr_all_targets()
2030 aac_free_safw_all_identify_resp(dev, -1); in aac_setup_safw_targets()
2052 return -ENOMEM; in aac_get_adapter_info()
2062 -1, 1, /* First `interrupt' command uses special wait */ in aac_get_adapter_info()
2069 if (rcode != -ERESTARTSYS) { in aac_get_adapter_info()
2075 memcpy(&dev->adapter_info, info, sizeof(*info)); in aac_get_adapter_info()
2077 dev->supplement_adapter_info.virt_device_bus = 0xffff; in aac_get_adapter_info()
2078 if (dev->adapter_info.options & AAC_OPT_SUPPLEMENT_ADAPTER_INFO) { in aac_get_adapter_info()
2096 memcpy(&dev->supplement_adapter_info, sinfo, sizeof(*sinfo)); in aac_get_adapter_info()
2097 if (rcode == -ERESTARTSYS) { in aac_get_adapter_info()
2100 return -ENOMEM; in aac_get_adapter_info()
2108 dev->hba_map[bus][target].devtype = 0; in aac_get_adapter_info()
2109 dev->hba_map[bus][target].qd_limit = 0; in aac_get_adapter_info()
2125 command->Command = cpu_to_le32(VM_Ioctl); in aac_get_adapter_info()
2126 command->ObjType = cpu_to_le32(FT_DRIVE); in aac_get_adapter_info()
2127 command->MethodId = cpu_to_le32(1); in aac_get_adapter_info()
2128 command->CtlCmd = cpu_to_le32(GetBusInfo); in aac_get_adapter_info()
2138 dev->maximum_num_physicals = 16; in aac_get_adapter_info()
2139 if (rcode >= 0 && le32_to_cpu(bus_info->Status) == ST_OK) { in aac_get_adapter_info()
2140 dev->maximum_num_physicals = le32_to_cpu(bus_info->TargetsPerBus); in aac_get_adapter_info()
2141 dev->maximum_num_channels = le32_to_cpu(bus_info->BusCount); in aac_get_adapter_info()
2144 if (!dev->in_reset) { in aac_get_adapter_info()
2146 tmp = le32_to_cpu(dev->adapter_info.kernelrev); in aac_get_adapter_info()
2147 printk(KERN_INFO "%s%d: kernel %d.%d-%d[%d] %.*s\n", in aac_get_adapter_info()
2148 dev->name, in aac_get_adapter_info()
2149 dev->id, in aac_get_adapter_info()
2153 le32_to_cpu(dev->adapter_info.kernelbuild), in aac_get_adapter_info()
2154 (int)sizeof(dev->supplement_adapter_info.build_date), in aac_get_adapter_info()
2155 dev->supplement_adapter_info.build_date); in aac_get_adapter_info()
2156 tmp = le32_to_cpu(dev->adapter_info.monitorrev); in aac_get_adapter_info()
2157 printk(KERN_INFO "%s%d: monitor %d.%d-%d[%d]\n", in aac_get_adapter_info()
2158 dev->name, dev->id, in aac_get_adapter_info()
2160 le32_to_cpu(dev->adapter_info.monitorbuild)); in aac_get_adapter_info()
2161 tmp = le32_to_cpu(dev->adapter_info.biosrev); in aac_get_adapter_info()
2162 printk(KERN_INFO "%s%d: bios %d.%d-%d[%d]\n", in aac_get_adapter_info()
2163 dev->name, dev->id, in aac_get_adapter_info()
2165 le32_to_cpu(dev->adapter_info.biosbuild)); in aac_get_adapter_info()
2168 shost_to_class(dev->scsi_host_ptr), buffer)) in aac_get_adapter_info()
2170 dev->name, dev->id, buffer); in aac_get_adapter_info()
2171 if (dev->supplement_adapter_info.vpd_info.tsid[0]) { in aac_get_adapter_info()
2173 dev->name, dev->id, in aac_get_adapter_info()
2174 (int)sizeof(dev->supplement_adapter_info in aac_get_adapter_info()
2176 dev->supplement_adapter_info.vpd_info.tsid); in aac_get_adapter_info()
2179 (dev->supplement_adapter_info.supported_options2 & in aac_get_adapter_info()
2182 dev->name, dev->id); in aac_get_adapter_info()
2186 dev->cache_protected = 0; in aac_get_adapter_info()
2187 dev->jbod = ((dev->supplement_adapter_info.feature_bits & in aac_get_adapter_info()
2189 dev->nondasd_support = 0; in aac_get_adapter_info()
2190 dev->raid_scsi_mode = 0; in aac_get_adapter_info()
2191 if(dev->adapter_info.options & AAC_OPT_NONDASD) in aac_get_adapter_info()
2192 dev->nondasd_support = 1; in aac_get_adapter_info()
2195 * If the firmware supports ROMB RAID/SCSI mode and we are currently in aac_get_adapter_info()
2196 * in RAID/SCSI mode, set the flag. For now if in this mode we will in aac_get_adapter_info()
2197 * force nondasd support on. If we decide to allow the non-dasd flag in aac_get_adapter_info()
2200 * changed to support the new dev->raid_scsi_mode flag instead of in aac_get_adapter_info()
2201 * leaching off of the dev->nondasd_support flag. Also in linit.c the in aac_get_adapter_info()
2203 * max number of channels based on the aac->nondasd_support flag only. in aac_get_adapter_info()
2205 if ((dev->adapter_info.options & AAC_OPT_SCSI_MANAGED) && in aac_get_adapter_info()
2206 (dev->adapter_info.options & AAC_OPT_RAID_SCSI_MODE)) { in aac_get_adapter_info()
2207 dev->nondasd_support = 1; in aac_get_adapter_info()
2208 dev->raid_scsi_mode = 1; in aac_get_adapter_info()
2210 if (dev->raid_scsi_mode != 0) in aac_get_adapter_info()
2211 printk(KERN_INFO "%s%d: ROMB RAID/SCSI mode enabled\n", in aac_get_adapter_info()
2212 dev->name, dev->id); in aac_get_adapter_info()
2214 if (nondasd != -1) in aac_get_adapter_info()
2215 dev->nondasd_support = (nondasd!=0); in aac_get_adapter_info()
2216 if (dev->nondasd_support && !dev->in_reset) in aac_get_adapter_info()
2217 printk(KERN_INFO "%s%d: Non-DASD support enabled.\n",dev->name, dev->id); in aac_get_adapter_info()
2219 if (dma_get_required_mask(&dev->pdev->dev) > DMA_BIT_MASK(32)) in aac_get_adapter_info()
2220 dev->needs_dac = 1; in aac_get_adapter_info()
2221 dev->dac_support = 0; in aac_get_adapter_info()
2222 if ((sizeof(dma_addr_t) > 4) && dev->needs_dac && in aac_get_adapter_info()
2223 (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)) { in aac_get_adapter_info()
2224 if (!dev->in_reset) in aac_get_adapter_info()
2226 dev->name, dev->id); in aac_get_adapter_info()
2227 dev->dac_support = 1; in aac_get_adapter_info()
2230 if(dacmode != -1) { in aac_get_adapter_info()
2231 dev->dac_support = (dacmode!=0); in aac_get_adapter_info()
2235 if (dev->dac_support && (aac_get_driver_ident(dev->cardtype)->quirks in aac_get_adapter_info()
2237 dev->nondasd_support = 0; in aac_get_adapter_info()
2238 dev->jbod = 0; in aac_get_adapter_info()
2242 if (dev->dac_support) { in aac_get_adapter_info()
2243 if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(64))) { in aac_get_adapter_info()
2244 if (!dev->in_reset) in aac_get_adapter_info()
2245 dev_info(&dev->pdev->dev, "64 Bit DAC enabled\n"); in aac_get_adapter_info()
2246 } else if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(32))) { in aac_get_adapter_info()
2247 dev_info(&dev->pdev->dev, "DMA mask set failed, 64 Bit DAC disabled\n"); in aac_get_adapter_info()
2248 dev->dac_support = 0; in aac_get_adapter_info()
2250 dev_info(&dev->pdev->dev, "No suitable DMA available\n"); in aac_get_adapter_info()
2251 rcode = -ENOMEM; in aac_get_adapter_info()
2258 dev->a_ops.adapter_scsi = (dev->dac_support) in aac_get_adapter_info()
2259 ? ((aac_get_driver_ident(dev->cardtype)->quirks & AAC_QUIRK_SCSI_32) in aac_get_adapter_info()
2263 if (dev->raw_io_interface) { in aac_get_adapter_info()
2264 dev->a_ops.adapter_bounds = (dev->raw_io_64) in aac_get_adapter_info()
2267 dev->a_ops.adapter_read = aac_read_raw_io; in aac_get_adapter_info()
2268 dev->a_ops.adapter_write = aac_write_raw_io; in aac_get_adapter_info()
2270 dev->a_ops.adapter_bounds = aac_bounds_32; in aac_get_adapter_info()
2271 dev->scsi_host_ptr->sg_tablesize = (dev->max_fib_size - in aac_get_adapter_info()
2272 sizeof(struct aac_fibhdr) - in aac_get_adapter_info()
2275 if (dev->dac_support) { in aac_get_adapter_info()
2276 dev->a_ops.adapter_read = aac_read_block64; in aac_get_adapter_info()
2277 dev->a_ops.adapter_write = aac_write_block64; in aac_get_adapter_info()
2281 dev->scsi_host_ptr->sg_tablesize = in aac_get_adapter_info()
2282 (dev->max_fib_size - in aac_get_adapter_info()
2283 sizeof(struct aac_fibhdr) - in aac_get_adapter_info()
2288 dev->a_ops.adapter_read = aac_read_block; in aac_get_adapter_info()
2289 dev->a_ops.adapter_write = aac_write_block; in aac_get_adapter_info()
2291 dev->scsi_host_ptr->max_sectors = AAC_MAX_32BIT_SGBCOUNT; in aac_get_adapter_info()
2292 if (!(dev->adapter_info.options & AAC_OPT_NEW_COMM)) { in aac_get_adapter_info()
2298 * (sg_tablesize-1) 4KB elements with one 64KB in aac_get_adapter_info()
2300 * 32bit -> 468 or 238KB 64bit -> 424 or 212KB in aac_get_adapter_info()
2302 dev->scsi_host_ptr->max_sectors = in aac_get_adapter_info()
2303 (dev->scsi_host_ptr->sg_tablesize * 8) + 112; in aac_get_adapter_info()
2306 if (!dev->sync_mode && dev->sa_firmware && in aac_get_adapter_info()
2307 dev->scsi_host_ptr->sg_tablesize > HBA_MAX_SG_SEPARATE) in aac_get_adapter_info()
2308 dev->scsi_host_ptr->sg_tablesize = dev->sg_tablesize = in aac_get_adapter_info()
2312 if (rcode != -ERESTARTSYS) { in aac_get_adapter_info()
2333 dev = fibptr->dev; in io_callback()
2338 switch (scsicmd->cmnd[0]) { in io_callback()
2341 lba = ((scsicmd->cmnd[1] & 0x1F) << 16) | in io_callback()
2342 (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3]; in io_callback()
2346 lba = ((u64)scsicmd->cmnd[2] << 56) | in io_callback()
2347 ((u64)scsicmd->cmnd[3] << 48) | in io_callback()
2348 ((u64)scsicmd->cmnd[4] << 40) | in io_callback()
2349 ((u64)scsicmd->cmnd[5] << 32) | in io_callback()
2350 ((u64)scsicmd->cmnd[6] << 24) | in io_callback()
2351 (scsicmd->cmnd[7] << 16) | in io_callback()
2352 (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; in io_callback()
2356 lba = ((u64)scsicmd->cmnd[2] << 24) | in io_callback()
2357 (scsicmd->cmnd[3] << 16) | in io_callback()
2358 (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; in io_callback()
2361 lba = ((u64)scsicmd->cmnd[2] << 24) | in io_callback()
2362 (scsicmd->cmnd[3] << 16) | in io_callback()
2363 (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; in io_callback()
2376 switch (le32_to_cpu(readreply->status)) { in io_callback()
2378 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in io_callback()
2380 dev->fsa_dev[cid].sense_data.sense_key = NO_SENSE; in io_callback()
2383 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in io_callback()
2385 set_sense(&dev->fsa_dev[cid].sense_data, NOT_READY, in io_callback()
2387 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in io_callback()
2388 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in io_callback()
2392 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in io_callback()
2394 set_sense(&dev->fsa_dev[cid].sense_data, MEDIUM_ERROR, in io_callback()
2396 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in io_callback()
2397 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in io_callback()
2403 le32_to_cpu(readreply->status)); in io_callback()
2405 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in io_callback()
2407 set_sense(&dev->fsa_dev[cid].sense_data, in io_callback()
2410 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in io_callback()
2411 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in io_callback()
2417 scsicmd->scsi_done(scsicmd); in io_callback()
2429 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in aac_read()
2433 switch (scsicmd->cmnd[0]) { in aac_read()
2437 lba = ((scsicmd->cmnd[1] & 0x1F) << 16) | in aac_read()
2438 (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3]; in aac_read()
2439 count = scsicmd->cmnd[4]; in aac_read()
2447 lba = ((u64)scsicmd->cmnd[2] << 56) | in aac_read()
2448 ((u64)scsicmd->cmnd[3] << 48) | in aac_read()
2449 ((u64)scsicmd->cmnd[4] << 40) | in aac_read()
2450 ((u64)scsicmd->cmnd[5] << 32) | in aac_read()
2451 ((u64)scsicmd->cmnd[6] << 24) | in aac_read()
2452 (scsicmd->cmnd[7] << 16) | in aac_read()
2453 (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; in aac_read()
2454 count = (scsicmd->cmnd[10] << 24) | in aac_read()
2455 (scsicmd->cmnd[11] << 16) | in aac_read()
2456 (scsicmd->cmnd[12] << 8) | scsicmd->cmnd[13]; in aac_read()
2461 lba = ((u64)scsicmd->cmnd[2] << 24) | in aac_read()
2462 (scsicmd->cmnd[3] << 16) | in aac_read()
2463 (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; in aac_read()
2464 count = (scsicmd->cmnd[6] << 24) | in aac_read()
2465 (scsicmd->cmnd[7] << 16) | in aac_read()
2466 (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; in aac_read()
2471 lba = ((u64)scsicmd->cmnd[2] << 24) | in aac_read()
2472 (scsicmd->cmnd[3] << 16) | in aac_read()
2473 (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; in aac_read()
2474 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8]; in aac_read()
2478 if ((lba + count) > (dev->fsa_dev[scmd_id(scsicmd)].size)) { in aac_read()
2481 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_read()
2483 set_sense(&dev->fsa_dev[cid].sense_data, in aac_read()
2486 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in aac_read()
2487 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in aac_read()
2489 scsicmd->scsi_done(scsicmd); in aac_read()
2501 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; in aac_read()
2507 if (status == -EINPROGRESS) in aac_read()
2514 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_TASK_SET_FULL; in aac_read()
2515 scsicmd->scsi_done(scsicmd); in aac_read()
2531 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in aac_write()
2535 if (scsicmd->cmnd[0] == WRITE_6) /* 6 byte command */ in aac_write()
2537 lba = ((scsicmd->cmnd[1] & 0x1F) << 16) | (scsicmd->cmnd[2] << 8) | scsicmd->cmnd[3]; in aac_write()
2538 count = scsicmd->cmnd[4]; in aac_write()
2542 } else if (scsicmd->cmnd[0] == WRITE_16) { /* 16 byte command */ in aac_write()
2545 lba = ((u64)scsicmd->cmnd[2] << 56) | in aac_write()
2546 ((u64)scsicmd->cmnd[3] << 48) | in aac_write()
2547 ((u64)scsicmd->cmnd[4] << 40) | in aac_write()
2548 ((u64)scsicmd->cmnd[5] << 32) | in aac_write()
2549 ((u64)scsicmd->cmnd[6] << 24) | in aac_write()
2550 (scsicmd->cmnd[7] << 16) | in aac_write()
2551 (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; in aac_write()
2552 count = (scsicmd->cmnd[10] << 24) | (scsicmd->cmnd[11] << 16) | in aac_write()
2553 (scsicmd->cmnd[12] << 8) | scsicmd->cmnd[13]; in aac_write()
2554 fua = scsicmd->cmnd[1] & 0x8; in aac_write()
2555 } else if (scsicmd->cmnd[0] == WRITE_12) { /* 12 byte command */ in aac_write()
2558 lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) in aac_write()
2559 | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; in aac_write()
2560 count = (scsicmd->cmnd[6] << 24) | (scsicmd->cmnd[7] << 16) in aac_write()
2561 | (scsicmd->cmnd[8] << 8) | scsicmd->cmnd[9]; in aac_write()
2562 fua = scsicmd->cmnd[1] & 0x8; in aac_write()
2565 …lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) | (scsicmd->cmnd[4] << 8) | scsicmd in aac_write()
2566 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8]; in aac_write()
2567 fua = scsicmd->cmnd[1] & 0x8; in aac_write()
2570 if ((lba + count) > (dev->fsa_dev[scmd_id(scsicmd)].size)) { in aac_write()
2573 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_write()
2575 set_sense(&dev->fsa_dev[cid].sense_data, in aac_write()
2578 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in aac_write()
2579 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in aac_write()
2581 scsicmd->scsi_done(scsicmd); in aac_write()
2593 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; in aac_write()
2599 if (status == -EINPROGRESS) in aac_write()
2606 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_TASK_SET_FULL; in aac_write()
2607 scsicmd->scsi_done(scsicmd); in aac_write()
2630 if (le32_to_cpu(synchronizereply->status) == CT_OK) in synchronize_callback()
2631 cmd->result = DID_OK << 16 | in synchronize_callback()
2634 struct scsi_device *sdev = cmd->device; in synchronize_callback()
2635 struct aac_dev *dev = fibptr->dev; in synchronize_callback()
2639 le32_to_cpu(synchronizereply->status)); in synchronize_callback()
2640 cmd->result = DID_OK << 16 | in synchronize_callback()
2642 set_sense(&dev->fsa_dev[cid].sense_data, in synchronize_callback()
2645 memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in synchronize_callback()
2646 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in synchronize_callback()
2652 cmd->scsi_done(cmd); in synchronize_callback()
2661 struct scsi_device *sdev = scsicmd->device; in aac_synchronize()
2663 struct aac_dev *aac; in aac_synchronize() local
2664 u64 lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) | in aac_synchronize()
2665 (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5]; in aac_synchronize()
2666 u32 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8]; in aac_synchronize()
2673 spin_lock_irqsave(&sdev->list_lock, flags); in aac_synchronize()
2674 list_for_each_entry(cmd, &sdev->cmd_list, list) in aac_synchronize()
2675 if (cmd->SCp.phase == AAC_OWNER_FIRMWARE) { in aac_synchronize()
2679 if (cmd->cmnd[0] == WRITE_6) { in aac_synchronize()
2680 cmnd_lba = ((cmd->cmnd[1] & 0x1F) << 16) | in aac_synchronize()
2681 (cmd->cmnd[2] << 8) | in aac_synchronize()
2682 cmd->cmnd[3]; in aac_synchronize()
2683 cmnd_count = cmd->cmnd[4]; in aac_synchronize()
2686 } else if (cmd->cmnd[0] == WRITE_16) { in aac_synchronize()
2687 cmnd_lba = ((u64)cmd->cmnd[2] << 56) | in aac_synchronize()
2688 ((u64)cmd->cmnd[3] << 48) | in aac_synchronize()
2689 ((u64)cmd->cmnd[4] << 40) | in aac_synchronize()
2690 ((u64)cmd->cmnd[5] << 32) | in aac_synchronize()
2691 ((u64)cmd->cmnd[6] << 24) | in aac_synchronize()
2692 (cmd->cmnd[7] << 16) | in aac_synchronize()
2693 (cmd->cmnd[8] << 8) | in aac_synchronize()
2694 cmd->cmnd[9]; in aac_synchronize()
2695 cmnd_count = (cmd->cmnd[10] << 24) | in aac_synchronize()
2696 (cmd->cmnd[11] << 16) | in aac_synchronize()
2697 (cmd->cmnd[12] << 8) | in aac_synchronize()
2698 cmd->cmnd[13]; in aac_synchronize()
2699 } else if (cmd->cmnd[0] == WRITE_12) { in aac_synchronize()
2700 cmnd_lba = ((u64)cmd->cmnd[2] << 24) | in aac_synchronize()
2701 (cmd->cmnd[3] << 16) | in aac_synchronize()
2702 (cmd->cmnd[4] << 8) | in aac_synchronize()
2703 cmd->cmnd[5]; in aac_synchronize()
2704 cmnd_count = (cmd->cmnd[6] << 24) | in aac_synchronize()
2705 (cmd->cmnd[7] << 16) | in aac_synchronize()
2706 (cmd->cmnd[8] << 8) | in aac_synchronize()
2707 cmd->cmnd[9]; in aac_synchronize()
2708 } else if (cmd->cmnd[0] == WRITE_10) { in aac_synchronize()
2709 cmnd_lba = ((u64)cmd->cmnd[2] << 24) | in aac_synchronize()
2710 (cmd->cmnd[3] << 16) | in aac_synchronize()
2711 (cmd->cmnd[4] << 8) | in aac_synchronize()
2712 cmd->cmnd[5]; in aac_synchronize()
2713 cmnd_count = (cmd->cmnd[7] << 8) | in aac_synchronize()
2714 cmd->cmnd[8]; in aac_synchronize()
2724 spin_unlock_irqrestore(&sdev->list_lock, flags); in aac_synchronize()
2732 aac = (struct aac_dev *)sdev->host->hostdata; in aac_synchronize()
2733 if (aac->in_reset) in aac_synchronize()
2739 if (!(cmd_fibcontext = aac_fib_alloc(aac))) in aac_synchronize()
2745 synchronizecmd->command = cpu_to_le32(VM_ContainerConfig); in aac_synchronize()
2746 synchronizecmd->type = cpu_to_le32(CT_FLUSH_CACHE); in aac_synchronize()
2747 synchronizecmd->cid = cpu_to_le32(scmd_id(scsicmd)); in aac_synchronize()
2748 synchronizecmd->count = in aac_synchronize()
2749 cpu_to_le32(sizeof(((struct aac_synchronize_reply *)NULL)->data)); in aac_synchronize()
2750 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; in aac_synchronize()
2766 if (status == -EINPROGRESS) in aac_synchronize()
2785 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; in aac_start_stop_callback()
2789 scsicmd->scsi_done(scsicmd); in aac_start_stop_callback()
2797 struct scsi_device *sdev = scsicmd->device; in aac_start_stop()
2798 struct aac_dev *aac = (struct aac_dev *)sdev->host->hostdata; in aac_start_stop() local
2800 if (!(aac->supplement_adapter_info.supported_options2 & in aac_start_stop()
2802 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_start_stop()
2804 scsicmd->scsi_done(scsicmd); in aac_start_stop()
2808 if (aac->in_reset) in aac_start_stop()
2814 cmd_fibcontext = aac_fib_alloc_tag(aac, scsicmd); in aac_start_stop()
2819 pmcmd->command = cpu_to_le32(VM_ContainerConfig); in aac_start_stop()
2820 pmcmd->type = cpu_to_le32(CT_POWER_MANAGEMENT); in aac_start_stop()
2822 pmcmd->sub = (scsicmd->cmnd[4] & 1) ? in aac_start_stop()
2824 pmcmd->cid = cpu_to_le32(sdev_id(sdev)); in aac_start_stop()
2825 pmcmd->parm = (scsicmd->cmnd[1] & 1) ? in aac_start_stop()
2827 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; in aac_start_stop()
2843 if (status == -EINPROGRESS) in aac_start_stop()
2852 * aac_scsi_cmd() - Process SCSI command
2862 struct Scsi_Host *host = scsicmd->device->host; in aac_scsi_cmd()
2863 struct aac_dev *dev = (struct aac_dev *)host->hostdata; in aac_scsi_cmd()
2864 struct fsa_dev_info *fsa_dev_ptr = dev->fsa_dev; in aac_scsi_cmd()
2867 return -1; in aac_scsi_cmd()
2874 if (cid != host->this_id) { in aac_scsi_cmd()
2876 if((cid >= dev->maximum_num_containers) || in aac_scsi_cmd()
2877 (scsicmd->device->lun != 0)) { in aac_scsi_cmd()
2878 scsicmd->result = DID_NO_CONNECT << 16; in aac_scsi_cmd()
2889 switch (scsicmd->cmnd[0]) { in aac_scsi_cmd()
2891 if (!(dev->raw_io_interface) || in aac_scsi_cmd()
2892 !(dev->raw_io_64) || in aac_scsi_cmd()
2893 ((scsicmd->cmnd[1] & 0x1f) != SAI_READ_CAPACITY_16)) in aac_scsi_cmd()
2898 if (dev->in_reset) in aac_scsi_cmd()
2899 return -1; in aac_scsi_cmd()
2906 } else { /* check for physical non-dasd devices */ in aac_scsi_cmd()
2910 dev->hba_map[bus][cid].devtype in aac_scsi_cmd()
2912 if (dev->in_reset) in aac_scsi_cmd()
2913 return -1; in aac_scsi_cmd()
2915 } else if (dev->nondasd_support || expose_physicals || in aac_scsi_cmd()
2916 dev->jbod) { in aac_scsi_cmd()
2917 if (dev->in_reset) in aac_scsi_cmd()
2918 return -1; in aac_scsi_cmd()
2921 scsicmd->result = DID_NO_CONNECT << 16; in aac_scsi_cmd()
2929 else if ((scsicmd->cmnd[0] != INQUIRY) && /* only INQUIRY & TUR cmnd supported for controller */ in aac_scsi_cmd()
2930 (scsicmd->cmnd[0] != TEST_UNIT_READY)) in aac_scsi_cmd()
2932 …_WARNING "Only INQUIRY & TUR command supported for controller, rcvd = 0x%x.\n", scsicmd->cmnd[0])); in aac_scsi_cmd()
2933 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION; in aac_scsi_cmd()
2934 set_sense(&dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
2937 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
2938 min_t(size_t, sizeof(dev->fsa_dev[cid].sense_data), in aac_scsi_cmd()
2943 switch (scsicmd->cmnd[0]) { in aac_scsi_cmd()
2948 if (dev->in_reset) in aac_scsi_cmd()
2949 return -1; in aac_scsi_cmd()
2956 if (dev->in_reset) in aac_scsi_cmd()
2957 return -1; in aac_scsi_cmd()
2961 if (((aac_cache & 6) == 6) && dev->cache_protected) { in aac_scsi_cmd()
2962 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_scsi_cmd()
2976 if ((scsicmd->cmnd[1] & 0x1) && aac_wwn) { in aac_scsi_cmd()
2980 arr[0] = (scmd_id(scsicmd) == host->this_id) ? in aac_scsi_cmd()
2982 if (scsicmd->cmnd[2] == 0) { in aac_scsi_cmd()
2988 arr[1] = scsicmd->cmnd[2]; in aac_scsi_cmd()
2991 scsicmd->result = DID_OK << 16 | in aac_scsi_cmd()
2994 } else if (scsicmd->cmnd[2] == 0x80) { in aac_scsi_cmd()
2998 arr[1] = scsicmd->cmnd[2]; in aac_scsi_cmd()
3004 scsicmd->result = DID_OK << 16 | in aac_scsi_cmd()
3007 } else if (scsicmd->cmnd[2] == 0x83) { in aac_scsi_cmd()
3008 /* vpd page 0x83 - Device Identification Page */ in aac_scsi_cmd()
3015 scsicmd->result = DID_OK << 16 | in aac_scsi_cmd()
3020 scsicmd->result = DID_OK << 16 | in aac_scsi_cmd()
3023 set_sense(&dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
3026 memcpy(scsicmd->sense_buffer, in aac_scsi_cmd()
3027 &dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
3029 sizeof(dev->fsa_dev[cid].sense_data), in aac_scsi_cmd()
3034 inq_data.inqd_ver = 2; /* claim compliance to SCSI-2 */ in aac_scsi_cmd()
3035 …onse data format value of two indicates that the data shall be in the format specified in SCSI-2 */ in aac_scsi_cmd()
3041 * see: <vendor>.c i.e. aac.c in aac_scsi_cmd()
3043 if (cid == host->this_id) { in aac_scsi_cmd()
3048 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_scsi_cmd()
3052 if (dev->in_reset) in aac_scsi_cmd()
3053 return -1; in aac_scsi_cmd()
3060 if (!(dev->raw_io_interface) || in aac_scsi_cmd()
3061 !(dev->raw_io_64) || in aac_scsi_cmd()
3062 ((scsicmd->cmnd[1] & 0x1f) != SAI_READ_CAPACITY_16)) in aac_scsi_cmd()
3070 capacity = fsa_dev_ptr[cid].size - 1; in aac_scsi_cmd()
3085 alloc_len = ((scsicmd->cmnd[10] << 24) in aac_scsi_cmd()
3086 + (scsicmd->cmnd[11] << 16) in aac_scsi_cmd()
3087 + (scsicmd->cmnd[12] << 8) + scsicmd->cmnd[13]); in aac_scsi_cmd()
3093 scsi_bufflen(scsicmd) - alloc_len); in aac_scsi_cmd()
3096 scsicmd->device->removable = 1; in aac_scsi_cmd()
3098 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_scsi_cmd()
3110 capacity = fsa_dev_ptr[cid].size - 1; in aac_scsi_cmd()
3112 capacity = (u32)-1; in aac_scsi_cmd()
3124 scsicmd->device->removable = 1; in aac_scsi_cmd()
3125 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_scsi_cmd()
3137 capacity = fsa_dev_ptr[cid].size - 1; in aac_scsi_cmd()
3139 capacity = (u32)-1; in aac_scsi_cmd()
3141 dprintk((KERN_DEBUG "MODE SENSE command.\n")); in aac_scsi_cmd()
3144 /* Mode data length */ in aac_scsi_cmd()
3145 mpd.hd.data_length = sizeof(mpd.hd) - 1; in aac_scsi_cmd()
3146 /* Medium type - default */ in aac_scsi_cmd()
3148 /* Device-specific param, in aac_scsi_cmd()
3153 if (dev->raw_io_interface && ((aac_cache & 5) != 1)) in aac_scsi_cmd()
3155 if (scsicmd->cmnd[1] & 0x8) in aac_scsi_cmd()
3167 mpd.mpc_buf[0] = scsicmd->cmnd[2]; in aac_scsi_cmd()
3168 if (scsicmd->cmnd[2] == 0x1C) { in aac_scsi_cmd()
3171 /* Mode data length */ in aac_scsi_cmd()
3174 /* Mode data length */ in aac_scsi_cmd()
3188 if (((scsicmd->cmnd[2] & 0x3f) == 8) || in aac_scsi_cmd()
3189 ((scsicmd->cmnd[2] & 0x3f) == 0x3f)) { in aac_scsi_cmd()
3198 if (mode_buf_length > scsicmd->cmnd[4]) in aac_scsi_cmd()
3199 mode_buf_length = scsicmd->cmnd[4]; in aac_scsi_cmd()
3205 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_scsi_cmd()
3216 capacity = fsa_dev_ptr[cid].size - 1; in aac_scsi_cmd()
3218 capacity = (u32)-1; in aac_scsi_cmd()
3220 dprintk((KERN_DEBUG "MODE SENSE 10 byte command.\n")); in aac_scsi_cmd()
3222 /* Mode data length (MSB) */ in aac_scsi_cmd()
3224 /* Mode data length (LSB) */ in aac_scsi_cmd()
3225 mpd10.hd.data_length[1] = sizeof(mpd10.hd) - 1; in aac_scsi_cmd()
3226 /* Medium type - default */ in aac_scsi_cmd()
3228 /* Device-specific param, in aac_scsi_cmd()
3233 if (dev->raw_io_interface && ((aac_cache & 5) != 1)) in aac_scsi_cmd()
3237 if (scsicmd->cmnd[1] & 0x8) { in aac_scsi_cmd()
3268 if (((scsicmd->cmnd[2] & 0x3f) == 8) || in aac_scsi_cmd()
3269 ((scsicmd->cmnd[2] & 0x3f) == 0x3f)) { in aac_scsi_cmd()
3276 if (mode_buf_length > scsicmd->cmnd[8]) in aac_scsi_cmd()
3277 mode_buf_length = scsicmd->cmnd[8]; in aac_scsi_cmd()
3283 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_scsi_cmd()
3289 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
3291 memset(&dev->fsa_dev[cid].sense_data, 0, in aac_scsi_cmd()
3293 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_scsi_cmd()
3299 if (scsicmd->cmnd[4]) in aac_scsi_cmd()
3304 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_scsi_cmd()
3308 * These commands are all No-Ops in aac_scsi_cmd()
3312 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_scsi_cmd()
3314 set_sense(&dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
3317 memcpy(scsicmd->sense_buffer, in aac_scsi_cmd()
3318 &dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
3320 sizeof(dev->fsa_dev[cid].sense_data), in aac_scsi_cmd()
3329 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_scsi_cmd()
3342 scsicmd->cmnd[0])); in aac_scsi_cmd()
3343 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | in aac_scsi_cmd()
3345 set_sense(&dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
3348 memcpy(scsicmd->sense_buffer, &dev->fsa_dev[cid].sense_data, in aac_scsi_cmd()
3350 sizeof(dev->fsa_dev[cid].sense_data), in aac_scsi_cmd()
3356 scsicmd->scsi_done(scsicmd); in aac_scsi_cmd()
3365 fsa_dev_ptr = dev->fsa_dev; in query_disk()
3367 return -EBUSY; in query_disk()
3369 return -EFAULT; in query_disk()
3370 if (qd.cnum == -1) { in query_disk()
3371 if (qd.id < 0 || qd.id >= dev->maximum_num_containers) in query_disk()
3372 return -EINVAL; in query_disk()
3374 } else if ((qd.bus == -1) && (qd.id == -1) && (qd.lun == -1)) { in query_disk()
3375 if (qd.cnum < 0 || qd.cnum >= dev->maximum_num_containers) in query_disk()
3376 return -EINVAL; in query_disk()
3377 qd.instance = dev->scsi_host_ptr->host_no; in query_disk()
3382 else return -EINVAL; in query_disk()
3397 return -EFAULT; in query_disk()
3406 fsa_dev_ptr = dev->fsa_dev; in force_delete_disk()
3408 return -EBUSY; in force_delete_disk()
3411 return -EFAULT; in force_delete_disk()
3413 if (dd.cnum >= dev->maximum_num_containers) in force_delete_disk()
3414 return -EINVAL; in force_delete_disk()
3431 fsa_dev_ptr = dev->fsa_dev; in delete_disk()
3433 return -EBUSY; in delete_disk()
3436 return -EFAULT; in delete_disk()
3438 if (dd.cnum >= dev->maximum_num_containers) in delete_disk()
3439 return -EINVAL; in delete_disk()
3444 return -EBUSY; in delete_disk()
3467 return -ENOTTY; in aac_dev_ioctl()
3474 * @context: the context set in the fib - here it is scsi cmd
3494 dev = fibptr->dev; in aac_srb_callback()
3498 scsicmd->sense_buffer[0] = '\0'; /* Initialize sense valid flag to false */ in aac_srb_callback()
3500 if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) { in aac_srb_callback()
3502 srbreply->srb_status = cpu_to_le32(SRB_STATUS_SUCCESS); in aac_srb_callback()
3503 srbreply->scsi_status = cpu_to_le32(SAM_STAT_GOOD); in aac_srb_callback()
3509 - le32_to_cpu(srbreply->data_xfer_length)); in aac_srb_callback()
3516 if (scsicmd->cmnd[0] == INQUIRY && !(scsicmd->cmnd[1] & 0x01) in aac_srb_callback()
3524 if (le32_to_cpu(srbreply->status) != ST_OK) { in aac_srb_callback()
3528 le32_to_cpu(srbreply->status)); in aac_srb_callback()
3529 len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), in aac_srb_callback()
3531 scsicmd->result = DID_ERROR << 16 in aac_srb_callback()
3534 memcpy(scsicmd->sense_buffer, in aac_srb_callback()
3535 srbreply->sense_data, len); in aac_srb_callback()
3541 switch ((le32_to_cpu(srbreply->srb_status))&0x3f) { in aac_srb_callback()
3545 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; in aac_srb_callback()
3548 switch (scsicmd->cmnd[0]) { in aac_srb_callback()
3557 if (le32_to_cpu(srbreply->data_xfer_length) in aac_srb_callback()
3558 < scsicmd->underflow) in aac_srb_callback()
3562 scsicmd->result = DID_ERROR << 16 in aac_srb_callback()
3566 scsicmd->result = DID_OK << 16 in aac_srb_callback()
3570 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; in aac_srb_callback()
3575 scsicmd->result = DID_ABORT << 16 | ABORT << 8; in aac_srb_callback()
3579 * Not sure about this one - but assuming the in aac_srb_callback()
3582 scsicmd->result = DID_ERROR << 16 | ABORT << 8; in aac_srb_callback()
3585 scsicmd->result = DID_PARITY << 16 in aac_srb_callback()
3593 scsicmd->result = DID_NO_CONNECT << 16 in aac_srb_callback()
3599 scsicmd->result = DID_TIME_OUT << 16 in aac_srb_callback()
3604 scsicmd->result = DID_BUS_BUSY << 16 in aac_srb_callback()
3609 scsicmd->result = DID_RESET << 16 in aac_srb_callback()
3614 scsicmd->result = DID_ERROR << 16 in aac_srb_callback()
3633 pr_info("aacraid: SRB ERROR(%u) %s scsi cmd 0x%x -scsi status 0x%x\n", in aac_srb_callback()
3634 le32_to_cpu(srbreply->srb_status) & 0x3F, in aac_srb_callback()
3636 le32_to_cpu(srbreply->srb_status) & 0x3F), in aac_srb_callback()
3637 scsicmd->cmnd[0], in aac_srb_callback()
3638 le32_to_cpu(srbreply->scsi_status)); in aac_srb_callback()
3647 if ((scsicmd->cmnd[0] == ATA_12) in aac_srb_callback()
3648 || (scsicmd->cmnd[0] == ATA_16)) { in aac_srb_callback()
3650 if (scsicmd->cmnd[2] & (0x01 << 5)) { in aac_srb_callback()
3651 scsicmd->result = DID_OK << 16 in aac_srb_callback()
3655 scsicmd->result = DID_ERROR << 16 in aac_srb_callback()
3660 scsicmd->result = DID_ERROR << 16 in aac_srb_callback()
3665 if (le32_to_cpu(srbreply->scsi_status) in aac_srb_callback()
3669 scsicmd->result |= SAM_STAT_CHECK_CONDITION; in aac_srb_callback()
3670 len = min_t(u32, le32_to_cpu(srbreply->sense_data_size), in aac_srb_callback()
3674 le32_to_cpu(srbreply->status), len); in aac_srb_callback()
3676 memcpy(scsicmd->sense_buffer, in aac_srb_callback()
3677 srbreply->sense_data, len); in aac_srb_callback()
3683 scsicmd->result |= le32_to_cpu(srbreply->scsi_status); in aac_srb_callback()
3686 scsicmd->scsi_done(scsicmd); in aac_srb_callback()
3693 scsicmd->result = err->status; in hba_resp_task_complete()
3695 scsi_set_resid(scsicmd, le32_to_cpu(err->residual_count)); in hba_resp_task_complete()
3697 switch (err->status) { in hba_resp_task_complete()
3699 scsicmd->result |= DID_OK << 16 | COMMAND_COMPLETE << 8; in hba_resp_task_complete()
3705 len = min_t(u8, err->sense_response_data_len, in hba_resp_task_complete()
3708 memcpy(scsicmd->sense_buffer, in hba_resp_task_complete()
3709 err->sense_response_buf, len); in hba_resp_task_complete()
3710 scsicmd->result |= DID_OK << 16 | COMMAND_COMPLETE << 8; in hba_resp_task_complete()
3714 scsicmd->result |= DID_BUS_BUSY << 16 | COMMAND_COMPLETE << 8; in hba_resp_task_complete()
3717 scsicmd->result |= DID_ABORT << 16 | ABORT << 8; in hba_resp_task_complete()
3722 scsicmd->result |= DID_ERROR << 16 | COMMAND_COMPLETE << 8; in hba_resp_task_complete()
3731 switch (err->status) { in hba_resp_task_failure()
3738 if (dev->hba_map[bus][cid].devtype == AAC_DEVTYPE_NATIVE_RAW) { in hba_resp_task_failure()
3739 dev->hba_map[bus][cid].devtype = AAC_DEVTYPE_ARC_RAW; in hba_resp_task_failure()
3740 dev->hba_map[bus][cid].rmw_nexus = 0xffffffff; in hba_resp_task_failure()
3742 scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8; in hba_resp_task_failure()
3747 scsicmd->result = DID_OK << 16 | in hba_resp_task_failure()
3751 scsicmd->result = DID_ABORT << 16 | ABORT << 8; in hba_resp_task_failure()
3754 scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8; in hba_resp_task_failure()
3758 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; in hba_resp_task_failure()
3762 scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8; in hba_resp_task_failure()
3770 * @context: the context set in the fib - here it is scsi cmd
3782 &((struct aac_native_hba *)fibptr->hw_fib_va)->resp.err; in aac_hba_callback()
3790 dev = fibptr->dev; in aac_hba_callback()
3792 if (!(fibptr->flags & FIB_CONTEXT_FLAG_NATIVE_HBA_TMF)) in aac_hba_callback()
3795 if (fibptr->flags & FIB_CONTEXT_FLAG_FASTRESP) { in aac_hba_callback()
3797 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; in aac_hba_callback()
3801 switch (err->service_response) { in aac_hba_callback()
3809 scsicmd->result = DID_ERROR << 16 | MESSAGE_REJECT << 8; in aac_hba_callback()
3812 scsicmd->result = DID_NO_CONNECT << 16 | COMMAND_COMPLETE << 8; in aac_hba_callback()
3816 scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8; in aac_hba_callback()
3819 scsicmd->result = DID_ERROR << 16 | COMMAND_COMPLETE << 8; in aac_hba_callback()
3826 if (fibptr->flags & FIB_CONTEXT_FLAG_NATIVE_HBA_TMF) in aac_hba_callback()
3827 scsicmd->SCp.sent_command = 1; in aac_hba_callback()
3829 scsicmd->scsi_done(scsicmd); in aac_hba_callback()
3847 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in aac_send_srb_fib()
3848 if (scmd_id(scsicmd) >= dev->maximum_num_physicals || in aac_send_srb_fib()
3849 scsicmd->device->lun > 7) { in aac_send_srb_fib()
3850 scsicmd->result = DID_NO_CONNECT << 16; in aac_send_srb_fib()
3851 scsicmd->scsi_done(scsicmd); in aac_send_srb_fib()
3859 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; in aac_send_srb_fib()
3865 if (status == -EINPROGRESS) in aac_send_srb_fib()
3872 return -1; in aac_send_srb_fib()
3889 dev = shost_priv(scsicmd->device->host); in aac_send_hba_fib()
3890 if (scmd_id(scsicmd) >= dev->maximum_num_physicals || in aac_send_hba_fib()
3891 scsicmd->device->lun > AAC_MAX_LUN - 1) { in aac_send_hba_fib()
3892 scsicmd->result = DID_NO_CONNECT << 16; in aac_send_hba_fib()
3893 scsicmd->scsi_done(scsicmd); in aac_send_hba_fib()
3902 return -1; in aac_send_hba_fib()
3904 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; in aac_send_hba_fib()
3910 if (status == -EINPROGRESS) in aac_send_hba_fib()
3918 return -1; in aac_send_hba_fib()
3930 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in aac_build_sg()
3932 psg->count = 0; in aac_build_sg()
3933 psg->sg[0].addr = 0; in aac_build_sg()
3934 psg->sg[0].count = 0; in aac_build_sg()
3940 psg->count = cpu_to_le32(nseg); in aac_build_sg()
3943 psg->sg[i].addr = cpu_to_le32(sg_dma_address(sg)); in aac_build_sg()
3944 psg->sg[i].count = cpu_to_le32(sg_dma_len(sg)); in aac_build_sg()
3949 u32 temp = le32_to_cpu(psg->sg[i-1].count) - in aac_build_sg()
3950 (byte_count - scsi_bufflen(scsicmd)); in aac_build_sg()
3951 psg->sg[i-1].count = cpu_to_le32(temp); in aac_build_sg()
3955 if (scsicmd->underflow && (byte_count < scsicmd->underflow)) { in aac_build_sg()
3957 byte_count, scsicmd->underflow); in aac_build_sg()
3973 dev = (struct aac_dev *)scsicmd->device->host->hostdata; in aac_build_sg64()
3975 psg->count = 0; in aac_build_sg64()
3976 psg->sg[0].addr[0] = 0; in aac_build_sg64()
3977 psg->sg[0].addr[1] = 0; in aac_build_sg64()
3978 psg->sg[0].count = 0; in aac_build_sg64()
3987 psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff); in aac_build_sg64()
3988 psg->sg[i].addr[1] = cpu_to_le32(addr>>32); in aac_build_sg64()
3989 psg->sg[i].count = cpu_to_le32(count); in aac_build_sg64()
3992 psg->count = cpu_to_le32(nseg); in aac_build_sg64()
3995 u32 temp = le32_to_cpu(psg->sg[i-1].count) - in aac_build_sg64()
3996 (byte_count - scsi_bufflen(scsicmd)); in aac_build_sg64()
3997 psg->sg[i-1].count = cpu_to_le32(temp); in aac_build_sg64()
4001 if (scsicmd->underflow && (byte_count < scsicmd->underflow)) { in aac_build_sg64()
4003 byte_count, scsicmd->underflow); in aac_build_sg64()
4017 psg->count = 0; in aac_build_sgraw()
4018 psg->sg[0].next = 0; in aac_build_sgraw()
4019 psg->sg[0].prev = 0; in aac_build_sgraw()
4020 psg->sg[0].addr[0] = 0; in aac_build_sgraw()
4021 psg->sg[0].addr[1] = 0; in aac_build_sgraw()
4022 psg->sg[0].count = 0; in aac_build_sgraw()
4023 psg->sg[0].flags = 0; in aac_build_sgraw()
4032 psg->sg[i].next = 0; in aac_build_sgraw()
4033 psg->sg[i].prev = 0; in aac_build_sgraw()
4034 psg->sg[i].addr[1] = cpu_to_le32((u32)(addr>>32)); in aac_build_sgraw()
4035 psg->sg[i].addr[0] = cpu_to_le32((u32)(addr & 0xffffffff)); in aac_build_sgraw()
4036 psg->sg[i].count = cpu_to_le32(count); in aac_build_sgraw()
4037 psg->sg[i].flags = 0; in aac_build_sgraw()
4040 psg->count = cpu_to_le32(nseg); in aac_build_sgraw()
4043 u32 temp = le32_to_cpu(psg->sg[i-1].count) - in aac_build_sgraw()
4044 (byte_count - scsi_bufflen(scsicmd)); in aac_build_sgraw()
4045 psg->sg[i-1].count = cpu_to_le32(temp); in aac_build_sgraw()
4049 if (scsicmd->underflow && (byte_count < scsicmd->underflow)) { in aac_build_sgraw()
4051 byte_count, scsicmd->underflow); in aac_build_sgraw()
4075 rio2->sge[i].addrHigh = cpu_to_le32((u32)(addr>>32)); in aac_build_sgraw2()
4076 rio2->sge[i].addrLow = cpu_to_le32((u32)(addr & 0xffffffff)); in aac_build_sgraw2()
4078 rio2->sge[i].length = cur_size; in aac_build_sgraw2()
4079 rio2->sge[i].flags = 0; in aac_build_sgraw2()
4082 rio2->sgeFirstSize = cur_size; in aac_build_sgraw2()
4084 rio2->sgeNominalSize = cur_size; in aac_build_sgraw2()
4086 } else if ((i+1) < nseg && cur_size != rio2->sgeNominalSize) { in aac_build_sgraw2()
4096 u32 temp = le32_to_cpu(rio2->sge[i-1].length) - in aac_build_sgraw2()
4097 (byte_count - scsi_bufflen(scsicmd)); in aac_build_sgraw2()
4098 rio2->sge[i-1].length = cpu_to_le32(temp); in aac_build_sgraw2()
4102 rio2->sgeCnt = cpu_to_le32(nseg); in aac_build_sgraw2()
4103 rio2->flags |= cpu_to_le16(RIO2_SG_FORMAT_IEEE1212); in aac_build_sgraw2()
4107 for (i = min_size / PAGE_SIZE; i >= 1; --i) { in aac_build_sgraw2()
4110 for (j = 1; j < nseg - 1; ++j) { in aac_build_sgraw2()
4111 if (rio2->sge[j].length % (i*PAGE_SIZE)) { in aac_build_sgraw2()
4115 nseg_new += (rio2->sge[j].length / (i*PAGE_SIZE)); in aac_build_sgraw2()
4127 rio2->flags |= cpu_to_le16(RIO2_SGL_CONFORMANT); in aac_build_sgraw2()
4130 if (scsicmd->underflow && (byte_count < scsicmd->underflow)) { in aac_build_sgraw2()
4132 byte_count, scsicmd->underflow); in aac_build_sgraw2()
4149 return -ENOMEM; in aac_convert_sgraw2()
4151 for (i = 1, pos = 1; i < nseg-1; ++i) { in aac_convert_sgraw2()
4152 for (j = 0; j < rio2->sge[i].length / (pages * PAGE_SIZE); ++j) { in aac_convert_sgraw2()
4153 addr_low = rio2->sge[i].addrLow + j * pages * PAGE_SIZE; in aac_convert_sgraw2()
4155 sge[pos].addrHigh = rio2->sge[i].addrHigh; in aac_convert_sgraw2()
4156 if (addr_low < rio2->sge[i].addrLow) in aac_convert_sgraw2()
4163 sge[pos] = rio2->sge[nseg-1]; in aac_convert_sgraw2()
4164 memcpy(&rio2->sge[1], &sge[1], (nseg_new-1)*sizeof(struct sge_ieee1212)); in aac_convert_sgraw2()
4167 rio2->sgeCnt = cpu_to_le32(nseg_new); in aac_convert_sgraw2()
4168 rio2->flags |= cpu_to_le16(RIO2_SGL_CONFORMANT); in aac_convert_sgraw2()
4169 rio2->sgeNominalSize = pages * PAGE_SIZE; in aac_convert_sgraw2()
4192 sge = &hbacmd->sge[2]; in aac_build_sghba()
4194 sge = &hbacmd->sge[0]; in aac_build_sghba()
4201 sge->addr_hi = cpu_to_le32((u32)(addr>>32)); in aac_build_sghba()
4202 sge->addr_lo = cpu_to_le32((u32)(addr & 0xffffffff)); in aac_build_sghba()
4204 sge->len = cur_size; in aac_build_sghba()
4205 sge->flags = 0; in aac_build_sghba()
4210 sge--; in aac_build_sghba()
4215 temp = le32_to_cpu(sge->len) - byte_count in aac_build_sghba()
4216 - scsi_bufflen(scsicmd); in aac_build_sghba()
4217 sge->len = cpu_to_le32(temp); in aac_build_sghba()
4222 hbacmd->emb_data_desc_count = cpu_to_le32(nseg); in aac_build_sghba()
4223 sge->flags = cpu_to_le32(0x40000000); in aac_build_sghba()
4226 hbacmd->sge[0].flags = cpu_to_le32(0x80000000); in aac_build_sghba()
4227 hbacmd->emb_data_desc_count = (u8)cpu_to_le32(1); in aac_build_sghba()
4228 hbacmd->sge[0].addr_hi = (u32)cpu_to_le32(sg_address >> 32); in aac_build_sghba()
4229 hbacmd->sge[0].addr_lo = in aac_build_sghba()
4234 if (scsicmd->underflow && (byte_count < scsicmd->underflow)) { in aac_build_sghba()
4236 byte_count, scsicmd->underflow); in aac_build_sghba()