summaryrefslogtreecommitdiffstats
path: root/sys/dev/aacraid/aacraid_cam.c
diff options
context:
space:
mode:
authorachim <achim@FreeBSD.org>2014-03-11 14:59:34 +0000
committerachim <achim@FreeBSD.org>2014-03-11 14:59:34 +0000
commitd9fd2797e53e8b8f1e593c3fbce42a5ed3bc71dc (patch)
treedcbd9d4a8e6e84967084386895540b8c6403831c /sys/dev/aacraid/aacraid_cam.c
parentc157604f42c4e16d9aa5752902f75fdc5c38dfe3 (diff)
downloadFreeBSD-src-d9fd2797e53e8b8f1e593c3fbce42a5ed3bc71dc.zip
FreeBSD-src-d9fd2797e53e8b8f1e593c3fbce42a5ed3bc71dc.tar.gz
MFC r257847, r260243: Update aacraid to version 3.2.5.
Approved by: emaste (co-mentor)
Diffstat (limited to 'sys/dev/aacraid/aacraid_cam.c')
-rw-r--r--sys/dev/aacraid/aacraid_cam.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/sys/dev/aacraid/aacraid_cam.c b/sys/dev/aacraid/aacraid_cam.c
index 602e961..56eaac0 100644
--- a/sys/dev/aacraid/aacraid_cam.c
+++ b/sys/dev/aacraid/aacraid_cam.c
@@ -709,7 +709,7 @@ aac_container_special_command(struct cam_sim *sim, union ccb *ccb,
"Container READ_CAPACITY id %d lun %d len %d",
ccb->ccb_h.target_id, ccb->ccb_h.target_lun,
ccb->csio.dxfer_len);
- scsi_ulto4b(co->co_mntobj.ObjExtension.BlockSize, p->length);
+ scsi_ulto4b(co->co_mntobj.ObjExtension.BlockDevice.BlockSize, p->length);
/* check if greater than 2TB */
if (co->co_mntobj.CapacityHigh) {
if (sc->flags & AAC_FLAGS_LBA_64BIT)
@@ -737,9 +737,20 @@ aac_container_special_command(struct cam_sim *sim, union ccb *ccb,
xpt_done(ccb);
return;
}
- scsi_ulto4b(co->co_mntobj.ObjExtension.BlockSize, p->length);
+ scsi_ulto4b(co->co_mntobj.ObjExtension.BlockDevice.BlockSize, p->length);
scsi_ulto4b(co->co_mntobj.CapacityHigh, p->addr);
scsi_ulto4b(co->co_mntobj.Capacity-1, &p->addr[4]);
+
+ if (ccb->csio.dxfer_len >= 14) {
+ u_int32_t mapping = co->co_mntobj.ObjExtension.BlockDevice.bdLgclPhysMap;
+ p->prot_lbppbe = 0;
+ while (mapping > 1) {
+ mapping >>= 1;
+ p->prot_lbppbe++;
+ }
+ p->prot_lbppbe &= 0x0f;
+ }
+
ccb->ccb_h.status = CAM_REQ_CMP;
break;
}
@@ -769,7 +780,7 @@ aac_container_special_command(struct cam_sim *sim, union ccb *ccb,
p->hd.block_descr_len =
sizeof(struct scsi_mode_block_descr);
p->hd.datalen += p->hd.block_descr_len;
- scsi_ulto3b(co->co_mntobj.ObjExtension.BlockSize, p->bd.block_len);
+ scsi_ulto3b(co->co_mntobj.ObjExtension.BlockDevice.BlockSize, p->bd.block_len);
if (co->co_mntobj.Capacity > 0xffffff ||
co->co_mntobj.CapacityHigh) {
p->bd.num_blocks[0] = 0xff;
@@ -1213,11 +1224,20 @@ aac_cam_complete(struct aac_command *cm)
*/
if ((device == T_DIRECT &&
!(sc->aac_feature_bits & AAC_SUPPL_SUPPORTED_JBOD)) ||
- (device == T_PROCESSOR) ||
- (sc->flags & AAC_FLAGS_CAM_PASSONLY))
+ (device == T_PROCESSOR))
ccb->csio.data_ptr[0] =
((device & 0xe0) | T_NODEVICE);
+ /* handle phys. components of a log. drive */
+ if (ccb->csio.data_ptr[0] & 0x20) {
+ if (sc->hint_flags & 8) {
+ /* expose phys. device (daXX) */
+ ccb->csio.data_ptr[0] &= 0xdf;
+ } else {
+ /* phys. device only visible through pass device (passXX) */
+ ccb->csio.data_ptr[0] |= 0x10;
+ }
+ }
} else if (ccb->ccb_h.status == CAM_SEL_TIMEOUT &&
ccb->ccb_h.target_lun != 0) {
/* fix for INQUIRYs on Lun>0 */
OpenPOWER on IntegriCloud