|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Vadim Guchenko 2:5020/400 23 Jul 2007 14:53:47 To : Vadim Guchenko Subject : SMART на 4.x -------------------------------------------------------------------------------- VG> Спасибо, этот патч у меня есть. Hо я хочу реализовать именно команду VG> ATAREQUEST из 5.x, чтобы тот же smartmontools на 4-ке не заметил разницы. VG> Попробую сделать сам. Сделал. Патч ниже (пути относительно /). Требует только перекомпиляции ядра. После этого можно устанавливать smartmontools (или переустановить, если уже установлен). Проверял на 4.9 и 4.11. - --- usr/include/sys/ata.h.orig Thu Jul 19 12:07:04 2007 +++ usr/include/sys/ata.h Sun Jul 22 19:54:54 2007 @@ -238,6 +238,8 @@ #define ATARAIDDELETE 10 #define ATARAIDSTATUS 11 #define ATAENCSTAT 12 +#define ATAREQUEST 13 +#define ATAGMAXCHANNEL 14 union { struct { @@ -248,6 +250,30 @@ char name[2][32]; struct ata_params params[2]; } param; + int maxchan; + struct { + union { + struct { + u_int8_t command; + u_int8_t feature; + u_int64_t lba; + u_int16_t count; + } ata; + struct { + char ccb[16]; + } atapi; + } u; + caddr_t data; + int count; + int flags; +#define ATA_CMD_CONTROL 0x01 +#define ATA_CMD_READ 0x02 +#define ATA_CMD_WRITE 0x04 +#define ATA_CMD_ATAPI 0x08 + + int timeout; + int error; + } request; struct raid_setup { int type; #define AR_RAID0 1 - --- usr/src/sys/sys/ata.h.orig Fri Jul 20 15:40:22 2007 +++ usr/src/sys/sys/ata.h Sun Jul 22 19:44:00 2007 @@ -238,6 +238,8 @@ #define ATARAIDDELETE 10 #define ATARAIDSTATUS 11 #define ATAENCSTAT 12 +#define ATAREQUEST 13 +#define ATAGMAXCHANNEL 14 union { struct { @@ -248,6 +250,30 @@ char name[2][32]; struct ata_params params[2]; } param; + int maxchan; + struct { + union { + struct { + u_int8_t command; + u_int8_t feature; + u_int64_t lba; + u_int16_t count; + } ata; + struct { + char ccb[16]; + } atapi; + } u; + caddr_t data; + int count; + int flags; +#define ATA_CMD_CONTROL 0x01 +#define ATA_CMD_READ 0x02 +#define ATA_CMD_WRITE 0x04 +#define ATA_CMD_ATAPI 0x08 + + int timeout; + int error; + } request; struct raid_setup { int type; #define AR_RAID0 1 - --- usr/src/sys/dev/ata/ata-all.c.orig Fri Jul 20 15:50:33 2007 +++ usr/src/sys/dev/ata/ata-all.c Sun Jul 22 19:36:56 2007 @@ -366,6 +366,68 @@ iocmd->u.mode.mode[SLAVE] = -1; return 0; + case ATAGMAXCHANNEL: + iocmd->u.maxchan = devclass_get_maxunit(ata_devclass); + return 0; + + case ATAREQUEST: { + struct ata_device *atadev; + caddr_t buf; + + if (!device || !(ch = device_get_softc(device))) + return ENXIO; + + if (!(atadev = &ch->device[iocmd->device]) || + !(ch->devices & (iocmd->device == MASTER ? + ATA_ATA_MASTER : ATA_ATA_SLAVE)) || + !(iocmd->u.request.flags & (ATA_CMD_CONTROL | ATA_CMD_READ))) + return ENODEV; + + if (!(buf = malloc(iocmd->u.request.count, M_ATA, M_NOWAIT))) + return ENOMEM; + + ATA_SLEEPLOCK_CH(ch, ATA_CONTROL); + + if (ata_command(atadev, iocmd->u.request.u.ata.command, + iocmd->u.request.u.ata.lba, iocmd->u.request.u.ata.count, + iocmd->u.request.u.ata.feature, ATA_IMMEDIATE)) { + ata_prtdev(atadev, "error issueing 0x%02x command\n", + iocmd->u.request.u.ata.command); + ATA_UNLOCK_CH(ch); + free(buf, M_ATA); + return EIO; + } + + if (ata_wait(atadev, ATA_S_READY | (iocmd->u.request.flags & ATA_CMD_READ ? + (ATA_S_DSC | ATA_S_DRQ) : 0))) { + ata_prtdev(atadev, "error waiting for 0x%02x command\n", + iocmd->u.request.u.ata.command); + if (atadev->channel->status & ATA_S_ERROR) + iocmd->u.request.error = atadev->channel->error; + ATA_UNLOCK_CH(ch); + free(buf, M_ATA); + return EIO; + } + + if (iocmd->u.request.flags & ATA_CMD_READ) { + ATA_INSW(atadev->channel->r_io, ATA_DATA, (int16_t *)buf, + iocmd->u.request.count/sizeof(int16_t)); + } + + ATA_UNLOCK_CH(ch); + + if (iocmd->u.request.flags & ATA_CMD_READ) { + error = copyout(buf, iocmd->u.request.data, iocmd->u.request.count); + if (error) { + free(buf, M_ATA); + return error; + } + } + + free(buf, M_ATA); + return 0; + } + case ATAGPARM: if (!device || !(ch = device_get_softc(device))) return ENXIO; -- Best regards, Vadim. --- ifmail v.2.15dev5.3 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/15374c95f4499.html, оценка из 5, голосов 10
|