Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 SMART на 4.x   Vadim Guchenko   18 Jul 2007 17:55:26 
 SMART на 4.x   Vassily Kiryanov   20 Jul 2007 15:53:12 
 SMART на 4.x   Vadim Guchenko   20 Jul 2007 14:40:04 
 SMART на 4.x   Vadim Guchenko   23 Jul 2007 14:53:47 
Архивное /ru.unix.bsd/15374c95f4499.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional