Author: mav
Date: Sun Feb 14 19:46:54 2010
New Revision: 203891
URL: http://svn.freebsd.org/changeset/base/203891

Log:
  MFC r203385:
  - Use separate buffer for identify data fetching. We can't use main buffer
  here if device already running, as data need to be formatted before use.
  - Remove some saved_ccb variables. They are unused now.

Modified:
  stable/8/sys/cam/ata/ata_da.c
  stable/8/sys/cam/ata/ata_pmp.c
  stable/8/sys/cam/ata/ata_xpt.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)
  stable/8/sys/netinet/   (props changed)

Modified: stable/8/sys/cam/ata/ata_da.c
==============================================================================
--- stable/8/sys/cam/ata/ata_da.c       Sun Feb 14 19:44:48 2010        
(r203890)
+++ stable/8/sys/cam/ata/ata_da.c       Sun Feb 14 19:46:54 2010        
(r203891)
@@ -123,7 +123,6 @@ struct ada_softc {
        int      trim_running;
        struct   disk_params params;
        struct   disk *disk;
-       union    ccb saved_ccb;
        struct task             sysctl_task;
        struct sysctl_ctx_list  sysctl_ctx;
        struct sysctl_oid       *sysctl_tree;
@@ -1098,8 +1097,7 @@ adaerror(union ccb *ccb, u_int32_t cam_f
        periph = xpt_path_periph(ccb->ccb_h.path);
        softc = (struct ada_softc *)periph->softc;
 
-       return(cam_periph_error(ccb, cam_flags, sense_flags,
-                               &softc->saved_ccb));
+       return(cam_periph_error(ccb, cam_flags, sense_flags, NULL));
 }
 
 static void

Modified: stable/8/sys/cam/ata/ata_pmp.c
==============================================================================
--- stable/8/sys/cam/ata/ata_pmp.c      Sun Feb 14 19:44:48 2010        
(r203890)
+++ stable/8/sys/cam/ata/ata_pmp.c      Sun Feb 14 19:46:54 2010        
(r203891)
@@ -101,7 +101,6 @@ struct pmp_softc {
        int                     events;
 #define PMP_EV_RESET   1
 #define PMP_EV_RESCAN  2
-       union                   ccb saved_ccb;
        struct task             sysctl_task;
        struct sysctl_ctx_list  sysctl_ctx;
        struct sysctl_oid       *sysctl_tree;
@@ -552,8 +551,7 @@ pmpdone(struct cam_periph *periph, union
        priority = done_ccb->ccb_h.pinfo.priority;
 
        if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
-               if (cam_periph_error(done_ccb, 0, 0,
-                   &softc->saved_ccb) == ERESTART) {
+               if (cam_periph_error(done_ccb, 0, 0, NULL) == ERESTART) {
                        return;
                } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
                        cam_release_devq(done_ccb->ccb_h.path,

Modified: stable/8/sys/cam/ata/ata_xpt.c
==============================================================================
--- stable/8/sys/cam/ata/ata_xpt.c      Sun Feb 14 19:44:48 2010        
(r203890)
+++ stable/8/sys/cam/ata/ata_xpt.c      Sun Feb 14 19:46:54 2010        
(r203891)
@@ -37,7 +37,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/time.h>
 #include <sys/conf.h>
 #include <sys/fcntl.h>
-#include <sys/md5.h>
 #include <sys/interrupt.h>
 #include <sys/sbuf.h>
 
@@ -124,10 +123,9 @@ typedef enum {
 
 typedef struct {
        TAILQ_HEAD(, ccb_hdr) request_ccbs;
+       struct ata_params       ident_data;
        probe_action    action;
-       union ccb       saved_ccb;
        probe_flags     flags;
-       u_int8_t        digest[16];
        uint32_t        pm_pid;
        uint32_t        pm_prv;
        int             restart;
@@ -303,29 +301,13 @@ probestart(struct cam_periph *periph, un
                ata_reset_cmd(ataio);
                break;
        case PROBE_IDENTIFY:
-               if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) {
-                       /* Prepare check that it is the same device. */
-                       MD5_CTX context;
-
-                       MD5Init(&context);
-                       MD5Update(&context,
-                           (unsigned char *)ident_buf->model,
-                           sizeof(ident_buf->model));
-                       MD5Update(&context,
-                           (unsigned char *)ident_buf->revision,
-                           sizeof(ident_buf->revision));
-                       MD5Update(&context,
-                           (unsigned char *)ident_buf->serial,
-                           sizeof(ident_buf->serial));
-                       MD5Final(softc->digest, &context);
-               }
                cam_fill_ataio(ataio,
                      1,
                      probedone,
                      /*flags*/CAM_DIR_IN,
                      0,
-                     /*data_ptr*/(u_int8_t *)ident_buf,
-                     /*dxfer_len*/sizeof(struct ata_params),
+                     /*data_ptr*/(u_int8_t *)&softc->ident_data,
+                     /*dxfer_len*/sizeof(softc->ident_data),
                      30 * 1000);
                if (periph->path->device->protocol == PROTO_ATA)
                        ata_28bit_cmd(ataio, ATA_ATA_IDENTIFY, 0, 0, 0);
@@ -695,8 +677,7 @@ probedone(struct cam_periph *periph, uni
        ident_buf = &path->device->ident_data;
 
        if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
-device_fail:   if (cam_periph_error(done_ccb, 0, 0,
-                   &softc->saved_ccb) == ERESTART) {
+device_fail:   if (cam_periph_error(done_ccb, 0, 0, NULL) == ERESTART) {
                        return;
                } else if ((done_ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
                        /* Don't wedge the queue */
@@ -724,6 +705,8 @@ device_fail:        if (cam_periph_error(done_c
                goto done;
        }
 noerror:
+       if (softc->restart)
+               goto done;
        switch (softc->action) {
        case PROBE_RESET:
        {
@@ -766,6 +749,7 @@ noerror:
        {
                int16_t *ptr;
 
+               ident_buf = &softc->ident_data;
                for (ptr = (int16_t *)ident_buf;
                     ptr < (int16_t *)ident_buf + sizeof(struct ata_params)/2; 
ptr++) {
                        *ptr = le16toh(*ptr);
@@ -784,28 +768,22 @@ noerror:
                ata_bpack(ident_buf->revision, ident_buf->revision, 
sizeof(ident_buf->revision));
                ata_btrim(ident_buf->serial, sizeof(ident_buf->serial));
                ata_bpack(ident_buf->serial, ident_buf->serial, 
sizeof(ident_buf->serial));
+               ident_buf = &path->device->ident_data;
 
                if ((periph->path->device->flags & CAM_DEV_UNCONFIGURED) == 0) {
                        /* Check that it is the same device. */
-                       MD5_CTX context;
-                       u_int8_t digest[16];
-
-                       MD5Init(&context);
-                       MD5Update(&context,
-                           (unsigned char *)ident_buf->model,
-                           sizeof(ident_buf->model));
-                       MD5Update(&context,
-                           (unsigned char *)ident_buf->revision,
-                           sizeof(ident_buf->revision));
-                       MD5Update(&context,
-                           (unsigned char *)ident_buf->serial,
-                           sizeof(ident_buf->serial));
-                       MD5Final(digest, &context);
-                       if (bcmp(digest, softc->digest, sizeof(digest))) {
+                       if (bcmp(softc->ident_data.model, ident_buf->model,
+                            sizeof(ident_buf->model)) ||
+                           bcmp(softc->ident_data.revision, 
ident_buf->revision,
+                            sizeof(ident_buf->revision)) ||
+                           bcmp(softc->ident_data.serial, ident_buf->serial,
+                            sizeof(ident_buf->serial))) {
                                /* Device changed. */
                                xpt_async(AC_LOST_DEVICE, path, NULL);
-                       }
+                       } else
+                               bcopy(&softc->ident_data, ident_buf, 
sizeof(struct ata_params));
                } else {
+                       bcopy(&softc->ident_data, ident_buf, sizeof(struct 
ata_params));
                        /* Clean up from previous instance of this device */
                        if (path->device->serial_num != NULL) {
                                free(path->device->serial_num, M_CAMXPT);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to