aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin LI <delphij@FreeBSD.org>2011-11-03 22:13:21 +0000
committerXin LI <delphij@FreeBSD.org>2011-11-03 22:13:21 +0000
commitc3e2dd8fa2a9f6f35415c730902f05c1defb785d (patch)
tree7d3b098ebe6d7ab2fdafd2de2b402012428acaee
parent1fa70883c38da58997b3f31026889cd635fb8ac0 (diff)
Notes
-rw-r--r--sysutils/smartmontools/Makefile1
-rw-r--r--sysutils/smartmontools/files/patch-freebsd913
-rw-r--r--sysutils/smartmontools/files/patch-lsibugs44
3 files changed, 58 insertions, 0 deletions
diff --git a/sysutils/smartmontools/Makefile b/sysutils/smartmontools/Makefile
index 6622eb116de5..c92939322cff 100644
--- a/sysutils/smartmontools/Makefile
+++ b/sysutils/smartmontools/Makefile
@@ -7,6 +7,7 @@
PORTNAME= smartmontools
PORTVERSION= 5.42
+PORTREVISION= 1
CATEGORIES= sysutils
MASTER_SITES= SF
diff --git a/sysutils/smartmontools/files/patch-freebsd9 b/sysutils/smartmontools/files/patch-freebsd9
new file mode 100644
index 000000000000..c34f077cd6cd
--- /dev/null
+++ b/sysutils/smartmontools/files/patch-freebsd9
@@ -0,0 +1,13 @@
+--- os_freebsd.cpp 2011/11/03 17:50:35 3466
++++ os_freebsd.cpp 2011/11/03 20:06:19 3468
+@@ -1058,8 +1058,8 @@
+ }
+
+ if (iop->sensep) {
+- memcpy(iop->sensep,&(ccb->csio.sense_data),sizeof(struct scsi_sense_data));
+- iop->resp_sense_len = sizeof(struct scsi_sense_data);
++ iop->resp_sense_len = ccb->csio.sense_len - ccb->csio.sense_resid;
++ memcpy(iop->sensep,&(ccb->csio.sense_data),iop->resp_sense_len);
+ }
+
+ iop->scsi_status = ccb->csio.scsi_status;
diff --git a/sysutils/smartmontools/files/patch-lsibugs b/sysutils/smartmontools/files/patch-lsibugs
new file mode 100644
index 000000000000..60f7988291e3
--- /dev/null
+++ b/sysutils/smartmontools/files/patch-lsibugs
@@ -0,0 +1,44 @@
+--- os_freebsd.cpp 2011/10/06 16:43:44 3423
++++ os_freebsd.cpp 2011/11/03 17:50:35 3466
+@@ -1013,6 +1013,20 @@
+ warnx("error allocating ccb");
+ return -ENOMEM;
+ }
++ // mfi SAT layer is known to be buggy
++ if(!strcmp("mfi",m_camdev->sim_name)) {
++ if (iop->cmnd[0] == SAT_ATA_PASSTHROUGH_12 || iop->cmnd[0] == SAT_ATA_PASSTHROUGH_16) {
++ // Controller does not return ATA output registers in SAT sense data
++ if (iop->cmnd[2] & (1 << 5)) // chk_cond
++ return set_err(ENOSYS, "ATA return descriptor not supported by controller firmware");
++ }
++ // SMART WRITE LOG SECTOR causing media errors
++ if ((iop->cmnd[0] == SAT_ATA_PASSTHROUGH_16 && iop->cmnd[14] == ATA_SMART_CMD
++ && iop->cmnd[3]==0 && iop->cmnd[4] == ATA_SMART_WRITE_LOG_SECTOR) ||
++ (iop->cmnd[0] == SAT_ATA_PASSTHROUGH_12 && iop->cmnd[9] == ATA_SMART_CMD &&
++ iop->cmnd[3] == ATA_SMART_WRITE_LOG_SECTOR))
++ return set_err(ENOSYS, "SMART WRITE LOG SECTOR command is not supported by controller firmware");
++ }
+
+ // clear out structure, except for header that was filled in for us
+ bzero(&(&ccb->ccb_h)[1],
+@@ -1590,12 +1604,18 @@
+ return this;
+ }
+
+- // SAT or USB ?
++ // SAT or USB, skip MFI controllers because of bugs
+ {
+ smart_device * newdev = smi()->autodetect_sat_device(this, req_buff, len);
+- if (newdev)
++ if (newdev) {
+ // NOTE: 'this' is now owned by '*newdev'
++ if(!strcmp("mfi",m_camdev->sim_name)) {
++ newdev->close();
++ newdev->set_err(ENOSYS, "SATA device detected,\n"
++ "MegaRAID SAT layer is reportedly buggy, use '-d sat' to try anyhow");
++ }
+ return newdev;
++ }
+ }
+
+ // Nothing special found \ No newline at end of file