aboutsummaryrefslogtreecommitdiff
path: root/sys/cam/cam_periph.c
diff options
context:
space:
mode:
authorAlexander Motin <mav@FreeBSD.org>2009-11-05 08:55:24 +0000
committerAlexander Motin <mav@FreeBSD.org>2009-11-05 08:55:24 +0000
commit379ad35853ef7ea466f3c83fa4b6ac56ef9164a8 (patch)
tree34b4296d2f30d5d3918a65b6291b884b5ef24bda /sys/cam/cam_periph.c
parentf3d62ac43dbafeef31f1de75fc40131cbb5657e6 (diff)
downloadsrc-379ad35853ef7ea466f3c83fa4b6ac56ef9164a8.tar.gz
src-379ad35853ef7ea466f3c83fa4b6ac56ef9164a8.zip
MFp4:
Implement device stats accounting for ATA commands.
Notes
Notes: svn path=/head/; revision=198947
Diffstat (limited to 'sys/cam/cam_periph.c')
-rw-r--r--sys/cam/cam_periph.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/sys/cam/cam_periph.c b/sys/cam/cam_periph.c
index fd441b255645..70764c65c146 100644
--- a/sys/cam/cam_periph.c
+++ b/sys/cam/cam_periph.c
@@ -898,7 +898,8 @@ cam_periph_runccb(union ccb *ccb,
* If the user has supplied a stats structure, and if we understand
* this particular type of ccb, record the transaction start.
*/
- if ((ds != NULL) && (ccb->ccb_h.func_code == XPT_SCSI_IO))
+ if ((ds != NULL) && (ccb->ccb_h.func_code == XPT_SCSI_IO ||
+ ccb->ccb_h.func_code == XPT_ATA_IO))
devstat_start_transaction(ds, NULL);
xpt_action(ccb);
@@ -921,15 +922,27 @@ cam_periph_runccb(union ccb *ccb,
/* timeout */0,
/* getcount_only */ FALSE);
- if ((ds != NULL) && (ccb->ccb_h.func_code == XPT_SCSI_IO))
- devstat_end_transaction(ds,
+ if (ds != NULL) {
+ if (ccb->ccb_h.func_code == XPT_SCSI_IO) {
+ devstat_end_transaction(ds,
ccb->csio.dxfer_len,
- ccb->csio.tag_action & 0xf,
+ ccb->csio.tag_action & 0x3,
((ccb->ccb_h.flags & CAM_DIR_MASK) ==
CAM_DIR_NONE) ? DEVSTAT_NO_DATA :
(ccb->ccb_h.flags & CAM_DIR_OUT) ?
DEVSTAT_WRITE :
DEVSTAT_READ, NULL, NULL);
+ } else if (ccb->ccb_h.func_code == XPT_ATA_IO) {
+ devstat_end_transaction(ds,
+ ccb->ataio.dxfer_len,
+ ccb->ataio.tag_action & 0x3,
+ ((ccb->ccb_h.flags & CAM_DIR_MASK) ==
+ CAM_DIR_NONE) ? DEVSTAT_NO_DATA :
+ (ccb->ccb_h.flags & CAM_DIR_OUT) ?
+ DEVSTAT_WRITE :
+ DEVSTAT_READ, NULL, NULL);
+ }
+ }
return(error);
}