diff options
author | Oliver Lehmann <oliver@FreeBSD.org> | 2005-05-25 00:26:37 +0000 |
---|---|---|
committer | Oliver Lehmann <oliver@FreeBSD.org> | 2005-05-25 00:26:37 +0000 |
commit | 6ac57423e7bee001b06c6d301f3d6fe4cbfd16db (patch) | |
tree | 73856df695c9d5bba35faa58caf9abba50e6e2d4 /sysutils/smartmontools/files | |
parent | 6eba80163ce01e9b22cf2a31d8350686d3c12ea1 (diff) | |
download | ports-6ac57423e7bee001b06c6d301f3d6fe4cbfd16db.tar.gz ports-6ac57423e7bee001b06c6d301f3d6fe4cbfd16db.zip |
Notes
Diffstat (limited to 'sysutils/smartmontools/files')
-rw-r--r-- | sysutils/smartmontools/files/patch-os_freebsd.c | 302 |
1 files changed, 300 insertions, 2 deletions
diff --git a/sysutils/smartmontools/files/patch-os_freebsd.c b/sysutils/smartmontools/files/patch-os_freebsd.c index 9c64b2af6497..74c78fcf7bd0 100644 --- a/sysutils/smartmontools/files/patch-os_freebsd.c +++ b/sysutils/smartmontools/files/patch-os_freebsd.c @@ -1,5 +1,5 @@ ---- os_freebsd.c.orig Sat Mar 13 11:32:52 2004 -+++ os_freebsd.c Thu Jul 15 23:42:06 2004 +--- os_freebsd.c.orig Sun Sep 5 09:16:07 2004 ++++ os_freebsd.c Mon May 23 19:29:43 2005 @@ -18,6 +18,7 @@ #include <stdio.h> #include <sys/types.h> @@ -8,3 +8,301 @@ #include <err.h> #include <camlib.h> #include <cam/scsi/scsi_message.h> +@@ -109,7 +110,11 @@ + } + + if (parse_ok == CONTROLLER_ATA) { ++#ifdef IOCATAREQUEST ++ if ((fdchan->device = open(dev,O_RDONLY))<0) { ++#else + if ((fdchan->atacommand = open("/dev/ata",O_RDWR))<0) { ++#endif + int myerror = errno; //preserve across free call + free (fdchan); + errno = myerror; +@@ -120,7 +125,11 @@ + if (parse_ok == CONTROLLER_3WARE_678K_CHAR) { + char buf[512]; + sprintf(buf,"/dev/twe%d",fdchan->device); ++#ifdef IOCATAREQUEST ++ if ((fdchan->device = open(buf,O_RDWR))<0) { ++#else + if ((fdchan->atacommand = open(buf,O_RDWR))<0) { ++#endif + int myerror = errno; // preserver across free call + free(fdchan); + errno=myerror; +@@ -167,8 +176,13 @@ + free(fdchan->devname); + + // close device, if open ++#ifdef IOCATAREQUEST ++ if (fdchan->device) ++ failed=close(fdchan->device); ++#else + if (fdchan->atacommand) + failed=close(fdchan->atacommand); ++#endif + + if (fdchan->scsicontrol) + failed=close(fdchan->scsicontrol); +@@ -221,7 +235,7 @@ + } + + int ata_command_interface(int fd, smart_command_set command, int select, char *data) { +-#ifndef ATAREQUEST ++#if !defined(ATAREQUEST) && !defined(IOCATAREQUEST) + // sorry, but without ATAng, we can't do anything here + printwarning(BAD_KERNEL,NULL); + errno = ENOSYS; +@@ -229,7 +243,11 @@ + #else + struct freebsd_dev_channel* con; + int retval, copydata=0; ++#ifdef IOCATAREQUEST ++ struct ata_ioc_request request; ++#else + struct ata_cmd iocmd; ++#endif + unsigned char buff[512]; + + // check that "file descriptor" is valid +@@ -238,89 +256,97 @@ + + bzero(buff,512); + ++#ifdef IOCATAREQUEST ++ bzero(&request,sizeof(struct ata_ioc_request)); ++#else + bzero(&iocmd,sizeof(struct ata_cmd)); ++#endif + bzero(buff,512); ++ ++#ifndef IOCATAREQUEST + iocmd.cmd=ATAREQUEST; + iocmd.channel=con->channel; + iocmd.device=con->device; ++#define request iocmd.u.request ++#endif + +- iocmd.u.request.u.ata.command=ATA_SMART_CMD; +- iocmd.u.request.timeout=600; ++ request.u.ata.command=ATA_SMART_CMD; ++ request.timeout=600; + switch (command){ + case READ_VALUES: +- iocmd.u.request.u.ata.feature=ATA_SMART_READ_VALUES; +- iocmd.u.request.u.ata.lba=0xc24f<<8; +- iocmd.u.request.flags=ATA_CMD_READ; +- iocmd.u.request.data=buff; +- iocmd.u.request.count=512; ++ request.u.ata.feature=ATA_SMART_READ_VALUES; ++ request.u.ata.lba=0xc24f<<8; ++ request.flags=ATA_CMD_READ; ++ request.data=buff; ++ request.count=512; + copydata=1; + break; + case READ_THRESHOLDS: +- iocmd.u.request.u.ata.feature=ATA_SMART_READ_THRESHOLDS; +- iocmd.u.request.u.ata.count=1; +- iocmd.u.request.u.ata.lba=1|(0xc24f<<8); +- iocmd.u.request.flags=ATA_CMD_READ; +- iocmd.u.request.data=buff; +- iocmd.u.request.count=512; ++ request.u.ata.feature=ATA_SMART_READ_THRESHOLDS; ++ request.u.ata.count=1; ++ request.u.ata.lba=1|(0xc24f<<8); ++ request.flags=ATA_CMD_READ; ++ request.data=buff; ++ request.count=512; + copydata=1; + break; + case READ_LOG: +- iocmd.u.request.u.ata.feature=ATA_SMART_READ_LOG_SECTOR; +- iocmd.u.request.u.ata.lba=select|(0xc24f<<8); +- iocmd.u.request.u.ata.count=1; +- iocmd.u.request.flags=ATA_CMD_READ; +- iocmd.u.request.data=buff; +- iocmd.u.request.count=512; ++ request.u.ata.feature=ATA_SMART_READ_LOG_SECTOR; ++ request.u.ata.lba=select|(0xc24f<<8); ++ request.u.ata.count=1; ++ request.flags=ATA_CMD_READ; ++ request.data=buff; ++ request.count=512; + copydata=1; + break; + case IDENTIFY: +- iocmd.u.request.u.ata.command=ATA_IDENTIFY_DEVICE; +- iocmd.u.request.flags=ATA_CMD_READ; +- iocmd.u.request.data=buff; +- iocmd.u.request.count=512; ++ request.u.ata.command=ATA_IDENTIFY_DEVICE; ++ request.flags=ATA_CMD_READ; ++ request.data=buff; ++ request.count=512; + copydata=1; + break; + case PIDENTIFY: +- iocmd.u.request.u.ata.command=ATA_IDENTIFY_PACKET_DEVICE; +- iocmd.u.request.flags=ATA_CMD_READ; +- iocmd.u.request.data=buff; +- iocmd.u.request.count=512; ++ request.u.ata.command=ATA_IDENTIFY_PACKET_DEVICE; ++ request.flags=ATA_CMD_READ; ++ request.data=buff; ++ request.count=512; + copydata=1; + break; + case ENABLE: +- iocmd.u.request.u.ata.feature=ATA_SMART_ENABLE; +- iocmd.u.request.u.ata.lba=0xc24f<<8; +- iocmd.u.request.flags=ATA_CMD_CONTROL; ++ request.u.ata.feature=ATA_SMART_ENABLE; ++ request.u.ata.lba=0xc24f<<8; ++ request.flags=ATA_CMD_CONTROL; + break; + case DISABLE: +- iocmd.u.request.u.ata.feature=ATA_SMART_DISABLE; +- iocmd.u.request.u.ata.lba=0xc24f<<8; +- iocmd.u.request.flags=ATA_CMD_CONTROL; ++ request.u.ata.feature=ATA_SMART_DISABLE; ++ request.u.ata.lba=0xc24f<<8; ++ request.flags=ATA_CMD_CONTROL; + break; + case AUTO_OFFLINE: + // NOTE: According to ATAPI 4 and UP, this command is obsolete +- iocmd.u.request.u.ata.feature=ATA_SMART_AUTO_OFFLINE; +- iocmd.u.request.u.ata.lba=select|(0xc24f<<8); +- iocmd.u.request.flags=ATA_CMD_CONTROL; ++ request.u.ata.feature=ATA_SMART_AUTO_OFFLINE; ++ request.u.ata.lba=select|(0xc24f<<8); ++ request.flags=ATA_CMD_CONTROL; + break; + case AUTOSAVE: +- iocmd.u.request.u.ata.feature=ATA_SMART_AUTOSAVE; +- iocmd.u.request.u.ata.count=0xf1; // to enable autosave +- iocmd.u.request.u.ata.lba=0xc24f<<8; +- iocmd.u.request.flags=ATA_CMD_CONTROL; ++ request.u.ata.feature=ATA_SMART_AUTOSAVE; ++ request.u.ata.count=0xf1; // to enable autosave ++ request.u.ata.lba=0xc24f<<8; ++ request.flags=ATA_CMD_CONTROL; + break; + case IMMEDIATE_OFFLINE: +- iocmd.u.request.u.ata.feature=ATA_SMART_IMMEDIATE_OFFLINE; +- iocmd.u.request.u.ata.lba = select|(0xc24f<<8); // put test in sector +- iocmd.u.request.flags=ATA_CMD_CONTROL; ++ request.u.ata.feature=ATA_SMART_IMMEDIATE_OFFLINE; ++ request.u.ata.lba = select|(0xc24f<<8); // put test in sector ++ request.flags=ATA_CMD_CONTROL; + break; + case STATUS_CHECK: // same command, no HDIO in FreeBSD + case STATUS: + // this command only says if SMART is working. It could be + // replaced with STATUS_CHECK below. +- iocmd.u.request.u.ata.feature=ATA_SMART_STATUS; +- iocmd.u.request.u.ata.lba=0xc24f<<8; +- iocmd.u.request.flags=ATA_CMD_CONTROL; ++ request.u.ata.feature=ATA_SMART_STATUS; ++ request.u.ata.lba=0xc24f<<8; ++ request.flags=ATA_CMD_CONTROL; + break; + default: + pout("Unrecognized command %d in ata_command_interface()\n" +@@ -334,15 +360,19 @@ + unsigned const char failed_lo=0xf4, failed_hi=0x2c; + unsigned char low,high; + ++#ifdef IOCATAREQUEST ++ if ((retval=ioctl(con->device, IOCATAREQUEST, &request))) ++#else + if ((retval=ioctl(con->atacommand, IOCATA, &iocmd))) ++#endif + return -1; + + #if __FreeBSD_version < 502000 + printwarning(NO_RETURN,NULL); + #endif + +- high = (iocmd.u.request.u.ata.lba >> 16) & 0xff; +- low = (iocmd.u.request.u.ata.lba >> 8) & 0xff; ++ high = (request.u.ata.lba >> 16) & 0xff; ++ low = (request.u.ata.lba >> 8) & 0xff; + + // Cyl low and Cyl high unchanged means "Good SMART status" + if (low==normal_lo && high==normal_hi) +@@ -355,18 +385,22 @@ + // We haven't gotten output that makes sense; print out some debugging info + char buf[512]; + sprintf(buf,"CMD=0x%02x\nFR =0x%02x\nNS =0x%02x\nSC =0x%02x\nCL =0x%02x\nCH =0x%02x\nRETURN =0x%04x\n", +- (int)iocmd.u.request.u.ata.command, +- (int)iocmd.u.request.u.ata.feature, +- (int)iocmd.u.request.u.ata.count, +- (int)((iocmd.u.request.u.ata.lba) & 0xff), +- (int)((iocmd.u.request.u.ata.lba>>8) & 0xff), +- (int)((iocmd.u.request.u.ata.lba>>16) & 0xff), +- (int)iocmd.u.request.error); ++ (int)request.u.ata.command, ++ (int)request.u.ata.feature, ++ (int)request.u.ata.count, ++ (int)((request.u.ata.lba) & 0xff), ++ (int)((request.u.ata.lba>>8) & 0xff), ++ (int)((request.u.ata.lba>>16) & 0xff), ++ (int)request.error); + printwarning(BAD_SMART,buf); + return 0; + } + ++#ifdef IOCATAREQUEST ++ if ((retval=ioctl(con->device, IOCATAREQUEST, &request))) { ++#else + if ((retval=ioctl(con->atacommand, IOCATA, &iocmd))) { ++#endif + perror("Failed command: "); + return -1; + } +@@ -637,7 +671,11 @@ + } + + // Now send the command down through an ioctl() ++#ifdef IOCATAREQUEST ++ ioctlreturn=ioctl(con->device,TWEIO_COMMAND,cmd); ++#else + ioctlreturn=ioctl(con->atacommand,TWEIO_COMMAND,cmd); ++#endif + + // Deal with the different error cases + if (ioctlreturn) { +@@ -709,6 +747,7 @@ + return 0; + } + ++#ifndef IOCATAREQUEST + static int get_ata_channel_unit ( const char* name, int* unit, int* dev) { + #ifndef ATAREQUEST + *dev=0; +@@ -756,7 +795,7 @@ + return 0; + #endif + } +- ++#endif + + // Guess device type (ata or scsi) based on device name (FreeBSD + // specific) SCSI device name in FreeBSD can be sd, sr, scd, st, nst, +@@ -788,11 +827,13 @@ + // form /dev/ad* or ad* + if (!strncmp(fbsd_dev_ata_disk_prefix, dev_name, + strlen(fbsd_dev_ata_disk_prefix))) { ++#ifndef IOCATAREQUEST + if (chan != NULL) { + if (get_ata_channel_unit(dev_name,&(chan->channel),&(chan->device))<0) { + return CONTROLLER_UNKNOWN; + } + } ++#endif + return CONTROLLER_ATA; + } + |